diff --git a/DEPS b/DEPS
index 8ca0ab4..9fe99f56 100644
--- a/DEPS
+++ b/DEPS
@@ -300,7 +300,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'src_internal_revision': '1159092e81cadd8225e03fa98287eee03668e3d9',
+  'src_internal_revision': '69c27e547002e7b16fd7e39d9d458672021e53da',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
@@ -312,7 +312,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '18010f58be60bfcb233f70f125c91265d33ab4a7',
+  'angle_revision': '14339812a9db57d06346c86896d1275ff8f9ed09',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -320,7 +320,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': 'ba7701bc2fdc70222d68a5ff732a0e7da384a73b',
+  'pdfium_revision': 'e392794c0ec0219df62d14b4e162b1b1fd6e9b2a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -331,7 +331,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:12.20230612.1.1',
+  'fuchsia_version': 'version:13.20230613.4.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.
@@ -375,7 +375,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': '793b83da0634b8de30f0b9d9d1ace14134280ca3',
+  'catapult_revision': '45275b64c5ea145a72d36708551635f17285f92b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -391,7 +391,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '81e8f798e7b0638ea521ce8d3b8fa2c6b5af5061',
+  'devtools_frontend_revision': '6e8ad1b59f68bf4764a0afefcaa6eec082b6cc71',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -431,11 +431,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '8ab22d45da518d74ba300723e2580ed8b983ef0c',
+  'dawn_revision': '48a39ff9615d36750ffc31b414cca8eeb1d5fc61',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'quiche_revision': '90315e8698e0d2290a8a0fdfe96318ebb1a210a7',
+  'quiche_revision': 'd9aaee403dc43e368f3695c308f0fd9908d9bbdc',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -499,7 +499,7 @@
 
   # If you change this, also update the libc++ revision in
   # //buildtools/deps_revisions.gni.
-  'libcxx_revision':       '38a8ad0f7ea659edb28a57dfd59a7e5399dabeab',
+  'libcxx_revision':       '055b2e17ae4f0e2c025ad0c7508b01787df17758',
 
   # GN CIPD package version.
   'gn_version': 'git_revision:1cd35c1b722472e714c30d12031af81443bb20ae',
@@ -816,7 +816,7 @@
   },
 
   'src/ios/third_party/earl_grey2/src': {
-      'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '2e7e40ae19aa65415d86aed6f2bd4075b8fd4ee4',
+      'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + 'd2717abfb03a58d342f461c0cb3b2294184a0862',
       'condition': 'checkout_ios',
   },
 
@@ -1243,13 +1243,13 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '7b5e3d7868de02d85e22fc48ed955846ab521a80',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '2b19afb82030a638f8a3d8f592fa25269b924800',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + 'c7069f35b34cc6e018c3ee37412fafd2338c0459',
+      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '5f55a210fa421b1c0a7db170451f2596dc60589b',
     'condition': 'checkout_src_internal',
   },
 
@@ -1716,7 +1716,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'd019594d65a235c4a9cba35d48a48ec8dd065da2',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '57cd2bc9b473a24fced56bbf42a51dd1ce6191cb',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -4016,7 +4016,7 @@
 
   'src/chrome/browser/internal': {
       'url': Var('chrome_git') + '/chrome/browser_internal.git' + '@' +
-        '86edf3656689330827cd0bd118656e6be5ec88a4',
+        '9aa1b003c117710df4073378555ae882b159089f',
       'condition': 'checkout_src_internal',
   },
 
@@ -4185,7 +4185,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        'cdcc9a378a9b22a35e98b52f94b1f1fbe2092d28',
+        '982f063c939b3eb4807e903a9eecacacb86fd91a',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/android_webview/nonembedded/BUILD.gn b/android_webview/nonembedded/BUILD.gn
index 2005085..ef04f40 100644
--- a/android_webview/nonembedded/BUILD.gn
+++ b/android_webview/nonembedded/BUILD.gn
@@ -16,6 +16,7 @@
 # Contains classes needed by the webview apk, but not used when loading the apk
 # as a library.
 android_library("nonembedded_java") {
+  srcjar_deps = [ ":nonembedded_jni_headers" ]
   sources = [
     "java/src/org/chromium/android_webview/nonembedded/AwComponentUpdateService.java",
     "java/src/org/chromium/android_webview/nonembedded/AwNonembeddedUmaRecorder.java",
@@ -50,8 +51,6 @@
     "//ui/android:ui_no_recycler_view_java",
     "//url:gurl_java",
   ]
-
-  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 }
 
 android_library("devui_java") {
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index fd1ed93..4f4e8b5 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -1764,6 +1764,13 @@
              "OverviewDeskNavigation",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+// Enables a new layout for overview mode in clamshell, preventing the overview
+// mode display from getting too cluttered. Similar to current overview mode
+// layout in tablet mode.
+BASE_FEATURE(kOverviewScrollLayoutForClamshell,
+             "OverviewScrollLayoutForClamshell",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // Enables user to provision PasspointARCSupport credentials.
 BASE_FEATURE(kPasspointARCSupport,
              "PasspointARCSupport",
@@ -3355,6 +3362,11 @@
   return base::FeatureList::IsEnabled(kOverviewDeskNavigation);
 }
 
+bool IsOverviewScrollLayoutForClamshellEnabled() {
+  return base::FeatureList::IsEnabled(kOverviewScrollLayoutForClamshell) &&
+         chromeos::features::IsJellyEnabled();
+}
+
 bool IsPasspointARCSupportEnabled() {
   return base::FeatureList::IsEnabled(kPasspointARCSupport);
 }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index e0f22e5..aa90098d 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -515,6 +515,8 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kOsSyncConsentRevamp);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kOverviewButton);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kOverviewDeskNavigation);
+COMPONENT_EXPORT(ASH_CONSTANTS)
+BASE_DECLARE_FEATURE(kOverviewScrollLayoutForClamshell);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kPasspointARCSupport);
 COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kPasspointSettings);
 COMPONENT_EXPORT(ASH_CONSTANTS)
@@ -914,6 +916,8 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsOsSettingsRevampWayfindingEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsOsSyncConsentRevampEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsOverviewDeskNavigationEnabled();
+COMPONENT_EXPORT(ASH_CONSTANTS)
+bool IsOverviewScrollLayoutForClamshellEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPasspointARCSupportEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPasspointSettingsEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPcieBillboardNotificationEnabled();
diff --git a/ash/glanceables/classroom/glanceables_classroom_client.h b/ash/glanceables/classroom/glanceables_classroom_client.h
index 3dad86fe..a785d48 100644
--- a/ash/glanceables/classroom/glanceables_classroom_client.h
+++ b/ash/glanceables/classroom/glanceables_classroom_client.h
@@ -5,12 +5,41 @@
 #ifndef ASH_GLANCEABLES_CLASSROOM_GLANCEABLES_CLASSROOM_CLIENT_H_
 #define ASH_GLANCEABLES_CLASSROOM_GLANCEABLES_CLASSROOM_CLIENT_H_
 
+#include <memory>
+#include <vector>
+
 #include "ash/ash_export.h"
+#include "base/functional/callback_forward.h"
 
 namespace ash {
 
+struct GlanceablesClassroomStudentAssignment;
+
 // Interface for the classroom browser client.
-class ASH_EXPORT GlanceablesClassroomClient {};
+class ASH_EXPORT GlanceablesClassroomClient {
+ public:
+  using IsRoleEnabledCallback = base::OnceCallback<void(bool active)>;
+  using GetStudentAssignmentsCallback = base::OnceCallback<void(
+      std::vector<std::unique_ptr<GlanceablesClassroomStudentAssignment>>
+          assignments)>;
+
+  virtual ~GlanceablesClassroomClient() = default;
+
+  // Returns `true` if current user is enrolled in at least one classroom course
+  // as a student.
+  virtual void IsStudentRoleActive(IsRoleEnabledCallback callback) = 0;
+
+  // Return student assignments based on different due date/time and submission
+  // state filters.
+  virtual void GetCompletedStudentAssignments(
+      GetStudentAssignmentsCallback callback) = 0;
+  virtual void GetStudentAssignmentsWithApproachingDueDate(
+      GetStudentAssignmentsCallback callback) = 0;
+  virtual void GetStudentAssignmentsWithMissedDueDate(
+      GetStudentAssignmentsCallback callback) = 0;
+  virtual void GetStudentAssignmentsWithoutDueDate(
+      GetStudentAssignmentsCallback callback) = 0;
+};
 
 }  // namespace ash
 
diff --git a/ash/glanceables/classroom/glanceables_classroom_types.cc b/ash/glanceables/classroom/glanceables_classroom_types.cc
index 405b80e..6d78e114 100644
--- a/ash/glanceables/classroom/glanceables_classroom_types.cc
+++ b/ash/glanceables/classroom/glanceables_classroom_types.cc
@@ -38,4 +38,17 @@
     State state)
     : id(id), course_work_id(course_work_id), state(state) {}
 
+// ----------------------------------------------------------------------------
+// GlanceablesClassroomStudentAssignment:
+
+GlanceablesClassroomStudentAssignment::GlanceablesClassroomStudentAssignment(
+    const std::string& course_title,
+    const std::string& course_work_title,
+    const GURL& link,
+    const absl::optional<base::Time>& due)
+    : course_title(course_title),
+      course_work_title(course_work_title),
+      link(link),
+      due(due) {}
+
 }  // namespace ash
diff --git a/ash/glanceables/classroom/glanceables_classroom_types.h b/ash/glanceables/classroom/glanceables_classroom_types.h
index e0b0c4c2..fbfb625 100644
--- a/ash/glanceables/classroom/glanceables_classroom_types.h
+++ b/ash/glanceables/classroom/glanceables_classroom_types.h
@@ -101,6 +101,33 @@
   const State state;
 };
 
+// Represents a single classroom assignment for students (contains data from
+// `GlanceablesClassroomCourse` and `GlanceablesClassroomCourseWorkItem`).
+struct ASH_EXPORT GlanceablesClassroomStudentAssignment {
+ public:
+  GlanceablesClassroomStudentAssignment(const std::string& course_title,
+                                        const std::string& course_work_title,
+                                        const GURL& link,
+                                        const absl::optional<base::Time>& due);
+  GlanceablesClassroomStudentAssignment(
+      const GlanceablesClassroomStudentAssignment&) = delete;
+  GlanceablesClassroomStudentAssignment& operator=(
+      const GlanceablesClassroomStudentAssignment&) = delete;
+  ~GlanceablesClassroomStudentAssignment() = default;
+
+  // Title of the course this assignment belongs to.
+  const std::string course_title;
+
+  // Title of the course work item this assignment belongs to.
+  const std::string course_work_title;
+
+  // Absolute link for redirects to Classroom web UI.
+  const GURL link;
+
+  // Due date and time in UTC of this course work item.
+  const absl::optional<base::Time> due;
+};
+
 }  // namespace ash
 
 #endif  // ASH_GLANCEABLES_CLASSROOM_GLANCEABLES_CLASSROOM_TYPES_H_
diff --git a/ash/public/cpp/system/anchored_nudge_data.cc b/ash/public/cpp/system/anchored_nudge_data.cc
index 3a3c13c..d76aa96 100644
--- a/ash/public/cpp/system/anchored_nudge_data.cc
+++ b/ash/public/cpp/system/anchored_nudge_data.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 #include <utility>
 
+#include "ash/constants/ash_features.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "base/time/time.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -21,7 +22,9 @@
     : id(std::move(id)),
       catalog_name(catalog_name),
       body_text(body_text),
-      anchor_view(anchor_view) {}
+      anchor_view(anchor_view) {
+  DCHECK(features::IsSystemNudgeV2Enabled());
+}
 
 AnchoredNudgeData::AnchoredNudgeData(AnchoredNudgeData&& other) = default;
 
diff --git a/ash/system/toast/anchored_nudge_manager_impl_unittest.cc b/ash/system/toast/anchored_nudge_manager_impl_unittest.cc
index ab3ecc8..4641020 100644
--- a/ash/system/toast/anchored_nudge_manager_impl_unittest.cc
+++ b/ash/system/toast/anchored_nudge_manager_impl_unittest.cc
@@ -32,15 +32,13 @@
     return Shell::Get()->anchored_nudge_manager();
   }
 
-  void ShowNudge(const std::string& id,
-                 views::View* anchor_view,
-                 const std::u16string& text = std::u16string(),
-                 bool has_infinite_duration = false) {
-    AnchoredNudgeData nudge_data(id, AnchoredNudgeCatalogName::kTest, text,
-                                 anchor_view);
-    nudge_data.has_infinite_duration = has_infinite_duration;
-
-    anchored_nudge_manager()->Show(nudge_data);
+  // Creates an `AnchoredNudgeData` object with only the required elements.
+  AnchoredNudgeData CreateBaseNudgeData(
+      const std::string& id,
+      views::View* anchor_view,
+      const std::u16string& body_text = std::u16string()) {
+    return AnchoredNudgeData(id, AnchoredNudgeCatalogName::kTest, body_text,
+                             anchor_view);
   }
 
   void CancelNudge(const std::string& id) {
@@ -63,9 +61,10 @@
   const std::string id = "id";
   const std::u16string text = u"text";
   auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>());
+  auto nudge_data = CreateBaseNudgeData(id, anchor_view, text);
 
   // Show a nudge.
-  ShowNudge(id, anchor_view, text);
+  anchored_nudge_manager()->Show(nudge_data);
 
   // Ensure the nudge is visible and has set the provided contents.
   auto nudge = GetShownNudges()[id];
@@ -89,18 +88,20 @@
   const std::string id = "id";
   auto* anchor_view =
       contents_view->AddChildView(std::make_unique<views::View>());
+  auto nudge_data = CreateBaseNudgeData(id, anchor_view);
 
   const std::string id_2 = "id_2";
   auto* anchor_view_2 =
       contents_view->AddChildView(std::make_unique<views::View>());
+  auto nudge_data_2 = CreateBaseNudgeData(id_2, anchor_view_2);
 
   // Show the first nudge, expect the first nudge shown.
-  ShowNudge(id, anchor_view);
+  anchored_nudge_manager()->Show(nudge_data);
   EXPECT_TRUE(GetShownNudges()[id]);
   EXPECT_FALSE(GetShownNudges()[id_2]);
 
   // Show the second nudge, expect both nudges shown.
-  ShowNudge(id_2, anchor_view_2);
+  anchored_nudge_manager()->Show(nudge_data_2);
   EXPECT_TRUE(GetShownNudges()[id]);
   EXPECT_TRUE(GetShownNudges()[id_2]);
 
@@ -122,13 +123,10 @@
 
   // Set up nudge data contents.
   const std::string id = "id";
-  const std::u16string text = u"text";
   auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>());
   const std::u16string dismiss_text = u"dismiss";
   const std::u16string second_button_text = u"second";
-
-  AnchoredNudgeData nudge_data(id, AnchoredNudgeCatalogName::kTest, text,
-                               anchor_view);
+  auto nudge_data = CreateBaseNudgeData(id, anchor_view);
 
   // Add a dismiss button with no callbacks.
   nudge_data.dismiss_text = dismiss_text;
@@ -210,19 +208,21 @@
   const std::u16string text = u"text";
   auto* anchor_view =
       contents_view->AddChildView(std::make_unique<views::View>());
+  auto nudge_data = CreateBaseNudgeData(id, anchor_view, text);
 
   const std::u16string text_2 = u"text_2";
   auto* anchor_view_2 =
       contents_view->AddChildView(std::make_unique<views::View>());
+  auto nudge_data_2 = CreateBaseNudgeData(id, anchor_view_2, text_2);
 
   // Show a nudge with some initial contents.
-  ShowNudge(id, anchor_view, text);
+  anchored_nudge_manager()->Show(nudge_data);
   auto nudge = GetShownNudges()[id];
   EXPECT_EQ(text, nudge->GetBodyText());
   EXPECT_EQ(anchor_view, nudge->GetAnchorView());
 
   // Attempt to show a nudge with different contents but with the same id.
-  ShowNudge(id, anchor_view_2, text_2);
+  anchored_nudge_manager()->Show(nudge_data_2);
 
   // Previously shown nudge should be cancelled and replaced with new nudge.
   nudge = GetShownNudges()[id];
@@ -240,12 +240,13 @@
   // Set up nudge data contents.
   const std::string id = "id";
   auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>());
+  auto nudge_data = CreateBaseNudgeData(id, anchor_view);
 
   // Set anchor view visibility to false.
   anchor_view->SetVisible(false);
 
   // Attempt to show nudge.
-  ShowNudge(id, anchor_view);
+  anchored_nudge_manager()->Show(nudge_data);
 
   // Anchor view is not visible, the nudge should not be created.
   EXPECT_FALSE(GetShownNudges()[id]);
@@ -258,9 +259,10 @@
   auto contents_view = std::make_unique<views::View>();
   auto* anchor_view =
       contents_view->AddChildView(std::make_unique<views::View>());
+  auto nudge_data = CreateBaseNudgeData(id, anchor_view);
 
   // Attempt to show nudge.
-  ShowNudge(id, anchor_view);
+  anchored_nudge_manager()->Show(nudge_data);
 
   // Anchor view does not have a widget, the nudge should not be created.
   EXPECT_FALSE(GetShownNudges()[id]);
@@ -273,9 +275,10 @@
   // Set up nudge data contents.
   const std::string id = "id";
   auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>());
+  auto nudge_data = CreateBaseNudgeData(id, anchor_view);
 
   // Show a nudge.
-  ShowNudge(id, anchor_view);
+  anchored_nudge_manager()->Show(nudge_data);
   EXPECT_TRUE(GetShownNudges()[id]);
 
   // Set the anchor view visibility to false, the nudge should have closed.
@@ -298,9 +301,10 @@
       widget->SetContentsView(std::make_unique<views::View>());
   auto* anchor_view =
       contents_view->AddChildView(std::make_unique<views::View>());
+  auto nudge_data = CreateBaseNudgeData(id, anchor_view);
 
   // Show a nudge.
-  ShowNudge(id, anchor_view);
+  anchored_nudge_manager()->Show(nudge_data);
   EXPECT_TRUE(GetShownNudges()[id]);
 
   // Delete the anchor view, the nudge should have closed.
@@ -317,17 +321,16 @@
   RootWindowController* const secondary_root_window_controller =
       Shell::GetRootWindowControllerWithDisplayId(GetSecondaryDisplay().id());
 
-  // Set up nudge data contents.
+  // Set up nudge data contents. The anchor view is a child of the secondary
+  // root window controller, so it will be deleted if the display is removed.
   const std::string id = "id";
-  // The anchor view is a child of the secondary root window controller, so it
-  // will be deleted if the display is removed.
-  auto* secondary_unified_system_tray =
-      secondary_root_window_controller->shelf()
-          ->status_area_widget()
-          ->unified_system_tray();
+  auto* anchor_view = secondary_root_window_controller->shelf()
+                          ->status_area_widget()
+                          ->unified_system_tray();
+  auto nudge_data = CreateBaseNudgeData(id, anchor_view);
 
   // Show the nudge in the secondary display.
-  ShowNudge(id, secondary_unified_system_tray);
+  anchored_nudge_manager()->Show(nudge_data);
   EXPECT_TRUE(GetShownNudges()[id]);
 
   // Remove the secondary display, which deletes the anchor view.
@@ -344,9 +347,10 @@
   // Set up nudge data contents.
   const std::string id = "id";
   auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>());
+  auto nudge_data = CreateBaseNudgeData(id, anchor_view);
 
   // Show a nudge.
-  ShowNudge(id, anchor_view);
+  anchored_nudge_manager()->Show(nudge_data);
   EXPECT_TRUE(GetShownNudges()[id]);
 
   // Nudge is left open, no crash.
@@ -360,9 +364,10 @@
   // Set up nudge data contents.
   const std::string id = "id";
   auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>());
+  auto nudge_data = CreateBaseNudgeData(id, anchor_view);
 
   // Show a nudge.
-  ShowNudge(id, anchor_view);
+  anchored_nudge_manager()->Show(nudge_data);
   EXPECT_TRUE(GetShownNudges()[id]);
 
   // Fast forward `kNudgeDefaultDuration` plus one second, the nudge should have
@@ -380,11 +385,11 @@
   // Set up nudge data contents.
   const std::string id = "id";
   auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>());
-  const std::u16string text = u"text";
-  bool has_infinite_duration = true;
+  auto nudge_data = CreateBaseNudgeData(id, anchor_view);
+  nudge_data.has_infinite_duration = true;
 
   // Show a nudge.
-  ShowNudge(id, anchor_view, text, has_infinite_duration);
+  anchored_nudge_manager()->Show(nudge_data);
   EXPECT_TRUE(GetShownNudges()[id]);
 
   // Fast forward `kNudgeDefaultDuration` plus one second, the nudge should not
@@ -405,9 +410,10 @@
   const std::string id = "id";
   const std::string id_2 = "id_2";
   auto* anchor_view = widget->SetContentsView(std::make_unique<views::View>());
+  auto nudge_data = CreateBaseNudgeData(id, anchor_view);
 
   // Show a nudge.
-  ShowNudge(id, anchor_view);
+  anchored_nudge_manager()->Show(nudge_data);
   EXPECT_TRUE(GetShownNudges()[id]);
 
   // Attempt to cancel nudge with an `id` that does not exist. Should not have
diff --git a/ash/webui/color_internals/resources/index.ts b/ash/webui/color_internals/resources/index.ts
index 16cd8a6..c16766f9 100644
--- a/ash/webui/color_internals/resources/index.ts
+++ b/ash/webui/color_internals/resources/index.ts
@@ -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 {addColorChangeListener, startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {COLOR_PROVIDER_CHANGED, ColorChangeUpdater, startColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 
 import {getRGBAFromComputedStyle} from './utils.js';
 import {startObservingWallpaperColors} from './wallpaper_colors.js';
@@ -106,6 +106,7 @@
   populateTokenTable();
   startColorChangeUpdater();
   startObservingWallpaperColors();
-  addColorChangeListener(onColorChange);
+  ColorChangeUpdater.forDocument().eventTarget.addEventListener(
+      COLOR_PROVIDER_CHANGED, onColorChange);
   onColorChange();
 };
diff --git a/ash/webui/common/resources/network/network_proxy.d.ts b/ash/webui/common/resources/network/network_proxy.d.ts
index 1fc89dd..a2d25df7 100644
--- a/ash/webui/common/resources/network/network_proxy.d.ts
+++ b/ash/webui/common/resources/network/network_proxy.d.ts
@@ -4,6 +4,7 @@
 
 import {LegacyElementMixin} from 'chrome://resources/polymer/v3_0/polymer/lib/legacy/legacy-element-mixin.js';
 interface NetworkProxyElement extends LegacyElementMixin, HTMLElement {
+  editable: boolean;
   reset(): void;
 }
 export {NetworkProxyElement};
diff --git a/ash/webui/help_app_ui/resources/receiver.js b/ash/webui/help_app_ui/resources/receiver.js
index e6962d3..163f938 100644
--- a/ash/webui/help_app_ui/resources/receiver.js
+++ b/ash/webui/help_app_ui/resources/receiver.js
@@ -8,7 +8,7 @@
  */
 import './sandboxed_load_time_data.js';
 
-import {addColorChangeListener, removeColorChangeListener, startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
+import {COLOR_PROVIDER_CHANGED, ColorChangeUpdater, startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
 
 import {MessagePipe} from './message_pipe.js';
 import {Message} from './message_types.js';
@@ -96,7 +96,15 @@
 });
 // Expose functions to bind to color change events to window so they can be
 // automatically picked up by installColors(). See ts_helpers.ts in google3.
-window['addColorChangeListener'] = addColorChangeListener;
-window['removeColorChangeListener'] = removeColorChangeListener;
+window['addColorChangeListener'] =
+    /** @suppress {checkTypes} */ function(listener) {
+      ColorChangeUpdater.forDocument().eventTarget.addEventListener(
+          COLOR_PROVIDER_CHANGED, listener);
+    };
+window['removeColorChangeListener'] =
+    /** @suppress {checkTypes} */ function(listener) {
+      ColorChangeUpdater.forDocument().eventTarget.removeEventListener(
+          COLOR_PROVIDER_CHANGED, listener);
+    };
 
 export const TEST_ONLY = {parentMessagePipe};
diff --git a/ash/webui/media_app_ui/resources/js/receiver.js b/ash/webui/media_app_ui/resources/js/receiver.js
index f08182df..7759a354 100644
--- a/ash/webui/media_app_ui/resources/js/receiver.js
+++ b/ash/webui/media_app_ui/resources/js/receiver.js
@@ -4,7 +4,7 @@
 
 import './sandboxed_load_time_data.js';
 
-import {addColorChangeListener, removeColorChangeListener, startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
+import {COLOR_PROVIDER_CHANGED, ColorChangeUpdater, startColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
 
 import {assertCast, MessagePipe} from './message_pipe.js';
 import {EditInPhotosMessage, FileContext, IsFileArcWritableMessage, IsFileArcWritableResponse, IsFileBrowserWritableMessage, IsFileBrowserWritableResponse, LoadFilesMessage, Message, OpenAllowedFileMessage, OpenAllowedFileResponse, OpenFilesWithPickerMessage, OverwriteFileMessage, OverwriteViaFilePickerResponse, RenameFileResponse, RenameResult, RequestSaveFileMessage, RequestSaveFileResponse, SaveAsMessage, SaveAsResponse} from './message_types.js';
@@ -471,8 +471,16 @@
 
 // Expose functions to bind to color change events to window so they can be
 // automatically picked up by installColors(). See ts_helpers.ts in google3.
-window['addColorChangeListener'] = addColorChangeListener;
-window['removeColorChangeListener'] = removeColorChangeListener;
+window['addColorChangeListener'] =
+    /** @suppress {checkTypes} */ function(listener) {
+      ColorChangeUpdater.forDocument().eventTarget.addEventListener(
+          COLOR_PROVIDER_CHANGED, listener);
+    };
+window['removeColorChangeListener'] =
+    /** @suppress {checkTypes} */ function(listener) {
+      ColorChangeUpdater.forDocument().eventTarget.removeEventListener(
+          COLOR_PROVIDER_CHANGED, listener);
+    };
 
 export const TEST_ONLY = {
   RenameResult,
diff --git a/ash/wm/overview/overview_constants.h b/ash/wm/overview/overview_constants.h
index 600ff51..c3f39a7d 100644
--- a/ash/wm/overview/overview_constants.h
+++ b/ash/wm/overview/overview_constants.h
@@ -19,6 +19,11 @@
 constexpr base::TimeDelta kWindowRestoreDurationCrOSNext =
     base::Milliseconds(350);
 
+// Number of overview items needed to trigger the overview scroll layout.
+constexpr int kMinimumItemsForNewLayoutInTablet = 6;
+// TODO(b/286568408): Get clamshell layout number from UX.
+constexpr int kMinimumItemsForNewLayoutInClamshell = 10;
+
 // In the conceptual overview table, the horizontal space between two adjacent
 // items.
 constexpr int kHorizontalSpaceBetweenItemsDp = 10;
diff --git a/ash/wm/overview/overview_controller.cc b/ash/wm/overview/overview_controller.cc
index 1413fdc..77d6a2c1 100644
--- a/ash/wm/overview/overview_controller.cc
+++ b/ash/wm/overview/overview_controller.cc
@@ -539,11 +539,14 @@
 
   // Unblur when animation is completed (or right away if there was no
   // delayed animation) unless it's canceled, in which case, we should keep
-  // the blur. Also resume the activation frame state. No need to unblur the
-  // wallpaper if the feature `kJellyroll` is enabled, since it's not blurred
-  // on overview started.
+  // the blur. No need to unblur the wallpaper if the feature `kJellyroll` is
+  // enabled, since it's not blurred on overview started.
   if (!canceled && !chromeos::features::IsJellyrollEnabled()) {
     overview_wallpaper_controller_->Unblur();
+  }
+
+  // Resume the activation frame state.
+  if (!canceled) {
     paint_as_active_lock_.reset();
   }
 
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc
index dae5b3a..16b12a3 100644
--- a/ash/wm/overview/overview_grid.cc
+++ b/ash/wm/overview/overview_grid.cc
@@ -111,7 +111,9 @@
 // Number of rows for windows in tablet overview mode.
 constexpr int kTabletLayoutRow = 2;
 
-constexpr int kMinimumItemsForNewLayout = 6;
+// Number of rows for windows in clamshell (scrolling) overview mode.
+// TODO(b/286568408): Get feedback from UX on window height.
+constexpr int kClamshellScrollRow = 2;
 
 constexpr int kTabletModeOverviewItemTopPaddingDp = 16;
 
@@ -604,6 +606,20 @@
   Shell::Get()->wallpaper_controller()->AddObserver(this);
 }
 
+bool OverviewGrid::ShouldUseScrollingLayout(size_t ignored_items_size) const {
+  if (ShouldUseTabletModeGridLayout()) {
+    return window_list_.size() - ignored_items_size >=
+           kMinimumItemsForNewLayoutInTablet;
+  }
+
+  if (features::IsOverviewScrollLayoutForClamshellEnabled()) {
+    return window_list_.size() - ignored_items_size >=
+           kMinimumItemsForNewLayoutInClamshell;
+  }
+
+  return false;
+}
+
 void OverviewGrid::PositionWindows(
     bool animate,
     const base::flat_set<OverviewItem*>& ignored_items,
@@ -613,11 +629,12 @@
 
   DCHECK_NE(transition, OverviewTransition::kExit);
 
+  // If there are too many windows on the overview mode screen, the new
+  // scrolling layout can be shown. If in tablet mode, show the new
+  // layout by default. If in clamshell, only show if feature is enabled.
   std::vector<gfx::RectF> rects =
-      ShouldUseTabletModeGridLayout() &&
-              (window_list_.size() - ignored_items.size() >=
-               kMinimumItemsForNewLayout)
-          ? GetWindowRectsForTabletModeLayout(ignored_items)
+      ShouldUseScrollingLayout(ignored_items.size())
+          ? GetWindowRectsForScrollingLayout(ignored_items)
           : GetWindowRects(ignored_items);
 
   if (transition == OverviewTransition::kEnter) {
@@ -1578,26 +1595,39 @@
 void OverviewGrid::StartScroll() {
   Shell::Get()->overview_controller()->PauseOcclusionTracker();
 
-  // Users are not allowed to scroll past the leftmost or rightmost bounds of
-  // the items on screen in the grid. |scroll_offset_min_| is the amount needed
-  // to fit the rightmost window into |total_bounds|. The max is zero which is
-  // default because windows are aligned to the left from the beginning.
+  // Users are not allowed to scroll past the bounds of the items on screen in
+  // the grid. `scroll_offset_min_` is the amount needed to fit either the
+  // rightmost window (tablet) or the bottommost window (clamshell) into
+  // `total_bounds`. The max is zero (default) because windows are aligned
+  // either to the left (tablet) or at the top (clamshell) from the beginning.
+
+  // Logic involving `OverviewScrollLayoutForClamshell` replicates the tablet
+  // scroll behavior but also in the vertical direction in addition to
+  // horizontal.
   gfx::Rect total_bounds = GetGridEffectiveBounds();
   total_bounds.Inset(GetGridInsetsImpl(total_bounds));
 
-  float rightmost_window_right = 0;
+  float outer_window_edge = 0;
   for (const auto& item : window_list_) {
     const gfx::RectF bounds = item->target_bounds();
-    if (rightmost_window_right < bounds.right())
-      rightmost_window_right = bounds.right();
+    // In tablet mode, the window with the furthest edge is the rightmost
+    // window but in clamshell it is the bottommost window.
+    float outer_bounds_edge =
+        ShouldUseTabletModeGridLayout() ? bounds.right() : bounds.bottom();
+    if (outer_window_edge < outer_bounds_edge) {
+      outer_window_edge = outer_bounds_edge;
+    }
 
     item->set_scrolling_bounds(bounds);
   }
 
-  // |rightmost_window_right| may have been modified by an earlier scroll.
-  // |scroll_offset_| is added to adjust for that.
-  rightmost_window_right -= scroll_offset_;
-  scroll_offset_min_ = total_bounds.right() - rightmost_window_right;
+  // `outer_window_edge` may have been modified by an earlier scroll.
+  // `scroll_offset_` is added to adjust for that.
+  outer_window_edge -= scroll_offset_;
+  scroll_offset_min_ =
+      (ShouldUseTabletModeGridLayout() ? total_bounds.right()
+                                       : total_bounds.bottom()) -
+      outer_window_edge;
   if (scroll_offset_min_ > 0.f)
     scroll_offset_min_ = 0.f;
 
@@ -1612,7 +1642,7 @@
   new_scroll_offset = std::clamp(new_scroll_offset, scroll_offset_min_, 0.f);
 
   // For flings, we want to return false if we hit one of the edges, which is
-  // when |new_scroll_offset| is exactly 0.f or |scroll_offset_min_|.
+  // when `new_scroll_offset` is exactly 0.f or `scroll_offset_min_`.
   const bool in_range =
       new_scroll_offset < 0.f && new_scroll_offset > scroll_offset_min_;
   if (new_scroll_offset == scroll_offset_)
@@ -1625,17 +1655,25 @@
     DCHECK(scrolling_bounds_optional);
     const gfx::RectF previous_bounds = scrolling_bounds_optional.value();
     gfx::RectF new_bounds = previous_bounds;
-    new_bounds.Offset(new_scroll_offset - scroll_offset_, 0.f);
+    // Apply the offset to the axis we are scrolling on.
+    ShouldUseTabletModeGridLayout()
+        ? new_bounds.Offset(new_scroll_offset - scroll_offset_, 0.f)
+        : new_bounds.Offset(0.f, new_scroll_offset - scroll_offset_);
     item->set_scrolling_bounds(new_bounds);
     if (gfx::RectF(GetGridEffectiveBounds()).Intersects(new_bounds) ||
         gfx::RectF(GetGridEffectiveBounds()).Intersects(previous_bounds)) {
       item->SetBounds(new_bounds, OVERVIEW_ANIMATION_NONE);
     }
   }
+  // If in clamshell mode, restack the desk bar above the windows.
+  // Not needed in tablet as horizontal scrolls never overlap with desk bar.
+  if (desks_widget() && !ShouldUseTabletModeGridLayout()) {
+    desks_widget_->StackAtTop();
+  }
 
   scroll_offset_ = new_scroll_offset;
 
-  DCHECK(presentation_time_recorder_);
+  CHECK(presentation_time_recorder_);
   presentation_time_recorder_->RequestNext();
   return in_range;
 }
@@ -2071,8 +2109,11 @@
   // animation. If the visibility has changed, skip the bounds animation and use
   // the fade animation from above. Align the widget so it is visually aligned
   // with the first overview item.
+  // If `ShouldUseScrollingLayout()`, don't animate because it becomes
+  // distracting to the user to have the button animate behind moving windows.
   ScopedOverviewAnimationSettings settings(
-      visibility_changed || in_desk_animation
+      visibility_changed || in_desk_animation ||
+              ShouldUseScrollingLayout(/*ignored_items=*/0)
           ? OVERVIEW_ANIMATION_NONE
           : OVERVIEW_ANIMATION_LAYOUT_OVERVIEW_ITEMS_IN_OVERVIEW,
       save_desk_button_container_widget_->GetNativeWindow());
@@ -2352,7 +2393,25 @@
   return rects;
 }
 
-std::vector<gfx::RectF> OverviewGrid::GetWindowRectsForTabletModeLayout(
+void OverviewGrid::HandleMouseWheelScrollEvent(int scroll_offset) {
+  // Avoid unnecessary scrolling.
+  // TODO(sammiequon): Fix handling of ignored items. For now, pass 0 as the
+  // number of ignored items as there is at most one drop target per grid.
+  if (ShouldUseScrollingLayout(/*ignored_items_size=*/0)) {
+    StartScroll();
+    UpdateScrollOffset(scroll_offset);
+    EndScroll();
+  }
+}
+
+std::vector<gfx::RectF> OverviewGrid::GetWindowRectsForScrollingLayout(
+    const base::flat_set<OverviewItem*>& ignored_items) {
+  return ShouldUseTabletModeGridLayout()
+             ? GetRectsForTabletScroll(ignored_items)
+             : GetRectsForClamshellScroll(ignored_items);
+}
+
+std::vector<gfx::RectF> OverviewGrid::GetRectsForClamshellScroll(
     const base::flat_set<OverviewItem*>& ignored_items) {
   gfx::Rect total_bounds = GetGridEffectiveBounds();
   // Windows occupy vertically centered area with additional vertical insets.
@@ -2360,9 +2419,91 @@
   total_bounds.Inset(
       gfx::Insets::TLBR(kTabletModeOverviewItemTopPaddingDp, 0, 0, 0));
 
-  // |scroll_offset_min_| may be changed on positioning (either by closing
-  // windows or display changes). Recalculate it and clamp |scroll_offset_|, so
-  // that the items are always aligned left or right.
+  // `scroll_offset_min_` may be changed on positioning (either by closing
+  // windows or display changes). Recalculate it and clamp `scroll_offset_`, so
+  // items are always vertically aligned.
+  float bottommost_window_bottom_edge = 0;
+  for (const auto& item : window_list_) {
+    if (ShouldExcludeItemFromGridLayout(item.get(), ignored_items)) {
+      continue;
+    }
+    bottommost_window_bottom_edge =
+        std::max(bottommost_window_bottom_edge, item->target_bounds().bottom());
+  }
+
+  // `bottommost_window_bottom_edge` may have been modified by an earlier
+  // scroll. `scroll_offset_` is added to adjust for that. If
+  // `bottommost_window_bottom_edge` is less than `total_bounds.bottom()`,
+  // the grid cannot be scrolled. Set `scroll_offset_min_` to 0 so that
+  // `std::clamp()` is happy.
+  bottommost_window_bottom_edge -= scroll_offset_;
+  scroll_offset_min_ = total_bounds.bottom() - bottommost_window_bottom_edge;
+  if (scroll_offset_min_ > 0.f) {
+    scroll_offset_min_ = 0.f;
+  }
+
+  scroll_offset_ = std::clamp(scroll_offset_, scroll_offset_min_, 0.f);
+
+  // Map which contains `curr_num_rows` entries with information on the last
+  // items right bound per row. Used to place the next item directly next to the
+  // last item. The key is the y-value of the row and the value is the rightmost
+  // x-value.
+  int curr_num_rows = 1;
+  base::flat_map<float, float> right_edge_map;
+
+  // There is no restriction on the number of rows. Need feedback from UX on
+  // window sizes for this new layout. For now, use the same logic as in tablet
+  // mode for calculating the height of each window. The most recently used
+  // windows are displayed first. When the dragged item becomes an
+  // `ignored_item`, move the other windows accordingly. `window_position`
+  // matches the positions of the windows' indexes from `window_list_`.
+  // However, if a window turns out to be an ignored item, `window_position`
+  // remains where the item was as to then reposition the other window's bounds
+  // in place of that item.
+  const int height = (total_bounds.height() - ((kClamshellScrollRow - 1) *
+                                               kVerticalSpaceBetweenItemsDp)) /
+                     kClamshellScrollRow;
+  std::vector<gfx::RectF> rects;
+  for (const auto& window : window_list_) {
+    OverviewItem* item = window.get();
+    if (ShouldExcludeItemFromGridLayout(item, ignored_items)) {
+      rects.emplace_back();
+      continue;
+    }
+
+    // Calculate the width, x, and y of the item.
+    const int width = CalculateWidthAndMaybeSetUnclippedBounds(item, height);
+    int y = (height + kVerticalSpaceBetweenItemsDp) * (curr_num_rows - 1) +
+            total_bounds.y() + scroll_offset_;
+    int x = right_edge_map.contains(y) ? right_edge_map[y] : total_bounds.x();
+
+    // The windows should not exceed the right edge of `total_bounds`.
+    if ((x + width + kHorizontalSpaceBetweenItemsDp) > total_bounds.right()) {
+      curr_num_rows++;
+      y += height + kVerticalSpaceBetweenItemsDp;
+      x = total_bounds.x();
+    }
+
+    // Update `right_edge_map` for calculating x and y for the next item.
+    right_edge_map[y] = x + width + kHorizontalSpaceBetweenItemsDp;
+    CHECK_LE(static_cast<int>(right_edge_map.size()), curr_num_rows);
+    rects.emplace_back(x, y, width, height);
+  }
+
+  return rects;
+}
+
+std::vector<gfx::RectF> OverviewGrid::GetRectsForTabletScroll(
+    const base::flat_set<OverviewItem*>& ignored_items) {
+  gfx::Rect total_bounds = GetGridEffectiveBounds();
+  // Windows occupy vertically centered area with additional vertical insets.
+  total_bounds.Inset(GetGridInsetsImpl(total_bounds));
+  total_bounds.Inset(
+      gfx::Insets::TLBR(kTabletModeOverviewItemTopPaddingDp, 0, 0, 0));
+
+  // `scroll_offset_min_` may be changed on positioning (either by closing
+  // windows or display changes). Recalculate it and clamp `scroll_offset_`, so
+  // items are always aligned left or right.
   float rightmost_window_right = 0;
   for (const auto& item : window_list_) {
     if (ShouldExcludeItemFromGridLayout(item.get(), ignored_items))
@@ -2382,7 +2523,7 @@
 
   scroll_offset_ = std::clamp(scroll_offset_, scroll_offset_min_, 0.f);
 
-  // Map which contains up to |kTabletLayoutRow| entries with information on the
+  // Map which contains up to `kTabletLayoutRow` entries with information on the
   // last items right bound per row. Used so we can place the next item directly
   // next to the last item. The key is the y-value of the row, and the value is
   // the rightmost x-value.
@@ -2390,10 +2531,10 @@
 
   // Since the number of rows is limited, windows are laid out column-wise so
   // that the most recently used windows are displayed first. When the dragged
-  // item becomes an |ignored_item|, move the other windows accordingly.
-  // |window_position| matches the positions of the windows' indexes from
-  // |window_list_|. However, if a window turns out to be an ignored item,
-  // |window_position| remains where the item was as to then reposition the
+  // item becomes an `ignored_item`, move the other windows accordingly.
+  // `window_position` matches the positions of the windows' indexes from
+  // `window_list_`. However, if a window turns out to be an ignored item,
+  // `window_position` remains where the item was as to then reposition the
   // other window's bounds in place of that item.
   const int height = (total_bounds.height() -
                       ((kTabletLayoutRow - 1) * kVerticalSpaceBetweenItemsDp)) /
diff --git a/ash/wm/overview/overview_grid.h b/ash/wm/overview/overview_grid.h
index a77516f..b440e45 100644
--- a/ash/wm/overview/overview_grid.h
+++ b/ash/wm/overview/overview_grid.h
@@ -90,6 +90,15 @@
   // exist.
   OverviewItem* GetOverviewItemContaining(const aura::Window* window) const;
 
+  // TODO(b/285408040): Handle two finger scroll and make it smooth.
+  void HandleMouseWheelScrollEvent(int scroll_offset);
+
+  // Check if in tablet mode or the new clamshell scroll layout feature is
+  // enabled. If so, the visible windows on the overview screen exceed
+  // `kMinimumItemsForNewLayoutInClamshell` or
+  // `kMinimumItemsForNewLayoutInTablet` thereby cluttering the overview screen.
+  bool ShouldUseScrollingLayout(size_t ignored_items_size) const;
+
   // Adds |window| at the specified |index|. |window| cannot already be on the
   // grid. If |reposition| is true, repositions all items except those in
   // |ignored_items|. If |animate| is true, animates the repositioning.
@@ -484,22 +493,31 @@
   std::vector<gfx::RectF> GetWindowRects(
       const base::flat_set<OverviewItem*>& ignored_items);
 
-  // Gets the layout of the overview items. Currently only for tablet mode.
-  // Positions up to six windows into two rows of equal height, scaling each
-  // window to fit that height. Additional windows are placed off-screen.
-  // |ignored_items| won't be shown along with the other windows in overview
-  // mode.
-  std::vector<gfx::RectF> GetWindowRectsForTabletModeLayout(
+  // Gets the layout of the overview items. Positions up to six windows into
+  // two rows of equal height, scaling each window to fit that height.
+  // Additional windows are placed off-screen. |ignored_items| won't be shown
+  // along with the other windows in overview mode. If
+  // `IsOverviewScrollLayoutForClamshellEnabled`, then the behavior is
+  // replicated but in the vertical direction for clamshell mode.
+  // TODO(b/286869951): Reduce duplication once clamshell scrolling is
+  // finalized.
+  std::vector<gfx::RectF> GetWindowRectsForScrollingLayout(
       const base::flat_set<OverviewItem*>& ignored_items);
 
-  // Attempts to fit all |out_rects| inside |bounds|. The method ensures that
-  // the |out_rects| vector has appropriate size and populates it with the
+  std::vector<gfx::RectF> GetRectsForClamshellScroll(
+      const base::flat_set<OverviewItem*>& ignored_items);
+
+  std::vector<gfx::RectF> GetRectsForTabletScroll(
+      const base::flat_set<OverviewItem*>& ignored_items);
+
+  // Attempts to fit all `out_rects` inside `bounds`. The method ensures that
+  // the `out_rects` vector has appropriate size and populates it with the
   // values placing rects next to each other left-to-right in rows of equal
-  // |height|. While fitting |out_rects| several metrics are collected that can
-  // be used by the caller. |out_max_bottom| specifies the bottom that the rects
-  // are extending to. |out_min_right| and |out_max_right| report the right
+  // `height`. While fitting `out_rects` several metrics are collected that can
+  // be used by the caller. `out_max_bottom` specifies the bottom that the rects
+  // are extending to. `out_min_right` and `out_max_right` report the right
   // bound of the narrowest and the widest rows respectively. In-values of the
-  // |out_max_bottom|, |out_min_right| and |out_max_right| parameters are
+  // `out_max_bottom`, `out_min_right` and `out_max_right` parameters are
   // ignored and their values are always initialized inside this method. Returns
   // true on success and false otherwise.
   bool FitWindowRectsInBounds(
@@ -601,12 +619,13 @@
   // reposition windows in tablet overview mode.
   bool suspend_reposition_ = false;
 
-  // Used by |GetWindowRectsForTabletModeLayout| to shift the x position of the
-  // overview items.
+  // Used by `GetWindowRectsForScrollingLayout` to shift the x position of the
+  // overview items and y position if
+  // `IsOverviewScrollLayoutForClamshellEnabled`.
   float scroll_offset_ = 0;
 
-  // Value to clamp |scroll_offset| so scrolling stays limited to windows that
-  // are visible in tablet overview mode.
+  // Value to clamp `scroll_offset` so scrolling stays limited to windows that
+  // are visible in the new scrolling layout for overview mode.
   float scroll_offset_min_ = 0.f;
 
   // Handles events that are not handled by the OverviewItems.
diff --git a/ash/wm/overview/overview_grid_event_handler.cc b/ash/wm/overview/overview_grid_event_handler.cc
index ec4eb31..84b7e03b 100644
--- a/ash/wm/overview/overview_grid_event_handler.cc
+++ b/ash/wm/overview/overview_grid_event_handler.cc
@@ -71,6 +71,10 @@
     return;
   }
 
+  if (event->type() == ui::ET_MOUSEWHEEL) {
+    grid_->HandleMouseWheelScrollEvent(event->AsMouseWheelEvent()->y_offset());
+  }
+
   if (event->type() == ui::ET_MOUSE_RELEASED)
     HandleClickOrTap(event);
 }
diff --git a/ash/wm/overview/overview_item.cc b/ash/wm/overview/overview_item.cc
index acdb172..48bf8fce 100644
--- a/ash/wm/overview/overview_item.cc
+++ b/ash/wm/overview/overview_item.cc
@@ -15,6 +15,7 @@
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/rounded_label_widget.h"
 #include "ash/style/system_shadow.h"
+#include "ash/wm/desks/desk_bar_controller.h"
 #include "ash/wm/desks/desks_util.h"
 #include "ash/wm/desks/templates/saved_desk_animations.h"
 #include "ash/wm/drag_window_controller.h"
@@ -681,6 +682,7 @@
   aura::Window* window = GetWindow();
   aura::Window* parent_window = window->parent();
   aura::Window* stacking_target = nullptr;
+
   // Stack |window| below the split view window if split view is active.
   SplitViewController* split_view_controller =
       SplitViewController::Get(root_window_);
diff --git a/ash/wm/overview/overview_item_view.cc b/ash/wm/overview/overview_item_view.cc
index fa70c3c..ce00c05f 100644
--- a/ash/wm/overview/overview_item_view.cc
+++ b/ash/wm/overview/overview_item_view.cc
@@ -305,6 +305,15 @@
   return true;
 }
 
+bool OverviewItemView::OnMouseWheel(const ui::MouseWheelEvent& event) {
+  if (!overview_item_) {
+    return false;
+  }
+  overview_item_->overview_grid()->HandleMouseWheelScrollEvent(
+      event.y_offset());
+  return true;
+}
+
 void OverviewItemView::OnMouseReleased(const ui::MouseEvent& event) {
   if (!overview_item_) {
     views::View::OnMouseReleased(event);
diff --git a/ash/wm/overview/overview_item_view.h b/ash/wm/overview/overview_item_view.h
index 7b22554..d0c7ba6 100644
--- a/ash/wm/overview/overview_item_view.h
+++ b/ash/wm/overview/overview_item_view.h
@@ -90,6 +90,7 @@
  protected:
   // views::View:
   bool OnMousePressed(const ui::MouseEvent& event) override;
+  bool OnMouseWheel(const ui::MouseWheelEvent& event) override;
   bool OnMouseDragged(const ui::MouseEvent& event) override;
   void OnMouseReleased(const ui::MouseEvent& event) override;
   void OnGestureEvent(ui::GestureEvent* event) override;
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc
index 3b0a6a1..46275bf 100644
--- a/ash/wm/overview/overview_session_unittest.cc
+++ b/ash/wm/overview/overview_session_unittest.cc
@@ -84,6 +84,7 @@
 #include "base/test/metrics/user_action_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "chromeos/ui/wm/features.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/client/window_types.h"
@@ -3680,24 +3681,6 @@
     GetEventGenerator()->GestureScrollSequence(start, end,
                                                base::Milliseconds(100), 1000);
   }
-
-  void DispatchLongPress(OverviewItem* item) {
-    const gfx::Point point =
-        gfx::ToRoundedPoint(item->target_bounds().CenterPoint());
-    ui::GestureEvent long_press(
-        point.x(), point.y(), 0, base::TimeTicks::Now(),
-        ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS));
-    GetEventGenerator()->Dispatch(&long_press);
-  }
-
-  // Creates |n| test windows. They are created in reverse order, so that the
-  // first window in the vector is the MRU window.
-  std::vector<std::unique_ptr<aura::Window>> CreateTestWindows(int n) {
-    std::vector<std::unique_ptr<aura::Window>> windows(n);
-    for (int i = n - 1; i >= 0; --i)
-      windows[i] = CreateTestWindow();
-    return windows;
-  }
 };
 
 // Tests that windows are in proper positions in the new overview layout.
@@ -3978,6 +3961,255 @@
   EXPECT_TRUE(WindowState::Get(window.get())->IsSnapped());
 }
 
+class ClamshellScrollOverviewSessionTest : public OverviewTestBase {
+ public:
+  ClamshellScrollOverviewSessionTest() = default;
+  ClamshellScrollOverviewSessionTest(
+      const ClamshellScrollOverviewSessionTest&) = delete;
+  ClamshellScrollOverviewSessionTest& operator=(
+      const ClamshellScrollOverviewSessionTest&) = delete;
+  ~ClamshellScrollOverviewSessionTest() override = default;
+
+  // OverviewTestBase:
+  void SetUp() override {
+    scoped_feature_list_.InitWithFeatures(
+        /*enabled_features=*/{features::kOverviewScrollLayoutForClamshell,
+                              chromeos::features::kJelly},
+        /*disabled_features=*/{});
+    OverviewTestBase::SetUp();
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+// Tests that when 10 windows are open, the scrolling layout for
+// overview mode in clamshell has some of the windows offscreen.
+TEST_F(ClamshellScrollOverviewSessionTest, CheckManyWindowsOffScreen) {
+  auto windows = CreateTestWindows(kMinimumItemsForNewLayoutInClamshell);
+  ToggleOverview();
+  ASSERT_TRUE(InOverviewSession());
+
+  OverviewItem* item0 = GetOverviewItemForWindow(windows[0].get());
+  OverviewItem* item1 = GetOverviewItemForWindow(windows[1].get());
+  OverviewItem* item8 = GetOverviewItemForWindow(windows[8].get());
+  OverviewItem* item9 = GetOverviewItemForWindow(windows[9].get());
+
+  const gfx::RectF screen_bounds(GetGridBounds());
+  const gfx::RectF item0_bounds = item0->target_bounds();
+  const gfx::RectF item1_bounds = item1->target_bounds();
+  const gfx::RectF item8_bounds = item8->target_bounds();
+  const gfx::RectF item9_bounds = item9->target_bounds();
+
+  // `item0` should be within `screen_bounds`.
+  EXPECT_TRUE(screen_bounds.Contains(item0_bounds));
+
+  // `item1` should be within `screen_bounds`.
+  EXPECT_TRUE(screen_bounds.Contains(item1_bounds));
+
+  // `item9` should not be within `screen_bounds` but it should have an
+  // x value within `screen_bounds`.
+  EXPECT_FALSE(screen_bounds.Contains(item8_bounds));
+  EXPECT_GT(item9_bounds.x(), screen_bounds.x());
+  EXPECT_LT(item9_bounds.x(), screen_bounds.x() + screen_bounds.width());
+
+  // `item8` should not be within `screen_bounds` but it should have an
+  // x value within `screen_bounds`.
+  EXPECT_FALSE(screen_bounds.Contains(item9_bounds));
+  EXPECT_GT(item8_bounds.x(), screen_bounds.x());
+  EXPECT_LT(item8_bounds.x(), screen_bounds.x() + screen_bounds.width());
+}
+
+// Tests that when 4 windows are open, the scrolling layout for
+// overview mode in clamshell has all of the windows onscreen.
+TEST_F(ClamshellScrollOverviewSessionTest, CheckFewWindowsOnScreen) {
+  auto windows = CreateTestWindows(4);
+  ToggleOverview();
+  ASSERT_TRUE(InOverviewSession());
+
+  OverviewItem* item0 = GetOverviewItemForWindow(windows[0].get());
+  OverviewItem* item1 = GetOverviewItemForWindow(windows[1].get());
+  OverviewItem* item2 = GetOverviewItemForWindow(windows[2].get());
+  OverviewItem* item3 = GetOverviewItemForWindow(windows[3].get());
+
+  const gfx::RectF screen_bounds(GetGridBounds());
+  const gfx::RectF item0_bounds = item0->target_bounds();
+  const gfx::RectF item1_bounds = item1->target_bounds();
+  const gfx::RectF item2_bounds = item2->target_bounds();
+  const gfx::RectF item3_bounds = item3->target_bounds();
+
+  // All items should be within `screen_bounds`.
+  EXPECT_TRUE(screen_bounds.Contains(item0_bounds));
+  EXPECT_TRUE(screen_bounds.Contains(item1_bounds));
+  EXPECT_TRUE(screen_bounds.Contains(item2_bounds));
+  EXPECT_TRUE(screen_bounds.Contains(item3_bounds));
+}
+
+// Tests that windows cannot be scrolled if all windows fit on screen.
+TEST_F(ClamshellScrollOverviewSessionTest, CheckNoOverviewItemShift) {
+  auto windows = CreateTestWindows(4);
+  ToggleOverview();
+  ASSERT_TRUE(InOverviewSession());
+
+  OverviewItem* item0 = GetOverviewItemForWindow(windows[0].get());
+  const gfx::RectF before_shift_bounds = item0->target_bounds();
+
+  GetEventGenerator()->MoveMouseTo(GetGridBounds().width(),
+                                   GetGridBounds().height());
+  GetEventGenerator()->MoveMouseWheel(0, -200);
+
+  EXPECT_EQ(before_shift_bounds, item0->target_bounds());
+}
+
+// Tests to see that windows can be scrolled if at least one window is
+// partially/completely positioned offscreen.
+TEST_F(ClamshellScrollOverviewSessionTest, CheckOverviewItemShift) {
+  auto windows = CreateTestWindows(kMinimumItemsForNewLayoutInClamshell);
+  ToggleOverview();
+  ASSERT_TRUE(InOverviewSession());
+
+  OverviewItem* item0 = GetOverviewItemForWindow(windows[0].get());
+  const gfx::RectF before_shift_bounds = item0->target_bounds();
+
+  GetEventGenerator()->MoveMouseTo(GetGridBounds().width(),
+                                   GetGridBounds().height());
+  GetEventGenerator()->MoveMouseWheel(0, -200);
+
+  EXPECT_LT(item0->target_bounds().y(), before_shift_bounds.y());
+}
+
+// Tests to see if windows remain in bounds after scrolling extremely far.
+TEST_F(ClamshellScrollOverviewSessionTest, CheckOverviewItemScrollingBounds) {
+  auto windows = CreateTestWindows(kMinimumItemsForNewLayoutInClamshell);
+  ToggleOverview();
+  ASSERT_TRUE(InOverviewSession());
+
+  // Scroll an extreme amount to see if windows at the top are still in
+  // bounds. First, align the top window (`windows[0]`) to the top bound
+  // and store the item's location. Then, scroll a far amount and check
+  // to see if the item moved at all.
+  OverviewItem* top_window = GetOverviewItemForWindow(windows[0].get());
+
+  GetEventGenerator()->MoveMouseTo(GetGridBounds().width(),
+                                   GetGridBounds().height());
+  GetEventGenerator()->MoveMouseWheel(0, -500);
+
+  const gfx::RectF top_bounds = top_window->target_bounds();
+  GetEventGenerator()->MoveMouseWheel(0, -500);
+  EXPECT_EQ(top_bounds, top_window->target_bounds());
+
+  // Scroll an extreme amount to see if windows on the bottom are still in
+  // bounds. First, align the bottom window (`windows[7]`) to the bottom
+  // bound and store the item's location. Then, scroll a far amount and
+  // check to see if the item moved at all.
+  OverviewItem* bottom_window = GetOverviewItemForWindow(windows[7].get());
+  GetEventGenerator()->MoveMouseWheel(0, 500);
+  const gfx::RectF bottom_bounds = bottom_window->target_bounds();
+  GetEventGenerator()->MoveMouseWheel(0, 500);
+  EXPECT_EQ(bottom_bounds, bottom_window->target_bounds());
+}
+
+// Test that overview widgets are stacked underneath the desk bar widget
+// when scrolling vertically in overview mode.
+TEST_F(ClamshellScrollOverviewSessionTest,
+       OverviewWidgetsAreStackedUnderDeskBar) {
+  auto windows = CreateTestWindows(kMinimumItemsForNewLayoutInClamshell);
+  ToggleOverview();
+  auto* desk_bar_view =
+      GetOverviewGridForRoot(Shell::Get()->GetPrimaryRootWindow())
+          ->desks_bar_view();
+  auto* top_window = GetOverviewItemForWindow(windows[0].get());
+  ASSERT_TRUE(InOverviewSession());
+
+  // Ensure the two windows in question share the same root window.
+  ASSERT_EQ(top_window->root_window(), desk_bar_view->root());
+
+  // Before we start scrolling, the items have not been restacked.
+  // So, check that the overview item is still stacked in front of the desk bar
+  // like the default behavior expects.
+  EXPECT_FALSE(window_util::IsStackedBelow(
+      top_window->item_widget()->GetNativeWindow(),
+      desk_bar_view->GetWidget()->GetNativeWindow()));
+
+  // Scroll so the overview widget gets restacked.
+  GetEventGenerator()->MoveMouseTo(GetGridBounds().width(),
+                                   GetGridBounds().height());
+  GetEventGenerator()->MoveMouseWheel(0, -100);
+
+  EXPECT_TRUE(window_util::IsStackedBelow(
+      top_window->item_widget()->GetNativeWindow(),
+      desk_bar_view->GetWidget()->GetNativeWindow()));
+}
+
+// Test scrolling behavior when floated and minimized windows are present.
+TEST_F(ClamshellScrollOverviewSessionTest,
+       CheckOverviewScrollWithFloatedWindow) {
+  auto windows = CreateTestWindows(kMinimumItemsForNewLayoutInClamshell);
+
+  // Create a floated, non-floated active, and minimized window.
+  auto active_window = CreateAppWindow();
+  auto minimized_window = CreateAppWindow();
+  auto floated_window = CreateAppWindow();
+
+  // Confirm floated window.
+  PressAndReleaseKey(ui::VKEY_F, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN);
+  ASSERT_TRUE(WindowState::Get(floated_window.get())->IsFloated());
+
+  ToggleOverview();
+  ASSERT_TRUE(InOverviewSession());
+
+  auto* desk_bar_view =
+      GetOverviewGridForRoot(Shell::Get()->GetPrimaryRootWindow())
+          ->desks_bar_view();
+  OverviewItem* floated_window_item =
+      GetOverviewItemForWindow(floated_window.get());
+  OverviewItem* active_window_item =
+      GetOverviewItemForWindow(active_window.get());
+  OverviewItem* minimized_window_item =
+      GetOverviewItemForWindow(minimized_window.get());
+
+  const gfx::RectF float_before_shift_bounds =
+      floated_window_item->target_bounds();
+  const gfx::RectF active_before_shift_bounds =
+      active_window_item->target_bounds();
+  const gfx::RectF minimized_before_shift_bounds =
+      minimized_window_item->target_bounds();
+
+  // Ensure the non-floated windows share the same root window. Floated windows
+  // are parented to a different container and guaranteed be below the desk bar.
+  ASSERT_EQ(active_window_item->root_window(), desk_bar_view->root());
+  ASSERT_EQ(minimized_window_item->root_window(), desk_bar_view->root());
+
+  // Before we start scrolling, the items have not been restacked.
+  EXPECT_FALSE(window_util::IsStackedBelow(
+      active_window_item->item_widget()->GetNativeWindow(),
+      desk_bar_view->GetWidget()->GetNativeWindow()));
+  EXPECT_FALSE(window_util::IsStackedBelow(
+      minimized_window_item->item_widget()->GetNativeWindow(),
+      desk_bar_view->GetWidget()->GetNativeWindow()));
+
+  // Scroll so the overview widget gets restacked.
+  GetEventGenerator()->MoveMouseTo(GetGridBounds().width(),
+                                   GetGridBounds().height());
+  GetEventGenerator()->MoveMouseWheel(0, -100);
+
+  // Check windows are stacked below the desk bar.
+  EXPECT_TRUE(window_util::IsStackedBelow(
+      active_window_item->item_widget()->GetNativeWindow(),
+      desk_bar_view->GetWidget()->GetNativeWindow()));
+  EXPECT_TRUE(window_util::IsStackedBelow(
+      minimized_window_item->item_widget()->GetNativeWindow(),
+      desk_bar_view->GetWidget()->GetNativeWindow()));
+
+  // Check windows have been re-positioned.
+  EXPECT_LT(floated_window_item->target_bounds().y(),
+            float_before_shift_bounds.y());
+  EXPECT_LT(active_window_item->target_bounds().y(),
+            active_before_shift_bounds.y());
+  EXPECT_LT(minimized_window_item->target_bounds().y(),
+            minimized_before_shift_bounds.y());
+}
+
 // A unique test class for testing flings in overview as those rely on observing
 // compositor animations which require a mock time task environment.
 class OverviewSessionFlingTest : public AshTestBase {
diff --git a/ash/wm/overview/overview_test_base.cc b/ash/wm/overview/overview_test_base.cc
index 4c94a8a1..9225ff47 100644
--- a/ash/wm/overview/overview_test_base.cc
+++ b/ash/wm/overview/overview_test_base.cc
@@ -49,6 +49,24 @@
   return GetOverviewController()->InOverviewSession();
 }
 
+void OverviewTestBase::DispatchLongPress(OverviewItem* item) {
+  const gfx::Point point =
+      gfx::ToRoundedPoint(item->target_bounds().CenterPoint());
+  ui::GestureEvent long_press(
+      point.x(), point.y(), 0, base::TimeTicks::Now(),
+      ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS));
+  GetEventGenerator()->Dispatch(&long_press);
+}
+
+std::vector<std::unique_ptr<aura::Window>> OverviewTestBase::CreateTestWindows(
+    int n) {
+  std::vector<std::unique_ptr<aura::Window>> windows(n);
+  for (int i = n - 1; i >= 0; --i) {
+    windows[i] = CreateTestWindow();
+  }
+  return windows;
+}
+
 bool OverviewTestBase::WindowsOverlapping(aura::Window* window1,
                                           aura::Window* window2) {
   const gfx::Rect window1_bounds = GetTransformedTargetBounds(window1);
diff --git a/ash/wm/overview/overview_test_base.h b/ash/wm/overview/overview_test_base.h
index f4cc1c40..086a16e1 100644
--- a/ash/wm/overview/overview_test_base.h
+++ b/ash/wm/overview/overview_test_base.h
@@ -46,6 +46,12 @@
 
   bool InOverviewSession();
 
+  void DispatchLongPress(OverviewItem* item);
+
+  // Creates `n` test windows. They are created in reverse order, so that the
+  // first window in the vector is the MRU window.
+  std::vector<std::unique_ptr<aura::Window>> CreateTestWindows(int n);
+
   bool WindowsOverlapping(aura::Window* window1, aura::Window* window2);
 
   // Creates a window which cannot be snapped by splitview.
diff --git a/base/fuchsia/filtered_service_directory.cc b/base/fuchsia/filtered_service_directory.cc
index 8115351..6e0bc77 100644
--- a/base/fuchsia/filtered_service_directory.cc
+++ b/base/fuchsia/filtered_service_directory.cc
@@ -5,6 +5,8 @@
 #include "base/fuchsia/filtered_service_directory.h"
 
 #include <lib/async/default.h>
+#include <lib/vfs/cpp/pseudo_dir.h>
+#include <lib/vfs/cpp/service.h>
 #include <utility>
 
 #include "base/fuchsia/fuchsia_logging.h"
diff --git a/base/tracing/protos/chrome_track_event.proto b/base/tracing/protos/chrome_track_event.proto
index cb4c176..04f0ac5 100644
--- a/base/tracing/protos/chrome_track_event.proto
+++ b/base/tracing/protos/chrome_track_event.proto
@@ -936,6 +936,9 @@
 
     UI_USER_BLOCKING_DEFERRABLE_TQ = 52;
     IO_USER_BLOCKING_DEFERRABLE_TQ = 53;
+
+    UI_BEFORE_UNLOAD_BROWSER_RESPONSE_TQ = 54;
+    IO_BEFORE_UNLOAD_BROWSER_RESPONSE_TQ = 55;
   }
 
   optional Priority priority = 1;
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index 8048fec..771b967 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-13.20230613.2.1
+13.20230613.3.1
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni
index cd429cf..9ab7aaf 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 = "38a8ad0f7ea659edb28a57dfd59a7e5399dabeab"
+  libcxx_revision = "055b2e17ae4f0e2c025ad0c7508b01787df17758"
 }
diff --git a/buildtools/third_party/libc++/BUILD.gn b/buildtools/third_party/libc++/BUILD.gn
index 306b38c..027ed52 100644
--- a/buildtools/third_party/libc++/BUILD.gn
+++ b/buildtools/third_party/libc++/BUILD.gn
@@ -81,6 +81,7 @@
     "trunk/src/condition_variable.cpp",
     "trunk/src/condition_variable_destructor.cpp",
     "trunk/src/exception.cpp",
+    "trunk/src/format.cpp",
     "trunk/src/functional.cpp",
     "trunk/src/future.cpp",
     "trunk/src/hash.cpp",
diff --git a/cc/layers/heads_up_display_layer_impl.cc b/cc/layers/heads_up_display_layer_impl.cc
index c2cf44e..b4c8367 100644
--- a/cc/layers/heads_up_display_layer_impl.cc
+++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -862,15 +862,12 @@
                                                            int width) const {
   std::string status;
   SkColor color = SK_ColorRED;
-  switch (layer_tree_impl()->GetGpuRasterizationStatus()) {
-    case GpuRasterizationStatus::ON:
-      status = "on";
-      color = SK_ColorGREEN;
-      break;
-    case GpuRasterizationStatus::OFF_DEVICE:
-      status = "off";
-      color = SK_ColorRED;
-      break;
+  if (layer_tree_impl()->use_gpu_rasterization()) {
+    status = "on";
+    color = SK_ColorGREEN;
+  } else {
+    status = "off";
+    color = SK_ColorRED;
   }
 
   if (status.empty())
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc
index 0ea2bf4..0a94be3 100644
--- a/cc/layers/picture_layer_impl_unittest.cc
+++ b/cc/layers/picture_layer_impl_unittest.cc
@@ -5494,8 +5494,7 @@
   gfx::Size result;
 
   host_impl()->CommitComplete();
-  EXPECT_EQ(host_impl()->gpu_rasterization_status(),
-            GpuRasterizationStatus::OFF_DEVICE);
+  EXPECT_FALSE(host_impl()->use_gpu_rasterization());
   host_impl()->NotifyReadyToActivate();
 
   // Default tile-size for large layers.
@@ -5525,8 +5524,7 @@
 
   // Gpu-rasterization uses 25% viewport-height tiles.
   // The +2's below are for border texels.
-  EXPECT_EQ(host_impl()->gpu_rasterization_status(),
-            GpuRasterizationStatus::ON);
+  EXPECT_TRUE(host_impl()->use_gpu_rasterization());
   host_impl()->active_tree()->SetDeviceViewportRect(gfx::Rect(2000, 2000));
   host_impl()->NotifyReadyToActivate();
 
@@ -5570,8 +5568,7 @@
   constexpr int kMaxTextureSize = 2048;
   // Gpu-RawDraw-rasterization uses 100%
   // std::max({viewport-width, viewport-height, 2280}) tiles.
-  EXPECT_EQ(host_impl()->gpu_rasterization_status(),
-            GpuRasterizationStatus::ON);
+  EXPECT_TRUE(host_impl()->use_gpu_rasterization());
   gfx::Rect viewport_rect(2000, 2000);
   host_impl()->active_tree()->SetDeviceViewportRect(viewport_rect);
   layer->set_gpu_raster_max_texture_size(viewport_rect.size());
@@ -5609,8 +5606,7 @@
 
   gfx::Size result;
   host_impl()->CommitComplete();
-  EXPECT_EQ(host_impl()->gpu_rasterization_status(),
-            GpuRasterizationStatus::ON);
+  EXPECT_TRUE(host_impl()->use_gpu_rasterization());
   host_impl()->active_tree()->SetDeviceViewportRect(gfx::Rect(2000, 2000));
   host_impl()->NotifyReadyToActivate();
 
diff --git a/cc/paint/decode_stashing_image_provider.h b/cc/paint/decode_stashing_image_provider.h
index a9b8cb28..ceede107 100644
--- a/cc/paint/decode_stashing_image_provider.h
+++ b/cc/paint/decode_stashing_image_provider.h
@@ -6,7 +6,7 @@
 #define CC_PAINT_DECODE_STASHING_IMAGE_PROVIDER_H_
 
 #include "base/containers/stack_container.h"
-#include "base/memory/raw_ptr_exclusion.h"
+#include "base/memory/raw_ptr.h"
 #include "cc/paint/image_provider.h"
 #include "cc/paint/paint_export.h"
 
@@ -33,9 +33,7 @@
   void Reset();
 
  private:
-  // This field is not a raw_ptr<> because it was filtered by the rewriter for:
-  // #union
-  RAW_PTR_EXCLUSION ImageProvider* source_provider_;
+  raw_ptr<ImageProvider> source_provider_;
   base::StackVector<ScopedResult, 1> decoded_images_;
 };
 
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 3eaa993..258a66d 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -1993,12 +1993,7 @@
   }
 
   if (display_list->HasNonAAPaint()) {
-    UMA_HISTOGRAM_BOOLEAN("GPU.SupportsDisableMsaa",
-                          raster_caps().supports_disable_msaa);
-    if (!raster_caps().supports_disable_msaa ||
-        raster_caps().use_dmsaa_for_tiles) {
-      return 0;
-    }
+    return 0;
   }
 
   return RequestedMSAASampleCount();
@@ -2676,11 +2671,7 @@
     TRACE_EVENT0("cc", "DrawLayers.UpdateHudTexture");
     active_tree_->hud_layer()->UpdateHudTexture(
         draw_mode, layer_tree_frame_sink_, &resource_provider_,
-        // The hud uses Gpu rasterization if the device is capable, not related
-        // to the content of the web page.
-        raster_caps().gpu_rasterization_status !=
-            GpuRasterizationStatus::OFF_DEVICE,
-        frame->render_passes);
+        raster_caps().use_gpu_rasterization, frame->render_passes);
   }
 
   viz::CompositorFrameMetadata metadata = MakeCompositorFrameMetadata();
@@ -2907,30 +2898,20 @@
 
     DCHECK(caps.supports_oop_raster);
     gpu_caps.can_use_msaa = !caps.msaa_is_slow && !caps.avoid_stencil_buffers;
-    gpu_caps.supports_disable_msaa = caps.multisample_compatibility;
   }(new_raster_caps);
 
-  if (!new_raster_caps.use_gpu_rasterization) {
-    raster_caps_.gpu_rasterization_status = GpuRasterizationStatus::OFF_DEVICE;
-  } else {
-    raster_caps_.gpu_rasterization_status = GpuRasterizationStatus::ON;
-  }
-
   // Changes in MSAA settings require that we re-raster resources for the
   // settings to take effect. But we don't need to trigger any raster
   // invalidation in this case since these settings change only if the context
   // changed. In this case we already re-allocate and re-raster all resources.
   if (new_raster_caps.use_gpu_rasterization ==
           raster_caps().use_gpu_rasterization &&
-      new_raster_caps.can_use_msaa == raster_caps().can_use_msaa &&
-      new_raster_caps.supports_disable_msaa ==
-          raster_caps().supports_disable_msaa) {
+      new_raster_caps.can_use_msaa == raster_caps().can_use_msaa) {
     return false;
   }
 
   raster_caps_.use_gpu_rasterization = new_raster_caps.use_gpu_rasterization;
   raster_caps_.can_use_msaa = new_raster_caps.can_use_msaa;
-  raster_caps_.supports_disable_msaa = new_raster_caps.supports_disable_msaa;
   return true;
 }
 
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index 27866cc..63418e8 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -602,10 +602,6 @@
     return raster_caps().use_gpu_rasterization;
   }
 
-  GpuRasterizationStatus gpu_rasterization_status() const {
-    return raster_caps().gpu_rasterization_status;
-  }
-
   bool create_low_res_tiling() const {
     return settings_.create_low_res_tiling &&
            !raster_caps().use_gpu_rasterization;
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index 80eca8f3..59bf0ca 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -16068,23 +16068,6 @@
   EXPECT_FALSE(host_impl_->can_use_msaa());
 }
 
-class MsaaCompatibilityLayerTreeHostImplTest : public LayerTreeHostImplTest {
- public:
-  void CreateHostImplWithMultisampleCompatibility(
-      bool support_multisample_compatibility) {
-    LayerTreeSettings settings = DefaultSettings();
-    settings.gpu_rasterization_msaa_sample_count = 4;
-    auto frame_sink =
-        FakeLayerTreeFrameSink::Builder()
-            .AllContexts(
-                &viz::TestRasterInterface::set_multisample_compatibility,
-                support_multisample_compatibility)
-            .AllContexts(&viz::TestRasterInterface::set_gpu_rasterization, true)
-            .Build();
-    EXPECT_TRUE(CreateHostImpl(settings, std::move(frame_sink)));
-  }
-};
-
 TEST_P(ScrollUnifiedLayerTreeHostImplTest, UpdatePageScaleFactorOnActiveTree) {
   // Check page scale factor updates the property trees when an update is made
   // on the active tree.
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index bfe2e6b..bfc2cb6d 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -6786,10 +6786,8 @@
       viz::TestContextProvider* worker_provider) override {
     auto* compositor = context_provider->UnboundTestRasterInterface();
     compositor->set_gpu_rasterization(true);
-    compositor->set_multisample_compatibility(false);
     auto* worker = worker_provider->UnboundTestRasterInterface();
     worker->set_gpu_rasterization(true);
-    worker->set_multisample_compatibility(false);
   }
 
   void InitializeSettings(LayerTreeSettings* settings) override {
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index bc56a0eb..44984b4c0 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -1971,10 +1971,6 @@
   return host_impl_->use_gpu_rasterization();
 }
 
-GpuRasterizationStatus LayerTreeImpl::GetGpuRasterizationStatus() const {
-  return host_impl_->gpu_rasterization_status();
-}
-
 bool LayerTreeImpl::create_low_res_tiling() const {
   return host_impl_->create_low_res_tiling();
 }
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h
index 390ef76..7a652c1 100644
--- a/cc/trees/layer_tree_impl.h
+++ b/cc/trees/layer_tree_impl.h
@@ -153,7 +153,6 @@
                                      float initial_opacity);
   void DidAnimateScrollOffset();
   bool use_gpu_rasterization() const;
-  GpuRasterizationStatus GetGpuRasterizationStatus() const;
   bool create_low_res_tiling() const;
   bool RequiresHighResToDraw() const;
   bool SmoothnessTakesPriority() const;
diff --git a/cc/trees/raster_capabilities.h b/cc/trees/raster_capabilities.h
index 92c6a2d..3815d8f0 100644
--- a/cc/trees/raster_capabilities.h
+++ b/cc/trees/raster_capabilities.h
@@ -9,28 +9,21 @@
 
 namespace cc {
 
-enum class GpuRasterizationStatus {
-  ON,
-  OFF_DEVICE,
-};
-
 struct CC_EXPORT RasterCapabilities {
   RasterCapabilities() = default;
   RasterCapabilities(const RasterCapabilities& other) = delete;
   RasterCapabilities& operator=(const RasterCapabilities& other) = delete;
   ~RasterCapabilities() = default;
 
-  bool can_use_msaa = false;
-  bool supports_disable_msaa = false;
-
   bool need_update_gpu_rasterization_status = false;
   bool use_gpu_rasterization = false;
-  GpuRasterizationStatus gpu_rasterization_status =
-      GpuRasterizationStatus::OFF_DEVICE;
+
+  bool can_use_msaa = false;
+  bool use_dmsaa_for_tiles = false;
+
   // The maximum size (either width or height) that any texture can be. Also
   // holds a reasonable value for software compositing bitmaps.
   int max_texture_size = 0;
-  bool use_dmsaa_for_tiles = false;
 };
 }  // namespace cc
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
index 1e7d176..60fd1ec 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
@@ -1116,10 +1116,9 @@
     // ImprovedBookmarkRow methods.
 
     private void resolveIconForBookmark(BookmarkItem item, PropertyModel model) {
-        @BookmarkRowDisplayPref
-        int displayPref = mBookmarkUiPrefs.getBookmarkRowDisplayPref();
-        boolean useImages = BookmarkFeatures.isAndroidImprovedBookmarksEnabled()
-                && displayPref == BookmarkRowDisplayPref.VISUAL;
+        final @BookmarkRowDisplayPref int displayPref =
+                mBookmarkUiPrefs.getBookmarkRowDisplayPref();
+        boolean useImages = displayPref == BookmarkRowDisplayPref.VISUAL;
         model.set(ImprovedBookmarkRowProperties.START_IMAGE_VISIBILITY,
                 item.isFolder() && useImages ? StartImageVisibility.FOLDER_DRAWABLE
                                              : StartImageVisibility.DRAWABLE);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/survey/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/survey/OWNERS
index fc1ef52..aa90d3a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/survey/OWNERS
+++ b/chrome/android/java/src/org/chromium/chrome/browser/survey/OWNERS
@@ -1 +1,4 @@
-file://chrome/browser/android/survey/OWNERS
+wenyufu@chromium.org
+
+#Backup
+twellington@chromium.org
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/survey/SurveyController.java b/chrome/android/java/src/org/chromium/chrome/browser/survey/SurveyController.java
index c310729..0a45757 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/survey/SurveyController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/survey/SurveyController.java
@@ -32,7 +32,7 @@
     }
 
     @VisibleForTesting
-    static void setInstanceForTesting(SurveyController testInstance) {
+    public static void setInstanceForTesting(SurveyController testInstance) {
         sInstance = testInstance;
     }
 
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 4426220..95b14cba 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/NavigateTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/NavigateTest.java
@@ -57,11 +57,9 @@
 import org.chromium.chrome.test.util.ChromeTabUtils;
 import org.chromium.chrome.test.util.OmniboxTestUtils;
 import org.chromium.chrome.test.util.browser.Features;
-import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.TabLoadObserver;
 import org.chromium.components.browser_ui.widget.gesture.BackPressHandler;
 import org.chromium.components.embedder_support.util.UrlConstants;
-import org.chromium.content_public.browser.ContentFeatureList;
 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;
@@ -249,39 +247,6 @@
     }
 
     /**
-     * Test 'Request Desktop Site' option is preserved after navigation to a new entry
-     * through a click on a link.
-     */
-    @Test
-    @MediumTest
-    @Feature({"Navigation"})
-    @DisableFeatures(ContentFeatureList.REQUEST_DESKTOP_SITE_EXCEPTIONS)
-    public void testRequestDesktopSiteSettingPers() throws Exception {
-        String url1 = mTestServer.getURL("/chrome/test/data/android/google.html");
-        String url2 = mTestServer.getURL("/chrome/test/data/android/about.html");
-
-        navigateAndObserve(url1);
-        mActivityTestRule.assertWaitForPageScaleFactorMatch(0.5f);
-
-        final Tab tab = mActivityTestRule.getActivity().getActivityTab();
-        TestThreadUtils.runOnUiThreadBlocking(
-                ()
-                        -> TabUtils.switchUserAgent(tab, /* switchToDesktop */ true,
-                                /* forcedByUser */ true, UseDesktopUserAgentCaller.OTHER));
-        ChromeTabUtils.waitForTabPageLoaded(tab, url1);
-        mActivityTestRule.assertWaitForPageScaleFactorChange(0.5f);
-
-        DOMUtils.clickNode(tab.getWebContents(), "aboutLink");
-        ChromeTabUtils.waitForTabPageLoaded(tab, url2);
-        Assert.assertEquals("Request Desktop site setting should stay turned on", true,
-                mActivityTestRule.getActivity()
-                        .getActivityTab()
-                        .getWebContents()
-                        .getNavigationController()
-                        .getUseDesktopUserAgent());
-    }
-
-    /**
      * Test 'Request Desktop Site' option properly affects UA client hints
      */
     @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/PopupTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/PopupTest.java
index 0217790c..113150c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/PopupTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/PopupTest.java
@@ -20,7 +20,6 @@
 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.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
@@ -148,7 +147,6 @@
     @Test
     @MediumTest
     @Feature({"Popup"})
-    @DisabledTest(message = "https://crbug.com/1262445")
     public void testPopupWindowsAppearWhenAllowed() {
         final TabModelSelector selector = mActivityTestRule.getActivity().getTabModelSelector();
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
index 65bfac10..57ef28d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabActivityTest.java
@@ -1181,7 +1181,6 @@
     /** Same as above, but the hidden tab matching should not ignore the fragment. */
     @Test
     @SmallTest
-    @DisabledTest(message = "https://crbug.com/1237331")
     @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE)
     public void testHiddenTabAndChangingFragmentDontIgnoreFragments() throws Exception {
         startHiddenTabAndChangeFragment(false, true);
@@ -1690,7 +1689,6 @@
 
     @Test
     @SmallTest
-    @DisabledTest(message = "https://crbug.com/1148544")
     public void closeButton_closesActivityIfNoLandingPage() throws TimeoutException {
         Context context = InstrumentationRegistry.getInstrumentation()
                 .getTargetContext()
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java
index 91ed344..c87e648 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java
@@ -15,7 +15,6 @@
 
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.customtabs.CustomTabsIntentTestUtils;
@@ -63,7 +62,6 @@
      */
     @Test
     @MediumTest
-    @DisabledTest(message = "crbug.com/1269017")
     public void testObserveActiveTab() throws Throwable {
         EmbeddedTestServer testServer = mCustomTabActivityTestRule.getTestServer();
         final String windowOpenUrl =
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java
index b4f6fbc..4bde328 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadTest.java
@@ -27,7 +27,6 @@
 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.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.download.DownloadTestRule.CustomMainActivityStart;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerIntegrationTest.java
index dd48e375..cf90142 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerIntegrationTest.java
@@ -20,7 +20,6 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.CriteriaHelper;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
@@ -103,10 +102,9 @@
         ChromeSurveyController.resetMessageShownForTesting();
     }
 
-    @DisabledTest(message = "https:://crbug.com/1447519")
     @Test
     @MediumTest
-    public void testMessagePrimaryButtonClicked() throws TimeoutException, ExecutionException {
+    public void testMessagePrimaryButtonClicked() {
         PropertyModel message = getSurveyMessage();
         Assert.assertNotNull("Message should not be null.", message);
 
@@ -121,20 +119,18 @@
                 mTestSurveyController.showSurveyCallbackHelper.getCallCount());
     }
 
-    @DisabledTest(message = "https:://crbug.com/1447519")
     @Test
     @MediumTest
-    public void testMessageDismissed() throws TimeoutException, ExecutionException {
+    public void testMessageDismissed() {
         PropertyModel message = getSurveyMessage();
         Assert.assertNotNull("Message should not be null.", message);
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> mMessageDispatcher.dismissMessage(message, DismissReason.GESTURE));
     }
 
-    @DisabledTest(message = "https:://crbug.com/1447519")
     @Test
     @MediumTest
-    public void testNoMessageInNewTab() throws InterruptedException, ExecutionException {
+    public void testNoMessageInNewTab() throws InterruptedException {
         // Simulate message visibility for the auto-dismiss duration length of time.
         waitUntilSurveyPromptStateRecorded(MESSAGE_AUTO_DISMISS_DURATION_MS);
 
@@ -149,6 +145,10 @@
         Tab tab = mActivityTestRule.getActivity().getActivityTab();
         waitUntilTabIsReady(tab);
         mTestSurveyController.downloadCallbackHelper.waitForFirst();
+        // After getting the survey response, it might take momentarily longer for the message to be
+        // shown. Wait until the message is shown before proceeding.
+        CriteriaHelper.pollUiThread(
+                () -> getSurveyMessage() != null, "Survey message should be shown.");
         Assert.assertNotNull("Tab should have a message.", getSurveyMessage());
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarControllerTest.java
index 5425f1d..b38f0a0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarControllerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarControllerTest.java
@@ -16,7 +16,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DisableIf;
+import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tabmodel.TabModel;
@@ -30,7 +30,7 @@
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
-import org.chromium.ui.test.util.UiDisableIf;
+import org.chromium.ui.test.util.UiRestriction;
 
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
@@ -172,7 +172,7 @@
 
     @Test
     @SmallTest
-    @DisableIf.Device(type = {UiDisableIf.TABLET}) // crbug/1199248
+    @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
     @Features.EnableFeatures({ChromeFeatureList.START_SURFACE_WITH_ACCESSIBILITY})
     // clang-format off
     @CommandLineFlags.Add({
@@ -183,7 +183,6 @@
     // clang-format on
     public void
     testUndoSnackbarEnabled_AccessibilityEnabledWithGroupM5() throws Exception {
-        // clang-format on
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> ChromeAccessibilityUtil.get().setAccessibilityEnabledForTesting(true));
 
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 3adb8f3..ab50f05 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -1631,7 +1631,7 @@
           Sear&amp;ch this Page with Google...
         </message>
         <message name="IDS_SHOW_TRANSLATE" desc="In Title Case: The text label of the Translate menu item">
-          T&amp;ranslate
+          T&amp;ranslate...
         </message>
         <message name="IDS_SETTINGS" desc="In Title Case: The text label of the Settings menu item">
           &amp;Settings
@@ -5329,9 +5329,6 @@
         <message name="IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON" desc="The text of the request acces button that appears on the toolbar when an extension requests access to the site">
           Allow <ph name="EXTENSIONS_REQUESTING_ACCESS_COUNT">$1<ex>3</ex></ph>?
         </message>
-        <message name="IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT" desc="The text of the button that appears on the toolbar after the user grants access to an extension that requested access to the current site.">
-          Allowed
-        </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">
           Click to allow "<ph name="EXTENSIONS_REQUESTING_ACCESS">$1<ex>Extension A</ex></ph>" on <ph name="ORIGIN">$2<ex>google.com</ex></ph>
         </message>
@@ -14129,7 +14126,7 @@
       <message name="IDS_WEBAUTHN_CABLEV2_CONNECTING_TITLE" desc="The title of a dialog that is shown when the computer is connecting to a phone or tablet.">
         Connecting to your device
       </message>
-      <message name="IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION" desc="The second line of a dialog that shows once the computer has successfully connected to the user's phone or tablet. That phone/tablet will be showing instructions for what to do next and the user should follow those instuctions.">
+      <message name="IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION" desc="The title of a dialog that shows once the computer has successfully connected to the user's phone or tablet. That phone/tablet will be showing instructions for what to do next and the user should follow those instuctions.">
         Follow the steps on your device
       </message>
       <message name="IDS_WEBAUTHN_CABLEV2_ERROR_DESCRIPTION" desc="The second line of a dialog that shows once the computer fails to connect to the user's phone or tablet.">
@@ -14919,14 +14916,11 @@
     <message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_TITLE" desc="Header for mismatch dialog which is shown to the user when their sign in status is signed in but they are not signed in to any account." translateable="false">
       Failed signing in to <ph name="SITE_ETLD_PLUS_ONE">$1<ex>rp.example</ex></ph> with <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">$2<ex>idp.example</ex></ph>
     </message>
-    <message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_CONTINUE" desc="Title of the button that allows the user to continue with signing in to an account from an identity provider." translateable="false">
+    <message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_CONTINUE" desc="Title of the button that allows the user to continue with signing in to an account from an identity provider.">
       Continue
     </message>
-    <message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY" desc="Body for mismatch dialog which is shown to prompt the user to sign in to a website using an account from an identity provider." translateable="false">
-      Use your <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">$1<ex>idp.example</ex></ph> account to sign in to <ph name="SITE_ETLD_PLUS_ONE">$2<ex>rp.example</ex></ph>
-    </message>
-    <message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_DESCRIPTION" desc="Describes the sign in process." translateable="false">
-      Signing in is fast, simple and secure.
+    <message name="IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY" desc="Body for mismatch dialog which is shown to prompt the user to sign in to a website using an account from an identity provider.">
+      You can use your <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">$1<ex>idp.example</ex></ph> account on this site. To continue, sign in to <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE">$1<ex>idp.example</ex></ph>.
     </message>
     <message name="IDS_MULTI_IDP_ACCOUNT_SELECTION_SHEET_TITLE_EXPLICIT" desc="Header for sign in sheet when there are multiple identity providers. Sheet is shown to prompt user for sign in consent." translateable="false">
       Sign in to <ph name="SITE_ETLD_PLUS_ONE">$1<ex>rp.example</ex></ph>
diff --git a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT.png.sha1 b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT.png.sha1
deleted file mode 100644
index e6673a0..0000000
--- a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-56674d659ebb0147c25aab1bbf395f39a35f0de6
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY.png.sha1 b/chrome/app/generated_resources_grd/IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY.png.sha1
new file mode 100644
index 0000000..f07c644
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY.png.sha1
@@ -0,0 +1 @@
+32d89cb58c73d012381ec33e99aa207fa1d6d967
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_CONTINUE.png.sha1 b/chrome/app/generated_resources_grd/IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_CONTINUE.png.sha1
new file mode 100644
index 0000000..f07c644
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_CONTINUE.png.sha1
@@ -0,0 +1 @@
+32d89cb58c73d012381ec33e99aa207fa1d6d967
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION.png.sha1
index 25c9faa0..902fa96 100644
--- a/chrome/app/generated_resources_grd/IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION.png.sha1
+++ b/chrome/app/generated_resources_grd/IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION.png.sha1
@@ -1 +1 @@
-4efee63dc4f1982ba125f9fd7cce0f5b47d67dbe
\ No newline at end of file
+a369e1093b34d2b0bb9cb5b6247283cb70daa409
\ No newline at end of file
diff --git a/chrome/app/vector_icons/BUILD.gn b/chrome/app/vector_icons/BUILD.gn
index 919626372..13d97ca2 100644
--- a/chrome/app/vector_icons/BUILD.gn
+++ b/chrome/app/vector_icons/BUILD.gn
@@ -136,6 +136,7 @@
     "notes.icon",
     "open_in_new.icon",
     "open_in_new_chrome_refresh.icon",
+    "open_in_new_off_chrome_refresh.icon",
     "overflow_chevron.icon",
     "paintbrush.icon",
     "palette.icon",
diff --git a/chrome/app/vector_icons/open_in_new_off_chrome_refresh.icon b/chrome/app/vector_icons/open_in_new_off_chrome_refresh.icon
new file mode 100644
index 0000000..e6be88d
--- /dev/null
+++ b/chrome/app/vector_icons/open_in_new_off_chrome_refresh.icon
@@ -0,0 +1,45 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 20,
+R_MOVE_TO, 16.19f, 18.34f,
+R_LINE_TO, -1.17f, -1.17f,
+R_CUBIC_TO, -0.02f, 0, -0.03f, 0, -0.04f, 0,
+H_LINE_TO, 4.56f,
+R_CUBIC_TO, -0.48f, 0, -0.89f, -0.17f, -1.22f, -0.5f,
+R_ARC_TO, 1.67f, 1.67f, 0, 0, 1, -0.5f, -1.22f,
+V_LINE_TO, 5.02f,
+R_CUBIC_TO, 0, -0.01f, 0, -0.02f, 0, -0.04f,
+LINE_TO, 1.66f, 3.81f,
+R_LINE_TO, 1.11f, -1.11f,
+R_LINE_TO, 14.52f, 14.52f,
+CLOSE,
+MOVE_TO, 4.56f, 15.44f,
+R_H_LINE_TO, 8.73f,
+R_LINE_TO, -3.75f, -3.77f,
+LINE_TO, 8.22f, 13,
+LINE_TO, 7, 11.78f,
+R_LINE_TO, 1.33f, -1.32f,
+R_LINE_TO, -3.77f, -3.75f,
+CLOSE,
+MOVE_TO, 6.86f, 4.56f,
+LINE_TO, 5.14f, 2.83f,
+H_LINE_TO, 10,
+R_V_LINE_TO, 1.73f,
+CLOSE,
+R_MOVE_TO, 4.88f, 4.91f,
+R_LINE_TO, -1.22f, -1.22f,
+R_LINE_TO, 3.69f, -3.69f,
+H_LINE_TO, 12,
+V_LINE_TO, 2.83f,
+R_H_LINE_TO, 5.17f,
+V_LINE_TO, 8,
+R_H_LINE_TO, -1.73f,
+V_LINE_TO, 5.78f,
+CLOSE,
+R_MOVE_TO, 5.42f, 5.39f,
+R_LINE_TO, -1.73f, -1.73f,
+V_LINE_TO, 10,
+R_H_LINE_TO, 1.73f,
+CLOSE
\ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index d96f137..8272774 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -7930,16 +7930,6 @@
     "grit/dev_ui_browser_resources.h",
     "dev_ui_browser_resources.pak",
   ]
-
-  deps = []
-
-  if (is_android || is_linux || is_chromeos || is_win) {
-    deps += [ "//chrome/browser/resources/sandbox_internals:build_ts" ]
-  }
-
-  if (is_android) {
-    deps += [ "//chrome/browser/resources/internals/query_tiles:build_ts" ]
-  }
 }
 
 action("expired_flags_list_gen") {
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index d331991..8cf5a7d 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -5769,6 +5769,11 @@
     {"android-app-inintegration", flag_descriptions::kAndroidAppIntegrationName,
      flag_descriptions::kAndroidAppIntegrationDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(chrome::android::kAndroidAppIntegration)},
+
+    {"android-app-inintegration-safesearch",
+     flag_descriptions::kAndroidAppIntegrationSafeSearchName,
+     flag_descriptions::kAndroidAppIntegrationSafeSearchDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(chrome::android::kAndroidAppIntegrationSafeSearch)},
 #endif  // BUILDFLAG(IS_ANDROID)
 
     {"omnibox-local-history-zero-suggest-beyond-ntp",
@@ -6362,6 +6367,12 @@
      commerce::flag_descriptions::kShoppingListDescription,
      kOsAndroid | kOsDesktop, FEATURE_VALUE_TYPE(commerce::kShoppingList)},
 
+    {"shopping-list-track-by-default",
+     commerce::flag_descriptions::kShoppingListTrackByDefaultName,
+     commerce::flag_descriptions::kShoppingListTrackByDefaultDescription,
+     kOsAndroid | kOsDesktop,
+     FEATURE_VALUE_TYPE(commerce::kShoppingListTrackByDefault)},
+
     {"local-pdp-detection",
      commerce::flag_descriptions::kCommerceLocalPDPDetectionName,
      commerce::flag_descriptions::kCommerceLocalPDPDetectionDescription,
diff --git a/chrome/browser/android/compositor/layer/tab_handle_layer.cc b/chrome/browser/android/compositor/layer/tab_handle_layer.cc
index 997b90f3..fc26bc6 100644
--- a/chrome/browser/android/compositor/layer/tab_handle_layer.cc
+++ b/chrome/browser/android/compositor/layer/tab_handle_layer.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/android/compositor/layer/tab_handle_layer.h"
 
+#include <math.h>
+
 #include <vector>
 
 #include "base/feature_list.h"
@@ -109,6 +111,7 @@
     height = margin_height;
   }
   height -= top_margin;
+  height = ceil(height);
   gfx::Size tab_bounds(width, height - bottom_margin);
 
   layer_->SetPosition(gfx::PointF(x, y));
diff --git a/chrome/browser/android/metrics/BUILD.gn b/chrome/browser/android/metrics/BUILD.gn
index 8452afdd..5a4a725 100644
--- a/chrome/browser/android/metrics/BUILD.gn
+++ b/chrome/browser/android/metrics/BUILD.gn
@@ -10,6 +10,7 @@
   _test_jni_sources = [ "javatests/src/org/chromium/chrome/browser/metrics/util/UkmUtilsForTest.java" ]
 
   android_library("java") {
+    srcjar_deps = [ ":jni_headers" ]
     sources = [
       "java/src/org/chromium/chrome/browser/metrics/AndroidSessionDurationsServiceState.java",
       "java/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetrics.java",
@@ -27,7 +28,6 @@
       "//content/public/android:content_java",
       "//third_party/androidx:androidx_annotation_annotation_java",
     ]
-    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   }
 
   static_library("ukm_utils_for_test") {
@@ -53,9 +53,9 @@
 
   android_library("ukm_java_test_support") {
     testonly = true
+    srcjar_deps = [ ":test_jni_headers" ]
     sources = _test_jni_sources
     deps = [ "//base:jni_java" ]
-    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   }
 
   android_library("ukm_javatests") {
diff --git a/chrome/browser/apps/app_service/metrics/app_discovery_metrics.cc b/chrome/browser/apps/app_service/metrics/app_discovery_metrics.cc
index 68e8015..758d8ba 100644
--- a/chrome/browser/apps/app_service/metrics/app_discovery_metrics.cc
+++ b/chrome/browser/apps/app_service/metrics/app_discovery_metrics.cc
@@ -26,7 +26,7 @@
     : profile_(profile), app_platform_metrics_(app_platform_metrics) {
   DCHECK(app_platform_metrics);
 
-  apps::InstanceRegistry::Observer::Observe(&instance_registry);
+  instance_registry_observation_.Observe(&instance_registry);
   app_platform_metrics_->AddObserver(this);
 }
 
@@ -134,7 +134,7 @@
 
 void AppDiscoveryMetrics::OnInstanceRegistryWillBeDestroyed(
     InstanceRegistry* cache) {
-  apps::InstanceRegistry::Observer::Observe(nullptr);
+  instance_registry_observation_.Reset();
 }
 
 bool AppDiscoveryMetrics::IsAppSyncEnabled() {
diff --git a/chrome/browser/apps/app_service/metrics/app_discovery_metrics.h b/chrome/browser/apps/app_service/metrics/app_discovery_metrics.h
index 53247ef..6fdc922 100644
--- a/chrome/browser/apps/app_service/metrics/app_discovery_metrics.h
+++ b/chrome/browser/apps/app_service/metrics/app_discovery_metrics.h
@@ -9,6 +9,7 @@
 #include <set>
 
 #include "base/memory/raw_ptr.h"
+#include "base/scoped_observation.h"
 #include "base/unguessable_token.h"
 #include "chrome/browser/apps/app_service/metrics/app_platform_metrics.h"
 #include "chrome/browser/profiles/profile.h"
@@ -106,6 +107,9 @@
   // Map associating app_ids to instance_ids.
   std::map<std::string, std::set<base::UnguessableToken>>
       app_id_to_instance_ids_;
+
+  base::ScopedObservation<InstanceRegistry, InstanceRegistry::Observer>
+      instance_registry_observation_{this};
 };
 
 }  // namespace apps
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.cc b/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.cc
index 9c994b31..2bbbe32 100644
--- a/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.cc
+++ b/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.cc
@@ -140,7 +140,7 @@
     Profile* profile,
     InstanceRegistry& instance_registry)
     : profile_(profile) {
-  InstanceRegistry::Observer::Observe(&instance_registry);
+  instance_registry_observation_.Observe(&instance_registry);
   if (ash::Shell::HasInstance()) {
     ash::Shell::Get()->AddPreTargetHandler(this);
   }
@@ -229,7 +229,7 @@
 
 void AppPlatformInputMetrics::OnInstanceRegistryWillBeDestroyed(
     InstanceRegistry* cache) {
-  InstanceRegistry::Observer::Observe(nullptr);
+  instance_registry_observation_.Reset();
 }
 
 void AppPlatformInputMetrics::SetAppInfoForActivatedWindow(
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.h b/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.h
index 6351d9c..d6a6dd28 100644
--- a/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.h
+++ b/chrome/browser/apps/app_service/metrics/app_platform_input_metrics.h
@@ -9,6 +9,7 @@
 
 #include "base/containers/flat_map.h"
 #include "base/memory/raw_ptr.h"
+#include "base/scoped_observation.h"
 #include "chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.h"
 #include "chrome/browser/apps/app_service/metrics/browser_to_tab_list.h"
 #include "chrome/browser/profiles/profile.h"
@@ -134,6 +135,9 @@
   // },
   std::map<std::string, EventSourceToCounts>
       app_id_to_event_count_per_two_hours_;
+
+  base::ScopedObservation<InstanceRegistry, InstanceRegistry::Observer>
+      instance_registry_observation_{this};
 };
 
 }  // namespace apps
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc b/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc
index 61854cf..db2c4dd4 100644
--- a/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc
+++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics.cc
@@ -451,7 +451,7 @@
     InstanceRegistry& instance_registry)
     : profile_(profile), app_registry_cache_(app_registry_cache) {
   apps::AppRegistryCache::Observer::Observe(&app_registry_cache);
-  apps::InstanceRegistry::Observer::Observe(&instance_registry);
+  instance_registry_observation_.Observe(&instance_registry);
   user_type_by_device_type_ = GetUserTypeByDeviceTypeMetrics();
   InitRunningDuration();
   LoadAppsUsageTimeUkmFromPref();
@@ -873,7 +873,7 @@
 
 void AppPlatformMetrics::OnInstanceRegistryWillBeDestroyed(
     apps::InstanceRegistry* cache) {
-  apps::InstanceRegistry::Observer::Observe(nullptr);
+  instance_registry_observation_.Reset();
 }
 
 void AppPlatformMetrics::GetBrowserInstanceInfo(
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics.h b/chrome/browser/apps/app_service/metrics/app_platform_metrics.h
index 41880cc..a5126f2 100644
--- a/chrome/browser/apps/app_service/metrics/app_platform_metrics.h
+++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics.h
@@ -13,6 +13,7 @@
 #include "base/memory/raw_ref.h"
 #include "base/observer_list.h"
 #include "base/observer_list_types.h"
+#include "base/scoped_observation.h"
 #include "base/strings/string_piece_forward.h"
 #include "base/time/time.h"
 #include "base/unguessable_token.h"
@@ -358,6 +359,9 @@
   std::vector<std::unique_ptr<UsageTime>> usage_times_from_pref_;
 
   base::ObserverList<Observer> observers_;
+
+  base::ScopedObservation<InstanceRegistry, InstanceRegistry::Observer>
+      instance_registry_observation_{this};
 };
 
 }  // namespace apps
diff --git a/chrome/browser/apps/app_service/publishers/web_apps_crosapi_browsertest.cc b/chrome/browser/apps/app_service/publishers/web_apps_crosapi_browsertest.cc
index f20652b..710ef64 100644
--- a/chrome/browser/apps/app_service/publishers/web_apps_crosapi_browsertest.cc
+++ b/chrome/browser/apps/app_service/publishers/web_apps_crosapi_browsertest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/scoped_observation.h"
 #include "chrome/browser/apps/app_service/publishers/web_apps_crosapi.h"
 
 #include "ash/public/cpp/shelf_item_delegate.h"
@@ -19,6 +20,7 @@
 #include "chrome/browser/web_applications/web_app_id.h"
 #include "chromeos/crosapi/mojom/test_controller.mojom-test-utils.h"
 #include "components/services/app_service/public/cpp/app_launch_util.h"
+#include "components/services/app_service/public/cpp/instance_registry.h"
 #include "content/public/test/browser_test.h"
 #include "ui/base/models/simple_menu_model.h"
 
@@ -31,9 +33,9 @@
                     apps::InstanceState state =
                         apps::InstanceState(apps::kVisible | apps::kActive |
                                             apps::kRunning | apps::kStarted))
-      : apps::InstanceRegistry::Observer(&instance_registry),
-        app_id_(app_id),
-        state_(state) {}
+      : app_id_(app_id), state_(state) {
+    observation_.Observe(&instance_registry);
+  }
   ~AppInstanceWaiter() override = default;
 
   void Await() { run_loop_.Run(); }
@@ -52,6 +54,9 @@
   const std::string app_id_;
   const apps::InstanceState state_;
   base::RunLoop run_loop_;
+  base::ScopedObservation<apps::InstanceRegistry,
+                          apps::InstanceRegistry::Observer>
+      observation_{this};
 };
 
 std::vector<std::string> GetContextMenuForApp(const std::string& app_id) {
diff --git a/chrome/browser/ash/browser_context_keyed_service_factories.cc b/chrome/browser/ash/browser_context_keyed_service_factories.cc
index c11ff2fd..895b58c1 100644
--- a/chrome/browser/ash/browser_context_keyed_service_factories.cc
+++ b/chrome/browser/ash/browser_context_keyed_service_factories.cc
@@ -38,6 +38,7 @@
 #include "chrome/browser/ash/crostini/crostini_metrics_service.h"
 #include "chrome/browser/ash/crostini/crostini_package_service.h"
 #include "chrome/browser/ash/crostini/crostini_port_forwarder.h"
+#include "chrome/browser/ash/crostini/crostini_shared_devices.h"
 #include "chrome/browser/ash/crostini/crostini_upgrader.h"
 #include "chrome/browser/ash/crostini/throttle/crostini_throttle.h"
 #include "chrome/browser/ash/eche_app/eche_app_manager_factory.h"
@@ -176,6 +177,7 @@
   crostini::CrostiniMetricsService::Factory::GetInstance();
   crostini::CrostiniPackageService::EnsureFactoryBuilt();
   crostini::CrostiniPortForwarder::EnsureFactoryBuilt();
+  crostini::CrostiniSharedDevices::EnsureFactoryBuilt();
   crostini::CrostiniThrottle::EnsureFactoryBuilt();
   crostini::CrostiniUpgrader::EnsureFactoryBuilt();
 #if BUILDFLAG(USE_CUPS)
diff --git a/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.cc b/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.cc
index 36bfbcf..a30632b 100644
--- a/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.cc
+++ b/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.cc
@@ -72,7 +72,7 @@
 
 AppServiceWrapper::AppServiceWrapper(Profile* profile) : profile_(profile) {
   apps::AppRegistryCache::Observer::Observe(&GetAppCache());
-  apps::InstanceRegistry::Observer::Observe(&GetInstanceRegistry());
+  instance_registry_observation_.Observe(&GetInstanceRegistry());
 }
 
 AppServiceWrapper::~AppServiceWrapper() = default;
@@ -294,7 +294,7 @@
 
 void AppServiceWrapper::OnInstanceRegistryWillBeDestroyed(
     apps::InstanceRegistry* cache) {
-  apps::InstanceRegistry::Observer::Observe(nullptr);
+  instance_registry_observation_.Reset();
 }
 
 apps::AppServiceProxy* AppServiceWrapper::GetAppProxy() const {
diff --git a/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.h b/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.h
index 1a3398a76..12bb12ab 100644
--- a/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.h
+++ b/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper.h
@@ -12,6 +12,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/observer_list.h"
 #include "base/observer_list_types.h"
+#include "base/scoped_observation.h"
 #include "base/time/time.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_forward.h"
 #include "components/services/app_service/public/cpp/app_registry_cache.h"
@@ -169,6 +170,10 @@
 
   base::ObserverList<EventListener> listeners_;
 
+  base::ScopedObservation<apps::InstanceRegistry,
+                          apps::InstanceRegistry::Observer>
+      instance_registry_observation_{this};
+
   const raw_ptr<Profile, ExperimentalAsh> profile_;
 };
 
diff --git a/chrome/browser/ash/crosapi/files_app_launcher.cc b/chrome/browser/ash/crosapi/files_app_launcher.cc
index 2679c90..783d61f5 100644
--- a/chrome/browser/ash/crosapi/files_app_launcher.cc
+++ b/chrome/browser/ash/crosapi/files_app_launcher.cc
@@ -49,8 +49,7 @@
 
 void FilesAppLauncher::LaunchInternal() {
   // Start observing the launching.
-  auto& instance_registry = proxy_->InstanceRegistry();
-  apps::InstanceRegistry::Observer::Observe(&instance_registry);
+  instance_registry_observation_.Observe(&proxy_->InstanceRegistry());
 
   // Launching traditional files.app and launching SWA files.app need quite
   // different procedure.
@@ -83,13 +82,13 @@
 
   // So launching is progressed. Stop observing and run the callback
   // to notify the caller of Launch().
-  apps::InstanceRegistry::Observer::Observe(nullptr);
+  instance_registry_observation_.Reset();
   std::move(callback_).Run();
 }
 
 void FilesAppLauncher::OnInstanceRegistryWillBeDestroyed(
     apps::InstanceRegistry* cache) {
-  apps::InstanceRegistry::Observer::Observe(nullptr);
+  instance_registry_observation_.Reset();
 }
 
 }  // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/files_app_launcher.h b/chrome/browser/ash/crosapi/files_app_launcher.h
index dd64e2e0..7d7cfc6bd 100644
--- a/chrome/browser/ash/crosapi/files_app_launcher.h
+++ b/chrome/browser/ash/crosapi/files_app_launcher.h
@@ -8,6 +8,7 @@
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
+#include "base/scoped_observation.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_forward.h"
 #include "components/services/app_service/public/cpp/app_registry_cache.h"
 #include "components/services/app_service/public/cpp/instance_registry.h"
@@ -48,6 +49,10 @@
 
   base::OnceClosure callback_;
 
+  base::ScopedObservation<apps::InstanceRegistry,
+                          apps::InstanceRegistry::Observer>
+      instance_registry_observation_{this};
+
   base::WeakPtrFactory<FilesAppLauncher> weak_factory_{this};
 };
 
diff --git a/chrome/browser/ash/crostini/crostini_shared_devices.cc b/chrome/browser/ash/crostini/crostini_shared_devices.cc
index f41be93..ebce9e5 100644
--- a/chrome/browser/ash/crostini/crostini_shared_devices.cc
+++ b/chrome/browser/ash/crostini/crostini_shared_devices.cc
@@ -107,6 +107,10 @@
   }
 }
 
+void CrostiniSharedDevices::EnsureFactoryBuilt() {
+  CrostiniSharedDevicesFactory::GetInstance();
+}
+
 void CrostiniSharedDevices::ApplySharingState(
     const guest_os::GuestId container_id,
     base::Value::Dict next_shared_devices,
diff --git a/chrome/browser/ash/crostini/crostini_shared_devices.h b/chrome/browser/ash/crostini/crostini_shared_devices.h
index fcbee39..2c038f67 100644
--- a/chrome/browser/ash/crostini/crostini_shared_devices.h
+++ b/chrome/browser/ash/crostini/crostini_shared_devices.h
@@ -55,6 +55,8 @@
                          bool shared,
                          ResultCallback callback);
 
+  static void EnsureFactoryBuilt();
+
  private:
   void ApplySharingState(guest_os::GuestId container_id,
                          base::Value::Dict next_shared_devices,
diff --git a/chrome/browser/ash/drive/drive_integration_service_browsertest.cc b/chrome/browser/ash/drive/drive_integration_service_browsertest.cc
index 7743beb..561d32e 100644
--- a/chrome/browser/ash/drive/drive_integration_service_browsertest.cc
+++ b/chrome/browser/ash/drive/drive_integration_service_browsertest.cc
@@ -626,7 +626,10 @@
  protected:
   DriveIntegrationServiceBrowserTestLacros() {
     scoped_feature_list_.InitWithFeatures(
-        {ash::features::kLacrosSupport, ash::features::kLacrosPrimary}, {});
+        {ash::features::kLacrosSupport, ash::features::kLacrosPrimary,
+         ash::features::kLacrosOnly,
+         ash::features::kLacrosProfileMigrationForceOff},
+        {});
   }
 
   // browser() does not exist in Lacros, so get the profile from ProfileManager.
diff --git a/chrome/browser/ash/scanning/lorgnette_scanner_manager.cc b/chrome/browser/ash/scanning/lorgnette_scanner_manager.cc
index 3c16ece8..4862f6fb 100644
--- a/chrome/browser/ash/scanning/lorgnette_scanner_manager.cc
+++ b/chrome/browser/ash/scanning/lorgnette_scanner_manager.cc
@@ -40,6 +40,8 @@
     "|AM-C5000"
     "|AM-C6000"
     "|DS-790WN"
+    "|DS-C420W"
+    "|DS-C480W"
     "|LM-C4000"
     "|LM-C5000"
     "|LM-C6000"
diff --git a/chrome/browser/autofill/test/BUILD.gn b/chrome/browser/autofill/test/BUILD.gn
index 10282861..22577ac9 100644
--- a/chrome/browser/autofill/test/BUILD.gn
+++ b/chrome/browser/autofill/test/BUILD.gn
@@ -31,13 +31,13 @@
   testonly = true
   resources_package = "org.chromium.chrome.browser.autofill"
 
+  srcjar_deps = [ ":jni_headers" ]
   sources = [ "android/java/src/org/chromium/chrome/browser/autofill/AutofillTestHelper.java" ]
 
   deps = [
     ":jni_headers",
     "//base:jni_java",
   ]
-  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 
   public_deps = [
     "//base:base_java_test_support",
diff --git a/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManagerTest.java b/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManagerTest.java
index 465d2df..4e49536 100644
--- a/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManagerTest.java
+++ b/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManagerTest.java
@@ -29,7 +29,6 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.test.BaseJUnit4ClassRunner;
 import org.chromium.base.test.util.Batch;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
@@ -529,8 +528,9 @@
 
     @Test
     @SmallTest
-    @DisabledTest(message = "https://crbug.com/1454222")
     @Feature({"Autofill"})
+    @Features.DisableFeatures(ChromeFeatureList.AUTOFILL_ENABLE_RANKING_FORMULA_ADDRESS_PROFILES)
+    // TODO(crbug.com/1454591): Add test for ranking profiles with new algorithm.
     public void testProfilesFrecency() throws TimeoutException {
         // Create 3 profiles.
         AutofillProfile profile1 = AutofillProfile.builder()
@@ -594,6 +594,8 @@
     @Test
     @SmallTest
     @Feature({"Autofill"})
+    @Features.DisableFeatures(ChromeFeatureList.AUTOFILL_ENABLE_RANKING_FORMULA_CREDIT_CARDS)
+    // TODO(crbug.com/1454591): Add test for ranking credit cards with new algorithm.
     public void testCreditCardsFrecency() throws TimeoutException {
         // Create 3 credit cards.
         CreditCard card1 = createLocalCreditCard("Visa", "1234123412341234", "5", "2020");
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 35a4e72..868575f 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -197,6 +197,7 @@
 #include "third_party/blink/public/common/switches.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/color/color_provider_manager.h"
 
 #if BUILDFLAG(ENABLE_COMPONENT_UPDATER)
 #include "chrome/browser/component_updater/registration.h"
diff --git a/chrome/browser/companion/core/mojom/companion.mojom b/chrome/browser/companion/core/mojom/companion.mojom
index c1ae22b..84f08b8 100644
--- a/chrome/browser/companion/core/mojom/companion.mojom
+++ b/chrome/browser/companion/core/mojom/companion.mojom
@@ -131,6 +131,11 @@
   kATX = 9,
 };
 
+struct VisualSearchResult {
+  // Encoded image bytes
+  string data_uri;
+};
+
 // Factory method for creating a new WebUI page handler.
 interface CompanionPageHandlerFactory {
   // The WebUI calls this method when the page is first initialized.
@@ -215,4 +220,7 @@
   // `text_directives` and `results` have the same length.
   OnCqFindTextResultsAvailable(array<string> text_directives,
     array<bool> results);
+
+  // Pass back results from visual classifier for rendering.
+  OnDeviceVisualClassificationResult(array<VisualSearchResult> results);
 };
diff --git a/chrome/browser/dev_ui_browser_resources.grd b/chrome/browser/dev_ui_browser_resources.grd
index e996d03..e2988a11 100644
--- a/chrome/browser/dev_ui_browser_resources.grd
+++ b/chrome/browser/dev_ui_browser_resources.grd
@@ -22,21 +22,6 @@
       <include name="IDR_DEVICE_LOG_UI_JS" file="resources\device_log_ui\device_log_ui.js" preprocess="true" type="BINDATA" />
       <include name="IDR_DEVICE_LOG_UI_CSS" file="resources\device_log_ui\device_log_ui.css" type="BINDATA" />
 
-      <if expr="is_android or is_linux or is_chromeos">
-        <include name="IDR_SANDBOX_INTERNALS_HTML" file="resources\sandbox_internals\sandbox_internals.html" preprocess="true" type="BINDATA" />
-        <include name="IDR_SANDBOX_INTERNALS_JS" file="${root_gen_dir}\chrome\browser\resources\sandbox_internals\tsc\sandbox_internals.js" use_base_dir="false" type="BINDATA" />
-      </if>
-      <if expr="is_win">
-        <include name="IDR_SANDBOX_INTERNALS_HTML" file="resources\sandbox_internals\sandbox_internals.html" preprocess="true" type="BINDATA" />
-        <include name="IDR_SANDBOX_INTERNALS_JS" file="${root_gen_dir}\chrome\browser\resources\sandbox_internals\tsc\sandbox_internals_win.js" use_base_dir="false" type="BINDATA" />
-      </if>
-
-      <if expr="is_android">
-        <include name="IDR_QUERY_TILES_INTERNALS_HTML" file="resources\internals\query_tiles\query_tiles_internals.html" type="BINDATA" />
-        <include name="IDR_QUERY_TILES_INTERNALS_JS" file="${root_gen_dir}\chrome\browser\resources\internals\query_tiles\tsc\query_tiles_internals.js" use_base_dir="false" type="BINDATA" />
-        <include name="IDR_QUERY_TILES_INTERNALS_BROWSER_PROXY_JS" file="${root_gen_dir}\chrome\browser\resources\internals\query_tiles\tsc\query_tiles_internals_browser_proxy.js" use_base_dir="false" type="BINDATA" />
-      </if>
-
       <if expr="enable_supervised_users">
         <include name="IDR_FAMILY_LINK_USER_INTERNALS_HTML" file="resources\family_link_user_internals\family_link_user_internals.html" allowexternalscript="true" type="BINDATA" />
         <include name="IDR_FAMILY_LINK_USER_INTERNALS_CSS" file="resources\family_link_user_internals\family_link_user_internals.css" type="BINDATA" />
diff --git a/chrome/browser/enterprise/util/BUILD.gn b/chrome/browser/enterprise/util/BUILD.gn
index fc241e54..771ab22a 100644
--- a/chrome/browser/enterprise/util/BUILD.gn
+++ b/chrome/browser/enterprise/util/BUILD.gn
@@ -10,6 +10,7 @@
 ]
 
 android_library("java") {
+  srcjar_deps = [ ":jni_headers" ]
   sources = _jni_sources
   sources += [ "android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl.java" ]
 
@@ -21,7 +22,6 @@
     "//chrome/browser/profiles/android:java",
     "//third_party/androidx:androidx_annotation_annotation_java",
   ]
-  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 }
 
 generate_jni("jni_headers") {
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn
index 62ded0d3..934560d4 100644
--- a/chrome/browser/extensions/BUILD.gn
+++ b/chrome/browser/extensions/BUILD.gn
@@ -716,8 +716,6 @@
     "webstore_install_with_prompt.h",
     "webstore_installer.cc",
     "webstore_installer.h",
-    "webstore_installer_callback_delegate.cc",
-    "webstore_installer_callback_delegate.h",
     "webstore_reinstaller.cc",
     "webstore_reinstaller.h",
     "webstore_standalone_installer.cc",
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
index ddc38df9..54b46fb 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_api.cc
@@ -10,6 +10,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/auto_reset.h"
 #include "base/base64.h"
 #include "base/containers/cxx20_erase_vector.h"
 #include "base/functional/bind.h"
@@ -32,7 +33,6 @@
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/install_tracker.h"
 #include "chrome/browser/extensions/scoped_active_install.h"
-#include "chrome/browser/extensions/webstore_installer_callback_delegate.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/profiles/profile_observer.h"
@@ -238,7 +238,7 @@
 // The number of user gestures to trace back for the referrer chain.
 const int kExtensionReferrerUserGestureLimit = 2;
 
-WebstoreInstaller::Delegate* test_webstore_installer_delegate = nullptr;
+WebstorePrivateApi::Delegate* test_delegate = nullptr;
 
 // We allow the web store to set a string containing login information when a
 // purchase is made, so that when a user logs into sync with a different
@@ -402,9 +402,10 @@
 }  // namespace
 
 // static
-void WebstorePrivateApi::SetWebstoreInstallerDelegateForTesting(
-    WebstoreInstaller::Delegate* delegate) {
-  test_webstore_installer_delegate = delegate;
+base::AutoReset<WebstorePrivateApi::Delegate*>
+WebstorePrivateApi::SetDelegateForTesting(Delegate* delegate) {
+  CHECK_EQ(nullptr, test_delegate);
+  return base::AutoReset<Delegate*>(&test_delegate, delegate);
 }
 
 // static
@@ -656,8 +657,8 @@
 
 void WebstorePrivateBeginInstallWithManifest3Function::
     OnExtensionApprovalCanceled() {
-  if (test_webstore_installer_delegate) {
-    test_webstore_installer_delegate->OnExtensionInstallFailure(
+  if (test_delegate) {
+    test_delegate->OnExtensionInstallFailure(
         dummy_extension_->id(), kWebstoreParentPermissionFailedError,
         WebstoreInstaller::FailureReason::FAILURE_REASON_CANCELLED);
   }
@@ -667,8 +668,8 @@
 
 void WebstorePrivateBeginInstallWithManifest3Function::
     OnExtensionApprovalFailed() {
-  if (test_webstore_installer_delegate) {
-    test_webstore_installer_delegate->OnExtensionInstallFailure(
+  if (test_delegate) {
+    test_delegate->OnExtensionInstallFailure(
         dummy_extension_->id(), kWebstoreParentPermissionFailedError,
         WebstoreInstaller::FailureReason::FAILURE_REASON_OTHER);
   }
@@ -1022,13 +1023,12 @@
   // the allowlist entry will bypass the normal permissions install dialog.
   scoped_refptr<WebstoreInstaller> installer = new WebstoreInstaller(
       profile,
-      std::make_unique<WebstoreInstallerCallbackDelegate>(
-          base::BindOnce(&WebstorePrivateCompleteInstallFunction::
-                             OnExtensionInstallSuccess,
-                         weak_ptr_factory_.GetWeakPtr()),
-          base::BindOnce(&WebstorePrivateCompleteInstallFunction::
-                             OnExtensionInstallFailure,
-                         weak_ptr_factory_.GetWeakPtr())),
+      base::BindOnce(
+          &WebstorePrivateCompleteInstallFunction::OnExtensionInstallSuccess,
+          weak_ptr_factory_.GetWeakPtr()),
+      base::BindOnce(
+          &WebstorePrivateCompleteInstallFunction::OnExtensionInstallFailure,
+          weak_ptr_factory_.GetWeakPtr()),
       web_contents, params->expected_id, std::move(approval_),
       WebstoreInstaller::INSTALL_SOURCE_OTHER);
   installer->Start();
@@ -1052,9 +1052,8 @@
     const std::string& id,
     const std::string& error,
     WebstoreInstaller::FailureReason reason) {
-  if (test_webstore_installer_delegate) {
-    test_webstore_installer_delegate->OnExtensionInstallFailure(id, error,
-                                                                reason);
+  if (test_delegate) {
+    test_delegate->OnExtensionInstallFailure(id, error, reason);
   }
 
   VLOG(1) << "Install failed, sending response";
@@ -1068,8 +1067,9 @@
 
 void WebstorePrivateCompleteInstallFunction::OnInstallSuccess(
     const std::string& id) {
-  if (test_webstore_installer_delegate)
-    test_webstore_installer_delegate->OnExtensionInstallSuccess(id);
+  if (test_delegate) {
+    test_delegate->OnExtensionInstallSuccess(id);
+  }
 }
 
 WebstorePrivateEnableAppLauncherFunction::
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_api.h b/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
index cad3f594..957ab11 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_api.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <string>
 
+#include "base/auto_reset.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/values.h"
@@ -45,9 +46,18 @@
 
 class WebstorePrivateApi {
  public:
-  // Allows you to override the WebstoreInstaller delegate for testing.
-  static void SetWebstoreInstallerDelegateForTesting(
-      WebstoreInstaller::Delegate* delegate);
+  class Delegate {
+   public:
+    virtual ~Delegate() = default;
+    virtual void OnExtensionInstallSuccess(const std::string& id) {}
+    virtual void OnExtensionInstallFailure(
+        const std::string& id,
+        const std::string& error,
+        WebstoreInstaller::FailureReason reason) {}
+  };
+
+  // Sets a delegate for testing.
+  static base::AutoReset<Delegate*> SetDelegateForTesting(Delegate* delegate);
 
   // Gets the pending approval for the |extension_id| in |profile|. Pending
   // approvals are held between the calls to beginInstallWithManifest and
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
index 6e0071dc..a27a979 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
@@ -5,6 +5,7 @@
 #include <memory>
 #include <vector>
 
+#include "base/auto_reset.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/run_loop.h"
@@ -76,7 +77,7 @@
 
 constexpr char kExtensionId[] = "enfkhcelefdadlmkffamgdlgplcionje";
 
-class WebstoreInstallListener : public WebstoreInstaller::Delegate {
+class WebstoreInstallListener : public WebstorePrivateApi::Delegate {
  public:
   WebstoreInstallListener()
       : received_failure_(false), received_success_(false), waiting_(false) {}
@@ -294,7 +295,7 @@
 IN_PROC_BROWSER_TEST_P(ExtensionWebstorePrivateApiTestParameterized,
                        AppInstallBubble) {
   WebstoreInstallListener listener;
-  WebstorePrivateApi::SetWebstoreInstallerDelegateForTesting(&listener);
+  auto delegate_reset = WebstorePrivateApi::SetDelegateForTesting(&listener);
   ASSERT_TRUE(RunInstallTest("app_install_bubble.html", "app.crx"));
   listener.Wait();
   ASSERT_TRUE(listener.received_success());
@@ -345,7 +346,7 @@
 IN_PROC_BROWSER_TEST_P(ExtensionWebstorePrivateApiTestParameterized,
                        InstallTheme) {
   WebstoreInstallListener listener;
-  WebstorePrivateApi::SetWebstoreInstallerDelegateForTesting(&listener);
+  auto delegate_reset = WebstorePrivateApi::SetDelegateForTesting(&listener);
   ASSERT_TRUE(RunInstallTest("theme.html", "../../theme.crx"));
   listener.Wait();
   ASSERT_TRUE(listener.received_success());
@@ -524,7 +525,7 @@
 IN_PROC_BROWSER_TEST_P(SupervisedUserExtensionWebstorePrivateApiTest,
                        ParentPermissionGranted) {
   WebstoreInstallListener listener;
-  WebstorePrivateApi::SetWebstoreInstallerDelegateForTesting(&listener);
+  auto delegate_reset = WebstorePrivateApi::SetDelegateForTesting(&listener);
   set_next_dialog_action(NextDialogAction::kAccept);
 
   ASSERT_TRUE(RunInstallTest("install_child.html", "app.crx"));
@@ -546,7 +547,7 @@
                        ParentPermissionCanceled) {
   WebstoreInstallListener listener;
   set_next_dialog_action(NextDialogAction::kCancel);
-  WebstorePrivateApi::SetWebstoreInstallerDelegateForTesting(&listener);
+  auto delegate_reset = WebstorePrivateApi::SetDelegateForTesting(&listener);
   ASSERT_TRUE(RunInstallTest("install_cancel_child.html", "app.crx"));
   listener.Wait();
   ASSERT_TRUE(listener.received_failure());
@@ -566,7 +567,7 @@
 IN_PROC_BROWSER_TEST_P(SupervisedUserExtensionWebstorePrivateApiTest,
                        NoParentPermissionRequiredForTheme) {
   WebstoreInstallListener listener;
-  WebstorePrivateApi::SetWebstoreInstallerDelegateForTesting(&listener);
+  auto delegate_reset = WebstorePrivateApi::SetDelegateForTesting(&listener);
   ASSERT_TRUE(RunInstallTest("theme.html", "../../theme.crx"));
   listener.Wait();
   ASSERT_TRUE(listener.received_success());
diff --git a/chrome/browser/extensions/navigation_observer_browsertest.cc b/chrome/browser/extensions/navigation_observer_browsertest.cc
index a35833e4..c4ebda9 100644
--- a/chrome/browser/extensions/navigation_observer_browsertest.cc
+++ b/chrome/browser/extensions/navigation_observer_browsertest.cc
@@ -225,22 +225,22 @@
   // The SiteInstance of the disabled extension frame should be different from
   // the SiteInstance of the enabled extension subframe. It should reference the
   // invalid extension ID or the error page URL.
-  // TODO(crbug.com/1234637): remove the exception for the
-  // SubframeShutdownDelay experiment below. It is temporary, intended to allow
-  // the experiment to proceed while the reason for it causing
-  // |extension_site_instance| to be reused is addressed separately.
-  if (!base::FeatureList::IsEnabled(features::kSubframeShutdownDelay)) {
-    EXPECT_NE(subframe->GetSiteInstance(), extension_site_instance);
-    if (content::SiteIsolationPolicy::IsErrorPageIsolationEnabled(false)) {
-      EXPECT_EQ(subframe->GetSiteInstance()->GetSiteURL(),
-                GURL(content::kUnreachableWebDataURL));
-    } else {
-      EXPECT_EQ(subframe->GetSiteInstance()->GetSiteURL(),
-                GURL(chrome::kExtensionInvalidRequestURL));
-      // The disabled extension process should be locked.
-      EXPECT_TRUE(subframe->GetProcess()->IsProcessLockedToSiteForTesting());
-    }
+  // TODO(crbug.com/1234637): remove the exceptions for Mac and Windows below
+  // once renderer-process shutdown delay causing `extension_site_instance` to
+  // be reused is addressed (see
+  // RendererProcessHostImpl::ShouldDelayProcessShutdown() for details).
+#if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_WIN)
+  EXPECT_NE(subframe->GetSiteInstance(), extension_site_instance);
+  if (content::SiteIsolationPolicy::IsErrorPageIsolationEnabled(false)) {
+    EXPECT_EQ(subframe->GetSiteInstance()->GetSiteURL(),
+              GURL(content::kUnreachableWebDataURL));
+  } else {
+    EXPECT_EQ(subframe->GetSiteInstance()->GetSiteURL(),
+              GURL(chrome::kExtensionInvalidRequestURL));
+    // The disabled extension process should be locked.
+    EXPECT_TRUE(subframe->GetProcess()->IsProcessLockedToSiteForTesting());
   }
+#endif  // !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_WIN)
 
   // Re-enable the extension.
   extension_service()->EnableExtension(extension->id());
diff --git a/chrome/browser/extensions/webstore_installer.cc b/chrome/browser/extensions/webstore_installer.cc
index 597f394e77..3078917f 100644
--- a/chrome/browser/extensions/webstore_installer.cc
+++ b/chrome/browser/extensions/webstore_installer.cc
@@ -210,14 +210,6 @@
   return url;
 }
 
-void WebstoreInstaller::Delegate::OnExtensionDownloadStarted(
-    const std::string& id,
-    download::DownloadItem* item) {}
-
-void WebstoreInstaller::Delegate::OnExtensionDownloadProgress(
-    const std::string& id,
-    download::DownloadItem* item) {}
-
 WebstoreInstaller::Approval::Approval() = default;
 
 std::unique_ptr<WebstoreInstaller::Approval>
@@ -263,14 +255,16 @@
 }
 
 WebstoreInstaller::WebstoreInstaller(Profile* profile,
-                                     std::unique_ptr<Delegate> delegate,
+                                     SuccessCallback success_callback,
+                                     FailureCallback failure_callback,
                                      content::WebContents* web_contents,
                                      const std::string& id,
                                      std::unique_ptr<Approval> approval,
                                      InstallSource source)
     : web_contents_(web_contents->GetWeakPtr()),
       profile_(profile),
-      delegate_(std::move(delegate)),
+      success_callback_(std::move(success_callback)),
+      failure_callback_(std::move(failure_callback)),
       id_(id),
       install_source_(source),
       approval_(approval.release()) {
@@ -389,10 +383,6 @@
   }
 }
 
-void WebstoreInstaller::InvalidateDelegate() {
-  delegate_ = nullptr;
-}
-
 void WebstoreInstaller::SetDownloadDirectoryForTests(
     base::FilePath* directory) {
   g_download_directory_for_tests = directory;
@@ -460,9 +450,6 @@
   }
 
   if (!download_started_) {
-    if (delegate_) {
-      delegate_->OnExtensionDownloadStarted(id_, download_item_);
-    }
     download_started_ = true;
   }
 }
@@ -497,19 +484,12 @@
 
       if (pending_modules_.size() == 1) {
         // The download is the last module - the extension main module.
-        if (delegate_) {
-          delegate_->OnExtensionDownloadProgress(id_, download);
-        }
         extensions::InstallTracker* tracker =
             extensions::InstallTrackerFactory::GetForBrowserContext(profile_);
         tracker->OnDownloadProgress(id_, 100);
       }
       break;
     case DownloadItem::IN_PROGRESS: {
-      if (delegate_ && pending_modules_.size() == 1) {
-        // Only report download progress for the main module to |delegrate_|.
-        delegate_->OnExtensionDownloadProgress(id_, download);
-      }
       UpdateDownloadProgress();
       break;
     }
@@ -718,10 +698,10 @@
 
 void WebstoreInstaller::ReportFailure(const std::string& error,
                                       FailureReason reason) {
-  if (delegate_) {
-    delegate_->OnExtensionInstallFailure(id_, error, reason);
-    delegate_.reset();
-  }
+  CHECK(failure_callback_);
+  std::move(failure_callback_).Run(id_, error, reason);
+  success_callback_ = base::NullCallback();
+  extension_registry_observation_.Reset();
 
   extensions::InstallTracker* tracker =
       extensions::InstallTrackerFactory::GetForBrowserContext(profile_);
@@ -731,10 +711,10 @@
 }
 
 void WebstoreInstaller::ReportSuccess() {
-  if (delegate_) {
-    delegate_->OnExtensionInstallSuccess(id_);
-    delegate_.reset();
-  }
+  CHECK(success_callback_);
+  std::move(success_callback_).Run(id_);
+  failure_callback_ = base::NullCallback();
+  extension_registry_observation_.Reset();
 
   Release();  // Balanced in Start().
 }
diff --git a/chrome/browser/extensions/webstore_installer.h b/chrome/browser/extensions/webstore_installer.h
index 4070288..42a1ad7 100644
--- a/chrome/browser/extensions/webstore_installer.h
+++ b/chrome/browser/extensions/webstore_installer.h
@@ -81,18 +81,9 @@
     MANIFEST_CHECK_LEVEL_STRICT,
   };
 
-  class Delegate {
-   public:
-    virtual ~Delegate() = default;
-    virtual void OnExtensionDownloadStarted(const std::string& id,
-                                            download::DownloadItem* item);
-    virtual void OnExtensionDownloadProgress(const std::string& id,
-                                             download::DownloadItem* item);
-    virtual void OnExtensionInstallSuccess(const std::string& id) = 0;
-    virtual void OnExtensionInstallFailure(const std::string& id,
-                                           const std::string& error,
-                                           FailureReason reason) = 0;
-  };
+  using SuccessCallback = base::OnceCallback<void(const std::string&)>;
+  using FailureCallback = base::OnceCallback<
+      void(const std::string&, const std::string&, FailureReason)>;
 
   // Contains information about what parts of the extension install process can
   // be skipped or modified. If one of these is present, it means that a CRX
@@ -178,14 +169,13 @@
       const download::DownloadItem& download);
 
   // Creates a WebstoreInstaller for downloading and installing the extension
-  // with the given |id| from the Chrome Web Store. If |delegate| is not
-  // nullptr, it will be notified when the install succeeds or fails. The
-  // installer will use the specified |controller| to download the extension.
-  // Only one WebstoreInstaller can use a specific controller at any given time.
-  // This also associates the |approval| with this install. Note: the delegate
-  // should stay alive until being called back.
+  // with the given `id` from the Chrome Web Store. If `success_callback` is
+  // non-null, it will be run if the install succeeds. If `failure_callback`
+  // is non-null, it will be run if the install fails. This also associates
+  // the `approval` with this install.
   WebstoreInstaller(Profile* profile,
-                    std::unique_ptr<Delegate> delegate,
+                    SuccessCallback success_callback,
+                    FailureCallback failure_callback,
                     content::WebContents* web_contents,
                     const std::string& id,
                     std::unique_ptr<Approval> approval,
@@ -199,10 +189,6 @@
                             const Extension* extension,
                             bool is_update) override;
 
-  // Removes the reference to the delegate passed in the constructor. Used when
-  // the delegate object must be deleted before this object.
-  void InvalidateDelegate();
-
   // Instead of using the default download directory, use |directory| instead.
   // This does *not* transfer ownership of |directory|.
   static void SetDownloadDirectoryForTests(base::FilePath* directory);
@@ -263,7 +249,8 @@
       extension_registry_observation_{this};
   base::WeakPtr<content::WebContents> web_contents_;
   raw_ptr<Profile> profile_;
-  std::unique_ptr<Delegate> delegate_;
+  SuccessCallback success_callback_;
+  FailureCallback failure_callback_;
   std::string id_;
   InstallSource install_source_;
   // The DownloadItem is owned by the DownloadManager and is valid from when
diff --git a/chrome/browser/extensions/webstore_installer_browsertest.cc b/chrome/browser/extensions/webstore_installer_browsertest.cc
index 00a09ff..92b6ad7 100644
--- a/chrome/browser/extensions/webstore_installer_browsertest.cc
+++ b/chrome/browser/extensions/webstore_installer_browsertest.cc
@@ -11,7 +11,6 @@
 #include "base/values.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/scripting_permissions_modifier.h"
-#include "chrome/browser/extensions/webstore_installer_callback_delegate.h"
 #include "chrome/browser/extensions/webstore_installer_test.h"
 #include "content/public/test/browser_test.h"
 #include "extensions/browser/extension_registry.h"
@@ -41,13 +40,15 @@
 class TestWebstoreInstaller : public WebstoreInstaller {
  public:
   TestWebstoreInstaller(Profile* profile,
-                        std::unique_ptr<WebstoreInstaller::Delegate> delegate,
+                        SuccessCallback success_callback,
+                        FailureCallback failure_callback,
                         content::WebContents* web_contents,
                         const std::string& id,
                         std::unique_ptr<Approval> approval,
                         InstallSource source)
       : WebstoreInstaller(profile,
-                          std::move(delegate),
+                          std::move(success_callback),
+                          std::move(failure_callback),
                           web_contents,
                           id,
                           std::move(approval),
@@ -139,13 +140,10 @@
   SetDoneClosure(run_loop.QuitClosure());
   TestWebstoreInstaller* installer = new TestWebstoreInstaller(
       browser()->profile(),
-      std::make_unique<WebstoreInstallerCallbackDelegate>(
-          base::BindOnce(
-              &WebstoreInstallerBrowserTest::OnExtensionInstallSuccess,
-              base::Unretained(this)),
-          base::BindOnce(
-              &WebstoreInstallerBrowserTest::OnExtensionInstallFailure,
-              base::Unretained(this))),
+      base::BindOnce(&WebstoreInstallerBrowserTest::OnExtensionInstallSuccess,
+                     base::Unretained(this)),
+      base::BindOnce(&WebstoreInstallerBrowserTest::OnExtensionInstallFailure,
+                     base::Unretained(this)),
       active_web_contents, kTestExtensionId, std::move(approval),
       WebstoreInstaller::INSTALL_SOURCE_OTHER);
   installer->Start();
@@ -173,13 +171,10 @@
   SetDoneClosure(run_loop.QuitClosure());
   scoped_refptr<TestWebstoreInstaller> installer = new TestWebstoreInstaller(
       browser()->profile(),
-      std::make_unique<WebstoreInstallerCallbackDelegate>(
-          base::BindOnce(
-              &WebstoreInstallerBrowserTest::OnExtensionInstallSuccess,
-              base::Unretained(this)),
-          base::BindOnce(
-              &WebstoreInstallerBrowserTest::OnExtensionInstallFailure,
-              base::Unretained(this))),
+      base::BindOnce(&WebstoreInstallerBrowserTest::OnExtensionInstallSuccess,
+                     base::Unretained(this)),
+      base::BindOnce(&WebstoreInstallerBrowserTest::OnExtensionInstallFailure,
+                     base::Unretained(this)),
       active_web_contents, kTestExtensionId, std::move(approval),
       WebstoreInstaller::INSTALL_SOURCE_OTHER);
   installer->Start();
@@ -261,13 +256,10 @@
   SetDoneClosure(run_loop.QuitClosure());
   TestWebstoreInstaller* installer = new TestWebstoreInstaller(
       browser()->profile(),
-      std::make_unique<WebstoreInstallerCallbackDelegate>(
-          base::BindOnce(
-              &WebstoreInstallerBrowserTest::OnExtensionInstallSuccess,
-              base::Unretained(this)),
-          base::BindOnce(
-              &WebstoreInstallerBrowserTest::OnExtensionInstallFailure,
-              base::Unretained(this))),
+      base::BindOnce(&WebstoreInstallerBrowserTest::OnExtensionInstallSuccess,
+                     base::Unretained(this)),
+      base::BindOnce(&WebstoreInstallerBrowserTest::OnExtensionInstallFailure,
+                     base::Unretained(this)),
       active_web_contents, kTestExtensionWithPermissionsId, std::move(approval),
       WebstoreInstaller::INSTALL_SOURCE_OTHER);
   installer->Start();
diff --git a/chrome/browser/extensions/webstore_installer_callback_delegate.cc b/chrome/browser/extensions/webstore_installer_callback_delegate.cc
deleted file mode 100644
index f134bbfd..0000000
--- a/chrome/browser/extensions/webstore_installer_callback_delegate.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/extensions/webstore_installer_callback_delegate.h"
-
-#include <string>
-
-#include "base/functional/callback.h"
-#include "chrome/browser/extensions/webstore_installer.h"
-
-namespace extensions {
-
-WebstoreInstallerCallbackDelegate::WebstoreInstallerCallbackDelegate(
-    SuccessCallback success_callback,
-    FailureCallback failure_callback)
-    : success_callback_(std::move(success_callback)),
-      failure_callback_(std::move(failure_callback)) {
-  CHECK(success_callback_);
-  CHECK(failure_callback_);
-}
-
-WebstoreInstallerCallbackDelegate::~WebstoreInstallerCallbackDelegate() =
-    default;
-
-void WebstoreInstallerCallbackDelegate::OnExtensionInstallSuccess(
-    const std::string& id) {
-  CHECK(success_callback_);
-  std::move(success_callback_).Run(id);
-}
-
-void WebstoreInstallerCallbackDelegate::OnExtensionInstallFailure(
-    const std::string& id,
-    const std::string& error,
-    FailureReason reason) {
-  CHECK(failure_callback_);
-  std::move(failure_callback_).Run(id, error, reason);
-}
-
-}  // namespace extensions
diff --git a/chrome/browser/extensions/webstore_installer_callback_delegate.h b/chrome/browser/extensions/webstore_installer_callback_delegate.h
deleted file mode 100644
index 0fba473..0000000
--- a/chrome/browser/extensions/webstore_installer_callback_delegate.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_EXTENSIONS_WEBSTORE_INSTALLER_CALLBACK_DELEGATE_H_
-#define CHROME_BROWSER_EXTENSIONS_WEBSTORE_INSTALLER_CALLBACK_DELEGATE_H_
-
-#include <string>
-
-#include "base/functional/callback.h"
-#include "chrome/browser/extensions/webstore_installer.h"
-
-namespace extensions {
-
-// A utility class for binding callbacks to the WebstoreInstaller::Delegate
-// events.
-class WebstoreInstallerCallbackDelegate : public WebstoreInstaller::Delegate {
- public:
-  using FailureReason = WebstoreInstaller::FailureReason;
-  using SuccessCallback = base::OnceCallback<void(const std::string&)>;
-  using FailureCallback = base::OnceCallback<
-      void(const std::string&, const std::string&, FailureReason)>;
-
-  WebstoreInstallerCallbackDelegate(SuccessCallback success_callback,
-                                    FailureCallback failure_callback);
-  ~WebstoreInstallerCallbackDelegate() override;
-
-  // WebstoreInstaller::Delegate
-  void OnExtensionInstallSuccess(const std::string& id) override;
-  void OnExtensionInstallFailure(const std::string& id,
-                                 const std::string& error,
-                                 FailureReason reason) override;
-
- private:
-  SuccessCallback success_callback_;
-  FailureCallback failure_callback_;
-};
-
-}  // namespace extensions
-
-#endif  // CHROME_BROWSER_EXTENSIONS_WEBSTORE_INSTALLER_CALLBACK_DELEGATE_H_
diff --git a/chrome/browser/extensions/webstore_standalone_installer.cc b/chrome/browser/extensions/webstore_standalone_installer.cc
index 166a5203..8d4835f1 100644
--- a/chrome/browser/extensions/webstore_standalone_installer.cc
+++ b/chrome/browser/extensions/webstore_standalone_installer.cc
@@ -17,7 +17,6 @@
 #include "chrome/browser/extensions/install_tracker.h"
 #include "chrome/browser/extensions/scoped_active_install.h"
 #include "chrome/browser/extensions/webstore_data_fetcher.h"
-#include "chrome/browser/extensions/webstore_installer_callback_delegate.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/crx_file/id_util.h"
 #include "content/public/browser/storage_partition.h"
@@ -219,13 +218,10 @@
 
   auto installer = base::MakeRefCounted<WebstoreInstaller>(
       profile_,
-      std::make_unique<WebstoreInstallerCallbackDelegate>(
-          base::BindOnce(
-              &WebstoreStandaloneInstaller::OnExtensionInstallSuccess,
-              weak_ptr_factory_.GetWeakPtr()),
-          base::BindOnce(
-              &WebstoreStandaloneInstaller::OnExtensionInstallFailure,
-              weak_ptr_factory_.GetWeakPtr())),
+      base::BindOnce(&WebstoreStandaloneInstaller::OnExtensionInstallSuccess,
+                     weak_ptr_factory_.GetWeakPtr()),
+      base::BindOnce(&WebstoreStandaloneInstaller::OnExtensionInstallFailure,
+                     weak_ptr_factory_.GetWeakPtr()),
       GetWebContents(), id_, std::move(approval), install_source_);
   installer->Start();
 }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index d3c7e2e..a9e3fd0 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -155,6 +155,11 @@
     "expiry_milestone": 130
   },
   {
+    "name": "android-app-inintegration-safesearch",
+    "owners": [ "thaothao", "public-content-toast@google.com" ],
+    "expiry_milestone": 130
+  },
+  {
     "name": "android-extended-keyboard-shortcuts",
     "owners": [ "wbjacksonjr@google.com"],
     "expiry_milestone": 119
@@ -6975,6 +6980,11 @@
     "expiry_milestone": 118
   },
   {
+    "name": "shopping-list-track-by-default",
+    "owners": [ "mdjones", "chrome-shopping-eng@google.com" ],
+    "expiry_milestone": 120
+  },
+  {
     "name": "shortcut-customization-jelly",
     "owners": [ "jimmyxgong", "zentaro", "cros-peripherals@google.com" ],
     "expiry_milestone": 122
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 3b5c8a9..f62b8cc 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -72,6 +72,11 @@
 const char kAndroidAppIntegrationDescription[] =
     "If enabled, allows Chrome to integrate with the Android App Search.";
 
+const char kAndroidAppIntegrationSafeSearchName[] =
+    "SafeSearch in Android App Search";
+const char kAndroidAppIntegrationSafeSearchDescription[] =
+    "If enabled, allows Chrome to filter out sensitive urls";
+
 const char kAndroidExtendedKeyboardShortcutsName[] =
     "Android Extended Keyboard Shortcuts";
 const char kAndroidExtendedKeyboardShortcutsDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 2b7601a..6ca6ec0e 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -68,6 +68,9 @@
 extern const char kAndroidAppIntegrationName[];
 extern const char kAndroidAppIntegrationDescription[];
 
+extern const char kAndroidAppIntegrationSafeSearchName[];
+extern const char kAndroidAppIntegrationSafeSearchDescription[];
+
 extern const char kAndroidExtendedKeyboardShortcutsName[];
 extern const char kAndroidExtendedKeyboardShortcutsDescription[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 2962062..e6fc12d 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -159,6 +159,7 @@
     &kAddToHomescreenIPH,
     &kAllowNewIncognitoTabIntents,
     &kAndroidAppIntegration,
+    &kAndroidAppIntegrationSafeSearch,
     &kAndroidSearchEngineChoiceNotification,
     &kAndroidImprovedBookmarks,
     &kAnimatedImageDragShadow,
@@ -282,6 +283,7 @@
     &kShowScrollableMVTOnNTPAndroid,
     &kFeedPositionAndroid,
     &kSearchResumptionModuleAndroid,
+    &kScrollToTLDOptimization,
     &kShareSheetMigrationAndroid,
     &kShareSheetCustomActionsPolish,
     &kShouldIgnoreIntentSkipInternalCheck,
@@ -448,6 +450,10 @@
              "AndroidAppIntegration",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kAndroidAppIntegrationSafeSearch,
+             "AndroidAppIntegrationSafeSearch",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kAndroidSearchEngineChoiceNotification,
              "AndroidSearchEngineChoiceNotification",
              base::FEATURE_ENABLED_BY_DEFAULT);
@@ -927,6 +933,10 @@
              "SafeModeForCachedFlags",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+BASE_FEATURE(kScrollToTLDOptimization,
+             "ScrollToTLDOptimization",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kShowScrollableMVTOnNTPAndroid,
              "ShowScrollableMVTOnNTPAndroid",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h
index 40fc30e4..5b9e916c 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -20,6 +20,7 @@
 BASE_DECLARE_FEATURE(kAddToHomescreenIPH);
 BASE_DECLARE_FEATURE(kAllowNewIncognitoTabIntents);
 BASE_DECLARE_FEATURE(kAndroidAppIntegration);
+BASE_DECLARE_FEATURE(kAndroidAppIntegrationSafeSearch);
 BASE_DECLARE_FEATURE(kAndroidSearchEngineChoiceNotification);
 BASE_DECLARE_FEATURE(kAndroidImprovedBookmarks);
 BASE_DECLARE_FEATURE(kAnimatedImageDragShadow);
@@ -152,6 +153,7 @@
 BASE_DECLARE_FEATURE(kShowScrollableMVTOnNTPAndroid);
 BASE_DECLARE_FEATURE(kFeedPositionAndroid);
 BASE_DECLARE_FEATURE(kSafeModeForCachedFlags);
+BASE_DECLARE_FEATURE(kScrollToTLDOptimization);
 BASE_DECLARE_FEATURE(kSearchResumptionModuleAndroid);
 BASE_DECLARE_FEATURE(kShouldIgnoreIntentSkipInternalCheck);
 BASE_DECLARE_FEATURE(kShareSheetCustomActionsPolish);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index caefa8c..e734231 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -108,6 +108,8 @@
     public static final String ADD_TO_HOMESCREEN_IPH = "AddToHomescreenIPH";
     public static final String ALLOW_NEW_INCOGNITO_TAB_INTENTS = "AllowNewIncognitoTabIntents";
     public static final String ANDROID_APP_INTEGRATION = "AndroidAppIntegration";
+    public static final String ANDROID_APP_INTEGRATION_SAFE_SEARCH =
+            "AndroidAppIntegrationSafeSearch";
     public static final String ANDROID_SEARCH_ENGINE_CHOICE_NOTIFICATION =
             "AndroidSearchEngineChoiceNotification";
     public static final String ANDROID_IMPROVED_BOOKMARKS = "AndroidImprovedBookmarks";
@@ -127,6 +129,10 @@
             "AutofillEnableNewCardArtAndNetworkImages";
     public static final String AUTOFILL_ENABLE_PAYMENTS_MANDATORY_REAUTH =
             "AutofillEnablePaymentsMandatoryReauth";
+    public static final String AUTOFILL_ENABLE_RANKING_FORMULA_ADDRESS_PROFILES =
+            "AutofillEnableRankingFormulaAddressProfiles";
+    public static final String AUTOFILL_ENABLE_RANKING_FORMULA_CREDIT_CARDS =
+            "AutofillEnableRankingFormulaCreditCards";
     public static final String AUTOFILL_ENABLE_SUPPORT_FOR_HONORIFIC_PREFIXES =
             "AutofillEnableSupportForHonorificPrefixes";
     public static final String AUTOFILL_ENABLE_UPDATE_VIRTUAL_CARD_ENROLLMENT =
@@ -392,6 +398,7 @@
     public static final String SAFE_BROWSING_DELAYED_WARNINGS = "SafeBrowsingDelayedWarnings";
     public static final String SAFE_MODE_FOR_CACHED_FLAGS = "SafeModeForCachedFlags";
     public static final String SCREENSHOTS_FOR_ANDROID_V2 = "ScreenshotsForAndroidV2";
+    public static final String SCROLL_TO_TLD_OPTIMIZATION = "ScrollToTLDOptimization";
     public static final String SEARCH_RESUMPTION_MODULE_ANDROID = "SearchResumptionModuleAndroid";
     public static final String SHOULD_IGNORE_INTENT_SKIP_INTERNAL_CHECK =
             "ShouldIgnoreIntentSkipInternalCheck";
diff --git a/chrome/browser/locale/BUILD.gn b/chrome/browser/locale/BUILD.gn
index 013a143..45b7ce3 100644
--- a/chrome/browser/locale/BUILD.gn
+++ b/chrome/browser/locale/BUILD.gn
@@ -72,6 +72,7 @@
 }
 
 android_library("util_java") {
+  srcjar_deps = [ ":jni_headers" ]
   sources = [
     "java/src/org/chromium/chrome/browser/locale/LocaleTemplateUrlLoader.java",
   ]
@@ -79,7 +80,7 @@
     "//base:jni_java",
     "//build/android:build_java",
   ]
-  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+
   resources_package = "org.chromium.chrome.browser.locale"
 }
 
diff --git a/chrome/browser/page_load_metrics/BUILD.gn b/chrome/browser/page_load_metrics/BUILD.gn
index 6eb931b..c7277b58 100644
--- a/chrome/browser/page_load_metrics/BUILD.gn
+++ b/chrome/browser/page_load_metrics/BUILD.gn
@@ -5,6 +5,7 @@
 import("//build/config/android/rules.gni")
 
 android_library("java") {
+  srcjar_deps = [ ":jni_headers" ]
   sources = [ "java/src/org/chromium/chrome/browser/page_load_metrics/PageLoadMetrics.java" ]
 
   deps = [
@@ -12,7 +13,6 @@
     "//base:jni_java",
     "//content/public/android:content_java",
   ]
-  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 }
 
 generate_jni("jni_headers") {
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn
index 59f5a26..c8d8650 100644
--- a/chrome/browser/resources/BUILD.gn
+++ b/chrome/browser/resources/BUILD.gn
@@ -254,6 +254,10 @@
       "//chrome/browser/resources/webapks:resources",
     ]
   }
+
+  if (is_android || is_linux || is_chromeos || is_win) {
+    public_deps += [ "//chrome/browser/resources/sandbox_internals:resources" ]
+  }
 }
 
 repack("dev_ui_paks") {
@@ -298,5 +302,9 @@
     ]
   }
 
+  if (is_android || is_linux || is_chromeos || is_win) {
+    sources += [ "$root_gen_dir/chrome/sandbox_internals_resources.pak" ]
+  }
+
   deps = [ ":dev_ui_resources" ]
 }
diff --git a/chrome/browser/resources/internals/BUILD.gn b/chrome/browser/resources/internals/BUILD.gn
index 6e23859f4..d05dd8d7 100644
--- a/chrome/browser/resources/internals/BUILD.gn
+++ b/chrome/browser/resources/internals/BUILD.gn
@@ -20,10 +20,12 @@
     deps = [
       "lens:build_grdp",
       "notifications:build_grdp",
+      "query_tiles:build_grdp",
     ]
     grdp_files = [
       "$target_gen_dir/lens/resources.grdp",
       "$target_gen_dir/notifications/resources.grdp",
+      "$target_gen_dir/query_tiles/resources.grdp",
     ]
   }
 }
diff --git a/chrome/browser/resources/internals/lens/BUILD.gn b/chrome/browser/resources/internals/lens/BUILD.gn
index 727bd5b1b..02a48b9 100644
--- a/chrome/browser/resources/internals/lens/BUILD.gn
+++ b/chrome/browser/resources/internals/lens/BUILD.gn
@@ -2,28 +2,23 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//tools/typescript/ts_library.gni")
-import("//ui/webui/resources/tools/generate_grd.gni")
+import("//ui/webui/resources/tools/build_webui.gni")
 
 assert(is_android)
 
-ts_library("build_ts") {
-  root_dir = "."
-  out_dir = "$target_gen_dir/tsc"
-  in_files = [
+build_webui("build") {
+  grd_prefix = "lens_internals"
+
+  static_files = [ "lens_internals.html" ]
+
+  non_web_component_files = [
     "lens_internals.ts",
     "lens_internals_browser_proxy.ts",
   ]
-  definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ]
-  deps = [ "//ui/webui/resources/js:build_ts" ]
-}
 
-generate_grd("build_grdp") {
-  grd_prefix = "lens_internals"
-  out_grd = "$target_gen_dir/resources.grdp"
-  input_files = [ "lens_internals.html" ]
-  input_files_base_dir = rebase_path(".", "//")
-  deps = [ ":build_ts" ]
-  manifest_files =
-      filter_include(get_target_outputs(":build_ts"), [ "*_manifest.json" ])
+  ts_definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ]
+  ts_deps = [ "//ui/webui/resources/js:build_ts" ]
+
+  generate_grdp = true
+  grd_resource_path_prefix = "lens"
 }
diff --git a/chrome/browser/resources/internals/lens/lens_internals.html b/chrome/browser/resources/internals/lens/lens_internals.html
index a06d9f5..1c69153 100644
--- a/chrome/browser/resources/internals/lens/lens_internals.html
+++ b/chrome/browser/resources/internals/lens/lens_internals.html
@@ -21,6 +21,6 @@
     <div id="debug-data-container">
       <table id="debug-data-table" hidden></table>
     </div>
-    <script type="module" src="lens_internals.js"></script>
+    <script type="module" src="/lens/lens_internals.js"></script>
   </body>
 </html>
diff --git a/chrome/browser/resources/internals/notifications/BUILD.gn b/chrome/browser/resources/internals/notifications/BUILD.gn
index a45e8cf..ceb7e5b 100644
--- a/chrome/browser/resources/internals/notifications/BUILD.gn
+++ b/chrome/browser/resources/internals/notifications/BUILD.gn
@@ -2,28 +2,23 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//tools/typescript/ts_library.gni")
-import("//ui/webui/resources/tools/generate_grd.gni")
+import("//ui/webui/resources/tools/build_webui.gni")
 
 assert(is_android)
 
-ts_library("build_ts") {
-  root_dir = "."
-  out_dir = "$target_gen_dir/tsc"
-  in_files = [
+build_webui("build") {
+  grd_prefix = "notifications_internals"
+
+  static_files = [ "notifications_internals.html" ]
+
+  non_web_component_files = [
     "notifications_internals.ts",
     "notifications_internals_browser_proxy.ts",
   ]
-  definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ]
-  deps = [ "//ui/webui/resources/js:build_ts" ]
-}
 
-generate_grd("build_grdp") {
-  grd_prefix = "notifications_internals"
-  out_grd = "$target_gen_dir/resources.grdp"
-  input_files = [ "notifications_internals.html" ]
-  input_files_base_dir = rebase_path(".", "//")
-  deps = [ ":build_ts" ]
-  manifest_files =
-      filter_include(get_target_outputs(":build_ts"), [ "*_manifest.json" ])
+  ts_definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ]
+  ts_deps = [ "//ui/webui/resources/js:build_ts" ]
+
+  generate_grdp = true
+  grd_resource_path_prefix = "notifications"
 }
diff --git a/chrome/browser/resources/internals/notifications/notifications_internals.html b/chrome/browser/resources/internals/notifications/notifications_internals.html
index 7ed87b2..c4f6d36 100644
--- a/chrome/browser/resources/internals/notifications/notifications_internals.html
+++ b/chrome/browser/resources/internals/notifications/notifications_internals.html
@@ -31,6 +31,7 @@
     <div>
       <button id="schedule-notification">Schedule</button>
     </div>
-    <script type="module" src="notifications_internals.js"></script>
+    <script type="module" src="/notifications/notifications_internals.js">
+    </script>
   </body>
 </html>
diff --git a/chrome/browser/resources/internals/query_tiles/BUILD.gn b/chrome/browser/resources/internals/query_tiles/BUILD.gn
index 272d3aed..dbf5b08a 100644
--- a/chrome/browser/resources/internals/query_tiles/BUILD.gn
+++ b/chrome/browser/resources/internals/query_tiles/BUILD.gn
@@ -2,17 +2,23 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//tools/typescript/ts_library.gni")
+import("//ui/webui/resources/tools/build_webui.gni")
 
 assert(is_android)
 
-ts_library("build_ts") {
-  root_dir = "."
-  out_dir = "$target_gen_dir/tsc"
-  in_files = [
+build_webui("build") {
+  grd_prefix = "query_tiles_internals"
+
+  static_files = [ "query_tiles_internals.html" ]
+
+  non_web_component_files = [
     "query_tiles_internals.ts",
     "query_tiles_internals_browser_proxy.ts",
   ]
-  definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ]
-  deps = [ "//ui/webui/resources/js:build_ts" ]
+
+  ts_definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ]
+  ts_deps = [ "//ui/webui/resources/js:build_ts" ]
+
+  generate_grdp = true
+  grd_resource_path_prefix = "query-tiles"
 }
diff --git a/chrome/browser/resources/internals/query_tiles/query_tiles_internals.html b/chrome/browser/resources/internals/query_tiles/query_tiles_internals.html
index 5a4d0907..948d73c 100644
--- a/chrome/browser/resources/internals/query_tiles/query_tiles_internals.html
+++ b/chrome/browser/resources/internals/query_tiles/query_tiles_internals.html
@@ -34,6 +34,6 @@
       Tile proto: <span id="tile-proto"></span>
     <div>
     </div>
-    <script type="module" src="query_tiles_internals.js"></script>
+    <script type="module" src="/query-tiles/query_tiles_internals.js"></script>
   </body>
 </html>
diff --git a/chrome/browser/resources/sandbox_internals/BUILD.gn b/chrome/browser/resources/sandbox_internals/BUILD.gn
index e6734e5..190f7568 100644
--- a/chrome/browser/resources/sandbox_internals/BUILD.gn
+++ b/chrome/browser/resources/sandbox_internals/BUILD.gn
@@ -2,33 +2,21 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//tools/grit/preprocess_if_expr.gni")
-import("//tools/typescript/ts_library.gni")
+import("//ui/webui/resources/tools/build_webui.gni")
 
 assert(is_android || is_linux || is_chromeos || is_win)
 
-preprocess_folder = "preprocessed"
+build_webui("build") {
+  grd_prefix = "sandbox_internals"
+  static_files = [ "sandbox_internals.html" ]
 
-if (is_win) {
-  ts_files = [ "sandbox_internals_win.ts" ]
-} else {
-  ts_files = [ "sandbox_internals.ts" ]
-}
-
-preprocess_if_expr("preprocess") {
-  out_folder = "$target_gen_dir/$preprocess_folder"
-  in_files = ts_files
-}
-
-ts_library("build_ts") {
-  root_dir = "$target_gen_dir/$preprocess_folder"
-  out_dir = "$target_gen_dir/tsc"
-  in_files = ts_files
-
-  if (is_android) {
-    definitions = [ "./sandbox_android.d.ts" ]
+  if (is_win) {
+    non_web_component_files = [ "sandbox_internals_win.ts" ]
+  } else {
+    non_web_component_files = [ "sandbox_internals.ts" ]
   }
-
-  deps = [ "//ui/webui/resources/js:build_ts" ]
-  extra_deps = [ ":preprocess" ]
+  ts_deps = [ "//ui/webui/resources/js:build_ts" ]
+  if (is_android) {
+    ts_definitions = [ "./sandbox_android.d.ts" ]
+  }
 }
diff --git a/chrome/browser/resources/sandbox_internals/sandbox_internals.html b/chrome/browser/resources/sandbox_internals/sandbox_internals.html
index eb67433..388c65c 100644
--- a/chrome/browser/resources/sandbox_internals/sandbox_internals.html
+++ b/chrome/browser/resources/sandbox_internals/sandbox_internals.html
@@ -41,7 +41,12 @@
       }
 </if>
     </style>
+<if expr="not is_win">
     <script type="module" src="sandbox_internals.js"></script>
+</if>
+<if expr="is_win">
+    <script type="module" src="sandbox_internals_win.js"></script>
+</if>
   </head>
   <body>
     <h1>Sandbox Status</h1>
diff --git a/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.html b/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.html
index e25fecd..7e2e70d 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.html
+++ b/chrome/browser/resources/settings/chromeos/device_page/per_device_keyboard.html
@@ -108,7 +108,7 @@
 </template>
 <cr-link-row id="keyboardShortcutViewer" class="hr"
     on-click="onShowKeyboardShortcutViewerClick"
-    label="$i18n{viewAndCustomizeKeyboardShortcut}"
+    label="$i18n{showKeyboardShortcutViewer}"
     external
     deep-link-focus-id$="[[Setting.kKeyboardShortcuts]]">
 </cr-link-row>
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.ts b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.ts
index 5b8715c..e7c85f0 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.ts
+++ b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.ts
@@ -44,7 +44,7 @@
   canBeDisabled: boolean|undefined;
 }
 
-interface NetworkProxySectionElement {
+export interface NetworkProxySectionElement {
   $: {
     allowShared: SettingsToggleButtonElement,
     confirmAllowSharedDialog: CrDialogElement,
@@ -60,7 +60,7 @@
     Constructor<PolymerElement&I18nMixinInterface&RouteObserverMixinInterface&
                 PrefsMixinInterface&CrPolicyNetworkBehaviorMojoInterface>;
 
-class NetworkProxySectionElement extends NetworkProxySectionElementBase {
+export class NetworkProxySectionElement extends NetworkProxySectionElementBase {
   static get is() {
     return 'network-proxy-section' as const;
   }
diff --git a/chrome/browser/resources/settings/chromeos/lazy_load.ts b/chrome/browser/resources/settings/chromeos/lazy_load.ts
index a68aa2f..c81cd5b 100644
--- a/chrome/browser/resources/settings/chromeos/lazy_load.ts
+++ b/chrome/browser/resources/settings/chromeos/lazy_load.ts
@@ -133,6 +133,7 @@
 export {SettingsGuestOsSharedUsbDevicesElement} from './guest_os/guest_os_shared_usb_devices.js';
 export {SettingsHotspotSubpageElement} from './internet_page/hotspot_subpage.js';
 export {NetworkAlwaysOnVpnElement} from './internet_page/network_always_on_vpn.js';
+export {NetworkProxySectionElement} from './internet_page/network_proxy_section.js';
 export {SettingsPasspointSubpageElement} from './internet_page/passpoint_subpage.js';
 export {TetherConnectionDialogElement} from './internet_page/tether_connection_dialog.js';
 export {KerberosAccount, KerberosAccountsBrowserProxy, KerberosAccountsBrowserProxyImpl, KerberosConfigErrorCode, KerberosErrorType, ValidateKerberosConfigResult} from './kerberos_page/kerberos_accounts_browser_proxy.js';
diff --git a/chrome/browser/resources/side_panel/companion/companion.ts b/chrome/browser/resources/side_panel/companion/companion.ts
index ebed8e6..3f8e53d7 100644
--- a/chrome/browser/resources/side_panel/companion/companion.ts
+++ b/chrome/browser/resources/side_panel/companion/companion.ts
@@ -8,7 +8,7 @@
 import {loadTimeData} from '//resources/js/load_time_data.js';
 import {Url} from '//resources/mojo/url/mojom/url.mojom-webui.js';
 
-import {ImageQuery, MethodType, PromoAction, PromoType} from './companion.mojom-webui.js';
+import {ImageQuery, MethodType, PromoAction, PromoType, VisualSearchResult} from './companion.mojom-webui.js';
 import {CompanionProxy, CompanionProxyImpl} from './companion_proxy.js';
 
 /**
@@ -62,6 +62,9 @@
 
   // Arguments for sending text find results from browser to iframe.
   CQ_TEXT_FIND_RESULTS = 'cqTextFindResults',
+
+  // Arguments for sending Visual Search results from browser to iframe.
+  VISUAL_SEARCH_PARAMS = 'visualSearchParams',
 }
 
 const companionProxy: CompanionProxy = CompanionProxyImpl.getInstance();
@@ -168,6 +171,21 @@
   companionProxy.handler.showUI();
 }
 
+// POST dataUris from the Visual Search classification results to the iframe
+companionProxy.callbackRouter.onDeviceVisualClassificationResult.addListener(
+    (results: VisualSearchResult[]) => {
+      const dataUris = results.map(result => result.dataUri);
+      const message = {[ParamType.VISUAL_SEARCH_PARAMS]: dataUris};
+
+      const companionOrigin =
+          new URL(loadTimeData.getString('companion_origin')).origin;
+      const frame = document.body.querySelector('iframe');
+      assert(frame);
+      if (frame.contentWindow) {
+        frame.contentWindow.postMessage(message, companionOrigin);
+      }
+    });
+
 // Handler for postMessage() calls from the embedded iframe.
 function onCompanionMessageEvent(event: MessageEvent) {
   // Because the |companion_origin| string has a trailing slash that can cause
diff --git a/chrome/browser/speech/speech_recognition_recognizer_client_impl.cc b/chrome/browser/speech/speech_recognition_recognizer_client_impl.cc
index ea3cd13..4c00ff0 100644
--- a/chrome/browser/speech/speech_recognition_recognizer_client_impl.cc
+++ b/chrome/browser/speech/speech_recognition_recognizer_client_impl.cc
@@ -164,6 +164,7 @@
           "fr-CA",           // French (Canada)
           "fr-CH",           // French (Switzerland)
           "fr-FR",           // French (France)
+          "id",              // Indonesian
           "it",              // Italian
           "it-CH",           // Italian (Switzerland)
           "it-IT",           // Italian (Italy)
@@ -172,6 +173,7 @@
           "pt",              // Portuguese
           "pt-BR",           // Portuguese (Brazil)
           "pt-PT",           // Portuguese (Portugal)
+          "ru",              // Russian
           "sv",              // Swedish
           "tr",              // Turkish
       });
diff --git a/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc b/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc
index 87f713d..d801e7c0 100644
--- a/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc
+++ b/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc
@@ -5,8 +5,6 @@
 #include "chrome/browser/storage_access_api/storage_access_grant_permission_context.h"
 
 #include "base/barrier_callback.h"
-#include "base/run_loop.h"
-#include "base/test/bind.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_future.h"
@@ -128,13 +126,13 @@
 
     DIPSService* dips_service = DIPSService::Get(browser_context());
     CHECK(dips_service);
-    base::RunLoop run_loop;
+    base::test::TestFuture<void> future;
     dips_service->storage()
         ->AsyncCall(&DIPSStorage::RecordInteraction)
         .WithArgs(GetRequesterURL(), base::Time::Now(),
                   DIPSCookieMode::kBlock3PC)
-        .Then(run_loop.QuitClosure());
-    run_loop.Run();
+        .Then(future.GetCallback());
+    ASSERT_TRUE(future.Wait());
   }
 
   void TearDown() override {
@@ -405,19 +403,15 @@
 
     const int implicit_grant_limit =
         blink::features::kStorageAccessAPIImplicitGrantLimit.Get();
-    base::RunLoop run_loop;
-    auto barrier = base::BarrierCallback<ContentSetting>(
-        implicit_grant_limit,
-        base::BindLambdaForTesting(
-            [&](const std::vector<ContentSetting> results) {
-              run_loop.Quit();
-            }));
+    base::test::TestFuture<const std::vector<ContentSetting>> future;
+    auto barrier = base::BarrierCallback<ContentSetting>(implicit_grant_limit,
+                                                         future.GetCallback());
     for (int grant_id = 0; grant_id < implicit_grant_limit; grant_id++) {
       permission_context.DecidePermissionForTesting(
           fake_id, requesting_origin, GetDummyEmbeddingUrl(grant_id),
           /*user_gesture=*/true, barrier);
     }
-    run_loop.Run();
+    ASSERT_TRUE(future.Wait());
     EXPECT_FALSE(request_manager()->IsRequestInProgress());
   }
 
diff --git a/chrome/browser/tab/BUILD.gn b/chrome/browser/tab/BUILD.gn
index 06c5d71..79f095f 100644
--- a/chrome/browser/tab/BUILD.gn
+++ b/chrome/browser/tab/BUILD.gn
@@ -59,6 +59,8 @@
   ]
 
   srcjar_deps = [
+    ":jni_headers",
+
     # TabSelectionType, TabLaunchType
     "//chrome/browser/ui:tab_model_enums_java",
 
@@ -111,7 +113,6 @@
     "//url:origin_java",
   ]
 
-  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   resources_package = "org.chromium.chrome.browser.tab"
 }
 
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
index 3bd9977..9cf2e14e6 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
@@ -9,6 +9,7 @@
 import android.graphics.Paint;
 import android.graphics.Rect;
 import android.os.Build;
+import android.os.SystemClock;
 import android.provider.Settings;
 import android.text.Editable;
 import android.text.InputType;
@@ -39,8 +40,11 @@
 import org.chromium.base.SysUtils;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.compat.ApiHelperForO;
+import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.browser.back_press.BackPressManager;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.flags.MutableFlagWithSafeDefault;
 import org.chromium.components.browser_ui.share.ShareHelper;
 import org.chromium.components.browser_ui.util.FirstDrawDetector;
 import org.chromium.ui.KeyboardVisibilityDelegate;
@@ -62,6 +66,9 @@
     private static final int MAX_DISPLAYABLE_LENGTH = 4000;
     private static final int MAX_DISPLAYABLE_LENGTH_LOW_END = 1000;
 
+    private static final MutableFlagWithSafeDefault sScrollToTLDOptimizationsFlag =
+            new MutableFlagWithSafeDefault(ChromeFeatureList.SCROLL_TO_TLD_OPTIMIZATION, false);
+
     // Stylus handwriting: Setting this ime option instructs stylus writing service to restrict
     // capturing writing events slightly outside the Url bar area. This is needed to prevent stylus
     // handwriting in inputs in web content area that are very close to url bar area, from being
@@ -685,6 +692,18 @@
         scrollDisplayTextInternal(mScrollType);
     }
 
+    private boolean isVisibleTextTheSame(Editable text) {
+        if (text == null) {
+            return false;
+        }
+
+        if (mVisibleTextPrefixHint != null) {
+            return TextUtils.indexOf(text, mVisibleTextPrefixHint) == 0;
+        }
+
+        return TextUtils.equals(text, mPreviousScrollText);
+    }
+
     /**
      * Scrolls the omnibox text to the position specified, based on the {@link ScrollType}.
      *
@@ -708,19 +727,23 @@
         boolean currentIsRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
 
         int measuredWidth = getVisibleMeasuredViewportWidth();
-        if (scrollType == mPreviousScrollType && TextUtils.equals(text, mPreviousScrollText)
+
+        if (scrollType == mPreviousScrollType
                 && measuredWidth == mPreviousScrollViewWidth
                 // Font size is float but it changes in discrete range (eg small font, big font),
                 // therefore false negative using regular equality is unlikely.
                 && currentTextSize == mPreviousScrollFontSize
-                && currentIsRtl == mPreviousScrollWasRtl) {
+                && currentIsRtl == mPreviousScrollWasRtl && isVisibleTextTheSame(text)) {
             scrollTo(mPreviousScrollResultXPosition, getScrollY());
             return;
         }
 
         switch (scrollType) {
             case ScrollType.SCROLL_TO_TLD:
+                final long startTime = SystemClock.elapsedRealtime();
                 scrollToTLD();
+                RecordHistogram.recordTimesHistogram(
+                        "Omnibox.ScrollToTLD.Duration", SystemClock.elapsedRealtime() - startTime);
                 break;
             case ScrollType.SCROLL_TO_BEGINNING:
                 scrollToBeginning();
@@ -809,10 +832,7 @@
                 mVisibleTextPrefixHint =
                         url.subSequence(0, Math.min(originEndIndex + 1, urlTextLength));
             } else {
-                int finalVisibleCharIndex = textLayout.getOffsetForHorizontal(0, measuredWidth);
-                if (finalVisibleCharIndex == urlTextLength
-                        && textLayout.getPrimaryHorizontal(finalVisibleCharIndex)
-                                <= measuredWidth) {
+                if (textLayout.getPrimaryHorizontal(urlTextLength) <= measuredWidth) {
                     // Only store the visibility hint if the text is wider than the viewport. Text
                     // narrower than the viewport is not a useful hint because a consumer would not
                     // understand if a subsequent character would be visible on screen or not.
@@ -823,6 +843,18 @@
                     // padding.
                     mVisibleTextPrefixHint = null;
                 } else {
+                    int finalVisibleCharIndex;
+                    if (sScrollToTLDOptimizationsFlag.isEnabled()) {
+                        // getOffsetForHorizontal is very slow. getOffsetForAdvance is much faster.
+                        finalVisibleCharIndex = textLayout.getPaint().getOffsetForAdvance(
+                                url, 0, urlTextLength, 0, urlTextLength, false, measuredWidth);
+                        assert finalVisibleCharIndex
+                                == textLayout.getOffsetForHorizontal(0, measuredWidth)
+                            : "scrollToTLD incorrect optimized finalVisibleCharIndex";
+                    } else {
+                        finalVisibleCharIndex = textLayout.getOffsetForHorizontal(0, measuredWidth);
+                    }
+
                     // To avoid issues where a small portion of the character following
                     // finalVisibleCharIndex is visible on screen, be more conservative and extend
                     // the visual hint by an additional character. In testing,
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUiUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUiUnitTest.java
index 7425918c..a34ed22 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUiUnitTest.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUiUnitTest.java
@@ -175,7 +175,7 @@
 
         updateUrlBarText(
                 getUrlText() + "/foooooo", UrlBar.ScrollType.SCROLL_TO_TLD, domain.length());
-        assertTextEquals(urlText + "/", getVisibleTextPrefixHint());
+        assertTextEquals(urlText, getVisibleTextPrefixHint());
     }
 
     @Test
diff --git a/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.cc b/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.cc
index bf526e3..ac4851e3 100644
--- a/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.cc
+++ b/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.cc
@@ -4,14 +4,21 @@
 
 #include "chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.h"
 
+#include <algorithm>
+#include <functional>
 #include <memory>
 #include <string>
 #include <utility>
+#include <vector>
 
 #include "ash/glanceables/classroom/glanceables_classroom_types.h"
+#include "base/barrier_closure.h"
 #include "base/check.h"
+#include "base/containers/flat_map.h"
 #include "base/functional/bind.h"
+#include "base/functional/callback_forward.h"
 #include "base/functional/callback_helpers.h"
+#include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
 #include "base/types/expected.h"
 #include "google_apis/classroom/classroom_api_course_work_response_types.h"
@@ -116,6 +123,21 @@
   return GlanceablesClassroomStudentSubmission::State::kOther;
 }
 
+// TODO(b/283369115): consider doing this only once after fetching all
+// submissions.
+base::flat_map<std::string, std::vector<GlanceablesClassroomStudentSubmission*>>
+GroupStudentSubmissionsByCourseWorkId(
+    const std::vector<std::unique_ptr<GlanceablesClassroomStudentSubmission>>&
+        student_submissions) {
+  base::flat_map<std::string,
+                 std::vector<GlanceablesClassroomStudentSubmission*>>
+      grouped_submissions;
+  for (const auto& submission : student_submissions) {
+    grouped_submissions[submission->course_work_id].push_back(submission.get());
+  }
+  return grouped_submissions;
+}
+
 }  // namespace
 
 GlanceablesClassroomClientImpl::GlanceablesClassroomClientImpl(
@@ -125,38 +147,113 @@
 
 GlanceablesClassroomClientImpl::~GlanceablesClassroomClientImpl() = default;
 
+void GlanceablesClassroomClientImpl::IsStudentRoleActive(
+    IsRoleEnabledCallback callback) {
+  CHECK(callback);
+
+  InvokeOnceStudentDataFetched(base::BindOnce(
+      [](base::WeakPtr<GlanceablesClassroomClientImpl> self,
+         base::OnceCallback<void(bool active)> callback) {
+        if (!self) {
+          std::move(callback).Run(false);
+          return;
+        }
+        std::move(callback).Run(!self->student_courses_.empty());
+      },
+      weak_factory_.GetWeakPtr(), std::move(callback)));
+}
+
+void GlanceablesClassroomClientImpl::GetCompletedStudentAssignments(
+    GetStudentAssignmentsCallback callback) {
+  CHECK(callback);
+
+  auto due_predicate = base::BindRepeating(
+      [](const absl::optional<base::Time>& due) { return true; });
+  auto submission_state_predicate = base::BindRepeating(
+      [](GlanceablesClassroomStudentSubmission::State state) {
+        return state ==
+                   GlanceablesClassroomStudentSubmission::State::kTurnedIn ||
+               state == GlanceablesClassroomStudentSubmission::State::kGraded;
+      });
+  InvokeOnceStudentDataFetched(base::BindOnce(
+      &GlanceablesClassroomClientImpl::GetFilteredStudentAssignments,
+      weak_factory_.GetWeakPtr(), std::move(due_predicate),
+      std::move(submission_state_predicate), std::move(callback)));
+}
+
+void GlanceablesClassroomClientImpl::
+    GetStudentAssignmentsWithApproachingDueDate(
+        GetStudentAssignmentsCallback callback) {
+  CHECK(callback);
+
+  auto due_predicate = base::BindRepeating(
+      [](const base::Time& now, const absl::optional<base::Time>& due) {
+        return due.has_value() && now < due.value();
+      },
+      base::Time::Now());
+  auto submission_state_predicate = base::BindRepeating(
+      [](GlanceablesClassroomStudentSubmission::State state) {
+        return state == GlanceablesClassroomStudentSubmission::State::kAssigned;
+      });
+  InvokeOnceStudentDataFetched(base::BindOnce(
+      &GlanceablesClassroomClientImpl::GetFilteredStudentAssignments,
+      weak_factory_.GetWeakPtr(), std::move(due_predicate),
+      std::move(submission_state_predicate), std::move(callback)));
+}
+
+void GlanceablesClassroomClientImpl::GetStudentAssignmentsWithMissedDueDate(
+    GetStudentAssignmentsCallback callback) {
+  CHECK(callback);
+
+  auto due_predicate = base::BindRepeating(
+      [](const base::Time& now, const absl::optional<base::Time>& due) {
+        return due.has_value() && now > due.value();
+      },
+      base::Time::Now());
+  auto submission_state_predicate = base::BindRepeating(
+      [](GlanceablesClassroomStudentSubmission::State state) {
+        return state == GlanceablesClassroomStudentSubmission::State::kAssigned;
+      });
+  InvokeOnceStudentDataFetched(base::BindOnce(
+      &GlanceablesClassroomClientImpl::GetFilteredStudentAssignments,
+      weak_factory_.GetWeakPtr(), std::move(due_predicate),
+      std::move(submission_state_predicate), std::move(callback)));
+}
+
+void GlanceablesClassroomClientImpl::GetStudentAssignmentsWithoutDueDate(
+    GetStudentAssignmentsCallback callback) {
+  CHECK(callback);
+
+  auto due_predicate = base::BindRepeating(
+      [](const absl::optional<base::Time>& due) { return !due.has_value(); });
+  auto submission_state_predicate = base::BindRepeating(
+      [](GlanceablesClassroomStudentSubmission::State state) {
+        return state == GlanceablesClassroomStudentSubmission::State::kAssigned;
+      });
+  InvokeOnceStudentDataFetched(base::BindOnce(
+      &GlanceablesClassroomClientImpl::GetFilteredStudentAssignments,
+      weak_factory_.GetWeakPtr(), std::move(due_predicate),
+      std::move(submission_state_predicate), std::move(callback)));
+}
+
 void GlanceablesClassroomClientImpl::FetchStudentCourses(
     FetchCoursesCallback callback) {
   CHECK(callback);
 
-  if (student_courses_) {
-    // Invoke callback immediately with previously cached student courses.
-    std::move(callback).Run(student_courses_.get());
-    return;
-  }
-
-  student_courses_ =
-      std::make_unique<ui::ListModel<GlanceablesClassroomCourse>>();
-  FetchCoursesPage(/*student_id=*/kOwnCoursesFilterValue, /*teacher_id=*/"",
-                   /*page_token=*/"", student_courses_.get(),
-                   std::move(callback));
+  student_courses_.clear();
+  FetchCoursesPage(
+      /*student_id=*/kOwnCoursesFilterValue, /*teacher_id=*/"",
+      /*page_token=*/"", student_courses_, std::move(callback));
 }
 
 void GlanceablesClassroomClientImpl::FetchTeacherCourses(
     FetchCoursesCallback callback) {
   CHECK(callback);
 
-  if (teacher_courses_) {
-    // Invoke callback immediately with previously cached teacher courses.
-    std::move(callback).Run(teacher_courses_.get());
-    return;
-  }
-
-  teacher_courses_ =
-      std::make_unique<ui::ListModel<GlanceablesClassroomCourse>>();
-  FetchCoursesPage(/*student_id=*/"", /*teacher_id=*/kOwnCoursesFilterValue,
-                   /*page_token=*/"", teacher_courses_.get(),
-                   std::move(callback));
+  teacher_courses_.clear();
+  FetchCoursesPage(
+      /*student_id=*/"", /*teacher_id=*/kOwnCoursesFilterValue,
+      /*page_token=*/"", teacher_courses_, std::move(callback));
 }
 
 void GlanceablesClassroomClientImpl::FetchCourseWork(
@@ -167,12 +264,9 @@
 
   const auto [iter, inserted] = course_work_.emplace(
       course_id,
-      std::make_unique<ui::ListModel<GlanceablesClassroomCourseWorkItem>>());
-
+      std::vector<std::unique_ptr<GlanceablesClassroomCourseWorkItem>>());
   if (!inserted) {
-    // Invoke callback immediately with previously cached course work items.
-    std::move(callback).Run(iter->second.get());
-    return;
+    iter->second.clear();
   }
 
   FetchCourseWorkPage(course_id, /*page_token=*/"", std::move(callback));
@@ -186,26 +280,43 @@
 
   const auto [iter, inserted] = student_submissions_.emplace(
       course_id,
-      std::make_unique<ui::ListModel<GlanceablesClassroomStudentSubmission>>());
-
+      std::vector<std::unique_ptr<GlanceablesClassroomStudentSubmission>>());
   if (!inserted) {
-    // Invoke callback immediately with previously cached student submissions.
-    std::move(callback).Run(iter->second.get());
-    return;
+    iter->second.clear();
   }
 
   FetchStudentSubmissionsPage(course_id, /*page_token=*/"",
                               std::move(callback));
 }
 
+void GlanceablesClassroomClientImpl::InvokeOnceStudentDataFetched(
+    base::OnceClosure callback) {
+  CHECK(callback);
+
+  if (student_data_fetch_status_ == FetchStatus::kFetched) {
+    std::move(callback).Run();
+    return;
+  }
+
+  callbacks_waiting_for_student_data_.push_back(std::move(callback));
+
+  if (student_data_fetch_status_ == FetchStatus::kNotFetched) {
+    student_data_fetch_status_ = FetchStatus::kFetching;
+    FetchStudentCourses(base::BindOnce(
+        &GlanceablesClassroomClientImpl::OnCoursesFetched,
+        weak_factory_.GetWeakPtr(),
+        base::BindOnce(&GlanceablesClassroomClientImpl::OnStudentDataFetched,
+                       weak_factory_.GetWeakPtr())));
+  }
+}
+
 void GlanceablesClassroomClientImpl::FetchCoursesPage(
     const std::string& student_id,
     const std::string& teacher_id,
     const std::string& page_token,
-    ui::ListModel<GlanceablesClassroomCourse>* courses_container,
+    std::vector<std::unique_ptr<GlanceablesClassroomCourse>>& courses_container,
     FetchCoursesCallback callback) {
   CHECK(!student_id.empty() || !teacher_id.empty());
-  CHECK(courses_container);
   CHECK(callback);
 
   auto* const request_sender = GetRequestSender();
@@ -214,33 +325,30 @@
           request_sender, student_id, teacher_id, page_token,
           base::BindOnce(&GlanceablesClassroomClientImpl::OnCoursesPageFetched,
                          weak_factory_.GetWeakPtr(), student_id, teacher_id,
-                         courses_container, std::move(callback))));
+                         std::ref(courses_container), std::move(callback))));
 }
 
 void GlanceablesClassroomClientImpl::OnCoursesPageFetched(
     const std::string& student_id,
     const std::string& teacher_id,
-    ui::ListModel<GlanceablesClassroomCourse>* courses_container,
+    std::vector<std::unique_ptr<GlanceablesClassroomCourse>>& courses_container,
     FetchCoursesCallback callback,
     base::expected<std::unique_ptr<Courses>, ApiErrorCode> result) {
   CHECK(!student_id.empty() || !teacher_id.empty());
-  CHECK(courses_container);
   CHECK(callback);
 
   if (!result.has_value()) {
     // TODO(b/282013130): handle failures of a single page fetch request more
     // gracefully (retry and/or reflect errors on UI).
-    courses_container->DeleteAll();
+    courses_container.clear();
     std::move(callback).Run(courses_container);
     return;
   }
 
   for (const auto& item : result.value()->items()) {
     if (item->state() == Course::State::kActive) {
-      courses_container->Add(std::make_unique<GlanceablesClassroomCourse>(
+      courses_container.push_back(std::make_unique<GlanceablesClassroomCourse>(
           item->id(), item->name()));
-      FetchCourseWork(item->id(), base::DoNothing());
-      FetchStudentSubmissions(item->id(), base::DoNothing());
     }
   }
 
@@ -252,6 +360,35 @@
   }
 }
 
+void GlanceablesClassroomClientImpl::OnCoursesFetched(
+    base::OnceClosure on_course_work_and_student_submissions_fetched,
+    const std::vector<std::unique_ptr<GlanceablesClassroomCourse>>& courses) {
+  CHECK(on_course_work_and_student_submissions_fetched);
+
+  // `FetchCourseWork()` + `FetchStudentSubmissions()` per course.
+  const auto expected_callback_calls = courses.size() * 2;
+  const auto barrier_closure = base::BarrierClosure(
+      expected_callback_calls,
+      std::move(on_course_work_and_student_submissions_fetched));
+
+  for (const auto& course : courses) {
+    // Helps to prevent the presubmit error. Otherwise it thinks explicit
+    // `std::unique_ptr` constructor is called with `barrier_closure` and asks
+    // to use `std::make_unique<T>()` or `base::WrapUnique` instead. Looks like
+    // a false-positive regular expression match.
+    using FetchCourseWorkIgnoredArg =
+        const std::vector<std::unique_ptr<GlanceablesClassroomCourseWorkItem>>&;
+    using FetchStudentSubmissionsIgnoredArg = const std::vector<
+        std::unique_ptr<GlanceablesClassroomStudentSubmission>>&;
+
+    FetchCourseWork(course->id, base::IgnoreArgs<FetchCourseWorkIgnoredArg>(
+                                    barrier_closure));
+    FetchStudentSubmissions(
+        course->id,
+        base::IgnoreArgs<FetchStudentSubmissionsIgnoredArg>(barrier_closure));
+  }
+}
+
 void GlanceablesClassroomClientImpl::FetchCourseWorkPage(
     const std::string& course_id,
     const std::string& page_token,
@@ -280,21 +417,22 @@
   if (!result.has_value()) {
     // TODO(b/282013130): handle failures of a single page fetch request more
     // gracefully (retry and/or reflect errors on UI).
-    iter->second->DeleteAll();
-    std::move(callback).Run(iter->second.get());
+    iter->second.clear();
+    std::move(callback).Run(iter->second);
     return;
   }
 
   for (const auto& item : result.value()->items()) {
     if (item->state() == CourseWorkItem::State::kPublished) {
-      iter->second->Add(std::make_unique<GlanceablesClassroomCourseWorkItem>(
-          item->id(), item->title(), item->alternate_link(),
-          ConvertCourseWorkItemDue(item->due_date_time())));
+      iter->second.push_back(
+          std::make_unique<GlanceablesClassroomCourseWorkItem>(
+              item->id(), item->title(), item->alternate_link(),
+              ConvertCourseWorkItemDue(item->due_date_time())));
     }
   }
 
   if (result.value()->next_page_token().empty()) {
-    std::move(callback).Run(iter->second.get());
+    std::move(callback).Run(iter->second);
   } else {
     FetchCourseWorkPage(course_id, result.value()->next_page_token(),
                         std::move(callback));
@@ -330,25 +468,85 @@
   if (!result.has_value()) {
     // TODO(b/282013130): handle failures of a single page fetch request more
     // gracefully (retry and/or reflect errors on UI).
-    iter->second->DeleteAll();
-    std::move(callback).Run(iter->second.get());
+    iter->second.clear();
+    std::move(callback).Run(iter->second);
     return;
   }
 
   for (const auto& item : result.value()->items()) {
-    iter->second->Add(std::make_unique<GlanceablesClassroomStudentSubmission>(
-        item->id(), item->course_work_id(),
-        CalculateStudentSubmissionState(item)));
+    iter->second.push_back(
+        std::make_unique<GlanceablesClassroomStudentSubmission>(
+            item->id(), item->course_work_id(),
+            CalculateStudentSubmissionState(item)));
   }
 
   if (result.value()->next_page_token().empty()) {
-    std::move(callback).Run(iter->second.get());
+    std::move(callback).Run(iter->second);
   } else {
     FetchStudentSubmissionsPage(course_id, result.value()->next_page_token(),
                                 std::move(callback));
   }
 }
 
+void GlanceablesClassroomClientImpl::OnStudentDataFetched() {
+  student_data_fetch_status_ = FetchStatus::kFetched;
+  for (auto& cb : callbacks_waiting_for_student_data_) {
+    std::move(cb).Run();
+  }
+}
+
+void GlanceablesClassroomClientImpl::GetFilteredStudentAssignments(
+    base::RepeatingCallback<bool(const absl::optional<base::Time>&)>
+        due_predicate,
+    base::RepeatingCallback<bool(GlanceablesClassroomStudentSubmission::State)>
+        submission_state_predicate,
+    GetStudentAssignmentsCallback callback) {
+  CHECK(due_predicate);
+  CHECK(submission_state_predicate);
+  CHECK(callback);
+
+  std::vector<std::unique_ptr<GlanceablesClassroomStudentAssignment>>
+      filtered_assignments;
+
+  for (const auto& course : student_courses_) {
+    const auto course_work_iter = course_work_.find(course->id);
+    const auto submissions_iter = student_submissions_.find(course->id);
+    if (course_work_iter == course_work_.end() ||
+        submissions_iter == student_submissions_.end()) {
+      continue;
+    }
+
+    const auto submissions =
+        GroupStudentSubmissionsByCourseWorkId(submissions_iter->second);
+
+    for (const auto& course_work_item : course_work_iter->second) {
+      if (!due_predicate.Run(course_work_item->due)) {
+        continue;
+      }
+
+      const auto submission_iter = submissions.find(course_work_item->id);
+      if (submission_iter == submissions.end()) {
+        continue;
+      }
+
+      // There should be only one iteration, because course work item and
+      // student submission have 1:1 relationship for students.
+      for (const auto* const submission : submission_iter->second) {
+        if (!submission_state_predicate.Run(submission->state)) {
+          continue;
+        }
+
+        filtered_assignments.push_back(
+            std::make_unique<GlanceablesClassroomStudentAssignment>(
+                course->name, course_work_item->title, course_work_item->link,
+                course_work_item->due));
+      }
+    }
+  }
+
+  std::move(callback).Run(std::move(filtered_assignments));
+}
+
 RequestSender* GlanceablesClassroomClientImpl::GetRequestSender() {
   if (!request_sender_) {
     CHECK(create_request_sender_callback_);
diff --git a/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.h b/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.h
index 53fc984..83cd8b91 100644
--- a/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.h
+++ b/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl.h
@@ -10,13 +10,15 @@
 #include <vector>
 
 #include "ash/glanceables/classroom/glanceables_classroom_client.h"
+#include "ash/glanceables/classroom/glanceables_classroom_types.h"
 #include "base/containers/flat_map.h"
 #include "base/functional/callback_forward.h"
+#include "base/gtest_prod_util.h"
 #include "base/memory/weak_ptr.h"
 #include "base/types/expected.h"
 #include "google_apis/common/api_error_codes.h"
 #include "google_apis/common/request_sender.h"
-#include "ui/base/models/list_model.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace google_apis::classroom {
 class Courses;
@@ -30,10 +32,6 @@
 
 namespace ash {
 
-struct GlanceablesClassroomCourse;
-struct GlanceablesClassroomCourseWorkItem;
-struct GlanceablesClassroomStudentSubmission;
-
 // Provides implementation for `GlanceablesClassroomClient`. Responsible for
 // communication with Google Classroom API.
 class GlanceablesClassroomClientImpl : public GlanceablesClassroomClient {
@@ -44,26 +42,58 @@
           const std::vector<std::string>& scopes,
           const net::NetworkTrafficAnnotationTag& traffic_annotation_tag)>;
 
-  // Done callback for fetching all courses for student or teacher roles.
-  using FetchCoursesCallback = base::OnceCallback<void(
-      ui::ListModel<GlanceablesClassroomCourse>* courses)>;
-
-  // Done callback for fetching all course work items in a course.
-  using FetchCourseWorkCallback = base::OnceCallback<void(
-      ui::ListModel<GlanceablesClassroomCourseWorkItem>* course_work)>;
-
-  // Done callback for fetching all student submissions in a course.
-  using FetchStudentSubmissionsCallback = base::OnceCallback<void(
-      ui::ListModel<GlanceablesClassroomStudentSubmission>*
-          student_submissions)>;
-
   explicit GlanceablesClassroomClientImpl(
       const CreateRequestSenderCallback& create_request_sender_callback);
   GlanceablesClassroomClientImpl(const GlanceablesClassroomClientImpl&) =
       delete;
   GlanceablesClassroomClientImpl& operator=(
       const GlanceablesClassroomClientImpl&) = delete;
-  ~GlanceablesClassroomClientImpl();
+  ~GlanceablesClassroomClientImpl() override;
+
+  // GlanceablesClassroomClient:
+  void IsStudentRoleActive(IsRoleEnabledCallback callback) override;
+  void GetCompletedStudentAssignments(
+      GetStudentAssignmentsCallback callback) override;
+  void GetStudentAssignmentsWithApproachingDueDate(
+      GetStudentAssignmentsCallback callback) override;
+  void GetStudentAssignmentsWithMissedDueDate(
+      GetStudentAssignmentsCallback callback) override;
+  void GetStudentAssignmentsWithoutDueDate(
+      GetStudentAssignmentsCallback callback) override;
+
+ private:
+  FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest, FetchCourses);
+  FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest,
+                           FetchCoursesOnHttpError);
+  FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest,
+                           FetchCoursesMultiplePages);
+  FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest, FetchCourseWork);
+  FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest,
+                           FetchCourseWorkOnHttpError);
+  FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest,
+                           FetchCourseWorkMultiplePages);
+  FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest,
+                           FetchStudentSubmissions);
+  FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest,
+                           FetchStudentSubmissionsOnHttpError);
+  FRIEND_TEST_ALL_PREFIXES(GlanceablesClassroomClientImplTest,
+                           FetchStudentSubmissionsMultiplePages);
+
+  // Done callback for fetching all courses for student or teacher roles.
+  using FetchCoursesCallback = base::OnceCallback<void(
+      const std::vector<std::unique_ptr<GlanceablesClassroomCourse>>& courses)>;
+
+  // Done callback for fetching all course work items in a course.
+  using FetchCourseWorkCallback = base::OnceCallback<void(
+      const std::vector<std::unique_ptr<GlanceablesClassroomCourseWorkItem>>&
+          course_work)>;
+
+  // Done callback for fetching all student submissions in a course.
+  using FetchStudentSubmissionsCallback = base::OnceCallback<void(
+      const std::vector<std::unique_ptr<GlanceablesClassroomStudentSubmission>>&
+          student_submissions)>;
+
+  enum class FetchStatus { kNotFetched, kFetching, kFetched };
 
   // Fetches all courses for student and teacher roles and invokes `callback`
   // when done.
@@ -80,7 +110,9 @@
   void FetchStudentSubmissions(const std::string& course_id,
                                FetchStudentSubmissionsCallback callback);
 
- private:
+  // Delays executing `callback` until all student data are fetched.
+  void InvokeOnceStudentDataFetched(base::OnceClosure callback);
+
   // Fetches one page of courses.
   // `student_id`        - restricts returned courses to those having a student
   //                       with the specified identifier. Use an empty string
@@ -101,7 +133,8 @@
       const std::string& student_id,
       const std::string& teacher_id,
       const std::string& page_token,
-      ui::ListModel<GlanceablesClassroomCourse>* courses_container,
+      std::vector<std::unique_ptr<GlanceablesClassroomCourse>>&
+          courses_container,
       FetchCoursesCallback callback);
 
   // Callback for `FetchCoursesPage()`. If `next_page_token()` in the `result`
@@ -110,11 +143,19 @@
   void OnCoursesPageFetched(
       const std::string& student_id,
       const std::string& teacher_id,
-      ui::ListModel<GlanceablesClassroomCourse>* courses_container,
+      std::vector<std::unique_ptr<GlanceablesClassroomCourse>>&
+          courses_container,
       FetchCoursesCallback callback,
       base::expected<std::unique_ptr<google_apis::classroom::Courses>,
                      google_apis::ApiErrorCode> result);
 
+  // Callback for `FetchStudentCourses()` or `FetchTeacherCourses()`. Triggers
+  // fetching course work and student submissions for fetched `courses` and
+  // invokes `on_course_work_and_student_submissions_fetched` when done.
+  void OnCoursesFetched(
+      base::OnceClosure on_course_work_and_student_submissions_fetched,
+      const std::vector<std::unique_ptr<GlanceablesClassroomCourse>>& courses);
+
   // Fetches one page of course work items.
   // `course_id`  - identifier of the course.
   // `page_token` - token specifying the result page to return, comes from the
@@ -160,6 +201,25 @@
           std::unique_ptr<google_apis::classroom::StudentSubmissions>,
           google_apis::ApiErrorCode> result);
 
+  // Invokes all pending callbacks from `callbacks_waiting_for_student_data_`
+  // once all student data are fetched (courses + course work + student
+  // submissions).
+  void OnStudentDataFetched();
+
+  // Selects student assignments that satisfy both filtering predicates below.
+  // `due_predicate`              - returns `true` if passed due date/time
+  //                                satisfies filtering requirements.
+  // `submission_state_predicate` - returns `true` if passed submission state
+  //                                satisfies filtering requirements.
+  // `callback`                   - invoked with filtered results.
+  void GetFilteredStudentAssignments(
+      base::RepeatingCallback<bool(const absl::optional<base::Time>&)>
+          due_predicate,
+      base::RepeatingCallback<
+          bool(GlanceablesClassroomStudentSubmission::State)>
+          submission_state_predicate,
+      GetStudentAssignmentsCallback callback);
+
   // Returns lazily initialized `request_sender_`.
   google_apis::RequestSender* GetRequestSender();
 
@@ -170,24 +230,28 @@
   // Helper class that sends requests, handles retries and authentication.
   std::unique_ptr<google_apis::RequestSender> request_sender_;
 
-  // Available courses for student and teacher roles. Initialized after the
-  // first fetch request to distinguish between "not fetched yet" vs. "fetched,
-  // but has no items".
-  std::unique_ptr<ui::ListModel<GlanceablesClassroomCourse>> student_courses_;
-  std::unique_ptr<ui::ListModel<GlanceablesClassroomCourse>> teacher_courses_;
+  // Available courses for student and teacher roles.
+  std::vector<std::unique_ptr<GlanceablesClassroomCourse>> student_courses_;
+  std::vector<std::unique_ptr<GlanceablesClassroomCourse>> teacher_courses_;
 
   // All course work items grouped by course id.
   base::flat_map<
       std::string,
-      std::unique_ptr<ui::ListModel<GlanceablesClassroomCourseWorkItem>>>
+      std::vector<std::unique_ptr<GlanceablesClassroomCourseWorkItem>>>
       course_work_;
 
   // All student submissions grouped by course id.
   base::flat_map<
       std::string,
-      std::unique_ptr<ui::ListModel<GlanceablesClassroomStudentSubmission>>>
+      std::vector<std::unique_ptr<GlanceablesClassroomStudentSubmission>>>
       student_submissions_;
 
+  // Fetch status of all student data.
+  FetchStatus student_data_fetch_status_ = FetchStatus::kNotFetched;
+
+  // Pending callbacks awaiting all student data.
+  std::vector<base::OnceClosure> callbacks_waiting_for_student_data_;
+
   base::WeakPtrFactory<GlanceablesClassroomClientImpl> weak_factory_{this};
 };
 
diff --git a/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl_unittest.cc b/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl_unittest.cc
index b509aaf..f9f6f319 100644
--- a/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl_unittest.cc
+++ b/chrome/browser/ui/ash/glanceables/glanceables_classroom_client_impl_unittest.cc
@@ -13,10 +13,11 @@
 #include "base/command_line.h"
 #include "base/functional/bind.h"
 #include "base/memory/scoped_refptr.h"
+#include "base/run_loop.h"
 #include "base/test/bind.h"
-#include "base/test/repeating_test_future.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
+#include "base/time/time_override.h"
 #include "content/public/test/browser_task_environment.h"
 #include "google_apis/common/dummy_auth_service.h"
 #include "google_apis/common/request_sender.h"
@@ -30,12 +31,11 @@
 #include "services/network/test/test_shared_url_loader_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "ui/base/models/list_model.h"
 
 namespace ash {
 namespace {
 
-using ::base::test::RepeatingTestFuture;
+using ::base::subtle::ScopedTimeClockOverrides;
 using ::base::test::TestFuture;
 using ::google_apis::util::FormatTimeAsString;
 using ::net::test_server::BasicHttpResponse;
@@ -103,6 +103,22 @@
               test_server_.base_url().spec());
   }
 
+  void ExpectActiveCourse() {
+    EXPECT_CALL(request_handler(),
+                HandleRequest(
+                    Field(&HttpRequest::relative_url, HasSubstr("/courses?"))))
+        .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
+            {
+              "courses": [
+                {
+                  "id": "course-id-1",
+                  "name": "Active Course 1",
+                  "courseState": "ACTIVE"
+                }
+              ]
+            })"))));
+  }
+
   GlanceablesClassroomClientImpl* client() { return client_.get(); }
   TestRequestHandler& request_handler() { return request_handler_; }
 
@@ -144,16 +160,6 @@
               ]
             })");
       }));
-  EXPECT_CALL(request_handler(),
-              HandleRequest(
-                  Field(&HttpRequest::relative_url, HasSubstr("/courseWork?"))))
-      .WillRepeatedly(Invoke(
-          []() { return TestRequestHandler::CreateSuccessfulResponse("{}"); }));
-  EXPECT_CALL(request_handler(),
-              HandleRequest(Field(&HttpRequest::relative_url,
-                                  HasSubstr("/studentSubmissions?"))))
-      .WillRepeatedly(Invoke(
-          []() { return TestRequestHandler::CreateSuccessfulResponse("{}"); }));
 
   auto fetch_courses_methods = std::vector<base::RepeatingCallback<void(
       GlanceablesClassroomClientImpl::FetchCoursesCallback)>>{
@@ -163,70 +169,19 @@
                           base::Unretained(client()))};
 
   for (auto fetch_method : fetch_courses_methods) {
-    TestFuture<ui::ListModel<GlanceablesClassroomCourse>*> future;
-    fetch_method.Run(future.GetCallback());
-    ASSERT_TRUE(future.Wait());
+    base::RunLoop run_loop;
+    fetch_method.Run(base::BindLambdaForTesting(
+        [&run_loop](
+            const std::vector<std::unique_ptr<GlanceablesClassroomCourse>>&
+                courses) {
+          run_loop.Quit();
 
-    const auto* const courses = future.Get();
-    ASSERT_EQ(courses->item_count(), 1u);
+          ASSERT_EQ(courses.size(), 1u);
 
-    EXPECT_EQ(courses->GetItemAt(0)->id, "course-id-1");
-    EXPECT_EQ(courses->GetItemAt(0)->name, "Active Course 1");
-  }
-}
-
-TEST_F(GlanceablesClassroomClientImplTest, FetchCoursesOnSubsequentCalls) {
-  EXPECT_CALL(request_handler(), HandleRequest(Field(&HttpRequest::relative_url,
-                                                     HasSubstr("/courses?"))))
-      .Times(
-          2 /* 1 for `FetchStudentCourses()` + 1 for `FetchTeacherCourses()` */)
-      .WillRepeatedly(Invoke([]() {
-        return TestRequestHandler::CreateSuccessfulResponse(R"(
-            {
-              "courses": [
-                {
-                  "id": "course-id-1",
-                  "name": "Active Course 1",
-                  "courseState": "ACTIVE"
-                },
-                {
-                  "id": "course-id-2",
-                  "name": "??? Course 2",
-                  "courseState": "???"
-                }
-              ]
-            })");
-      }));
-  EXPECT_CALL(request_handler(),
-              HandleRequest(
-                  Field(&HttpRequest::relative_url, HasSubstr("/courseWork?"))))
-      .WillRepeatedly(Invoke(
-          []() { return TestRequestHandler::CreateSuccessfulResponse("{}"); }));
-  EXPECT_CALL(request_handler(),
-              HandleRequest(Field(&HttpRequest::relative_url,
-                                  HasSubstr("/studentSubmissions?"))))
-      .WillRepeatedly(Invoke(
-          []() { return TestRequestHandler::CreateSuccessfulResponse("{}"); }));
-
-  auto fetch_courses_methods = std::vector<base::RepeatingCallback<void(
-      GlanceablesClassroomClientImpl::FetchCoursesCallback)>>{
-      base::BindRepeating(&GlanceablesClassroomClientImpl::FetchStudentCourses,
-                          base::Unretained(client())),
-      base::BindRepeating(&GlanceablesClassroomClientImpl::FetchTeacherCourses,
-                          base::Unretained(client()))};
-
-  for (auto fetch_method : fetch_courses_methods) {
-    RepeatingTestFuture<ui::ListModel<GlanceablesClassroomCourse>*> future;
-    fetch_method.Run(future.GetCallback());
-    ASSERT_TRUE(future.Wait());
-
-    const auto* const courses = future.Take();
-
-    // Subsequent request doesn't trigger another network call and returns a
-    // pointer to the same `ui::ListModel`.
-    fetch_method.Run(future.GetCallback());
-    ASSERT_TRUE(future.Wait());
-    EXPECT_EQ(future.Take(), courses);
+          EXPECT_EQ(courses.at(0)->id, "course-id-1");
+          EXPECT_EQ(courses.at(0)->name, "Active Course 1");
+        }));
+    run_loop.Run();
   }
 }
 
@@ -243,12 +198,16 @@
                           base::Unretained(client()))};
 
   for (auto fetch_method : fetch_courses_methods) {
-    TestFuture<ui::ListModel<GlanceablesClassroomCourse>*> future;
-    fetch_method.Run(future.GetCallback());
-    ASSERT_TRUE(future.Wait());
+    base::RunLoop run_loop;
+    fetch_method.Run(base::BindLambdaForTesting(
+        [&run_loop](
+            const std::vector<std::unique_ptr<GlanceablesClassroomCourse>>&
+                courses) {
+          run_loop.Quit();
 
-    const auto* const courses = future.Get();
-    ASSERT_EQ(courses->item_count(), 0u);
+          ASSERT_TRUE(courses.empty());
+        }));
+    run_loop.Run();
   }
 }
 
@@ -291,16 +250,6 @@
               ]
             })");
       }));
-  EXPECT_CALL(request_handler(),
-              HandleRequest(
-                  Field(&HttpRequest::relative_url, HasSubstr("/courseWork?"))))
-      .WillRepeatedly(Invoke(
-          []() { return TestRequestHandler::CreateSuccessfulResponse("{}"); }));
-  EXPECT_CALL(request_handler(),
-              HandleRequest(Field(&HttpRequest::relative_url,
-                                  HasSubstr("/studentSubmissions?"))))
-      .WillRepeatedly(Invoke(
-          []() { return TestRequestHandler::CreateSuccessfulResponse("{}"); }));
 
   auto fetch_courses_methods = std::vector<base::RepeatingCallback<void(
       GlanceablesClassroomClientImpl::FetchCoursesCallback)>>{
@@ -310,16 +259,20 @@
                           base::Unretained(client()))};
 
   for (auto fetch_method : fetch_courses_methods) {
-    TestFuture<ui::ListModel<GlanceablesClassroomCourse>*> future;
-    fetch_method.Run(future.GetCallback());
-    ASSERT_TRUE(future.Wait());
+    base::RunLoop run_loop;
+    fetch_method.Run(base::BindLambdaForTesting(
+        [&run_loop](
+            const std::vector<std::unique_ptr<GlanceablesClassroomCourse>>&
+                courses) {
+          run_loop.Quit();
 
-    const auto* const courses = future.Get();
-    ASSERT_EQ(courses->item_count(), 3u);
+          ASSERT_EQ(courses.size(), 3u);
 
-    EXPECT_EQ(courses->GetItemAt(0)->id, "course-id-from-page-1");
-    EXPECT_EQ(courses->GetItemAt(1)->id, "course-id-from-page-2");
-    EXPECT_EQ(courses->GetItemAt(2)->id, "course-id-from-page-3");
+          EXPECT_EQ(courses.at(0)->id, "course-id-from-page-1");
+          EXPECT_EQ(courses.at(1)->id, "course-id-from-page-2");
+          EXPECT_EQ(courses.at(2)->id, "course-id-from-page-3");
+        }));
+    run_loop.Run();
   }
 }
 
@@ -332,8 +285,7 @@
   EXPECT_CALL(request_handler(),
               HandleRequest(
                   Field(&HttpRequest::relative_url, HasSubstr("/courseWork?"))))
-      .WillRepeatedly(Invoke([]() {
-        return TestRequestHandler::CreateSuccessfulResponse(R"(
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
             {
               "courseWork": [
                 {
@@ -362,73 +314,52 @@
                   }
                 }
               ]
-            })");
-      }));
+            })"))));
 
-  TestFuture<ui::ListModel<GlanceablesClassroomCourseWorkItem>*> future;
-  client()->FetchCourseWork(/*course_id=*/"course-123", future.GetCallback());
-  ASSERT_TRUE(future.Wait());
+  base::RunLoop run_loop;
+  client()->FetchCourseWork(
+      /*course_id=*/"course-123",
+      base::BindLambdaForTesting(
+          [&run_loop](const std::vector<std::unique_ptr<
+                          GlanceablesClassroomCourseWorkItem>>& course_work) {
+            run_loop.Quit();
 
-  const auto* const course_work = future.Get();
-  ASSERT_EQ(course_work->item_count(), 2u);
+            ASSERT_EQ(course_work.size(), 2u);
 
-  EXPECT_EQ(course_work->GetItemAt(0)->id, "course-work-item-1");
-  EXPECT_EQ(course_work->GetItemAt(0)->title, "Math assignment");
-  EXPECT_EQ(course_work->GetItemAt(0)->link,
-            "https://classroom.google.com/test-link-1");
-  EXPECT_FALSE(course_work->GetItemAt(0)->due);
+            EXPECT_EQ(course_work.at(0)->id, "course-work-item-1");
+            EXPECT_EQ(course_work.at(0)->title, "Math assignment");
+            EXPECT_EQ(course_work.at(0)->link,
+                      "https://classroom.google.com/test-link-1");
+            EXPECT_FALSE(course_work.at(0)->due);
 
-  EXPECT_EQ(course_work->GetItemAt(1)->id, "course-work-item-3");
-  EXPECT_EQ(course_work->GetItemAt(1)->title, "Math assignment with due date");
-  EXPECT_EQ(course_work->GetItemAt(1)->link,
-            "https://classroom.google.com/test-link-3");
-  EXPECT_EQ(FormatTimeAsString(course_work->GetItemAt(1)->due.value()),
-            "2023-04-25T15:09:25.250Z");
-}
-
-TEST_F(GlanceablesClassroomClientImplTest, FetchCourseWorkOnSubsequentCalls) {
-  EXPECT_CALL(request_handler(),
-              HandleRequest(
-                  Field(&HttpRequest::relative_url, HasSubstr("/courseWork?"))))
-      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
-          {
-            "courseWork": [
-              {
-                "id": "course-work-item-1",
-                "title": "Math assignment",
-                "state": "PUBLISHED",
-                "alternateLink": "https://classroom.google.com/test-link-1"
-              }
-            ]
-          })"))));
-
-  RepeatingTestFuture<ui::ListModel<GlanceablesClassroomCourseWorkItem>*>
-      future;
-  client()->FetchCourseWork(/*course_id=*/"course-123", future.GetCallback());
-  ASSERT_TRUE(future.Wait());
-
-  const auto* const course_work = future.Take();
-
-  // Subsequent request doesn't trigger another network call and returns a
-  // pointer to the same `ui::ListModel`.
-  client()->FetchCourseWork(/*course_id=*/"course-123", future.GetCallback());
-  ASSERT_TRUE(future.Wait());
-  EXPECT_EQ(future.Take(), course_work);
+            EXPECT_EQ(course_work.at(1)->id, "course-work-item-3");
+            EXPECT_EQ(course_work.at(1)->title,
+                      "Math assignment with due date");
+            EXPECT_EQ(course_work.at(1)->link,
+                      "https://classroom.google.com/test-link-3");
+            EXPECT_EQ(FormatTimeAsString(course_work.at(1)->due.value()),
+                      "2023-04-25T15:09:25.250Z");
+          }));
+  run_loop.Run();
 }
 
 TEST_F(GlanceablesClassroomClientImplTest, FetchCourseWorkOnHttpError) {
   EXPECT_CALL(request_handler(),
               HandleRequest(
                   Field(&HttpRequest::relative_url, HasSubstr("/courseWork?"))))
-      .WillRepeatedly(
-          Invoke([]() { return TestRequestHandler::CreateFailedResponse(); }));
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateFailedResponse())));
 
-  TestFuture<ui::ListModel<GlanceablesClassroomCourseWorkItem>*> future;
-  client()->FetchCourseWork(/*course_id=*/"course-123", future.GetCallback());
-  ASSERT_TRUE(future.Wait());
+  base::RunLoop run_loop;
+  client()->FetchCourseWork(
+      /*course_id=*/"course-123",
+      base::BindLambdaForTesting(
+          [&run_loop](const std::vector<std::unique_ptr<
+                          GlanceablesClassroomCourseWorkItem>>& course_work) {
+            run_loop.Quit();
 
-  const auto* const course_work = future.Get();
-  ASSERT_EQ(course_work->item_count(), 0u);
+            ASSERT_TRUE(course_work.empty());
+          }));
+  run_loop.Run();
 }
 
 TEST_F(GlanceablesClassroomClientImplTest, FetchCourseWorkMultiplePages) {
@@ -436,51 +367,50 @@
               HandleRequest(Field(&HttpRequest::relative_url,
                                   AllOf(HasSubstr("/courseWork?"),
                                         Not(HasSubstr("pageToken"))))))
-      .WillRepeatedly(Invoke([]() {
-        return TestRequestHandler::CreateSuccessfulResponse(R"(
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
             {
               "courseWork": [
                 {"id": "course-work-item-from-page-1", "state": "PUBLISHED"}
               ],
               "nextPageToken": "page-2-token"
-            })");
-      }));
+            })"))));
   EXPECT_CALL(request_handler(),
               HandleRequest(Field(&HttpRequest::relative_url,
                                   AllOf(HasSubstr("/courseWork?"),
                                         HasSubstr("pageToken=page-2-token")))))
-      .WillRepeatedly(Invoke([]() {
-        return TestRequestHandler::CreateSuccessfulResponse(R"(
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
             {
               "courseWork": [
                 {"id": "course-work-item-from-page-2", "state": "PUBLISHED"}
               ],
               "nextPageToken": "page-3-token"
-            })");
-      }));
+            })"))));
   EXPECT_CALL(request_handler(),
               HandleRequest(Field(&HttpRequest::relative_url,
                                   AllOf(HasSubstr("/courseWork?"),
                                         HasSubstr("pageToken=page-3-token")))))
-      .WillRepeatedly(Invoke([]() {
-        return TestRequestHandler::CreateSuccessfulResponse(R"(
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
             {
               "courseWork": [
                 {"id": "course-work-item-from-page-3", "state": "PUBLISHED"}
               ]
-            })");
-      }));
+            })"))));
 
-  TestFuture<ui::ListModel<GlanceablesClassroomCourseWorkItem>*> future;
-  client()->FetchCourseWork(/*course_id=*/"course-123", future.GetCallback());
-  ASSERT_TRUE(future.Wait());
+  base::RunLoop run_loop;
+  client()->FetchCourseWork(
+      /*course_id=*/"course-123",
+      base::BindLambdaForTesting(
+          [&run_loop](const std::vector<std::unique_ptr<
+                          GlanceablesClassroomCourseWorkItem>>& course_work) {
+            run_loop.Quit();
 
-  const auto* const courses = future.Get();
-  ASSERT_EQ(courses->item_count(), 3u);
+            ASSERT_EQ(course_work.size(), 3u);
 
-  EXPECT_EQ(courses->GetItemAt(0)->id, "course-work-item-from-page-1");
-  EXPECT_EQ(courses->GetItemAt(1)->id, "course-work-item-from-page-2");
-  EXPECT_EQ(courses->GetItemAt(2)->id, "course-work-item-from-page-3");
+            EXPECT_EQ(course_work.at(0)->id, "course-work-item-from-page-1");
+            EXPECT_EQ(course_work.at(1)->id, "course-work-item-from-page-2");
+            EXPECT_EQ(course_work.at(2)->id, "course-work-item-from-page-3");
+          }));
+  run_loop.Run();
 }
 
 // ----------------------------------------------------------------------------
@@ -490,8 +420,7 @@
   EXPECT_CALL(request_handler(),
               HandleRequest(Field(&HttpRequest::relative_url,
                                   HasSubstr("/studentSubmissions?"))))
-      .WillRepeatedly(Invoke([]() {
-        return TestRequestHandler::CreateSuccessfulResponse(R"(
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
             {
               "studentSubmissions": [
                 {
@@ -531,95 +460,82 @@
                   "state": "???"
                 }
               ]
-            })");
-      }));
+            })"))));
 
-  TestFuture<ui::ListModel<GlanceablesClassroomStudentSubmission>*> future;
-  client()->FetchStudentSubmissions(/*course_id=*/"course-123",
-                                    future.GetCallback());
-  ASSERT_TRUE(future.Wait());
+  base::RunLoop run_loop;
+  client()->FetchStudentSubmissions(
+      /*course_id=*/"course-123",
+      base::BindLambdaForTesting(
+          [&run_loop](const std::vector<
+                      std::unique_ptr<GlanceablesClassroomStudentSubmission>>&
+                          student_submissions) {
+            run_loop.Quit();
 
-  const auto* const student_submissions = future.Get();
-  ASSERT_EQ(student_submissions->item_count(), 7u);
+            ASSERT_EQ(student_submissions.size(), 7u);
 
-  EXPECT_EQ(student_submissions->GetItemAt(0)->id, "student-submission-1");
-  EXPECT_EQ(student_submissions->GetItemAt(0)->course_work_id, "course-work-1");
-  EXPECT_EQ(student_submissions->GetItemAt(0)->state,
-            GlanceablesClassroomStudentSubmission::State::kAssigned);
+            EXPECT_EQ(student_submissions.at(0)->id, "student-submission-1");
+            EXPECT_EQ(student_submissions.at(0)->course_work_id,
+                      "course-work-1");
+            EXPECT_EQ(student_submissions.at(0)->state,
+                      GlanceablesClassroomStudentSubmission::State::kAssigned);
 
-  EXPECT_EQ(student_submissions->GetItemAt(1)->id, "student-submission-2");
-  EXPECT_EQ(student_submissions->GetItemAt(1)->course_work_id, "course-work-1");
-  EXPECT_EQ(student_submissions->GetItemAt(1)->state,
-            GlanceablesClassroomStudentSubmission::State::kAssigned);
+            EXPECT_EQ(student_submissions.at(1)->id, "student-submission-2");
+            EXPECT_EQ(student_submissions.at(1)->course_work_id,
+                      "course-work-1");
+            EXPECT_EQ(student_submissions.at(1)->state,
+                      GlanceablesClassroomStudentSubmission::State::kAssigned);
 
-  EXPECT_EQ(student_submissions->GetItemAt(2)->id, "student-submission-3");
-  EXPECT_EQ(student_submissions->GetItemAt(2)->course_work_id, "course-work-1");
-  EXPECT_EQ(student_submissions->GetItemAt(2)->state,
-            GlanceablesClassroomStudentSubmission::State::kAssigned);
+            EXPECT_EQ(student_submissions.at(2)->id, "student-submission-3");
+            EXPECT_EQ(student_submissions.at(2)->course_work_id,
+                      "course-work-1");
+            EXPECT_EQ(student_submissions.at(2)->state,
+                      GlanceablesClassroomStudentSubmission::State::kAssigned);
 
-  EXPECT_EQ(student_submissions->GetItemAt(3)->id, "student-submission-4");
-  EXPECT_EQ(student_submissions->GetItemAt(3)->course_work_id, "course-work-1");
-  EXPECT_EQ(student_submissions->GetItemAt(3)->state,
-            GlanceablesClassroomStudentSubmission::State::kTurnedIn);
+            EXPECT_EQ(student_submissions.at(3)->id, "student-submission-4");
+            EXPECT_EQ(student_submissions.at(3)->course_work_id,
+                      "course-work-1");
+            EXPECT_EQ(student_submissions.at(3)->state,
+                      GlanceablesClassroomStudentSubmission::State::kTurnedIn);
 
-  EXPECT_EQ(student_submissions->GetItemAt(4)->id, "student-submission-5");
-  EXPECT_EQ(student_submissions->GetItemAt(4)->course_work_id, "course-work-1");
-  EXPECT_EQ(student_submissions->GetItemAt(4)->state,
-            GlanceablesClassroomStudentSubmission::State::kAssigned);
+            EXPECT_EQ(student_submissions.at(4)->id, "student-submission-5");
+            EXPECT_EQ(student_submissions.at(4)->course_work_id,
+                      "course-work-1");
+            EXPECT_EQ(student_submissions.at(4)->state,
+                      GlanceablesClassroomStudentSubmission::State::kAssigned);
 
-  EXPECT_EQ(student_submissions->GetItemAt(5)->id, "student-submission-6");
-  EXPECT_EQ(student_submissions->GetItemAt(5)->course_work_id, "course-work-1");
-  EXPECT_EQ(student_submissions->GetItemAt(5)->state,
-            GlanceablesClassroomStudentSubmission::State::kGraded);
+            EXPECT_EQ(student_submissions.at(5)->id, "student-submission-6");
+            EXPECT_EQ(student_submissions.at(5)->course_work_id,
+                      "course-work-1");
+            EXPECT_EQ(student_submissions.at(5)->state,
+                      GlanceablesClassroomStudentSubmission::State::kGraded);
 
-  EXPECT_EQ(student_submissions->GetItemAt(6)->id, "student-submission-7");
-  EXPECT_EQ(student_submissions->GetItemAt(6)->course_work_id, "course-work-1");
-  EXPECT_EQ(student_submissions->GetItemAt(6)->state,
-            GlanceablesClassroomStudentSubmission::State::kOther);
-}
-
-TEST_F(GlanceablesClassroomClientImplTest,
-       FetchStudentSubmissionsOnSubsequentCalls) {
-  EXPECT_CALL(request_handler(),
-              HandleRequest(Field(&HttpRequest::relative_url,
-                                  HasSubstr("/studentSubmissions?"))))
-      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
-          {
-            "studentSubmissions": [
-              {"id": "student-submission-1", "courseWorkId": "course-work-1"}
-            ]
-          })"))));
-
-  RepeatingTestFuture<ui::ListModel<GlanceablesClassroomStudentSubmission>*>
-      future;
-  client()->FetchStudentSubmissions(/*course_id=*/"course-123",
-                                    future.GetCallback());
-  ASSERT_TRUE(future.Wait());
-
-  const auto* const student_submissions = future.Take();
-
-  // Subsequent request doesn't trigger another network call and returns a
-  // pointer to the same `ui::ListModel`.
-  client()->FetchStudentSubmissions(/*course_id=*/"course-123",
-                                    future.GetCallback());
-  ASSERT_TRUE(future.Wait());
-  EXPECT_EQ(future.Take(), student_submissions);
+            EXPECT_EQ(student_submissions.at(6)->id, "student-submission-7");
+            EXPECT_EQ(student_submissions.at(6)->course_work_id,
+                      "course-work-1");
+            EXPECT_EQ(student_submissions.at(6)->state,
+                      GlanceablesClassroomStudentSubmission::State::kOther);
+          }));
+  run_loop.Run();
 }
 
 TEST_F(GlanceablesClassroomClientImplTest, FetchStudentSubmissionsOnHttpError) {
   EXPECT_CALL(request_handler(),
               HandleRequest(Field(&HttpRequest::relative_url,
                                   HasSubstr("/studentSubmissions?"))))
-      .WillRepeatedly(
-          Invoke([]() { return TestRequestHandler::CreateFailedResponse(); }));
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateFailedResponse())));
 
-  TestFuture<ui::ListModel<GlanceablesClassroomStudentSubmission>*> future;
-  client()->FetchStudentSubmissions(/*course_id=*/"course-123",
-                                    future.GetCallback());
-  ASSERT_TRUE(future.Wait());
+  base::RunLoop run_loop;
+  client()->FetchStudentSubmissions(
+      /*course_id=*/"course-123",
+      base::BindLambdaForTesting(
+          [&run_loop](const std::vector<
+                      std::unique_ptr<GlanceablesClassroomStudentSubmission>>&
+                          student_submissions) {
+            run_loop.Quit();
 
-  const auto* const student_submissions = future.Get();
-  ASSERT_EQ(student_submissions->item_count(), 0u);
+            ASSERT_TRUE(student_submissions.empty());
+          }));
+  run_loop.Run();
 }
 
 TEST_F(GlanceablesClassroomClientImplTest,
@@ -628,55 +544,462 @@
               HandleRequest(Field(&HttpRequest::relative_url,
                                   AllOf(HasSubstr("/studentSubmissions?"),
                                         Not(HasSubstr("pageToken"))))))
-      .WillRepeatedly(Invoke([]() {
-        return TestRequestHandler::CreateSuccessfulResponse(R"(
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
             {
               "studentSubmissions": [
                 {"id": "student-submission-from-page-1"}
               ],
               "nextPageToken": "page-2-token"
-            })");
-      }));
+            })"))));
   EXPECT_CALL(request_handler(),
               HandleRequest(Field(&HttpRequest::relative_url,
                                   AllOf(HasSubstr("/studentSubmissions?"),
                                         HasSubstr("pageToken=page-2-token")))))
-      .WillRepeatedly(Invoke([]() {
-        return TestRequestHandler::CreateSuccessfulResponse(R"(
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
             {
               "studentSubmissions": [
                 {"id": "student-submission-from-page-2"}
               ],
               "nextPageToken": "page-3-token"
-            })");
-      }));
+            })"))));
   EXPECT_CALL(request_handler(),
               HandleRequest(Field(&HttpRequest::relative_url,
                                   AllOf(HasSubstr("/studentSubmissions?"),
                                         HasSubstr("pageToken=page-3-token")))))
-      .WillRepeatedly(Invoke([]() {
-        return TestRequestHandler::CreateSuccessfulResponse(R"(
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
             {
               "studentSubmissions": [
                 {"id": "student-submission-from-page-3"}
               ]
-            })");
-      }));
+            })"))));
 
-  TestFuture<ui::ListModel<GlanceablesClassroomStudentSubmission>*> future;
-  client()->FetchStudentSubmissions(/*course_id=*/"course-123",
-                                    future.GetCallback());
-  ASSERT_TRUE(future.Wait());
+  base::RunLoop run_loop;
+  client()->FetchStudentSubmissions(
+      /*course_id=*/"course-123",
+      base::BindLambdaForTesting(
+          [&run_loop](const std::vector<
+                      std::unique_ptr<GlanceablesClassroomStudentSubmission>>&
+                          student_submissions) {
+            run_loop.Quit();
 
-  const auto* const student_submissions = future.Get();
-  ASSERT_EQ(student_submissions->item_count(), 3u);
+            ASSERT_EQ(student_submissions.size(), 3u);
 
-  EXPECT_EQ(student_submissions->GetItemAt(0)->id,
-            "student-submission-from-page-1");
-  EXPECT_EQ(student_submissions->GetItemAt(1)->id,
-            "student-submission-from-page-2");
-  EXPECT_EQ(student_submissions->GetItemAt(2)->id,
-            "student-submission-from-page-3");
+            EXPECT_EQ(student_submissions.at(0)->id,
+                      "student-submission-from-page-1");
+            EXPECT_EQ(student_submissions.at(1)->id,
+                      "student-submission-from-page-2");
+            EXPECT_EQ(student_submissions.at(2)->id,
+                      "student-submission-from-page-3");
+          }));
+  run_loop.Run();
+}
+
+// ----------------------------------------------------------------------------
+// Public interface, student assignments:
+
+TEST_F(GlanceablesClassroomClientImplTest,
+       StudentRoleIsActiveWithEnrolledCourses) {
+  ExpectActiveCourse();
+  EXPECT_CALL(request_handler(),
+              HandleRequest(
+                  Field(&HttpRequest::relative_url, HasSubstr("/courseWork?"))))
+      .WillOnce(
+          Return(ByMove(TestRequestHandler::CreateSuccessfulResponse("{}"))));
+  EXPECT_CALL(request_handler(),
+              HandleRequest(Field(&HttpRequest::relative_url,
+                                  HasSubstr("/studentSubmissions?"))))
+      .WillOnce(
+          Return(ByMove(TestRequestHandler::CreateSuccessfulResponse("{}"))));
+
+  TestFuture<bool> future;
+  client()->IsStudentRoleActive(future.GetCallback());
+
+  const bool active = future.Get();
+  ASSERT_TRUE(active);
+}
+
+TEST_F(GlanceablesClassroomClientImplTest,
+       StudentRoleIsInactiveWithoutEnrolledCourses) {
+  EXPECT_CALL(request_handler(), HandleRequest(Field(&HttpRequest::relative_url,
+                                                     HasSubstr("/courses?"))))
+      .WillOnce(Return(ByMove(
+          TestRequestHandler::CreateSuccessfulResponse(R"({"courses": []})"))));
+
+  TestFuture<bool> future;
+  client()->IsStudentRoleActive(future.GetCallback());
+
+  const bool active = future.Get();
+  ASSERT_FALSE(active);
+}
+
+TEST_F(GlanceablesClassroomClientImplTest, ReturnsCompletedStudentAssignments) {
+  ExpectActiveCourse();
+  EXPECT_CALL(request_handler(),
+              HandleRequest(
+                  Field(&HttpRequest::relative_url, HasSubstr("/courseWork?"))))
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
+            {
+              "courseWork": [
+                {
+                  "id": "course-work-item-1",
+                  "title": "Math assignment",
+                  "state": "PUBLISHED",
+                  "alternateLink": "https://classroom.google.com/test-link-1"
+                },
+                {
+                  "id": "course-work-item-2",
+                  "title": "Math assignment - submission graded",
+                  "state": "PUBLISHED",
+                  "alternateLink": "https://classroom.google.com/test-link-2"
+                },
+                {
+                  "id": "course-work-item-3",
+                  "title": "Math assignment - submission turned in",
+                  "state": "PUBLISHED",
+                  "alternateLink": "https://classroom.google.com/test-link-3"
+                }
+              ]
+            })"))));
+  EXPECT_CALL(request_handler(),
+              HandleRequest(Field(&HttpRequest::relative_url,
+                                  HasSubstr("/studentSubmissions?"))))
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
+            {
+              "studentSubmissions": [
+                {
+                  "id": "student-submission-1",
+                  "courseWorkId": "course-work-item-1",
+                  "state": "NEW"
+                },
+                {
+                  "id": "student-submission-2",
+                  "courseWorkId": "course-work-item-2",
+                  "state": "RETURNED",
+                  "assignedGrade": 50.0
+                },
+                {
+                  "id": "student-submission-3",
+                  "courseWorkId": "course-work-item-3",
+                  "state": "TURNED_IN"
+                }
+              ]
+            })"))));
+
+  TestFuture<
+      std::vector<std::unique_ptr<GlanceablesClassroomStudentAssignment>>>
+      future;
+  client()->GetCompletedStudentAssignments(future.GetCallback());
+
+  const auto assignments = future.Take();
+  ASSERT_EQ(assignments.size(), 2u);
+
+  EXPECT_EQ(assignments.at(0)->course_title, "Active Course 1");
+  EXPECT_EQ(assignments.at(0)->course_work_title,
+            "Math assignment - submission graded");
+  EXPECT_EQ(assignments.at(0)->link,
+            "https://classroom.google.com/test-link-2");
+  EXPECT_FALSE(assignments.at(0)->due);
+
+  EXPECT_EQ(assignments.at(1)->course_title, "Active Course 1");
+  EXPECT_EQ(assignments.at(1)->course_work_title,
+            "Math assignment - submission turned in");
+  EXPECT_EQ(assignments.at(1)->link,
+            "https://classroom.google.com/test-link-3");
+  EXPECT_FALSE(assignments.at(1)->due);
+}
+
+TEST_F(GlanceablesClassroomClientImplTest,
+       ReturnsStudentAssignmentsWithApproachingDueDate) {
+  base::subtle::ScopedTimeClockOverrides time_override(
+      []() {
+        base::Time now;
+        EXPECT_TRUE(base::Time::FromString("10 Apr 2023 00:00 GMT", &now));
+        return now;
+      },
+      nullptr, nullptr);
+
+  ExpectActiveCourse();
+  EXPECT_CALL(request_handler(),
+              HandleRequest(
+                  Field(&HttpRequest::relative_url, HasSubstr("/courseWork?"))))
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
+            {
+              "courseWork": [
+                {
+                  "id": "course-work-item-1",
+                  "title": "Math assignment - missed due date",
+                  "state": "PUBLISHED",
+                  "alternateLink": "https://classroom.google.com/test-link-1",
+                  "dueDate": {"year": 2023, "month": 4, "day": 5},
+                  "dueTime": {
+                    "hours": 15,
+                    "minutes": 9,
+                    "seconds": 25,
+                    "nanos": 250000000
+                  }
+                },
+                {
+                  "id": "course-work-item-2",
+                  "title": "Math assignment - approaching due date",
+                  "state": "PUBLISHED",
+                  "alternateLink": "https://classroom.google.com/test-link-2",
+                  "dueDate": {"year": 2023, "month": 4, "day": 25},
+                  "dueTime": {
+                    "hours": 15,
+                    "minutes": 9,
+                    "seconds": 25,
+                    "nanos": 250000000
+                  }
+                },
+                {
+                  "id": "course-work-item-3",
+                  "title": "Math assignment - approaching due date, completed",
+                  "state": "PUBLISHED",
+                  "alternateLink": "https://classroom.google.com/test-link-3",
+                  "dueDate": {"year": 2023, "month": 4, "day": 25},
+                  "dueTime": {
+                    "hours": 15,
+                    "minutes": 9,
+                    "seconds": 25,
+                    "nanos": 250000000
+                  }
+                }
+              ]
+            })"))));
+  EXPECT_CALL(request_handler(),
+              HandleRequest(Field(&HttpRequest::relative_url,
+                                  HasSubstr("/studentSubmissions?"))))
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
+            {
+              "studentSubmissions": [
+                {
+                  "id": "student-submission-1",
+                  "courseWorkId": "course-work-item-1",
+                  "state": "NEW"
+                },
+                {
+                  "id": "student-submission-2",
+                  "courseWorkId": "course-work-item-2",
+                  "state": "NEW"
+                },
+                {
+                  "id": "student-submission-3",
+                  "courseWorkId": "course-work-item-3",
+                  "state": "RETURNED",
+                  "assignedGrade": 50.0
+                }
+              ]
+            })"))));
+
+  TestFuture<
+      std::vector<std::unique_ptr<GlanceablesClassroomStudentAssignment>>>
+      future;
+  client()->GetStudentAssignmentsWithApproachingDueDate(future.GetCallback());
+
+  const auto assignments = future.Take();
+  ASSERT_EQ(assignments.size(), 1u);
+
+  EXPECT_EQ(assignments.at(0)->course_title, "Active Course 1");
+  EXPECT_EQ(assignments.at(0)->course_work_title,
+            "Math assignment - approaching due date");
+  EXPECT_EQ(assignments.at(0)->link,
+            "https://classroom.google.com/test-link-2");
+  EXPECT_EQ(FormatTimeAsString(assignments.at(0)->due.value()),
+            "2023-04-25T15:09:25.250Z");
+}
+
+TEST_F(GlanceablesClassroomClientImplTest,
+       ReturnsStudentAssignmentsWithMissedDueDate) {
+  base::subtle::ScopedTimeClockOverrides time_override(
+      []() {
+        base::Time now;
+        EXPECT_TRUE(base::Time::FromString("10 Apr 2023 00:00 GMT", &now));
+        return now;
+      },
+      nullptr, nullptr);
+
+  ExpectActiveCourse();
+  EXPECT_CALL(request_handler(),
+              HandleRequest(
+                  Field(&HttpRequest::relative_url, HasSubstr("/courseWork?"))))
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
+            {
+              "courseWork": [
+                {
+                  "id": "course-work-item-1",
+                  "title": "Math assignment - missed due date",
+                  "state": "PUBLISHED",
+                  "alternateLink": "https://classroom.google.com/test-link-1",
+                  "dueDate": {"year": 2023, "month": 4, "day": 5},
+                  "dueTime": {
+                    "hours": 15,
+                    "minutes": 9,
+                    "seconds": 25,
+                    "nanos": 250000000
+                  }
+                },
+                {
+                  "id": "course-work-item-2",
+                  "title": "Math assignment - approaching due date",
+                  "state": "PUBLISHED",
+                  "alternateLink": "https://classroom.google.com/test-link-2",
+                  "dueDate": {"year": 2023, "month": 4, "day": 25},
+                  "dueTime": {
+                    "hours": 15,
+                    "minutes": 9,
+                    "seconds": 25,
+                    "nanos": 250000000
+                  }
+                },
+                {
+                  "id": "course-work-item-3",
+                  "title": "Math assignment - missed due date, completed",
+                  "state": "PUBLISHED",
+                  "alternateLink": "https://classroom.google.com/test-link-3",
+                  "dueDate": {"year": 2023, "month": 4, "day": 5},
+                  "dueTime": {
+                    "hours": 15,
+                    "minutes": 9,
+                    "seconds": 25,
+                    "nanos": 250000000
+                  }
+                },
+                {
+                  "id": "course-work-item-4",
+                  "title": "Math assignment - missed due date, turned in",
+                  "state": "PUBLISHED",
+                  "alternateLink": "https://classroom.google.com/test-link-4",
+                  "dueDate": {"year": 2023, "month": 4, "day": 5},
+                  "dueTime": {
+                    "hours": 15,
+                    "minutes": 9,
+                    "seconds": 25,
+                    "nanos": 250000000
+                  }
+                }
+              ]
+            })"))));
+  EXPECT_CALL(request_handler(),
+              HandleRequest(Field(&HttpRequest::relative_url,
+                                  HasSubstr("/studentSubmissions?"))))
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
+            {
+              "studentSubmissions": [
+                {
+                  "id": "student-submission-1",
+                  "courseWorkId": "course-work-item-1",
+                  "state": "NEW"
+                },
+                {
+                  "id": "student-submission-2",
+                  "courseWorkId": "course-work-item-2",
+                  "state": "NEW"
+                },
+                {
+                  "id": "student-submission-3",
+                  "courseWorkId": "course-work-item-3",
+                  "state": "RETURNED",
+                  "assignedGrade": 50.0
+                },
+                {
+                  "id": "student-submission-4",
+                  "courseWorkId": "course-work-item-4",
+                  "state": "TURNED_IN"
+                }
+              ]
+            })"))));
+
+  TestFuture<
+      std::vector<std::unique_ptr<GlanceablesClassroomStudentAssignment>>>
+      future;
+  client()->GetStudentAssignmentsWithMissedDueDate(future.GetCallback());
+
+  const auto assignments = future.Take();
+  ASSERT_EQ(assignments.size(), 1u);
+
+  EXPECT_EQ(assignments.at(0)->course_title, "Active Course 1");
+  EXPECT_EQ(assignments.at(0)->course_work_title,
+            "Math assignment - missed due date");
+  EXPECT_EQ(assignments.at(0)->link,
+            "https://classroom.google.com/test-link-1");
+  EXPECT_EQ(FormatTimeAsString(assignments.at(0)->due.value()),
+            "2023-04-05T15:09:25.250Z");
+}
+
+TEST_F(GlanceablesClassroomClientImplTest,
+       ReturnsStudentAssignmentsWithoutDueDate) {
+  ExpectActiveCourse();
+  EXPECT_CALL(request_handler(),
+              HandleRequest(
+                  Field(&HttpRequest::relative_url, HasSubstr("/courseWork?"))))
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
+            {
+              "courseWork": [
+                {
+                  "id": "course-work-item-1",
+                  "title": "Math assignment",
+                  "state": "PUBLISHED",
+                  "alternateLink": "https://classroom.google.com/test-link-1"
+                },
+                {
+                  "id": "course-work-item-2",
+                  "title": "Math assignment - with due date",
+                  "state": "PUBLISHED",
+                  "alternateLink": "https://classroom.google.com/test-link-2",
+                  "dueDate": {"year": 2023, "month": 4, "day": 25},
+                  "dueTime": {
+                    "hours": 15,
+                    "minutes": 9,
+                    "seconds": 25,
+                    "nanos": 250000000
+                  }
+                },
+                {
+                  "id": "course-work-item-3",
+                  "title": "Math assignment - submission graded",
+                  "state": "PUBLISHED",
+                  "alternateLink": "https://classroom.google.com/test-link-3"
+                }
+              ]
+            })"))));
+  EXPECT_CALL(request_handler(),
+              HandleRequest(Field(&HttpRequest::relative_url,
+                                  HasSubstr("/studentSubmissions?"))))
+      .WillOnce(Return(ByMove(TestRequestHandler::CreateSuccessfulResponse(R"(
+            {
+              "studentSubmissions": [
+                {
+                  "id": "student-submission-1",
+                  "courseWorkId": "course-work-item-1",
+                  "state": "NEW"
+                },
+                {
+                  "id": "student-submission-2",
+                  "courseWorkId": "course-work-item-2",
+                  "state": "NEW"
+                },
+                {
+                  "id": "student-submission-3",
+                  "courseWorkId": "course-work-item-3",
+                  "state": "RETURNED",
+                  "assignedGrade": 50.0
+                }
+              ]
+            })"))));
+
+  TestFuture<
+      std::vector<std::unique_ptr<GlanceablesClassroomStudentAssignment>>>
+      future;
+  client()->GetStudentAssignmentsWithoutDueDate(future.GetCallback());
+
+  const auto assignments = future.Take();
+  ASSERT_EQ(assignments.size(), 1u);
+
+  EXPECT_EQ(assignments.at(0)->course_title, "Active Course 1");
+  EXPECT_EQ(assignments.at(0)->course_work_title, "Math assignment");
+  EXPECT_EQ(assignments.at(0)->link,
+            "https://classroom.google.com/test-link-1");
+  EXPECT_FALSE(assignments.at(0)->due);
 }
 
 }  // namespace ash
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc
index f7e88ad..3b3bd1b 100644
--- a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc
+++ b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.cc
@@ -99,7 +99,7 @@
       app_service_instance_helper_(
           std::make_unique<AppServiceInstanceRegistryHelper>(this)) {
   aura::Env::GetInstance()->AddObserver(this);
-  Observe(&proxy_->InstanceRegistry());
+  instance_registry_observation_.Observe(&proxy_->InstanceRegistry());
 
   if (arc::IsArcAllowedForProfile(owner->profile()))
     arc_tracker_ = std::make_unique<AppServiceAppWindowArcTracker>(this);
@@ -457,7 +457,7 @@
 
 void AppServiceAppWindowShelfController::OnInstanceRegistryWillBeDestroyed(
     apps::InstanceRegistry* instance_registry) {
-  Observe(nullptr);
+  instance_registry_observation_.Reset();
 }
 
 int AppServiceAppWindowShelfController::GetActiveTaskId() const {
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.h b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.h
index beff921..899b6b65 100644
--- a/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.h
+++ b/chrome/browser/ui/ash/shelf/app_service/app_service_app_window_shelf_controller.h
@@ -12,6 +12,7 @@
 #include "ash/public/cpp/shelf_types.h"
 #include "base/memory/raw_ptr.h"
 #include "base/scoped_multi_source_observation.h"
+#include "base/scoped_observation.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_forward.h"
 #include "chrome/browser/ui/ash/shelf/app_service/app_service_instance_registry_helper.h"
 #include "chrome/browser/ui/ash/shelf/app_window_shelf_controller.h"
@@ -151,6 +152,9 @@
   AuraWindowToAppWindow aura_window_to_app_window_;
   base::ScopedMultiSourceObservation<aura::Window, aura::WindowObserver>
       observed_windows_{this};
+  base::ScopedObservation<apps::InstanceRegistry,
+                          apps::InstanceRegistry::Observer>
+      instance_registry_observation_{this};
 
   raw_ptr<apps::AppServiceProxy, ExperimentalAsh> proxy_ = nullptr;
   std::unique_ptr<AppServiceInstanceRegistryHelper>
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model.cc b/chrome/browser/ui/content_settings/content_setting_image_model.cc
index d3ed45e2..2bdd660 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model.cc
+++ b/chrome/browser/ui/content_settings/content_setting_image_model.cc
@@ -50,6 +50,7 @@
 #include "services/device/public/cpp/geolocation/location_system_permission_status.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/pointer/touch_ui_controller.h"
+#include "ui/base/ui_base_features.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/color_utils.h"
 #include "ui/gfx/favicon_size.h"
@@ -292,6 +293,80 @@
   return nullptr;
 }
 
+void GetIconChromeRefresh(ContentSettingsType type,
+                          bool blocked,
+                          raw_ptr<const gfx::VectorIcon>* icon) {
+  switch (type) {
+    case ContentSettingsType::COOKIES:
+      *icon = blocked ? &vector_icons::kCookieOffChromeRefreshIcon
+                      : &vector_icons::kCookieChromeRefreshIcon;
+      return;
+    case ContentSettingsType::IMAGES:
+      *icon = blocked ? &vector_icons::kPhotoOffChromeRefreshIcon
+                      : &vector_icons::kPhotoChromeRefreshIcon;
+      return;
+    case ContentSettingsType::JAVASCRIPT:
+      *icon = blocked ? &vector_icons::kCodeOffChromeRefreshIcon
+                      : &vector_icons::kCodeChromeRefreshIcon;
+      return;
+    case ContentSettingsType::MIXEDSCRIPT:
+      *icon = blocked ? &vector_icons::kNotSecureWarningOffChromeRefreshIcon
+                      : &vector_icons::kNotSecureWarningChromeRefreshIcon;
+      return;
+    case ContentSettingsType::SOUND:
+      *icon = blocked ? &vector_icons::kVolumeOffChromeRefreshIcon
+                      : &vector_icons::kVolumeUpChromeRefreshIcon;
+      return;
+    case ContentSettingsType::ADS:
+      *icon = blocked ? &vector_icons::kAdsOffChromeRefreshIcon
+                      : &vector_icons::kAdsChromeRefreshIcon;
+      return;
+    case ContentSettingsType::GEOLOCATION:
+      *icon = blocked ? &vector_icons::kLocationOffChromeRefreshIcon
+                      : &vector_icons::kLocationOnChromeRefreshIcon;
+      return;
+    case ContentSettingsType::PROTOCOL_HANDLERS:
+      *icon = blocked ? &vector_icons::kProtocolHandlerOffChromeRefreshIcon
+                      : &vector_icons::kProtocolHandlerChromeRefreshIcon;
+      return;
+    case ContentSettingsType::MIDI_SYSEX:
+      *icon = blocked ? &vector_icons::kMidiOffChromeRefreshIcon
+                      : &vector_icons::kMidiChromeRefreshIcon;
+      return;
+    case ContentSettingsType::AUTOMATIC_DOWNLOADS:
+      *icon = blocked ? &vector_icons::kFileDownloadOffChromeRefreshIcon
+                      : &vector_icons::kFileDownloadChromeRefreshIcon;
+      return;
+    case ContentSettingsType::CLIPBOARD_READ_WRITE:
+      *icon = blocked ? &vector_icons::kContentPasteOffChromeRefreshIcon
+                      : &vector_icons::kContentPasteChromeRefreshIcon;
+      return;
+    case ContentSettingsType::MEDIASTREAM_MIC:
+      *icon = blocked ? &vector_icons::kMicOffChromeRefreshIcon
+                      : &vector_icons::kMicChromeRefreshIcon;
+      return;
+    case ContentSettingsType::MEDIASTREAM_CAMERA:
+      *icon = blocked ? &vector_icons::kVideocamOffChromeRefreshIcon
+                      : &vector_icons::kVideocamChromeRefreshIcon;
+      return;
+    case ContentSettingsType::NOTIFICATIONS:
+      *icon = blocked ? &vector_icons::kNotificationsOffChromeRefreshIcon
+                      : &vector_icons::kNotificationsChromeRefreshIcon;
+      return;
+    case ContentSettingsType::SENSORS:
+      *icon = blocked ? &vector_icons::kSensorsOffChromeRefreshIcon
+                      : &vector_icons::kSensorsChromeRefreshIcon;
+      return;
+    case ContentSettingsType::POPUPS:
+      *icon = blocked ? &kOpenInNewOffChromeRefreshIcon
+                      : &kOpenInNewChromeRefreshIcon;
+      return;
+    default:
+      NOTREACHED();
+      return;
+  }
+}
+
 // A wrapper function that allows returning both post-chrome-refresh and
 // pre-chrome-refresh icons. To minimize code churn, this method returns two
 // icons: a base icon and a badge. The badge is painted on top of the base icon,
@@ -301,6 +376,12 @@
                      bool blocked,
                      raw_ptr<const gfx::VectorIcon>* icon,
                      raw_ptr<const gfx::VectorIcon>* badge) {
+  if (features::IsChromeRefresh2023()) {
+    *badge = &gfx::kNoneIcon;
+    GetIconChromeRefresh(type, blocked, icon);
+    return;
+  }
+
   *badge = (blocked ? &vector_icons::kBlockedBadgeIcon : &gfx::kNoneIcon);
   switch (type) {
     case ContentSettingsType::COOKIES:
@@ -534,6 +615,7 @@
 }
 
 void ContentSettingImageModel::SetFramebustBlockedIcon() {
+  // TODO(https://crbug.com/1447073): Set a cr23 icon for blocked redirect.
   icon_ = &kBlockedRedirectIcon;
   icon_badge_ = &vector_icons::kBlockedBadgeIcon;
 }
diff --git a/chrome/browser/ui/extensions/extensions_container.h b/chrome/browser/ui/extensions/extensions_container.h
index 431903d..992c8be0 100644
--- a/chrome/browser/ui/extensions/extensions_container.h
+++ b/chrome/browser/ui/extensions/extensions_container.h
@@ -81,11 +81,6 @@
   virtual void UpdateToolbarActionHoverCard(
       ToolbarActionView* action_view,
       ToolbarActionHoverCardUpdateType update_type) = 0;
-
-  // Collapses the confirmation on the request access button, effectively
-  // hiding the button. Does nothing if the confirmation is not showing
-  // anymore.
-  virtual void CollapseConfirmation() = 0;
 };
 
 #endif  // CHROME_BROWSER_UI_EXTENSIONS_EXTENSIONS_CONTAINER_H_
diff --git a/chrome/browser/ui/views/extensions/extensions_request_access_button.cc b/chrome/browser/ui/views/extensions/extensions_request_access_button.cc
index abc4fc49..b1f37cae 100644
--- a/chrome/browser/ui/views/extensions/extensions_request_access_button.cc
+++ b/chrome/browser/ui/views/extensions/extensions_request_access_button.cc
@@ -27,10 +27,6 @@
 
 namespace {
 
-// TODO(crbug.com/1452171): Same as permission's ChipController. Pull out to a
-// shared location.
-constexpr auto kConfirmationDisplayDuration = base::Seconds(4);
-
 std::vector<const extensions::Extension*> GetExtensions(
     Profile* profile,
     std::vector<extensions::ExtensionId>& extension_ids) {
@@ -60,8 +56,6 @@
 
 void ExtensionsRequestAccessButton::Update(
     std::vector<extensions::ExtensionId>& extension_ids) {
-  CHECK(!IsShowingConfirmation());
-
   extension_ids_ = extension_ids;
   SetVisible(!extension_ids_.empty());
 
@@ -77,7 +71,6 @@
       l10n_util::GetStringFUTF16Int(IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON,
                                     static_cast<int>(extension_ids_.size())),
       color);
-  SetEnabled(true);
 }
 
 // TODO(crbug.com/1390952): Remove hover card once
@@ -93,31 +86,6 @@
                                       extensions_container_, extension_ids_);
 }
 
-void ExtensionsRequestAccessButton::ResetConfirmation() {
-  SetVisible(false);
-  confirmation_origin_ = absl::nullopt;
-  collapse_timer_.AbandonAndStop();
-}
-
-bool ExtensionsRequestAccessButton::IsShowingConfirmation() const {
-  if (!confirmation_origin_.has_value()) {
-    return false;
-  }
-
-  CHECK(GetVisible());
-  return confirmation_origin_.has_value();
-}
-
-bool ExtensionsRequestAccessButton::IsShowingConfirmationFor(
-    const url::Origin& origin) const {
-  if (!confirmation_origin_.has_value()) {
-    return false;
-  }
-
-  CHECK(GetVisible());
-  return confirmation_origin_ == origin;
-}
-
 std::u16string ExtensionsRequestAccessButton::GetTooltipText(
     const gfx::Point& p) const {
   std::vector<std::u16string> tooltip_parts;
@@ -140,13 +108,6 @@
     return;
   }
 
-  // Make sure we set this before granting tab permissions, since that will
-  // trigger an update to the request access button for each extension that is
-  // granted access.
-  confirmation_origin_ =
-      web_contents->GetPrimaryMainFrame()->GetLastCommittedOrigin();
-
-  // Grant tab permission to all extensions.
   DCHECK_GT(extension_ids_.size(), 0u);
   std::vector<const extensions::Extension*> extensions_to_run =
       GetExtensions(browser_->profile(), extension_ids_);
@@ -154,23 +115,6 @@
   base::RecordAction(base::UserMetricsAction(
       "Extensions.Toolbar.ExtensionsActivatedFromRequestAccessButton"));
   action_runner->GrantTabPermissions(extensions_to_run);
-
-  // Show confirmation message, and disable the button, for a specific duration.
-  absl::optional<SkColor> color;
-  SetHighlight(l10n_util::GetStringUTF16(
-                   IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT),
-               color);
-  SetEnabled(false);
-
-  base::TimeDelta collapse_duration = remove_confirmation_for_testing_
-                                          ? base::Seconds(0)
-                                          : kConfirmationDisplayDuration;
-  // base::Unretained() below is safe because this view is tied to the lifetime
-  // of `extensions_container_`.
-  collapse_timer_.Start(
-      FROM_HERE, collapse_duration,
-      base::BindOnce(&ExtensionsContainer::CollapseConfirmation,
-                     base::Unretained(extensions_container_)));
 }
 
 content::WebContents* ExtensionsRequestAccessButton::GetActiveWebContents()
diff --git a/chrome/browser/ui/views/extensions/extensions_request_access_button.h b/chrome/browser/ui/views/extensions/extensions_request_access_button.h
index 3c13a23..ddf05b4 100644
--- a/chrome/browser/ui/views/extensions/extensions_request_access_button.h
+++ b/chrome/browser/ui/views/extensions/extensions_request_access_button.h
@@ -5,11 +5,8 @@
 #ifndef CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSIONS_REQUEST_ACCESS_BUTTON_H_
 #define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSIONS_REQUEST_ACCESS_BUTTON_H_
 
-#include "base/timer/timer.h"
 #include "chrome/browser/ui/views/toolbar/toolbar_button.h"
 #include "extensions/common/extension_id.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
-#include "url/origin.h"
 
 namespace content {
 class WebContents;
@@ -37,15 +34,6 @@
   // Displays the button's hover card, if possible.
   void MaybeShowHoverCard();
 
-  // Hides the button and resets the `confirmation_origin_` variable.
-  void ResetConfirmation();
-
-  // Returns whether the button is showing a confirmation message.
-  bool IsShowingConfirmation() const;
-
-  // Returns whether the button is showing a confirmation message for `origin`.
-  bool IsShowingConfirmationFor(const url::Origin& origin) const;
-
   // ToolbarButton:
   std::u16string GetTooltipText(const gfx::Point& p) const override;
 
@@ -57,13 +45,9 @@
   GetHoverCardCoordinatorForTesting() {
     return hover_card_coordinator_.get();
   }
-  void remove_confirmation_for_testing(bool remove_confirmation) {
-    remove_confirmation_for_testing_ = remove_confirmation;
-  }
 
  private:
-  // Grants one-time site access to `extension_ids` and shows a confirmation
-  // message on the button.
+  // Runs `extension_ids_` actions in the current site.
   void OnButtonPressed();
 
   content::WebContents* GetActiveWebContents() const;
@@ -76,16 +60,6 @@
 
   // Extensions included in the request access button.
   std::vector<extensions::ExtensionId> extension_ids_;
-
-  // The origin for which the button is displaying a confirmation message, if
-  // any.
-  absl::optional<url::Origin> confirmation_origin_;
-
-  // A timer used to collapse the button after showing a confirmation message.
-  base::OneShotTimer collapse_timer_;
-
-  // Flag to not show confirmation message in tests.
-  bool remove_confirmation_for_testing_{false};
 };
 
 #endif  // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSIONS_REQUEST_ACCESS_BUTTON_H_
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc
index 3855d0d..22b0904 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc
@@ -512,35 +512,6 @@
 
   extensions::MaybeShowExtensionControlledNewTabPage(browser_,
                                                      selection.new_contents);
-
-  // Request access button confirmation is tab-specific. Therefore, we need to
-  // reset if the active tab changes.
-  if (extensions_controls_ && extensions_controls_->IsShowingConfirmation()) {
-    extensions_controls_->ResetConfirmation();
-    UpdateControlsVisibility();
-  }
-}
-
-void ExtensionsToolbarContainer::TabChangedAt(content::WebContents* contents,
-                                              int index,
-                                              TabChangeType change_type) {
-  // Ignore changes that don't affect all the tab contents (e.g loading
-  // changes).
-  if (change_type != TabChangeType::kAll) {
-    return;
-  }
-
-  // Request access button confirmation is tab-specific for a specific origin.
-  // Therefore, we need to reset it if it's currently showing, we are on the
-  // same tab and we have navigated to another origin.
-  // Note: When we switch tabs, `OnTabStripModelChanged` is called before
-  // `TabChangedAt` and takes care of resetting the confirmation if shown.
-  if (extensions_controls_ && extensions_controls_->IsShowingConfirmation() &&
-      !extensions_controls_->IsShowingConfirmationFor(
-          contents->GetPrimaryMainFrame()->GetLastCommittedOrigin())) {
-    extensions_controls_->ResetConfirmation();
-    UpdateControlsVisibility();
-  }
 }
 
 void ExtensionsToolbarContainer::OnToolbarActionAdded(
@@ -1005,15 +976,6 @@
   action_hover_card_controller_->UpdateHoverCard(action_view, update_type);
 }
 
-void ExtensionsToolbarContainer::CollapseConfirmation() {
-  if (!extensions_controls_->IsShowingConfirmation()) {
-    return;
-  }
-
-  extensions_controls_->ResetConfirmation();
-  UpdateControlsVisibility();
-}
-
 void ExtensionsToolbarContainer::OnMouseExited(const ui::MouseEvent& event) {
   UpdateToolbarActionHoverCard(nullptr,
                                ToolbarActionHoverCardUpdateType::kHover);
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container.h b/chrome/browser/ui/views/extensions/extensions_toolbar_container.h
index 0f45497..65e2e62 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_container.h
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container.h
@@ -167,7 +167,6 @@
   void UpdateToolbarActionHoverCard(
       ToolbarActionView* action_view,
       ToolbarActionHoverCardUpdateType update_type) override;
-  void CollapseConfirmation() override;
 
   // ToolbarActionView::Delegate:
   content::WebContents* GetCurrentWebContents() override;
@@ -262,9 +261,6 @@
       TabStripModel* tab_strip_model,
       const TabStripModelChange& change,
       const TabStripSelectionChange& selection) override;
-  void TabChangedAt(content::WebContents* contents,
-                    int index,
-                    TabChangeType change_type) override;
 
   // ToolbarActionsModel::Observer:
   void OnToolbarActionAdded(
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container_interactive_uitest.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_container_interactive_uitest.cc
index 7aac0728..6a3b7451 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_container_interactive_uitest.cc
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container_interactive_uitest.cc
@@ -976,10 +976,6 @@
   EXPECT_EQ(permissions_manager->GetUserSiteAccess(*extensionC, url),
             UserSiteAccess::kOnAllSites);
 
-  // Don't show the confirmation since it's dependent on time, and we have other
-  // tests for it.
-  request_access_button()->remove_confirmation_for_testing(true);
-
   // Click the request access button to grant one-time access. A reload page
   // dialog will appear since extension A needs a page reload to run its action.
   auto* action_runner =
@@ -997,11 +993,10 @@
     EXPECT_TRUE(script_injection_listener.WaitUntilSatisfied());
     EXPECT_FALSE(request_access_button()->GetVisible());
   } else {
-    // Site interaction should change but script should not be injected since
-    // permission was granted but page was not reloaded. The request access
-    // button should be hidden, even without a reload, because the user granted
-    // access to the extensions.
-    EXPECT_FALSE(request_access_button()->GetVisible());
+    // Site interaction should change but script should not be injected
+    // since permission was granted but page was reloaded. The request access
+    // button should remain visible since we didn't reload.
+    EXPECT_TRUE(request_access_button()->GetVisible());
     // TODO(crbug.com/1400812): Is there a way to confirm we didn't inject the
     // script besides reusing the
     // chrome/test/data/extensions/blocked_actions/content_scripts/ test
@@ -1095,10 +1090,6 @@
   EXPECT_EQ(permissions_manager->GetUserSiteAccess(*extensionC, url),
             UserSiteAccess::kOnAllSites);
 
-  // Don't show the confirmation since it's dependent on time, and we have other
-  // tests for it.
-  request_access_button()->remove_confirmation_for_testing(true);
-
   // Click the request access button to grant one-time access. Since no
   // extensions need page refresh to run their actions, it immediately grants
   // access and the script is injected.
@@ -1142,55 +1133,3 @@
   EXPECT_EQ(permissions_helper.GetSiteInteraction(*extensionC, web_contents()),
             SiteInteraction::kGranted);
 }
-
-// Tests that when the user clicks on the request access button and immediately
-// navigates to a different site, the confirmation text is collapsed and the
-// button displays the extensions requesting access to the new site (if any).
-IN_PROC_BROWSER_TEST_F(
-    ExtensionsToolbarContainerFeatureUITest,
-    ClickingRequestAccessButton_ConfirmationCollapsedOnNavigation) {
-  auto extension = InstallExtensionWithHostPermissions(
-      "Extension", "<all_urls>", "document_idle");
-  extensions::ScriptingPermissionsModifier(profile(), extension)
-      .SetWithholdHostPermissions(true);
-
-  // Navigate to a site where the extension has withheld access.
-  GURL url = embedded_test_server()->GetURL("example.com", "/title1.html");
-  NavigateToUrl(url);
-
-  // Verify request access button is visible because extension is requesting
-  // site access.
-  EXPECT_TRUE(request_access_button()->GetVisible());
-  EXPECT_THAT(request_access_button()->GetExtensionIdsForTesting(),
-              testing::ElementsAre(extension->id()));
-
-  // Click the button to grant one-time access on example.com. Verify
-  // confirmation message appears on the request access button.
-  ClickButton(request_access_button());
-  EXPECT_TRUE(request_access_button()->GetVisible());
-  EXPECT_EQ(request_access_button()->GetText(),
-            l10n_util::GetStringUTF16(
-                IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT));
-
-  // While the confirmation message is still visible, navigate to a site where
-  // the extension has withheld access. Verify the confirmation is not longer
-  // shown, and the button shows the extension requesting access.
-  NavigateToUrl(embedded_test_server()->GetURL("other.com", "/title1.html"));
-  EXPECT_TRUE(request_access_button()->GetVisible());
-  EXPECT_THAT(request_access_button()->GetExtensionIdsForTesting(),
-              testing::ElementsAre(extension->id()));
-
-  // Click the button to grant one-time access on example.com. Verify
-  // confirmation message appears on the request access button.
-  ClickButton(request_access_button());
-  EXPECT_TRUE(request_access_button()->GetVisible());
-  EXPECT_EQ(request_access_button()->GetText(),
-            l10n_util::GetStringUTF16(
-                IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT));
-
-  // While the confirmation message is still visible, navigate to a site where
-  // no extensions are allowed while the confirmation message is still visible.
-  // Verify the confirmation is not longer shown and the button is hidden.
-  NavigateToUrl(GURL("chrome://extensions"));
-  EXPECT_FALSE(request_access_button()->GetVisible());
-}
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_controls.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_controls.cc
index 4c3766ed..4c451c7 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_controls.cc
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_controls.cc
@@ -81,13 +81,6 @@
     const std::vector<std::unique_ptr<ToolbarActionViewController>>& actions,
     extensions::PermissionsManager::UserSiteSetting site_setting,
     content::WebContents* web_contents) {
-  // Don't update the button if the confirmation message is currently showing;
-  // it'll go away after a few seconds. Once the confirmation is collapsed,
-  // button should be updated again.
-  if (request_access_button_->IsShowingConfirmation()) {
-    return;
-  }
-
   // Extensions are included in the request access button only when the site
   // allows customizing site access by extension, and when the extension
   // itself can show access requests in the toolbar and hasn't been dismissed.
@@ -108,18 +101,5 @@
   request_access_button_->Update(extensions);
 }
 
-void ExtensionsToolbarControls::ResetConfirmation() {
-  request_access_button_->ResetConfirmation();
-}
-
-bool ExtensionsToolbarControls::IsShowingConfirmation() const {
-  return request_access_button_->IsShowingConfirmation();
-}
-
-bool ExtensionsToolbarControls::IsShowingConfirmationFor(
-    const url::Origin& origin) const {
-  return request_access_button_->IsShowingConfirmationFor(origin);
-}
-
 BEGIN_METADATA(ExtensionsToolbarControls, ToolbarIconContainerView)
 END_METADATA
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_controls.h b/chrome/browser/ui/views/extensions/extensions_toolbar_controls.h
index 124c828..260f82a 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_controls.h
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_controls.h
@@ -55,15 +55,6 @@
       extensions::PermissionsManager::UserSiteSetting site_setting,
       content::WebContents* web_contents);
 
-  // Hides the confirmation message in the request access button.
-  void ResetConfirmation();
-
-  // Returns whether the button is showing a confirmation message.
-  bool IsShowingConfirmation() const;
-
-  // Returns whether the button is showing a confirmation message for `origin`.
-  bool IsShowingConfirmationFor(const url::Origin& origin) const;
-
   // ToolbarIconContainerView:
   void UpdateAllIcons() override;
 
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc
index ff05ac1..65225ca 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_controls_unittest.cc
@@ -20,17 +20,8 @@
 #include "extensions/test/permissions_manager_waiter.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "ui/base/l10n/l10n_util.h"
 #include "url/origin.h"
 
-namespace {
-
-// TODO(crbug.com/1452171): Same as permission's ChipController. Pull out to a
-// shared location.
-base::TimeDelta kConfirmationDisplayDuration = base::Seconds(4);
-
-}  // namespace
-
 class ExtensionsToolbarControlsUnitTest : public ExtensionsToolbarUnitTest {
  public:
   ExtensionsToolbarControlsUnitTest();
@@ -57,9 +48,7 @@
   raw_ptr<content::WebContentsTester, DanglingUntriaged> web_contents_tester_;
 };
 
-ExtensionsToolbarControlsUnitTest::ExtensionsToolbarControlsUnitTest()
-    : ExtensionsToolbarUnitTest(
-          base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
+ExtensionsToolbarControlsUnitTest::ExtensionsToolbarControlsUnitTest() {
   scoped_feature_list_.InitAndEnableFeature(
       extensions_features::kExtensionsMenuAccessControl);
 }
@@ -451,7 +440,7 @@
   base::UserActionTester user_action_tester;
   auto* permissions = extensions::PermissionsManager::Get(profile());
 
-  // Request access button is visible because the extension is requesting
+  // Request access button is visible because extension A is requesting
   // access.
   ASSERT_TRUE(request_access_button()->GetVisible());
   EXPECT_EQ(user_action_tester.GetActionCount(kActivatedUserAction), 0);
@@ -467,86 +456,18 @@
   WaitForAnimation();
   LayoutContainerIfNecessary();
 
-  // Verify extension was executed and extensions menu button has "any
-  // extension  has access" state. Extension's site access should have not
-  // changed, since clicking the button grants one time access.
+  // Verify request access button is hidden since extension executed its
+  // action. Extension's site access should have not changed, since clicking the
+  // button grants one time access.
+  ASSERT_FALSE(request_access_button()->GetVisible());
   EXPECT_EQ(user_action_tester.GetActionCount(kActivatedUserAction), 1);
-  EXPECT_EQ(extensions_button()->GetStateForTesting(),
-            ExtensionsToolbarButton::State::kAnyExtensionHasAccess);
   EXPECT_EQ(permissions->GetUserSiteAccess(*extension, url),
             extensions::PermissionsManager::UserSiteAccess::kOnClick);
 
-  // Verify confirmation message appears on the request access button.
-  EXPECT_TRUE(request_access_button()->GetVisible());
-  EXPECT_EQ(request_access_button()->GetText(),
-            l10n_util::GetStringUTF16(
-                IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT));
-
-  // Force the confirmation to be collapsed.
-  task_environment()->AdvanceClock(kConfirmationDisplayDuration);
-  base::RunLoop().RunUntilIdle();
-
-  // Verify the request access button is hidden.
-  ASSERT_FALSE(request_access_button()->GetVisible());
-}
-
-// Tests that if an update comes in between the request access button is clicked
-// and the confirmation is collapsed, the button is updated afterwards with the
-// correct information.
-TEST_F(ExtensionsToolbarControlsUnitTest,
-       RequestAccessButton_UpdateInBetweenClickAndConfirmationCollapse) {
-  auto extension_A =
-      InstallExtensionWithHostPermissions("Extension A", {"<all_urls>"});
-  auto extension_B =
-      InstallExtensionWithHostPermissions("Extension B", {"<all_urls>"});
-  auto extension_C =
-      InstallExtensionWithHostPermissions("Extension C", {"<all_urls>"});
-  WithholdHostPermissions(extension_A.get());
-  WithholdHostPermissions(extension_B.get());
-
-  const GURL url("http://www.example.com");
-  NavigateAndCommit(url);
-  LayoutContainerIfNecessary();
-
-  // Request access button is visible because extension A and B are requesting
-  // access.
-  EXPECT_TRUE(request_access_button()->GetVisible());
-  EXPECT_THAT(request_access_button()->GetExtensionIdsForTesting(),
-              testing::ElementsAre(extension_A->id(), extension_B->id()));
-
-  ClickButton(request_access_button());
-  WaitForAnimation();
-  LayoutContainerIfNecessary();
-
-  // Verify confirmation message appears on the request access button after
-  // clicking on it
-  EXPECT_TRUE(request_access_button()->GetVisible());
-  EXPECT_EQ(request_access_button()->GetText(),
-            l10n_util::GetStringUTF16(
-                IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT));
-
-  // Update a different extension before the confirmation is collapsed.
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  UpdateUserSiteAccess(
-      *extension_C, web_contents,
-      extensions::PermissionsManager::UserSiteAccess::kOnClick);
-
-  // Confirmation is still showing since collapse time hasn't elapsed.
-  EXPECT_TRUE(request_access_button()->GetVisible());
-  EXPECT_EQ(request_access_button()->GetText(),
-            l10n_util::GetStringUTF16(
-                IDS_EXTENSIONS_REQUEST_ACCESS_BUTTON_DISMISSED_TEXT));
-
-  // Force the confirmation to be collapsed.
-  task_environment()->AdvanceClock(kConfirmationDisplayDuration);
-  base::RunLoop().RunUntilIdle();
-
-  // Verify the request access button is visible since extension C is now
-  // requesting access.
-  EXPECT_TRUE(request_access_button()->GetVisible());
-  EXPECT_THAT(request_access_button()->GetExtensionIdsForTesting(),
-              testing::ElementsAre(extension_C->id()));
+  // Verify extensions menu button has "any extension  has access" state, since
+  // the extension executed its action.
+  EXPECT_EQ(extensions_button()->GetStateForTesting(),
+            ExtensionsToolbarButton::State::kAnyExtensionHasAccess);
 }
 
 class ExtensionsToolbarControlsWithPermittedSitesUnitTest
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc
index 33a99f0..aa8c5d6d 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.cc
@@ -41,10 +41,6 @@
 
 }  // namespace
 
-ExtensionsToolbarUnitTest::ExtensionsToolbarUnitTest(
-    base::test::TaskEnvironment::TimeSource time_source)
-    : TestWithBrowserView(time_source) {}
-
 void ExtensionsToolbarUnitTest::SetUp() {
   TestWithBrowserView::SetUp();
 
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h
index d2fcc350..b0595bc5 100644
--- a/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h
+++ b/chrome/browser/ui/views/extensions/extensions_toolbar_unittest.h
@@ -26,8 +26,6 @@
 class ExtensionsToolbarUnitTest : public TestWithBrowserView {
  public:
   ExtensionsToolbarUnitTest() = default;
-  explicit ExtensionsToolbarUnitTest(
-      base::test::TaskEnvironment::TimeSource time_source);
   ~ExtensionsToolbarUnitTest() override = default;
   ExtensionsToolbarUnitTest(const ExtensionsToolbarUnitTest&) = delete;
   const ExtensionsToolbarUnitTest& operator=(const ExtensionsToolbarUnitTest&) =
diff --git a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
index 2e26805..3c0d7cd 100644
--- a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
+++ b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
@@ -584,41 +584,21 @@
       views::BoxLayout::Orientation::kVertical,
       gfx::Insets::VH(0, kLeftRightPadding)));
 
-  // Add column for text.
-  views::View* const text_column =
-      row->AddChildView(std::make_unique<views::View>());
-  text_column->SetLayoutManager(std::make_unique<views::BoxLayout>(
-      views::BoxLayout::Orientation::kVertical));
-
-  // Add body for mismatch dialog.
-  views::Label* const body =
-      text_column->AddChildView(std::make_unique<views::Label>(
-          l10n_util::GetStringFUTF16(IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY,
-                                     idp_for_display, top_frame_for_display),
-          views::style::CONTEXT_DIALOG_TITLE, views::style::STYLE_PRIMARY));
+  // Add body.
+  views::Label* const body = row->AddChildView(std::make_unique<views::Label>(
+      l10n_util::GetStringFUTF16(IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_BODY,
+                                 idp_for_display),
+      views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::STYLE_SECONDARY));
   body->SetMultiLine(true);
-  body->SetBorder(
-      views::CreateEmptyBorder(gfx::Insets::VH(kVerticalSpacing, 0)));
   body->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT);
-  constexpr int kBodyLineHeight = 22;
+  constexpr int kBodyLineHeight = 20;
   body->SetLineHeight(kBodyLineHeight);
 
-  // Add description for signing in.
-  views::Label* const description =
-      text_column->AddChildView(std::make_unique<views::Label>(
-          l10n_util::GetStringUTF16(
-              IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_DESCRIPTION),
-          views::style::CONTEXT_DIALOG_BODY_TEXT,
-          views::style::STYLE_SECONDARY));
-  description->SetMultiLine(true);
-  description->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT);
-  constexpr int kDescriptionLineHeight = 20;
-  description->SetLineHeight(kDescriptionLineHeight);
-
-  // The space between the description and the continue button.
+  // Add space between the body and the separator and the body and the continue
+  // button.
   constexpr int kBottomSpacing = 16;
-  description->SetBorder(
-      views::CreateEmptyBorder(gfx::Insets::TLBR(0, 0, kBottomSpacing, 0)));
+  body->SetBorder(views::CreateEmptyBorder(
+      gfx::Insets::TLBR(kVerticalSpacing, 0, kBottomSpacing, 0)));
 
   // Add continue button.
   auto button = std::make_unique<ContinueButton>(
diff --git a/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc b/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc
index 465a9a39..30720d6c 100644
--- a/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc
+++ b/chrome/browser/ui/views/webid/account_selection_bubble_view_unittest.cc
@@ -378,25 +378,12 @@
         failure_dialog->children();
     ASSERT_EQ(failure_dialog_children.size(), 2u);
 
-    const views::View* text_column = failure_dialog_children[0];
-    const std::vector<views::View*> text_column_children =
-        text_column->children();
-    ASSERT_EQ(text_column_children.size(), 2u);
-
     // Check the body shown.
-    views::Label* body = static_cast<views::Label*>(text_column_children[0]);
+    views::Label* body = static_cast<views::Label*>(failure_dialog_children[0]);
     ASSERT_TRUE(body);
     EXPECT_EQ(body->GetText(),
-              u"Use your idp-example.com account to sign in to "
-              u"top-frame-example.com");
-
-    // Check the description shown.
-    views::Label* description =
-        static_cast<views::Label*>(text_column_children[1]);
-    ASSERT_TRUE(description);
-    EXPECT_EQ(description->GetText(),
-              l10n_util::GetStringUTF16(
-                  IDS_IDP_SIGNIN_STATUS_MISMATCH_DIALOG_DESCRIPTION));
+              u"You can use your idp-example.com account on this site. To "
+              u"continue, sign in to idp-example.com.");
 
     // Check the "Continue" button.
     views::MdTextButton* button =
diff --git a/chrome/browser/ui/web_applications/web_app_browser_controller.cc b/chrome/browser/ui/web_applications/web_app_browser_controller.cc
index 832bba0..2cdf302 100644
--- a/chrome/browser/ui/web_applications/web_app_browser_controller.cc
+++ b/chrome/browser/ui/web_applications/web_app_browser_controller.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/web_applications/web_app_browser_controller.h"
 
+#include "base/callback_list.h"
 #include "base/check_is_test.h"
 #include "base/containers/flat_set.h"
 #include "base/functional/callback.h"
diff --git a/chrome/browser/ui/web_applications/web_app_browser_controller.h b/chrome/browser/ui/web_applications/web_app_browser_controller.h
index 99fbcef..c32b237d 100644
--- a/chrome/browser/ui/web_applications/web_app_browser_controller.h
+++ b/chrome/browser/ui/web_applications/web_app_browser_controller.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <string>
 
+#include "base/callback_list.h"
 #include "base/functional/callback.h"
 #include "base/functional/callback_forward.h"
 #include "base/memory/raw_ptr.h"
diff --git a/chrome/browser/ui/webauthn/sheet_models.cc b/chrome/browser/ui/webauthn/sheet_models.cc
index 35538072f..f970e50 100644
--- a/chrome/browser/ui/webauthn/sheet_models.cc
+++ b/chrome/browser/ui/webauthn/sheet_models.cc
@@ -1331,11 +1331,11 @@
 }
 
 std::u16string AuthenticatorConnectedSheetModel::GetStepTitle() const {
-  return l10n_util::GetStringUTF16(IDS_WEBAUTHN_CABLE_ACTIVATE_TITLE_DEVICE);
+  return l10n_util::GetStringUTF16(IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION);
 }
 
 std::u16string AuthenticatorConnectedSheetModel::GetStepDescription() const {
-  return l10n_util::GetStringUTF16(IDS_WEBAUTHN_CABLEV2_CONNECTED_DESCRIPTION);
+  return u"";
 }
 
 // AuthenticatorCableErrorSheetModel ------------------------------------------
diff --git a/chrome/browser/ui/webui/internals/internals_ui.cc b/chrome/browser/ui/webui/internals/internals_ui.cc
index 538a0166..e3ef306f 100644
--- a/chrome/browser/ui/webui/internals/internals_ui.cc
+++ b/chrome/browser/ui/webui/internals/internals_ui.cc
@@ -112,11 +112,8 @@
 }
 
 void InternalsUI::AddQueryTilesInternals(content::WebUI* web_ui) {
-  source_->AddResourcePath("query_tiles_internals.js",
-                           IDR_QUERY_TILES_INTERNALS_JS);
-  source_->AddResourcePath("query_tiles_internals_browser_proxy.js",
-                           IDR_QUERY_TILES_INTERNALS_BROWSER_PROXY_JS);
-  source_->AddResourcePath("query-tiles", IDR_QUERY_TILES_INTERNALS_HTML);
+  source_->AddResourcePath(
+      "query-tiles", IDR_QUERY_TILES_INTERNALS_QUERY_TILES_INTERNALS_HTML);
   web_ui->AddMessageHandler(
       std::make_unique<QueryTilesInternalsUIMessageHandler>(profile_));
 }
diff --git a/chrome/browser/ui/webui/sandbox/sandbox_internals_ui.cc b/chrome/browser/ui/webui/sandbox/sandbox_internals_ui.cc
index b8e43498..4993a17 100644
--- a/chrome/browser/ui/webui/sandbox/sandbox_internals_ui.cc
+++ b/chrome/browser/ui/webui/sandbox/sandbox_internals_ui.cc
@@ -9,7 +9,8 @@
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/url_constants.h"
-#include "chrome/grit/dev_ui_browser_resources.h"
+#include "chrome/grit/sandbox_internals_resources.h"
+#include "chrome/grit/sandbox_internals_resources_map.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
@@ -68,8 +69,9 @@
 void CreateAndAddDataSource(Profile* profile) {
   content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd(
       profile, chrome::kChromeUISandboxHost);
-  source->SetDefaultResource(IDR_SANDBOX_INTERNALS_HTML);
-  source->AddResourcePath("sandbox_internals.js", IDR_SANDBOX_INTERNALS_JS);
+  source->AddResourcePaths(base::make_span(kSandboxInternalsResources,
+                                           kSandboxInternalsResourcesSize));
+  source->SetDefaultResource(IDR_SANDBOX_INTERNALS_SANDBOX_INTERNALS_HTML);
 
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
   SetSandboxStatusData(source);
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_validator_unittest.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_validator_unittest.cc
index a5cc1b49..aa16a4d6 100644
--- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_validator_unittest.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_validator_unittest.cc
@@ -64,10 +64,18 @@
     0xc2, 0xd9, 0xf2, 0x02, 0x03, 0x42, 0x18, 0x10, 0x12, 0x26, 0x62,
     0x88, 0xf6, 0xa3, 0xa5, 0x47, 0x14, 0x69, 0x00, 0x73};
 
-class MockIsolatedWebAppTrustChecker : public IsolatedWebAppTrustChecker {
+// This class needs to be a IsolatedWebAppTrustChecker, but also must
+// provide a TestingPrefServiceSimple that outlives it. So rather than
+// making TestingPrefServiceSimple a member, make it the leftmost base class.
+class MockIsolatedWebAppTrustChecker : private TestingPrefServiceSimple,
+                                       public IsolatedWebAppTrustChecker {
  public:
   MockIsolatedWebAppTrustChecker()
-      : IsolatedWebAppTrustChecker(TestingPrefServiceSimple()) {}
+      : IsolatedWebAppTrustChecker(
+            // Disambiguate the constructor using the form that takes the
+            // already-initialized leftmost base class, rather than the copy
+            // constructor for the uninitialized rightmost base class.
+            *static_cast<TestingPrefServiceSimple*>(this)) {}
 
   MOCK_METHOD(
       IsolatedWebAppTrustChecker::Result,
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
index d50ca208b..cb4e633 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -48,6 +48,7 @@
 
 #if BUILDFLAG(IS_MAC)
 #include "base/mac/mac_util.h"
+#include "device/fido/mac/util.h"
 #endif
 
 namespace {
@@ -414,14 +415,24 @@
                            ? Step::kPreSelectSingleAccount
                            : Step::kPreSelectAccount);
       } else {
-        // For requests with an allow list, pre-select a random credential and
-        // show that one to the user. For platform authenticators with optional
-        // UV (e.g. Touch ID), this step essentially acts as the user presence
-        // check.
+        // For requests with an allow list, pre-select a random credential.
         ephemeral_state_.creds_ = {
             transport_availability_
                 .recognized_platform_authenticator_credentials.front()};
-        SetCurrentStep(Step::kPreSelectSingleAccount);
+#if BUILDFLAG(IS_MAC)
+        if (base::FeatureList::IsEnabled(
+                device::kWebAuthnSkipSingleAccountMacOS) &&
+            device::fido::mac::DeviceHasBiometricsAvailable()) {
+          // If we can do Touch ID, jump directly to it.
+          HideDialogAndDispatchToPlatformAuthenticator();
+        } else
+#endif
+        {
+          // Otherwise show the chosen credential to the user. For platform
+          // authenticators with optional UV (e.g. Touch ID), this step
+          // essentially acts as the user presence check.
+          SetCurrentStep(Step::kPreSelectSingleAccount);
+        }
       }
       return;
     }
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 00abfe7..0c07a14 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1686635928-bc283fb9a126d45ee82f6c2ab113bcbaff2108f1.profdata
+chrome-linux-main-1686679195-33c434849e7a07bda6014953a718b27a46cc63a8.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 767b3eb..78212a9 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1686671915-f57d526d51a94ee5a559d6811ac713b0a4ae0f8e.profdata
+chrome-mac-arm-main-1686679195-d48d2451e080e197d155bf47e1f9e6dda617e83c.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 0d921a7..45f51ca 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1686635928-3621cd5bcdbf9d17753b5f865b3c1ec900dc1d05.profdata
+chrome-mac-main-1686679195-ac74d94d2c6336a23baa367010b37789b8e53e48.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index ef1cc46..d6f09d6 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1686668293-636d121caa311b2a70ca16e74db8bab74bc34891.profdata
+chrome-win32-main-1686679195-96705c2194956572f5a48a9ee26ddce3b2ee8709.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 3c60a77..0e50c53 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1686657517-dfc3ec36cfe59c606c3820dc0b1500d86a337274.profdata
+chrome-win64-main-1686679195-ae4cf23745fe2676f2bda242ad2b7d7e2f515af2.profdata
diff --git a/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia.pwg b/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia.pwg
index c0890200..76f3356 100644
--- a/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia.pwg
+++ b/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia.pwg
Binary files differ
diff --git a/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia_32.pwg b/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia_32.pwg
index c0890200..76f3356 100644
--- a/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia_32.pwg
+++ b/chrome/test/data/printing/pdf_to_pwg_raster_long_edge_test_skia_32.pwg
Binary files differ
diff --git a/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia.pwg b/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia.pwg
index ffb8f30..b8a9c9d 100644
--- a/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia.pwg
+++ b/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia.pwg
Binary files differ
diff --git a/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia_32.pwg b/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia_32.pwg
index ffb8f30..b8a9c9d 100644
--- a/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia_32.pwg
+++ b/chrome/test/data/printing/pdf_to_pwg_raster_mono_test_skia_32.pwg
Binary files differ
diff --git a/chrome/test/data/printing/pdf_to_pwg_raster_test_skia.pwg b/chrome/test/data/printing/pdf_to_pwg_raster_test_skia.pwg
index a826f7b..44b7cf7b 100644
--- a/chrome/test/data/printing/pdf_to_pwg_raster_test_skia.pwg
+++ b/chrome/test/data/printing/pdf_to_pwg_raster_test_skia.pwg
Binary files differ
diff --git a/chrome/test/data/printing/pdf_to_pwg_raster_test_skia_32.pwg b/chrome/test/data/printing/pdf_to_pwg_raster_test_skia_32.pwg
index a826f7b..44b7cf7b 100644
--- a/chrome/test/data/printing/pdf_to_pwg_raster_test_skia_32.pwg
+++ b/chrome/test/data/printing/pdf_to_pwg_raster_test_skia_32.pwg
Binary files differ
diff --git a/chrome/test/data/webui/cr_components/color_change_listener_test.ts b/chrome/test/data/webui/cr_components/color_change_listener_test.ts
index 94ebddd..b675d4d 100644
--- a/chrome/test/data/webui/cr_components/color_change_listener_test.ts
+++ b/chrome/test/data/webui/cr_components/color_change_listener_test.ts
@@ -5,7 +5,7 @@
 // clang-format off
 import {COLORS_CSS_SELECTOR, ColorChangeUpdater} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 // <if expr="chromeos_ash">
-import {addColorChangeListener, removeColorChangeListener} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
+import {COLOR_PROVIDER_CHANGED} from 'chrome://resources/cr_components/color_change_listener/colors_css_updater.js';
 // </if>
 
 import {getTrustedHTML} from 'chrome://resources/js/static_types.js';
@@ -112,33 +112,19 @@
   });
 
   // <if expr="chromeos_ash">
-  test('RegistersColorChangeListener', async () => {
+  test('AddAndRemoveColorProviderChangedListener', async () => {
     let listenerCalledTimes = 0;
-    addColorChangeListener(() => {
-      listenerCalledTimes++;
-    });
+    const listener = () => listenerCalledTimes++;
+    updater.eventTarget.addEventListener(COLOR_PROVIDER_CHANGED, listener);
 
     // Emulate a color change event from the mojo pipe.
     await updater.onColorProviderChanged();
-
     assertEquals(listenerCalledTimes, 1);
-  });
 
-  test('RemovesColorChangeListener', async () => {
-    let listenerCalledTimes = 0;
-    const listener = () => {
-      listenerCalledTimes++;
-    };
-    addColorChangeListener(listener);
+    updater.eventTarget.removeEventListener(COLOR_PROVIDER_CHANGED, listener);
 
     // Emulate a color change event from the mojo pipe.
     await updater.onColorProviderChanged();
-
-    removeColorChangeListener(listener);
-
-    // Emulate a color change event from the mojo pipe.
-    await updater.onColorProviderChanged();
-
     assertEquals(listenerCalledTimes, 1);
   });
   // </if>
diff --git a/chrome/test/data/webui/settings/chromeos/BUILD.gn b/chrome/test/data/webui/settings/chromeos/BUILD.gn
index 309acc8..1956092 100644
--- a/chrome/test/data/webui/settings/chromeos/BUILD.gn
+++ b/chrome/test/data/webui/settings/chromeos/BUILD.gn
@@ -56,7 +56,6 @@
     "nearby_share_receive_dialog_tests.js",
     "nearby_share_subpage_tests.js",
     "network_device_info_dialog_test.js",
-    "network_proxy_section_test.js",
     "onc_mojo_test.ts",
     "os_about_page_tests.js",
     "os_edit_dictionary_page_test.js",
@@ -147,6 +146,7 @@
     "internet_page/internet_config_test.ts",
     "internet_page/internet_detail_subpage_tests.js",
     "internet_page/network_always_on_vpn_test.ts",
+    "internet_page/network_proxy_section_test.ts",
     "internet_page/network_summary_item_test.ts",
     "internet_page/network_summary_test.ts",
     "internet_page/passpoint_subpage_test.ts",
diff --git a/chrome/test/data/webui/settings/chromeos/internet_page/network_proxy_section_test.ts b/chrome/test/data/webui/settings/chromeos/internet_page/network_proxy_section_test.ts
new file mode 100644
index 0000000..c795470
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/internet_page/network_proxy_section_test.ts
@@ -0,0 +1,138 @@
+// Copyright 2020 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'chrome://os-settings/lazy_load.js';
+
+import {NetworkProxySectionElement} from 'chrome://os-settings/lazy_load.js';
+import {NetworkProxyElement} from 'chrome://resources/ash/common/network/network_proxy.js';
+import {ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {ConnectionStateType, NetworkType, OncSource, PolicySource, PortalState} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+
+suite('<network-proxy-section>', () => {
+  let proxySection: NetworkProxySectionElement;
+  let props: ManagedProperties;
+
+  function initializeProps(): ManagedProperties {
+    return proxySection.managedProperties = {
+      connectionState: ConnectionStateType.MIN_VALUE,
+      source: OncSource.MIN_VALUE,
+      connectable: false,
+      portalState: PortalState.MIN_VALUE,
+      errorState: undefined,
+      guid: '',
+      ipAddressConfigType: {
+        activeValue: '',
+        policySource: PolicySource.MIN_VALUE,
+        policyValue: undefined,
+      },
+      ipConfigs: undefined,
+      metered: undefined,
+      name: undefined,
+      nameServersConfigType: {
+        activeValue: '',
+        policySource: PolicySource.MIN_VALUE,
+        policyValue: undefined,
+      },
+      priority: undefined,
+      proxySettings: undefined,
+      staticIpConfig: undefined,
+      savedIpConfig: undefined,
+      type: NetworkType.MIN_VALUE,
+      typeProperties: {
+        cellular: undefined,
+        ethernet: undefined,
+        tether: undefined,
+        vpn: undefined,
+        wifi: undefined,
+      },
+      trafficCounterProperties: {
+        lastResetTime: undefined,
+        friendlyDate: undefined,
+        autoReset: false,
+        userSpecifiedResetDay: 0,
+      },
+    };
+  }
+
+  setup(() => {
+    proxySection = document.createElement('network-proxy-section');
+    proxySection.prefs = {
+      // prefs.settings.use_shared_proxies is set by the proxy service in CrOS,
+      // which does not run in the browser_tests environment.
+      'settings': {
+        'use_shared_proxies': {
+          key: 'use_shared_proxies',
+          type: chrome.settingsPrivate.PrefType.BOOLEAN,
+          value: true,
+        },
+      },
+      'ash': {
+        'lacros_proxy_controlling_extension': {
+          key: 'ash.lacros_proxy_controlling_extension',
+          type: chrome.settingsPrivate.PrefType.DICTIONARY,
+          value: {},
+        },
+      },
+    };
+    props = initializeProps();
+    document.body.appendChild(proxySection);
+    flush();
+  });
+
+  teardown(() => {
+    proxySection.remove();
+  });
+
+  test('Visibility of Allow Shared toggle', () => {
+    const allowSharedToggle = proxySection.$.allowShared;
+
+    proxySection.managedProperties = {
+      ...props,
+      source: OncSource.kNone,
+    };
+    assertTrue(allowSharedToggle.hidden);
+
+    proxySection.managedProperties = {
+      ...props,
+      source: OncSource.kDevice,
+    };
+    assertFalse(allowSharedToggle.hidden);
+
+    proxySection.managedProperties = {
+      ...props,
+      source: OncSource.kDevicePolicy,
+    };
+    assertFalse(allowSharedToggle.hidden);
+
+    proxySection.managedProperties = {
+      ...props,
+      source: OncSource.kUser,
+    };
+    assertTrue(allowSharedToggle.hidden);
+
+    proxySection.managedProperties = {
+      ...props,
+      source: OncSource.kUserPolicy,
+    };
+    assertTrue(allowSharedToggle.hidden);
+  });
+
+  test('Disabled UI state', () => {
+    const allowSharedToggle = proxySection.$.allowShared;
+    const networkProxy =
+        proxySection.shadowRoot!.querySelector<NetworkProxyElement>(
+            'network-proxy');
+    assertTrue(!!networkProxy);
+
+    assertFalse(allowSharedToggle.disabled);
+    assertTrue(networkProxy.editable);
+
+    proxySection.disabled = true;
+
+    assertTrue(allowSharedToggle.disabled);
+    assertFalse(networkProxy.editable);
+  });
+});
diff --git a/chrome/test/data/webui/settings/chromeos/network_proxy_section_test.js b/chrome/test/data/webui/settings/chromeos/network_proxy_section_test.js
deleted file mode 100644
index 6e28c7c..0000000
--- a/chrome/test/data/webui/settings/chromeos/network_proxy_section_test.js
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'chrome://os-settings/lazy_load.js';
-
-import {OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
-import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-
-suite('NetworkProxySection', function() {
-  /** @type {!NetworkProxySectionElement|undefined} */
-  let proxySection;
-
-  setup(function() {
-    proxySection = document.createElement('network-proxy-section');
-    proxySection.prefs = {
-      // prefs.settings.use_shared_proxies is set by the proxy service in CrOS,
-      // which does not run in the browser_tests environment.
-      'settings': {
-        'use_shared_proxies': {
-          key: 'use_shared_proxies',
-          type: chrome.settingsPrivate.PrefType.BOOLEAN,
-          value: true,
-        },
-      },
-      'ash': {
-        'lacros_proxy_controlling_extension': {
-          key: 'ash.lacros_proxy_controlling_extension',
-          type: chrome.settingsPrivate.PrefType.DICTIONARY,
-          value: {},
-        },
-      },
-    };
-    document.body.appendChild(proxySection);
-    flush();
-  });
-
-  test('Visibility of Allow Shared toggle', function() {
-    const allowSharedToggle = proxySection.$.allowShared;
-    assertTrue(!!allowSharedToggle);
-
-    proxySection.managedProperties = {
-      source: OncSource.kNone,
-    };
-    assertTrue(allowSharedToggle.hidden);
-
-    proxySection.managedProperties = {
-      source: OncSource.kDevice,
-    };
-    assertFalse(allowSharedToggle.hidden);
-
-    proxySection.managedProperties = {
-      source: OncSource.kDevicePolicy,
-    };
-    assertFalse(allowSharedToggle.hidden);
-
-    proxySection.managedProperties = {
-      source: OncSource.kUser,
-    };
-    assertTrue(allowSharedToggle.hidden);
-
-    proxySection.managedProperties = {
-      source: OncSource.kUserPolicy,
-    };
-    assertTrue(allowSharedToggle.hidden);
-  });
-
-  test('Disabled UI state', function() {
-    const allowSharedToggle = proxySection.$.allowShared;
-    const networkProxy = proxySection.shadowRoot.querySelector('network-proxy');
-
-    assertFalse(allowSharedToggle.disabled);
-    assertTrue(networkProxy.editable);
-
-    proxySection.disabled = true;
-
-    assertTrue(allowSharedToggle.disabled);
-    assertFalse(networkProxy.editable);
-  });
-});
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
index 47af7646..15bd779 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -316,6 +316,10 @@
    'InternetPageNetworkAlwaysOnVpn',
    'internet_page/network_always_on_vpn_test.js'
  ],
+ [
+   'InternetPageNetworkProxySection',
+   'internet_page/network_proxy_section_test.js'
+ ],
  ['InternetPageNetworkSummary', 'internet_page/network_summary_test.js'],
  [
    'InternetPageNetworkSummaryItem',
@@ -412,7 +416,6 @@
    'nearby_share_subpage_tests.js',
    {enabled: ['features::kNearbySharing']},
  ],
- ['NetworkProxySection', 'network_proxy_section_test.js'],
  ['NetworkDeviceInfoDialog', 'network_device_info_dialog_test.js'],
  ['OncMojoTest', 'onc_mojo_test.js'],
  [
diff --git a/chrome/test/fuzzing/BUILD.gn b/chrome/test/fuzzing/BUILD.gn
index 8e1e7ec..bffd1bcb 100644
--- a/chrome/test/fuzzing/BUILD.gn
+++ b/chrome/test/fuzzing/BUILD.gn
@@ -3,6 +3,8 @@
 # found in the LICENSE file.
 
 import("//build/buildflag_header.gni")
+import("//build/config/ozone.gni")
+import("//build/config/ui.gni")
 import("//chrome/test/fuzzing/in_process_fuzzer.gni")
 
 # This target exists to reference other test executables to bring these files
@@ -39,5 +41,18 @@
     sources = [ "kombucha_in_process_fuzzer.cc" ]
 
     proto_source = "kombucha_in_process_fuzzer.proto"
+
+    deps = []
+
+    # Used for UI controls
+    if (use_aura) {
+      deps += [ "//ui/aura:test_support" ]
+    }
+    if (use_aura && use_ozone) {
+      deps += [
+        "//ui/ozone",
+        "//ui/platform_window/common:common",
+      ]
+    }
   }
 }
diff --git a/chrome/test/fuzzing/kombucha_in_process_fuzzer.cc b/chrome/test/fuzzing/kombucha_in_process_fuzzer.cc
index 9bc50f4..685584c 100644
--- a/chrome/test/fuzzing/kombucha_in_process_fuzzer.cc
+++ b/chrome/test/fuzzing/kombucha_in_process_fuzzer.cc
@@ -26,6 +26,22 @@
 #include "ui/base/interaction/element_identifier.h"
 #include "ui/base/interaction/interactive_test.h"
 
+// The following includes are used to enable ui_controls only.
+#include "ui/base/test/ui_controls.h"
+#if BUILDFLAG(IS_OZONE)
+#include "ui/views/test/test_desktop_screen_ozone.h"
+#endif
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "ash/test/ui_controls_ash.h"
+#elif BUILDFLAG(IS_WIN)
+#include "base/win/scoped_com_initializer.h"
+#include "ui/aura/test/ui_controls_aurawin.h"
+#endif
+#if defined(USE_AURA) && BUILDFLAG(IS_OZONE)
+#include "ui/ozone/public/ozone_platform.h"
+#include "ui/platform_window/common/platform_window_defaults.h"
+#endif  // defined(USE_AURA) && BUILDFLAG(IS_OZONE)
+
 #define DEFINE_BINARY_PROTO_IN_PROCESS_FUZZER(arg) \
   DEFINE_PROTO_FUZZER_IN_PROCESS_IMPL(true, arg)
 
@@ -41,13 +57,41 @@
 class KombuchaInProcessFuzzer
     : virtual public InteractiveBrowserTestT<InProcessFuzzer> {
  public:
+  ~KombuchaInProcessFuzzer() override = default;
   void SetUp() override {
     scoped_feature_list_.InitWithFeatures(
         {features::kTabGroupsSave, features::kExtensionsMenuInAppMenu}, {});
+
+    // Mouse movements require enabling ui_controls manually for tests
+    // that live outside the ui_interaction_test directory.
+    // The following is copied from
+    // chrome/test/base/interactive_ui_tests_main.cc
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+    ash::test::EnableUIControlsAsh();
+#elif BUILDFLAG(IS_WIN)
+    com_initializer_ = std::make_unique<base::win::ScopedCOMInitializer>();
+    aura::test::EnableUIControlsAuraWin();
+#elif BUILDFLAG(IS_OZONE)
+    // Notifies the platform that test config is needed. For Wayland, for
+    // example, makes its possible to use emulated input.
+    ui::test::EnableTestConfigForPlatformWindows();
+    ui::OzonePlatform::InitParams params;
+    params.single_process = true;
+    ui::OzonePlatform::InitializeForUI(params);
+    ui_controls::EnableUIControls();
+#else
+    ui_controls::EnableUIControls();
+#endif
+
     InteractiveBrowserTestT::SetUp();
   }
-
   void SetUpOnMainThread() override;
+#if BUILDFLAG(IS_WIN)
+  void TearDown() override {
+    InteractiveBrowserTestT::TearDown();
+    com_initializer_.reset();
+  }
+#endif
   int Fuzz(const uint8_t* data, size_t size) override;
   static std::unique_ptr<net::test_server::HttpResponse> HandleHTTPRequest(
       base::WeakPtr<KombuchaInProcessFuzzer> fuzzer_weak,
@@ -91,6 +135,10 @@
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
 
+#if BUILDFLAG(IS_WIN)
+  std::unique_ptr<base::win::ScopedCOMInitializer> com_initializer_;
+#endif
+
   base::WeakPtrFactory<KombuchaInProcessFuzzer> weak_ptr_factory_{this};
 };
 
@@ -102,6 +150,7 @@
       base::BindRepeating(&KombuchaInProcessFuzzer::HandleHTTPRequest,
                           weak_ptr_factory_.GetWeakPtr()));
   ASSERT_TRUE(embedded_test_server()->Start());
+
   // Accelerators for using in fuzzing
   chrome::AcceleratorProviderForBrowser(browser())->GetAcceleratorForCommandId(
       IDC_FULLSCREEN, &fullscreen_accelerator_);
diff --git a/chrome/updater/BUILD.gn b/chrome/updater/BUILD.gn
index f19f4ab..1ad00b41 100644
--- a/chrome/updater/BUILD.gn
+++ b/chrome/updater/BUILD.gn
@@ -714,6 +714,7 @@
     testonly = true
     sources = [
       "app/app_server_unittest.cc",
+      "app/app_uninstall_unittest.cc",
       "constants_unittest.cc",
       "device_management/dm_client_unittest.cc",
       "device_management/dm_message_unittest.cc",
diff --git a/chrome/updater/app/app_uninstall.cc b/chrome/updater/app/app_uninstall.cc
index dd674cd..1f42223 100644
--- a/chrome/updater/app/app_uninstall.cc
+++ b/chrome/updater/app/app_uninstall.cc
@@ -16,6 +16,7 @@
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/process/launch.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
@@ -28,6 +29,7 @@
 #include "chrome/updater/lock.h"
 #include "chrome/updater/persisted_data.h"
 #include "chrome/updater/prefs.h"
+#include "chrome/updater/updater_scope.h"
 #include "chrome/updater/updater_version.h"
 #include "chrome/updater/util/util.h"
 #include "components/update_client/update_client.h"
@@ -40,43 +42,85 @@
 #endif
 
 namespace updater {
-namespace {
 
-// Uninstalls all versions not matching this version of the updater for the
-// given `scope`.
-void UninstallOtherVersions(UpdaterScope scope) {
+std::vector<base::FilePath> GetVersionExecutablePaths(UpdaterScope scope) {
   const absl::optional<base::FilePath> updater_folder_path =
       GetInstallDirectory(scope);
   if (!updater_folder_path) {
-    LOG(ERROR) << "Failed to get updater folder path.";
-    return;
+    LOG(ERROR) << __func__ << ": failed to get the updater install directory.";
+    return {};
   }
-  base::FileEnumerator file_enumerator(*updater_folder_path, true,
+  std::vector<base::FilePath> version_executable_paths;
+  base::FileEnumerator file_enumerator(*updater_folder_path, false,
                                        base::FileEnumerator::DIRECTORIES);
   for (base::FilePath version_folder_path = file_enumerator.Next();
-       !version_folder_path.empty() &&
-       version_folder_path != GetVersionedInstallDirectory(scope);
+       !version_folder_path.empty();
        version_folder_path = file_enumerator.Next()) {
+    // Skip the current version.
+    if (version_folder_path == GetVersionedInstallDirectory(scope)) {
+      VLOG(1) << __func__
+              << " : skipping the current version: " << version_folder_path;
+      continue;
+    }
+
+#if BUILDFLAG(IS_WIN)
+    const base::Version folder_version(
+        base::WideToASCII(version_folder_path.BaseName().value()));
+#else
+    const base::Version folder_version(version_folder_path.BaseName().value());
+#endif  // BUILDFLAG(IS_WIN)
+
+    // Skip if the folder is not named as a valid version. All updater version
+    // directories are named as valid versions.
+    if (!folder_version.IsValid()) {
+      continue;
+    }
+
     const base::FilePath version_executable_path =
         version_folder_path.Append(GetExecutableRelativePath());
 
     if (base::PathExists(version_executable_path)) {
-      base::CommandLine command_line(version_executable_path);
-      command_line.AppendSwitch(kUninstallSelfSwitch);
-      if (IsSystemInstall(scope)) {
-        command_line.AppendSwitch(kSystemSwitch);
-      }
-      command_line.AppendSwitch(kEnableLoggingSwitch);
-      command_line.AppendSwitchASCII(kLoggingModuleSwitch,
-                                     kLoggingModuleSwitchValue);
-      int exit_code = -1;
-      std::string output;
-      base::GetAppOutputWithExitCode(command_line, &output, &exit_code);
+      version_executable_paths.push_back(version_executable_path);
+      VLOG(1) << __func__ << " : added to version_executable_paths: "
+              << version_executable_path;
     } else {
-      VLOG(1) << base::CommandLine::ForCurrentProcess()->GetCommandLineString()
-              << " : Path doesn't exist: " << version_executable_path;
+      VLOG(1) << __func__
+              << " : File does not exist: " << version_executable_path;
     }
   }
+
+  return version_executable_paths;
+}
+
+base::CommandLine GetUninstallSelfCommandLine(
+    UpdaterScope scope,
+    const base::FilePath& executable_path) {
+  base::CommandLine command_line(executable_path);
+  command_line.AppendSwitch(kUninstallSelfSwitch);
+  if (IsSystemInstall(scope)) {
+    command_line.AppendSwitch(kSystemSwitch);
+  }
+  command_line.AppendSwitch(kEnableLoggingSwitch);
+  command_line.AppendSwitchASCII(kLoggingModuleSwitch,
+                                 kLoggingModuleSwitchValue);
+  return command_line;
+}
+
+namespace {
+
+// Uninstalls all versions not matching the current version of the updater for
+// the given `scope`.
+void UninstallOtherVersions(UpdaterScope scope) {
+  for (const base::FilePath& version_executable_path :
+       GetVersionExecutablePaths(scope)) {
+    const base::CommandLine command_line(
+        GetUninstallSelfCommandLine(scope, version_executable_path));
+    int exit_code = -1;
+    std::string output;
+    base::GetAppOutputWithExitCode(command_line, &output, &exit_code);
+    VLOG(1) << __func__ << ": Ran: " << command_line.GetCommandLineString()
+            << ": " << output << ": " << exit_code;
+  }
 }
 
 }  // namespace
diff --git a/chrome/updater/app/app_uninstall.h b/chrome/updater/app/app_uninstall.h
index 6b798bac..969c5be 100644
--- a/chrome/updater/app/app_uninstall.h
+++ b/chrome/updater/app/app_uninstall.h
@@ -5,12 +5,26 @@
 #ifndef CHROME_UPDATER_APP_APP_UNINSTALL_H_
 #define CHROME_UPDATER_APP_APP_UNINSTALL_H_
 
+#include <vector>
+
+#include "base/command_line.h"
+#include "base/files/file_path.h"
 #include "base/memory/scoped_refptr.h"
+#include "chrome/updater/updater_scope.h"
 
 namespace updater {
 
 class App;
 
+// Returns a vector of updater executable paths from all versions underneath the
+// official install directory for `scope`, excluding the current version.
+std::vector<base::FilePath> GetVersionExecutablePaths(UpdaterScope scope);
+
+// Returns a command line to uninstall the updater at `executable_path`.
+base::CommandLine GetUninstallSelfCommandLine(
+    UpdaterScope scope,
+    const base::FilePath& executable_path);
+
 scoped_refptr<App> MakeAppUninstall();
 
 }  // namespace updater
diff --git a/chrome/updater/app/app_uninstall_unittest.cc b/chrome/updater/app/app_uninstall_unittest.cc
new file mode 100644
index 0000000..d775038
--- /dev/null
+++ b/chrome/updater/app/app_uninstall_unittest.cc
@@ -0,0 +1,65 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/updater/app/app_uninstall.h"
+
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/test/task_environment.h"
+#include "base/version.h"
+#include "chrome/updater/constants.h"
+#include "chrome/updater/test_scope.h"
+#include "chrome/updater/updater_scope.h"
+#include "chrome/updater/updater_version.h"
+#include "chrome/updater/util/unittest_util.h"
+#include "chrome/updater/util/util.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace updater {
+
+class AppUninstallTest : public testing::Test {
+ private:
+  base::test::TaskEnvironment environment_;
+};
+
+TEST_F(AppUninstallTest, GetVersionExecutablePaths) {
+#if BUILDFLAG(IS_MAC)
+  // Cannot create global prefs in the macOS system scope.
+  if (IsSystemInstall(GetTestScope())) {
+    return;
+  }
+#endif  // BUILDFLAG(IS_MAC)
+
+  for (int major_version_offset : {-2, -1, 0, 1}) {
+    updater::test::SetupFakeUpdaterVersion(
+        GetTestScope(), base::Version(kUpdaterVersion), major_version_offset,
+        /*should_create_updater_executable=*/true);
+  }
+
+  for (int major_version_offset : {2, 3}) {
+    updater::test::SetupFakeUpdaterVersion(
+        GetTestScope(), base::Version(kUpdaterVersion), major_version_offset,
+        /*should_create_updater_executable=*/false);
+  }
+
+  ASSERT_EQ(GetVersionExecutablePaths(GetTestScope()).size(), 3u);
+
+  const absl::optional<base::FilePath> path =
+      GetInstallDirectory(GetTestScope());
+  ASSERT_TRUE(path);
+  ASSERT_TRUE(base::DeletePathRecursively(*path));
+}
+
+TEST_F(AppUninstallTest, GetUninstallSelfCommandLine) {
+  const base::CommandLine command_line(GetUninstallSelfCommandLine(
+      GetTestScope(), base::FilePath(FILE_PATH_LITERAL("foobar.executable"))));
+
+  EXPECT_TRUE(command_line.HasSwitch(kUninstallSelfSwitch));
+  EXPECT_EQ(command_line.HasSwitch(kSystemSwitch),
+            IsSystemInstall(GetTestScope()));
+}
+
+}  // namespace updater
diff --git a/chrome/updater/test/integration_tests_impl.cc b/chrome/updater/test/integration_tests_impl.cc
index b60c59a..5032112e 100644
--- a/chrome/updater/test/integration_tests_impl.cc
+++ b/chrome/updater/test/integration_tests_impl.cc
@@ -492,46 +492,16 @@
   ASSERT_TRUE(base::DeleteFile(path));
 }
 
-void SetupFakeUpdaterPrefs(UpdaterScope scope, const base::Version& version) {
-  scoped_refptr<GlobalPrefs> global_prefs = CreateGlobalPrefs(scope);
-  ASSERT_TRUE(global_prefs) << "No global prefs.";
-  global_prefs->SetActiveVersion(version.GetString());
-  global_prefs->SetSwapping(false);
-  PrefsCommitPendingWrites(global_prefs->GetPrefService());
-
-  ASSERT_EQ(version.GetString(), global_prefs->GetActiveVersion());
-}
-
-void SetupFakeUpdaterInstallFolder(UpdaterScope scope,
-                                   const base::Version& version) {
-  absl::optional<base::FilePath> folder_path =
-      GetVersionedInstallDirectory(scope, version);
-  ASSERT_TRUE(folder_path);
-  ASSERT_TRUE(base::CreateDirectory(
-      folder_path->Append(GetExecutableRelativePath()).DirName()));
-}
-
-void SetupFakeUpdater(UpdaterScope scope, const base::Version& version) {
-  SetupFakeUpdaterPrefs(scope, version);
-  SetupFakeUpdaterInstallFolder(scope, version);
-}
-
-void SetupFakeUpdaterVersion(UpdaterScope scope, int offset) {
-  ASSERT_NE(offset, 0);
-  std::vector<uint32_t> components =
-      base::Version(kUpdaterVersion).components();
-  base::CheckedNumeric<uint32_t> new_version = components[0];
-  new_version += offset;
-  ASSERT_TRUE(new_version.AssignIfValid(&components[0]));
-  SetupFakeUpdater(scope, base::Version(std::move(components)));
-}
-
 void SetupFakeUpdaterLowerVersion(UpdaterScope scope) {
-  SetupFakeUpdaterVersion(scope, -1);
+  SetupFakeUpdaterVersion(scope, base::Version(kUpdaterVersion),
+                          /*major_version_offset=*/-1,
+                          /*should_create_updater_executable=*/false);
 }
 
 void SetupFakeUpdaterHigherVersion(UpdaterScope scope) {
-  SetupFakeUpdaterVersion(scope, 1);
+  SetupFakeUpdaterVersion(scope, base::Version(kUpdaterVersion),
+                          /*major_version_offset=*/1,
+                          /*should_create_updater_executable=*/false);
 }
 
 void SetExistenceCheckerPath(UpdaterScope scope,
diff --git a/chrome/updater/test/integration_tests_impl.h b/chrome/updater/test/integration_tests_impl.h
index 10a88f9..8e6630f 100644
--- a/chrome/updater/test/integration_tests_impl.h
+++ b/chrome/updater/test/integration_tests_impl.h
@@ -147,13 +147,6 @@
 // Returns the path of the Updater executable.
 absl::optional<base::FilePath> GetInstalledExecutablePath(UpdaterScope scope);
 
-// Creates Prefs with the fake updater version set as active.
-void SetupFakeUpdaterPrefs(UpdaterScope scope, const base::Version& version);
-
-// Creates an install folder on the system with the fake updater version.
-void SetupFakeUpdaterInstallFolder(UpdaterScope scope,
-                                   const base::Version& version);
-
 // Sets up a fake updater on the system at a version lower than the test.
 void SetupFakeUpdaterLowerVersion(UpdaterScope scope);
 
diff --git a/chrome/updater/test/integration_tests_win.cc b/chrome/updater/test/integration_tests_win.cc
index e7e99b8..64f70513 100644
--- a/chrome/updater/test/integration_tests_win.cc
+++ b/chrome/updater/test/integration_tests_win.cc
@@ -1877,10 +1877,12 @@
   }
 
   // Updater should have written "pv".
-  EXPECT_EQ(base::MakeRefCounted<PersistedData>(
-                scope, CreateGlobalPrefs(scope)->GetPrefService())
-                ->GetProductVersion(base::WideToASCII(kTestAppID)),
-            kTestPV);
+  const base::Version pv =
+      base::MakeRefCounted<PersistedData>(
+          scope, CreateGlobalPrefs(scope)->GetPrefService())
+          ->GetProductVersion(base::WideToASCII(kTestAppID));
+  ASSERT_TRUE(pv.IsValid());
+  EXPECT_EQ(pv, kTestPV);
 
   // App installer should have created the expected reg value.
   base::win::RegKey key;
diff --git a/chrome/updater/util/unittest_util.cc b/chrome/updater/util/unittest_util.cc
index 845490568..e1e4ea3 100644
--- a/chrome/updater/util/unittest_util.cc
+++ b/chrome/updater/util/unittest_util.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/updater/util/unittest_util.h"
 
+#include <cstdint>
 #include <memory>
 #include <string>
 #include <utility>
@@ -29,9 +30,11 @@
 #include "base/test/test_timeouts.h"
 #include "base/threading/platform_thread.h"
 #include "base/time/time.h"
+#include "base/version.h"
 #include "chrome/updater/constants.h"
 #include "chrome/updater/policy/manager.h"
 #include "chrome/updater/policy/service.h"
+#include "chrome/updater/prefs.h"
 #include "chrome/updater/test_scope.h"
 #include "chrome/updater/updater_scope.h"
 #include "chrome/updater/util/util.h"
@@ -121,6 +124,42 @@
   std::unique_ptr<testing::TestEventListener> impl_;
 };
 
+// Creates Prefs with the fake updater version set as active.
+void SetupFakeUpdaterPrefs(UpdaterScope scope, const base::Version& version) {
+  scoped_refptr<GlobalPrefs> global_prefs = CreateGlobalPrefs(scope);
+  ASSERT_TRUE(global_prefs) << "No global prefs.";
+  global_prefs->SetActiveVersion(version.GetString());
+  global_prefs->SetSwapping(false);
+  PrefsCommitPendingWrites(global_prefs->GetPrefService());
+  ASSERT_EQ(version.GetString(), global_prefs->GetActiveVersion());
+}
+
+// Creates an install folder on the system with the fake updater version.
+void SetupFakeUpdaterInstallFolder(UpdaterScope scope,
+                                   const base::Version& version,
+                                   bool should_create_updater_executable) {
+  absl::optional<base::FilePath> folder_path =
+      GetVersionedInstallDirectory(scope, version);
+  ASSERT_TRUE(folder_path);
+  const base::FilePath updater_executable_path(
+      folder_path->Append(GetExecutableRelativePath()));
+  ASSERT_TRUE(base::CreateDirectory(updater_executable_path.DirName()));
+
+  if (should_create_updater_executable) {
+    // Create a fake `updater.exe` inside the install folder.
+    ASSERT_TRUE(base::CopyFile(folder_path->DirName().AppendASCII("prefs.json"),
+                               updater_executable_path));
+  }
+}
+
+void SetupFakeUpdater(UpdaterScope scope,
+                      const base::Version& version,
+                      bool should_create_updater_executable) {
+  SetupFakeUpdaterPrefs(scope, version);
+  SetupFakeUpdaterInstallFolder(scope, version,
+                                should_create_updater_executable);
+}
+
 }  // namespace
 
 const char kChromeAppId[] = "{8A69D345-D564-463C-AFF1-A69D9E530F96}";
@@ -429,4 +468,16 @@
       .AppendASCII(file_name);
 }
 
+void SetupFakeUpdaterVersion(UpdaterScope scope,
+                             const base::Version& base_version,
+                             int major_version_offset,
+                             bool should_create_updater_executable) {
+  std::vector<uint32_t> components = base_version.components();
+  base::CheckedNumeric<uint32_t> new_version = components[0];
+  new_version += major_version_offset;
+  ASSERT_TRUE(new_version.AssignIfValid(&components[0]));
+  SetupFakeUpdater(scope, base::Version(std::move(components)),
+                   should_create_updater_executable);
+}
+
 }  // namespace updater::test
diff --git a/chrome/updater/util/unittest_util.h b/chrome/updater/util/unittest_util.h
index bc02be4e..f96138d 100644
--- a/chrome/updater/util/unittest_util.h
+++ b/chrome/updater/util/unittest_util.h
@@ -17,6 +17,7 @@
 
 namespace base {
 class TimeDelta;
+class Version;
 }  // namespace base
 
 namespace updater {
@@ -116,6 +117,14 @@
 // file in that directory.
 [[nodiscard]] base::FilePath GetTestFilePath(const char* file_name);
 
+// Sets up the official updater directory with global prefs, the versioned
+// install folder (with a version of `base_version + major_version_offset`), and
+// optionally, an empty updater executable in the versioned folder.
+void SetupFakeUpdaterVersion(UpdaterScope scope,
+                             const base::Version& base_version,
+                             int major_version_offset,
+                             bool should_create_updater_executable);
+
 }  // namespace updater::test
 
 #endif  // CHROME_UPDATER_UTIL_UNITTEST_UTIL_H_
diff --git a/chrome/updater/win/win_constants.cc b/chrome/updater/win/win_constants.cc
index 31278c7d..fbeeaed 100644
--- a/chrome/updater/win/win_constants.cc
+++ b/chrome/updater/win/win_constants.cc
@@ -48,7 +48,7 @@
 
 const wchar_t kRegKeyCompanyCloudManagement[] =
     COMPANY_POLICIES_KEY L"CloudManagement\\";
-const wchar_t kRegValueEnrollmentToken[] = L"EnrollmentToken\\";
+const wchar_t kRegValueEnrollmentToken[] = L"EnrollmentToken";
 
 const wchar_t kRegValueEnrollmentMandatory[] = L"EnrollmentMandatory";
 
diff --git a/chromecast/base/BUILD.gn b/chromecast/base/BUILD.gn
index 92ae6311d..1357586 100644
--- a/chromecast/base/BUILD.gn
+++ b/chromecast/base/BUILD.gn
@@ -312,6 +312,7 @@
 
   android_library("base_java") {
     java_src_dir = "//chromecast/base/java/src"
+    srcjar_deps = [ ":jni_headers" ]
     sources = [
       "$java_src_dir/org/chromium/chromecast/base/Both.java",
       "$java_src_dir/org/chromium/chromecast/base/Box.java",
@@ -340,7 +341,6 @@
       "//third_party/androidx:androidx_annotation_annotation_java",
       "//third_party/androidx:androidx_core_core_java",
     ]
-    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   }
 
   android_library("cast_base_test_utils_java") {
diff --git a/chromeos/ash/components/nearby/presence/credentials/local_device_data_provider_impl.cc b/chromeos/ash/components/nearby/presence/credentials/local_device_data_provider_impl.cc
index f518a71..5b825a4 100644
--- a/chromeos/ash/components/nearby/presence/credentials/local_device_data_provider_impl.cc
+++ b/chromeos/ash/components/nearby/presence/credentials/local_device_data_provider_impl.cc
@@ -93,6 +93,8 @@
 }
 
 std::string LocalDeviceDataProviderImpl::GetDeviceName() const {
+  // TODO(b/283987579): When NP Settings page is implemented, check for any
+  // changes to the user set device name.
   std::u16string device_type = ui::GetChromeOSDeviceName();
 
   const CoreAccountInfo account_info =
diff --git a/components/autofill/core/browser/data_model/credit_card.cc b/components/autofill/core/browser/data_model/credit_card.cc
index fc8f2f5..3303b1e69 100644
--- a/components/autofill/core/browser/data_model/credit_card.cc
+++ b/components/autofill/core/browser/data_model/credit_card.cc
@@ -590,8 +590,7 @@
       return number_;
 
     case CREDIT_CARD_VERIFICATION_CODE:
-      // Chrome doesn't store credit card verification codes.
-      return std::u16string();
+      return cvc_;
 
     default:
       // ComputeDataPresentForArray will hit this repeatedly.
@@ -654,7 +653,11 @@
     }
 
     case CREDIT_CARD_VERIFICATION_CODE:
-      // Chrome doesn't store the credit card verification code.
+      // network_ is default as kGenericCard, network_ will be set when setting
+      // card number.
+      if (IsValidCreditCardSecurityCode(value, network_)) {
+        cvc_ = value;
+      }
       break;
 
     default:
diff --git a/components/autofill/core/browser/data_model/credit_card_unittest.cc b/components/autofill/core/browser/data_model/credit_card_unittest.cc
index 5524653..900322a 100644
--- a/components/autofill/core/browser/data_model/credit_card_unittest.cc
+++ b/components/autofill/core/browser/data_model/credit_card_unittest.cc
@@ -1535,13 +1535,44 @@
   EXPECT_EQ(u"Visa", card.GetRawInfo(CREDIT_CARD_TYPE));
 }
 
+// Verify that we preserve exactly what the user typed for CVC.
 TEST(CreditCardTest, CreditCardVerificationCode) {
   CreditCard card(base::Uuid::GenerateRandomV4().AsLowercaseString(),
                   "https://www.example.com/");
 
-  // The verification code cannot be set, as Chrome does not store this data.
+  // CVC for generic network is 3 digit string with number characters.
   card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, u"999");
-  EXPECT_EQ(std::u16string(), card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE));
+  EXPECT_EQ(u"999", card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE));
+  EXPECT_EQ(u"999", card.cvc());
+
+  // These should fail, and preserve the previous value. CVC for generic network
+  // is 3 digit string with number characters.
+  card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, u"0");
+  EXPECT_EQ(u"999", card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE));
+  EXPECT_EQ(u"999", card.cvc());
+
+  card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, u"1");
+  EXPECT_EQ(u"999", card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE));
+  EXPECT_EQ(u"999", card.cvc());
+
+  card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, u"9999");
+  EXPECT_EQ(u"999", card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE));
+  EXPECT_EQ(u"999", card.cvc());
+
+  card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, u"12345");
+  EXPECT_EQ(u"999", card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE));
+  EXPECT_EQ(u"999", card.cvc());
+
+  card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, u"ab15");
+  EXPECT_EQ(u"999", card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE));
+  EXPECT_EQ(u"999", card.cvc());
+
+  // 15-digit Amex card number.
+  card.SetRawInfo(CREDIT_CARD_NUMBER, u"378282246310005");
+  // CVC for Amex network is 4 digit string with number characters.
+  card.SetRawInfo(CREDIT_CARD_VERIFICATION_CODE, u"9999");
+  EXPECT_EQ(u"9999", card.GetRawInfo(CREDIT_CARD_VERIFICATION_CODE));
+  EXPECT_EQ(u"9999", card.cvc());
 }
 
 // Tests that the card in only deletable if it is expired before the threshold.
diff --git a/components/commerce/core/commerce_feature_list.cc b/components/commerce/core/commerce_feature_list.cc
index a66f0d7..5d30acc 100644
--- a/components/commerce/core/commerce_feature_list.cc
+++ b/components/commerce/core/commerce_feature_list.cc
@@ -184,6 +184,10 @@
              base::FEATURE_DISABLED_BY_DEFAULT);
 #endif
 
+BASE_FEATURE(kShoppingListTrackByDefault,
+             "ShoppingListTrackByDefault",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kShoppingPDPMetrics,
              "ShoppingPDPMetrics",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/components/commerce/core/commerce_feature_list.h b/components/commerce/core/commerce_feature_list.h
index d0d2e69..642adb9b5 100644
--- a/components/commerce/core/commerce_feature_list.h
+++ b/components/commerce/core/commerce_feature_list.h
@@ -93,6 +93,7 @@
 
 BASE_DECLARE_FEATURE(kShoppingList);
 BASE_DECLARE_FEATURE(kShoppingListRegionLaunched);
+BASE_DECLARE_FEATURE(kShoppingListTrackByDefault);
 BASE_DECLARE_FEATURE(kShoppingPDPMetrics);
 BASE_DECLARE_FEATURE(kShoppingPDPMetricsRegionLaunched);
 BASE_DECLARE_FEATURE(kRetailCoupons);
diff --git a/components/commerce/core/flag_descriptions.cc b/components/commerce/core/flag_descriptions.cc
index a3d947a..56c0d5b 100644
--- a/components/commerce/core/flag_descriptions.cc
+++ b/components/commerce/core/flag_descriptions.cc
@@ -18,6 +18,10 @@
 const char kShoppingListName[] = "Shopping List";
 const char kShoppingListDescription[] = "Enable shopping list in bookmarks.";
 
+const char kShoppingListTrackByDefaultName[] = "Shopping List Track By Default";
+const char kShoppingListTrackByDefaultDescription[] =
+    "Bookmarked product pages are tracked by default if they can be.";
+
 const char kChromeCartDomBasedHeuristicsName[] =
     "ChromeCart DOM-based heuristics";
 const char kChromeCartDomBasedHeuristicsDescription[] =
diff --git a/components/commerce/core/flag_descriptions.h b/components/commerce/core/flag_descriptions.h
index 6ce3561..c9ac9bf7 100644
--- a/components/commerce/core/flag_descriptions.h
+++ b/components/commerce/core/flag_descriptions.h
@@ -19,6 +19,9 @@
 extern const char kShoppingListName[];
 extern const char kShoppingListDescription[];
 
+extern const char kShoppingListTrackByDefaultName[];
+extern const char kShoppingListTrackByDefaultDescription[];
+
 extern const char kChromeCartDomBasedHeuristicsName[];
 extern const char kChromeCartDomBasedHeuristicsDescription[];
 
diff --git a/components/commerce_strings.grdp b/components/commerce_strings.grdp
index 125eaeb..bab4bfc 100644
--- a/components/commerce_strings.grdp
+++ b/components/commerce_strings.grdp
@@ -206,11 +206,16 @@
         Typical Price
       </message>
       <message name="IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_TITLE" desc="The title name of the Price Tracking section in the Shopping Insights side panel.">
-        Save and Track price
+        Save and Track Price
       </message>
-      <!-- TODO(b/286097739): Update the string for the icon tooltip and remove the translateable attribute once strings are finalized -->
-      <message name="IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT" desc="The tooltip text for the price insights icon in the location bar." translateable="false">
-        Price Insights For This Page
+      <message name="IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_LOW_PRICE" desc="The expanded text for the price insights icon in the location bar, indicating an option has relatively low price.">
+        Price is Low
+      </message>
+      <message name="IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_HIGH_PRICE" desc="The expanded text for the price insights icon in the location bar, indicating an option has relatively high price.">
+        Price is High
+      </message>
+      <message name="IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT" desc="The tooltip text for the price insights icon in the location bar.">
+        Shopping Insights
       </message>
     </if> <!-- use_titlecase -->
     <if expr="not use_titlecase">
@@ -232,9 +237,14 @@
       <message name="IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_TITLE" desc="The title name of the Price Tracking section in the Shopping Insights side panel.">
         Save and track price
       </message>
-      <!-- TODO(b/286097739): Update the string for the icon tooltip and remove the translateable attribute once strings are finalized -->
-      <message name="IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT" desc="The tooltip text for the price insights icon in the location bar." translateable="false">
-        Price insights for this page
+      <message name="IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_LOW_PRICE" desc="The expanded text for the price insights icon in the location bar, indicating an option has relatively low price.">
+        Price is low
+      </message>
+      <message name="IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_HIGH_PRICE" desc="The expanded text for the price insights icon in the location bar, indicating an option has relatively high price.">
+        Price is high
+      </message>
+      <message name="IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT" desc="The tooltip text for the price insights icon in the location bar.">
+        Shopping insights
       </message>
     </if> <!-- not use_titlecase -->
 
@@ -280,6 +290,12 @@
     <message name="IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_DESCRIPTION" desc="The description of the Price Tracking section in the Shopping Insights side panel.">
       You'll get email alerts if the price drops on any site.
     </message>
+    <message name="IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_DONE" desc="The description of the Price Tracking section in the Shopping Insights side panel when a user successfully tracks the product displayed on the current web page. It indicates this product is currently being tracked and which bookmarks folder it is saved.">
+      You’re tracking this product. This page is saved in <ph name="LAST_BOOKMARKS_FOLDER">$1<ex>Other Bookmarks</ex></ph>.
+    </message>
+    <message name="IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_ERROR" desc="The description of the Price Tracking section in the Shopping Insights side panel when a user failed to track the product displayed on the current web page.">
+      Something went wrong. Your change wasn't saved.
+    </message>
   </if>
 
   <!-- Android only -->
diff --git a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_HIGH_PRICE.png.sha1 b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_HIGH_PRICE.png.sha1
new file mode 100644
index 0000000..f9e8ae96
--- /dev/null
+++ b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_HIGH_PRICE.png.sha1
@@ -0,0 +1 @@
+c579bc6334f458ff098d5004656dc3762aac17c9
\ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_LOW_PRICE.png.sha1 b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_LOW_PRICE.png.sha1
new file mode 100644
index 0000000..aeb417c
--- /dev/null
+++ b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_EXPANDED_TEXT_LOW_PRICE.png.sha1
@@ -0,0 +1 @@
+ece641279fd086812ff765a3fc0fd2fe248f8e15
\ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT.png.sha1 b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT.png.sha1
index 31f72f29..ebded77 100644
--- a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT.png.sha1
+++ b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_ICON_TOOLTIP_TEXT.png.sha1
@@ -1 +1 @@
-4b6fc6e0b47f2158ddd9b393171a0aef34033939
\ No newline at end of file
+f5ed254be19f398a2708d559ec4c7a6d10f23e73
\ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_DONE.png.sha1 b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_DONE.png.sha1
new file mode 100644
index 0000000..27ec014e
--- /dev/null
+++ b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_DONE.png.sha1
@@ -0,0 +1 @@
+27793ec7bb9cd9f0d505b431dfb1f6ea56f4a27b
\ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_ERROR.png.sha1 b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_ERROR.png.sha1
new file mode 100644
index 0000000..230b5d0
--- /dev/null
+++ b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_ERROR.png.sha1
@@ -0,0 +1 @@
+37cbbceef2fbeb291225743528fba8774df08f62
\ No newline at end of file
diff --git a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_TITLE.png.sha1 b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_TITLE.png.sha1
index 7e7df23..230b5d0 100644
--- a/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_TITLE.png.sha1
+++ b/components/commerce_strings_grdp/IDS_SHOPPING_INSIGHTS_SIDE_PANEL_TRACK_PRICE_TITLE.png.sha1
@@ -1 +1 @@
-490f22dd6df1e9da56ebaad3e3cf208babb4669e
\ No newline at end of file
+37cbbceef2fbeb291225743528fba8774df08f62
\ No newline at end of file
diff --git a/components/crash/android/BUILD.gn b/components/crash/android/BUILD.gn
index 3c1d1ed..c68d1e8e 100644
--- a/components/crash/android/BUILD.gn
+++ b/components/crash/android/BUILD.gn
@@ -30,8 +30,11 @@
     "//content/public/android:content_main_dex_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
   ]
-  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
-  srcjar_deps = [ ":java_enums_srcjar" ]
+
+  srcjar_deps = [
+    ":java_enums_srcjar",
+    ":jni_headers",
+  ]
   sources = [
     "java/src/org/chromium/components/crash/CustomAssertionHandler.java",
     "java/src/org/chromium/components/crash/LogcatCrashExtractor.java",
@@ -99,7 +102,8 @@
     "//base:jni_java",
     "//build/android:build_java",
   ]
-  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+
+  srcjar_deps = [ ":java_handler_jni_headers" ]
   sources = _java_handler_jni_sources
 }
 
@@ -140,7 +144,10 @@
     "//build/android:build_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
   ]
-  annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
-  srcjar_deps = [ ":anr_skipped_reason_enum" ]
+
+  srcjar_deps = [
+    ":anr_collector_jni_headers",
+    ":anr_skipped_reason_enum",
+  ]
   sources = _anr_collector_jni_sources
 }
diff --git a/components/desks_storage/core/desk_sync_bridge.cc b/components/desks_storage/core/desk_sync_bridge.cc
index 35603bfb..866ed1d 100644
--- a/components/desks_storage/core/desk_sync_bridge.cc
+++ b/components/desks_storage/core/desk_sync_bridge.cc
@@ -289,6 +289,7 @@
 
 DeskModel::GetAllEntriesResult DeskSyncBridge::GetAllEntries() {
   if (!IsReady()) {
+    LOG(WARNING) << "Unable to get all entries: Not Ready";
     return GetAllEntriesResult(GetAllEntriesStatus::kFailure,
                                std::vector<const DeskTemplate*>());
   }
@@ -309,10 +310,12 @@
 DeskModel::GetEntryByUuidResult DeskSyncBridge::GetEntryByUUID(
     const base::Uuid& uuid) {
   if (!IsReady()) {
+    LOG(WARNING) << "Unable to get entry by UUID: Not Ready";
     return GetEntryByUuidResult(GetEntryByUuidStatus::kFailure, nullptr);
   }
 
   if (!uuid.is_valid()) {
+    LOG(WARNING) << "Unable to get entry by UUID: Invalid UUID";
     return GetEntryByUuidResult(GetEntryByUuidStatus::kInvalidUuid, nullptr);
   }
 
@@ -325,6 +328,7 @@
       return GetEntryByUuidResult(GetEntryByUuidStatus::kOk,
                                   std::move(policy_entry));
     } else {
+      LOG(WARNING) << "Unable to get entry by UUID: Entry not found";
       return GetEntryByUuidResult(GetEntryByUuidStatus::kNotFound, nullptr);
     }
   } else {
@@ -338,12 +342,14 @@
   if (!IsReady()) {
     // This sync bridge has not finished initializing. Do not save the new entry
     // yet.
+    LOG(WARNING) << "Unable to add or update entry: Not Ready";
     std::move(callback).Run(AddOrUpdateEntryStatus::kFailure,
                             std::move(new_entry));
     return;
   }
 
   if (!new_entry) {
+    LOG(WARNING) << "Unable to add or update entry: No new entry";
     std::move(callback).Run(AddOrUpdateEntryStatus::kInvalidArgument,
                             std::move(new_entry));
     return;
@@ -351,6 +357,7 @@
 
   base::Uuid uuid = new_entry->uuid();
   if (!uuid.is_valid()) {
+    LOG(WARNING) << "Unable to add or update entry: Invalid UUID";
     std::move(callback).Run(AddOrUpdateEntryStatus::kInvalidArgument,
                             std::move(new_entry));
     return;
@@ -374,6 +381,7 @@
   RecordSavedDeskTemplateSizeHistogram(new_entry->type(),
                                        sync_proto.ByteSizeLong());
   if (sync_proto.ByteSizeLong() > kMaxTemplateSize) {
+    LOG(WARNING) << "Unable to add or update entry: Entry is too large";
     std::move(callback).Run(AddOrUpdateEntryStatus::kEntryTooLarge,
                             std::move(new_entry));
     return;
@@ -405,6 +413,7 @@
   if (!IsReady()) {
     // This sync bridge has not finished initializing.
     // Cannot delete anything.
+    LOG(WARNING) << "Unable to delete entry: Not Ready";
     std::move(callback).Run(DeleteEntryStatus::kFailure);
     return;
   }
@@ -439,6 +448,7 @@
   if (!IsReady()) {
     // This sync bridge has not finished initializing.
     // Cannot delete anything.
+    LOG(WARNING) << "Unable to delete entries: Not Ready";
     return DeleteEntryStatus::kFailure;
   }
 
diff --git a/components/desks_storage/core/local_desk_data_manager.cc b/components/desks_storage/core/local_desk_data_manager.cc
index e8cf2d5..4d3e26b 100644
--- a/components/desks_storage/core/local_desk_data_manager.cc
+++ b/components/desks_storage/core/local_desk_data_manager.cc
@@ -241,6 +241,7 @@
 DeskModel::GetAllEntriesResult LocalDeskDataManager::GetAllEntries() {
   std::vector<const ash::DeskTemplate*> entries;
   if (cache_status_ != CacheStatus::kOk) {
+    LOG(WARNING) << "Unable to get all entries: Cache failure";
     return GetAllEntriesResult(GetAllEntriesStatus::kFailure,
                                std::move(entries));
   }
@@ -261,11 +262,13 @@
 DeskModel::GetEntryByUuidResult LocalDeskDataManager::GetEntryByUUID(
     const base::Uuid& uuid) {
   if (cache_status_ != LocalDeskDataManager::CacheStatus::kOk) {
+    LOG(WARNING) << "Unable to get entry by UUID: Cache failure";
     return DeskModel::GetEntryByUuidResult(
         DeskModel::GetEntryByUuidStatus::kFailure, nullptr);
   }
 
   if (!uuid.is_valid()) {
+    LOG(WARNING) << "Unable to get entry by UUID: Invalid UUID";
     return DeskModel::GetEntryByUuidResult(
         DeskModel::GetEntryByUuidStatus::kInvalidUuid, nullptr);
   }
@@ -282,6 +285,7 @@
       return DeskModel::GetEntryByUuidResult(
           DeskModel::GetEntryByUuidStatus::kOk, std::move(policy_entry));
     } else {
+      LOG(WARNING) << "Unable to get entry by UUID: Entry not found";
       return DeskModel::GetEntryByUuidResult(
           DeskModel::GetEntryByUuidStatus::kNotFound, nullptr);
     }
@@ -295,6 +299,7 @@
     std::unique_ptr<ash::DeskTemplate> new_entry,
     AddOrUpdateEntryCallback callback) {
   if (cache_status_ != CacheStatus::kOk) {
+    LOG(WARNING) << "Unable to add or update entry: Cache failure";
     std::move(callback).Run(AddOrUpdateEntryStatus::kFailure,
                             std::move(new_entry));
     return;
@@ -303,6 +308,7 @@
   const ash::DeskTemplateType desk_type = new_entry->type();
   const base::Uuid uuid = new_entry->uuid();
   if (!uuid.is_valid() || desk_type == ash::DeskTemplateType::kUnknown) {
+    LOG(WARNING) << "Unable to add or update entry: Invalid UUID or Desk Type";
     std::move(callback).Run(AddOrUpdateEntryStatus::kInvalidArgument,
                             std::move(new_entry));
     return;
@@ -310,6 +316,7 @@
   size_t template_type_max_size = GetMaxEntryCountByDeskType(desk_type);
   if (!g_disable_max_template_limit &&
       saved_desks_list_[desk_type].size() >= template_type_max_size) {
+    LOG(WARNING) << "Unable to add entry: Maximum Desk Limit Reached";
     std::move(callback).Run(AddOrUpdateEntryStatus::kHitMaximumLimit,
                             std::move(new_entry));
     return;
@@ -352,6 +359,7 @@
 void LocalDeskDataManager::DeleteEntry(const base::Uuid& uuid,
                                        DeleteEntryCallback callback) {
   if (cache_status_ != CacheStatus::kOk) {
+    LOG(WARNING) << "Unable to delete entry: Cache failure";
     std::move(callback).Run(DeleteEntryStatus::kFailure);
     return;
   }
@@ -388,6 +396,7 @@
 
 void LocalDeskDataManager::DeleteAllEntries(DeleteEntryCallback callback) {
   if (cache_status_ != CacheStatus::kOk) {
+    LOG(WARNING) << "Unable to delete entry: Cache failure";
     std::move(callback).Run(DeleteEntryStatus::kFailure);
     return;
   }
@@ -571,6 +580,7 @@
     RecordSavedDeskTemplateSizeHistogram(desk_type, file_size);
     return AddOrUpdateEntryStatus::kOk;
   }
+  LOG(WARNING) << "Unable to add or update entry: Unable to write template file";
   return AddOrUpdateEntryStatus::kFailure;
 }
 
@@ -605,6 +615,7 @@
   if (base::DeleteFile(fully_qualified_path)) {
     return {DeleteEntryStatus::kOk, std::move(roll_back_entry)};
   }
+  LOG(WARNING) << "Unable to delete entry: File is not a qualified path";
   return {DeleteEntryStatus::kFailure, std::move(roll_back_entry)};
 }
 
@@ -615,6 +626,7 @@
     std::vector<std::unique_ptr<ash::DeskTemplate>> entries) {
   if (!base::DirReaderPosix(local_saved_desk_path.AsUTF8Unsafe().c_str())
            .IsValid()) {
+    LOG(WARNING) << "Unable to delete all entries: Path is invalid";
     return {DeleteEntryStatus::kFailure, std::move(entries)};
   }
   DeleteEntryStatus overall_delete_successes = DeleteEntryStatus::kOk;
@@ -631,6 +643,7 @@
       *it = std::move(entries.back());
       entries.pop_back();
     } else {
+      LOG(WARNING) << "Unable to delete entry: File not successfully deleted.";
       overall_delete_successes = DeleteEntryStatus::kFailure;
       ++it;
     }
diff --git a/components/fuchsia_component_support/dynamic_component_host.cc b/components/fuchsia_component_support/dynamic_component_host.cc
index 8268938..94f2b40 100644
--- a/components/fuchsia_component_support/dynamic_component_host.cc
+++ b/components/fuchsia_component_support/dynamic_component_host.cc
@@ -7,6 +7,7 @@
 #include <fuchsia/io/cpp/fidl.h>
 #include <lib/sys/cpp/component_context.h>
 #include <lib/sys/cpp/service_directory.h>
+#include <lib/vfs/cpp/pseudo_dir.h>
 #include <lib/vfs/cpp/remote_dir.h>
 
 #include <memory>
diff --git a/components/messages/android/BUILD.gn b/components/messages/android/BUILD.gn
index f32baef..a78594e 100644
--- a/components/messages/android/BUILD.gn
+++ b/components/messages/android/BUILD.gn
@@ -14,6 +14,7 @@
     "java/src/org/chromium/components/messages/MessageDispatcherBridge.java",
     "java/src/org/chromium/components/messages/MessageDispatcherProvider.java",
     "java/src/org/chromium/components/messages/MessageFeatureList.java",
+    "java/src/org/chromium/components/messages/MessageFeatureMap.java",
     "java/src/org/chromium/components/messages/MessageSecondaryMenuItems.java",
     "java/src/org/chromium/components/messages/MessageWrapper.java",
     "java/src/org/chromium/components/messages/MessagesMetrics.java",
@@ -70,7 +71,7 @@
 generate_jni("jni_headers") {
   sources = [
     "java/src/org/chromium/components/messages/MessageDispatcherBridge.java",
-    "java/src/org/chromium/components/messages/MessageFeatureList.java",
+    "java/src/org/chromium/components/messages/MessageFeatureMap.java",
     "java/src/org/chromium/components/messages/MessageWrapper.java",
   ]
 }
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java b/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java
index e351657..10e87ac 100644
--- a/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureList.java
@@ -4,33 +4,17 @@
 
 package org.chromium.components.messages;
 
-import org.chromium.base.FeatureList;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.base.annotations.NativeMethods;
-
 /**
- * Provides an API for querying the status of Message features.
+ * Lists base::Features that can be accessed through {@link MessageFeatureMap}.
+ *
+ * Should be kept in sync with |kFeaturesExposedToJava| in
+ * //components/messages/android/messages_feature.cc
  */
-@JNINamespace("messages")
-public class MessageFeatureList {
+public abstract class MessageFeatureList {
     public static final String MESSAGES_FOR_ANDROID_STACKING_ANIMATION =
             "MessagesForAndroidStackingAnimation";
 
-    private MessageFeatureList() {}
-
-    public static boolean isEnabled(String featureName) {
-        Boolean testValue = FeatureList.getTestValueForFeature(featureName);
-        if (testValue != null) return testValue;
-        assert FeatureList.isNativeInitialized();
-        return MessageFeatureListJni.get().isEnabled(featureName);
-    }
-
     public static boolean isStackAnimationEnabled() {
-        return isEnabled(MESSAGES_FOR_ANDROID_STACKING_ANIMATION);
-    }
-
-    @NativeMethods
-    interface Natives {
-        boolean isEnabled(String featureName);
+        return MessageFeatureMap.isEnabled(MESSAGES_FOR_ANDROID_STACKING_ANIMATION);
     }
 }
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureMap.java b/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureMap.java
new file mode 100644
index 0000000..483d71b7
--- /dev/null
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessageFeatureMap.java
@@ -0,0 +1,44 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.components.messages;
+
+import org.chromium.base.FeatureMap;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
+
+/**
+ * Java accessor for base::Features listed in {@link MessageFeatureList}
+ */
+@JNINamespace("messages")
+public final class MessageFeatureMap extends FeatureMap {
+    private static final MessageFeatureMap sInstance = new MessageFeatureMap();
+
+    // Do not instantiate this class.
+    private MessageFeatureMap() {}
+
+    /**
+     * @return the singleton MessageFeatureMap.
+     */
+    public static MessageFeatureMap getInstance() {
+        return sInstance;
+    }
+
+    /**
+     * Convenience method to call {@link #isEnabledInNative(String)} statically.
+     */
+    public static boolean isEnabled(String featureName) {
+        return getInstance().isEnabledInNative(featureName);
+    }
+
+    @Override
+    protected long getNativeMap() {
+        return MessageFeatureMapJni.get().getNativeMap();
+    }
+
+    @NativeMethods
+    public interface Natives {
+        long getNativeMap();
+    }
+}
diff --git a/components/messages/android/messages_feature.cc b/components/messages/android/messages_feature.cc
index 7a18ff39..f789639 100644
--- a/components/messages/android/messages_feature.cc
+++ b/components/messages/android/messages_feature.cc
@@ -4,13 +4,11 @@
 
 #include "components/messages/android/messages_feature.h"
 
-#include "base/android/jni_string.h"
+#include "base/android/feature_map.h"
 #include "base/feature_list.h"
 #include "base/metrics/field_trial_params.h"
-#include "components/messages/android/jni_headers/MessageFeatureList_jni.h"
-
-using base::android::ConvertJavaStringToUTF8;
-using base::android::JavaParamRef;
+#include "base/no_destructor.h"
+#include "components/messages/android/jni_headers/MessageFeatureMap_jni.h"
 
 namespace messages {
 
@@ -20,14 +18,11 @@
     &kMessagesForAndroidStackingAnimation,
 };
 
-const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
-  for (const base::Feature* feature : kFeaturesExposedToJava) {
-    if (feature->name == feature_name)
-      return feature;
-  }
-  NOTREACHED() << "Queried feature not found in MessageFeatureList: "
-               << feature_name;
-  return nullptr;
+// static
+base::android::FeatureMap* GetFeatureMap() {
+  static base::NoDestructor<base::android::FeatureMap> kFeatureMap(std::vector(
+      std::begin(kFeaturesExposedToJava), std::end(kFeaturesExposedToJava)));
+  return kFeatureMap.get();
 }
 
 }  // namespace
@@ -90,12 +85,8 @@
          base::FeatureList::IsEnabled(kMessagesForAndroidStackingAnimation);
 }
 
-static jboolean JNI_MessageFeatureList_IsEnabled(
-    JNIEnv* env,
-    const JavaParamRef<jstring>& jfeature_name) {
-  const base::Feature* feature =
-      FindFeatureExposedToJava(ConvertJavaStringToUTF8(env, jfeature_name));
-  return base::FeatureList::IsEnabled(*feature);
+static jlong JNI_MessageFeatureMap_GetNativeMap(JNIEnv* env) {
+  return reinterpret_cast<jlong>(GetFeatureMap());
 }
 
 }  // namespace messages
diff --git a/components/omnibox/browser/vector_icons/http_chrome_refresh.icon b/components/omnibox/browser/vector_icons/http_chrome_refresh.icon
index 5a01699..5e4f82b 100644
--- a/components/omnibox/browser/vector_icons/http_chrome_refresh.icon
+++ b/components/omnibox/browser/vector_icons/http_chrome_refresh.icon
@@ -2,126 +2,49 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-CANVAS_DIMENSIONS, 32,
-MOVE_TO, 14.8f, 22.67f,
-H_LINE_TO, 17.27f,
-V_LINE_TO, 14.67f,
-H_LINE_TO, 14.8f,
-V_LINE_TO, 22.67f,
-CLOSE,
-MOVE_TO, 16, 12.07f,
-CUBIC_TO, 16.36f, 12.07f, 16.66f, 11.96f, 16.9f, 11.73f,
-CUBIC_TO, 17.14f, 11.49f, 17.27f, 11.19f, 17.27f, 10.83f,
-CUBIC_TO, 17.27f, 10.48f, 17.14f, 10.18f, 16.9f, 9.93f,
-CUBIC_TO, 16.66f, 9.69f, 16.36f, 9.57f, 16, 9.57f,
-CUBIC_TO, 15.64f, 9.57f, 15.34f, 9.69f, 15.1f, 9.93f,
-CUBIC_TO, 14.86f, 10.18f, 14.73f, 10.48f, 14.73f, 10.83f,
-CUBIC_TO, 14.73f, 11.19f, 14.86f, 11.49f, 15.1f, 11.73f,
-CUBIC_TO, 15.34f, 11.96f, 15.64f, 12.07f, 16, 12.07f,
-CLOSE,
-MOVE_TO, 16, 29.33f,
-CUBIC_TO, 14.16f, 29.33f, 12.42f, 28.99f, 10.8f, 28.3f,
-CUBIC_TO, 9.18f, 27.59f, 7.77f, 26.63f, 6.57f, 25.43f,
-CUBIC_TO, 5.37f, 24.23f, 4.41f, 22.82f, 3.7f, 21.2f,
-CUBIC_TO, 3.01f, 19.58f, 2.67f, 17.84f, 2.67f, 16,
-CUBIC_TO, 2.67f, 14.16f, 3.01f, 12.42f, 3.7f, 10.8f,
-CUBIC_TO, 4.41f, 9.18f, 5.37f, 7.77f, 6.57f, 6.57f,
-CUBIC_TO, 7.77f, 5.37f, 9.18f, 4.42f, 10.8f, 3.73f,
-CUBIC_TO, 12.42f, 3.02f, 14.16f, 2.67f, 16, 2.67f,
-CUBIC_TO, 17.84f, 2.67f, 19.58f, 3.02f, 21.2f, 3.73f,
-CUBIC_TO, 22.82f, 4.42f, 24.23f, 5.37f, 25.43f, 6.57f,
-CUBIC_TO, 26.63f, 7.77f, 27.58f, 9.18f, 28.27f, 10.8f,
-CUBIC_TO, 28.98f, 12.42f, 29.33f, 14.16f, 29.33f, 16,
-CUBIC_TO, 29.33f, 17.84f, 28.98f, 19.58f, 28.27f, 21.2f,
-CUBIC_TO, 27.58f, 22.82f, 26.63f, 24.23f, 25.43f, 25.43f,
-CUBIC_TO, 24.23f, 26.63f, 22.82f, 27.59f, 21.2f, 28.3f,
-CUBIC_TO, 19.58f, 28.99f, 17.84f, 29.33f, 16, 29.33f,
-CLOSE,
-MOVE_TO, 16, 26.9f,
-CUBIC_TO, 19.04f, 26.9f, 21.62f, 25.84f, 23.73f, 23.73f,
-CUBIC_TO, 25.84f, 21.6f, 26.9f, 19.02f, 26.9f, 16,
-CUBIC_TO, 26.9f, 12.96f, 25.84f, 10.38f, 23.73f, 8.27f,
-CUBIC_TO, 21.62f, 6.16f, 19.04f, 5.1f, 16, 5.1f,
-CUBIC_TO, 12.98f, 5.1f, 10.4f, 6.16f, 8.27f, 8.27f,
-CUBIC_TO, 6.16f, 10.38f, 5.1f, 12.96f, 5.1f, 16,
-CUBIC_TO, 5.1f, 19.02f, 6.16f, 21.6f, 8.27f, 23.73f,
-CUBIC_TO, 10.4f, 25.84f, 12.98f, 26.9f, 16, 26.9f,
-CLOSE,
-NEW_PATH
-
-CANVAS_DIMENSIONS, 20,
-MOVE_TO, 9.25f, 14,
-H_LINE_TO, 10.75f,
-V_LINE_TO, 9,
-H_LINE_TO, 9.25f,
-V_LINE_TO, 14,
-CLOSE,
-MOVE_TO, 10, 7.5f,
-CUBIC_TO, 10.21f, 7.5f, 10.38f, 7.43f, 10.52f, 7.29f,
-CUBIC_TO, 10.67f, 7.14f, 10.75f, 6.96f, 10.75f, 6.75f,
-CUBIC_TO, 10.75f, 6.54f, 10.67f, 6.37f, 10.52f, 6.23f,
-CUBIC_TO, 10.38f, 6.08f, 10.21f, 6, 10, 6,
-CUBIC_TO, 9.79f, 6, 9.61f, 6.08f, 9.46f, 6.23f,
-CUBIC_TO, 9.32f, 6.37f, 9.25f, 6.54f, 9.25f, 6.75f,
-CUBIC_TO, 9.25f, 6.96f, 9.32f, 7.14f, 9.46f, 7.29f,
-CUBIC_TO, 9.61f, 7.43f, 9.79f, 7.5f, 10, 7.5f,
-CLOSE,
-MOVE_TO, 10, 18,
-CUBIC_TO, 8.9f, 18, 7.87f, 17.79f, 6.9f, 17.38f,
-CUBIC_TO, 5.92f, 16.96f, 5.07f, 16.39f, 4.33f, 15.67f,
-CUBIC_TO, 3.61f, 14.93f, 3.04f, 14.08f, 2.63f, 13.1f,
-CUBIC_TO, 2.21f, 12.13f, 2, 11.1f, 2, 10,
-CUBIC_TO, 2, 8.89f, 2.21f, 7.85f, 2.63f, 6.9f,
-CUBIC_TO, 3.04f, 5.92f, 3.61f, 5.08f, 4.33f, 4.35f,
-CUBIC_TO, 5.07f, 3.62f, 5.92f, 3.04f, 6.9f, 2.63f,
-CUBIC_TO, 7.87f, 2.21f, 8.9f, 2, 10, 2,
-CUBIC_TO, 11.11f, 2, 12.15f, 2.21f, 13.1f, 2.63f,
-CUBIC_TO, 14.08f, 3.04f, 14.92f, 3.62f, 15.65f, 4.35f,
-CUBIC_TO, 16.38f, 5.08f, 16.96f, 5.92f, 17.38f, 6.9f,
-CUBIC_TO, 17.79f, 7.85f, 18, 8.89f, 18, 10,
-CUBIC_TO, 18, 11.1f, 17.79f, 12.13f, 17.38f, 13.1f,
-CUBIC_TO, 16.96f, 14.08f, 16.38f, 14.93f, 15.65f, 15.67f,
-CUBIC_TO, 14.92f, 16.39f, 14.08f, 16.96f, 13.1f, 17.38f,
-CUBIC_TO, 12.15f, 17.79f, 11.11f, 18, 10, 18,
-CLOSE,
-MOVE_TO, 10, 16.5f,
-CUBIC_TO, 11.81f, 16.5f, 13.34f, 15.87f, 14.6f, 14.6f,
-CUBIC_TO, 15.87f, 13.34f, 16.5f, 11.81f, 16.5f, 10,
-CUBIC_TO, 16.5f, 8.19f, 15.87f, 6.66f, 14.6f, 5.4f,
-CUBIC_TO, 13.34f, 4.13f, 11.81f, 3.5f, 10, 3.5f,
-CUBIC_TO, 8.19f, 3.5f, 6.66f, 4.13f, 5.4f, 5.4f,
-CUBIC_TO, 4.13f, 6.66f, 3.5f, 8.19f, 3.5f, 10,
-CUBIC_TO, 3.5f, 11.81f, 4.13f, 13.34f, 5.4f, 14.6f,
-CUBIC_TO, 6.66f, 15.87f, 8.19f, 16.5f, 10, 16.5f,
-CLOSE,
-NEW_PATH
-
-
 CANVAS_DIMENSIONS, 16,
-MOVE_TO, 8, 1,
-CUBIC_TO, 4.13f, 1, 1, 4.13f, 1, 8,
-CUBIC_TO, 1, 11.87f, 4.13f, 15, 8, 15,
-CUBIC_TO, 11.87f, 15, 15, 11.87f, 15, 8,
-CUBIC_TO, 15, 4.13f, 11.87f, 1, 8, 1,
+MOVE_TO, 7.26f, 11.34f,
+R_H_LINE_TO, 1.48f,
+V_LINE_TO, 7.2f,
+H_LINE_TO, 7.26f,
 CLOSE,
-MOVE_TO, 8, 13.5f,
-CUBIC_TO, 4.97f, 13.5f, 2.5f, 11.03f, 2.5f, 8,
-CUBIC_TO, 2.5f, 4.97f, 4.97f, 2.5f, 8, 2.5f,
-CUBIC_TO, 11.03f, 2.5f, 13.5f, 4.97f, 13.5f, 8,
-CUBIC_TO, 13.5f, 11.03f, 11.03f, 13.5f, 8, 13.5f,
+R_MOVE_TO, 0.74f, -5.15f,
+R_CUBIC_TO, 0.22f, 0, 0.41f, -0.07f, 0.56f, -0.23f,
+R_ARC_TO, 0.75f, 0.75f, 0, 0, 0, 0.23f, -0.56f,
+R_ARC_TO, 0.76f, 0.76f, 0, 0, 0, -0.23f, -0.56f,
+R_ARC_TO, 0.75f, 0.75f, 0, 0, 0, -0.56f, -0.23f,
+R_ARC_TO, 0.78f, 0.78f, 0, 0, 0, -0.79f, 0.78f,
+R_ARC_TO, 0.78f, 0.78f, 0, 0, 0, 0.79f, 0.79f,
 CLOSE,
-NEW_PATH,
-MOVE_TO, 8.75f, 7.5f,
-H_LINE_TO, 7.25f,
-V_LINE_TO, 11.5f,
-H_LINE_TO, 8.75f,
-V_LINE_TO, 7.5f,
+R_MOVE_TO, 0.01f, 8.53f,
+R_CUBIC_TO, -0.93f, 0, -1.8f, -0.17f, -2.62f, -0.52f,
+R_ARC_TO, 6.67f, 6.67f, 0, 0, 1, -2.14f, -1.44f,
+R_ARC_TO, 6.7f, 6.7f, 0, 0, 1, -1.44f, -2.14f,
+R_ARC_TO, 6.56f, 6.56f, 0, 0, 1, -0.52f, -2.62f,
+R_CUBIC_TO, 0, -0.93f, 0.17f, -1.8f, 0.52f, -2.62f,
+R_ARC_TO, 6.71f, 6.71f, 0, 0, 1, 1.44f, -2.13f,
+R_ARC_TO, 6.7f, 6.7f, 0, 0, 1, 2.14f, -1.44f,
+R_ARC_TO, 6.56f, 6.56f, 0, 0, 1, 2.63f, -0.52f,
+R_CUBIC_TO, 0.93f, 0, 1.81f, 0.17f, 2.62f, 0.52f,
+R_CUBIC_TO, 0.81f, 0.35f, 1.52f, 0.83f, 2.13f, 1.44f,
+R_ARC_TO, 6.68f, 6.68f, 0, 0, 1, 1.44f, 2.13f,
+R_CUBIC_TO, 0.35f, 0.81f, 0.52f, 1.68f, 0.52f, 2.62f,
+R_CUBIC_TO, 0, 0.93f, -0.17f, 1.81f, -0.52f, 2.62f,
+R_ARC_TO, 6.67f, 6.67f, 0, 0, 1, -1.44f, 2.14f,
+R_ARC_TO, 6.68f, 6.68f, 0, 0, 1, -2.13f, 1.44f,
+R_ARC_TO, 6.51f, 6.51f, 0, 0, 1, -2.62f, 0.52f,
 CLOSE,
-NEW_PATH,
-MOVE_TO, 8, 6,
-CUBIC_TO, 8.41f, 6, 8.75f, 5.66f, 8.75f, 5.25f,
-CUBIC_TO, 8.75f, 4.84f, 8.41f, 4.5f, 8, 4.5f,
-CUBIC_TO, 7.59f, 4.5f, 7.25f, 4.84f, 7.25f, 5.25f,
-CUBIC_TO, 7.25f, 5.66f, 7.59f, 6, 8, 6,
+MOVE_TO, 8, 13.09f,
+R_CUBIC_TO, 1.42f, 0, 2.62f, -0.49f, 3.61f, -1.48f,
+R_CUBIC_TO, 0.98f, -0.99f, 1.48f, -2.19f, 1.48f, -3.61f,
+R_CUBIC_TO, 0, -1.42f, -0.49f, -2.62f, -1.48f, -3.61f,
+CUBIC_TO, 10.62f, 3.41f, 9.42f, 2.92f, 8, 2.92f,
+R_CUBIC_TO, -1.42f, 0, -2.62f, 0.49f, -3.61f, 1.48f,
+CUBIC_TO, 3.41f, 5.38f, 2.92f, 6.58f, 2.92f, 8,
+R_CUBIC_TO, 0, 1.42f, 0.49f, 2.62f, 1.48f, 3.61f,
+R_CUBIC_TO, 0.99f, 0.98f, 2.19f, 1.48f, 3.61f, 1.48f,
 CLOSE,
-NEW_PATH
+MOVE_TO, 8, 8,
+CLOSE,
+R_MOVE_TO, 0, 0,
+CLOSE
diff --git a/components/omnibox/browser/vector_icons/product_chrome_refresh.icon b/components/omnibox/browser/vector_icons/product_chrome_refresh.icon
index 6f6ada3..4996e24c 100644
--- a/components/omnibox/browser/vector_icons/product_chrome_refresh.icon
+++ b/components/omnibox/browser/vector_icons/product_chrome_refresh.icon
@@ -2,100 +2,48 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-CANVAS_DIMENSIONS, 32,
-MOVE_TO, 10.67f, 16.1f,
-CUBIC_TO, 10.67f, 17.57f, 11.19f, 18.82f, 12.23f, 19.87f,
-CUBIC_TO, 13.28f, 20.91f, 14.53f, 21.43f, 16, 21.43f,
-CUBIC_TO, 17.47f, 21.43f, 18.72f, 20.91f, 19.77f, 19.87f,
-CUBIC_TO, 20.81f, 18.82f, 21.33f, 17.57f, 21.33f, 16.1f,
-CUBIC_TO, 21.33f, 14.63f, 20.81f, 13.38f, 19.77f, 12.33f,
-CUBIC_TO, 18.72f, 11.29f, 17.47f, 10.77f, 16, 10.77f,
-CUBIC_TO, 14.53f, 10.77f, 13.28f, 11.29f, 12.23f, 12.33f,
-CUBIC_TO, 11.19f, 13.38f, 10.67f, 14.63f, 10.67f, 16.1f,
-CLOSE,
-MOVE_TO, 16, 24.1f,
-CUBIC_TO, 16.29f, 24.1f, 16.57f, 24.09f, 16.83f, 24.07f,
-CUBIC_TO, 17.1f, 24.04f, 17.37f, 24, 17.63f, 23.93f,
-LINE_TO, 14.5f, 29.33f,
-CUBIC_TO, 11.14f, 28.96f, 8.33f, 27.52f, 6.07f, 25.03f,
-CUBIC_TO, 3.8f, 22.52f, 2.67f, 19.54f, 2.67f, 16.1f,
-CUBIC_TO, 2.67f, 15.17f, 2.76f, 14.27f, 2.93f, 13.4f,
-CUBIC_TO, 3.11f, 12.51f, 3.38f, 11.67f, 3.73f, 10.87f,
-LINE_TO, 9.07f, 20.1f,
-CUBIC_TO, 9.76f, 21.3f, 10.71f, 22.27f, 11.93f, 23,
-CUBIC_TO, 13.16f, 23.73f, 14.51f, 24.1f, 16, 24.1f,
-CLOSE,
-MOVE_TO, 16, 8.1f,
-CUBIC_TO, 14.22f, 8.1f, 12.64f, 8.62f, 11.27f, 9.67f,
-CUBIC_TO, 9.89f, 10.69f, 8.93f, 12, 8.4f, 13.6f,
-LINE_TO, 5.27f, 8.2f,
-CUBIC_TO, 6.49f, 6.56f, 8.02f, 5.24f, 9.87f, 4.27f,
-CUBIC_TO, 11.73f, 3.27f, 13.78f, 2.77f, 16, 2.77f,
-CUBIC_TO, 18.2f, 2.77f, 20.22f, 3.26f, 22.07f, 4.23f,
-CUBIC_TO, 23.91f, 5.19f, 25.44f, 6.48f, 26.67f, 8.1f,
-H_LINE_TO, 16,
-CLOSE,
-MOVE_TO, 28.2f, 10.77f,
-CUBIC_TO, 28.58f, 11.59f, 28.86f, 12.44f, 29.03f, 13.33f,
-CUBIC_TO, 29.23f, 14.22f, 29.33f, 15.14f, 29.33f, 16.1f,
-CUBIC_TO, 29.33f, 19.54f, 28.2f, 22.51f, 25.93f, 25,
-CUBIC_TO, 23.69f, 27.49f, 20.91f, 28.93f, 17.6f, 29.33f,
-LINE_TO, 22.93f, 20.1f,
-CUBIC_TO, 23.27f, 19.52f, 23.52f, 18.9f, 23.7f, 18.23f,
-CUBIC_TO, 23.9f, 17.54f, 24, 16.83f, 24, 16.1f,
-CUBIC_TO, 24, 15.06f, 23.81f, 14.09f, 23.43f, 13.2f,
-CUBIC_TO, 23.08f, 12.29f, 22.58f, 11.48f, 21.93f, 10.77f,
-H_LINE_TO, 28.2f,
-CLOSE,
-NEW_PATH
-
-
-
 CANVAS_DIMENSIONS, 16,
-MOVE_TO, 5.25f, 8,
-CUBIC_TO, 5.25f, 8.76f, 5.52f, 9.4f, 6.06f, 9.94f,
-CUBIC_TO, 6.6f, 10.48f, 7.25f, 10.75f, 8, 10.75f,
-CUBIC_TO, 8.75f, 10.75f, 9.4f, 10.48f, 9.94f, 9.94f,
-CUBIC_TO, 10.48f, 9.4f, 10.75f, 8.75f, 10.75f, 8,
-CUBIC_TO, 10.75f, 7.25f, 10.48f, 6.6f, 9.94f, 6.06f,
-CUBIC_TO, 9.4f, 5.52f, 8.75f, 5.25f, 8, 5.25f,
-CUBIC_TO, 7.25f, 5.25f, 6.6f, 5.52f, 6.06f, 6.06f,
-CUBIC_TO, 5.52f, 6.6f, 5.25f, 7.25f, 5.25f, 8,
+MOVE_TO, 5.38f, 8.02f,
+R_CUBIC_TO, 0, 0.74f, 0.25f, 1.36f, 0.76f, 1.87f,
+R_CUBIC_TO, 0.51f, 0.51f, 1.13f, 0.76f, 1.86f, 0.76f,
+R_CUBIC_TO, 0.73f, 0, 1.36f, -0.25f, 1.86f, -0.76f,
+R_CUBIC_TO, 0.5f, -0.51f, 0.76f, -1.13f, 0.76f, -1.87f,
+R_CUBIC_TO, 0, -0.73f, -0.25f, -1.36f, -0.76f, -1.86f,
+R_CUBIC_TO, -0.51f, -0.51f, -1.13f, -0.76f, -1.86f, -0.76f,
+R_CUBIC_TO, -0.73f, 0, -1.35f, 0.25f, -1.86f, 0.76f,
+R_CUBIC_TO, -0.51f, 0.51f, -0.76f, 1.13f, -0.76f, 1.86f,
 CLOSE,
-MOVE_TO, 8, 12.25f,
-CUBIC_TO, 8.15f, 12.25f, 8.3f, 12.25f, 8.44f, 12.23f,
-CUBIC_TO, 8.58f, 12.22f, 8.72f, 12.19f, 8.86f, 12.16f,
-LINE_TO, 7.22f, 15,
-CUBIC_TO, 5.46f, 14.8f, 3.98f, 14.05f, 2.79f, 12.74f,
-CUBIC_TO, 1.6f, 11.42f, 1, 9.86f, 1, 8.05f,
-CUBIC_TO, 1, 7.56f, 1.05f, 7.09f, 1.14f, 6.63f,
-CUBIC_TO, 1.23f, 6.16f, 1.37f, 5.72f, 1.56f, 5.3f,
-LINE_TO, 4.36f, 10.15f,
-CUBIC_TO, 4.72f, 10.78f, 5.22f, 11.29f, 5.86f, 11.67f,
-CUBIC_TO, 6.5f, 12.05f, 7.21f, 12.25f, 8, 12.25f,
+MOVE_TO, 8, 11.97f,
+R_CUBIC_TO, 0.13f, 0, 0.26f, 0, 0.4f, -0.01f,
+R_CUBIC_TO, 0.14f, -0.01f, 0.28f, -0.03f, 0.41f, -0.06f,
+R_LINE_TO, -1.76f, 3.04f,
+R_CUBIC_TO, -1.75f, -0.19f, -3.18f, -0.95f, -4.32f, -2.27f,
+R_CUBIC_TO, -1.14f, -1.32f, -1.71f, -2.87f, -1.71f, -4.64f,
+R_CUBIC_TO, 0, -0.52f, 0.06f, -1.03f, 0.18f, -1.52f,
+R_CUBIC_TO, 0.11f, -0.5f, 0.28f, -0.99f, 0.51f, -1.47f,
+R_LINE_TO, 2.9f, 4.96f,
+R_CUBIC_TO, 0.34f, 0.62f, 0.82f, 1.1f, 1.42f, 1.45f,
+ARC_TO, 3.85f, 3.85f, 0, 0, 0, 8, 11.96f,
 CLOSE,
-MOVE_TO, 8, 3.85f,
-CUBIC_TO, 7.07f, 3.85f, 6.24f, 4.12f, 5.52f, 4.67f,
-CUBIC_TO, 4.8f, 5.21f, 4.29f, 5.9f, 4.01f, 6.74f,
-LINE_TO, 2.36f, 3.9f,
-CUBIC_TO, 3, 3.04f, 3.81f, 2.35f, 4.78f, 1.83f,
-CUBIC_TO, 5.76f, 1.3f, 6.83f, 1.04f, 8, 1.04f,
-CUBIC_TO, 9.17f, 1.04f, 10.22f, 1.3f, 11.19f, 1.81f,
-CUBIC_TO, 12.16f, 2.31f, 12.96f, 2.99f, 13.61f, 3.84f,
-H_LINE_TO, 8.01f,
-LINE_TO, 8, 3.85f,
+R_MOVE_TO, 0, -7.9f,
+R_ARC_TO, 3.74f, 3.74f, 0, 0, 0, -2.32f, 0.77f,
+ARC_TO, 3.94f, 3.94f, 0, 0, 0, 4.27f, 6.81f,
+LINE_TO, 2.5f, 3.75f,
+ARC_TO, 6.55f, 6.55f, 0, 0, 1, 4.91f, 1.75f,
+ARC_TO, 6.91f, 6.91f, 0, 0, 1, 8, 1.04f,
+R_CUBIC_TO, 1.15f, 0, 2.23f, 0.27f, 3.24f, 0.81f,
+R_ARC_TO, 6.95f, 6.95f, 0, 0, 1, 2.49f, 2.22f,
 CLOSE,
-MOVE_TO, 14.41f, 5.25f,
-CUBIC_TO, 14.61f, 5.68f, 14.75f, 6.13f, 14.85f, 6.6f,
-CUBIC_TO, 14.95f, 7.07f, 15.01f, 7.55f, 15.01f, 8.05f,
-CUBIC_TO, 15.01f, 9.86f, 14.42f, 11.42f, 13.22f, 12.72f,
-CUBIC_TO, 12.04f, 14.03f, 10.58f, 14.78f, 8.85f, 14.99f,
-LINE_TO, 11.65f, 10.14f,
-CUBIC_TO, 11.83f, 9.84f, 11.96f, 9.51f, 12.05f, 9.16f,
-CUBIC_TO, 12.15f, 8.8f, 12.21f, 8.42f, 12.21f, 8.04f,
-CUBIC_TO, 12.21f, 7.49f, 12.11f, 6.98f, 11.91f, 6.52f,
-CUBIC_TO, 11.72f, 6.04f, 11.46f, 5.62f, 11.12f, 5.24f,
-H_LINE_TO, 14.41f,
-V_LINE_TO, 5.25f,
+R_MOVE_TO, 6.46f, 1.33f,
+R_CUBIC_TO, 0.18f, 0.43f, 0.31f, 0.86f, 0.4f, 1.3f,
+R_CUBIC_TO, 0.08f, 0.44f, 0.13f, 0.88f, 0.13f, 1.33f,
+R_CUBIC_TO, 0, 1.86f, -0.61f, 3.44f, -1.81f, 4.72f,
+R_CUBIC_TO, -1.21f, 1.29f, -2.75f, 2.03f, -4.62f, 2.23f,
+R_LINE_TO, 2.84f, -4.98f,
+R_CUBIC_TO, 0.17f, -0.31f, 0.3f, -0.63f, 0.41f, -0.95f,
+R_CUBIC_TO, 0.1f, -0.32f, 0.15f, -0.66f, 0.15f, -1.01f,
+R_CUBIC_TO, 0, -0.49f, -0.09f, -0.96f, -0.27f, -1.41f,
+R_CUBIC_TO, -0.18f, -0.45f, -0.43f, -0.85f, -0.75f, -1.22f,
 CLOSE,
-NEW_PATH
+R_MOVE_TO, 0, 0,
+CLOSE
diff --git a/components/omnibox/browser/vector_icons/secure_page_info_chrome_refresh.icon b/components/omnibox/browser/vector_icons/secure_page_info_chrome_refresh.icon
index 71dbfaf..ae6674a 100644
--- a/components/omnibox/browser/vector_icons/secure_page_info_chrome_refresh.icon
+++ b/components/omnibox/browser/vector_icons/secure_page_info_chrome_refresh.icon
@@ -3,35 +3,55 @@
 // found in the LICENSE file.
 
 CANVAS_DIMENSIONS, 16,
-MOVE_TO, 14, 5.75f,
-R_V_LINE_TO, -1.5f,
-H_LINE_TO, 8.5f,
-R_V_LINE_TO, 1.5f,
-H_LINE_TO, 14,
+MOVE_TO, 11.55f, 13.52f,
+R_ARC_TO, 2.27f, 2.27f, 0, 0, 1, -1.68f, -0.69f,
+R_ARC_TO, 2.29f, 2.29f, 0, 0, 1, -0.69f, -1.68f,
+R_CUBIC_TO, 0, -0.66f, 0.23f, -1.22f, 0.7f, -1.68f,
+R_ARC_TO, 2.3f, 2.3f, 0, 0, 1, 1.68f, -0.69f,
+R_CUBIC_TO, 0.66f, 0, 1.22f, 0.23f, 1.68f, 0.69f,
+R_CUBIC_TO, 0.46f, 0.46f, 0.69f, 1.02f, 0.69f, 1.68f,
+R_ARC_TO, 2.27f, 2.27f, 0, 0, 1, -0.69f, 1.68f,
+R_CUBIC_TO, -0.46f, 0.46f, -1.02f, 0.69f, -1.68f, 0.69f,
 CLOSE,
-R_MOVE_TO, -12, 4.5f,
-R_V_LINE_TO, 1.5f,
-R_H_LINE_TO, 5.5f,
-R_V_LINE_TO, -1.5f,
-H_LINE_TO, 2,
+R_MOVE_TO, 0, -1.45f,
+R_CUBIC_TO, 0.25f, 0, 0.47f, -0.09f, 0.65f, -0.27f,
+R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, 0.27f, -0.64f,
+R_ARC_TO, 0.89f, 0.89f, 0, 0, 0, -0.27f, -0.65f,
+R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, -0.65f, -0.27f,
+R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, -0.65f, 0.27f,
+R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, -0.26f, 0.64f,
+R_CUBIC_TO, 0, 0.25f, 0.09f, 0.47f, 0.27f, 0.65f,
+R_CUBIC_TO, 0.18f, 0.18f, 0.4f, 0.27f, 0.65f, 0.27f,
 CLOSE,
-MOVE_TO, 4.5f, 4,
-R_CUBIC_TO, 0.55f, 0, 1, 0.45f, 1, 1,
-R_CUBIC_TO, 0, 0.55f, -0.45f, 1, -1, 1,
-R_CUBIC_TO, -0.55f, 0, -1, -0.45f, -1, -1,
-R_CUBIC_TO, 0, -0.55f, 0.45f, -1, 1, -1,
+R_MOVE_TO, -9.47f, -0.1f,
+R_V_LINE_TO, -1.63f,
+H_LINE_TO, 7.98f,
+R_V_LINE_TO, 1.63f,
 CLOSE,
-R_MOVE_TO, 0, -1.5f,
-R_ARC_TO, 2.5f, 2.5f, 0, 0, 0, 0, 5,
-R_ARC_TO, 2.5f, 2.5f, 0, 0, 0, 0, -5,
+R_MOVE_TO, 2.37f, -4.75f,
+R_ARC_TO, 2.27f, 2.27f, 0, 0, 1, -1.67f, -0.69f,
+R_ARC_TO, 2.29f, 2.29f, 0, 0, 1, -0.69f, -1.68f,
+R_CUBIC_TO, 0, -0.66f, 0.23f, -1.22f, 0.7f, -1.68f,
+R_ARC_TO, 2.3f, 2.3f, 0, 0, 1, 1.68f, -0.69f,
+R_CUBIC_TO, 0.66f, 0, 1.22f, 0.23f, 1.68f, 0.69f,
+R_CUBIC_TO, 0.46f, 0.46f, 0.69f, 1.02f, 0.69f, 1.68f,
+R_CUBIC_TO, 0, 0.66f, -0.23f, 1.22f, -0.69f, 1.68f,
+R_CUBIC_TO, -0.46f, 0.46f, -1.02f, 0.69f, -1.68f, 0.69f,
 CLOSE,
-R_MOVE_TO, 7, 7.5f,
-R_CUBIC_TO, 0.55f, 0, 1, 0.45f, 1, 1,
-R_CUBIC_TO, 0, 0.55f, -0.45f, 1, -1, 1,
-R_CUBIC_TO, -0.55f, 0, -1, -0.45f, -1, -1,
-R_CUBIC_TO, 0, -0.55f, 0.45f, -1, 1, -1,
+R_MOVE_TO, 0, -1.46f,
+R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, 0.65f, -0.27f,
+R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, 0.27f, -0.64f,
+R_ARC_TO, 0.89f, 0.89f, 0, 0, 0, -0.26f, -0.65f,
+R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, -0.65f, -0.27f,
+R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, -0.65f, 0.27f,
+R_ARC_TO, 0.88f, 0.88f, 0, 0, 0, -0.27f, 0.65f,
+R_CUBIC_TO, 0, 0.25f, 0.09f, 0.47f, 0.27f, 0.65f,
+R_CUBIC_TO, 0.18f, 0.18f, 0.39f, 0.27f, 0.65f, 0.27f,
 CLOSE,
-R_MOVE_TO, 0, -1.5f,
-R_ARC_TO, 2.5f, 2.5f, 0, 0, 0, 0, 5,
-R_ARC_TO, 2.5f, 2.5f, 0, 0, 0, 0, -5,
-CLOSE
\ No newline at end of file
+R_MOVE_TO, 3.57f, -0.1f,
+V_LINE_TO, 4.03f,
+R_H_LINE_TO, 5.9f,
+R_V_LINE_TO, 1.63f,
+CLOSE,
+R_MOVE_TO, 0, 0,
+CLOSE
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 f7308f3f..41cac00 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
@@ -5,6 +5,7 @@
 #include "components/segmentation_platform/internal/data_collection/training_data_collector_impl.h"
 #include <cstdint>
 
+#include "base/containers/contains.h"
 #include "base/functional/callback_helpers.h"
 #include "base/logging.h"
 #include "base/metrics/metrics_hashes.h"
@@ -208,8 +209,12 @@
               segment.first);
         } else if (feature.type() == proto::SignalType::HISTOGRAM_VALUE ||
                    feature.type() == proto::SignalType::HISTOGRAM_ENUM) {
+          std::vector<int> enum_ids;
+          for (int j = 0; j < feature.enum_ids_size(); j++) {
+            enum_ids.emplace_back(feature.enum_ids(j));
+          }
           immediate_trigger_histograms_[feature.name_hash()].emplace(
-              segment.first);
+              std::make_pair(segment.first, enum_ids));
         }
       }
     }
@@ -233,12 +238,20 @@
     param->output_metric_hash = hash;
     param->output_value = static_cast<float>(sample);
     for (auto segment : segments) {
-      // TODO (ritikagup@) : Add handling for default models, if required.
-      segment_info_database_->GetSegmentInfo(
-          segment, proto::ModelSource::SERVER_MODEL_SOURCE,
-          base::BindOnce(
-              &TrainingDataCollectorImpl::OnUmaUpdatedReportForSegmentInfo,
-              weak_ptr_factory_.GetWeakPtr(), param));
+      auto segment_id = segment.first;
+      auto accepted_enum_ids = segment.second;
+
+      // Process both enum histograms with their corresponding accepted enum ids
+      // and value histograms with no enum ids.
+      if (accepted_enum_ids.empty() ||
+          base::Contains(accepted_enum_ids, sample)) {
+        // TODO (ritikagup@) : Add handling for default models, if required.
+        segment_info_database_->GetSegmentInfo(
+            segment_id, proto::ModelSource::SERVER_MODEL_SOURCE,
+            base::BindOnce(
+                &TrainingDataCollectorImpl::OnUmaUpdatedReportForSegmentInfo,
+                weak_ptr_factory_.GetWeakPtr(), param));
+      }
     }
   }
 }
diff --git a/components/segmentation_platform/internal/data_collection/training_data_collector_impl.h b/components/segmentation_platform/internal/data_collection/training_data_collector_impl.h
index d8854bd4..572dd6a 100644
--- a/components/segmentation_platform/internal/data_collection/training_data_collector_impl.h
+++ b/components/segmentation_platform/internal/data_collection/training_data_collector_impl.h
@@ -169,8 +169,10 @@
   base::flat_map<uint64_t, base::flat_set<proto::SegmentId>>
       immediate_collection_histograms_;
 
-  // Hash of histograms for trigger based training data collection.
-  base::flat_map<uint64_t, base::flat_set<proto::SegmentId>>
+  // Hash of histograms and their corresponding accepted enum ids for trigger
+  // based training data collection.
+  base::flat_map<uint64_t,
+                 base::flat_set<std::pair<proto::SegmentId, std::vector<int>>>>
       immediate_trigger_histograms_;
 
   // Hash of user actions for trigger based training data collection.
diff --git a/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc b/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc
index eeff40d..e7808d00 100644
--- a/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc
+++ b/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc
@@ -221,7 +221,8 @@
           uma_trigger->mutable_uma_trigger()->mutable_uma_feature();
       uma_feature->set_name(kHistogramName0);
       uma_feature->set_name_hash(base::HashMetricName(kHistogramName0));
-      uma_feature->set_type(proto::SignalType::HISTOGRAM_VALUE);
+      uma_feature->set_type(proto::SignalType::HISTOGRAM_ENUM);
+      uma_feature->add_enum_ids(kSample);
     } else if (type == kPeriodicDecisionType) {
       // Add a uma feature output based on |kHistogramName0| if trigger type is
       // PERIODIC.
@@ -316,6 +317,20 @@
                SegmentationUkmHelper::FloatToInt64(3.f)});
   }
 
+  void ExpectResult1UkmWithSample(int sample) {
+    ExpectUkm({Segmentation_ModelExecution::kOptimizationTargetName,
+               Segmentation_ModelExecution::kModelVersionName,
+               Segmentation_ModelExecution::kInput0Name,
+               Segmentation_ModelExecution::kActualResultName,
+               Segmentation_ModelExecution::kActualResult2Name,
+               Segmentation_ModelExecution::kActualResult3Name},
+              {kTestOptimizationTarget0, kModelVersion,
+               SegmentationUkmHelper::FloatToInt64(1.f),
+               SegmentationUkmHelper::FloatToInt64(2.f),
+               SegmentationUkmHelper::FloatToInt64(3.f),
+               SegmentationUkmHelper::FloatToInt64(sample)});
+  }
+
   // TODO(xingliu): Share this test code with SegmentationUkmHelperTest, or test
   // with mock SegmentationUkmHelperTest.
   void ExpectUkm(std::vector<base::StringPiece> metric_names,
@@ -650,7 +665,7 @@
 
 // Tests that if uma histogram trigger is set, collection will happen when the
 // trigger histogram is observed.
-TEST_F(TrainingDataCollectorImplTest, DataCollectionWithUMATrigger) {
+TEST_F(TrainingDataCollectorImplTest, DataCollectionWithEnumHistogramTrigger) {
   constexpr base::TimeDelta kTriggerDuration = base::Seconds(10);
   base::Time current = clock()->Now();
   SetupFeatureProcessorResult(kTestOptimizationTarget0, current,
@@ -669,9 +684,14 @@
   clock()->Advance(kTriggerDuration);
   ExpectUkmCount(0u);
 
+  // Expect to not trigger output collection if histogram is hit with an
+  // unlisted enum id.
+  collector()->OnHistogramSignalUpdated(kHistogramName0, 0);
+  ExpectUkmCount(0u);
+
   // Trigger output collection and ukm data recording.
   WaitForHistogramSignalUpdated(kHistogramName0, kSample);
-  ExpectResult1Ukm();
+  ExpectResult1UkmWithSample(kSample);
 }
 
 // Tests that if uma user action trigger is set, collection will happen when the
@@ -772,15 +792,7 @@
   // Trigger output collection and ukm data recording.
   run_loop.Run();
   ExpectUkmCount(1u);
-  ExpectUkm({Segmentation_ModelExecution::kOptimizationTargetName,
-             Segmentation_ModelExecution::kModelVersionName,
-             Segmentation_ModelExecution::kInput0Name,
-             Segmentation_ModelExecution::kActualResultName,
-             Segmentation_ModelExecution::kActualResult2Name},
-            {kTestOptimizationTarget0, kModelVersion,
-             SegmentationUkmHelper::FloatToInt64(1.f),
-             SegmentationUkmHelper::FloatToInt64(2.f),
-             SegmentationUkmHelper::FloatToInt64(3.f)});
+  ExpectResult1Ukm();
 }
 
 TEST_F(TrainingDataCollectorImplTest, DataCollectionWithStoreToDisk) {
@@ -842,17 +854,7 @@
                                    base::DoNothing());
   run_loop.Run();
   ExpectUkmCount(1u);
-  ExpectUkm({Segmentation_ModelExecution::kOptimizationTargetName,
-             Segmentation_ModelExecution::kModelVersionName,
-             Segmentation_ModelExecution::kInput0Name,
-             Segmentation_ModelExecution::kActualResultName,
-             Segmentation_ModelExecution::kActualResult2Name,
-             Segmentation_ModelExecution::kActualResult3Name},
-            {kTestOptimizationTarget0, kModelVersion,
-             SegmentationUkmHelper::FloatToInt64(1.f),
-             SegmentationUkmHelper::FloatToInt64(2.f),
-             SegmentationUkmHelper::FloatToInt64(3.f),
-             SegmentationUkmHelper::FloatToInt64(kSample)});
+  ExpectResult1UkmWithSample(kSample);
 }
 
 }  // namespace
diff --git a/components/services/app_service/public/cpp/instance_registry.cc b/components/services/app_service/public/cpp/instance_registry.cc
index ad0605c..4609cea 100644
--- a/components/services/app_service/public/cpp/instance_registry.cc
+++ b/components/services/app_service/public/cpp/instance_registry.cc
@@ -19,30 +19,8 @@
 
 InstanceParams::~InstanceParams() = default;
 
-InstanceRegistry::Observer::Observer(InstanceRegistry* instance_registry) {
-  Observe(instance_registry);
-}
-
-InstanceRegistry::Observer::Observer() = default;
 InstanceRegistry::Observer::~Observer() {
-  if (instance_registry_) {
-    instance_registry_->RemoveObserver(this);
-  }
-}
-
-void InstanceRegistry::Observer::Observe(InstanceRegistry* instance_registry) {
-  if (instance_registry == instance_registry_) {
-    return;
-  }
-
-  if (instance_registry_) {
-    instance_registry_->RemoveObserver(this);
-  }
-
-  instance_registry_ = instance_registry;
-  if (instance_registry_) {
-    instance_registry_->AddObserver(this);
-  }
+  CHECK(!IsInObserverList());
 }
 
 InstanceRegistry::InstanceRegistry() = default;
diff --git a/components/services/app_service/public/cpp/instance_registry.h b/components/services/app_service/public/cpp/instance_registry.h
index 518cc2f..56315f8 100644
--- a/components/services/app_service/public/cpp/instance_registry.h
+++ b/components/services/app_service/public/cpp/instance_registry.h
@@ -58,9 +58,6 @@
  public:
   class Observer : public base::CheckedObserver {
    public:
-    Observer(const Observer&) = delete;
-    Observer& operator=(const Observer&) = delete;
-
     // Called whenever the InstanceRegistry receives an update for any
     // instance. `update` exposes the latest field values and whether they have
     // changed in this update (as per the docs on `apps::InstanceUpdate`). The
@@ -74,32 +71,7 @@
     virtual void OnInstanceRegistryWillBeDestroyed(InstanceRegistry* cache) = 0;
 
    protected:
-    // Use this constructor when the observer |this| is tied to a single
-    // InstanceRegistry for its entire lifetime, or until the observee (the
-    // InstanceRegistry) is destroyed, whichever comes first.
-    //
-    // DEPRECATED: Prefer using a base::ScopedObservation for idiomatic observer
-    // behavior.
-    // TODO(crbug.com/1453127): Remove this method.
-    explicit Observer(InstanceRegistry* cache);
-
-    // Use this constructor when the observer |this| wants to observe a
-    // InstanceRegistry for part of its lifetime. It can then call Observe() to
-    // start and stop observing.
-    Observer();
-
     ~Observer() override;
-
-    // Start observing a different InstanceRegistry. |instance_registry| may be
-    // nullptr, meaning to stop observing.
-    //
-    // DEPRECATED: Prefer using a base::ScopedObservation for idiomatic observer
-    // behavior.
-    // TODO(crbug.com/1453127): Remove this method.
-    void Observe(InstanceRegistry* instance_registry);
-
-   private:
-    raw_ptr<InstanceRegistry, ExperimentalAsh> instance_registry_ = nullptr;
   };
 
   InstanceRegistry();
@@ -108,6 +80,8 @@
   InstanceRegistry(const InstanceRegistry&) = delete;
   InstanceRegistry& operator=(const InstanceRegistry&) = delete;
 
+  // Prefer using a base::ScopedObservation to safely manage the observation,
+  // instead of calling these methods directly.
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
diff --git a/components/services/app_service/public/cpp/instance_registry_unittest.cc b/components/services/app_service/public/cpp/instance_registry_unittest.cc
index f931f6a..e66d1c8 100644
--- a/components/services/app_service/public/cpp/instance_registry_unittest.cc
+++ b/components/services/app_service/public/cpp/instance_registry_unittest.cc
@@ -8,6 +8,7 @@
 
 #include "base/containers/contains.h"
 #include "base/memory/raw_ptr.h"
+#include "base/scoped_observation.h"
 #include "components/services/app_service/public/cpp/instance.h"
 #include "components/services/app_service/public/cpp/instance_registry.h"
 #include "components/services/app_service/public/cpp/instance_update.h"
@@ -88,8 +89,9 @@
 class InstanceRecursiveObserver : public apps::InstanceRegistry::Observer {
  public:
   explicit InstanceRecursiveObserver(apps::InstanceRegistry* instance_registry)
-      : apps::InstanceRegistry::Observer(instance_registry),
-        instance_registry_(instance_registry) {}
+      : instance_registry_(instance_registry) {
+    instance_registry_observation_.Observe(instance_registry);
+  }
 
   ~InstanceRecursiveObserver() override = default;
 
@@ -177,7 +179,7 @@
 
   void OnInstanceRegistryWillBeDestroyed(
       apps::InstanceRegistry* instance_registry) override {
-    Observe(nullptr);
+    instance_registry_observation_.Reset();
   }
 
   static void ExpectEq(const apps::InstanceUpdate& outer,
@@ -206,6 +208,10 @@
   std::vector<std::unique_ptr<apps::InstanceParams>>
       super_recursive_instance_params_;
   std::vector<std::unique_ptr<apps::Instance>> super_recursive_instances_;
+
+  base::ScopedObservation<apps::InstanceRegistry,
+                          apps::InstanceRegistry::Observer>
+      instance_registry_observation_{this};
 };
 
 TEST_F(InstanceRegistryTest, ForEachInstance) {
diff --git a/components/test/data/viz/mask_as_blending_rotated_circle.png b/components/test/data/viz/mask_as_blending_rotated_circle.png
index d5f24db..33928f4 100644
--- a/components/test/data/viz/mask_as_blending_rotated_circle.png
+++ b/components/test/data/viz/mask_as_blending_rotated_circle.png
Binary files differ
diff --git a/components/vector_icons/BUILD.gn b/components/vector_icons/BUILD.gn
index 02d2799..a594d5b 100644
--- a/components/vector_icons/BUILD.gn
+++ b/components/vector_icons/BUILD.gn
@@ -144,6 +144,7 @@
     "midi_off_chrome_refresh.icon",
     "not_secure_warning.icon",
     "not_secure_warning_chrome_refresh.icon",
+    "not_secure_warning_off_chrome_refresh.icon",
     "notification_warning.icon",
     "notifications.icon",
     "notifications_chrome_refresh.icon",
@@ -163,6 +164,8 @@
     "privacy_sandbox.icon",
     "protected_content.icon",
     "protocol_handler.icon",
+    "protocol_handler_chrome_refresh.icon",
+    "protocol_handler_off_chrome_refresh.icon",
     "reload.icon",
     "reload_chrome_refresh.icon",
     "replay.icon",
diff --git a/components/vector_icons/business_chrome_refresh.icon b/components/vector_icons/business_chrome_refresh.icon
index 735cb35..0ceda76a 100644
--- a/components/vector_icons/business_chrome_refresh.icon
+++ b/components/vector_icons/business_chrome_refresh.icon
@@ -2,258 +2,76 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-
-CANVAS_DIMENSIONS, 24,
-MOVE_TO, 2, 21,
-V_LINE_TO, 3,
-H_LINE_TO, 12,
-V_LINE_TO, 7,
-H_LINE_TO, 22,
-V_LINE_TO, 21,
-H_LINE_TO, 2,
-CLOSE,
-MOVE_TO, 4, 19,
-H_LINE_TO, 6,
-V_LINE_TO, 17,
-H_LINE_TO, 4,
-V_LINE_TO, 19,
-CLOSE,
-MOVE_TO, 4, 15,
-H_LINE_TO, 6,
-V_LINE_TO, 13,
-H_LINE_TO, 4,
-V_LINE_TO, 15,
-CLOSE,
-MOVE_TO, 4, 11,
-H_LINE_TO, 6,
-V_LINE_TO, 9,
-H_LINE_TO, 4,
-V_LINE_TO, 11,
-CLOSE,
-MOVE_TO, 4, 7,
-H_LINE_TO, 6,
-V_LINE_TO, 5,
-H_LINE_TO, 4,
-V_LINE_TO, 7,
-CLOSE,
-MOVE_TO, 8, 19,
-H_LINE_TO, 10,
-V_LINE_TO, 17,
-H_LINE_TO, 8,
-V_LINE_TO, 19,
-CLOSE,
-MOVE_TO, 8, 15,
-H_LINE_TO, 10,
-V_LINE_TO, 13,
-H_LINE_TO, 8,
-V_LINE_TO, 15,
-CLOSE,
-MOVE_TO, 8, 11,
-H_LINE_TO, 10,
-V_LINE_TO, 9,
-H_LINE_TO, 8,
-V_LINE_TO, 11,
-CLOSE,
-MOVE_TO, 8, 7,
-H_LINE_TO, 10,
-V_LINE_TO, 5,
-H_LINE_TO, 8,
-V_LINE_TO, 7,
-CLOSE,
-MOVE_TO, 12, 19,
-H_LINE_TO, 20,
-V_LINE_TO, 9,
-H_LINE_TO, 12,
-V_LINE_TO, 11,
-H_LINE_TO, 14,
-V_LINE_TO, 13,
-H_LINE_TO, 12,
-V_LINE_TO, 15,
-H_LINE_TO, 14,
-V_LINE_TO, 17,
-H_LINE_TO, 12,
-V_LINE_TO, 19,
-CLOSE,
-MOVE_TO, 16, 13,
-V_LINE_TO, 11,
-H_LINE_TO, 18,
-V_LINE_TO, 13,
-H_LINE_TO, 16,
-CLOSE,
-MOVE_TO, 16, 17,
-V_LINE_TO, 15,
-H_LINE_TO, 18,
-V_LINE_TO, 17,
-H_LINE_TO, 16,
-CLOSE
-
-CANVAS_DIMENSIONS, 20,
-MOVE_TO, 2, 17,
-V_LINE_TO, 3,
-H_LINE_TO, 10,
-V_LINE_TO, 6,
-H_LINE_TO, 18,
-V_LINE_TO, 17,
-H_LINE_TO, 2,
-CLOSE,
-MOVE_TO, 3.5f, 15.5f,
-H_LINE_TO, 5,
-V_LINE_TO, 14,
-H_LINE_TO, 3.5f,
-V_LINE_TO, 15.5f,
-CLOSE,
-MOVE_TO, 3.5f, 12.33f,
-H_LINE_TO, 5,
-V_LINE_TO, 10.83f,
-H_LINE_TO, 3.5f,
-V_LINE_TO, 12.33f,
-CLOSE,
-MOVE_TO, 3.5f, 9.17f,
-H_LINE_TO, 5,
-V_LINE_TO, 7.67f,
-H_LINE_TO, 3.5f,
-V_LINE_TO, 9.17f,
-CLOSE,
-MOVE_TO, 3.5f, 6,
-H_LINE_TO, 5,
-V_LINE_TO, 4.5f,
-H_LINE_TO, 3.5f,
-V_LINE_TO, 6,
-CLOSE,
-MOVE_TO, 7, 15.5f,
-H_LINE_TO, 8.5f,
-V_LINE_TO, 14,
-H_LINE_TO, 7,
-V_LINE_TO, 15.5f,
-CLOSE,
-MOVE_TO, 7, 12.33f,
-H_LINE_TO, 8.5f,
-V_LINE_TO, 10.83f,
-H_LINE_TO, 7,
-V_LINE_TO, 12.33f,
-CLOSE,
-MOVE_TO, 7, 9.17f,
-H_LINE_TO, 8.5f,
-V_LINE_TO, 7.67f,
-H_LINE_TO, 7,
-V_LINE_TO, 9.17f,
-CLOSE,
-MOVE_TO, 7, 6,
-H_LINE_TO, 8.5f,
-V_LINE_TO, 4.5f,
-H_LINE_TO, 7,
-V_LINE_TO, 6,
-CLOSE,
-MOVE_TO, 10, 15.5f,
-H_LINE_TO, 16.5f,
-V_LINE_TO, 7.5f,
-H_LINE_TO, 10,
-V_LINE_TO, 9.17f,
-H_LINE_TO, 11.5f,
-V_LINE_TO, 10.67f,
-H_LINE_TO, 10,
-V_LINE_TO, 12.33f,
-H_LINE_TO, 11.5f,
-V_LINE_TO, 13.83f,
-H_LINE_TO, 10,
-V_LINE_TO, 15.5f,
-CLOSE,
-MOVE_TO, 13.5f, 10.67f,
-V_LINE_TO, 9.17f,
-H_LINE_TO, 15,
-V_LINE_TO, 10.67f,
-H_LINE_TO, 13.5f,
-CLOSE,
-MOVE_TO, 13.5f, 13.83f,
-V_LINE_TO, 12.33f,
-H_LINE_TO, 15,
-V_LINE_TO, 13.83f,
-H_LINE_TO, 13.5f,
-CLOSE
-
-
 CANVAS_DIMENSIONS, 16,
-MOVE_TO, 12, 7,
-H_LINE_TO, 11,
-V_LINE_TO, 8,
+MOVE_TO, 1.31f, 14.04f,
+V_LINE_TO, 2.26f,
+R_H_LINE_TO, 6.98f,
+V_LINE_TO, 4.66f,
+R_H_LINE_TO, 6.4f,
+R_V_LINE_TO, 9.38f,
+CLOSE,
+MOVE_TO, 2.8f, 12.54f,
+H_LINE_TO, 4,
+V_LINE_TO, 11.34f,
+H_LINE_TO, 2.8f,
+CLOSE,
+R_MOVE_TO, 0, -2.53f,
+H_LINE_TO, 4,
+R_V_LINE_TO, -1.2f,
+H_LINE_TO, 2.8f,
+CLOSE,
+R_MOVE_TO, 0, -2.53f,
+H_LINE_TO, 4,
+V_LINE_TO, 6.27f,
+H_LINE_TO, 2.8f,
+CLOSE,
+R_MOVE_TO, 0, -2.54f,
+H_LINE_TO, 4,
+V_LINE_TO, 3.74f,
+H_LINE_TO, 2.8f,
+CLOSE,
+R_MOVE_TO, 2.8f, 7.6f,
+R_H_LINE_TO, 1.2f,
+V_LINE_TO, 11.34f,
+H_LINE_TO, 5.6f,
+CLOSE,
+R_MOVE_TO, 0, -2.53f,
+R_H_LINE_TO, 1.2f,
+R_V_LINE_TO, -1.2f,
+H_LINE_TO, 5.6f,
+CLOSE,
+R_MOVE_TO, 0, -2.53f,
+R_H_LINE_TO, 1.2f,
+V_LINE_TO, 6.27f,
+H_LINE_TO, 5.6f,
+CLOSE,
+R_MOVE_TO, 0, -2.54f,
+R_H_LINE_TO, 1.2f,
+V_LINE_TO, 3.74f,
+H_LINE_TO, 5.6f,
+CLOSE,
+MOVE_TO, 8, 12.54f,
+R_H_LINE_TO, 5.2f,
+V_LINE_TO, 6.14f,
+H_LINE_TO, 8,
+R_V_LINE_TO, 1.34f,
+R_H_LINE_TO, 1.2f,
+R_V_LINE_TO, 1.2f,
+H_LINE_TO, 8,
+R_V_LINE_TO, 1.33f,
+R_H_LINE_TO, 1.2f,
+R_V_LINE_TO, 1.2f,
+H_LINE_TO, 8,
+CLOSE,
+R_MOVE_TO, 2.8f, -3.87f,
+R_V_LINE_TO, -1.2f,
 H_LINE_TO, 12,
-V_LINE_TO, 7,
+R_V_LINE_TO, 1.2f,
 CLOSE,
-NEW_PATH,
-MOVE_TO, 12, 10,
-H_LINE_TO, 11,
-V_LINE_TO, 11,
+R_MOVE_TO, 0, 2.53f,
+R_V_LINE_TO, -1.2f,
 H_LINE_TO, 12,
-V_LINE_TO, 10,
+R_V_LINE_TO, 1.2f,
 CLOSE,
-NEW_PATH,
-MOVE_TO, 8, 4,
-V_LINE_TO, 2,
-H_LINE_TO, 1,
-V_LINE_TO, 14,
-H_LINE_TO, 15,
-V_LINE_TO, 4,
-H_LINE_TO, 8,
-CLOSE,
-MOVE_TO, 4, 12,
-H_LINE_TO, 3,
-V_LINE_TO, 11,
-H_LINE_TO, 4,
-V_LINE_TO, 12,
-CLOSE,
-MOVE_TO, 4, 9.67f,
-H_LINE_TO, 3,
-V_LINE_TO, 8.67f,
-H_LINE_TO, 4,
-V_LINE_TO, 9.67f,
-CLOSE,
-MOVE_TO, 4, 7.34f,
-H_LINE_TO, 3,
-V_LINE_TO, 6.34f,
-H_LINE_TO, 4,
-V_LINE_TO, 7.34f,
-CLOSE,
-MOVE_TO, 4, 5.01f,
-H_LINE_TO, 3,
-V_LINE_TO, 4.01f,
-H_LINE_TO, 4,
-V_LINE_TO, 5.01f,
-CLOSE,
-MOVE_TO, 6, 12.01f,
-H_LINE_TO, 5,
-V_LINE_TO, 11.01f,
-H_LINE_TO, 6,
-V_LINE_TO, 12.01f,
-CLOSE,
-MOVE_TO, 6, 9.68f,
-H_LINE_TO, 5,
-V_LINE_TO, 8.68f,
-H_LINE_TO, 6,
-V_LINE_TO, 9.68f,
-CLOSE,
-MOVE_TO, 6, 7.35f,
-H_LINE_TO, 5,
-V_LINE_TO, 6.35f,
-H_LINE_TO, 6,
-V_LINE_TO, 7.35f,
-CLOSE,
-MOVE_TO, 6, 5.02f,
-H_LINE_TO, 5,
-V_LINE_TO, 4.02f,
-H_LINE_TO, 6,
-V_LINE_TO, 5.02f,
-CLOSE,
-MOVE_TO, 13.5f, 12.52f,
-H_LINE_TO, 8,
-V_LINE_TO, 11.02f,
-H_LINE_TO, 9,
-V_LINE_TO, 10.02f,
-H_LINE_TO, 8,
-V_LINE_TO, 8.02f,
-H_LINE_TO, 9,
-V_LINE_TO, 7.02f,
-H_LINE_TO, 8,
-V_LINE_TO, 5.52f,
-H_LINE_TO, 13.5f,
-V_LINE_TO, 12.52f,
+R_MOVE_TO, 0, 0,
 CLOSE
diff --git a/components/vector_icons/not_secure_warning_chrome_refresh.icon b/components/vector_icons/not_secure_warning_chrome_refresh.icon
index 7cfc460..b52efecd 100644
--- a/components/vector_icons/not_secure_warning_chrome_refresh.icon
+++ b/components/vector_icons/not_secure_warning_chrome_refresh.icon
@@ -2,81 +2,30 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-CANVAS_DIMENSIONS, 32,
-MOVE_TO, 1.33f, 28,
-LINE_TO, 16, 2.67f,
-LINE_TO, 30.67f, 28,
-H_LINE_TO, 1.33f,
-CLOSE,
-MOVE_TO, 5.57f, 25.57f,
-H_LINE_TO, 26.43f,
-LINE_TO, 16, 7.57f,
-LINE_TO, 5.57f, 25.57f,
-CLOSE,
-MOVE_TO, 16.03f, 24.03f,
-CUBIC_TO, 16.39f, 24.03f, 16.68f, 23.92f, 16.9f, 23.7f,
-CUBIC_TO, 17.14f, 23.46f, 17.27f, 23.16f, 17.27f, 22.8f,
-CUBIC_TO, 17.27f, 22.47f, 17.14f, 22.19f, 16.9f, 21.97f,
-CUBIC_TO, 16.68f, 21.72f, 16.39f, 21.6f, 16.03f, 21.6f,
-CUBIC_TO, 15.7f, 21.6f, 15.41f, 21.72f, 15.17f, 21.97f,
-CUBIC_TO, 14.94f, 22.19f, 14.83f, 22.47f, 14.83f, 22.8f,
-CUBIC_TO, 14.83f, 23.16f, 14.94f, 23.46f, 15.17f, 23.7f,
-CUBIC_TO, 15.41f, 23.92f, 15.7f, 24.03f, 16.03f, 24.03f,
-CLOSE,
-MOVE_TO, 14.83f, 20.13f,
-H_LINE_TO, 17.27f,
-V_LINE_TO, 13.2f,
-H_LINE_TO, 14.83f,
-V_LINE_TO, 20.13f,
-CLOSE
-
-CANVAS_DIMENSIONS, 20,
-MOVE_TO, 0.86f, 17.09f,
-LINE_TO, 10, 1.83f,
-R_LINE_TO, 9.15f, 15.25f,
-CLOSE,
-MOVE_TO, 3.77f, 15.43f,
-R_H_LINE_TO, 12.46f,
-LINE_TO, 10, 5.06f,
-CLOSE,
-R_MOVE_TO, 6.23f, -0.95f,
-R_ARC_TO, 0.76f, 0.76f, 0, 0, 0, 0.55f, -0.22f,
-R_ARC_TO, 0.74f, 0.74f, 0, 0, 0, 0.23f, -0.55f,
-R_ARC_TO, 0.75f, 0.75f, 0, 0, 0, -0.22f, -0.55f,
-R_ARC_TO, 0.73f, 0.73f, 0, 0, 0, -0.55f, -0.23f,
-R_ARC_TO, 0.77f, 0.77f, 0, 0, 0, -0.55f, 0.22f,
-R_ARC_TO, 0.73f, 0.73f, 0, 0, 0, -0.23f, 0.55f,
-R_ARC_TO, 0.76f, 0.76f, 0, 0, 0, 0.22f, 0.55f,
-R_ARC_TO, 0.73f, 0.73f, 0, 0, 0, 0.55f, 0.23f,
-CLOSE,
-MOVE_TO, 9.25f, 12,
-R_H_LINE_TO, 1.5f,
-V_LINE_TO, 8.06f,
-R_H_LINE_TO, -1.5f,
-CLOSE
-
 CANVAS_DIMENSIONS, 16,
-MOVE_TO, 8, 2,
-LINE_TO, 1, 14,
-H_LINE_TO, 15,
-LINE_TO, 8, 2,
+MOVE_TO, 0.53f, 13.76f,
+LINE_TO, 8, 1.28f,
+R_LINE_TO, 7.47f, 12.48f,
 CLOSE,
-MOVE_TO, 8, 4.98f,
-LINE_TO, 12.39f, 12.5f,
-H_LINE_TO, 3.61f,
-LINE_TO, 8, 4.98f,
+R_MOVE_TO, 2.63f, -1.49f,
+R_H_LINE_TO, 9.7f,
+LINE_TO, 8, 4.2f,
 CLOSE,
-NEW_PATH,
-MOVE_TO, 8.75f, 7,
-H_LINE_TO, 7.25f,
-V_LINE_TO, 10,
-H_LINE_TO, 8.75f,
-V_LINE_TO, 7,
+R_MOVE_TO, 4.84f, -0.7f,
+R_ARC_TO, 0.64f, 0.64f, 0, 0, 0, 0.46f, -0.19f,
+R_ARC_TO, 0.63f, 0.63f, 0, 0, 0, 0, -0.91f,
+R_ARC_TO, 0.63f, 0.63f, 0, 0, 0, -0.45f, -0.19f,
+R_ARC_TO, 0.64f, 0.64f, 0, 0, 0, -0.46f, 0.19f,
+R_ARC_TO, 0.6f, 0.6f, 0, 0, 0, -0.19f, 0.45f,
+R_CUBIC_TO, 0, 0.18f, 0.07f, 0.33f, 0.19f, 0.46f,
+R_ARC_TO, 0.61f, 0.61f, 0, 0, 0, 0.45f, 0.19f,
 CLOSE,
-NEW_PATH,
-MOVE_TO, 8, 12,
-CUBIC_TO, 8.41f, 12, 8.75f, 11.66f, 8.75f, 11.25f,
-CUBIC_TO, 8.75f, 10.84f, 8.41f, 10.5f, 8, 10.5f,
-CUBIC_TO, 7.59f, 10.5f, 7.25f, 10.84f, 7.25f, 11.25f,
-CUBIC_TO, 7.25f, 11.66f, 7.59f, 12, 8, 12,
-CLOSE
\ No newline at end of file
+R_MOVE_TO, -0.6f, -1.97f,
+R_H_LINE_TO, 1.2f,
+V_LINE_TO, 6.5f,
+H_LINE_TO, 7.4f,
+CLOSE,
+MOVE_TO, 8, 8.23f,
+CLOSE,
+R_MOVE_TO, 0, 0,
+CLOSE
diff --git a/components/vector_icons/not_secure_warning_off_chrome_refresh.icon b/components/vector_icons/not_secure_warning_off_chrome_refresh.icon
new file mode 100644
index 0000000..4ae06e92
--- /dev/null
+++ b/components/vector_icons/not_secure_warning_off_chrome_refresh.icon
@@ -0,0 +1,43 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 20,
+MOVE_TO, 10, 14.48f,
+R_ARC_TO, 0.76f, 0.76f, 0, 0, 1, -0.55f, -0.22f,
+R_ARC_TO, 0.74f, 0.74f, 0, 0, 1, -0.23f, -0.55f,
+R_CUBIC_TO, 0, -0.21f, 0.07f, -0.4f, 0.22f, -0.55f,
+R_ARC_TO, 0.73f, 0.73f, 0, 0, 1, 0.55f, -0.23f,
+R_CUBIC_TO, 0.22f, 0, 0.4f, 0.08f, 0.55f, 0.22f,
+R_ARC_TO, 0.73f, 0.73f, 0, 0, 1, 0.23f, 0.55f,
+R_ARC_TO, 0.76f, 0.76f, 0, 0, 1, -0.22f, 0.55f,
+R_ARC_TO, 0.73f, 0.73f, 0, 0, 1, -0.55f, 0.23f,
+CLOSE,
+MOVE_TO, 9.25f, 12,
+V_LINE_TO, 9.25f,
+R_LINE_TO, 1.5f, 1.5f,
+V_LINE_TO, 12,
+CLOSE,
+R_MOVE_TO, 9.78f, 4.91f,
+R_LINE_TO, -4.8f, -4.8f,
+LINE_TO, 10, 5.06f,
+LINE_TO, 8.95f, 6.82f,
+LINE_TO, 7.73f, 5.6f,
+LINE_TO, 10, 1.83f,
+CLOSE,
+MOVE_TO, 3.77f, 15.43f,
+R_H_LINE_TO, 9.43f,
+LINE_TO, 7.3f, 9.54f,
+CLOSE,
+R_MOVE_TO, 13.31f, 3.88f,
+R_LINE_TO, -2.22f, -2.22f,
+R_H_LINE_TO, -14,
+LINE_TO, 6.11f, 8.34f,
+LINE_TO, 0.7f, 2.93f,
+R_LINE_TO, 1.11f, -1.11f,
+R_LINE_TO, 16.38f, 16.38f,
+CLOSE,
+R_MOVE_TO, -6.82f, -6.82f,
+CLOSE,
+R_MOVE_TO, 1.34f, -3.03f,
+CLOSE
\ No newline at end of file
diff --git a/components/vector_icons/protocol_handler_chrome_refresh.icon b/components/vector_icons/protocol_handler_chrome_refresh.icon
new file mode 100644
index 0000000..00b3211
--- /dev/null
+++ b/components/vector_icons/protocol_handler_chrome_refresh.icon
@@ -0,0 +1,54 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 20,
+MOVE_TO, 7.84f, 16.55f,
+R_CUBIC_TO, -0.16f, 0, -0.3f, -0.03f, -0.44f, -0.09f,
+ARC_TO, 1.37f, 1.37f, 0, 0, 1, 7, 16.18f,
+R_LINE_TO, -4.91f, -5.43f,
+R_ARC_TO, 1.06f, 1.06f, 0, 0, 1, -0.21f, -0.36f,
+ARC_TO, 1.12f, 1.12f, 0, 0, 1, 1.81f, 10,
+R_ARC_TO, 1.1f, 1.1f, 0, 0, 1, 0.28f, -0.74f,
+LINE_TO, 7, 3.82f,
+R_CUBIC_TO, 0.13f, -0.12f, 0.26f, -0.22f, 0.4f, -0.28f,
+R_CUBIC_TO, 0.14f, -0.06f, 0.28f, -0.09f, 0.44f, -0.09f,
+R_CUBIC_TO, 0.16f, 0, 0.31f, 0.03f, 0.44f, 0.09f,
+R_CUBIC_TO, 0.13f, 0.06f, 0.26f, 0.16f, 0.38f, 0.28f,
+LINE_TO, 10, 5.31f,
+R_LINE_TO, 1.35f, -1.48f,
+R_ARC_TO, 1.32f, 1.32f, 0, 0, 1, 0.38f, -0.28f,
+R_ARC_TO, 0.99f, 0.99f, 0, 0, 1, 0.43f, -0.09f,
+R_CUBIC_TO, 0.16f, 0, 0.31f, 0.03f, 0.44f, 0.09f,
+R_CUBIC_TO, 0.14f, 0.06f, 0.27f, 0.16f, 0.4f, 0.28f,
+R_LINE_TO, 4.91f, 5.43f,
+R_CUBIC_TO, 0.09f, 0.11f, 0.16f, 0.23f, 0.21f, 0.36f,
+R_ARC_TO, 1.12f, 1.12f, 0, 0, 1, -0.21f, 1.12f,
+R_LINE_TO, -4.91f, 5.44f,
+R_ARC_TO, 1.43f, 1.43f, 0, 0, 1, -0.39f, 0.28f,
+R_CUBIC_TO, -0.14f, 0.06f, -0.28f, 0.09f, -0.44f, 0.09f,
+R_ARC_TO, 0.99f, 0.99f, 0, 0, 1, -0.43f, -0.09f,
+R_ARC_TO, 1.38f, 1.38f, 0, 0, 1, -0.38f, -0.28f,
+LINE_TO, 10, 14.69f,
+R_LINE_TO, -1.35f, 1.49f,
+R_ARC_TO, 1.32f, 1.32f, 0, 0, 1, -0.38f, 0.28f,
+R_ARC_TO, 0.99f, 0.99f, 0, 0, 1, -0.43f, 0.09f,
+CLOSE,
+R_MOVE_TO, 0, -2.03f,
+R_LINE_TO, 1.01f, -1.1f,
+R_LINE_TO, -2.43f, -2.68f,
+ARC_TO, 1.11f, 1.11f, 0, 0, 1, 6.13f, 10,
+R_CUBIC_TO, 0, -0.28f, 0.1f, -0.52f, 0.28f, -0.74f,
+R_LINE_TO, 2.43f, -2.68f,
+R_LINE_TO, -1.01f, -1.1f,
+LINE_TO, 3.75f, 10,
+CLOSE,
+R_MOVE_TO, 4.33f, 0,
+LINE_TO, 16.25f, 10,
+R_LINE_TO, -4.09f, -4.52f,
+R_LINE_TO, -1.01f, 1.1f,
+R_LINE_TO, 2.43f, 2.68f,
+R_CUBIC_TO, 0.19f, 0.22f, 0.28f, 0.47f, 0.28f, 0.74f,
+R_CUBIC_TO, 0, 0.28f, -0.1f, 0.52f, -0.28f, 0.74f,
+R_LINE_TO, -2.43f, 2.68f,
+CLOSE
\ No newline at end of file
diff --git a/components/vector_icons/protocol_handler_off_chrome_refresh.icon b/components/vector_icons/protocol_handler_off_chrome_refresh.icon
new file mode 100644
index 0000000..41d04e15
--- /dev/null
+++ b/components/vector_icons/protocol_handler_off_chrome_refresh.icon
@@ -0,0 +1,63 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 20,
+R_MOVE_TO, 16.19f, 18.34f,
+R_LINE_TO, -2.71f, -2.71f,
+R_LINE_TO, -0.48f, 0.56f,
+R_ARC_TO, 1.18f, 1.18f, 0, 0, 1, -0.37f, 0.28f,
+R_CUBIC_TO, -0.14f, 0.06f, -0.29f, 0.09f, -0.46f, 0.09f,
+R_CUBIC_TO, -0.17f, 0, -0.32f, -0.03f, -0.46f, -0.09f,
+R_ARC_TO, 0.94f, 0.94f, 0, 0, 1, -0.35f, -0.28f,
+LINE_TO, 10, 14.69f,
+R_LINE_TO, -1.35f, 1.49f,
+R_CUBIC_TO, -0.11f, 0.13f, -0.23f, 0.22f, -0.37f, 0.28f,
+R_CUBIC_TO, -0.14f, 0.06f, -0.29f, 0.09f, -0.45f, 0.09f,
+ARC_TO, 1.08f, 1.08f, 0, 0, 1, 7, 16.18f,
+R_LINE_TO, -4.91f, -5.43f,
+R_ARC_TO, 0.88f, 0.88f, 0, 0, 1, -0.21f, -0.34f,
+ARC_TO, 1.15f, 1.15f, 0, 0, 1, 1.81f, 10,
+R_ARC_TO, 1.1f, 1.1f, 0, 0, 1, 0.28f, -0.74f,
+R_LINE_TO, 2.39f, -2.63f,
+R_LINE_TO, -2.81f, -2.81f,
+LINE_TO, 2.78f, 2.7f,
+R_LINE_TO, 14.52f, 14.52f,
+CLOSE,
+R_MOVE_TO, -3.93f, -3.93f,
+R_LINE_TO, -1.04f, -1.07f,
+CLOSE,
+R_MOVE_TO, -4.42f, 0.11f,
+R_LINE_TO, 1.01f, -1.1f,
+R_LINE_TO, -2.43f, -2.68f,
+ARC_TO, 1.11f, 1.11f, 0, 0, 1, 6.13f, 10,
+R_CUBIC_TO, 0, -0.28f, 0.1f, -0.52f, 0.28f, -0.74f,
+R_LINE_TO, 0.33f, -0.37f,
+R_LINE_TO, -1.05f, -1.04f,
+LINE_TO, 3.75f, 10,
+CLOSE,
+R_MOVE_TO, 7.77f, -1.22f,
+R_LINE_TO, -1.23f, -1.22f,
+LINE_TO, 16.25f, 10,
+LINE_TO, 12.02f, 5.63f,
+R_LINE_TO, -0.86f, 0.96f,
+R_LINE_TO, 2.43f, 2.68f,
+R_ARC_TO, 1.11f, 1.11f, 0, 0, 1, 0, 1.48f,
+R_LINE_TO, -0.26f, 0.29f,
+LINE_TO, 8.84f, 6.54f,
+LINE_TO, 7.81f, 5.51f,
+LINE_TO, 6.59f, 4.29f,
+LINE_TO, 7, 3.82f,
+R_CUBIC_TO, 0.13f, -0.12f, 0.25f, -0.22f, 0.38f, -0.28f,
+R_CUBIC_TO, 0.13f, -0.06f, 0.28f, -0.09f, 0.45f, -0.09f,
+R_CUBIC_TO, 0.16f, 0, 0.31f, 0.03f, 0.45f, 0.09f,
+R_CUBIC_TO, 0.14f, 0.06f, 0.26f, 0.16f, 0.37f, 0.28f,
+LINE_TO, 10, 5.31f,
+R_LINE_TO, 1.35f, -1.48f,
+R_CUBIC_TO, 0.11f, -0.12f, 0.23f, -0.22f, 0.37f, -0.28f,
+R_CUBIC_TO, 0.14f, -0.06f, 0.29f, -0.09f, 0.45f, -0.09f,
+R_ARC_TO, 1.08f, 1.08f, 0, 0, 1, 0.84f, 0.38f,
+R_LINE_TO, 4.91f, 5.43f,
+R_ARC_TO, 1.13f, 1.13f, 0, 0, 1, 0.27f, 0.74f,
+R_ARC_TO, 1.1f, 1.1f, 0, 0, 1, -0.28f, 0.74f,
+CLOSE
\ No newline at end of file
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index f14b9bb5..1ff2c98 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -3565,10 +3565,6 @@
   RunHtmlTest(FILE_PATH_LITERAL("shadow-dom-first-child.html"));
 }
 
-IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, WhitespaceDynamic) {
-  RunHtmlTest(FILE_PATH_LITERAL("whitespace-dynamic.html"));
-}
-
 //
 // AccName tests where having the full tree is desired.
 //
diff --git a/content/browser/interest_group/ad_auction_service_impl.cc b/content/browser/interest_group/ad_auction_service_impl.cc
index 1235e73..15c8417d 100644
--- a/content/browser/interest_group/ad_auction_service_impl.cc
+++ b/content/browser/interest_group/ad_auction_service_impl.cc
@@ -88,7 +88,7 @@
 
 AdAuctionServiceImpl::BiddingAndAuctionDataConstructionState::
     BiddingAndAuctionDataConstructionState()
-    : uuid(base::Uuid::GenerateRandomV4()) {}
+    : request_id(base::Uuid::GenerateRandomV4()) {}
 AdAuctionServiceImpl::BiddingAndAuctionDataConstructionState::
     BiddingAndAuctionDataConstructionState(
         BiddingAndAuctionDataConstructionState&& other) = default;
@@ -382,7 +382,8 @@
   state.callback = std::move(callback);
 
   GetInterestGroupManager().GetInterestGroupAdAuctionData(
-      seller, GetTopWindowOrigin(),
+      GetTopWindowOrigin(),
+      /* generation_id=*/base::Uuid::GenerateRandomV4(),
       base::BindOnce(&AdAuctionServiceImpl::OnGotAuctionData,
                      weak_ptr_factory_.GetWeakPtr(), std::move(state)));
 }
@@ -710,13 +711,13 @@
 
 void AdAuctionServiceImpl::OnGotAuctionData(
     BiddingAndAuctionDataConstructionState state,
-    std::vector<uint8_t> plaintext) {
-  if (plaintext.empty()) {
+    BiddingAndAuctionData data) {
+  if (data.request.empty()) {
     std::move(state.callback).Run({}, "");
     return;
   }
 
-  state.plaintext = std::move(plaintext);
+  state.data = std::move(data);
   GetInterestGroupManager().GetBiddingAndAuctionServerKey(
       GetRefCountedTrustedURLLoaderFactory().get(),
       base::BindOnce(&AdAuctionServiceImpl::OnGotBiddingAndAuctionServerKey,
@@ -738,7 +739,7 @@
 
   auto maybe_request =
       quiche::ObliviousHttpRequest::CreateClientObliviousRequest(
-          std::string(state.plaintext.begin(), state.plaintext.end()),
+          std::string(state.data.request.begin(), state.data.request.end()),
           maybe_key->key, maybe_key_config.value());
   if (!maybe_request.ok()) {
     std::move(state.callback).Run({}, "");
@@ -750,7 +751,7 @@
   std::move(state.callback)
       .Run(mojo_base::BigBuffer(
                base::make_span(bytes, data.size() * sizeof(char))),
-           state.uuid.AsLowercaseString());
+           state.request_id.AsLowercaseString());
   // TODO(behamilton): Save request context for decryption.
 }
 
diff --git a/content/browser/interest_group/ad_auction_service_impl.h b/content/browser/interest_group/ad_auction_service_impl.h
index 6d6746b..ec32bc8 100644
--- a/content/browser/interest_group/ad_auction_service_impl.h
+++ b/content/browser/interest_group/ad_auction_service_impl.h
@@ -18,6 +18,7 @@
 #include "content/browser/fenced_frame/fenced_frame_url_mapping.h"
 #include "content/browser/interest_group/auction_runner.h"
 #include "content/browser/interest_group/auction_worklet_manager.h"
+#include "content/browser/interest_group/bidding_and_auction_serializer.h"
 #include "content/browser/interest_group/interest_group_auction_reporter.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/content_browser_client.h"
@@ -109,8 +110,8 @@
         BiddingAndAuctionDataConstructionState&& other);
     ~BiddingAndAuctionDataConstructionState();
 
-    std::vector<uint8_t> plaintext;  // unencrypted auction request blob
-    base::Uuid uuid;                 // request ID
+    BiddingAndAuctionData data;
+    base::Uuid request_id;
     GetInterestGroupAdAuctionDataCallback callback;
   };
 
@@ -156,7 +157,7 @@
           private_aggregation_requests);
 
   void OnGotAuctionData(BiddingAndAuctionDataConstructionState state,
-                        std::vector<uint8_t> plaintext);
+                        BiddingAndAuctionData data);
   void OnGotBiddingAndAuctionServerKey(
       BiddingAndAuctionDataConstructionState state,
       absl::optional<BiddingAndAuctionServerKey> key);
diff --git a/content/browser/interest_group/ad_auction_service_impl_unittest.cc b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
index 597f2be..ba28eb9f 100644
--- a/content/browser/interest_group/ad_auction_service_impl_unittest.cc
+++ b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
@@ -31,6 +31,8 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
+#include "components/cbor/diagnostic_writer.h"
+#include "components/cbor/reader.h"
 #include "components/services/storage/shared_storage/shared_storage_manager.h"
 #include "content/browser/aggregation_service/aggregatable_report.h"
 #include "content/browser/fenced_frame/fenced_frame_url_mapping.h"
@@ -7629,9 +7631,14 @@
     network_responder_->RegisterUpdateResponse(kBAndAKeyPath, json_output);
   }
 
+  struct AdAuctionDataAndId {
+    std::string request;
+    std::string request_id;
+  };
+
   // Gets auction data in the frame `rfh`. If `rfh` is nullptr, uses the main
   // frame. Returns the auction data.
-  absl::optional<std::string> GetAdAuctionDataAndFlushForFrame(
+  absl::optional<AdAuctionDataAndId> GetAdAuctionDataAndFlushForFrame(
       url::Origin seller,
       RenderFrameHost* rfh = nullptr) {
     mojo::Remote<blink::mojom::AdAuctionService> interest_service;
@@ -7639,15 +7646,15 @@
         rfh ? rfh : main_rfh(), interest_service.BindNewPipeAndPassReceiver());
 
     base::RunLoop run_loop;
-    absl::optional<std::string> output;
-    std::string output_id;
+    absl::optional<AdAuctionDataAndId> output;
     interest_service->GetInterestGroupAdAuctionData(
-        seller, base::BindLambdaForTesting([&run_loop, &output, &output_id](
-                                               mojo_base::BigBuffer result,
+        seller, base::BindLambdaForTesting([&](mojo_base::BigBuffer result,
                                                const std::string& id) {
-          output = std::string(reinterpret_cast<char*>(result.data()),
-                               result.size());
-          output_id = id;
+          AdAuctionDataAndId data;
+          data.request = std::string(reinterpret_cast<char*>(result.data()),
+                                     result.size());
+          data.request_id = id;
+          output = data;
           run_loop.Quit();
         }));
     interest_service.FlushForTesting();
@@ -7697,24 +7704,33 @@
   task_environment()->FastForwardBy(base::Seconds(1));
 
   std::vector<uint8_t> msg;
+  base::flat_map<url::Origin, std::vector<std::string>> group_names;
   base::RunLoop run_loop;
   manager_->GetInterestGroupAdAuctionData(
-      /*seller=*/test_origin, /*top_level_origin=*/test_origin,
-      base::BindLambdaForTesting([&](std::vector<uint8_t> inner_msg) {
-        msg = inner_msg;
+      /*top_level_origin=*/test_origin,
+      base::Uuid::ParseCaseInsensitive("00000000-0000-0000-0000-000000000000"),
+      base::BindLambdaForTesting([&](BiddingAndAuctionData data) {
+        msg = std::move(data.request);
+        group_names = std::move(data.group_names);
         run_loop.Quit();
       }));
   run_loop.Run();
   std::string expected =
-      "pABYIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABndmVyc2lvbgBpcHVibGlz"
-      "aGVybmh0dHBzOi8vYS50ZXN0bmludGVyZXN0R3JvdXBzoW5odHRwczovL2EudGVzdFiXH4sI"
-      "AAAAAAAAAFWNOw7CMBAF+"
-      "V0oIfxaUlJS0GJ7V85Cso7WCchCFPFZEOfERDQ0r5nRvOFtFPgIWb4sTLFaA6sGwSjxtYLSN"
-      "a1j5M4PZrPdsRZ39yhHsqxq/"
-      "7KCBtmERaUpuT13k6oVvJ2IfYyzc5yPWbo44hFPJYlAbH+FA4Z0fcWQfSeXPsX3f4Z+PD+"
-      "l5cGLogAAAA==";
+      "pQBY7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+      "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+      "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+      "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+      "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ3ZlcnNpb24AaXB1Ymxpc2hlcm5odHRwczov"
+      "L2EudGVzdGxnZW5lcmF0aW9uSWR4JDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAw"
+      "MDAwMG5pbnRlcmVzdEdyb3Vwc6FuaHR0cHM6Ly9hLnRlc3RYlx+"
+      "LCAAAAAAAAABVjTsOwjAQBfldKCH8WlJSUtBie1fOQrKO1gnIQhTxWRDnxEQ0NK+"
+      "Z0bzhbRT4CFm+LEyxWgOrBsEo8bWC0jWtY+TOD2az3bEWd/"
+      "coR7Ksav+yggbZhEWlKbk9d5OqFbydiH2Ms3Ocj1m6OOIRTyWJQGx/"
+      "hQOGdH3FkH0nlz7F93+Gfjw/peXBi6IAAAA=";
   EXPECT_EQ(1, absl::popcount(msg.size()));  // Should be a power of 2.
   EXPECT_EQ(expected, base::Base64Encode(msg));
+  EXPECT_THAT(group_names, testing::ElementsAre(testing::Pair(
+                               test_origin, testing::ElementsAre("cars"))));
 }
 
 TEST_F(AdAuctionServiceImplTest, SerializesAuctionBlobWithAnomalousPadding) {
@@ -7724,7 +7740,6 @@
   // request.
   manager_->JoinInterestGroup(
       blink::TestInterestGroupBuilder(test_origin, "cars")
-          .SetUserBiddingSignals(R"("ABCDEFGHIJKLMNOPQRSTUVWXYZ")")
           .SetAds({{{GURL("https://c.test/ad.html"), /*metadata=*/"",
                      /*size_group=*/absl::nullopt,
                      /*buyer_reporting_id=*/absl::nullopt,
@@ -7734,21 +7749,20 @@
   std::vector<uint8_t> msg;
   base::RunLoop run_loop;
   manager_->GetInterestGroupAdAuctionData(
-      /*seller=*/test_origin, /*top_level_origin=*/
-      url::Origin::Create(GURL("https://the.new.top.level.origin.test")),
-      base::BindLambdaForTesting([&](std::vector<uint8_t> inner_msg) {
-        msg = inner_msg;
+      /*top_level_origin=*/
+      url::Origin::Create(GURL("https://very.long.origin.test")),
+      base::Uuid::ParseCaseInsensitive("00000000-0000-0000-0000-000000000000"),
+      base::BindLambdaForTesting([&](BiddingAndAuctionData data) {
+        msg = std::move(data.request);
         run_loop.Quit();
       }));
   run_loop.Run();
   std::string expected =
-      "pQBWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAZ3ZlcnNpb24AaXB1Ymxpc2hlcnglaHR0cHM6"
-      "Ly90aGUubmV3LnRvcC5sZXZlbC5vcmlnaW4udGVzdG5pbnRlcmVzdEdyb3Vwc6FuaHR0cHM6"
-      "Ly9hLnRlc3RYih+"
-      "LCAAAAAAAAABrXJKcmFLcmGJoZGySkpeYm5qSnFhUnJdUlF9enFoUnJmel5hTvCS9KDU5NS+"
-      "5kiEjKTPFOb80r4Qho6AotSw8M6+"
-      "4ITMrPzMPLMhYVArU5JSZkpKZlw7VWyGj5Ojk7OLq5u7h6eXt4+"
-      "vnHxAYFBwSGhYeERmlBAD8GWK6fwAAAA==";
+      "pgBWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAZ3ZlcnNpb24AaXB1Ymxpc2hlcngdaHR0cHM6"
+      "Ly92ZXJ5Lmxvbmcub3JpZ2luLnRlc3RsZ2VuZXJhdGlvbklkeCQwMDAwMDAwMC0wMDAwLTAw"
+      "MDAtMDAwMC0wMDAwMDAwMDAwMDBuaW50ZXJlc3RHcm91cHOhbmh0dHBzOi8vYS50ZXN0WF8f"
+      "iwgAAAAAAAAAa1ycnJhS3JhiaGRskpKXmJuakpxYVJyXVJRfXpxaFJyZnpeYU7wkvSg1OTUv"
+      "uZIhIykzxTm/NK+EIaOgKLUsPDOvuCEzKz8zDyzICAAUFTd6TgAAAA==";
   EXPECT_EQ(1, absl::popcount(msg.size()));  // Should be a power of 2.
   EXPECT_EQ(expected, base::Base64Encode(msg));
 }
@@ -7756,15 +7770,19 @@
 TEST_F(AdAuctionServiceImplTest, SerializesAuctionBlobWithNoGroups) {
   url::Origin test_origin = url::Origin::Create(GURL(kOriginStringA));
   std::vector<uint8_t> msg;
+  base::flat_map<url::Origin, std::vector<std::string>> group_names;
   base::RunLoop run_loop;
   manager_->GetInterestGroupAdAuctionData(
-      /*seller=*/test_origin, /*top_level_origin=*/test_origin,
-      base::BindLambdaForTesting([&](std::vector<uint8_t> inner_msg) {
-        msg = inner_msg;
+      /*top_level_origin=*/test_origin,
+      base::Uuid::ParseCaseInsensitive("00000000-0000-0000-0000-000000000000"),
+      base::BindLambdaForTesting([&](BiddingAndAuctionData data) {
+        msg = std::move(data.request);
+        group_names = std::move(data.group_names);
         run_loop.Quit();
       }));
   run_loop.Run();
   EXPECT_EQ("", base::Base64Encode(msg));
+  EXPECT_TRUE(group_names.empty());
 }
 
 TEST_F(AdAuctionServiceImplTest, SerializesAuctionBlobWithEmptyGroup) {
@@ -7775,15 +7793,19 @@
   task_environment()->FastForwardBy(base::Seconds(1));
 
   std::vector<uint8_t> msg;
+  base::flat_map<url::Origin, std::vector<std::string>> group_names;
   base::RunLoop run_loop;
   manager_->GetInterestGroupAdAuctionData(
-      /*seller=*/test_origin, /*top_level_origin=*/test_origin,
-      base::BindLambdaForTesting([&](std::vector<uint8_t> inner_msg) {
-        msg = inner_msg;
+      /*top_level_origin=*/test_origin,
+      base::Uuid::ParseCaseInsensitive("00000000-0000-0000-0000-000000000000"),
+      base::BindLambdaForTesting([&](BiddingAndAuctionData data) {
+        msg = std::move(data.request);
+        group_names = std::move(data.group_names);
         run_loop.Quit();
       }));
   run_loop.Run();
   EXPECT_EQ("", base::Base64Encode(msg));
+  EXPECT_TRUE(group_names.empty());
 }
 
 TEST_F(AdAuctionServiceImplTest, SerializesMultipleOwnersAuctionBlob) {
@@ -7864,20 +7886,23 @@
   task_environment()->FastForwardBy(base::Seconds(1));
 
   std::vector<uint8_t> msg;
+  base::flat_map<url::Origin, std::vector<std::string>> group_names;
   base::RunLoop run_loop;
   manager_->GetInterestGroupAdAuctionData(
-      /*seller=*/test_origin_a, /*top_level_origin=*/test_origin_a,
-      base::BindLambdaForTesting([&](std::vector<uint8_t> inner_msg) {
-        msg = inner_msg;
+      /*top_level_origin=*/test_origin_a,
+      base::Uuid::ParseCaseInsensitive("00000000-0000-0000-0000-000000000000"),
+      base::BindLambdaForTesting([&](BiddingAndAuctionData data) {
+        msg = std::move(data.request);
+        group_names = std::move(data.group_names);
         run_loop.Quit();
       }));
   run_loop.Run();
 
   std::string expected =
-      "pABYnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+      "pQBYagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
       "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
-      "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn"
-      "dmVyc2lvbgBpcHVibGlzaGVybmh0dHBzOi8vYS50ZXN0bmludGVyZXN0R3JvdXBzom5odHRw"
+      "AABndmVyc2lvbgBpcHVibGlzaGVybmh0dHBzOi8vYS50ZXN0bGdlbmVyYXRpb25JZHgkMDAw"
+      "MDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwbmludGVyZXN0R3JvdXBzom5odHRw"
       "czovL2EudGVzdFiZH4sIAAAAAAAAAHXNOw7CMAwGYCi9UB+"
       "8VjgCAyuOY7VBrVPZAcQGOUsPShUGJASL9cu2/"
       "i+"
@@ -7888,6 +7913,11 @@
       "MaMrPyM/PAgowA36E6yG4AAAA=";
   EXPECT_EQ(1, absl::popcount(msg.size()));  // Should be a power of 2.
   EXPECT_EQ(expected, base::Base64Encode(msg));
+  EXPECT_THAT(
+      group_names,
+      testing::ElementsAre(
+          testing::Pair(test_origin_a, testing::ElementsAre("boats", "cars")),
+          testing::Pair(test_origin_b, testing::ElementsAre("trains"))));
 }
 
 TEST_F(AdAuctionServiceImplBAndATest, EncryptsPayload) {
@@ -7921,7 +7951,7 @@
   manager_->RecordInterestGroupWin(
       {test_origin, "cars"}, R"({"renderUrl": "https://c.test/ad2.html"})");
   task_environment()->FastForwardBy(base::Seconds(1));
-  absl::optional<std::string> result =
+  absl::optional<AdAuctionDataAndId> result =
       GetAdAuctionDataAndFlushForFrame(test_origin);
   EXPECT_TRUE(result.has_value());
 
@@ -7935,20 +7965,28 @@
                       sizeof(kTestPrivateKey)),
           key_config)
           .value();
-  auto request = ohttp_gateway.DecryptObliviousHttpRequest(result.value());
+  auto request =
+      ohttp_gateway.DecryptObliviousHttpRequest(result.value().request);
   EXPECT_TRUE(request.ok()) << request.status();
-  std::string expected =
-      "pABYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
-      "AAAAAAAAAAAAAAAAAABndmVyc2lvbgBpcHVibGlzaGVybmh0dHBzOi8vYS50ZXN0bmludGVy"
-      "ZXN0R3JvdXBzoW5odHRwczovL2EudGVzdFh5H4sIAAAAAAAAAB3MSw6CUAxGYdEVqfgauwQH"
-      "Ti1tAzXwX9KihCF3LSxUw/"
-      "h8OfPCJJFlfziWXJ7OAupUmDxaknvq+gTFEDNfrjdUnsZQf1gNamOpXVnB066p7G8/GDZN7/"
-      "p9GiLn4pW369beybDm4gdbHLhHbgAAAA==";
-  const auto got = request->GetPlaintextData();
-  const auto* bytes = reinterpret_cast<const uint8_t*>(got.data());
-  EXPECT_EQ(1, absl::popcount(got.size()));  // Should be a power of 2.
-  EXPECT_EQ(expected, base::Base64Encode(
-                          base::make_span(bytes, got.size() * sizeof(char))));
+  auto got = request->GetPlaintextData();
+  EXPECT_EQ(1, absl::popcount(got.size()));
+  // The generation ID is random, so match against everything before and
+  // everything after.
+  std::string got_str = cbor::DiagnosticWriter::Write(
+      cbor::Reader::Read(base::as_bytes(base::make_span(got))).value());
+  EXPECT_THAT(got_str, testing::StartsWith(
+                           R"({0: h'0000000000000000000000000000', )"
+                           R"("version": 0, "publisher": "https://a.test", )"
+                           R"("generationId": ")"));
+  EXPECT_THAT(
+      got_str,
+      testing::EndsWith(
+          R"(", )"
+          R"("interestGroups": {"https://a.test": )"
+          R"(h'1F8B08000000000000001DCC4B0E82500C4661D115A9F81ABB04074E2D6D033)"
+          R"(5F05FD2A28421772D2C54C3F87C39F3C22491657F38965C9ECE02EA54983C5A92)"
+          R"(7BEAFA04C510335FAE37549EC6507F580D6A63A95D59C1D3AEA9EC6F3F18364DE)"
+          R"(FFA7D1A22E7E295B7EBD6DEC9B0E6E2075B1CB8476E000000'}})"));
 }
 
 TEST_F(AdAuctionServiceImplBAndATest, OriginNotAllowed) {
@@ -7974,10 +8012,10 @@
                  /*buyer_and_seller_reporting_id=*/absl::nullopt, "789"}}})
           .Build(),
       GURL("https://a.test/example.html"));
-  absl::optional<std::string> result =
+  absl::optional<AdAuctionDataAndId> result =
       GetAdAuctionDataAndFlushForFrame(test_origin);
   EXPECT_TRUE(result.has_value());
-  EXPECT_EQ("", result.value());
+  EXPECT_EQ("", result.value().request);
 }
 
 }  // namespace content
diff --git a/content/browser/interest_group/bidding_and_auction_serializer.cc b/content/browser/interest_group/bidding_and_auction_serializer.cc
index d087272..e943f97 100644
--- a/content/browser/interest_group/bidding_and_auction_serializer.cc
+++ b/content/browser/interest_group/bidding_and_auction_serializer.cc
@@ -4,6 +4,9 @@
 
 #include "content/browser/interest_group/bidding_and_auction_serializer.h"
 
+#include <algorithm>
+#include <vector>
+
 #include "base/containers/cxx20_erase.h"
 #include "base/json/json_string_value_serializer.h"
 #include "components/cbor/diagnostic_writer.h"
@@ -156,42 +159,57 @@
 
 }  // namespace
 
+BiddingAndAuctionData::BiddingAndAuctionData() = default;
+BiddingAndAuctionData::BiddingAndAuctionData(BiddingAndAuctionData&& other) =
+    default;
+BiddingAndAuctionData::~BiddingAndAuctionData() = default;
+
+BiddingAndAuctionData& BiddingAndAuctionData::operator=(
+    BiddingAndAuctionData&& other) = default;
+
 BiddingAndAuctionSerializer::BiddingAndAuctionSerializer() {
   start_time_ = base::Time::Now();
 }
 BiddingAndAuctionSerializer::BiddingAndAuctionSerializer(
-    BiddingAndAuctionSerializer&& state) = default;
+    BiddingAndAuctionSerializer&& other) = default;
 BiddingAndAuctionSerializer::~BiddingAndAuctionSerializer() = default;
 
 void BiddingAndAuctionSerializer::AddGroups(
-    std::string owner,
+    url::Origin owner,
     std::vector<StorageInterestGroup> groups) {
   base::EraseIf(groups, [](const StorageInterestGroup& group) {
     return (!group.interest_group.ads) ||
            (group.interest_group.ads->size() == 0);
   });
   if (groups.size() > 0) {
-    accumulated_groups_.emplace_back(owner, std::move(groups));
+    accumulated_groups_.emplace_back(std::move(owner), std::move(groups));
   }
 }
 
-std::vector<uint8_t> BiddingAndAuctionSerializer::Build() {
+BiddingAndAuctionData BiddingAndAuctionSerializer::Build() {
   if (accumulated_groups_.empty()) {
     return {};
   }
+  BiddingAndAuctionData data;
+
   cbor::Value::MapValue message_obj;
   message_obj[cbor::Value("version")] = cbor::Value(0);
   // "gzip" is the default so we don't need to specify the compression.
   // message_obj[cbor::Value("compression")] = cbor::Value("gzip");
+  DCHECK(generation_id_.is_valid());
+  message_obj[cbor::Value("generationId")] =
+      cbor::Value(generation_id_.AsLowercaseString());
   message_obj[cbor::Value("publisher")] = cbor::Value(publisher_);
 
   cbor::Value::MapValue groups_map;
   groups_map.reserve(accumulated_groups_.size());
   for (const auto& bidder_groups : accumulated_groups_) {
     cbor::Value::ArrayValue groups;
+    std::vector<std::string> names;
     for (const auto& group : bidder_groups.second) {
       cbor::Value group_obj = SerializeInterestGroup(start_time_, group);
       groups.emplace_back(std::move(group_obj));
+      names.push_back(group.interest_group.name);
     }
     cbor::Value groups_obj(std::move(groups));
     absl::optional<std::vector<uint8_t>> maybe_sub_message =
@@ -201,8 +219,9 @@
     bool success = compression::GzipCompress(maybe_sub_message.value(),
                                              &compressed_groups);
     DCHECK(success);
-    groups_map[cbor::Value(bidder_groups.first)] =
+    groups_map[cbor::Value(bidder_groups.first.Serialize())] =
         cbor::Value(compressed_groups, cbor::Value::Type::BYTE_STRING);
+    data.group_names.emplace(bidder_groups.first, std::move(names));
   }
 
   message_obj[cbor::Value("interestGroups")] =
@@ -264,7 +283,8 @@
   cbor::Value message(std::move(message_obj));
   absl::optional<std::vector<uint8_t>> maybe_msg = cbor::Writer::Write(message);
   DCHECK(maybe_msg);
-  return *maybe_msg;
+  data.request = std::move(*maybe_msg);
+  return data;
 }
 
 }  // namespace content
diff --git a/content/browser/interest_group/bidding_and_auction_serializer.h b/content/browser/interest_group/bidding_and_auction_serializer.h
index a88bbd26..b6622e6 100644
--- a/content/browser/interest_group/bidding_and_auction_serializer.h
+++ b/content/browser/interest_group/bidding_and_auction_serializer.h
@@ -8,27 +8,44 @@
 #include <string>
 #include <vector>
 
+#include "base/containers/flat_map.h"
 #include "base/time/time.h"
+#include "base/uuid.h"
 #include "content/browser/interest_group/storage_interest_group.h"
+#include "content/common/content_export.h"
 
 namespace content {
 
+struct CONTENT_EXPORT BiddingAndAuctionData {
+  BiddingAndAuctionData();
+  BiddingAndAuctionData(BiddingAndAuctionData&& other);
+  ~BiddingAndAuctionData();
+
+  BiddingAndAuctionData& operator=(BiddingAndAuctionData&& other);
+
+  std::vector<uint8_t> request;
+  base::flat_map<url::Origin, std::vector<std::string>> group_names;
+};
+
 // Serializes Bidding and Auction requests
 class BiddingAndAuctionSerializer {
  public:
   BiddingAndAuctionSerializer();
-  BiddingAndAuctionSerializer(BiddingAndAuctionSerializer&& state);
+  BiddingAndAuctionSerializer(BiddingAndAuctionSerializer&& other);
   ~BiddingAndAuctionSerializer();
 
   void SetPublisher(std::string publisher) { publisher_ = publisher; }
-  // TODO(behamilton): void SetGenerationId(std::string generation_id);
-  void AddGroups(std::string owner, std::vector<StorageInterestGroup> groups);
-  std::vector<uint8_t> Build();
+  void SetGenerationId(base::Uuid generation_id) {
+    generation_id_ = generation_id;
+  }
+  void AddGroups(url::Origin owner, std::vector<StorageInterestGroup> groups);
+  BiddingAndAuctionData Build();
 
  private:
+  base::Uuid generation_id_;
   base::Time start_time_;
   std::string publisher_;
-  std::vector<std::pair<std::string, std::vector<StorageInterestGroup>>>
+  std::vector<std::pair<url::Origin, std::vector<StorageInterestGroup>>>
       accumulated_groups_;
 };
 
diff --git a/content/browser/interest_group/interest_group_manager_impl.cc b/content/browser/interest_group/interest_group_manager_impl.cc
index ffe1536..200aac52 100644
--- a/content/browser/interest_group/interest_group_manager_impl.cc
+++ b/content/browser/interest_group/interest_group_manager_impl.cc
@@ -410,11 +410,12 @@
 }
 
 void InterestGroupManagerImpl::GetInterestGroupAdAuctionData(
-    url::Origin seller,
     url::Origin top_level_origin,
-    base::OnceCallback<void(std::vector<uint8_t>)> callback) {
+    base::Uuid generation_id,
+    base::OnceCallback<void(BiddingAndAuctionData)> callback) {
   AdAuctionDataLoaderState state;
   state.serializer.SetPublisher(top_level_origin.Serialize());
+  state.serializer.SetGenerationId(std::move(generation_id));
   state.callback = std::move(callback);
   GetAllInterestGroupOwners(base::BindOnce(
       &InterestGroupManagerImpl::LoadNextInterestGroupAdAuctionData,
@@ -444,7 +445,7 @@
     std::vector<url::Origin> owners,
     url::Origin owner,
     std::vector<StorageInterestGroup> groups) {
-  state.serializer.AddGroups(owner.Serialize(), std::move(groups));
+  state.serializer.AddGroups(std::move(owner), std::move(groups));
   LoadNextInterestGroupAdAuctionData(std::move(state), std::move(owners));
 }
 
diff --git a/content/browser/interest_group/interest_group_manager_impl.h b/content/browser/interest_group/interest_group_manager_impl.h
index 5a4efcf..c089e11 100644
--- a/content/browser/interest_group/interest_group_manager_impl.h
+++ b/content/browser/interest_group/interest_group_manager_impl.h
@@ -317,9 +317,9 @@
   void UpdateLastKAnonymityReported(const std::string& key);
 
   void GetInterestGroupAdAuctionData(
-      url::Origin seller,
       url::Origin top_level_origin,
-      base::OnceCallback<void(std::vector<uint8_t>)> callback);
+      base::Uuid generation_id,
+      base::OnceCallback<void(BiddingAndAuctionData)> callback);
 
   void GetBiddingAndAuctionServerKey(
       network::mojom::URLLoaderFactory* loader,
@@ -359,7 +359,7 @@
     ~AdAuctionDataLoaderState();
     AdAuctionDataLoaderState(AdAuctionDataLoaderState&& state);
     BiddingAndAuctionSerializer serializer;
-    base::OnceCallback<void(std::vector<uint8_t>)> callback;
+    base::OnceCallback<void(BiddingAndAuctionData)> callback;
   };
 
   // Callbacks for CheckPermissionsAndJoinInterestGroup() and
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index b44d9243..b8649b77 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -1151,7 +1151,12 @@
 
 void NavigationURLLoaderImpl::Clone(
     mojo::PendingReceiver<network::mojom::AcceptCHFrameObserver> listener) {
-  accept_ch_frame_observers_.Add(this, std::move(listener));
+  // Use |kNavigationNetworkResponse| thread runner. Messages received related
+  // to AcceptCHFrame are not order dependent and can restart the navigation,
+  // blocking navigation when they do.
+  accept_ch_frame_observers_.Add(
+      this, std::move(listener),
+      GetUIThreadTaskRunner({BrowserTaskType::kNavigationNetworkResponse}));
 }
 
 // Returns true if an interceptor wants to handle the response, i.e. return a
@@ -1335,8 +1340,12 @@
 
   mojo::PendingRemote<network::mojom::AcceptCHFrameObserver>
       accept_ch_frame_observer;
+  // Use |kNavigationNetworkResponse| thread runner. Messages received related
+  // to AcceptCHFrame are not order dependent and can restart the navigation,
+  // blocking navigation when they do.
   accept_ch_frame_observers_.Add(
-      this, accept_ch_frame_observer.InitWithNewPipeAndPassReceiver());
+      this, accept_ch_frame_observer.InitWithNewPipeAndPassReceiver(),
+      GetUIThreadTaskRunner({BrowserTaskType::kNavigationNetworkResponse}));
 
   FrameTreeNode* frame_tree_node =
       FrameTreeNode::GloballyFindByID(frame_tree_node_id_);
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index b8fe56a..334c126 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -881,14 +881,15 @@
   data->set_intent(FrameDeleteIntentionToProto(intent));
 }
 
-// Returns an experimental process shutdown delay if the SubframeShutdownDelay
-// experiment is enabled, 0 if not or if under memory pressure. This is used to
-// keep subframe processes alive for a few seconds in case they can be reused.
+// Returns the amount of time to keep subframe processes alive in case they can
+// be reused. Returns zero if under memory pressure, as memory should be freed
+// up as soon as possible if it's limited.
 base::TimeDelta GetSubframeProcessShutdownDelay(
     BrowserContext* browser_context) {
   static constexpr base::TimeDelta kZeroDelay;
-  if (!base::FeatureList::IsEnabled(features::kSubframeShutdownDelay))
+  if (!RenderProcessHostImpl::ShouldDelayProcessShutdown()) {
     return kZeroDelay;
+  }
 
   // Don't delay process shutdown under memory pressure. Does not cancel
   // existing shutdown delays for processes already in delayed-shutdown state.
@@ -13361,15 +13362,20 @@
                                        ->common_params()
                                        .navigation_start);
     }
-    base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-        FROM_HERE,
-        base::BindOnce(
-            [](blink::mojom::LocalFrame::BeforeUnloadCallback callback,
-               base::TimeTicks start_time, base::TimeTicks end_time) {
-              std::move(callback).Run(/*proceed=*/true, start_time, end_time);
-            },
-            std::move(before_unload_closure), send_before_unload_start_time_,
-            base::TimeTicks::Now()));
+    // Use a high-priority task to continue the navigation. This is safe as it
+    // happens early in the navigation flow and shouldn't race with any other
+    // tasks associated with this navigation.
+    GetUIThreadTaskRunner({BrowserTaskType::kBeforeUnloadBrowserResponse})
+        ->PostTask(
+            FROM_HERE,
+            base::BindOnce(
+                [](blink::mojom::LocalFrame::BeforeUnloadCallback callback,
+                   base::TimeTicks start_time, base::TimeTicks end_time) {
+                  std::move(callback).Run(/*proceed=*/true, start_time,
+                                          end_time);
+                },
+                std::move(before_unload_closure),
+                send_before_unload_start_time_, base::TimeTicks::Now()));
     return;
   }
   // Experiment to run beforeunload handlers at a higher priority in the
diff --git a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
index 382dc2c..90bb4f88 100644
--- a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
+++ b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
@@ -6057,16 +6057,8 @@
   }
 }
 
-class RenderFrameHostImplSubframeReuseBrowserTest
-    : public RenderFrameHostImplBrowserTest {
- public:
-  RenderFrameHostImplSubframeReuseBrowserTest() {
-    scoped_feature_list_.InitAndEnableFeature(features::kSubframeShutdownDelay);
-  }
-
- protected:
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
+using RenderFrameHostImplSubframeReuseBrowserTest =
+    RenderFrameHostImplBrowserTest;
 
 IN_PROC_BROWSER_TEST_F(RenderFrameHostImplSubframeReuseBrowserTest,
                        SubframeShutdownDelay) {
@@ -6100,9 +6092,13 @@
 
   // The process hosting the subframe should have its shutdown delayed and be
   // tracked in the pending-delete tracker.
-  ASSERT_TRUE(static_cast<RenderProcessHostImpl*>(
-                  content::RenderProcessHost::FromID(subframe_process_id))
-                  ->IsProcessShutdownDelayedForTesting());
+  auto* subframe_process_host = static_cast<RenderProcessHostImpl*>(
+      content::RenderProcessHost::FromID(subframe_process_id));
+  if (RenderProcessHostImpl::ShouldDelayProcessShutdown()) {
+    ASSERT_TRUE(subframe_process_host->IsProcessShutdownDelayedForTesting());
+  } else {
+    ASSERT_EQ(nullptr, subframe_process_host);
+  }
 
   // Wait for |url_2| to fully load so that its subframe loads.
   EXPECT_TRUE(WaitForLoadStop(web_contents()));
@@ -6111,13 +6107,16 @@
   // subframe, because they share the same site.
   RenderFrameHostImpl* new_rfh_b =
       root_frame_host()->child_at(0)->current_frame_host();
-  ASSERT_EQ(subframe_process_id, new_rfh_b->GetProcess()->GetID());
+  ASSERT_EQ(RenderProcessHostImpl::ShouldDelayProcessShutdown(),
+            subframe_process_id == new_rfh_b->GetProcess()->GetID());
 
   // The process should no longer be in the pending-delete tracker, as it has
   // been reused.
-  ASSERT_FALSE(static_cast<RenderProcessHostImpl*>(
-                   content::RenderProcessHost::FromID(subframe_process_id))
-                   ->IsProcessShutdownDelayedForTesting());
+  if (RenderProcessHostImpl::ShouldDelayProcessShutdown()) {
+    ASSERT_FALSE(static_cast<RenderProcessHostImpl*>(
+                     content::RenderProcessHost::FromID(subframe_process_id))
+                     ->IsProcessShutdownDelayedForTesting());
+  }
 }
 
 // Test that multiple subframe-shutdown delays from the same source can be in
@@ -6142,13 +6141,16 @@
   const SiteInfo site_info = rfh->GetSiteInstance()->GetSiteInfo();
   const base::TimeDelta delay = base::Seconds(5);
   process->DelayProcessShutdown(delay, base::TimeDelta(), site_info);
-  EXPECT_TRUE(process->IsProcessShutdownDelayedForTesting());
+  EXPECT_EQ(RenderProcessHostImpl::ShouldDelayProcessShutdown(),
+            process->IsProcessShutdownDelayedForTesting());
   process->DelayProcessShutdown(delay, base::TimeDelta(), site_info);
-  EXPECT_TRUE(process->IsProcessShutdownDelayedForTesting());
+  EXPECT_EQ(RenderProcessHostImpl::ShouldDelayProcessShutdown(),
+            process->IsProcessShutdownDelayedForTesting());
 
   // When one delay is cancelled, the other should remain in effect.
   process->CancelProcessShutdownDelay(site_info);
-  EXPECT_TRUE(process->IsProcessShutdownDelayedForTesting());
+  EXPECT_EQ(RenderProcessHostImpl::ShouldDelayProcessShutdown(),
+            process->IsProcessShutdownDelayedForTesting());
   process->CancelProcessShutdownDelay(site_info);
   EXPECT_FALSE(process->IsProcessShutdownDelayedForTesting());
 }
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index f073add..15dc38f7 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -2372,8 +2372,7 @@
   shutdown_delay_ref_count_++;
 
   // Add to the delayed-shutdown tracker with the site that triggered the delay.
-  if (base::FeatureList::IsEnabled(features::kSubframeShutdownDelay) &&
-      ShouldTrackProcessForSite(site_info)) {
+  if (ShouldDelayProcessShutdown() && ShouldTrackProcessForSite(site_info)) {
     SiteProcessCountTracker* delayed_shutdown_tracker =
         SiteProcessCountTracker::GetInstance(
             GetBrowserContext(),
@@ -4635,6 +4634,15 @@
 }
 
 // static
+bool RenderProcessHostImpl::ShouldDelayProcessShutdown() {
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+  return true;
+#else
+  return false;
+#endif
+}
+
+// static
 void RenderProcessHost::WarmupSpareRenderProcessHost(
     content::BrowserContext* browser_context) {
   SpareRenderProcessHostManager::GetInstance().WarmupSpareRenderProcessHost(
@@ -5509,11 +5517,11 @@
     }
   }
 
-  // If there are no eligible existing RenderProcessHosts,
-  // experimentally add RenderProcessHosts whose shutdown is pending that
-  // previously hosted a frame for |site_url|.
+  // If there are no eligible existing RenderProcessHosts, add
+  // RenderProcessHosts whose shutdown is pending that previously hosted a frame
+  // for `site_url`.
   if (eligible_foreground_hosts.empty() && eligible_background_hosts.empty() &&
-      base::FeatureList::IsEnabled(features::kSubframeShutdownDelay)) {
+      ShouldDelayProcessShutdown()) {
     SiteProcessCountTracker* delayed_shutdown_tracker =
         static_cast<SiteProcessCountTracker*>(browser_context->GetUserData(
             kDelayedShutdownSiteProcessCountTrackerKey));
@@ -5588,8 +5596,7 @@
   // Remove from the delayed-shutdown tracker. This may have already been done
   // in StopTrackingProcessForShutdownDelay() if the process was reused before
   // this task executed.
-  if (base::FeatureList::IsEnabled(features::kSubframeShutdownDelay) &&
-      ShouldTrackProcessForSite(site_info)) {
+  if (ShouldDelayProcessShutdown() && ShouldTrackProcessForSite(site_info)) {
     SiteProcessCountTracker* delayed_shutdown_tracker =
         SiteProcessCountTracker::GetInstance(
             GetBrowserContext(),
@@ -5607,8 +5614,9 @@
 }
 
 void RenderProcessHostImpl::StopTrackingProcessForShutdownDelay() {
-  if (!base::FeatureList::IsEnabled(features::kSubframeShutdownDelay))
+  if (!ShouldDelayProcessShutdown()) {
     return;
+  }
   SiteProcessCountTracker* delayed_shutdown_tracker =
       SiteProcessCountTracker::GetInstance(
           GetBrowserContext(),
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index 5b2cb82..378b5448 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -412,6 +412,13 @@
   static bool MayReuseAndIsSuitable(RenderProcessHost* host,
                                     SiteInstanceImpl* site_instance);
 
+  // Returns true if RenderProcessHost shutdown should be delayed by a few
+  // seconds to allow the subframe's process to be potentially reused. This aims
+  // to reduce process churn in navigations where the source and destination
+  // share subframes. Only returns true on platforms where process startup is
+  // expensive.
+  static bool ShouldDelayProcessShutdown();
+
   // Returns an existing RenderProcessHost for |site_info| in
   // |isolation_context|, if one exists.  Otherwise a new RenderProcessHost
   // should be created and registered using RegisterProcessHostForSite(). This
diff --git a/content/browser/scheduler/browser_task_executor.cc b/content/browser/scheduler/browser_task_executor.cc
index 69f9daf..0e9aa44 100644
--- a/content/browser/scheduler/browser_task_executor.cc
+++ b/content/browser/scheduler/browser_task_executor.cc
@@ -18,6 +18,7 @@
 #include "build/build_config.h"
 #include "content/browser/browser_process_io_thread.h"
 #include "content/browser/browser_thread_impl.h"
+#include "content/common/features.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/common/content_features.h"
 
@@ -98,6 +99,12 @@
     case BrowserTaskType::kServiceWorkerStorageControlResponse:
       return QueueType::kServiceWorkerStorageControlResponse;
 
+    case BrowserTaskType::kBeforeUnloadBrowserResponse:
+      if (base::FeatureList::IsEnabled(kBeforeUnloadBrowserResponseQueue)) {
+        return QueueType::kBeforeUnloadBrowserResponse;
+      }
+      break;
+
     case BrowserTaskType::kDefault:
       // Defer to traits.priority() below.
       break;
diff --git a/content/browser/scheduler/browser_task_queues.cc b/content/browser/scheduler/browser_task_queues.cc
index eb962e2..7669374 100644
--- a/content/browser/scheduler/browser_task_queues.cc
+++ b/content/browser/scheduler/browser_task_queues.cc
@@ -79,6 +79,8 @@
       return QueueName::UI_NAVIGATION_NETWORK_RESPONSE_TQ;
     case BrowserTaskQueues::QueueType::kServiceWorkerStorageControlResponse:
       return QueueName::UI_SERVICE_WORKER_STORAGE_CONTROL_RESPONSE_TQ;
+    case BrowserTaskQueues::QueueType::kBeforeUnloadBrowserResponse:
+      return QueueName::UI_BEFORE_UNLOAD_BROWSER_RESPONSE_TQ;
   }
 }
 
@@ -100,6 +102,8 @@
       return QueueName::IO_NAVIGATION_NETWORK_RESPONSE_TQ;
     case BrowserTaskQueues::QueueType::kServiceWorkerStorageControlResponse:
       return QueueName::IO_SERVICE_WORKER_STORAGE_CONTROL_RESPONSE_TQ;
+    case BrowserTaskQueues::QueueType::kBeforeUnloadBrowserResponse:
+      return QueueName::IO_BEFORE_UNLOAD_BROWSER_RESPONSE_TQ;
   }
 }
 
@@ -185,6 +189,9 @@
   GetBrowserTaskQueue(QueueType::kServiceWorkerStorageControlResponse)
       ->SetQueuePriority(BrowserTaskPriority::kHighestPriority);
 
+  GetBrowserTaskQueue(QueueType::kBeforeUnloadBrowserResponse)
+      ->SetQueuePriority(BrowserTaskPriority::kHighPriority);
+
   // Control queue
   control_queue_ =
       sequence_manager->CreateTaskQueue(base::sequence_manager::TaskQueue::Spec(
diff --git a/content/browser/scheduler/browser_task_queues.h b/content/browser/scheduler/browser_task_queues.h
index 5a7bb3e..444fc14 100644
--- a/content/browser/scheduler/browser_task_queues.h
+++ b/content/browser/scheduler/browser_task_queues.h
@@ -78,7 +78,10 @@
     // after startup.
     kServiceWorkerStorageControlResponse,
 
-    kMaxValue = kServiceWorkerStorageControlResponse
+    // For before unload navigation continuation tasks.
+    kBeforeUnloadBrowserResponse,
+
+    kMaxValue = kBeforeUnloadBrowserResponse
   };
 
   static constexpr size_t kNumQueueTypes =
diff --git a/content/browser/scheduler/browser_ui_thread_scheduler.cc b/content/browser/scheduler/browser_ui_thread_scheduler.cc
index 96cfc97a..3e9b950c 100644
--- a/content/browser/scheduler/browser_ui_thread_scheduler.cc
+++ b/content/browser/scheduler/browser_ui_thread_scheduler.cc
@@ -234,6 +234,7 @@
     case BrowserTaskQueues::QueueType::kUserInput:
     case BrowserTaskQueues::QueueType::kNavigationNetworkResponse:
     case BrowserTaskQueues::QueueType::kServiceWorkerStorageControlResponse:
+    case BrowserTaskQueues::QueueType::kBeforeUnloadBrowserResponse:
       return true;
   }
   NOTREACHED();
diff --git a/content/common/features.cc b/content/common/features.cc
index b00c60f5..82263249 100644
--- a/content/common/features.cc
+++ b/content/common/features.cc
@@ -11,6 +11,10 @@
 
 // Please keep features in alphabetical order.
 
+BASE_FEATURE(kBeforeUnloadBrowserResponseQueue,
+             "BeforeUnloadBrowserResponseQueue",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kNavigationUpdatesChildViewsVisibility,
              "NavigationUpdatesChildViewsVisibility",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/content/common/features.h b/content/common/features.h
index 02133742..91d44b5 100644
--- a/content/common/features.h
+++ b/content/common/features.h
@@ -14,6 +14,10 @@
 
 // Please keep features in alphabetical order.
 
+// When enabled, the browser will schedule before unload tasks that continue
+// navigation network responses in a kHigh priority queue.
+BASE_DECLARE_FEATURE(kBeforeUnloadBrowserResponseQueue);
+
 // When enabled, RenderFrameHostManager::CommitPending will also update the
 // visibility of all child views, not just that of the main frame.
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kNavigationUpdatesChildViewsVisibility);
@@ -28,7 +32,6 @@
 // IPC is sent to create all child frame proxies instead of sending one IPC per
 // proxy.
 BASE_DECLARE_FEATURE(kConsolidatedIPCForProxyCreation);
-
 // TODO(https://crbug.com/1442346): Feature flag to guard extra CHECKs put in
 // place to ensure that the AllowBindings API on RenderFrameHost is not called
 // for documents outside of WebUI ones.
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/font/AndroidFontLookupImplTest.java b/content/public/android/javatests/src/org/chromium/content/browser/font/AndroidFontLookupImplTest.java
index 3dc5518..5483ae6 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/font/AndroidFontLookupImplTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/font/AndroidFontLookupImplTest.java
@@ -46,9 +46,9 @@
 import org.mockito.Mock;
 import org.mockito.stubbing.OngoingStubbing;
 
-import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.test.BaseJUnit4ClassRunner;
 import org.chromium.base.test.util.CriteriaHelper;
+import org.chromium.base.test.util.HistogramWatcher;
 import org.chromium.blink.mojom.AndroidFontLookup;
 import org.chromium.blink.mojom.AndroidFontLookup.FetchAllFontFiles_Response;
 import org.chromium.blink.mojom.AndroidFontLookup.GetUniqueNameLookupTable_Response;
@@ -153,7 +153,10 @@
         whenFetchFontsWith(FONT_QUERY_2).thenReturn(result);
         whenFetchFontsWith(FONT_QUERY_3).thenReturn(result);
 
+        HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher(
+                AndroidFontLookupImpl.FETCH_ALL_FONT_FILES_HISTOGRAM);
         mAndroidFontLookup.fetchAllFontFiles(mFetchAllFontFilesCallback);
+        watcher.pollInstrumentationThreadUntilSatisfied();
 
         mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS);
         verify(mFetchAllFontFilesCallback, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL))
@@ -164,10 +167,6 @@
         assertNotNull(response.get(FULL_FONT_NAME_1));
         assertNotNull(response.get(FULL_FONT_NAME_2));
         assertNotNull(response.get(FULL_FONT_NAME_3));
-
-        assertEquals(1,
-                RecordHistogram.getHistogramTotalCountForTesting(
-                        AndroidFontLookupImpl.FETCH_ALL_FONT_FILES_HISTOGRAM));
     }
 
     @SmallTest
@@ -182,7 +181,10 @@
                 .thenReturn(new FontFamilyResult(
                         FontFamilyResult.STATUS_UNEXPECTED_DATA_PROVIDED, null));
 
+        HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher(
+                AndroidFontLookupImpl.FETCH_ALL_FONT_FILES_HISTOGRAM);
         mAndroidFontLookup.fetchAllFontFiles(mFetchAllFontFilesCallback);
+        watcher.pollInstrumentationThreadUntilSatisfied();
 
         mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS);
         verify(mFetchAllFontFilesCallback, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL))
@@ -193,10 +195,6 @@
         assertNotNull(response.get(FULL_FONT_NAME_1));
         assertNotNull(response.get(FULL_FONT_NAME_2));
 
-        assertEquals(1,
-                RecordHistogram.getHistogramTotalCountForTesting(
-                        AndroidFontLookupImpl.FETCH_ALL_FONT_FILES_HISTOGRAM));
-
         // Verify the font was removed from the lookup table.
         mAndroidFontLookup.getUniqueNameLookupTable(mGetUniqueNameLookupTableCallback);
         mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS);
@@ -210,7 +208,10 @@
         mAndroidFontLookup = new AndroidFontLookupImpl(
                 mMockContext, mMockFontsContractWrapper, ImmutableMap.of());
 
+        HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher(
+                AndroidFontLookupImpl.FETCH_ALL_FONT_FILES_HISTOGRAM);
         mAndroidFontLookup.fetchAllFontFiles(mFetchAllFontFilesCallback);
+        watcher.pollInstrumentationThreadUntilSatisfied();
 
         mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS);
         verify(mFetchAllFontFilesCallback, timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL))
@@ -250,16 +251,15 @@
     @SmallTest
     @Test
     public void testMatchLocalFontByUniqueName_UnsupportedFontName() {
+        HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher(
+                AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM);
         mAndroidFontLookup.matchLocalFontByUniqueName("baz", mMatchLocalFontByUniqueNameCallback);
+        watcher.pollInstrumentationThreadUntilSatisfied();
 
         mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS);
         verify(mMatchLocalFontByUniqueNameCallback,
                 timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL))
                 .call(isNull());
-
-        assertEquals(1,
-                RecordHistogram.getHistogramTotalCountForTesting(
-                        AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM));
     }
 
     @SmallTest
@@ -269,17 +269,16 @@
                 new FontFamilyResult(FontFamilyResult.STATUS_UNEXPECTED_DATA_PROVIDED, null);
         whenFetchFontsWith(FONT_QUERY_1).thenReturn(result);
 
+        HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher(
+                AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM);
         mAndroidFontLookup.matchLocalFontByUniqueName(
                 FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback);
+        watcher.pollInstrumentationThreadUntilSatisfied();
 
         mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS);
         verify(mMatchLocalFontByUniqueNameCallback,
                 timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL))
                 .call(isNull());
-
-        assertEquals(1,
-                RecordHistogram.getHistogramTotalCountForTesting(
-                        AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM));
     }
 
     @SmallTest
@@ -288,17 +287,16 @@
         FontFamilyResult result = new FontFamilyResult(FontFamilyResult.STATUS_OK, new FontInfo[0]);
         whenFetchFontsWith(FONT_QUERY_1).thenReturn(result);
 
+        HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher(
+                AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM);
         mAndroidFontLookup.matchLocalFontByUniqueName(
                 FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback);
+        watcher.pollInstrumentationThreadUntilSatisfied();
 
         mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS);
         verify(mMatchLocalFontByUniqueNameCallback,
                 timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL))
                 .call(isNull());
-
-        assertEquals(1,
-                RecordHistogram.getHistogramTotalCountForTesting(
-                        AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM));
     }
 
     @SmallTest
@@ -309,17 +307,16 @@
                 new FontFamilyResult(FontFamilyResult.STATUS_OK, new FontInfo[] {fontInfo});
         whenFetchFontsWith(FONT_QUERY_1).thenReturn(result);
 
+        HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher(
+                AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM);
         mAndroidFontLookup.matchLocalFontByUniqueName(
                 FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback);
+        watcher.pollInstrumentationThreadUntilSatisfied();
 
         mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS);
         verify(mMatchLocalFontByUniqueNameCallback,
                 timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL))
                 .call(isNull());
-
-        assertEquals(1,
-                RecordHistogram.getHistogramTotalCountForTesting(
-                        AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM));
     }
 
     @SmallTest
@@ -327,17 +324,16 @@
     public void testMatchLocalFontByUniqueName_Throws() throws NameNotFoundException {
         whenFetchFontsWith(FONT_QUERY_1).thenThrow(new NameNotFoundException());
 
+        HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher(
+                AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM);
         mAndroidFontLookup.matchLocalFontByUniqueName(
                 FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback);
+        watcher.pollInstrumentationThreadUntilSatisfied();
 
         mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS);
         verify(mMatchLocalFontByUniqueNameCallback,
                 timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL))
                 .call(isNull());
-
-        assertEquals(1,
-                RecordHistogram.getHistogramTotalCountForTesting(
-                        AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM));
     }
 
     @SmallTest
@@ -346,26 +342,30 @@
         // Request font and fail.
         whenFetchFontsWith(FONT_QUERY_1).thenThrow(new NameNotFoundException());
 
-        mAndroidFontLookup.matchLocalFontByUniqueName(
-                FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback);
-
+        {
+            HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher(
+                    AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM);
+            mAndroidFontLookup.matchLocalFontByUniqueName(
+                    FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback);
+            watcher.pollInstrumentationThreadUntilSatisfied();
+        }
         mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS);
         verify(mMatchLocalFontByUniqueNameCallback,
                 timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL))
                 .call(isNull());
 
         // Second request should early out with FAILED_AVOID_RETRY.
-        mAndroidFontLookup.matchLocalFontByUniqueName(
-                FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback);
-
+        {
+            HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher(
+                    AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM);
+            mAndroidFontLookup.matchLocalFontByUniqueName(
+                    FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback);
+            watcher.pollInstrumentationThreadUntilSatisfied();
+        }
         mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS);
         verify(mMatchLocalFontByUniqueNameCallback,
                 timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL).times(2))
                 .call(isNull());
-
-        assertEquals(2,
-                RecordHistogram.getHistogramTotalCountForTesting(
-                        AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM));
     }
 
     @SmallTest
@@ -376,17 +376,16 @@
                 new FontFamilyResult(FontFamilyResult.STATUS_OK, new FontInfo[] {fontInfo});
         whenFetchFontsWith(FONT_QUERY_1).thenReturn(result);
 
+        HistogramWatcher watcher = HistogramWatcher.newSingleRecordWatcher(
+                AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM);
         mAndroidFontLookup.matchLocalFontByUniqueName(
                 FULL_FONT_NAME_1, mMatchLocalFontByUniqueNameCallback);
+        watcher.pollInstrumentationThreadUntilSatisfied();
 
         mMojoTestRule.runLoop(RUN_LOOP_TIMEOUT_MS);
         verify(mMatchLocalFontByUniqueNameCallback,
                 timeout(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL))
                 .call(notNull());
-
-        assertEquals(1,
-                RecordHistogram.getHistogramTotalCountForTesting(
-                        AndroidFontLookupImpl.MATCH_LOCAL_FONT_BY_UNIQUE_NAME_HISTOGRAM));
     }
 
     private OngoingStubbing<FontFamilyResult> whenFetchFontsWith(String query)
diff --git a/content/public/browser/browser_task_traits.h b/content/public/browser/browser_task_traits.h
index aeae520..15f14fc6 100644
--- a/content/public/browser/browser_task_traits.h
+++ b/content/public/browser/browser_task_traits.h
@@ -35,6 +35,14 @@
   // Tasks processing ServiceWorker's storage control's response.
   // TODO(chikamune): Make this content-internal.
   kServiceWorkerStorageControlResponse,
+
+  // Task continuing navigation asynchronously after determining that no before
+  // unload handlers are registered in the unloading render.
+  // NOTE: This task type should not be used for other navigation-related tasks
+  // as they should be ordered w.r.t. IPC channel and the UI thread's default
+  // task runner. Reach out to navigation-dev@ before adding new usages.
+  kBeforeUnloadBrowserResponse,
+
 };
 
 class CONTENT_EXPORT BrowserTaskTraits {
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 02183fe..057ee7c6 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -735,7 +735,7 @@
              base::FEATURE_ENABLED_BY_DEFAULT);
 
 // When NavigationNetworkResponseQueue is enabled, the browser will schedule
-// some tasks related to navigation network responses in a kHighest priority
+// some tasks related to navigation network responses in a kHigh priority
 // queue.
 BASE_FEATURE(kNavigationNetworkResponseQueue,
              "NavigationNetworkResponseQueue",
@@ -1183,20 +1183,6 @@
              "SignedHTTPExchange",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-// Delays RenderProcessHost shutdown by a few seconds to allow the subframe's
-// process to be potentially reused. This aims to reduce process churn in
-// navigations where the source and destination share subframes.
-// This is enabled only on platforms where the behavior leads to performance
-// gains, i.e., those where process startup is expensive.
-BASE_FEATURE(kSubframeShutdownDelay,
-             "SubframeShutdownDelay",
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
-             base::FEATURE_ENABLED_BY_DEFAULT
-#else
-             base::FEATURE_DISABLED_BY_DEFAULT
-#endif  // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
-);
-
 // If enabled, GetUserMedia API will only work when the concerned tab is in
 // focus
 BASE_FEATURE(kUserMediaCaptureOnFocus,
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index ddb5fcb8..5353eaa5 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -290,7 +290,6 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kSpareRendererForSitePerProcess);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kStopVideoCaptureOnScreenLock);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kStrictOriginIsolation);
-CONTENT_EXPORT BASE_DECLARE_FEATURE(kSubframeShutdownDelay);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kSuppressDifferentOriginSubframeJSDialogs);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kSurfaceSyncFullscreenKillswitch);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kSyntheticPointerActions);
diff --git a/content/test/content_test_bundle_data.filelist b/content/test/content_test_bundle_data.filelist
index 7257ad1..46ce19d 100644
--- a/content/test/content_test_bundle_data.filelist
+++ b/content/test/content_test_bundle_data.filelist
@@ -4641,8 +4641,6 @@
 data/accessibility/html/wbr-expected-uia-win.txt
 data/accessibility/html/wbr-expected-win.txt
 data/accessibility/html/wbr.html
-data/accessibility/html/whitespace-dynamic-expected-blink.txt
-data/accessibility/html/whitespace-dynamic.html
 data/accessibility/html/window-crops-items-expected-blink.txt
 data/accessibility/html/window-crops-items.html
 data/accessibility/language-detection/dynamic-basic-expected-blink.txt
diff --git a/content/test/data/accessibility/html/whitespace-dynamic-expected-blink.txt b/content/test/data/accessibility/html/whitespace-dynamic-expected-blink.txt
deleted file mode 100644
index 35bf59f..0000000
--- a/content/test/data/accessibility/html/whitespace-dynamic-expected-blink.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-rootWebArea
-++genericContainer ignored
-++++genericContainer ignored
-++++++genericContainer name='Done'
-++++++paragraph ignored invisible
-++++++++staticText ignored invisible name='Should end up with a trailing whitespace '
-++++++++genericContainer ignored invisible
-++++++++++staticText ignored invisible name='link'
diff --git a/content/test/data/accessibility/html/whitespace-dynamic.html b/content/test/data/accessibility/html/whitespace-dynamic.html
deleted file mode 100644
index 299478af..0000000
--- a/content/test/data/accessibility/html/whitespace-dynamic.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!--
-@WAIT-FOR:Done
--->
-
-<!doctype HTML>
-<div tabindex="0" id="status" aria-label="Working"></div>
-<p id=p style="visibility:hidden">
-Should end up with a trailing whitespace 
-</p>
-<script>
-setTimeout(() => {
-  let a = document.createElement("a");
-  a.innerText = "link";
-  p.appendChild(a);
-  setTimeout(() => {
-    document.getElementById('status').setAttribute('aria-label', 'Done');
-  }, 0);
-}, 1000);
-</script>
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
index 5f0ea8b..d239bcf 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -451,30 +451,16 @@
 
 ## D3D9 / AMD RX 5500 XT / Passthrough command decoder ##
 
-# Skipping several recent flakes as the UPF incorrectly removed the suppressions.
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/misc/shader-with-256-character-define.html [ Skip ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/misc/shader-with-conditional-scoping-negative.html [ Skip ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/misc/shader-with-function-scoped-struct.html [ Skip ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/misc/shader-with-non-reserved-words-4-of-8.html [ Skip ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/misc/shader-with-non-reserved-words-5-of-8.html [ Skip ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/misc/shader-with-too-many-uniforms.html [ Skip ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/misc/uninitialized-local-global-variables.html [ Skip ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/glsl/samplers/glsl-function-texture2dprojlod.html [ Skip ]
+# Random GPU process hangs on this bot are causing random D3D9 test faiures. Retry
+# all tests for the moment so that the test suite can remain enabled on this bot.
+crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/* [ RetryOnFailure ]
+
 crbug.com/1159126 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/ogles/GL/* [ RetryOnFailure ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/reading/read-pixels-test.html [ Skip ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/rendering/default-texture-draw-bug.html [ Skip ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/rendering/gl-scissor-test.html [ Skip ]
 crbug.com/1159126 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/uniforms/* [ RetryOnFailure ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/textures/misc/texture-active-bind.html [ Skip ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/textures/misc/texture-draw-with-2d-and-cube.html [ Skip ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/textures/misc/texture-npot-video.html [ Skip ]
 crbug.com/1361088 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/textures/webgl_canvas/tex-2d-rgb-rgb-unsigned_byte.html [ Skip ]
 crbug.com/1361088 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/textures/webgl_canvas/tex-2d-rgba-rgba-unsigned_byte.html [ Skip ]
 crbug.com/1362937 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/uniforms/uniform-values-per-program.html [ Failure ]
 crbug.com/1362937 [ win amd-0x7340 angle-d3d9 passthrough ] conformance/uniforms/uniform-default-values.html [ Failure ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] deqp/data/gles2/shaders/constant_expressions.html [ Skip ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] deqp/data/gles2/shaders/conversions_scalar_to_scalar.html [ Skip ]
-crbug.com/1446091 [ win amd-0x7340 angle-d3d9 passthrough ] deqp/data/gles2/shaders/swizzles_bvec4.html [ Skip ]
 
 ## win10 / angle-d3d11 / Passthrough command decoder failures ##
 
diff --git a/device/BUILD.gn b/device/BUILD.gn
index bfe0aa3..99855ec 100644
--- a/device/BUILD.gn
+++ b/device/BUILD.gn
@@ -473,7 +473,7 @@
 
   android_library("bluetooth_test_java") {
     testonly = true
-    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+
     sources = bluetooth_java_sources_needing_jni
     deps = [
       "//base:base_java",
@@ -484,7 +484,10 @@
       "//third_party/androidx:androidx_annotation_annotation_java",
     ]
 
-    srcjar_deps = [ ":bluetooth_test_javagen" ]
+    srcjar_deps = [
+      ":bluetooth_test_javagen",
+      ":bluetooth_test_jni_headers",
+    ]
   }
 
   robolectric_binary("device_junit_tests") {
diff --git a/device/bluetooth/BUILD.gn b/device/bluetooth/BUILD.gn
index d075d1f..52940b9 100644
--- a/device/bluetooth/BUILD.gn
+++ b/device/bluetooth/BUILD.gn
@@ -682,6 +682,7 @@
   }
 
   android_library("java") {
+    srcjar_deps = [ ":jni_headers" ]
     sources = java_sources_needing_jni
     deps = [
       "//base:base_java",
@@ -690,6 +691,5 @@
       "//components/location/android:location_java",
       "//third_party/androidx:androidx_annotation_annotation_java",
     ]
-    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   }
 }
diff --git a/device/bluetooth/floss/bluetooth_socket_floss.cc b/device/bluetooth/floss/bluetooth_socket_floss.cc
index d8cd051b..a0437f9 100644
--- a/device/bluetooth/floss/bluetooth_socket_floss.cc
+++ b/device/bluetooth/floss/bluetooth_socket_floss.cc
@@ -214,11 +214,20 @@
 
   // We also always want to be accepting and queue up connections here to be
   // consumed when in the ready state.
-  if (state == FlossSocketManager::ServerSocketState::kReady) {
+  if (state == FlossSocketManager::ServerSocketState::kReady &&
+      status == FlossDBusClient::BtifStatus::kSuccess) {
     FlossDBusManager::Get()->GetSocketManager()->Accept(
         listening_socket_info_->id, absl::nullopt,
         base::BindOnce(&BluetoothSocketFloss::CompleteAccept,
                        weak_ptr_factory_.GetWeakPtr()));
+    return;
+  }
+
+  if (status != FlossDBusClient::BtifStatus::kSuccess && accept_request_) {
+    std::move(accept_request_->error_callback)
+        .Run(net::ErrorToString(net::ERR_CONNECTION_FAILED));
+    accept_request_.reset(nullptr);
+    return;
   }
 }
 
diff --git a/device/bluetooth/floss/bluetooth_socket_floss_unittest.cc b/device/bluetooth/floss/bluetooth_socket_floss_unittest.cc
index 516779f..3d133655 100644
--- a/device/bluetooth/floss/bluetooth_socket_floss_unittest.cc
+++ b/device/bluetooth/floss/bluetooth_socket_floss_unittest.cc
@@ -276,6 +276,33 @@
   client_socket = nullptr;
   ClearCounters();
 
+  // Accept a connection when there's nothing there and then receives connection
+  // failed.
+  {
+    base::RunLoop run_loop;
+    server_socket->Accept(
+        base::BindOnce(&BluetoothSocketFlossTest::AcceptSuccessCallback,
+                       weak_ptr_factory_.GetWeakPtr(),
+                       run_loop.QuitWhenIdleClosure()),
+        base::BindOnce(&BluetoothSocketFlossTest::ErrorCallback,
+                       weak_ptr_factory_.GetWeakPtr(),
+                       run_loop.QuitWhenIdleClosure()));
+    run_loop.RunUntilIdle();
+
+    // No sockets found to accept.
+    EXPECT_EQ(0, success_callback_count_);
+    EXPECT_EQ(0, error_callback_count_);
+
+    GetFakeFlossSocketManager()->SendSocketReady(
+        id, device::BluetoothUUID(FakeFlossSocketManager::kRfcommUuid),
+        FlossDBusClient::BtifStatus::kFail);
+
+    EXPECT_EQ(1, error_callback_count_);
+    EXPECT_EQ(0, success_callback_count_);
+    EXPECT_TRUE(last_socket_.get() == nullptr);
+    ClearCounters();
+  }
+
   // Accept a connection when there's nothing there and then send connection.
   {
     // First runloop will push the accept callbacks into socket.
diff --git a/device/bluetooth/floss/fake_floss_socket_manager.cc b/device/bluetooth/floss/fake_floss_socket_manager.cc
index 43f80854..62a81a4 100644
--- a/device/bluetooth/floss/fake_floss_socket_manager.cc
+++ b/device/bluetooth/floss/fake_floss_socket_manager.cc
@@ -220,8 +220,7 @@
     socket.uuid = uuid;
 
     auto& [state_changed, accepted] = listening_sockets_to_callbacks_[id];
-    state_changed.Run(ServerSocketState::kReady, std::move(socket),
-                      BtifStatus::kSuccess);
+    state_changed.Run(ServerSocketState::kReady, std::move(socket), status);
   }
 }
 
diff --git a/device/bluetooth/floss/floss_adapter_client.cc b/device/bluetooth/floss/floss_adapter_client.cc
index 51bf9fa..e59af23 100644
--- a/device/bluetooth/floss/floss_adapter_client.cc
+++ b/device/bluetooth/floss/floss_adapter_client.cc
@@ -10,6 +10,7 @@
 #include "base/functional/callback.h"
 #include "base/logging.h"
 #include "base/observer_list.h"
+#include "base/strings/string_number_conversions.h"
 #include "dbus/bus.h"
 #include "dbus/exported_object.h"
 #include "dbus/message.h"
@@ -34,6 +35,7 @@
     "org.chromium.Error.UnknownAdapter";
 constexpr char FlossAdapterClient::kExportedCallbacksPath[] =
     "/org/chromium/bluetooth/adapterclient";
+static uint32_t callback_path_index_ = 0;
 
 void FlossAdapterClient::SetName(ResponseCallback<Void> callback,
                                  const std::string& name) {
@@ -204,6 +206,9 @@
   bus_ = bus;
   adapter_path_ = GenerateAdapterPath(adapter_index);
   service_name_ = service_name;
+  exported_callback_path_ =
+      kExportedCallbacksPath + base::NumberToString(callback_path_index_);
+  callback_path_index_++;
 
   dbus::ObjectProxy* object_proxy =
       bus_->GetObjectProxy(service_name_, adapter_path_);
@@ -213,7 +218,7 @@
   }
 
   dbus::ExportedObject* callbacks =
-      bus_->GetExportedObject(dbus::ObjectPath(kExportedCallbacksPath));
+      bus_->GetExportedObject(dbus::ObjectPath(exported_callback_path_));
   if (!callbacks) {
     LOG(ERROR) << "FlossAdapterClient couldn't export client callbacks";
     return;
@@ -300,18 +305,18 @@
 
   property_address_.Init(
       this, bus_, service_name_, adapter_path_,
-      dbus::ObjectPath(kExportedCallbacksPath),
+      dbus::ObjectPath(exported_callback_path_),
       base::BindRepeating(&FlossAdapterClient::OnAddressChanged,
                           weak_ptr_factory_.GetWeakPtr()));
 
   property_name_.Init(this, bus_, service_name_, adapter_path_,
-                      dbus::ObjectPath(kExportedCallbacksPath),
+                      dbus::ObjectPath(exported_callback_path_),
                       base::BindRepeating(&FlossAdapterClient::OnNameChanged,
                                           weak_ptr_factory_.GetWeakPtr()));
 
   property_discoverable_.Init(
       this, bus_, service_name_, adapter_path_,
-      dbus::ObjectPath(kExportedCallbacksPath),
+      dbus::ObjectPath(exported_callback_path_),
       base::BindRepeating(&FlossAdapterClient::OnDiscoverableChanged,
                           weak_ptr_factory_.GetWeakPtr()));
 
@@ -322,13 +327,13 @@
   CallAdapterMethod<Void>(
       base::BindOnce(&FlossAdapterClient::OnRegisterCallbacks,
                      weak_ptr_factory_.GetWeakPtr()),
-      adapter::kRegisterCallback, dbus::ObjectPath(kExportedCallbacksPath));
+      adapter::kRegisterCallback, dbus::ObjectPath(exported_callback_path_));
 
   CallAdapterMethod<Void>(
       base::BindOnce(&FlossAdapterClient::OnRegisterCallbacks,
                      weak_ptr_factory_.GetWeakPtr()),
       adapter::kRegisterConnectionCallback,
-      dbus::ObjectPath(kExportedCallbacksPath));
+      dbus::ObjectPath(exported_callback_path_));
 
   on_ready_ = std::move(on_ready);
 }
@@ -699,7 +704,7 @@
 FlossAdapterClient::FlossAdapterClient() = default;
 FlossAdapterClient::~FlossAdapterClient() {
   if (bus_) {
-    bus_->UnregisterExportedObject(dbus::ObjectPath(kExportedCallbacksPath));
+    bus_->UnregisterExportedObject(dbus::ObjectPath(exported_callback_path_));
   }
 }
 
diff --git a/device/bluetooth/floss/floss_adapter_client.h b/device/bluetooth/floss/floss_adapter_client.h
index 3603804c..62d4dd7 100644
--- a/device/bluetooth/floss/floss_adapter_client.h
+++ b/device/bluetooth/floss/floss_adapter_client.h
@@ -414,6 +414,9 @@
   // Service which implements the adapter interface.
   std::string service_name_;
 
+  // Object path for exported callbacks registered to this client.
+  std::string exported_callback_path_;
+
   // Cached discoverable timeout value (updates on init and on discoverable
   // state changes).
   uint32_t discoverable_timeout_ = 0;
diff --git a/device/fido/features.cc b/device/fido/features.cc
index af5669d2..b7a844d 100644
--- a/device/fido/features.cc
+++ b/device/fido/features.cc
@@ -98,4 +98,9 @@
              "WebAuthenticationPrelinkPlayServices",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+// Enabled in M116. Remove in or after M119.
+BASE_FEATURE(kWebAuthnSkipSingleAccountMacOS,
+             "WebAuthenticationSkipSingleAccountMacOS",
+             base::FEATURE_ENABLED_BY_DEFAULT);
+
 }  // namespace device
diff --git a/device/fido/features.h b/device/fido/features.h
index 0bbcf56..2f17d50 100644
--- a/device/fido/features.h
+++ b/device/fido/features.h
@@ -74,6 +74,10 @@
 COMPONENT_EXPORT(DEVICE_FIDO)
 BASE_DECLARE_FEATURE(kWebAuthnPrelinkPlayServices);
 
+// Don't show the single-account sheet on macOS if Touch ID is available.
+COMPONENT_EXPORT(DEVICE_FIDO)
+BASE_DECLARE_FEATURE(kWebAuthnSkipSingleAccountMacOS);
+
 }  // namespace device
 
 #endif  // DEVICE_FIDO_FEATURES_H_
diff --git a/device/fido/mac/util.h b/device/fido/mac/util.h
index bdd1c53..c2358ae 100644
--- a/device/fido/mac/util.h
+++ b/device/fido/mac/util.h
@@ -69,6 +69,7 @@
 // to whether the device supports Touch ID, and whether the sensor is ready to
 // be used (i.e. not soft-locked from consecutive bad attempts; laptop lid not
 // closed).
+COMPONENT_EXPORT(DEVICE_FIDO)
 bool DeviceHasBiometricsAvailable();
 
 }  // namespace device::fido::mac
diff --git a/device/vr/BUILD.gn b/device/vr/BUILD.gn
index e698f6fd..7a929a6a 100644
--- a/device/vr/BUILD.gn
+++ b/device/vr/BUILD.gn
@@ -384,6 +384,7 @@
   }
 
   android_library("java") {
+    srcjar_deps = [ ":jni_headers" ]
     sources = java_sources_needing_jni
     deps = [
       "//base:base_java",
@@ -392,6 +393,5 @@
       "//third_party/gvr-android-sdk:gvr_common_java",
       "//ui/android:ui_java",
     ]
-    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   }
 }
diff --git a/extensions/common/feature_switch.h b/extensions/common/feature_switch.h
index e18177e..17b2018 100644
--- a/extensions/common/feature_switch.h
+++ b/extensions/common/feature_switch.h
@@ -83,7 +83,8 @@
   std::string GetLegacyDisableFlag() const;
   bool ComputeValue() const;
 
-  raw_ptr<const base::CommandLine> command_line_;
+  // TODO(crbug.com/1449286): detect under BRP.
+  raw_ptr<const base::CommandLine, DanglingUntriaged> command_line_;
   const char* switch_name_;
   bool default_value_;
   OverrideValue override_value_;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index a43dcc1f..601ca6f 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -313,24 +313,6 @@
   GLenum target_;
 };
 
-// Temporarily changes a decoder's bound render buffer and restore it when this
-// object goes out of scope.
-class ScopedRenderBufferBinder {
- public:
-  explicit ScopedRenderBufferBinder(ContextState* state,
-                                    ErrorState* error_state,
-                                    GLuint id);
-
-  ScopedRenderBufferBinder(const ScopedRenderBufferBinder&) = delete;
-  ScopedRenderBufferBinder& operator=(const ScopedRenderBufferBinder&) = delete;
-
-  ~ScopedRenderBufferBinder();
-
- private:
-  raw_ptr<ContextState> state_;
-  raw_ptr<ErrorState> error_state_;
-};
-
 // Temporarily changes a decoder's bound frame buffer and restore it when this
 // object goes out of scope.
 class ScopedFramebufferBinder {
@@ -437,43 +419,6 @@
   scoped_refptr<TextureRef> texture_ref_;
 };
 
-// Encapsulates an OpenGL render buffer of any format.
-class BackRenderbuffer {
- public:
-  explicit BackRenderbuffer(GLES2DecoderImpl* decoder);
-
-  BackRenderbuffer(const BackRenderbuffer&) = delete;
-  BackRenderbuffer& operator=(const BackRenderbuffer&) = delete;
-
-  ~BackRenderbuffer();
-
-  // Create a new render buffer.
-  void Create();
-
-  // Set the initial size and format of a render buffer or resize it.
-  bool AllocateStorage(const gfx::Size& size, GLenum format);
-
-  // Destroy the render buffer. This must be explicitly called before destroying
-  // this object.
-  void Destroy();
-
-  // Invalidate the render buffer. This can be used when a context is lost and
-  // it is not possible to make it current in order to free the resource.
-  void Invalidate();
-
-  GLuint id() const {
-    return id_;
-  }
-
-  gl::GLApi* api() const;
-
- private:
-  raw_ptr<GLES2DecoderImpl> decoder_;
-  MemoryTypeTracker memory_tracker_;
-  size_t bytes_allocated_;
-  GLuint id_;
-};
-
 // Encapsulates an OpenGL frame buffer.
 class BackFramebuffer {
  public:
@@ -490,10 +435,6 @@
   // Attach a color render buffer to a frame buffer.
   void AttachRenderTexture(BackTexture* texture);
 
-  // Attach a render buffer to a frame buffer. Note that this unbinds any
-  // currently bound frame buffer.
-  void AttachRenderBuffer(GLenum target, BackRenderbuffer* render_buffer);
-
   // Destroy the frame buffer. This must be explicitly called before destroying
   // this object.
   void Destroy();
@@ -815,7 +756,6 @@
   friend class ScopedResolvedFramebufferBinder;
   friend class ScopedFramebufferCopyBinder;
   friend class BackFramebuffer;
-  friend class BackRenderbuffer;
   friend class BackTexture;
 
   enum FramebufferOperation {
@@ -2562,14 +2502,9 @@
   // The size of fiixed attrib buffer.
   GLsizei fixed_attrib_buffer_size_;
 
-  // The offscreen frame buffer that the client renders to. With EGL, the
-  // depth and stencil buffers are separate. With regular GL there is a single
-  // packed depth stencil buffer in offscreen_target_depth_render_buffer_.
-  // offscreen_target_stencil_render_buffer_ is unused.
+  // The offscreen frame buffer that the client renders to.
   std::unique_ptr<BackFramebuffer> offscreen_target_frame_buffer_;
   std::unique_ptr<BackTexture> offscreen_target_color_texture_;
-  std::unique_ptr<BackRenderbuffer> offscreen_target_depth_render_buffer_;
-  std::unique_ptr<BackRenderbuffer> offscreen_target_stencil_render_buffer_;
 
   std::unique_ptr<GLES2ExternalFramebuffer> external_default_framebuffer_;
 
@@ -2577,9 +2512,6 @@
   // framebuffer.
   GLenum offscreen_target_color_format_;
 
-  GLenum offscreen_target_depth_format_;
-  GLenum offscreen_target_stencil_format_;
-
   GLint max_offscreen_framebuffer_size_;
 
   // Whether the client requested an offscreen buffer with an alpha channel.
@@ -2797,21 +2729,6 @@
   state_->RestoreActiveTexture();
 }
 
-ScopedRenderBufferBinder::ScopedRenderBufferBinder(ContextState* state,
-                                                   ErrorState* error_state,
-                                                   GLuint id)
-    : state_(state), error_state_(error_state) {
-  ScopedGLErrorSuppressor suppressor("ScopedRenderBufferBinder::ctor",
-                                     error_state_);
-  state->api()->glBindRenderbufferEXTFn(GL_RENDERBUFFER, id);
-}
-
-ScopedRenderBufferBinder::~ScopedRenderBufferBinder() {
-  ScopedGLErrorSuppressor suppressor("ScopedRenderBufferBinder::dtor",
-                                     error_state_);
-  state_->RestoreRenderbufferBindings();
-}
-
 ScopedFramebufferBinder::ScopedFramebufferBinder(GLES2DecoderImpl* decoder,
                                                  GLuint id)
     : decoder_(decoder) {
@@ -3006,102 +2923,6 @@
   return GL_TEXTURE_2D;
 }
 
-BackRenderbuffer::BackRenderbuffer(GLES2DecoderImpl* decoder)
-    : decoder_(decoder),
-      memory_tracker_(decoder->memory_tracker()),
-      bytes_allocated_(0),
-      id_(0) {}
-
-BackRenderbuffer::~BackRenderbuffer() {
-  // This does not destroy the render buffer because that would require that
-  // the associated GL context was current. Just check that it was explicitly
-  // destroyed.
-  DCHECK_EQ(id_, 0u);
-}
-
-inline gl::GLApi* BackRenderbuffer::api() const {
-  return decoder_->api();
-}
-
-void BackRenderbuffer::Create() {
-  ScopedGLErrorSuppressor suppressor("BackRenderbuffer::Create",
-                                     decoder_->error_state_.get());
-  Destroy();
-  api()->glGenRenderbuffersEXTFn(1, &id_);
-}
-
-bool BackRenderbuffer::AllocateStorage(const gfx::Size& size, GLenum format) {
-  ScopedGLErrorSuppressor suppressor("BackRenderbuffer::AllocateStorage",
-                                     decoder_->error_state_.get());
-  ScopedRenderBufferBinder binder(&decoder_->state_,
-                                  decoder_->error_state_.get(), id_);
-
-  uint32_t estimated_size = 0;
-  if (!decoder_->renderbuffer_manager()->ComputeEstimatedRenderbufferSize(
-          size.width(), size.height(), /*samples=*/0, format,
-          &estimated_size)) {
-    return false;
-  }
-
-  // TODO(kainino): This path will not perform RegenerateRenderbufferIfNeeded on
-  // devices where multisample_renderbuffer_resize_emulation or
-  // depth_stencil_renderbuffer_resize_emulation is needed.  Thus any code using
-  // this path (nacl/ppapi?) could encounter issues on those
-  // devices. RenderbufferStorageMultisampleWithWorkaround should be used
-  // instead, but can only be used if BackRenderbuffer tracks its renderbuffers
-  // in the renderbuffer manager instead of manually.  http://crbug.com/731287
-  decoder_->RenderbufferStorageMultisampleHelper(GL_RENDERBUFFER, /*samples=*/0,
-                                                 format, size.width(),
-                                                 size.height(), kDoNotForce);
-
-  bool alpha_channel_needs_clear =
-      (format == GL_RGBA || format == GL_RGBA8) &&
-      !decoder_->offscreen_buffer_should_have_alpha_;
-  if (alpha_channel_needs_clear) {
-    GLuint fbo;
-    api()->glGenFramebuffersEXTFn(1, &fbo);
-    {
-      ScopedFramebufferBinder frame_binder(decoder_, fbo);
-      api()->glFramebufferRenderbufferEXTFn(
-          GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, id_);
-      api()->glClearColorFn(0, 0, 0, decoder_->BackBufferAlphaClearColor());
-      decoder_->state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
-      decoder_->state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false);
-      decoder_->ClearDeviceWindowRectangles();
-      api()->glClearFn(GL_COLOR_BUFFER_BIT);
-      decoder_->RestoreClearState();
-    }
-    api()->glDeleteFramebuffersEXTFn(1, &fbo);
-  }
-
-  bool success = api()->glGetErrorFn() == GL_NO_ERROR;
-  if (success) {
-    // Mark the previously allocated bytes as free.
-    memory_tracker_.TrackMemFree(bytes_allocated_);
-    bytes_allocated_ = estimated_size;
-    // Track the newly allocated bytes.
-    memory_tracker_.TrackMemAlloc(bytes_allocated_);
-  }
-  return success;
-}
-
-void BackRenderbuffer::Destroy() {
-  if (id_ != 0) {
-    ScopedGLErrorSuppressor suppressor("BackRenderbuffer::Destroy",
-                                       decoder_->error_state_.get());
-    api()->glDeleteRenderbuffersEXTFn(1, &id_);
-    id_ = 0;
-  }
-  memory_tracker_.TrackMemFree(bytes_allocated_);
-  bytes_allocated_ = 0;
-}
-
-void BackRenderbuffer::Invalidate() {
-  id_ = 0;
-  memory_tracker_.TrackMemFree(bytes_allocated_);
-  bytes_allocated_ = 0;
-}
-
 BackFramebuffer::BackFramebuffer(GLES2DecoderImpl* decoder)
     : decoder_(decoder),
       id_(0) {
@@ -3135,17 +2956,6 @@
                                      texture->Target(), attach_id, 0);
 }
 
-void BackFramebuffer::AttachRenderBuffer(GLenum target,
-                                         BackRenderbuffer* render_buffer) {
-  DCHECK_NE(id_, 0u);
-  ScopedGLErrorSuppressor suppressor("BackFramebuffer::AttachRenderBuffer",
-                                     decoder_->error_state_.get());
-  ScopedFramebufferBinder binder(decoder_, id_);
-  GLuint attach_id = render_buffer ? render_buffer->id() : 0;
-  api()->glFramebufferRenderbufferEXTFn(GL_FRAMEBUFFER, target, GL_RENDERBUFFER,
-                                        attach_id);
-}
-
 void BackFramebuffer::Destroy() {
   if (id_ != 0) {
     ScopedGLErrorSuppressor suppressor("BackFramebuffer::Destroy",
@@ -3206,8 +3016,6 @@
       fixed_attrib_buffer_id_(0),
       fixed_attrib_buffer_size_(0),
       offscreen_target_color_format_(0),
-      offscreen_target_depth_format_(0),
-      offscreen_target_stencil_format_(0),
       max_offscreen_framebuffer_size_(0),
       offscreen_buffer_should_have_alpha_(false),
       back_buffer_color_format_(0),
@@ -3464,40 +3272,10 @@
 #else
     offscreen_buffer_should_have_alpha_ = false;
 #endif
-    if (gl_version_info().is_es) {
-      offscreen_target_color_format_ =
-          offscreen_buffer_should_have_alpha_ ||
-                  workarounds().disable_gl_rgb_format
-              ? GL_RGBA
-              : GL_RGB;
-
-      // ANGLE only supports packed depth/stencil formats, so use it if it is
-      // available.
-      const bool depth24_stencil8_supported =
-          feature_info_->feature_flags().packed_depth24_stencil8;
-      VLOG(1) << "GL_OES_packed_depth_stencil "
-              << (depth24_stencil8_supported ? "" : "not ") << "supported.";
-
-      offscreen_target_depth_format_ = 0;
-      offscreen_target_stencil_format_ = 0;
-    } else {
-      offscreen_target_color_format_ =
-          offscreen_buffer_should_have_alpha_ ||
-                  workarounds().disable_gl_rgb_format
-              ? GL_RGBA
-              : GL_RGB;
-
-      // If depth is requested at all, use the packed depth stencil format if
-      // it's available, as some desktop GL drivers don't support any non-packed
-      // formats for depth attachments.
-      const bool depth24_stencil8_supported =
-          feature_info_->feature_flags().packed_depth24_stencil8;
-      VLOG(1) << "GL_EXT_packed_depth_stencil "
-              << (depth24_stencil8_supported ? "" : "not ") << "supported.";
-
-      offscreen_target_depth_format_ = 0;
-      offscreen_target_stencil_format_ = 0;
-    }
+    offscreen_target_color_format_ = offscreen_buffer_should_have_alpha_ ||
+                                             workarounds().disable_gl_rgb_format
+                                         ? GL_RGBA
+                                         : GL_RGB;
 
     max_offscreen_framebuffer_size_ =
         std::min(renderbuffer_manager()->max_renderbuffer_size(),
@@ -3621,12 +3399,6 @@
     offscreen_target_frame_buffer_->Create();
     offscreen_target_color_texture_ = std::make_unique<BackTexture>(this);
     offscreen_target_color_texture_->Create();
-    offscreen_target_depth_render_buffer_ =
-        std::make_unique<BackRenderbuffer>(this);
-    offscreen_target_depth_render_buffer_->Create();
-    offscreen_target_stencil_render_buffer_ =
-        std::make_unique<BackRenderbuffer>(this);
-    offscreen_target_stencil_render_buffer_->Create();
 
     // Allocate the render buffers at their initial size and check the status
     // of the frame buffers is okay.
@@ -4805,7 +4577,7 @@
       return external_default_framebuffer_->GetDepthFormat();
     }
     if (offscreen_target_frame_buffer_.get()) {
-      return offscreen_target_depth_format_;
+      return 0;
     }
     if (back_buffer_has_depth_)
       return GL_DEPTH;
@@ -4826,7 +4598,7 @@
       return external_default_framebuffer_->GetStencilFormat();
     }
     if (offscreen_target_frame_buffer_.get()) {
-      return offscreen_target_stencil_format_;
+      return 0;
     }
     if (back_buffer_has_stencil_)
       return GL_STENCIL;
@@ -4990,19 +4762,11 @@
       offscreen_target_frame_buffer_->Destroy();
     if (offscreen_target_color_texture_.get())
       offscreen_target_color_texture_->Destroy();
-    if (offscreen_target_depth_render_buffer_.get())
-      offscreen_target_depth_render_buffer_->Destroy();
-    if (offscreen_target_stencil_render_buffer_.get())
-      offscreen_target_stencil_render_buffer_->Destroy();
   } else {
     if (offscreen_target_frame_buffer_.get())
       offscreen_target_frame_buffer_->Invalidate();
     if (offscreen_target_color_texture_.get())
       offscreen_target_color_texture_->Invalidate();
-    if (offscreen_target_depth_render_buffer_.get())
-      offscreen_target_depth_render_buffer_->Invalidate();
-    if (offscreen_target_stencil_render_buffer_.get())
-      offscreen_target_stencil_render_buffer_->Invalidate();
     for (auto& fence : deschedule_until_finished_fences_) {
       fence->Invalidate();
     }
@@ -5086,8 +4850,6 @@
 
   offscreen_target_frame_buffer_.reset();
   offscreen_target_color_texture_.reset();
-  offscreen_target_depth_render_buffer_.reset();
-  offscreen_target_stencil_render_buffer_.reset();
 
   // Release all fences now, because some fence types need the context to be
   // current on destruction.
@@ -5231,40 +4993,10 @@
                << "to allocate storage for offscreen target color texture.";
     return false;
   }
-  if (offscreen_target_depth_format_ &&
-      !offscreen_target_depth_render_buffer_->AllocateStorage(
-          offscreen_size_, offscreen_target_depth_format_)) {
-    LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFramebuffer failed "
-               << "to allocate storage for offscreen target depth buffer.";
-    return false;
-  }
-  if (offscreen_target_stencil_format_ &&
-      !offscreen_target_stencil_render_buffer_->AllocateStorage(
-          offscreen_size_, offscreen_target_stencil_format_)) {
-    LOG(ERROR) << "GLES2DecoderImpl::ResizeOffscreenFramebuffer failed "
-               << "to allocate storage for offscreen target stencil buffer.";
-    return false;
-  }
 
   // Attach the offscreen target buffers to the target frame buffer.
   offscreen_target_frame_buffer_->AttachRenderTexture(
       offscreen_target_color_texture_.get());
-  if (offscreen_target_depth_format_) {
-    offscreen_target_frame_buffer_->AttachRenderBuffer(
-        GL_DEPTH_ATTACHMENT,
-        offscreen_target_depth_render_buffer_.get());
-  }
-  const bool packed_depth_stencil =
-      offscreen_target_depth_format_ == GL_DEPTH24_STENCIL8;
-  if (packed_depth_stencil) {
-    offscreen_target_frame_buffer_->AttachRenderBuffer(
-        GL_STENCIL_ATTACHMENT,
-        offscreen_target_depth_render_buffer_.get());
-  } else if (offscreen_target_stencil_format_) {
-    offscreen_target_frame_buffer_->AttachRenderBuffer(
-        GL_STENCIL_ATTACHMENT,
-        offscreen_target_stencil_render_buffer_.get());
-  }
 
   if (offscreen_target_frame_buffer_->CheckStatus() !=
       GL_FRAMEBUFFER_COMPLETE) {
@@ -5699,7 +5431,7 @@
     return external_default_framebuffer_->HasDepth();
   }
   if (offscreen_target_frame_buffer_.get()) {
-    return offscreen_target_depth_format_ != 0;
+    return false;
   }
   return back_buffer_has_depth_;
 }
@@ -5714,8 +5446,7 @@
     return external_default_framebuffer_->HasStencil();
   }
   if (offscreen_target_frame_buffer_.get()) {
-    return offscreen_target_stencil_format_ != 0 ||
-           offscreen_target_depth_format_ == GL_DEPTH24_STENCIL8;
+    return false;
   }
   return back_buffer_has_stencil_;
 }
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index a0e344af..cf4ff4f 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -8332,7 +8332,7 @@
       dimensions: "cores:8"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:high"
-      dimensions: "os:Ubuntu-18.04"
+      dimensions: "os:Ubuntu-22.04"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:0"
       exe {
diff --git a/infra/config/lib/linux-default.json b/infra/config/lib/linux-default.json
index 5c24624..cb88e832 100644
--- a/infra/config/lib/linux-default.json
+++ b/infra/config/lib/linux-default.json
@@ -68,6 +68,7 @@
     "Dawn Win10 x86 Release (NVIDIA)": "Ubuntu-22.04",
     "Deterministic Android": "Ubuntu-22.04",
     "Deterministic Android (dbg)": "Ubuntu-22.04",
+    "Deterministic Fuchsia (dbg)": "Ubuntu-22.04",
     "Deterministic Linux": "Ubuntu-22.04",
     "Deterministic Linux (dbg)": "Ubuntu-22.04",
     "GPU FYI Android arm Builder": "Ubuntu-22.04",
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 6bca8a3c..eeed588 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -1338,6 +1338,11 @@
     {"shopping-list", commerce::flag_descriptions::kShoppingListName,
      commerce::flag_descriptions::kShoppingListDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(commerce::kShoppingList)},
+    {"shopping-list-track-by-default",
+     commerce::flag_descriptions::kShoppingListTrackByDefaultName,
+     commerce::flag_descriptions::kShoppingListTrackByDefaultDescription,
+     flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(commerce::kShoppingListTrackByDefault)},
     {"local-pdp-detection",
      commerce::flag_descriptions::kCommerceLocalPDPDetectionName,
      commerce::flag_descriptions::kCommerceLocalPDPDetectionDescription,
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
index b147729..05213a2 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-4e183621aef1d69bfbbc8e8ee6fcce894abbd21b
\ No newline at end of file
+aceb6b8bcd834c9f1a4eb5f563950ada7a3c00fa
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
index da5a13e..8c00a8f 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-4dd3f4f38deeee69863d8c8bf925900122d22655
\ No newline at end of file
+8a1bdaa0f9009e25cf50c89f151a1f0728b4079f
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 21af408..ccde5c6 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-6dbf4ce31ef69cba81d62cd1fe4a0e35a4a7c9f2
\ No newline at end of file
+c1aa3882c348f21e34915dcbb43b9f681d28a61b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index 425ba3b..4dabbe0 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-1170bb515efa06464c5fe912b504c240c51e4352
\ No newline at end of file
+3cb90689fd698015e72ad7ade7cc080f34edc3ce
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index 9fab454..215100fb 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-b176785bbae9c11e0ba069f571a68e956984dd95
\ No newline at end of file
+c751ff58179eef4fd0403e881c1ccc3a828ef174
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index e0e9cf2..30f6b4a 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-e8d416c8afea6d257ef1c852067757d18441b2d7
\ No newline at end of file
+077194dcc3ee8f9b9d86234c93dac43bc115fec8
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
index 08ce54a5..24ab6591 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-deea15a31dfc629c977aef51f612a5afb0e9604d
\ No newline at end of file
+09072d7ae60419082c7551852c7e08751f60c37a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
index 6c9c213..6ad939cc 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-1028d583855ca5cf15d2c24d036aab3e04f0442f
\ No newline at end of file
+75f5afb5c4c5ac984ce9fe5dba28891fec2380b5
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index c55c2fa..183ba53 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-84accfe866937cf0d68ec859a2bb096d4e233427
\ No newline at end of file
+9d730aca7a9528da71ee0ed1444f4765a530876a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index 0703be0..04dcdc4 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-99cf5c91aabfedea4e2475a8382d10036b694c35
\ No newline at end of file
+e4e8106ffee7bbdaf11339ad69e0ee37e9a32cfd
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index 2bf6b72..ccc6541 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-4172beb5356cf2a07e977ed624734d0646991269
\ No newline at end of file
+42f3e81df48d98726727e8fe87223b9a7d1f78e3
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index 058adae1..c99a947 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-e1ea32b8932b82110363c2c3aa61ddbcd1e98e9c
\ No newline at end of file
+080e71a8a99cd99a3d7f9cc5f3b37f41100b0cd4
\ No newline at end of file
diff --git a/media/cast/encoding/av1_encoder.cc b/media/cast/encoding/av1_encoder.cc
index 9b82a3e..a51af55 100644
--- a/media/cast/encoding/av1_encoder.cc
+++ b/media/cast/encoding/av1_encoder.cc
@@ -196,11 +196,11 @@
   DCHECK_EQ(result, &aom_image);
 
   aom_image.planes[AOM_PLANE_Y] =
-      video_frame->GetWritableVisibleData(VideoFrame::kYPlane);
+      const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kYPlane));
   aom_image.planes[AOM_PLANE_U] =
-      video_frame->GetWritableVisibleData(VideoFrame::kUPlane);
+      const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kUPlane));
   aom_image.planes[AOM_PLANE_V] =
-      video_frame->GetWritableVisibleData(VideoFrame::kVPlane);
+      const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kVPlane));
   aom_image.stride[AOM_PLANE_Y] = video_frame->stride(VideoFrame::kYPlane);
   aom_image.stride[AOM_PLANE_U] = video_frame->stride(VideoFrame::kUPlane);
   aom_image.stride[AOM_PLANE_V] = video_frame->stride(VideoFrame::kVPlane);
diff --git a/media/cast/encoding/vpx_encoder.cc b/media/cast/encoding/vpx_encoder.cc
index 356fb83..281e0a43 100644
--- a/media/cast/encoding/vpx_encoder.cc
+++ b/media/cast/encoding/vpx_encoder.cc
@@ -220,22 +220,22 @@
   switch (vpx_format) {
     case VPX_IMG_FMT_I420:
       vpx_image.planes[VPX_PLANE_Y] =
-          video_frame->GetWritableVisibleData(VideoFrame::kYPlane);
+          const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kYPlane));
       vpx_image.planes[VPX_PLANE_U] =
-          video_frame->GetWritableVisibleData(VideoFrame::kUPlane);
+          const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kUPlane));
       vpx_image.planes[VPX_PLANE_V] =
-          video_frame->GetWritableVisibleData(VideoFrame::kVPlane);
+          const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kVPlane));
       vpx_image.stride[VPX_PLANE_Y] = video_frame->stride(VideoFrame::kYPlane);
       vpx_image.stride[VPX_PLANE_U] = video_frame->stride(VideoFrame::kUPlane);
       vpx_image.stride[VPX_PLANE_V] = video_frame->stride(VideoFrame::kVPlane);
       break;
     case VPX_IMG_FMT_NV12:
       vpx_image.planes[VPX_PLANE_Y] =
-          video_frame->GetWritableVisibleData(VideoFrame::kYPlane);
+          const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kYPlane));
       // In libvpx, the UV plane of NV12 frames is represented by two planes
       // with the same stride, shifted by one byte.
       vpx_image.planes[VPX_PLANE_U] =
-          video_frame->GetWritableVisibleData(VideoFrame::kUVPlane);
+          const_cast<uint8_t*>(video_frame->visible_data(VideoFrame::kUVPlane));
       vpx_image.planes[VPX_PLANE_V] = vpx_image.planes[VPX_PLANE_U] + 1;
       vpx_image.stride[VPX_PLANE_Y] = video_frame->stride(VideoFrame::kYPlane);
       vpx_image.stride[VPX_PLANE_U] = video_frame->stride(VideoFrame::kUVPlane);
diff --git a/media/gpu/v4l2/BUILD.gn b/media/gpu/v4l2/BUILD.gn
index d883031..24fa563 100644
--- a/media/gpu/v4l2/BUILD.gn
+++ b/media/gpu/v4l2/BUILD.gn
@@ -215,3 +215,18 @@
     "//testing/gtest",
   ]
 }
+
+if (is_chromeos && (current_cpu == "arm" || current_cpu == "arm64")) {
+  test("mt21_unittest") {
+    testonly = true
+    sources = [
+      "mt21/mt21_util.h",
+      "mt21/mt21_util_unittest.cc",
+    ]
+    deps = [
+      "//base:base",
+      "//base/test:test_support",
+      "//testing/gtest",
+    ]
+  }
+}
diff --git a/media/gpu/v4l2/mt21/mt21_util.h b/media/gpu/v4l2/mt21/mt21_util.h
new file mode 100644
index 0000000..71c96ca
--- /dev/null
+++ b/media/gpu/v4l2/mt21/mt21_util.h
@@ -0,0 +1,1109 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_GPU_V4L2_MT21_MT21_UTIL_H_
+#define MEDIA_GPU_V4L2_MT21_MT21_UTIL_H_
+
+// High performance implementation of the MT21 decompression algorithm. It is
+// recommended reading the unoptimized implementation here before diving into
+// this
+// https://source.chromium.org/chromiumos/_/chromium/chromiumos/platform/drm-tests/+/94106a2845911104895c50aa5d70c6e5fc8972fc:pixel_formats/mt21_converter.c;drc=091692f34d333dec8fd3a8e375a4ad5a65682cb2;bpv=0;bpt=0
+//
+// This algorithm should achieve a throughput of about 156 megapixels per second
+// on a single Cortex A72.
+
+// This file contains a lot of SIMD built-ins. Thankfully we're only ever going
+// to need this on certain SoCs, so we just wrap everything in a giant include
+// guard.
+//
+// TODO(b/286891480): Convert these Neon intrinsics into Highway, which is more
+// portable. We only used Neon because Highway's OrderedTruncate2To(), which we
+// need for implementing NarrowToU8, was not released at the time of writing.
+
+#include "build/build_config.h"
+
+#if BUILDFLAG(IS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) && \
+    (defined(COMPILER_GCC) || defined(__clang__))
+
+#include <arm_neon.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <vector>
+
+namespace media {
+
+// This file is a little unusual in that it's a header that actually contains a
+// bunch of function definitions. This is pretty ugly, but there's a good reason
+// for it. When we're writing tight loops, we want the compiler to aggressively
+// inline so we don't pay the performance penalty of managing the callstack. If
+// we put the function definitions in a different translation unit, we won't get
+// any inlining because the linker isn't smart enough for that.
+//
+// This anonymous namespace also helps encourage inlining. By putting
+// everything in the anonymous namespace, we are telling the compiler we don't
+// intend to export these symbols, which gives the compiler more freedom to
+// optimize them away. We could also use "static" for this purpose, but that's
+// more idiomatic of C99 than C++.
+//
+// The other alternative would be to just add all of these functions in one .cc
+// file. We chose not to do this because then we wouldn't be able to write
+// granular unit tests; we would just have to settle for one giant "decompress
+// frame" integration test.
+//
+// TODO(b/286891480): Investigate how much latency we really save with this
+// technique, and possibly move the bulk of this code into a .cc file if we find
+// the latency benefit not worth the diminished readability.
+namespace {
+
+constexpr size_t kNumOutputLanes = 16;
+constexpr size_t kMT21TileWidth = 16;
+constexpr size_t kMT21TileHeight = 32;
+constexpr size_t kMT21TileSize = kMT21TileWidth * kMT21TileHeight;
+constexpr size_t kMT21BlockWidth = kMT21TileWidth;
+constexpr size_t kMT21BlockHeight = kMT21TileHeight / 4;
+constexpr size_t kMT21BlockSize = kMT21BlockWidth * kMT21BlockHeight;
+constexpr size_t kMT21SubblocksInBlock = 2;
+constexpr size_t kMT21SubblockWidth = kMT21BlockWidth;
+constexpr size_t kMT21SubblockHeight = kMT21BlockHeight / kMT21SubblocksInBlock;
+constexpr size_t kMT21SubblockSize = kMT21SubblockWidth * kMT21SubblockHeight;
+
+// Loops can cause branch mispredictions, so we manually unroll them when
+// practical.
+//
+// Of course, compilers have loop unrolling optimizations built into them, but
+// these don't actually seem to trigger often in practice, even with -O2 and
+// -funroll-loops. I suspect the compiler is actually shy about loop unrolling
+// because it's worried about blowing up the I-cache. We have a good idea of
+// where the program is going to spend most of its time, however, so we can
+// manually unroll hotspots.
+#define LOOPN(inner_block, N)                                             \
+  {                                                                       \
+    _Pragma("clang loop unroll(full)") for (size_t i = 0; i < (N); i++) { \
+      inner_block                                                         \
+    }                                                                     \
+  }
+
+// We take two completely separate approaches to optimizing MT21 decompression:
+// a scalar approach, and a vector approach. The vector approach is
+// substantially faster than the scalar approach, but the vector approach
+// requires us to have at least 16 compressed subblocks to process
+// simultaneously. Any remainder subblocks need to go through the scalar
+// algorithm.
+
+//////////////////////
+// Scalar Algorithm //
+//////////////////////
+
+// Efficient scalar class for reading MT21 bitstreams. We buffer the bitstream
+// into a 64 bit accumulator and load into it 4 bytes at a time. Note that this
+// means we cannot read more than 32 bits at a time.
+class MT21BitstreamReader {
+ public:
+  MT21BitstreamReader(const uint8_t* buf);
+  // Look ahead N bits, but do not discard. Note that N cannot be 0.
+  int PeekNBits(int n);
+  // Discard N bits and possibly load more into the accumulator.
+  void DiscardNBits(int n);
+  // Combined peek and discard.
+  int ReadNBits(int n);
+  // Returns total number of consumed bits. Useful for filling in Golomb-Rice
+  // lookup tables.
+  size_t GetConsumedBits();
+
+ private:
+  const uint8_t* buf_;
+  size_t consumed_bits_;
+
+  uint64_t accumulator_;
+  size_t byte_idx_;
+  uint8_t outstanding_reads_;
+
+  // Responsible for keeping the accumulator full.
+  void MaybeRefillAccumulator();
+};
+
+MT21BitstreamReader::MT21BitstreamReader(const uint8_t* buf) {
+  buf_ = buf;
+  accumulator_ = *(uint64_t*)(buf + 8);
+  byte_idx_ = 4;
+  outstanding_reads_ = 0;
+  consumed_bits_ = 0;
+}
+
+void MT21BitstreamReader::MaybeRefillAccumulator() {
+  if (outstanding_reads_ >= 32) {
+    uint32_t next_dword = *(uint32_t*)(buf_ + byte_idx_);
+    outstanding_reads_ -= 32;
+    accumulator_ |= ((uint64_t)next_dword) << outstanding_reads_;
+
+    // Advance to the next row if we've exhausted the current one.
+    // I experimented with eliminating this branch, but it doesn't seem to make
+    // much of a difference for efficiency.
+    if ((byte_idx_ & 0xF) == 0) {
+      byte_idx_ += 32;
+    }
+    // Rows are read right to left.
+    byte_idx_ -= 4;
+  }
+}
+
+int MT21BitstreamReader::PeekNBits(int n) {
+  // N cannot be 0, because shifting right by 64 bits is technically undefined
+  // behavior. One some platforms, this will return unexpected results.
+  return (int)(accumulator_ >> (64 - n));
+}
+
+void MT21BitstreamReader::DiscardNBits(int n) {
+  accumulator_ <<= n;
+  outstanding_reads_ += n;
+  consumed_bits_ += n;
+  MaybeRefillAccumulator();
+}
+
+int MT21BitstreamReader::ReadNBits(int n) {
+  if (!n) {
+    return 0;
+  }
+
+  int ret = PeekNBits(n);
+  DiscardNBits(n);
+
+  return ret;
+}
+
+size_t MT21BitstreamReader::GetConsumedBits() {
+  return consumed_bits_;
+}
+
+// "Slow" method of reading a Golomb-Rice symbol. Needed for miscellaneous
+// functions like populating the lookup table and fallback logic if the symbol
+// isn't in the table.
+int ReadGolombRiceSymbol(MT21BitstreamReader& reader, int k) {
+  const int escape_sequence_num = 7 + k;
+  int num_ones = 0;
+  int ret = 0;
+
+  // Read the unary component.
+  while (1) {
+    const int curr_bit = reader.ReadNBits(1);
+    if (curr_bit) {
+      num_ones++;
+
+      if (num_ones == escape_sequence_num) {
+        break;
+      }
+    } else {
+      break;
+    }
+  }
+
+  if (num_ones == escape_sequence_num) {
+    // We've hit the escape sequence, so we switch to limited length mode.
+    ret = reader.ReadNBits(8 - (k >= 4));
+
+    ret += num_ones * (1 << k);
+  } else if (num_ones) {
+    ret = (num_ones * (1 << k)) + reader.ReadNBits(k);
+  } else {
+    // Special case unary components of 0, because 0 symbols don't have a sign
+    // bit.
+    ret = reader.ReadNBits(k - 1);
+    if (ret) {
+      ret <<= 1;
+      ret += reader.ReadNBits(1);
+    }
+  }
+
+  // Map unsigned symbol to signed symbol.
+  if (ret & 1) {
+    return -1 * (ret >> 1);
+  } else {
+    return ret >> 1;
+  }
+}
+
+// "Fast" method of reading Golomb-Rice symbols that uses a lookahead window and
+// a lookup table. This will fall back to the slow method if the symbol exceeds
+// kGolombRiceTableLookaheadLen, because we need to keep the size of the lookup
+// table small enough to fit in L1.
+struct GolombRiceTableEntry {
+  // Size of the compressed symbol.
+  int8_t in_size;
+  // Value of the symbol.
+  int8_t symbol;
+};
+constexpr size_t kMaxKValue = 8;
+// Lookahead len chosen experimentally. We want it to be big enough that we
+// maximize how often we hit the lookup table, but small enough to fit in the
+// A72's L1 cache. Some testing indicated that 10 bits was the magic number.
+constexpr size_t kGolombRiceTableLookaheadLen = 10;
+constexpr size_t kGolombRiceTableSize = (1 << kGolombRiceTableLookaheadLen);
+constexpr size_t kGolombRiceCacheSize = kGolombRiceTableSize * (kMaxKValue - 1);
+constexpr size_t kBitsInByte = 8;
+
+// Initializes the lookup tables for all possible k values
+void PopulateGolombRiceCache(GolombRiceTableEntry* cache) {
+  uint8_t tmp_buf[kMT21SubblockSize];
+  for (size_t k = 1; k < kMaxKValue; k++) {
+    GolombRiceTableEntry* table = cache + (k - 1) * kGolombRiceTableSize;
+    for (size_t lookahead_val = 0;
+         lookahead_val < (1 << kGolombRiceTableLookaheadLen); lookahead_val++) {
+      GolombRiceTableEntry* entry = table + lookahead_val;
+
+      // Compressed symbol size 0 indicates a cache miss.
+      entry->in_size = 0;
+
+      // Create a fake Subblock that just contains our target value in the first
+      // 2 bytes.
+      tmp_buf[kMT21SubblockWidth - 1] =
+          lookahead_val >> (kGolombRiceTableLookaheadLen - kBitsInByte);
+      tmp_buf[kMT21SubblockWidth - 2] =
+          (lookahead_val << (kBitsInByte -
+                             (kGolombRiceTableLookaheadLen - kBitsInByte))) &
+          0xFF;
+
+      MT21BitstreamReader reader(tmp_buf);
+
+      // Try to read a symbol. If it was small enough, put it in the lookup
+      // table.
+      int symbol = ReadGolombRiceSymbol(reader, k);
+      if (reader.GetConsumedBits() <= kGolombRiceTableLookaheadLen) {
+        entry->in_size = reader.GetConsumedBits();
+        entry->symbol = symbol;
+      }
+    }
+  }
+}
+
+int FastReadGolombRiceSymbol(MT21BitstreamReader& reader,
+                             int k,
+                             const GolombRiceTableEntry* table) {
+  const int lookahead_window = reader.PeekNBits(kGolombRiceTableLookaheadLen);
+  if (table[lookahead_window].in_size) {
+    reader.DiscardNBits(table[lookahead_window].in_size);
+    return table[lookahead_window].symbol;
+  } else {
+    // Cache miss, fall back to slow method.
+    return ReadGolombRiceSymbol(reader, k);
+  }
+}
+
+// Prediction functions for all 4 subblock regions. We split this logic up into
+// separate functions rather than using "if" statements because the "if"
+// statements were causing high rates of branch misprediction.
+uint8_t FirstRowPrediction(uint8_t right) {
+  return right;
+}
+
+uint8_t LastColPrediction(uint8_t up) {
+  return up;
+}
+
+// We use a lookup table approach because, again, we want to avoid if statements
+// to avoid branch mispredictions. It's cheaper to just compute all 3 possible
+// prediction values and select which one we want to use later.
+uint8_t FirstColPrediction(uint8_t up, uint8_t up_right, uint8_t right) {
+  int max_up_right = up > right ? up : right;
+  int min_up_right = up > right ? right : up;
+  int horiz_grad_prediction = right + (up - up_right);
+  uint8_t ret[3];
+  int idx = ((up_right > max_up_right) << 1) | (up_right < min_up_right);
+  ret[0b00] = horiz_grad_prediction;
+  ret[0b01] = min_up_right;
+  ret[0b10] = max_up_right;
+  return ret[idx];
+}
+
+// Same deal as with first column prediction, but with 4 possible prediction
+// values.
+uint8_t BodyPrediction(uint8_t up_left,
+                       uint8_t up,
+                       uint8_t up_right,
+                       uint8_t right) {
+  int max_up_right = up > right ? up : right;
+  int min_up_right = up > right ? right : up;
+  int right_grad = right + (up - up_right);
+  int left_grad = right + (up - up_left);
+  int use_right_grad = up_right <= max_up_right && up_right >= min_up_right;
+  int idx = (use_right_grad << 1 | use_right_grad) |
+            (up_left > max_up_right) << 1 | up_left < min_up_right;
+  uint8_t ret[4];
+  ret[0b00] = left_grad;
+  ret[0b01] = min_up_right;
+  ret[0b10] = max_up_right;
+  ret[0b11] = right_grad;
+  return ret[idx];
+}
+
+// Core (scalar) decompression functions.
+//
+// We're abusing templates rather than taking subblock dims as a parameter
+// because we want to try to coax the compiler into evaluating as many
+// expressions as possible during compile time and maybe even unrolling the
+// loops.
+struct MT21Subblock {
+  const uint8_t* src;
+  uint8_t* dest;
+  size_t len;
+};
+struct MT21YSubblock : MT21Subblock {};
+struct MT21UVSubblock : MT21Subblock {};
+
+template <int width>
+void DecompressSubblock(MT21BitstreamReader& reader,
+                        uint8_t* dest,
+                        const GolombRiceTableEntry* symbol_cache) {
+  int k = reader.ReadNBits(3) + 1;
+  dest[width - 1] = reader.ReadNBits(8);
+
+  if (k == 8) {
+    // This is a solid color block, set everything equal to the top right corner
+    // value.
+    memset(dest, dest[width - 1], width * kMT21SubblockHeight);
+    return;
+  }
+
+  // Find which table in the cache we should be using. Sometimes the compiler
+  // doesn't bother factoring this calculation out of the loop, so we do it
+  // manually.
+  const GolombRiceTableEntry* symbol_table =
+      symbol_cache + (k - 1) * kGolombRiceTableSize;
+
+  // Pixels get processed right to left, top to bottom.
+  uint8_t curr;
+  uint8_t up_left;
+  uint8_t up = dest[width - 1];
+  uint8_t up_right;
+  uint8_t right = up;
+  for (int x = width - 2; x >= 0; x--) {
+    curr = FirstRowPrediction(right) +
+           FastReadGolombRiceSymbol(reader, k, symbol_table);
+    right = curr;
+    dest[x] = curr;
+  }
+  for (size_t y = 1; y < kMT21SubblockHeight; y++) {
+    up = dest[y * width - 1];
+    curr = LastColPrediction(up) +
+           FastReadGolombRiceSymbol(reader, k, symbol_table);
+    dest[y * width + width - 1] = curr;
+    right = curr;
+    up_right = up;
+    up = dest[y * width - 2];
+    for (size_t x = width - 2; x >= 1; x--) {
+      up_left = dest[y * width - width + x - 1];
+      curr = BodyPrediction(up_left, up, up_right, right) +
+             FastReadGolombRiceSymbol(reader, k, symbol_table);
+      dest[y * width + x] = curr;
+      right = curr;
+      up_right = up;
+      up = up_left;
+    }
+    dest[y * width] = FirstColPrediction(up, up_right, right) +
+                      FastReadGolombRiceSymbol(reader, k, symbol_table);
+  }
+}
+
+// UV subblocks are half the size of normal subblocks and are written one after
+// another with no padding. We use the DecompressSubblockHelper template to help
+// us differentiate this behavior.
+template <typename T>
+void DecompressSubblockHelper(T subblock,
+                              const GolombRiceTableEntry* symbol_cache);
+template <>
+void DecompressSubblockHelper(MT21YSubblock subblock,
+                              const GolombRiceTableEntry* symbol_cache) {
+  MT21BitstreamReader reader(subblock.src);
+  DecompressSubblock<kMT21SubblockWidth>(reader, subblock.dest, symbol_cache);
+}
+// Interleaves a U and V subblock into a combined UV subblock.
+void InterleaveUVSubblock(const uint8_t* src_u,
+                          const uint8_t* src_v,
+                          uint8_t* dest_uv) {
+  uint8x16_t tmp_u, tmp_v;
+  uint8x16x2_t store_tmp;
+  LOOPN(
+      {
+        tmp_u = vld1q_u8(src_u);
+        src_u += 16;
+        tmp_v = vld1q_u8(src_v);
+        src_v += 16;
+        store_tmp.val[0] = tmp_u;
+        store_tmp.val[1] = tmp_v;
+        vst2q_u8(dest_uv, store_tmp);
+        dest_uv += 32;
+      },
+      2)
+}
+template <>
+void DecompressSubblockHelper(MT21UVSubblock subblock,
+                              const GolombRiceTableEntry* symbol_cache) {
+  MT21BitstreamReader reader(subblock.src);
+  uint8_t scratch_u[kMT21SubblockSize / 2] __attribute__((aligned(16)));
+  uint8_t scratch_v[kMT21SubblockSize / 2] __attribute__((aligned(16)));
+  DecompressSubblock<kMT21SubblockWidth / 2>(reader, scratch_v, symbol_cache);
+  DecompressSubblock<kMT21SubblockWidth / 2>(reader, scratch_u, symbol_cache);
+  InterleaveUVSubblock(scratch_u, scratch_v, subblock.dest);
+}
+
+/////////////////////////
+// SIMD Implementation //
+/////////////////////////
+
+// This SIMD implementation operates on 16 subblocks at a time, even though we
+// only have 4 lanes to work with since the accumulator needs to be 32-bit. This
+// algorithm was originally developed to only operate on 4 subblocks at a time
+// to match the number of lanes, but we had a lot of trouble keeping the
+// Cortex A72's 2 Neon pipelines full. So, we manually unroll the loop a little
+// and interleave operations from each iteration.
+//
+// Generally the compiler and the CPU itself are good enough at instructions
+// scheduling, but in this case, manually scheduling our instructions
+// dramatically increases our throughput. There may be more optimizations to do
+// yet in this regard; our current throughput is about 1.3 IPC, when it should
+// actually be closer to 1.5 IPC.
+
+static const uint8x16_t byte_literal_1 = vdupq_n_u8(1);
+static const uint32x4_t dword_literal_1 = vdupq_n_u32(1);
+static const uint32x4_t dword_literal_4 = vdupq_n_u32(4);
+static const uint32x4_t dword_literal_7 = vdupq_n_u32(7);
+static const uint32x4_t dword_literal_8 = vdupq_n_u32(8);
+static const uint32x4_t dword_literal_11 = vdupq_n_u32(11);
+static const uint32x4_t dword_literal_31 = vdupq_n_u32(31);
+static const uint32x4_t dword_literal_32 = vdupq_n_u32(32);
+
+// Helpful utility for taking 4 vectors with uint32_t elements and combining
+// them into 1 vector with uint8_t elements. Note that this necessarily discards
+// the upper 24 bits of each element. Our accumulators need to be 32-bit because
+// our longest Golomb-Rice code is 20 bits, but we can narrow for other parts of
+// the algorithm.
+
+uint8x16_t inline NarrowToU8(uint32x4_t& vec1,
+                             uint32x4_t& vec2,
+                             uint32x4_t& vec3,
+                             uint32x4_t& vec4) {
+  return vcombine_u8(vmovn_u16(vcombine_u16(vmovn_u32(vec1), vmovn_u32(vec2))),
+                     vmovn_u16(vcombine_u16(vmovn_u32(vec3), vmovn_u32(vec4))));
+}
+
+// 32-bit ARM machines don't actually support unaligned memory access. The
+// accumulator management code was originally written for Aarch64, which
+// supports unaligned accesses without issue. In order to make that code work
+// with Chrome, we need this hacky workaround. If performance is drastically
+// different between the Aarch64 prototype and the production version of the
+// code, this portion of the code is a good place to start poking. Supposedly
+// there was a penalty for unaligned reads on Aarch64 as well, but I can't find
+// any documentation for how many cycles that is on a Cortex A72 or A53.
+uint32_t inline LoadUnalignedDword(uint32_t* ptr) {
+  uint32_t ret;
+  memcpy(&ret, ptr, sizeof(uint32_t));
+  return ret;
+}
+
+// Helpful utility for managing the accumulator. This function effectively
+// discards |discard_size| bits and loads in more bytes from the bitstream as
+// needed.
+void inline VectorManageAccumulator(uint32x4_t* accumulator,
+                                    uint32x4_t* outstanding_reads,
+                                    const uint32x4_t& discard_size,
+                                    int i,
+                                    uint8_t** compressed_ptr) {
+  // We always load in a fresh dword. Often it will be from the same offsets.
+  // This is inefficient, but it's offset by the speedup of vectorization.
+  outstanding_reads[i] = vaddq_u32(outstanding_reads[i], discard_size);
+  uint32x4_t offsets = vshrq_n_u32(outstanding_reads[i], 3);
+  compressed_ptr[i * 4] -= offsets[0];
+  compressed_ptr[i * 4 + 1] -= offsets[1];
+  compressed_ptr[i * 4 + 2] -= offsets[2];
+  compressed_ptr[i * 4 + 3] -= offsets[3];
+  outstanding_reads[i] = vandq_u32(outstanding_reads[i], dword_literal_7);
+  accumulator[i][0] = LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4]);
+  accumulator[i][1] = LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4 + 1]);
+  accumulator[i][2] = LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4 + 2]);
+  accumulator[i][3] = LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4 + 3]);
+  accumulator[i] =
+      vshlq_u32(accumulator[i], vreinterpretq_s32_u32(outstanding_reads[i]));
+}
+
+// Golomb-Rice decompression. The core algorithm looks like this:
+// 1. escape_seq = k + 7
+// 2. unary_component = min(count_leading_zero(~accumulator), escape_seq)
+// 3. unary_len = unary_component + (unary_component == escape_seq)
+// 5. binary_len = (unary_component == escape_seq) ? 8 : k
+// 6. binary_component = (accumulator << unary_len) >> (32 - binary_len)
+// 7. symbol = (k == 8) ? 0 : (unary_component << k) + binary_component
+// 8. symbol = symbol / 2 * (symbol % 2 ? -1 : 1)
+uint8x16_t inline VectorReadGolombRiceSymbol(uint32x4_t* accumulator,
+                                             uint32x4_t* outstanding_reads,
+                                             uint32x4_t* escape_codes,
+                                             uint32x4_t* escape_binary_len_diff,
+                                             uint32x4_t* k_vals,
+                                             uint32x4_t* dword_solid_color_mask,
+                                             uint8_t** compressed_ptr) {
+  // leading_ones = min(count_leading_zero(~accumulator), escape_codes)
+  // escape_lanes = leading_ones == escape_codes
+  uint32x4_t leading_ones[4];
+  uint32x4_t escape_lanes[4];
+  LOOPN(
+      {
+        leading_ones[i] =
+            vminq_u32(vclzq_u32(vmvnq_u32(accumulator[i])), escape_codes[i]);
+        escape_lanes[i] = vceqq_u32(leading_ones[i], escape_codes[i]);
+      },
+      4)
+
+  // binary_len = k + (escape_lanes * (8 - k))
+  // unary_len = leading_ones + !escape_lanes
+  uint32x4_t binary_len[4];
+  uint32x4_t unary_len[4];
+  LOOPN(
+      {
+        binary_len[i] = vaddq_u32(
+            k_vals[i], vandq_u32(escape_lanes[i], escape_binary_len_diff[i]));
+        unary_len[i] =
+            vaddq_u32(leading_ones[i],
+                      vandq_u32(dword_literal_1, vmvnq_u32(escape_lanes[i])));
+      },
+      4)
+
+  // output = (leading_ones << k)
+  // output += ((accumulator << unary_len) >> (32 - binary_len)
+  uint32x4_t dword_output[4];
+  LOOPN(
+      {
+        dword_output[i] =
+            vshlq_u32(leading_ones[i], vreinterpretq_s32_u32(k_vals[i]));
+        dword_output[i] = vaddq_u32(
+            dword_output[i],
+            vshlq_u32(
+                vshlq_u32(accumulator[i], vreinterpretq_s32_u32(unary_len[i])),
+                vsubq_s32(vreinterpretq_s32_u32(binary_len[i]),
+                          dword_literal_32)));
+      },
+      4)
+
+  // total_len = unary_len + binary_len - (output <= 1)
+  // total_len = solid_color_mask ? total_len : 0
+  uint32x4_t total_len[4];
+  LOOPN(
+      {
+        total_len[i] =
+            vsubq_u32(vaddq_u32(unary_len[i], binary_len[i]),
+                      vandq_u32(dword_literal_1,
+                                vcleq_u32(dword_output[i], dword_literal_1)));
+        total_len[i] = vandq_u32(total_len[i], dword_solid_color_mask[i]);
+      },
+      4)
+
+  // Handle accumulator.
+  LOOPN(
+      {
+        VectorManageAccumulator(accumulator, outstanding_reads, total_len[i], i,
+                                compressed_ptr);
+      },
+      4)
+
+  // output = (output / 2) * (output % 2 ? -1 : 1)
+  // This is a hack that relies on how two's complement arithmetic works.
+  uint8x16_t output = NarrowToU8(dword_output[0], dword_output[1],
+                                 dword_output[2], dword_output[3]);
+  uint8x16_t negative_lanes = vandq_u8(output, byte_literal_1);
+  output = vaddq_u8(
+      veorq_u8(vshrq_n_u8(output, 1), vtstq_u8(negative_lanes, negative_lanes)),
+      negative_lanes);
+
+  return output;
+}
+
+// Initializes the accumulator with the first 4 bytes of compressed data.
+void VectorInitializeAccumulator(uint32x4_t* accumulator,
+                                 uint8_t** compressed_ptr) {
+  LOOPN(
+      {
+        accumulator[i][0] =
+            LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4]);
+        accumulator[i][1] =
+            LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4 + 1]);
+        accumulator[i][2] =
+            LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4 + 2]);
+        accumulator[i][3] =
+            LoadUnalignedDword((uint32_t*)compressed_ptr[i * 4 + 3]);
+      },
+      4);
+}
+
+// Reads the 11 bit header on the compressed data and initializes some important
+// vectors.
+uint8x16_t VectorReadCompressedHeader(uint32x4_t* accumulator,
+                                      uint32x4_t* outstanding_reads,
+                                      uint32x4_t* escape_codes,
+                                      uint32x4_t* escape_binary_len_diff,
+                                      uint32x4_t* k_vals,
+                                      uint32x4_t* dword_solid_color_mask,
+                                      uint8x16_t& solid_color_mask,
+                                      uint8_t** compressed_ptr) {
+  // Parse out our K value.
+  // k = (accumulator >> 29) + 1
+  // 29 comes from 32 - 3, since 32 is the size of the accumulator and 3 is the
+  // size of k.
+  LOOPN(
+      {
+        k_vals[i] =
+            vaddq_u32(vshrq_n_u32(accumulator[i], 32 - 3), dword_literal_1);
+      },
+      4)
+
+  // Calculate what our escape code should be for each lane based on the K
+  // values.
+  // escape_codes = k + 7
+  LOOPN({ escape_codes[i] = vaddq_u32(k_vals[i], dword_literal_7); }, 4)
+
+  // Compute the length of the binary components of "escaped" symbols.
+  // Note that we abuse the fact that 0xFFFFFFFF == -1
+  // escaped_binary_len_diff = 8 - k - (k >= 4)
+  LOOPN(
+      {
+        escape_binary_len_diff[i] =
+            vaddq_u32(vsubq_u32(dword_literal_8, k_vals[i]),
+                      vcgeq_u32(k_vals[i], dword_literal_4));
+      },
+      4)
+
+  // Figure out which lanes are actually operating in solid color mode. Yes, we
+  // do a lot of wasted computation and then throw away the results for solid
+  // color blocks. Unfortunately this is also the price we pay for
+  // vectorization.
+  // solid_color_mask = 0xFF * (k < 8)
+  LOOPN({ dword_solid_color_mask[i] = vcltq_u32(k_vals[i], dword_literal_8); },
+        4)
+  solid_color_mask =
+      NarrowToU8(dword_solid_color_mask[0], dword_solid_color_mask[1],
+                 dword_solid_color_mask[2], dword_solid_color_mask[3]);
+
+  // Parse the top right pixel value
+  // accumulator <<= 3
+  // top_right = accumulator >> 24
+  // accumulator <<= 8
+  uint32x4_t top_right[4];
+  LOOPN(
+      {
+        accumulator[i] = vshlq_n_u32(accumulator[i], 3);
+        top_right[i] = vshrq_n_u32(accumulator[i], 24);
+        accumulator[i] = vshlq_n_u32(accumulator[i], 8);
+      },
+      4)
+
+  // Manage the accumulator (shift in new bits if possible). For Y subblocks,
+  // this isn't strictly necessary because the longest prefix code is 20 bits,
+  // and we've only consumed 11 bits, so we should technically have enough to
+  // read the first Golomb-Rice symbol. But U subblocks are appended directly to
+  // the end of V subblocks with no padding, so it's possible that the subblock
+  // we are currently decompressing does not start at a byte boundary, so we can
+  // no longer make this assumption.
+  LOOPN(
+      {
+        VectorManageAccumulator(accumulator, outstanding_reads,
+                                dword_literal_11, i, compressed_ptr);
+      },
+      4)
+
+  return NarrowToU8(top_right[0], top_right[1], top_right[2], top_right[3]);
+}
+
+// Straightforward vector implementations of the prediction methods. The only
+// hangup is that we don't use a lookup table exactly. Neon actually has a
+// lookup table instruction, and the first iteration of the code used that, but
+// it turns out that using a series of ternary instructions (vbslq_u8) is
+// slightly faster.
+
+uint8x16_t inline VectorFirstRowPrediction(const uint8x16_t& right) {
+  return right;
+}
+
+uint8x16_t inline VectorLastColPrediction(const uint8x16_t& up) {
+  return up;
+}
+
+uint8x16_t inline VectorFirstColPrediction(const uint8x16_t& up,
+                                           const uint8x16_t& up_right,
+                                           const uint8x16_t& right) {
+  const uint8x16_t min_pred = vminq_u8(up, right);
+  const uint8x16_t max_pred = vmaxq_u8(up, right);
+  const uint8x16_t right_grad = vreinterpretq_u8_s8(vaddq_s8(
+      right, vsubq_s8(vreinterpretq_s8_u8(up), vreinterpretq_s8_u8(up_right))));
+  const uint8x16_t up_right_above_max = vcgtq_u8(up_right, max_pred);
+  const uint8x16_t up_right_below_min = vcltq_u8(up_right, min_pred);
+  uint8x16_t pred = vbslq_u8(up_right_above_max, max_pred, min_pred);
+  pred = vbslq_u8(vorrq_u8(up_right_above_max, up_right_below_min), pred,
+                  right_grad);
+  return pred;
+}
+
+uint8x16_t inline VectorBodyPrediction(const uint8x16_t& up_left,
+                                       const uint8x16_t& up,
+                                       const uint8x16_t& up_right,
+                                       const uint8x16_t& right) {
+  uint8x16_t min_pred = vminq_u8(up, right);
+  uint8x16_t max_pred = vmaxq_u8(up, right);
+  uint8x16_t right_grad = vreinterpretq_u8_s8(vaddq_s8(
+      vreinterpretq_s8_u8(right),
+      vsubq_s8(vreinterpretq_s8_u8(up), vreinterpretq_s8_u8(up_right))));
+  uint8x16_t left_grad = vreinterpretq_u8_s8(vaddq_s8(
+      vreinterpretq_s8_u8(right),
+      vsubq_s8(vreinterpretq_s8_u8(up), vreinterpretq_s8_u8(up_left))));
+  uint8x16_t up_left_above_max = vcgtq_u8(up_left, max_pred);
+  uint8x16_t up_left_below_min = vcltq_u8(up_left, min_pred);
+  uint8x16_t use_right_grad =
+      vandq_u8(vcleq_u8(up_right, max_pred), vcgeq_u8(up_right, min_pred));
+  uint8x16_t pred = vbslq_u8(up_left_above_max, max_pred, min_pred);
+  pred =
+      vbslq_u8(vorrq_u8(up_left_above_max, up_left_below_min), pred, left_grad);
+  pred = vbslq_u8(use_right_grad, right_grad, pred);
+  return pred;
+}
+
+// In order for our vectorized accumulator management to work, we have to
+// flip our subblocks vertically. Our decompression routine always decrements
+// the compressed data pointer to avoid having to deal with moving to the next
+// row. This is a routine for taking all 16 target subblocks, flipping them, and
+// copying them into scratch memory.
+constexpr size_t kMT21ScratchMemorySize = 4096;
+constexpr size_t kMT21RedZoneSize = 1024;
+
+template <class T>
+void SubblockGather(const std::vector<T>& subblock_list,
+                    int start_idx,
+                    uint8_t* aligned_scratch_memory,
+                    uint8_t** compressed_ptr) {
+  // Our scratch memory is 4096 bytes. We use the first and last 1KB as a "red
+  // zone" to catch any overread from malformed bitstreams. This is much more
+  // performant than bounds checking. Our longest Golomb-Rice code is 20-bits,
+  // so really our red zone only needs to be
+  // 20/8*kMT21SubblockHeight*kMT21SubblockWidth = 160 bytes. We can consider
+  // relaxing the red zone size if memory becomes more of an issue.
+  aligned_scratch_memory += kMT21RedZoneSize;
+
+  for (size_t i = 0; i < kNumOutputLanes; i++) {
+    compressed_ptr[i] = aligned_scratch_memory;
+    aligned_scratch_memory += kMT21SubblockSize;
+    for (size_t j = 0; j < subblock_list[i + start_idx].len;
+         j += kMT21SubblockWidth) {
+      memcpy(compressed_ptr[i] + 3 * kMT21SubblockWidth - j,
+             subblock_list[i + start_idx].src + j, kMT21SubblockWidth);
+    }
+    compressed_ptr[i] += kMT21SubblockSize - sizeof(uint32_t);
+  }
+}
+
+// We compute 1 output per lane with the SIMD decompression algorithm. We could
+// store lane individually, but instead we batch the output of all 16
+// subblocks, and then do 4 16x16 transposes and write out the results of our
+// decompression row by row. This is substantially faster because it's fewer
+// instructions and it takes advantage of the write combiner.
+//
+// The transpose algorithm we use is to break the data into 4x4 blocks, where
+// each block is stored in its own register. We then perform 4x4 transposes on
+// all 16 of the 4x4 blocks. Then, we rearrange the blocks to complete the
+// transpose.
+//
+// We actually have to transpose the 4x4 blocks in 2 64-bit registers because
+// 32-bit ARM lacks a vqtbl1q_u8 instruction. I actually don't know if this is
+// terrible for performance since the A72 has the Neon throughput capped at 3
+// 64-bit vector registers per cycle anyway. But if we see a drop in performance
+// compared to our Aarch64 benchmarks, this may be worth looking into.
+static const uint8x8_t kTableTranspose4x4UpperIndices = {
+    0, 4, 8, 12, 1, 5, 9, 13,
+};
+static const uint8x8_t kTableTranspose4x4LowerIndices = {
+    2, 6, 10, 14, 3, 7, 11, 15,
+};
+void SubblockTransposeScatter(uint8_t*& src, uint8_t** decompressed_ptr) {
+  uint32x4x4_t load_regs[4];
+  uint32x4x4_t store_regs[4];
+
+  // Load 4x4 blocks
+  LOOPN(
+      {
+        load_regs[i] = vld4q_u32((uint32_t*)src);
+        src += 64;
+      },
+      4)
+
+  // Move the source pointer to the next row.
+  src -= 2 * kMT21SubblockWidth * kNumOutputLanes;
+
+  // 4x4 transposes using lookup table
+  LOOPN(
+      {
+        uint8x8x2_t table;
+        table.val[0] =
+            vget_low_u8(vreinterpretq_u8_u32(load_regs[i / 4].val[i % 4]));
+        table.val[1] =
+            vget_high_u8(vreinterpretq_u8_u32(load_regs[i / 4].val[i % 4]));
+        load_regs[i / 4].val[i % 4] =
+            vcombine_u32(vreinterpret_u32_u8(
+                             vtbl2_u8(table, kTableTranspose4x4UpperIndices)),
+                         vreinterpret_u32_u8(
+                             vtbl2_u8(table, kTableTranspose4x4LowerIndices)));
+      },
+      16)
+
+  // Rearrange 4x4 blocks. This probably won't generate any instructions since
+  // we're basically just renaming some registers?
+  LOOPN({ store_regs[i / 4].val[i % 4] = load_regs[i % 4].val[i / 4]; }, 16)
+
+  // Store the rows.
+  // Apparently vst4q_lane_u32 requires a constant integer for the third
+  // argument and clang isn't smart enough to realize that unrolling the loop
+  // would make the third argument const. So, ctrl-c, ctrl-v.
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[0], store_regs[0], 0);
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[1], store_regs[0], 1);
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[2], store_regs[0], 2);
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[3], store_regs[0], 3);
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[4], store_regs[1], 0);
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[5], store_regs[1], 1);
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[6], store_regs[1], 2);
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[7], store_regs[1], 3);
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[8], store_regs[2], 0);
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[9], store_regs[2], 1);
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[10], store_regs[2], 2);
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[11], store_regs[2], 3);
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[12], store_regs[3], 0);
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[13], store_regs[3], 1);
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[14], store_regs[3], 2);
+  vst4q_lane_u32((uint32_t*)decompressed_ptr[15], store_regs[3], 3);
+}
+
+// Decompresses a sublock. We take width and stride parameters to let us recycle
+// code between Y subblock and UV subblock decompression routines. UV subblocks
+// just halve the width, but skip every other pixel.
+template <class T, int width, int stride>
+void VectorDecompressSubblock(const std::vector<T>& subblock_list,
+                              int start_idx,
+                              uint8_t** compressed_ptr,
+                              uint8_t* output_buf,
+                              uint32x4_t* outstanding_reads,
+                              uint32x4_t* accumulator) {
+  static const int pixel_distance = stride / width;
+
+  uint32x4_t escape_codes[4];
+  uint32x4_t escape_binary_len_diff[4];
+  uint32x4_t k_vals[4];
+  uint32x4_t dword_solid_color_mask[4];
+  uint8x16_t solid_color_mask;
+  uint8x16_t output, up_left, up, up_right, right;
+
+  output = VectorReadCompressedHeader(
+      accumulator, outstanding_reads, escape_codes, escape_binary_len_diff,
+      k_vals, dword_solid_color_mask, solid_color_mask, compressed_ptr);
+  right = output;
+  vst1q_u8(output_buf, output);
+  output_buf -= pixel_distance * kNumOutputLanes;
+
+  for (int i = 0; i < width - 1; i++) {
+    // Handle first row
+    output = VectorReadGolombRiceSymbol(
+        accumulator, outstanding_reads, escape_codes, escape_binary_len_diff,
+        k_vals, dword_solid_color_mask, compressed_ptr);
+
+    output = vandq_u8(output, solid_color_mask);
+    output = vaddq_u8(output, VectorFirstRowPrediction(right));
+
+    right = output;
+
+    vst1q_u8(output_buf, output);
+    output_buf -= pixel_distance * kNumOutputLanes;
+  }
+  for (size_t y = 1; y < kMT21SubblockHeight; y++) {
+    // Handle last col
+    up = vld1q_u8(output_buf + stride * kNumOutputLanes);
+
+    output = VectorReadGolombRiceSymbol(
+        accumulator, outstanding_reads, escape_codes, escape_binary_len_diff,
+        k_vals, dword_solid_color_mask, compressed_ptr);
+
+    output = vandq_u8(output, solid_color_mask);
+    output = vaddq_u8(output, VectorLastColPrediction(up));
+
+    up_right = up;
+    right = output;
+
+    vst1q_u8(output_buf, output);
+    output_buf -= pixel_distance * kNumOutputLanes;
+
+    up = vld1q_u8(output_buf + stride * kNumOutputLanes);
+
+    for (int x = width - 2; x >= 1; x--) {
+      // Handle body
+      up_left =
+          vld1q_u8(output_buf + (stride - pixel_distance) * kNumOutputLanes);
+
+      output = VectorReadGolombRiceSymbol(
+          accumulator, outstanding_reads, escape_codes, escape_binary_len_diff,
+          k_vals, dword_solid_color_mask, compressed_ptr);
+
+      output = vandq_u8(output, solid_color_mask);
+      output =
+          vaddq_u8(output, VectorBodyPrediction(up_left, up, up_right, right));
+
+      right = output;
+      up_right = up;
+      up = up_left;
+
+      vst1q_u8(output_buf, output);
+      output_buf -= pixel_distance * kNumOutputLanes;
+    }
+    // Handle first col
+    output = VectorReadGolombRiceSymbol(
+        accumulator, outstanding_reads, escape_codes, escape_binary_len_diff,
+        k_vals, dword_solid_color_mask, compressed_ptr);
+
+    output = vandq_u8(output, solid_color_mask);
+    output = vaddq_u8(output, VectorFirstColPrediction(up, up_right, right));
+    vst1q_u8(output_buf, output);
+    output_buf -= pixel_distance * kNumOutputLanes;
+  }
+}
+
+// Main entrypoint for vector decompression.
+template <class T>
+void VectorDecompressSubblockHelper(const std::vector<T>& subblock_list,
+                                    int start_idx,
+                                    uint8_t* aligned_scratch) {}
+template <>
+void VectorDecompressSubblockHelper(
+    const std::vector<MT21YSubblock>& subblock_list,
+    int start_idx,
+    uint8_t* aligned_scratch) {
+  uint8_t* compressed_ptr[kNumOutputLanes];
+  uint8_t* decompressed_ptr[kNumOutputLanes];
+  uint8_t* output_buf = aligned_scratch + 2 * kMT21RedZoneSize +
+                        kNumOutputLanes * kMT21SubblockSize - kNumOutputLanes;
+  uint32x4_t outstanding_reads[4] = {{0}};
+  uint32x4_t accumulator[4];
+
+  SubblockGather<MT21YSubblock>(subblock_list, start_idx, aligned_scratch,
+                                compressed_ptr);
+  for (size_t i = 0; i < kNumOutputLanes; i++) {
+    decompressed_ptr[i] = subblock_list[start_idx + i].dest;
+  }
+
+  VectorInitializeAccumulator(accumulator, compressed_ptr);
+
+  VectorDecompressSubblock<MT21YSubblock, kMT21SubblockWidth,
+                           kMT21SubblockWidth>(subblock_list, start_idx,
+                                               compressed_ptr, output_buf,
+                                               outstanding_reads, accumulator);
+
+  output_buf -= kNumOutputLanes * kMT21SubblockWidth - kNumOutputLanes;
+  for (int i = 0; i < 4; i++) {
+    SubblockTransposeScatter(output_buf, decompressed_ptr);
+    for (int j = 0; j < 16; j++) {
+      decompressed_ptr[j] += kMT21SubblockWidth;
+    }
+  }
+}
+template <>
+void VectorDecompressSubblockHelper(
+    const std::vector<MT21UVSubblock>& subblock_list,
+    int start_idx,
+    uint8_t* aligned_scratch) {
+  uint8_t* compressed_ptr[16];
+  uint8_t* decompressed_ptr[16];
+  uint8_t* output_buf = aligned_scratch + 2 * kMT21RedZoneSize +
+                        kNumOutputLanes * kMT21SubblockSize - kNumOutputLanes;
+  uint32x4_t outstanding_reads[4] = {{0}};
+  uint32x4_t accumulator[4];
+
+  SubblockGather<MT21UVSubblock>(subblock_list, start_idx, aligned_scratch,
+                                 compressed_ptr);
+  for (int i = 0; i < 16; i++) {
+    decompressed_ptr[i] = subblock_list[start_idx + i].dest;
+  }
+
+  VectorInitializeAccumulator(accumulator, compressed_ptr);
+
+  VectorDecompressSubblock<MT21UVSubblock, kMT21SubblockWidth / 2,
+                           kMT21SubblockWidth>(subblock_list, start_idx,
+                                               compressed_ptr, output_buf,
+                                               outstanding_reads, accumulator);
+  VectorDecompressSubblock<MT21UVSubblock, kMT21SubblockWidth / 2,
+                           kMT21SubblockWidth>(subblock_list, start_idx,
+                                               compressed_ptr, output_buf - 16,
+                                               outstanding_reads, accumulator);
+
+  output_buf -= 16 * 16 - 16;
+  for (int i = 0; i < 4; i++) {
+    SubblockTransposeScatter(output_buf, decompressed_ptr);
+    for (int j = 0; j < 16; j++) {
+      decompressed_ptr[j] += kMT21SubblockWidth;
+    }
+  }
+}
+
+////////////////////
+// Footer Parsing //
+////////////////////
+
+constexpr uint64_t kMT21YFooterAlignment = 4096;
+constexpr uint64_t kMT21UVFooterAlignment = 2048;
+
+// MT21 always puts the footer for the Y plane at the beginning of the last page
+// in the buffer. For some reason, it puts the UV plane at the beginning of the
+// last half-page, meaning the UV footer buffer is 2048 bytes aligned.
+size_t ComputeFooterOffset(size_t plane_size,
+                           size_t buf_size,
+                           size_t alignment) {
+  size_t footer_size = plane_size / kMT21BlockSize / 2;
+  return ((buf_size - footer_size) & (~(alignment - 1)));
+}
+
+// The footer consists of packed 2-bit fields indicating the size of every
+// subblock in 16 byte rows.
+void ParseBlockMetadata(const uint8_t* footer,
+                        size_t block_offset,
+                        size_t& subblock1_len,
+                        size_t& subblock2_len) {
+  // Footer metadata is packed in 2-bit pairs from LSB to MSB. This means we can
+  // pack 4 subblocks, or 2 blocks into every byte of footer.
+  const size_t block_idx = block_offset / kMT21BlockSize;
+  subblock1_len =
+      kMT21BlockWidth *
+      (((footer[block_idx / 2] >> ((block_idx % 2) * 4)) & 0x3) + 1);
+  subblock2_len =
+      kMT21BlockWidth *
+      (((footer[block_idx / 2] >> ((block_idx % 2) * 4 + 2)) & 0x3) + 1);
+}
+
+// Subblocks with a compressed size of 64 bytes are actually passthrough
+// subblocks. This is a handy function for sorting subblocks into passthrough
+// and non-passthrough bins. We can just use a memcpy for passthrough, which is
+// cheaper than somehow incorporating passthrough logic into our decompression
+// routines.
+template <class T>
+void BinSubblocks(const uint8_t* src,
+                  const uint8_t* footer,
+                  uint8_t* dest,
+                  size_t block_offset,
+                  std::vector<T>* subblock_bins) {
+  size_t subblock1_len, subblock2_len;
+  ParseBlockMetadata(footer, block_offset, subblock1_len, subblock2_len);
+  T subblock1 = {src + block_offset, dest + block_offset, subblock1_len};
+  T subblock2 = {src + block_offset + subblock1_len,
+                 dest + block_offset + kMT21SubblockSize, subblock2_len};
+  int subblock1_type = subblock1_len == kMT21SubblockSize;
+  int subblock2_type = subblock2_len == kMT21SubblockSize;
+
+  subblock_bins[subblock1_type].push_back(subblock1);
+  subblock_bins[subblock2_type].push_back(subblock2);
+}
+
+}  // namespace
+
+}  // namespace media
+
+#endif
+
+#endif  // MEDIA_GPU_V4L2_MT21_MT21_UTIL_H_
diff --git a/media/gpu/v4l2/mt21/mt21_util_unittest.cc b/media/gpu/v4l2/mt21/mt21_util_unittest.cc
new file mode 100644
index 0000000..b8e20d4
--- /dev/null
+++ b/media/gpu/v4l2/mt21/mt21_util_unittest.cc
@@ -0,0 +1,418 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "build/build_config.h"
+
+#if BUILDFLAG(IS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY) && \
+    (defined(COMPILER_GCC) || defined(__clang__))
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+#include "media/gpu/v4l2/mt21/mt21_util.h"
+
+#include "base/command_line.h"
+#include "base/test/launcher/unit_test_launcher.h"
+#include "base/test/test_suite.h"
+#include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
+
+namespace media {
+namespace {
+
+TEST(MT21UtilTest, TestBitstreamReader) {
+  uint8_t buf[64] = {
+      0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+      0x55, 0x55, 0x55, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  };
+  MT21BitstreamReader reader(buf);
+
+  ASSERT_TRUE(reader.ReadNBits(0) == 0x00);
+  ASSERT_TRUE(reader.PeekNBits(8) == 0x55);
+  reader.DiscardNBits(1);
+  ASSERT_TRUE(reader.ReadNBits(7) == 0x55);
+  reader.DiscardNBits(24);
+  reader.DiscardNBits(32);
+  reader.DiscardNBits(32);
+  reader.DiscardNBits(32);
+  ASSERT_TRUE(reader.ReadNBits(8) == 0xFF);
+}
+
+TEST(MT21UtilTest, TestReadGolombRiceSymbol) {
+  constexpr int k = 2;
+  uint8_t buf[64] = {0};
+  // 00=0  010=1  011=-1 1000=2  11111111100000001=-18
+  buf[15] = 0b00010011;
+  buf[14] = 0b10001111;
+  buf[13] = 0b11111000;
+  buf[12] = 0b00001000;
+  MT21BitstreamReader reader(buf);
+
+  ASSERT_TRUE(ReadGolombRiceSymbol(reader, k) == 0);
+  ASSERT_TRUE(ReadGolombRiceSymbol(reader, k) == 1);
+  ASSERT_TRUE(ReadGolombRiceSymbol(reader, k) == -1);
+  ASSERT_TRUE(ReadGolombRiceSymbol(reader, k) == 2);
+  ASSERT_TRUE(ReadGolombRiceSymbol(reader, k) == -18);
+}
+
+TEST(MT21UtilTest, TestFastReadGolombRiceSymbol) {
+  GolombRiceTableEntry cache[kGolombRiceCacheSize];
+  PopulateGolombRiceCache(cache);
+  constexpr int k = 2;
+  uint8_t buf[64] = {0};
+  // 00=0  010=1 011=-1 1000 = 2 11111111100000001=-18
+  buf[15] = 0b00010011;
+  buf[14] = 0b10001111;
+  buf[13] = 0b11111000;
+  buf[12] = 0b00001000;
+  MT21BitstreamReader reader(buf);
+
+  ASSERT_TRUE(cache[0].in_size);
+  ASSERT_TRUE(FastReadGolombRiceSymbol(
+                  reader, k, cache + (k - 1) * kGolombRiceTableSize) == 0);
+  ASSERT_TRUE(FastReadGolombRiceSymbol(
+                  reader, k, cache + (k - 1) * kGolombRiceTableSize) == 1);
+  ASSERT_TRUE(FastReadGolombRiceSymbol(
+                  reader, k, cache + (k - 1) * kGolombRiceTableSize) == -1);
+  ASSERT_TRUE(FastReadGolombRiceSymbol(
+                  reader, k, cache + (k - 1) * kGolombRiceTableSize) == 2);
+  ASSERT_TRUE(FastReadGolombRiceSymbol(
+                  reader, k, cache + (k - 1) * kGolombRiceTableSize) == -18);
+}
+
+TEST(MT21UtilTest, TestPredictionMethods) {
+  ASSERT_TRUE(FirstRowPrediction(0x80) == 0x80);
+
+  ASSERT_TRUE(LastColPrediction(0x80) == 0x80);
+
+  ASSERT_TRUE(FirstColPrediction(0x80, 0x7E, 0x70) == 0x72);
+  ASSERT_TRUE(FirstColPrediction(0x80, 0x83, 0x70) == 0x80);
+  ASSERT_TRUE(FirstColPrediction(0x80, 0x6F, 0x70) == 0x70);
+
+  ASSERT_TRUE(BodyPrediction(0x81, 0x80, 0x7E, 0x70) == 0x72);
+  ASSERT_TRUE(BodyPrediction(0x7F, 0x80, 0x83, 0x70) == 0x71);
+  ASSERT_TRUE(BodyPrediction(0x82, 0x80, 0x83, 0x70) == 0x80);
+  ASSERT_TRUE(BodyPrediction(0x6F, 0x80, 0x83, 0x70) == 0x70);
+}
+
+TEST(MT21UtilTest, TestSolidColorBlocks) {
+  GolombRiceTableEntry cache[kGolombRiceCacheSize];
+  PopulateGolombRiceCache(cache);
+  uint8_t buf[64] = {0};
+  uint8_t dest_buf[64] = {0};
+
+  buf[15] = 0xF0;
+  buf[14] = 0x1D;
+  buf[13] = 0xFC;
+  MT21YSubblock y_subblock = {buf, dest_buf};
+  DecompressSubblockHelper(y_subblock, cache);
+  for (size_t i = 0; i < 64; i++) {
+    ASSERT_TRUE(dest_buf[i] == 0x80);
+  }
+
+  MT21UVSubblock uv_subblock = {buf, dest_buf};
+  DecompressSubblockHelper(uv_subblock, cache);
+  for (size_t i = 0; i < 64; i++) {
+    if (i % 2) {
+      ASSERT_TRUE(dest_buf[i] == 0x80);
+    } else {
+      ASSERT_TRUE(dest_buf[i] == 0x7F);
+    }
+  }
+}
+
+TEST(MT21UtilTest, TestCompressedBlocks) {
+  GolombRiceTableEntry cache[kGolombRiceCacheSize];
+  PopulateGolombRiceCache(cache);
+  uint8_t buf[64] = {
+      0x00, 0x00, 0x40, 0x49, 0x01, 0x22, 0x29, 0x02, 0x08, 0x43, 0x41,
+      0x20, 0x02, 0x08, 0x48, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08,
+      0x20, 0x10, 0x80, 0x10, 0x00, 0x84, 0x45, 0x01, 0x08, 0x1B, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  };
+  uint8_t dest_buf[64] = {0};
+  uint8_t expected_buf[64] = {
+      0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD3, 0xD3, 0xD3,
+      0xD3, 0xD3, 0xD3, 0xD2, 0xD2, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD5,
+      0xD5, 0xD5, 0xD5, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD3, 0xD3, 0xD5,
+      0xD5, 0xD5, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6,
+      0xD6, 0xD5, 0xD5, 0xD5, 0xD6, 0xD6, 0xD7, 0xD7, 0xD7, 0xD7, 0xD8,
+      0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD7, 0xD7, 0xD6,
+  };
+
+  MT21YSubblock y_subblock = {buf, dest_buf};
+  DecompressSubblockHelper(y_subblock, cache);
+  for (size_t i = 0; i < 64; i++) {
+    ASSERT_TRUE(dest_buf[i] == expected_buf[i]);
+  }
+}
+
+TEST(MT21UtilTest, TestVectorReadGolombRiceSymbol) {
+  uint32x4_t accumulator[4];
+  uint32x4_t outstanding_reads[4] = {{0}};
+  uint32x4_t escape_codes[4];
+  uint32x4_t escape_binary_len_diff[4];
+  uint32x4_t k_vals[4];
+  uint32x4_t dword_solid_color_mask[4];
+  uint8x16_t solid_color_mask;
+  uint8_t buf[64] = {0};
+  // 001=(k=2)  10000000=(top_right=0x80)
+  buf[63] = 0b00110000;
+  // 00=0  010=1
+  buf[62] = 0b00000010;
+  // 011=-1  1000=2  11111111100000001=-18
+  buf[61] = 0b01110001;
+  buf[60] = 0b11111111;
+  buf[59] = 0b00000001;
+  uint8_t* compressed_ptr[16] = {
+      buf + 60, buf + 60, buf + 60, buf + 60, buf + 60, buf + 60,
+      buf + 60, buf + 60, buf + 60, buf + 60, buf + 60, buf + 60,
+      buf + 60, buf + 60, buf + 60, buf + 60,
+  };
+
+  VectorInitializeAccumulator(accumulator, compressed_ptr);
+
+  uint8x16_t top_right = VectorReadCompressedHeader(
+      accumulator, outstanding_reads, escape_codes, escape_binary_len_diff,
+      k_vals, dword_solid_color_mask, solid_color_mask, compressed_ptr);
+  for (int i = 0; i < 16; i++) {
+    ASSERT_TRUE(top_right[i] == 0x80);
+    ASSERT_TRUE(k_vals[i / 4][i % 4] == 2);
+  }
+
+  uint8x16_t symbol;
+  symbol = VectorReadGolombRiceSymbol(
+      accumulator, outstanding_reads, escape_codes, escape_binary_len_diff,
+      k_vals, dword_solid_color_mask, compressed_ptr);
+  for (int i = 0; i < 16; i++) {
+    ASSERT_TRUE(vreinterpretq_s8_u8(symbol)[i] == 0);
+  }
+  symbol = VectorReadGolombRiceSymbol(
+      accumulator, outstanding_reads, escape_codes, escape_binary_len_diff,
+      k_vals, dword_solid_color_mask, compressed_ptr);
+  for (int i = 0; i < 16; i++) {
+    ASSERT_TRUE(vreinterpretq_s8_u8(symbol)[i] == 1);
+  }
+  symbol = VectorReadGolombRiceSymbol(
+      accumulator, outstanding_reads, escape_codes, escape_binary_len_diff,
+      k_vals, dword_solid_color_mask, compressed_ptr);
+  for (int i = 0; i < 16; i++) {
+    ASSERT_TRUE(vreinterpretq_s8_u8(symbol)[i] == -1);
+  }
+  symbol = VectorReadGolombRiceSymbol(
+      accumulator, outstanding_reads, escape_codes, escape_binary_len_diff,
+      k_vals, dword_solid_color_mask, compressed_ptr);
+  for (int i = 0; i < 16; i++) {
+    ASSERT_TRUE(vreinterpretq_s8_u8(symbol)[i] == 2);
+  }
+  symbol = VectorReadGolombRiceSymbol(
+      accumulator, outstanding_reads, escape_codes, escape_binary_len_diff,
+      k_vals, dword_solid_color_mask, compressed_ptr);
+  for (int i = 0; i < 16; i++) {
+    ASSERT_TRUE(vreinterpretq_s8_u8(symbol)[i] == -18);
+  }
+}
+
+TEST(MT21UtilTest, TestVectorPredictionMethods) {
+  uint8x16_t pred;
+
+  pred = VectorFirstRowPrediction(vdupq_n_u8(0x80));
+  for (int i = 0; i < 16; i++) {
+    ASSERT_TRUE(pred[i] == 0x80);
+  }
+
+  pred = VectorLastColPrediction(vdupq_n_u8(0x80));
+  for (int i = 0; i < 16; i++) {
+    ASSERT_TRUE(pred[i] == 0x80);
+  }
+
+  pred = VectorFirstColPrediction(vdupq_n_u8(0x80), vdupq_n_u8(0x7E),
+                                  vdupq_n_u8(0x70));
+  for (int i = 0; i < 16; i++) {
+    ASSERT_TRUE(pred[i] == 0x72);
+  }
+  pred = VectorFirstColPrediction(vdupq_n_u8(0x80), vdupq_n_u8(0x83),
+                                  vdupq_n_u8(0x70));
+  for (int i = 0; i < 16; i++) {
+    ASSERT_TRUE(pred[i] == 0x80);
+  }
+  pred = VectorFirstColPrediction(vdupq_n_u8(0x80), vdupq_n_u8(0x6F),
+                                  vdupq_n_u8(0x70));
+  for (int i = 0; i < 16; i++) {
+    ASSERT_TRUE(pred[i] == 0x70);
+  }
+
+  pred = VectorBodyPrediction(vdupq_n_u8(0x81), vdupq_n_u8(0x80),
+                              vdupq_n_u8(0x7E), vdupq_n_u8(0x70));
+  for (int i = 0; i < 16; i++) {
+    ASSERT_TRUE(pred[i] == 0x72);
+  }
+  pred = VectorBodyPrediction(vdupq_n_u8(0x7F), vdupq_n_u8(0x80),
+                              vdupq_n_u8(0x83), vdupq_n_u8(0x70));
+  for (int i = 0; i < 16; i++) {
+    ASSERT_TRUE(pred[i] == 0x71);
+  }
+  pred = VectorBodyPrediction(vdupq_n_u8(0x82), vdupq_n_u8(0x80),
+                              vdupq_n_u8(0x83), vdupq_n_u8(0x70));
+  for (int i = 0; i < 16; i++) {
+    ASSERT_TRUE(pred[i] == 0x80);
+  }
+  pred = VectorBodyPrediction(vdupq_n_u8(0x6F), vdupq_n_u8(0x80),
+                              vdupq_n_u8(0x83), vdupq_n_u8(0x70));
+  for (int i = 0; i < 16; i++) {
+    ASSERT_TRUE(pred[i] == 0x70);
+  }
+}
+
+TEST(MT21UtilTest, TestSubblockGather) {
+  uint8_t buf[64] = {
+      48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+      32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+      16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+      0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15,
+  };
+  uint8_t scratch[kMT21ScratchMemorySize] __attribute__((aligned(16)));
+  std::vector<MT21Subblock> subblock_list;
+  uint8_t* compressed_ptr[16];
+
+  for (int i = 0; i < 16; i++) {
+    subblock_list.push_back({buf, nullptr, 64});
+  }
+
+  SubblockGather(subblock_list, 0, scratch, compressed_ptr);
+
+  for (int i = 0; i < 16; i++) {
+    for (int j = 0; j < 64; j++) {
+      ASSERT_TRUE(scratch[1024 + 64 * i + j] == j);
+    }
+  }
+}
+
+TEST(MT21UtilTest, TestSubblockTransposeScatter) {
+  uint8_t buf[256] __attribute__((aligned(16)));
+  uint8_t* src = buf;
+  uint8_t dest_buf[256];
+  uint8_t* decompressed_ptr[16];
+
+  for (int i = 0; i < 16; i++) {
+    decompressed_ptr[i] = dest_buf + 16 * i;
+  }
+
+  for (int i = 0; i < 16; i++) {
+    for (int j = 0; j < 16; j++) {
+      buf[j * 16 + i] = i * 16 + j;
+    }
+  }
+
+  SubblockTransposeScatter(src, decompressed_ptr);
+
+  for (int i = 0; i < 16; i++) {
+    for (int j = 0; j < 16; j++) {
+      ASSERT_TRUE(dest_buf[i * 16 + j] == i * 16 + j);
+    }
+  }
+}
+
+TEST(MT21UtilTest, TestVectorSolidColorBlocks) {
+  uint8_t buf[64] = {0};
+  uint8_t dest_buf[64 * 16] = {0};
+  std::vector<MT21YSubblock> y_subblocks;
+  std::vector<MT21UVSubblock> uv_subblocks;
+  uint8_t scratch[kMT21ScratchMemorySize] __attribute__((aligned(16)));
+
+  buf[15] = 0xF0;
+  buf[14] = 0x1D;
+  buf[13] = 0xFC;
+  for (int i = 0; i < 16; i++) {
+    y_subblocks.push_back({buf, dest_buf + 64 * i, 16});
+    uv_subblocks.push_back({buf, dest_buf + 64 * i, 16});
+  }
+
+  VectorDecompressSubblockHelper<MT21YSubblock>(y_subblocks, 0, scratch);
+  for (int i = 0; i < 64 * 16; i++) {
+    ASSERT_TRUE(dest_buf[i] == 0x80);
+  }
+
+  memset(dest_buf, 0, 64 * 16);
+  VectorDecompressSubblockHelper<MT21UVSubblock>(uv_subblocks, 0, scratch);
+  for (int i = 0; i < 64 * 16; i++) {
+    if (i % 2) {
+      ASSERT_TRUE(dest_buf[i] == 0x80);
+    } else {
+      ASSERT_TRUE(dest_buf[i] == 0x7F);
+    }
+  }
+}
+
+TEST(MT21UtilTest, TestVectorCompressedBlocks) {
+  uint8_t buf[64] = {
+      0x00, 0x00, 0x40, 0x49, 0x01, 0x22, 0x29, 0x02, 0x08, 0x43, 0x41,
+      0x20, 0x02, 0x08, 0x48, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08,
+      0x20, 0x10, 0x80, 0x10, 0x00, 0x84, 0x45, 0x01, 0x08, 0x1B, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  };
+  uint8_t dest_buf[64 * 16] = {0};
+  uint8_t expected_buf[64] = {
+      0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD3, 0xD3, 0xD3,
+      0xD3, 0xD3, 0xD3, 0xD2, 0xD2, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD5,
+      0xD5, 0xD5, 0xD5, 0xD4, 0xD4, 0xD4, 0xD4, 0xD4, 0xD3, 0xD3, 0xD5,
+      0xD5, 0xD5, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6, 0xD6,
+      0xD6, 0xD5, 0xD5, 0xD5, 0xD6, 0xD6, 0xD7, 0xD7, 0xD7, 0xD7, 0xD8,
+      0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD8, 0xD7, 0xD7, 0xD6,
+  };
+  std::vector<MT21YSubblock> y_subblocks;
+  uint8_t scratch[kMT21ScratchMemorySize] __attribute__((aligned(16)));
+
+  for (int i = 0; i < 16; i++) {
+    y_subblocks.push_back({buf, dest_buf + 64 * i, 16});
+  }
+
+  VectorDecompressSubblockHelper<MT21YSubblock>(y_subblocks, 0, scratch);
+  for (int i = 0; i < 64 * 16; i++) {
+    ASSERT_TRUE(dest_buf[i] == expected_buf[i % 64]);
+  }
+}
+
+TEST(MT21UtilTest, TestSubblockBinning) {
+  uint8_t footer[kMT21ScratchMemorySize]
+      __attribute__((aligned(kMT21YFooterAlignment)));
+  footer[0] = 0b00000111;
+  std::vector<MT21YSubblock> bins[2];
+
+  ASSERT_TRUE(ComputeFooterOffset(512, sizeof(footer), kMT21YFooterAlignment) ==
+              0);
+
+  BinSubblocks((const uint8_t*)0xDEADBEEF, footer, (uint8_t*)0xC0FFEE, 0, bins);
+
+  ASSERT_TRUE(bins[0].size() == 1);
+  ASSERT_TRUE(bins[1].size() == 1);
+
+  ASSERT_TRUE((uint64_t)bins[0][0].src == 0xDEADBEEF + 64);
+  ASSERT_TRUE((uint64_t)bins[0][0].dest == 0xC0FFEE + 64);
+  ASSERT_TRUE(bins[0][0].len == 32);
+
+  ASSERT_TRUE((uint64_t)bins[1][0].src == 0xDEADBEEF);
+  ASSERT_TRUE((uint64_t)bins[1][0].dest == 0xC0FFEE);
+  ASSERT_TRUE(bins[1][0].len == 64);
+}
+
+}  // namespace
+}  // namespace media
+
+int main(int argc, char** argv) {
+  base::CommandLine::Init(argc, argv);
+
+  testing::InitGoogleTest(&argc, argv);
+
+  return RUN_ALL_TESTS();
+}
+
+#endif
diff --git a/media/video/av1_video_encoder.cc b/media/video/av1_video_encoder.cc
index f3a1b56f..8b61570 100644
--- a/media/video/av1_video_encoder.cc
+++ b/media/video/av1_video_encoder.cc
@@ -76,7 +76,8 @@
 
   if (opts.bitrate.has_value()) {
     auto& bitrate = opts.bitrate.value();
-    config.rc_target_bitrate = bitrate.target_bps() / 1000;
+    config.rc_target_bitrate =
+        base::saturated_cast<int32_t>(bitrate.target_bps()) / 1000;
     switch (bitrate.mode()) {
       case Bitrate::Mode::kVariable:
         config.rc_end_usage = AOM_VBR;
@@ -359,20 +360,20 @@
   switch (frame->format()) {
     case PIXEL_FORMAT_I420:
       image->planes[AOM_PLANE_Y] =
-          frame->GetWritableVisibleData(VideoFrame::kYPlane);
+          const_cast<uint8_t*>(frame->visible_data(VideoFrame::kYPlane));
       image->planes[AOM_PLANE_U] =
-          frame->GetWritableVisibleData(VideoFrame::kUPlane);
+          const_cast<uint8_t*>(frame->visible_data(VideoFrame::kUPlane));
       image->planes[AOM_PLANE_V] =
-          frame->GetWritableVisibleData(VideoFrame::kVPlane);
+          const_cast<uint8_t*>(frame->visible_data(VideoFrame::kVPlane));
       image->stride[AOM_PLANE_Y] = frame->stride(VideoFrame::kYPlane);
       image->stride[AOM_PLANE_U] = frame->stride(VideoFrame::kUPlane);
       image->stride[AOM_PLANE_V] = frame->stride(VideoFrame::kVPlane);
       break;
     case PIXEL_FORMAT_NV12:
       image->planes[AOM_PLANE_Y] =
-          frame->GetWritableVisibleData(VideoFrame::kYPlane);
+          const_cast<uint8_t*>(frame->visible_data(VideoFrame::kYPlane));
       image->planes[AOM_PLANE_U] =
-          frame->GetWritableVisibleData(VideoFrame::kUVPlane);
+          const_cast<uint8_t*>(frame->visible_data(VideoFrame::kUVPlane));
       image->planes[AOM_PLANE_V] = nullptr;
       image->stride[AOM_PLANE_Y] = frame->stride(VideoFrame::kYPlane);
       image->stride[AOM_PLANE_U] = frame->stride(VideoFrame::kUVPlane);
diff --git a/media/video/openh264_video_encoder.cc b/media/video/openh264_video_encoder.cc
index 9730e66..831de2f0 100644
--- a/media/video/openh264_video_encoder.cc
+++ b/media/video/openh264_video_encoder.cc
@@ -386,9 +386,12 @@
   picture.iPicHeight = frame->visible_rect().height();
   picture.iColorFormat = EVideoFormatType::videoFormatI420;
   picture.uiTimeStamp = frame->timestamp().InMilliseconds();
-  picture.pData[0] = frame->GetWritableVisibleData(VideoFrame::kYPlane);
-  picture.pData[1] = frame->GetWritableVisibleData(VideoFrame::kUPlane);
-  picture.pData[2] = frame->GetWritableVisibleData(VideoFrame::kVPlane);
+  picture.pData[0] =
+      const_cast<uint8_t*>(frame->visible_data(VideoFrame::kYPlane));
+  picture.pData[1] =
+      const_cast<uint8_t*>(frame->visible_data(VideoFrame::kUPlane));
+  picture.pData[2] =
+      const_cast<uint8_t*>(frame->visible_data(VideoFrame::kVPlane));
   picture.iStride[0] = frame->stride(VideoFrame::kYPlane);
   picture.iStride[1] = frame->stride(VideoFrame::kUPlane);
   picture.iStride[2] = frame->stride(VideoFrame::kVPlane);
diff --git a/mojo/core/ipcz_driver/driver.cc b/mojo/core/ipcz_driver/driver.cc
index 1bcb379b..a46754e 100644
--- a/mojo/core/ipcz_driver/driver.cc
+++ b/mojo/core/ipcz_driver/driver.cc
@@ -170,7 +170,7 @@
 
 IpczResult IPCZ_API
 ActivateTransport(IpczDriverHandle transport_handle,
-                  IpczHandle ipcz_transport,
+                  IpczHandle listener,
                   IpczTransportActivityHandler activity_handler,
                   uint32_t flags,
                   const void* options) {
@@ -179,7 +179,7 @@
     return IPCZ_RESULT_INVALID_ARGUMENT;
   }
 
-  transport->Activate(ipcz_transport, activity_handler);
+  transport->Activate(listener, activity_handler);
   return IPCZ_RESULT_OK;
 }
 
diff --git a/net/der/parse_values.cc b/net/der/parse_values.cc
index 1385819..6fa96d8 100644
--- a/net/der/parse_values.cc
+++ b/net/der/parse_values.cc
@@ -115,8 +115,7 @@
       }
       break;
     default:
-      NOTREACHED();
-      return false;
+      NOTREACHED_NORETURN();
   }
   return true;
 }
diff --git a/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc b/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
index d084942..bc714328 100644
--- a/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
+++ b/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
@@ -26,6 +26,7 @@
 #include "base/task/single_thread_task_runner.h"
 #include "base/task/thread_pool.h"
 #include "base/test/bind.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
@@ -46,6 +47,7 @@
 #include "sql/meta_table.h"
 #include "sql/statement.h"
 #include "sql/transaction.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
@@ -213,6 +215,10 @@
   void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); }
 
   void TearDown() override {
+    if (!expect_init_errors_) {
+      EXPECT_THAT(histograms_.GetAllSamples("Cookie.ErrorInitializeDB"),
+                  ::testing::IsEmpty());
+    }
     DestroyStore();
   }
 
@@ -227,6 +233,8 @@
   base::ScopedTempDir temp_dir_;
   scoped_refptr<SQLitePersistentCookieStore> store_;
   std::unique_ptr<CookieCryptor> cookie_crypto_delegate_;
+  base::HistogramTester histograms_;
+  bool expect_init_errors_ = false;
 };
 
 TEST_F(SQLitePersistentCookieStoreTest, TestInvalidMetaTableRecovery) {
@@ -1484,6 +1492,7 @@
   EXPECT_TRUE(set_cookie_callback.result().status.IsInclude());
 
   // Things should commit once going out of scope.
+  expect_init_errors_ = true;
 }
 
 TEST_F(SQLitePersistentCookieStoreTest, Coalescing) {
@@ -1631,6 +1640,32 @@
   db_thread_event_.Signal();
 }
 
+TEST_P(SQLitePersistentCookieStoreExclusiveAccessTest, LockedStoreAlreadyOpen) {
+  base::HistogramTester histograms;
+  base::File file(
+      temp_dir_.GetPath().Append(kCookieFilename),
+      base::File::Flags::FLAG_CREATE | base::File::Flags::FLAG_READ);
+  ASSERT_TRUE(file.IsValid());
+
+  Create(false, false, true /* want current thread to invoke the store. */,
+         /* exclusive access */ ShouldBeExclusive());
+
+  base::RunLoop run_loop;
+  store_->Load(base::BindLambdaForTesting(
+                   [&](CanonicalCookieVector cookies) { run_loop.Quit(); }),
+               NetLogWithSource());
+  run_loop.Run();
+
+  // Note: The non-exclusive path is verified in the TearDown for the fixture.
+  if (ShouldBeExclusive()) {
+    expect_init_errors_ = true;
+    histograms.ExpectUniqueSample("Cookie.ErrorInitializeDB",
+                                  sql::SqliteLoggedResultCode::kCantOpen, 1);
+    histograms.ExpectUniqueSample("Cookie.WinGetLastErrorInitializeDB",
+                                  ERROR_SHARING_VIOLATION, 1);
+  }
+}
+
 INSTANTIATE_TEST_SUITE_P(All,
                          SQLitePersistentCookieStoreExclusiveAccessTest,
                          ::testing::Bool(),
@@ -1640,6 +1675,25 @@
 
 #endif  // BUILDFLAG(IS_WIN)
 
+TEST_F(SQLitePersistentCookieStoreTest, CorruptStore) {
+  base::HistogramTester histograms;
+  base::WriteFile(temp_dir_.GetPath().Append(kCookieFilename),
+                  "SQLite format 3 foobarfoobarfoobar");
+
+  Create(false, false, true /* want current thread to invoke the store. */,
+         false);
+
+  base::RunLoop run_loop;
+  store_->Load(base::BindLambdaForTesting(
+                   [&](CanonicalCookieVector cookies) { run_loop.Quit(); }),
+               NetLogWithSource());
+  run_loop.Run();
+
+  expect_init_errors_ = true;
+  histograms.ExpectUniqueSample("Cookie.ErrorInitializeDB",
+                                sql::SqliteLoggedResultCode::kNotADatabase, 1);
+}
+
 bool CreateV10Schema(sql::Database* db) {
   sql::MetaTable meta_table;
   if (!meta_table.Init(db, /* version = */ 10,
diff --git a/net/extras/sqlite/sqlite_persistent_store_backend_base.cc b/net/extras/sqlite/sqlite_persistent_store_backend_base.cc
index 11c98da..726ec48 100644
--- a/net/extras/sqlite/sqlite_persistent_store_backend_base.cc
+++ b/net/extras/sqlite/sqlite_persistent_store_backend_base.cc
@@ -18,6 +18,10 @@
 #include "sql/database.h"
 #include "sql/error_delegate_util.h"
 
+#if BUILDFLAG(IS_WIN)
+#include <windows.h>
+#endif  // BUILDFLAG(IS_WIN)
+
 namespace net {
 
 SQLitePersistentStoreBackendBase::SQLitePersistentStoreBackendBase(
@@ -262,6 +266,15 @@
 
   corruption_detected_ = true;
 
+  if (!initialized_) {
+    sql::UmaHistogramSqliteResult(histogram_tag_ + ".ErrorInitializeDB", error);
+
+#if BUILDFLAG(IS_WIN)
+    base::UmaHistogramSparse(histogram_tag_ + ".WinGetLastErrorInitializeDB",
+                             ::GetLastError());
+#endif  // BUILDFLAG(IS_WIN)
+  }
+
   // Don't just do the close/delete here, as we are being called by |db| and
   // that seems dangerous.
   // TODO(shess): Consider just calling RazeAndPoison() immediately.
diff --git a/net/third_party/quiche/BUILD.gn b/net/third_party/quiche/BUILD.gn
index 095fa54b..8e00a660 100644
--- a/net/third_party/quiche/BUILD.gn
+++ b/net/third_party/quiche/BUILD.gn
@@ -1853,6 +1853,8 @@
   visibility = [ ":quiche_tests" ]
   testonly = true
   sources = [
+    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.cc",
+    "src/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/proto_utils.h",
     "src/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.cc",
     "src/quiche/blind_sign_auth/anonymous_tokens/cpp/testing/utils.h",
     "src/quiche/blind_sign_auth/test_tools/mock_blind_sign_auth_interface.h",
diff --git a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.0.png b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.0.png
index 6b06d62..bc129eb 100644
--- a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.0.png
+++ b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.0.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.1.png b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.1.png
index 0bc5fd5..648ac9f 100644
--- a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.1.png
+++ b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.1.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.5.png b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.5.png
index 62ce13d..c18ad0e 100644
--- a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.5.png
+++ b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.5.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.6.png b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.6.png
index 6a15f769..b4bd3c70 100644
--- a/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.6.png
+++ b/pdf/test/data/thumbnail/1.0x/variable_page_sizes_expected_skia.pdf.6.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.0.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.0.png
index 44e83ef..20f8ac70 100644
--- a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.0.png
+++ b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.0.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.1.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.1.png
index 3f2f782..f763009 100644
--- a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.1.png
+++ b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.1.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.3.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.3.png
index 44f213d..5252f88 100644
--- a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.3.png
+++ b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.3.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.4.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.4.png
index 7a44a52..6308281 100644
--- a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.4.png
+++ b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.4.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.5.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.5.png
index 62ce13d..c18ad0e 100644
--- a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.5.png
+++ b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.5.png
Binary files differ
diff --git a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.6.png b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.6.png
index 6a15f769..b4bd3c70 100644
--- a/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.6.png
+++ b/pdf/test/data/thumbnail/2.0x/variable_page_sizes_expected_skia.pdf.6.png
Binary files differ
diff --git a/services/data_decoder/public/cpp/android/BUILD.gn b/services/data_decoder/public/cpp/android/BUILD.gn
index c09d7e62..00793ef 100644
--- a/services/data_decoder/public/cpp/android/BUILD.gn
+++ b/services/data_decoder/public/cpp/android/BUILD.gn
@@ -18,7 +18,8 @@
       "//base:jni_java",
       "//build/android:build_java",
     ]
-    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
+
+    srcjar_deps = [ ":safe_json_jni_headers" ]
     sources = [] + _jni_sources
   }
 }
diff --git a/services/device/generic_sensor/BUILD.gn b/services/device/generic_sensor/BUILD.gn
index dacdaa57..845dfd1 100644
--- a/services/device/generic_sensor/BUILD.gn
+++ b/services/device/generic_sensor/BUILD.gn
@@ -158,7 +158,7 @@
   ]
 
   generate_jni("jni_headers") {
-    visibility = [ ":generic_sensor" ]
+    visibility = [ ":*" ]
 
     sources = device_sensors_jni_sources
   }
@@ -169,6 +169,7 @@
       "//services/device:*",
     ]
 
+    srcjar_deps = [ ":jni_headers" ]
     sources = device_sensors_jni_sources
     deps = [
       "//base:base_java",
@@ -177,6 +178,5 @@
       "//services/device/public/mojom:generic_sensor_java",
       "//third_party/androidx:androidx_annotation_annotation_java",
     ]
-    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   }
 }
diff --git a/services/device/usb/BUILD.gn b/services/device/usb/BUILD.gn
index 2def015..92073bb 100644
--- a/services/device/usb/BUILD.gn
+++ b/services/device/usb/BUILD.gn
@@ -240,6 +240,7 @@
   }
 
   android_library("java") {
+    srcjar_deps = [ ":jni_headers" ]
     sources = java_sources_needing_jni
     deps = [
       "//base:base_java",
@@ -247,6 +248,5 @@
       "//build/android:build_java",
       "//third_party/androidx:androidx_annotation_annotation_java",
     ]
-    annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   }
 }
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index 04a55a8..a2dc017 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -233,8 +233,6 @@
 
 #define SK_ENABLE_SKSL_IN_RASTER_PIPELINE
 
-#define SK_USE_INACCURATE_DIV255_IN_BLEND
-
 #define SK_USE_LEGACY_DROPSHADOW_IMAGEFILTER
 
 #define SK_USE_LEGACY_DISPLACEMENT_MAP_IMAGEFILTER
diff --git a/sql/sqlite_result_code.cc b/sql/sqlite_result_code.cc
index 66dbd21..57fce23f 100644
--- a/sql/sqlite_result_code.cc
+++ b/sql/sqlite_result_code.cc
@@ -6,6 +6,7 @@
 
 #include <ostream>  // Needed to compile NOTREACHED() with operator <<.
 #include <set>
+#include <string>
 #include <utility>
 
 #include "base/check_op.h"
@@ -397,7 +398,7 @@
   return logged_code;
 }
 
-void UmaHistogramSqliteResult(const char* histogram_name,
+void UmaHistogramSqliteResult(const std::string& histogram_name,
                               int sqlite_result_code) {
   auto logged_code = ToSqliteLoggedResultCode(sqlite_result_code);
   base::UmaHistogramEnumeration(histogram_name, logged_code);
diff --git a/sql/sqlite_result_code.h b/sql/sqlite_result_code.h
index ec9d868..35b2b35 100644
--- a/sql/sqlite_result_code.h
+++ b/sql/sqlite_result_code.h
@@ -6,6 +6,7 @@
 #define SQL_SQLITE_RESULT_CODE_H_
 
 #include <iosfwd>
+#include <string>
 
 #include "base/component_export.h"
 #include "base/dcheck_is_on.h"
@@ -83,7 +84,7 @@
 // Works for all result codes, including success codes and extended error codes.
 // DCHECKs if provided result code should not occur in Chrome's usage of SQLite.
 COMPONENT_EXPORT(SQL)
-void UmaHistogramSqliteResult(const char* histogram_name,
+void UmaHistogramSqliteResult(const std::string& histogram_name,
                               int sqlite_result_code);
 
 // Converts a SQLite result code into a UMA logging-friendly form.
diff --git a/testing/buildbot/chromium.fuchsia.fyi.json b/testing/buildbot/chromium.fuchsia.fyi.json
index b870b04f..9abeaf3d 100644
--- a/testing/buildbot/chromium.fuchsia.fyi.json
+++ b/testing/buildbot/chromium.fuchsia.fyi.json
@@ -1065,7 +1065,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1082,7 +1082,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1099,7 +1099,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1119,7 +1119,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1136,7 +1136,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1153,7 +1153,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1170,7 +1170,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1187,7 +1187,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1204,7 +1204,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1221,7 +1221,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1238,7 +1238,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1255,7 +1255,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1272,7 +1272,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1289,7 +1289,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1306,7 +1306,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1323,7 +1323,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -1341,7 +1341,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1363,7 +1363,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1380,7 +1380,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -1398,7 +1398,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1418,7 +1418,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1435,7 +1435,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1452,7 +1452,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1469,7 +1469,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1486,7 +1486,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1506,7 +1506,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1523,7 +1523,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1540,7 +1540,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1557,7 +1557,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1577,7 +1577,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1594,7 +1594,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1611,7 +1611,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1628,7 +1628,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1645,7 +1645,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1662,7 +1662,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1679,7 +1679,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1696,7 +1696,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1713,7 +1713,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1730,7 +1730,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1747,7 +1747,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1764,7 +1764,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1781,7 +1781,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1801,7 +1801,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -1822,7 +1822,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1839,7 +1839,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1859,7 +1859,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1876,7 +1876,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1896,7 +1896,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1913,7 +1913,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1930,7 +1930,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1947,7 +1947,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1964,7 +1964,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1981,7 +1981,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2001,7 +2001,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2018,7 +2018,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2035,7 +2035,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2055,7 +2055,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2075,7 +2075,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2095,7 +2095,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2112,7 +2112,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2132,7 +2132,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2149,7 +2149,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2166,7 +2166,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2183,7 +2183,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2200,7 +2200,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2226,7 +2226,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2249,7 +2249,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2266,7 +2266,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2283,7 +2283,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2300,7 +2300,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2317,7 +2317,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2334,7 +2334,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2351,7 +2351,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2368,7 +2368,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2385,7 +2385,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2402,7 +2402,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2419,7 +2419,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2436,7 +2436,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2453,7 +2453,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2470,7 +2470,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2487,7 +2487,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2504,7 +2504,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -2522,7 +2522,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2544,7 +2544,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2561,7 +2561,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -2579,7 +2579,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2596,7 +2596,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2613,7 +2613,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2630,7 +2630,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2647,7 +2647,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2664,7 +2664,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2681,7 +2681,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2698,7 +2698,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2715,7 +2715,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2732,7 +2732,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2749,7 +2749,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2766,7 +2766,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2783,7 +2783,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2800,7 +2800,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2817,7 +2817,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2834,7 +2834,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2851,7 +2851,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2868,7 +2868,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2885,7 +2885,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2902,7 +2902,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2919,7 +2919,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2936,7 +2936,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2953,7 +2953,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2973,7 +2973,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -2994,7 +2994,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3011,7 +3011,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3028,7 +3028,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3045,7 +3045,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3065,7 +3065,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3082,7 +3082,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3099,7 +3099,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3116,7 +3116,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3133,7 +3133,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3150,7 +3150,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3170,7 +3170,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3187,7 +3187,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3204,7 +3204,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3224,7 +3224,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3244,7 +3244,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3264,7 +3264,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3281,7 +3281,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3301,7 +3301,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3318,7 +3318,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3335,7 +3335,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3352,7 +3352,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3369,7 +3369,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3394,7 +3394,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.fuchsia.json b/testing/buildbot/chromium.fuchsia.json
index e92421a..df7c637 100644
--- a/testing/buildbot/chromium.fuchsia.json
+++ b/testing/buildbot/chromium.fuchsia.json
@@ -3679,7 +3679,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3696,7 +3696,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3713,7 +3713,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3730,7 +3730,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3747,7 +3747,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3764,7 +3764,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3781,7 +3781,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3798,7 +3798,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3815,7 +3815,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3832,7 +3832,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3849,7 +3849,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3866,7 +3866,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3883,7 +3883,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3900,7 +3900,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3917,7 +3917,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3934,7 +3934,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -3952,7 +3952,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3974,7 +3974,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3991,7 +3991,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -4009,7 +4009,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4033,7 +4033,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -4051,7 +4051,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4068,7 +4068,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4085,7 +4085,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4102,7 +4102,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4119,7 +4119,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4136,7 +4136,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4153,7 +4153,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4170,7 +4170,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4187,7 +4187,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4204,7 +4204,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4221,7 +4221,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4238,7 +4238,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4255,7 +4255,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4272,7 +4272,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4289,7 +4289,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4306,7 +4306,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4323,7 +4323,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4340,7 +4340,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4357,7 +4357,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4374,7 +4374,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4391,7 +4391,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4408,7 +4408,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4428,7 +4428,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -4449,7 +4449,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4466,7 +4466,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4483,7 +4483,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4500,7 +4500,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4520,7 +4520,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4537,7 +4537,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4554,7 +4554,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4571,7 +4571,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4588,7 +4588,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4605,7 +4605,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4625,7 +4625,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4642,7 +4642,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4659,7 +4659,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4679,7 +4679,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4699,7 +4699,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4719,7 +4719,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4736,7 +4736,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4756,7 +4756,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4773,7 +4773,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4790,7 +4790,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4807,7 +4807,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4824,7 +4824,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4849,7 +4849,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4881,7 +4881,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4913,7 +4913,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4945,7 +4945,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "idempotent": false,
@@ -4978,7 +4978,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "idempotent": false,
@@ -5011,7 +5011,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "idempotent": false,
@@ -5053,7 +5053,7 @@
           "dimension_sets": [
             {
               "kvm": "1",
-              "os": "Ubuntu-18.04"
+              "os": "Ubuntu-22.04"
             }
           ],
           "idempotent": false,
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index a7f6ec0..e84b31ec 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -988,7 +988,8 @@
             }
           ],
           "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
         },
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       },
diff --git a/testing/buildbot/chromium.gpu.json b/testing/buildbot/chromium.gpu.json
index e4dae96d..a6aefada 100644
--- a/testing/buildbot/chromium.gpu.json
+++ b/testing/buildbot/chromium.gpu.json
@@ -311,7 +311,8 @@
             }
           ],
           "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
         },
         "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
       },
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 36cd0e8..57f4ace 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -4083,6 +4083,24 @@
       'linux-code-coverage',
     ],
   },
+  'trace_test': {
+    'modifications': {
+      # The browser is restarted after every test in this suite, which includes
+      # re-applying permissions. Nexus 5Xs are very slow to apply permissions
+      # compared to other devices, so increase sharding to offset the increased
+      # runtime.
+      'Android FYI Release (Nexus 5X)': {
+        'swarming': {
+          'shards': 2,
+        },
+      },
+      'Android Release (Nexus 5X)': {
+        'swarming': {
+          'shards': 2,
+        },
+      },
+    },
+  },
   'unit_tests': {
     'remove_from': [
       'android-pie-arm64-rel',  # https://crbug.com/1010211
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 1a3b3ad..fac99e9 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -2844,7 +2844,7 @@
         'browser_config': 'web-engine-shell',
         'os_type': 'fuchsia',
         'mixins': [
-          'linux-bionic',
+          'linux-jammy',
         ],
         'swarming': {
           'dimension_sets': [
@@ -2881,7 +2881,7 @@
       },
       'fuchsia-fyi-x64-asan': {
         'mixins': [
-          'linux-bionic',
+          'linux-jammy',
         ],
         'swarming': {
           'dimension_sets': [
@@ -2900,7 +2900,7 @@
           'all',
         ],
         'mixins': [
-          'linux-bionic',
+          'linux-jammy',
         ],
         'swarming': {
           'dimension_sets': [
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 6a1ac98..60af4977 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -6785,6 +6785,13 @@
                     "enable_features": [
                         "HttpsUpgrades"
                     ]
+                },
+                {
+                    "name": "EnabledWithHttpsFirstModeForEngagedSites",
+                    "enable_features": [
+                        "HttpsFirstModeV2ForEngagedSites",
+                        "HttpsUpgrades"
+                    ]
                 }
             ]
         }
diff --git a/third_party/abseil-cpp/symbols_arm64_dbg.def b/third_party/abseil-cpp/symbols_arm64_dbg.def
index 882ee3c..86fc0592 100644
--- a/third_party/abseil-cpp/symbols_arm64_dbg.def
+++ b/third_party/abseil-cpp/symbols_arm64_dbg.def
@@ -684,18 +684,12 @@
     ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@_K@Z
     ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@@01@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@_K@Z
     ??$__allocate_at_least@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAVFormatArgImpl@str_format_internal@absl@@@01@AEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@_K@Z
-    ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z
-    ??$__assign_with_size@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_J@Z
-    ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z
-    ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z
+    ??$__append@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z
+    ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z
     ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z
     ??$__construct_node_hash@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z
     ??$__construct_one_at_end@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ
     ??$__construct_one_at_end@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ
@@ -795,6 +789,7 @@
     ??$__distance@PEBUPayload@status_internal@absl@@@__Cr@std@@YA_JPEBUPayload@status_internal@absl@@0Urandom_access_iterator_tag@01@@Z
     ??$__distance@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0Urandom_access_iterator_tag@01@@Z
     ??$__distance@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0Urandom_access_iterator_tag@01@@Z
+    ??$__distance@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA_JV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0Urandom_access_iterator_tag@01@@Z
     ??$__distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z
     ??$__distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z
     ??$__distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z
@@ -957,7 +952,7 @@
     ??$__validate_iter_reference@AEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@__Cr@std@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ
     ??$advance@PEBUTransition@cctz@time_internal@absl@@_J@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z
     ??$advance@PEBUTransition@cctz@time_internal@absl@@_J_JX@__Cr@std@@YAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z
-    ??$advance@PEBVFormatArgImpl@str_format_internal@absl@@_J_JX@__Cr@std@@YAXAEAPEBVFormatArgImpl@str_format_internal@absl@@_J@Z
+    ??$advance@PEBVFormatArgImpl@str_format_internal@absl@@_K_KX@__Cr@std@@YAXAEAPEBVFormatArgImpl@str_format_internal@absl@@_K@Z
     ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
     ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z
     ??$assign@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z
@@ -1019,7 +1014,6 @@
     ??$construct_at@UViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@AEA_KPEAU123@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV501@AEA_K@Z
     ??$copy@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@__Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEBV234@0PEAV234@@Z
     ??$copy@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0V201@@Z
-    ??$copy_n@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@_JV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@_JV201@@Z
     ??$countl_zero@_K@absl@@YAH_K@Z
     ??$countr_zero@I@absl@@YAHI@Z
     ??$countr_zero@_K@absl@@YAH_K@Z
@@ -1055,6 +1049,7 @@
     ??$distance@PEBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA_JPEBUTransition@cctz@time_internal@absl@@0@Z
     ??$distance@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0@Z
     ??$distance@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0@Z
+    ??$distance@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA_JV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0@Z
     ??$distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z
     ??$distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z
     ??$distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0@Z
@@ -1189,7 +1184,6 @@
     ??$move_backward@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z
     ??$next@AEAPEBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAPEBUTransition@cctz@time_internal@absl@@AEAPEBU3456@_J@Z
     ??$next@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@_J@Z
-    ??$next@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@_J@Z
     ??$reset@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z
     ??$rotr@I@absl@@YAIIH@Z
     ??$rotr@_K@absl@@YA_K_KH@Z
diff --git a/third_party/abseil-cpp/symbols_arm64_rel.def b/third_party/abseil-cpp/symbols_arm64_rel.def
index 249c9c1..fdef613 100644
--- a/third_party/abseil-cpp/symbols_arm64_rel.def
+++ b/third_party/abseil-cpp/symbols_arm64_rel.def
@@ -151,19 +151,18 @@
     ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@_K@Z
     ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@@01@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@_K@Z
     ??$__allocate_at_least@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAVFormatArgImpl@str_format_internal@absl@@@01@AEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@_K@Z
-    ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z
-    ??$__assign_with_size@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_J@Z
-    ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z
+    ??$__append@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z
+    ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z
+    ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z
+    ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z
+    ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z
     ??$__destroy_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@@Z
     ??$__destroy_at@UPayload@status_internal@absl@@$0A@@__Cr@std@@YAXPEAUPayload@status_internal@absl@@@Z
     ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z
     ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z
     ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z
     ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByCivilTime@Transition@cctz@time_internal@absl@@PEBU5678@PEBU5678@U5678@U__identity@23@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@$$QEAUByCivilTime@2345@$$QEAU__identity@01@@Z
+    ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
     ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z
     ??$assign@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z
     ??$combine@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@H@?$HashStateBase@VMixingHashState@hash_internal@absl@@@hash_internal@absl@@SA?AVMixingHashState@12@V312@AEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBH@Z
diff --git a/third_party/abseil-cpp/symbols_x64_dbg.def b/third_party/abseil-cpp/symbols_x64_dbg.def
index 97e28070..e416166 100644
--- a/third_party/abseil-cpp/symbols_x64_dbg.def
+++ b/third_party/abseil-cpp/symbols_x64_dbg.def
@@ -683,18 +683,12 @@
     ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUTransitionType@cctz@time_internal@absl@@@01@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@_K@Z
     ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAUViableSubstitution@strings_internal@absl@@@01@AEAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@_K@Z
     ??$__allocate_at_least@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PEAVFormatArgImpl@str_format_internal@absl@@@01@AEAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@_K@Z
-    ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z
-    ??$__assign_with_size@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_J@Z
-    ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z
-    ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z
+    ??$__append@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z
+    ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z
     ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z
     ??$__construct_node_hash@AEBUpiecewise_construct_t@__Cr@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QEAV?$tuple@$$V@12@@Z
     ??$__construct_one_at_end@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ
     ??$__construct_one_at_end@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXXZ
@@ -794,6 +788,7 @@
     ??$__distance@PEBUPayload@status_internal@absl@@@__Cr@std@@YA_JPEBUPayload@status_internal@absl@@0Urandom_access_iterator_tag@01@@Z
     ??$__distance@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0Urandom_access_iterator_tag@01@@Z
     ??$__distance@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0Urandom_access_iterator_tag@01@@Z
+    ??$__distance@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA_JV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0Urandom_access_iterator_tag@01@@Z
     ??$__distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z
     ??$__distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z
     ??$__distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z
@@ -956,7 +951,7 @@
     ??$__validate_iter_reference@AEAV?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@__Cr@std@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ
     ??$advance@PEBUTransition@cctz@time_internal@absl@@_J@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z
     ??$advance@PEBUTransition@cctz@time_internal@absl@@_J_JX@__Cr@std@@YAXAEAPEBUTransition@cctz@time_internal@absl@@_J@Z
-    ??$advance@PEBVFormatArgImpl@str_format_internal@absl@@_J_JX@__Cr@std@@YAXAEAPEBVFormatArgImpl@str_format_internal@absl@@_J@Z
+    ??$advance@PEBVFormatArgImpl@str_format_internal@absl@@_K_KX@__Cr@std@@YAXAEAPEBVFormatArgImpl@str_format_internal@absl@@_K@Z
     ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
     ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z
     ??$assign@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z
@@ -1018,7 +1013,6 @@
     ??$construct_at@UViableSubstitution@strings_internal@absl@@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV456@AEA_KPEAU123@@__Cr@std@@YAPEAUViableSubstitution@strings_internal@absl@@PEAU234@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@AEBV501@AEA_K@Z
     ??$copy@PEBVFormatArgImpl@str_format_internal@absl@@PEAV123@@__Cr@std@@YAPEAVFormatArgImpl@str_format_internal@absl@@PEBV234@0PEAV234@@Z
     ??$copy@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0V201@@Z
-    ??$copy_n@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@_JV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@_JV201@@Z
     ??$countl_zero@I@absl@@YAHI@Z
     ??$countl_zero@_K@absl@@YAH_K@Z
     ??$countr_zero@I@absl@@YAHI@Z
@@ -1055,6 +1049,7 @@
     ??$distance@PEBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SA_JPEBUTransition@cctz@time_internal@absl@@0@Z
     ??$distance@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YA_JPEBUTransition@cctz@time_internal@absl@@0@Z
     ??$distance@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YA_JPEBVFormatArgImpl@str_format_internal@absl@@0@Z
+    ??$distance@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@__Cr@std@@YA_JV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@01@0@Z
     ??$distance@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z
     ??$distance@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z
     ??$distance@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA_JV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@01@0@Z
@@ -1189,7 +1184,6 @@
     ??$move_backward@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@__Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z
     ??$next@AEAPEBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAPEBUTransition@cctz@time_internal@absl@@AEAPEBU3456@_J@Z
     ??$next@PEBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@_J@Z
-    ??$next@PEBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAPEBVFormatArgImpl@str_format_internal@absl@@PEBV234@_J@Z
     ??$reset@PEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@?$unique_ptr@$$BY0A@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QEAAXPEAPEAU?$__hash_node_base@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PEAX@__Cr@std@@@12@@Z
     ??$rotr@I@absl@@YAIIH@Z
     ??$rotr@_K@absl@@YA_K_KH@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel.def b/third_party/abseil-cpp/symbols_x64_rel.def
index ccf52cf..e6f0436 100644
--- a/third_party/abseil-cpp/symbols_x64_rel.def
+++ b/third_party/abseil-cpp/symbols_x64_rel.def
@@ -138,13 +138,11 @@
     ??$StrFormat@DHHHHH_JIV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HPEBDV123@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@str_format_internal@0@AEBDAEBH2222AEB_JAEBIAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@2AEBQEBD5@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@3@@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@2@@Z
-    ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z
-    ??$__assign_with_size@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_J@Z
-    ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z
+    ??$__append@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z
+    ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z
+    ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z
+    ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z
+    ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_one_at_end@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV312@AEA_K@Z
     ??$__destroy_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAXPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@@Z
     ??$__destroy_at@UPayload@status_internal@absl@@$0A@@__Cr@std@@YAXPEAUPayload@status_internal@absl@@@Z
@@ -159,6 +157,7 @@
     ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z
     ??$__unwrap_and_dispatch@U?$__overload@U?$__copy_loop@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@U__copy_trivial@23@@__Cr@std@@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU4567@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@$0A@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z
     ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByCivilTime@Transition@cctz@time_internal@absl@@PEBU5678@PEBU5678@U5678@U__identity@23@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@$$QEAUByCivilTime@2345@$$QEAU__identity@01@@Z
+    ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
     ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z
     ??$assign@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z
     ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel_asan.def b/third_party/abseil-cpp/symbols_x64_rel_asan.def
index 276c597d..9856f9a3 100644
--- a/third_party/abseil-cpp/symbols_x64_rel_asan.def
+++ b/third_party/abseil-cpp/symbols_x64_rel_asan.def
@@ -137,14 +137,12 @@
     ??$StrFormat@DHHHHH_JIV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@HPEBDV123@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@AEBV?$FormatSpecTemplate@$0BPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0JPPPL@$0IAAAE@$0JPPPL@$0EAAAE@$0IAAAE@@str_format_internal@0@AEBDAEBH2222AEB_JAEBIAEBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@2AEBQEBD5@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@23@AEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@3@@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@V123@@__Cr@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@2@@Z
-    ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_K@Z
-    ??$__assign_with_size@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_J@Z
-    ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@_J@Z
-    ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@PEBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@_K@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@_K@Z
+    ??$__append@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z
+    ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z
+    ??$__construct_at_end@V?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@AEAV?$allocator@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z
+    ??$__construct_at_end@V?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@AEAV?$allocator@PEAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAPEAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z
+    ??$__construct_at_end@V?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AEAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransition@cctz@time_internal@absl@@@12@0@Z
+    ??$__construct_at_end@V?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AEAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$move_iterator@PEAUTransitionType@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_one_at_end@AEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@AEBV123@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@12@AEBV312@AEA_K@Z
     ??$__construct_one_at_end@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z
     ??$__construct_one_at_end@AEBQEAVLogSink@absl@@@?$vector@PEAVLogSink@absl@@V?$allocator@PEAVLogSink@absl@@@__Cr@std@@@__Cr@std@@AEAAXAEBQEAVLogSink@absl@@@Z
@@ -164,6 +162,7 @@
     ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AEAAX_K@Z
     ??$__unwrap_and_dispatch@U?$__overload@U?$__copy_loop@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@U__copy_trivial@23@@__Cr@std@@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@PEBU4567@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@23@$0A@@__Cr@std@@YA?AU?$pair@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@__Cr@std@@@01@PEBUPrefixCrc@CrcCordState@crc_internal@absl@@0V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEAU1234@AEAU1234@PEAPEAU1234@_J$0A@@01@@Z
     ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByCivilTime@Transition@cctz@time_internal@absl@@PEBU5678@PEBU5678@U5678@U__identity@23@@__Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@$$QEAUByCivilTime@2345@$$QEAU__identity@01@@Z
+    ??$assign@PEBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXPEBVFormatArgImpl@str_format_internal@absl@@0@Z
     ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QEAAXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PEBU1234@AEBU1234@PEBQEBU1234@_J$0A@@12@0PEAX@Z
     ??$assign@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@optional_internal@absl@@IEAAX$$QEAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z
     ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PEAU123@@__Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@AEBUpiecewise_construct_t@01@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QEAV?$tuple@$$V@01@@Z
diff --git a/third_party/abseil-cpp/symbols_x86_dbg.def b/third_party/abseil-cpp/symbols_x86_dbg.def
index fb921ae2..918099c 100644
--- a/third_party/abseil-cpp/symbols_x86_dbg.def
+++ b/third_party/abseil-cpp/symbols_x86_dbg.def
@@ -679,18 +679,12 @@
     ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAUTransitionType@cctz@time_internal@absl@@@01@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@I@Z
     ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAUViableSubstitution@strings_internal@absl@@@01@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@I@Z
     ??$__allocate_at_least@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAVFormatArgImpl@str_format_internal@absl@@@01@AAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@I@Z
-    ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@I@Z
-    ??$__assign_with_size@PBVFormatArgImpl@str_format_internal@absl@@PBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPBVFormatArgImpl@str_format_internal@absl@@0H@Z
-    ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@H@Z
-    ??$__construct_at_end@PBVFormatArgImpl@str_format_internal@absl@@PBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPBVFormatArgImpl@str_format_internal@absl@@0I@Z
+    ??$__append@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@0PAX@Z
+    ??$__construct_at_end@PBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPBVFormatArgImpl@str_format_internal@absl@@0I@Z
     ??$__construct_at_end@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@0@Z
     ??$__construct_at_end@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@0@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@I@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@I@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@I@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@I@Z
     ??$__construct_node_hash@ABUpiecewise_construct_t@__Cr@std@@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAE?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@23@@12@IABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z
     ??$__construct_one_at_end@$$V@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXXZ
     ??$__construct_one_at_end@$$V@?$vector@UTransitionType@cctz@time_internal@absl@@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXXZ
@@ -790,6 +784,7 @@
     ??$__distance@PBUPayload@status_internal@absl@@@__Cr@std@@YAHPBUPayload@status_internal@absl@@0Urandom_access_iterator_tag@01@@Z
     ??$__distance@PBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAHPBUTransition@cctz@time_internal@absl@@0Urandom_access_iterator_tag@01@@Z
     ??$__distance@PBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAHPBVFormatArgImpl@str_format_internal@absl@@0Urandom_access_iterator_tag@01@@Z
+    ??$__distance@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@__Cr@std@@YAHV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0Urandom_access_iterator_tag@01@@Z
     ??$__distance@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z
     ??$__distance@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z
     ??$__distance@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@01@0Urandom_access_iterator_tag@01@@Z
@@ -952,7 +947,7 @@
     ??$__validate_iter_reference@AAV?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@__Cr@std@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXXZ
     ??$advance@PBUTransition@cctz@time_internal@absl@@H@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAXAAPBUTransition@cctz@time_internal@absl@@H@Z
     ??$advance@PBUTransition@cctz@time_internal@absl@@HHX@__Cr@std@@YAXAAPBUTransition@cctz@time_internal@absl@@H@Z
-    ??$advance@PBVFormatArgImpl@str_format_internal@absl@@HHX@__Cr@std@@YAXAAPBVFormatArgImpl@str_format_internal@absl@@H@Z
+    ??$advance@PBVFormatArgImpl@str_format_internal@absl@@IIX@__Cr@std@@YAXAAPBVFormatArgImpl@str_format_internal@absl@@I@Z
     ??$assign@PBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPBVFormatArgImpl@str_format_internal@absl@@0@Z
     ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@0PAX@Z
     ??$assign@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@optional_internal@absl@@IAEX$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z
@@ -1014,7 +1009,6 @@
     ??$construct_at@UViableSubstitution@strings_internal@absl@@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@ABV456@AAIPAU123@@__Cr@std@@YAPAUViableSubstitution@strings_internal@absl@@PAU234@AAV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@01@ABV501@AAI@Z
     ??$copy@PBVFormatArgImpl@str_format_internal@absl@@PAV123@@__Cr@std@@YAPAVFormatArgImpl@str_format_internal@absl@@PBV234@0PAV234@@Z
     ??$copy@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0V201@@Z
-    ??$copy_n@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@HV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@23@@__Cr@std@@YA?AV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PAU1234@AAU1234@PAPAU1234@H$0A@@01@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@HV201@@Z
     ??$countl_zero@I@absl@@YAHI@Z
     ??$countl_zero@_K@absl@@YAH_K@Z
     ??$countr_zero@I@absl@@YAHI@Z
@@ -1051,6 +1045,7 @@
     ??$distance@PBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAHPBUTransition@cctz@time_internal@absl@@0@Z
     ??$distance@PBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAHPBUTransition@cctz@time_internal@absl@@0@Z
     ??$distance@PBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAHPBVFormatArgImpl@str_format_internal@absl@@0@Z
+    ??$distance@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@__Cr@std@@YAHV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@01@0@Z
     ??$distance@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@01@0@Z
     ??$distance@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@01@0@Z
     ??$distance@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YAHV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@01@0@Z
@@ -1183,7 +1178,6 @@
     ??$move_backward@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@__Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@00@Z
     ??$next@AAPBUTransition@cctz@time_internal@absl@@@?$_IterOps@U_ClassicAlgPolicy@__Cr@std@@@__Cr@std@@SAPBUTransition@cctz@time_internal@absl@@AAPBU3456@H@Z
     ??$next@PBUTransition@cctz@time_internal@absl@@@__Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@H@Z
-    ??$next@PBVFormatArgImpl@str_format_internal@absl@@@__Cr@std@@YAPBVFormatArgImpl@str_format_internal@absl@@PBV234@H@Z
     ??$reset@PAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@?$unique_ptr@$$BY0A@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@V?$__bucket_list_deallocator@V?$allocator@PAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@@__Cr@std@@@23@@__Cr@std@@QAEXPAPAU?$__hash_node_base@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@12@@Z
     ??$rotr@I@absl@@YAIIH@Z
     ??$rotr@_K@absl@@YA_K_KH@Z
diff --git a/third_party/abseil-cpp/symbols_x86_rel.def b/third_party/abseil-cpp/symbols_x86_rel.def
index 4b85bf2..2f1f5b3 100644
--- a/third_party/abseil-cpp/symbols_x86_rel.def
+++ b/third_party/abseil-cpp/symbols_x86_rel.def
@@ -148,19 +148,18 @@
     ??$__allocate_at_least@V?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAUTransitionType@cctz@time_internal@absl@@@01@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@01@I@Z
     ??$__allocate_at_least@V?$allocator@UViableSubstitution@strings_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAUViableSubstitution@strings_internal@absl@@@01@AAV?$allocator@UViableSubstitution@strings_internal@absl@@@01@I@Z
     ??$__allocate_at_least@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@YA?AU?$__allocation_result@PAVFormatArgImpl@str_format_internal@absl@@@01@AAV?$allocator@VFormatArgImpl@str_format_internal@absl@@@01@I@Z
-    ??$__append_with_size@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@I@Z
-    ??$__assign_with_size@PBVFormatArgImpl@str_format_internal@absl@@PBV123@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXPBVFormatArgImpl@str_format_internal@absl@@0H@Z
-    ??$__assign_with_size_random_access@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@H@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@I@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@I@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@I@Z
-    ??$__construct_at_end_with_size@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@I@Z
+    ??$__append@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@AAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@0PAX@Z
+    ??$__construct_at_end@V?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@PAPBVImpl@time_zone@cctz@time_internal@absl@@AAV?$allocator@PAPBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@@12@0@Z
+    ??$__construct_at_end@V?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@?$__split_buffer@PAUPrefixCrc@CrcCordState@crc_internal@absl@@AAV?$allocator@PAUPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAPAUPrefixCrc@CrcCordState@crc_internal@absl@@@12@0@Z
+    ??$__construct_at_end@V?$move_iterator@PAUTransition@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransition@cctz@time_internal@absl@@AAV?$allocator@UTransition@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransition@cctz@time_internal@absl@@@12@0@Z
+    ??$__construct_at_end@V?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@__Cr@std@@@?$__split_buffer@UTransitionType@cctz@time_internal@absl@@AAV?$allocator@UTransitionType@cctz@time_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$move_iterator@PAUTransitionType@cctz@time_internal@absl@@@12@0@Z
     ??$__destroy_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@$0A@@__Cr@std@@YAXPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@@Z
     ??$__destroy_at@UPayload@status_internal@absl@@$0A@@__Cr@std@@YAXPAUPayload@status_internal@absl@@@Z
     ??$__do_rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXI@Z
     ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@QAE?AU?$pair@V?$__hash_iterator@PAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@PAX@__Cr@std@@@__Cr@std@@_N@12@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@12@ABUpiecewise_construct_t@12@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@12@$$QAV?$tuple@$$V@12@@Z
     ??$__rehash@$00@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@@23@@__Cr@std@@AAEXI@Z
     ??$__upper_bound@U_ClassicAlgPolicy@__Cr@std@@UByCivilTime@Transition@cctz@time_internal@absl@@PBU5678@PBU5678@U5678@U__identity@23@@__Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@$$QAUByCivilTime@2345@$$QAU__identity@01@@Z
+    ??$assign@PBVFormatArgImpl@str_format_internal@absl@@$0A@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXPBVFormatArgImpl@str_format_internal@absl@@0@Z
     ??$assign@V?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@__Cr@std@@@?$deque@UPrefixCrc@CrcCordState@crc_internal@absl@@V?$allocator@UPrefixCrc@CrcCordState@crc_internal@absl@@@__Cr@std@@@__Cr@std@@QAEXV?$__deque_iterator@UPrefixCrc@CrcCordState@crc_internal@absl@@PBU1234@ABU1234@PBQBU1234@H$0A@@12@0PAX@Z
     ??$assign@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@?$optional_data_base@V?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@optional_internal@absl@@IAEX$$QAV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@Z
     ??$construct_at@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@__Cr@std@@ABUpiecewise_construct_t@23@V?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@23@V?$tuple@$$V@23@PAU123@@__Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@PAU201@ABUpiecewise_construct_t@01@$$QAV?$tuple@ABV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@@01@$$QAV?$tuple@$$V@01@@Z
diff --git a/third_party/blink/renderer/core/accessibility/ax_object_cache.h b/third_party/blink/renderer/core/accessibility/ax_object_cache.h
index f993586..194382b 100644
--- a/third_party/blink/renderer/core/accessibility/ax_object_cache.h
+++ b/third_party/blink/renderer/core/accessibility/ax_object_cache.h
@@ -54,7 +54,6 @@
 class HTMLTableElement;
 class HTMLFrameOwnerElement;
 class HTMLSelectElement;
-class LayoutBlockFlow;
 class LayoutRect;
 class LocalFrameView;
 class NGAbstractInlineTextBox;
@@ -116,8 +115,6 @@
   // Called by a node when text or a text equivalent (e.g. alt) attribute is
   // changed.
   virtual void TextChanged(const LayoutObject*) = 0;
-  // Called when the NGOffsetMapping is invalidated for the given object.
-  virtual void TextOffsetsChanged(const LayoutBlockFlow*) = 0;
   virtual void DocumentTitleChanged() = 0;
   // Called when a layout tree for a node has just been attached, so we can make
   // sure we have the right subclass of AXObject.
diff --git a/third_party/blink/renderer/core/editing/editing_behavior.h b/third_party/blink/renderer/core/editing/editing_behavior.h
index 2b59714..cea818e 100644
--- a/third_party/blink/renderer/core/editing/editing_behavior.h
+++ b/third_party/blink/renderer/core/editing/editing_behavior.h
@@ -40,11 +40,13 @@
   // can control it here.
 
   // When extending a selection beyond the top or bottom boundary of an editable
-  // area, maintain the horizontal position on Windows and Android but extend it
-  // to the boundary of the editable content on Mac and Linux.
+  // area, maintain the horizontal position on Windows, Android and ChromeOS but
+  // extend it to the boundary of the editable content on Mac and Linux.
   bool ShouldMoveCaretToHorizontalBoundaryWhenPastTopOrBottom() const {
     return type_ != mojom::blink::EditingBehavior::kEditingWindowsBehavior &&
-           type_ != mojom::blink::EditingBehavior::kEditingAndroidBehavior;
+           type_ != mojom::blink::EditingBehavior::kEditingAndroidBehavior &&
+           !(type_ == mojom::blink::EditingBehavior::kEditingChromeOSBehavior &&
+             RuntimeEnabledFeatures::TouchTextEditingRedesignEnabled());
   }
 
   bool ShouldSelectReplacement() const {
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.cc
index 588a5bf..f87687b 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.cc
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.cc
@@ -122,6 +122,7 @@
 GridItemData::GridItemData(
     NGBlockNode node,
     const ComputedStyle& root_grid_style,
+    FontBaseline parent_grid_font_baseline,
     bool parent_must_consider_grid_items_for_column_sizing,
     bool parent_must_consider_grid_items_for_row_sizing)
     : node(node),
@@ -132,7 +133,8 @@
       is_sizing_dependent_on_block_size(false),
       is_subgridded_to_parent_grid(false),
       must_consider_grid_items_for_column_sizing(false),
-      must_consider_grid_items_for_row_sizing(false) {
+      must_consider_grid_items_for_row_sizing(false),
+      parent_grid_font_baseline(parent_grid_font_baseline) {
   const auto& style = node.Style();
 
   const bool is_replaced = node.IsReplaced();
@@ -198,7 +200,7 @@
   // The `false, true, false, true` parameters get the converter to calculate
   // whether the subgrids and its root grid are opposite direction in all cases.
   const LogicalToLogical<bool> direction_converter(
-      style.GetWritingDirection(), root_grid_style.GetWritingDirection(),
+      style.GetWritingDirection(), root_grid_writing_direction,
       /* inline_start */ false, /* inline_end */ true,
       /* block_start */ false, /* block_end */ true);
 
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h
index 6d45f68..fc8eb01 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h
@@ -34,6 +34,7 @@
 
   GridItemData(NGBlockNode node,
                const ComputedStyle& root_grid_style,
+               FontBaseline parent_grid_font_baseline,
                bool parent_must_consider_grid_items_for_column_sizing = false,
                bool parent_must_consider_grid_items_for_row_sizing = false);
 
@@ -233,6 +234,8 @@
   bool must_consider_grid_items_for_column_sizing : 1;
   bool must_consider_grid_items_for_row_sizing : 1;
 
+  FontBaseline parent_grid_font_baseline;
+
   AxisEdge inline_axis_alignment;
   AxisEdge block_axis_alignment;
 
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
index 333fc6a..599fbfe 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.cc
@@ -1021,29 +1021,33 @@
               : margins.block_start);
 }
 
-}  // namespace
+LayoutUnit GetLogicalBaseline(const GridItemData& grid_item,
+                              const NGBoxFragment& baseline_fragment,
+                              GridTrackSizingDirection track_direction) {
+  const auto font_baseline = grid_item.parent_grid_font_baseline;
 
-LayoutUnit NGGridLayoutAlgorithm::GetLogicalBaseline(
-    const NGBoxFragment& baseline_fragment,
-    const bool is_last_baseline) const {
-  const auto font_baseline = Style().GetFontBaseline();
-  return is_last_baseline
+  return grid_item.IsLastBaselineSpecified(track_direction)
              ? baseline_fragment.BlockSize() -
                    baseline_fragment.LastBaselineOrSynthesize(font_baseline)
              : baseline_fragment.FirstBaselineOrSynthesize(font_baseline);
 }
 
-LayoutUnit NGGridLayoutAlgorithm::GetSynthesizedLogicalBaseline(
-    const LayoutUnit block_size,
-    const bool is_flipped_lines,
-    const bool is_last_baseline) const {
-  const auto font_baseline = Style().GetFontBaseline();
+LayoutUnit GetSynthesizedLogicalBaseline(
+    const GridItemData& grid_item,
+    LayoutUnit block_size,
+    GridTrackSizingDirection track_direction) {
   const auto synthesized_baseline = NGBoxFragment::SynthesizedBaseline(
-      font_baseline, is_flipped_lines, block_size);
-  return is_last_baseline ? block_size - synthesized_baseline
-                          : synthesized_baseline;
+      grid_item.parent_grid_font_baseline,
+      grid_item.BaselineWritingDirection(track_direction).IsFlippedLines(),
+      block_size);
+
+  return grid_item.IsLastBaselineSpecified(track_direction)
+             ? block_size - synthesized_baseline
+             : synthesized_baseline;
 }
 
+}  // namespace
+
 LayoutUnit NGGridLayoutAlgorithm::ContributionSizeForGridItem(
     const NGGridSizingSubtree& sizing_subtree,
     GridItemContributionType contribution_type,
@@ -1139,9 +1143,7 @@
 
     if (grid_item->IsBaselineAligned(track_direction)) {
       CalculateBaselineShim(GetSynthesizedLogicalBaseline(
-          content_size,
-          grid_item->BaselineWritingDirection(track_direction).IsFlippedLines(),
-          grid_item->IsLastBaselineSpecified(track_direction)));
+          *grid_item, content_size, track_direction));
     }
     return content_size + baseline_shim;
   };
@@ -1191,9 +1193,8 @@
         To<NGPhysicalBoxFragment>(result->PhysicalFragment()));
 
     if (grid_item->IsBaselineAligned(track_direction)) {
-      CalculateBaselineShim(GetLogicalBaseline(
-          baseline_fragment,
-          grid_item->IsLastBaselineSpecified(track_direction)));
+      CalculateBaselineShim(
+          GetLogicalBaseline(*grid_item, baseline_fragment, track_direction));
     }
     return baseline_fragment.BlockSize() + baseline_shim;
   };
@@ -1587,10 +1588,9 @@
         ComputeMarginsFor(space, item_style, baseline_writing_direction),
         subgridded_item, track_direction, writing_mode);
 
-    const bool is_last_baseline =
-        grid_item.IsLastBaselineSpecified(track_direction);
     const LayoutUnit baseline =
-        extra_margin + GetLogicalBaseline(baseline_fragment, is_last_baseline);
+        extra_margin +
+        GetLogicalBaseline(grid_item, baseline_fragment, track_direction);
 
     // "If a box spans multiple shared alignment contexts, then it participates
     //  in first/last baseline alignment within its start-most/end-most shared
@@ -3505,9 +3505,7 @@
       // and its track baseline.
       const LayoutUnit baseline_delta =
           Baseline(layout_data, grid_item, track_direction) -
-          GetLogicalBaseline(
-              baseline_fragment,
-              grid_item.IsLastBaselineSpecified(track_direction));
+          GetLogicalBaseline(grid_item, baseline_fragment, track_direction);
       if (grid_item.BaselineGroup(track_direction) == BaselineGroup::kMajor)
         return baseline_delta;
 
@@ -4050,7 +4048,8 @@
     DCHECK(child.IsOutOfFlowPositioned());
 
     absl::optional<LogicalRect> containing_block_rect;
-    GridItemData out_of_flow_item(child, container_style);
+    GridItemData out_of_flow_item(child, container_style,
+                                  container_style.GetFontBaseline());
 
     // TODO(layout-dev): If the below ends up being removed (as a result of
     // [1]), we could likely implement some of the same optimizations as OOFs in
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h
index 73cdf2c..4b1531c 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_layout_algorithm.h
@@ -18,8 +18,6 @@
 
 namespace blink {
 
-class NGBoxFragment;
-
 // This enum corresponds to each step used to accommodate grid items across
 // intrinsic tracks according to their min and max track sizing functions, as
 // defined in https://drafts.csswg.org/css-grid-2/#algo-spanning-items.
@@ -88,12 +86,6 @@
 
   LayoutUnit ComputeIntrinsicBlockSizeIgnoringChildren() const;
 
-  LayoutUnit GetLogicalBaseline(const NGBoxFragment&,
-                                const bool is_last_baseline) const;
-  LayoutUnit GetSynthesizedLogicalBaseline(const LayoutUnit block_size,
-                                           const bool is_flipped_lines,
-                                           const bool is_last_baseline) const;
-
   // Returns the size that a grid item will distribute across the tracks with an
   // intrinsic sizing function it spans in the relevant track direction.
   LayoutUnit ContributionSizeForGridItem(
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.cc
index 93a77d0f1..6567feb 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.cc
@@ -17,7 +17,8 @@
     const NGGridPlacementData& placement_data,
     HeapVector<Member<LayoutBox>>* oof_children,
     bool* has_nested_subgrid) const {
-  return ConstructGridItems(placement_data, Style(),
+  return ConstructGridItems(placement_data, /* root_grid_style */ Style(),
+                            /* parent_grid_style */ Style(),
                             placement_data.HasStandaloneAxis(kForColumns),
                             placement_data.HasStandaloneAxis(kForRows),
                             oof_children, has_nested_subgrid);
@@ -26,6 +27,7 @@
 GridItems NGGridNode::ConstructGridItems(
     const NGGridPlacementData& placement_data,
     const ComputedStyle& root_grid_style,
+    const ComputedStyle& parent_grid_style,
     bool must_consider_grid_items_for_column_sizing,
     bool must_consider_grid_items_for_row_sizing,
     HeapVector<Member<LayoutBox>>* oof_children,
@@ -65,6 +67,7 @@
 
       auto grid_item = std::make_unique<GridItemData>(
           To<NGBlockNode>(child), root_grid_style,
+          parent_grid_style.GetFontBaseline(),
           must_consider_grid_items_for_column_sizing,
           must_consider_grid_items_for_row_sizing);
 
@@ -121,7 +124,7 @@
     const auto subgrid = To<NGGridNode>(current_item.node);
 
     auto subgridded_items = subgrid.ConstructGridItems(
-        subgrid.CachedPlacementData(), root_grid_style,
+        subgrid.CachedPlacementData(), root_grid_style, subgrid.Style(),
         current_item.must_consider_grid_items_for_column_sizing,
         current_item.must_consider_grid_items_for_row_sizing);
 
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.h
index 6755132c..f2a2f1ce 100644
--- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.h
+++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_node.h
@@ -32,6 +32,7 @@
   GridItems ConstructGridItems(
       const NGGridPlacementData& placement_data,
       const ComputedStyle& root_grid_style,
+      const ComputedStyle& parent_grid_style,
       bool must_consider_grid_items_for_column_sizing,
       bool must_consider_grid_items_for_row_sizing,
       HeapVector<Member<LayoutBox>>* oof_children = nullptr,
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
index c5fe4e4..d2b2dd7 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
@@ -81,9 +81,8 @@
                       const NGColumnSpannerPath* column_spanner_path) {
     if (!column_spanner_path) {
       const TextWrap text_wrap = block_style.GetTextWrap();
-      if (UNLIKELY(text_wrap == TextWrap::kPretty ||
-                   text_wrap == TextWrap::kBalance)) {
-        initiate_balancing_ = text_wrap == TextWrap::kBalance && !break_token;
+      initiate_balancing_ = text_wrap == TextWrap::kBalance && !break_token;
+      if (UNLIKELY(initiate_balancing_ || text_wrap == TextWrap::kPretty)) {
         score_line_break_context_ = context->ScoreLineBreakContext();
         use_score_line_break_ =
             score_line_break_context_ && score_line_break_context_->IsActive();
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_score_line_breaker_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_score_line_breaker_test.cc
index 359e954..3b2d6c65 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_score_line_breaker_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_score_line_breaker_test.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_score_line_breaker.h"
 
+#include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_line_break_point.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_line_info_list.h"
@@ -127,6 +128,37 @@
   EXPECT_EQ(count, target_num_lines - NGLineInfoList::kCapacity);
 }
 
+TEST_F(NGScoreLineBreakerTest, BalanceMaxLinesExceeded) {
+  ScopedCSSTextWrapBalanceByScoreForTest balance_by_score(true);
+  LoadAhem();
+  SetBodyInnerHTML(R"HTML(
+    <!DOCTYPE html>
+    <style>
+    #target {
+      font-family: Ahem;
+      font-size: 10px;
+      width: 10ch;
+      text-wrap: balance;
+    }
+    </style>
+    <div id="target">
+      123 56 89 123 56 89
+      123 56 89 123 56 89
+      123 56 89 123 56 89
+      123 56 89 123 56 89
+      123 56 89 123 56 89
+      X
+    </div>
+  )HTML");
+  const LayoutBlockFlow* target = GetLayoutBlockFlowByElementId("target");
+  NGInlineCursor cursor(*target);
+  cursor.MoveToLastLine();
+  cursor.MoveToNext();
+  // Neitehr `balance` nor `pretty` should be applied.
+  EXPECT_EQ(cursor.Current()->Type(), NGFragmentItem::kText);
+  EXPECT_EQ(cursor.Current()->TextLength(), 1u);
+}
+
 class BlockInInlineTest : public NGScoreLineBreakerTest,
                           public testing::WithParamInterface<int> {};
 INSTANTIATE_TEST_SUITE_P(NGScoreLineBreakerTest,
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc
index fdf315ef..64a83e2 100644
--- a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc
+++ b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc
@@ -7,7 +7,6 @@
 #include <memory>
 #include <utility>
 
-#include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/editing/editing_utilities.h"
 #include "third_party/blink/renderer/core/editing/position_with_affinity.h"
@@ -73,14 +72,6 @@
 void LayoutNGBlockFlowMixin<Base>::ResetNGInlineNodeData() {
   Base::CheckIsNotDestroyed();
   ng_inline_node_data_ = MakeGarbageCollected<NGInlineNodeData>();
-
-  // The offset_mapping determines the PlainText() output of text nodes,
-  // and depends non-locally on children inside the block flow. For example
-  // whitespace collapsing may happen or not based on the presence of a sibling
-  // inline object.
-  if (AXObjectCache* cache = Base::GetDocument().ExistingAXObjectCache()) {
-    cache->TextOffsetsChanged(this);
-  }
 }
 
 template <typename Base>
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
index 729e8bb..129f22b 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
@@ -481,7 +481,8 @@
                                          const LogicalSize& size)
       -> NGOutOfFlowLayoutPart::ContainingBlockInfo {
     const auto& grid_style = containing_grid.StyleRef();
-    GridItemData grid_item(candidate.Node(), grid_style);
+    GridItemData grid_item(candidate.Node(), grid_style,
+                           grid_style.GetFontBaseline());
 
     return {grid_style.GetWritingDirection(),
             NGGridLayoutAlgorithm::ComputeOutOfFlowItemContainingRect(
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 87fe946..e24dc151 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
@@ -1552,18 +1552,6 @@
     return;
 
   if (notify_parent && !has_been_disposed_) {
-    // Eagerly mark the cached parent's dirty bits (in addition to scheduling a
-    // children-changed notification to happen later, which is what calling
-    // ChildrenChangedOnAncestorOf() does). That way, if a different clean
-    // layout callback happens after Detach() is called but before,
-    // ChildrenChangedOnAncestorOf(), it won't accidentally walk into a detached
-    // subtree.
-    if (AXObject* parent = obj->CachedParentObject()) {
-      if (!parent->IsDetached()) {
-        parent->SetNeedsToUpdateChildren();
-      }
-    }
-
     ChildrenChangedOnAncestorOf(obj);
   }
 
@@ -2050,31 +2038,6 @@
   MarkAXObjectDirty(ax_object);
 }
 
-void AXObjectCacheImpl::TextOffsetsChanged(const LayoutBlockFlow* block_flow) {
-  if (AXObject* obj = Get(block_flow)) {
-    DeferTreeUpdate(&AXObjectCacheImpl::TextOffsetsChangedWithCleanLayout, obj);
-  }
-}
-
-void AXObjectCacheImpl::TextOffsetsChangedWithCleanLayout(Node*,
-                                                          AXObject* obj) {
-  DCHECK(obj);
-  if (obj->IsDetached()) {
-    return;
-  }
-#if DCHECK_IS_ON()
-  Document* document = obj->GetDocument();
-  DCHECK(document->Lifecycle().GetState() >= DocumentLifecycle::kLayoutClean)
-      << "Unclean document at lifecycle " << document->Lifecycle().ToString();
-#endif  // DCHECK_IS_ON()
-
-  // Text changing for a block flow invalidates all of the
-  // text strings for children, such as via LayoutObject::GetName().
-  if (obj->AccessibilityIsIncludedInTree()) {
-    MarkAXSubtreeDirtyWithCleanLayout(obj);
-  }
-}
-
 void AXObjectCacheImpl::TextChanged(Node* node) {
   if (!node)
     return;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
index 96587f2..92a0af0 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -192,10 +192,6 @@
   // changed.
   void TextChanged(const LayoutObject*) override;
   void TextChangedWithCleanLayout(Node* optional_node, AXObject*);
-
-  void TextOffsetsChanged(const LayoutBlockFlow*) override;
-  void TextOffsetsChangedWithCleanLayout(Node*, AXObject*);
-
   void FocusableChangedWithCleanLayout(Element* element);
   void DocumentTitleChanged() override;
   // Called when a layout tree for a node has just been attached, so we can make
diff --git a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
index 0c747d2..2b11c71a 100644
--- a/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
+++ b/third_party/blink/renderer/modules/accessibility/inspector_accessibility_agent.cc
@@ -1236,9 +1236,8 @@
       AXObject* descendant = reachable.back();
       reachable.pop_back();
       DCHECK(descendant->AccessibilityIsIncludedInTree());
-      if (!MarkAXObjectDirty(descendant)) {
+      if (!MarkAXObjectDirty(descendant))
         continue;
-      }
       const AXObject::AXObjectVector& children =
           descendant->ChildrenIncludingIgnored();
       reachable.AppendRange(children.rbegin(), children.rend());
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests
index f5af64b..9570940 100644
--- a/third_party/blink/web_tests/NeverFixTests
+++ b/third_party/blink/web_tests/NeverFixTests
@@ -92,6 +92,7 @@
 crbug.com/613672 [ Mac ] compositing/gestures/gesture-tapHighlight-lines-and-float-in-multicol.html [ Skip ]
 crbug.com/613672 [ Mac ] external/wpt/pointerevents/coalesced_events_attributes_under_load.html?touch [ Skip ]
 crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html?touch [ Skip ]
+crbug.com/613672 [ Mac ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Skip ]
 crbug.com/613672 [ Mac ] fast/events/pointerevents/multi-pointer-event-in-slop-region.html [ Skip ]
 crbug.com/613672 [ Mac ] fast/events/pointerevents/pointer-event-in-slop-region.html [ Skip ]
 crbug.com/613672 [ Mac ] fast/events/touch/gesture/* [ Skip ]
@@ -1968,4 +1969,4 @@
 crbug.com/1446931 [ Android ] inspector-protocol/heap-profiler/heap-snapshot-exposes-cpp-internals.js [ Skip ]
 crbug.com/1446931 [ Fuchsia ] inspector-protocol/heap-profiler/heap-snapshot-exposes-cpp-internals.js [ Skip ]
 crbug.com/1446931 [ Mac ] inspector-protocol/heap-profiler/heap-snapshot-exposes-cpp-internals.js [ Skip ]
-crbug.com/1446931 [ Win ] inspector-protocol/heap-profiler/heap-snapshot-exposes-cpp-internals.js [ Skip ]
\ No newline at end of file
+crbug.com/1446931 [ Win ] inspector-protocol/heap-profiler/heap-snapshot-exposes-cpp-internals.js [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index c5b6421..5cc7cfd4 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -2867,15 +2867,10 @@
 crbug.com/626703 external/wpt/css/css-fonts/parsing/font-variant-invalid.html [ Crash ]
 
 # ====== New tests from wpt-importer added here ======
-crbug.com/626703 [ Mac13-arm64 ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Pass Timeout ]
 crbug.com/626703 [ Mac13 ] virtual/keepalive-in-browser-migration/external/wpt/fetch/api/response/response-clone.any.serviceworker.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-fonts/separators.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-nesting/nesting-type-selector.html [ Failure ]
 crbug.com/626703 [ Mac12 ] external/wpt/fetch/api/cors/cors-keepalive.any.html [ Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Timeout ]
-crbug.com/626703 [ Mac11 ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Timeout ]
-crbug.com/626703 [ Mac12 ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Timeout ]
-crbug.com/626703 [ Mac13 ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Timeout ]
 crbug.com/626703 [ Mac11 ] virtual/keepalive-in-browser-migration/external/wpt/fetch/api/cors/cors-keepalive.any.html [ Timeout ]
 crbug.com/626703 [ Mac13 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/scroll-timeline-range-animation.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-color/oklab-009.html [ Failure ]
@@ -3525,7 +3520,6 @@
 
 # [css-subgrid]
 crbug.com/618969 external/wpt/css/css-grid/subgrid/line-names-007.html [ Failure ]
-crbug.com/618969 external/wpt/css/css-grid/subgrid/subgrid-baseline-002.html [ Failure ]
 
 # [css-animations]
 
@@ -5557,7 +5551,7 @@
 crbug.com/1296449 [ Linux Release ] external/wpt/workers/SharedWorker-MessageEvent-source.any.sharedworker.html [ Crash Failure Pass Timeout ]
 
 # Sheriff 2022-04-20
-crbug.com/1253971 external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-parts-structure.tentative.html [ Timeout Crash ]
+crbug.com/1253971 [ Mac ] external/wpt/html/semantics/forms/the-selectmenu-element/selectmenu-parts-structure.tentative.html [ Timeout ]
 
 # Sheriff 2022-04-21
 crbug.com/1318318 external/wpt/fetch/local-network-access/service-worker-background-fetch.https.window.html [ Failure Pass Timeout ]
@@ -6692,15 +6686,10 @@
 crbug.com/1453965 [ Mac12-arm64 ] external/wpt/webgl/uniformMatrixNfv.html [ Failure Pass ]
 crbug.com/1453965 [ Mac13-arm64 ] external/wpt/webgl/uniformMatrixNfv.html [ Failure Pass ]
 crbug.com/1453977 [ Linux ] fast/events/touch/gesture/gesture-tap-paragraph-end.html [ Failure Pass ]
-crbug.com/1453982 [ Mac ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html [ Failure Pass ]
 crbug.com/1454064 [ Linux ] fast/events/autoscroll-should-not-stop-on-keypress.html [ Failure Pass ]
 crbug.com/1454070 [ Linux ] fast/css/inline-outline-with-border-radius-outset.html [ Failure Pass ]
 
-crbug.com/1453272 http/tests/devtools/indexeddb/database-refresh-view.js [ Failure Pass Timeout ]
-
 # Gardener 2023-06-13
-crbug.com/1453982 [ Mac11-arm64 ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Pass Timeout ]
-crbug.com/1453982 [ Mac12-arm64 ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Pass Timeout ]
 crbug.com/1450287 [ Mac13-arm64 ] virtual/scalefactor200/external/wpt/largest-contentful-paint/multiple-redirects-TAO.html [ Failure Pass ]
 crbug.com/1454498 fast/forms/accent-color/radio-accent-color-hover-dark-appearance.html [ Failure Pass ]
 crbug.com/1422685 [ Mac11-arm64 ] fast/canvas-api/offscreencanvas.transferrable-webgl-exception.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/css3/blending/background-blend-mode-image-svg-expected.png b/third_party/blink/web_tests/css3/blending/background-blend-mode-image-svg-expected.png
index d83fa9c..b97f0cf 100644
--- a/third_party/blink/web_tests/css3/blending/background-blend-mode-image-svg-expected.png
+++ b/third_party/blink/web_tests/css3/blending/background-blend-mode-image-svg-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/css3/blending/effect-background-blend-mode-stacking-expected.png b/third_party/blink/web_tests/css3/blending/effect-background-blend-mode-stacking-expected.png
index e0c31a1..5803b1ed 100644
--- a/third_party/blink/web_tests/css3/blending/effect-background-blend-mode-stacking-expected.png
+++ b/third_party/blink/web_tests/css3/blending/effect-background-blend-mode-stacking-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/README.md b/third_party/blink/web_tests/external/wpt/window-placement/README.md
index d9e324c..e96a8a0 100644
--- a/third_party/blink/web_tests/external/wpt/window-placement/README.md
+++ b/third_party/blink/web_tests/external/wpt/window-placement/README.md
@@ -1,5 +1,7 @@
 # Window Management Testing
 
-[Window Management Specification](https://w3c.github.io/window-placement/)
+[Window Management Specification](https://w3c.github.io/window-management/)
 
-The tests in this directory require at least 2 displays on the host machine to yield meaningful results. A well-supported configuration is 2 displays at 1920x1080 resolution arranged horizonally (primary on the left, secondary on the right).
+The tests in this directory require at least 2 displays on the host machine to
+yield meaningful results. An example configuration is 2 displays with 1920x1080
+resolution arranged horizontally (primary on the left, secondary on the right).
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/fullscreen-companion-window-manual.tentative.https.html b/third_party/blink/web_tests/external/wpt/window-placement/fullscreen-companion-window-manual.tentative.https.html
index 10f30a19..a4b09f3d 100644
--- a/third_party/blink/web_tests/external/wpt/window-placement/fullscreen-companion-window-manual.tentative.https.html
+++ b/third_party/blink/web_tests/external/wpt/window-placement/fullscreen-companion-window-manual.tentative.https.html
@@ -1,76 +1,54 @@
 <!DOCTYPE html>
-<meta charset="utf-8">
 <meta name="timeout" content="long">
 <!-- user agents are not required to support open features other than `noopener`
      and on some platforms position and size features don't make sense -->
 <meta name="flags" content="may">
-<title>Multi-Screen Window Management test: Fullscreen Companion Window</title>
-<link rel="help" href="https://w3c.github.io/window-placement/">
-This test uses multi-screen details to request fullscreen and open a pop-up<br>
-(companion window) in the same user activation.<br>
-It runs manually with `wpt serve` and a compatible browser.<br><br>
-<button id="setUpButton">Request screen details</button>
-<ul id="popupButtons"></ul>
-<button id="cleanUpButton">Close any open popups</button><br>
-<input id="autoCleanUp" type="checkbox" checked=true>Auto-close popups</input>
-<ul id="logger"></ul>
+<title>Window Management test: Fullscreen Companion Window</title>
+<link rel="help" href="https://w3c.github.io/window-management/">
+Tests use of multi-screen details to enter fullscreen and open a 'companion'
+popup window in the same user activation.<br>
+The host device must have 2+ screens to yield meaningful results.<br><br>
+<button id="closeButton" onclick="closePopups">Close popups</button><br>
+<input id="autoClose" type="checkbox" checked=true>Auto-close popups</input>
+<ul id="list"></ul>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/resources/testdriver.js"></script>
 <script src="/resources/testdriver-vendor.js"></script>
 <script src="resources/helpers.js"></script>
-
 <script>
 'use strict';
+
 let popups = [];
-
-cleanUpButton.addEventListener('click', async () => {
+function closePopups() {
   popups.forEach(p => p.close());
-});
-
-// expectPopup should be true if the test should expect the pop-up to be
-// created, or false if the popup is not expected to be created (blocked).
-async function testPopupOnScreen(popupTest, screen, expectPopup) {
-  // Show a popup child window on the associated screen.
-  const left = screen.availLeft + Math.floor(screen.availWidth / 2) - 150;
-  const top = screen.availTop + Math.floor(screen.availHeight / 2) - 50;
-  log(`Opening a popup on '${screen.label}' at (${left}, ${top})`);
-  let popup = window.open(
-      '/resources/blank.html', '',
-      `left=${left},top=${top},width=300,height=100`);
-  assert_equals(!!popup, expectPopup, 'Popup reference');
-  if (popup === null)
-    return;
-  assert_equals(!popup.closed, expectPopup, 'Popup open');
-  popups.push(popup);
-  if (autoCleanUp.checked) {
-    // TODO(crbug.com/1338645): Remove this workaround (delay) after browser code is
-    // fixed.
-    popupTest.add_cleanup(()=>{
-      setTimeout(popup.close, 1000);
-    });
-  }
+  popups = [];
 }
 
 promise_test(async setUpTest => {
-  await setUpWindowManagement(setUpTest, setUpButton);
-  const screenDetails = await getScreenDetails();
-  assert_true(!!screenDetails, 'Error getting screen details');
-  for (const [i, fullscreenScreen] of screenDetails.screens.entries()) {
-    const popupScreen =
-      screenDetails.screens[(i + 1) % screenDetails.screens.length];
-    let testName =
-      `Fullscreen on '${fullscreenScreen.label}' and open popup on '${popupScreen.label}'`;
-    promise_test(async popupTest => {
-      await addTestTriggerButtonAndAwaitClick(popupButtons,
-        testName,
-        popupTest);
-      await document.documentElement.requestFullscreen(
-        { screen: fullscreenScreen }
-      );
-      await testPopupOnScreen(popupTest, popupScreen,
-                             /*expectPopup=*/screenDetails.screens.length > 1);
-    }, testName);
+  await setUpWindowManagement(setUpTest);
+  const screens = window.screenDetails.screens;
+  const originalScreen = window.screenDetails.currentScreen;
+  for (const [i, screenA] of screens.entries()) {
+    const screenB = screens[(i + 1) % screens.length];
+    let name = `Fullscreen on '${screenA.label}'; popup on '${screenB.label}'`;
+    promise_test(async test => {
+      await buttonClick(test, name);
+      await document.documentElement.requestFullscreen({ screen: screenA });
+      await assertWindowOnScreen(window, screenA);
+      // Expect the popup to open if multiple screens are available.
+      const assertPlacement = screens.length > 1;
+      const popup = await openPopupOnScreen(screenB, assertPlacement);
+      if (!!popup)
+        popups.push(popup);
+      // Exit fullscreen; `window` should move back to `originalScreen`.
+      await buttonClick(test, `Exit fullscreen`);
+      await document.exitFullscreen();
+      await assertWindowOnScreen(window, originalScreen);
+      assert_false(!!document.fullscreenElement);
+      if (autoClose.checked)
+        closePopups();
+    }, name);
   }
-}, 'Use multi-screen details to request fullscreen and open a pop-up in the same user activation.');
+}, 'Enter fullscreen and open a popup from one transient activation.');
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-manual.tentative.https.html b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-manual.tentative.https.html
index 620cd6e..b6790780 100644
--- a/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-manual.tentative.https.html
+++ b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-manual.tentative.https.html
@@ -1,116 +1,36 @@
 <!DOCTYPE html>
-<meta charset="utf-8">
 <meta name="timeout" content="long">
-<title>Multi-Screen Window Placement test: element.requestFullscreen()</title>
-<link rel="help" href="https://w3c.github.io/window-placement/">
-This test uses multi-screen details to request fullscreen on different
-displays and swap between them.<br>
-It runs manually with `wpt serve` and a compatible browser.<br><br>
-<button id="setUpButton">Request screen details</button>
-<ul id="testButtons"></ul>
-<ul id="logger"></ul>
+<title>Window Management test: target-screen element.requestFullscreen()</title>
+<link rel="help" href="https://w3c.github.io/window-management/">
+Tests use of multi-screen details to enter fullscreen on specific screens.<br>
+The host device must have 2+ screens to yield meaningful results.<br><br>
+<ul id="list"></ul>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/resources/testdriver.js"></script>
 <script src="/resources/testdriver-vendor.js"></script>
 <script src="resources/helpers.js"></script>
-
 <script>
 'use strict';
 
-// Waits until `window` is located on `screen` or until 3 seconds elapses.
-async function ensureWindowOnScreen(window, screen) {
-  // Returns true if window `w` in on screen `s`.
-  const isWindowOnScreen = async (w, s) => {
-    const center = {
-      x: w.screenLeft + w.outerWidth / 2,
-      y: w.screenTop + w.outerHeight / 2
-    };
-    return center.x >= s.left && (center.x < s.left + s.width) &&
-      center.y >= s.top && (center.y < s.top + s.height) &&
-      (await w.getScreenDetails()).currentScreen == s;
-  }
-  // Checks every 100ms if window `w` is on screen `s` up to 3s maximum.
-  const waitForWindowOnScreen = async (w, s, resolve, timestamp = Date.now()) => {
-    if (!w || w.closed || Date.now() - timestamp > 3000)
-      resolve(false);
-    else if (await isWindowOnScreen(w, s))
-      resolve(true);
-    else
-      setTimeout(waitForWindowOnScreen.bind(this, w, s, resolve, timestamp), 100);
-  }
-  return new Promise(resolve => { waitForWindowOnScreen(window, screen, resolve); });
-}
-
-// Asserts that the browser window is correctly positioned on `screen`.
-// `expectFullscreen` specifies whether to expect the window to be
-// fullscreen or not.
-async function testWindowOnScreen(test, screen, expectFullscreen) {
-
-  // In chrome, the requestFullscreen promise may resolve before the
-  // transition completes and the bounds may be incorect in the meantime.
-  // Wait until the window is on the expected screen.
-  // TODO(crbug.com/1330724) Remove this.
-  await ensureWindowOnScreen(window, screen);
-
-  assert_equals(!!document.fullscreenElement, expectFullscreen);
-  assert_equals((await window.getScreenDetails()).currentScreen, screen);
-
-  if (expectFullscreen) {
-    // Window bounds should equal the bounds of the screen when in fullscreen.
-    assert_equals(window.screenX, screen.left);
-    assert_equals(window.screenY, screen.top);
-    assert_equals(window.innerWidth, screen.width);
-    assert_equals(window.innerHeight, screen.height);
-  } else {
-    // Verify the window is somewhere within the specified screen
-    assert_true(window.screenX >= screen.left);
-    assert_true(window.screenY >= screen.top);
-    assert_true(window.screenX + window.outerWidth <= screen.left + screen.width);
-    assert_true(window.screenY + window.outerHeight <= screen.top + screen.height);
-  }
-}
-
 promise_test(async setUpTest => {
-  await setUpWindowPlacement(setUpTest, setUpButton);
-  const screenDetails = await getScreenDetails();
-  assert_true(!!screenDetails, 'Error getting screen details');
-  for (const [i, fullscreenScreen] of screenDetails.screens.entries()) {
-    const originalScreen = screenDetails.currentScreen;
-    const swapFullscreen =
-      screenDetails.screens[(i + 1) % screenDetails.screens.length];
-    let testName =
-      `Fullscreen on '${fullscreenScreen.label}' and swap to ${swapFullscreen.label}`;
-    promise_test(async fullscreenTest => {
-      // Step 1: Enter Fullscreen.
-      await addTestTriggerButtonAndAwaitClick(testButtons,
-        `Step 1: ${testName} (Enter Fullscreen)`,
-        fullscreenTest);
-      log(`Requesting fullscreen on screen: ${fullscreenScreen.label}`);
-      await document.documentElement.requestFullscreen(
-        { screen: fullscreenScreen }
-      );
-      await testWindowOnScreen(fullscreenTest, fullscreenScreen,
-        /*expectFullscreen*/true);
-      // Step 2: Swap to another screen.
-      await addTestTriggerButtonAndAwaitClick(testButtons,
-        `Step 2: ${testName} (Swap screens)`,
-        fullscreenTest);
-      log(`Swapping fullscreen to screen: ${swapFullscreen.label}`);
-      await document.documentElement.requestFullscreen(
-        { screen: swapFullscreen }
-      );
-      await testWindowOnScreen(fullscreenTest, swapFullscreen,
-        /*expectFullscreen*/true);
-      // Step 3: Exit fullscreen. Should restore window to `originalScreen`.
-      await addTestTriggerButtonAndAwaitClick(testButtons,
-        `Step 3: ${testName} (Exit Fullscreen)`,
-        fullscreenTest);
-      log(`Exiting fullscreen. Window should restore to ${originalScreen.label}.`);
+  await setUpWindowManagement(setUpTest);
+  const originalScreen = window.screenDetails.currentScreen;
+  for (const s of window.screenDetails.screens) {
+    const name = `Request fullscreen on '${s.label}`;
+    await promise_test(async test => {
+      // Request fullscreen on screen `s`; `window` should move there.
+      await buttonClick(test, name);
+      await document.documentElement.requestFullscreen({ screen: s });
+      await assertWindowOnScreen(window, s);
+      assert_true(!!document.fullscreenElement);
+
+      // Exit fullscreen; `window` should move back to `originalScreen`.
+      await buttonClick(test, `Exit fullscreen`);
       await document.exitFullscreen();
-      await testWindowOnScreen(fullscreenTest, originalScreen,
-        /*expectFullscreen*/false);
-    }, testName);
+      await assertWindowOnScreen(window, originalScreen);
+      assert_false(!!document.fullscreenElement);
+    }, name);
   }
-}, 'Use multi-screen details to request fullscreen on target displays and swap between them');
+}, 'Use multi-screen details to enter fullscreen on specific screens');
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-move.tentative.https.html b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-move.tentative.https.html
new file mode 100644
index 0000000..b91ee4cdc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-fullscreen-move.tentative.https.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<meta name="timeout" content="long">
+<title>Window Management test: target-screen element.requestFullscreen()</title>
+<link rel="help" href="https://w3c.github.io/window-management/">
+Tests use of multi-screen details to move fullscreen between screens.<br>
+The host device must have 2+ screens to yield meaningful results.<br><br>
+<ul id="list"></ul>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/helpers.js"></script>
+<script>
+'use strict';
+
+promise_test(async test => {
+  await setUpWindowManagement(test);
+  const originalScreen = window.screenDetails.currentScreen;
+  // Request fullscreen on the current screen; the window should stay there.
+  await buttonClick(test, `Request fullscreen on '${originalScreen.label}'`);
+  await document.documentElement.requestFullscreen({ screen: originalScreen });
+  await assertWindowOnScreen(window, originalScreen);
+  assert_true(!!document.fullscreenElement);
+
+  for (const s of window.screenDetails.screens) {
+    // Request fullscreen on screen `s`; `window` should move there.
+    await buttonClick(test, `Request fullscreen on '${s.label}'`);
+    await document.documentElement.requestFullscreen({ screen: s });
+    await assertWindowOnScreen(window, s);
+    assert_true(!!document.fullscreenElement);
+  }
+
+  // Exit fullscreen; `window` should move back to `originalScreen`.
+  await buttonClick(test, `Exit fullscreen`);
+  await document.exitFullscreen();
+  await assertWindowOnScreen(window, originalScreen);
+  assert_false(!!document.fullscreenElement);
+}, 'Use multi-screen details to move fullscreen between screens');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open.tentative.https.html b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open.tentative.https.html
index c453107d..708e571c 100644
--- a/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open.tentative.https.html
+++ b/third_party/blink/web_tests/external/wpt/window-placement/multi-screen-window-open.tentative.https.html
@@ -1,99 +1,39 @@
 <!DOCTYPE html>
-<meta charset="utf-8">
 <meta name="timeout" content="long">
 <!-- user agents are not required to support open features other than `noopener`
      and on some platforms position and size features don't make sense -->
 <meta name="flags" content="may">
-<title>Multi-Screen Window Management test: window.open()</title>
-<link rel="help" href="https://w3c.github.io/window-placement/">
-This test uses multi-screen details to open a popup window on each screen.<br>
-It runs automated or manually with `wpt serve` and a compatible browser.<br><br>
-<button id="setUpButton">Request screen details</button>
-<ul id="popupButtons"></ul>
-<button id="cleanUpButton">Close any open popups</button><br>
-<input id="autoCleanUp" type="checkbox" checked=true>Auto-close popups</input>
-<ul id="logger"></ul>
+<title>Window Management test: target-screen window.open()</title>
+<link rel="help" href="https://w3c.github.io/window-management/">
+Tests use of multi-screen details to open a popup window on each screen.<br>
+The host device must have 2+ screens to yield meaningful results.<br><br>
+<button id="closeButton" onclick="closePopups">Close popups</button><br>
+<input id="autoClose" type="checkbox" checked=true>Auto-close popups</input>
+<ul id="list"></ul>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/resources/testdriver.js"></script>
 <script src="/resources/testdriver-vendor.js"></script>
 <script src="resources/helpers.js"></script>
-
 <script>
 'use strict';
+
 let popups = [];
-
-cleanUpButton.addEventListener('click', async () => {
+function closePopups() {
   popups.forEach(p => p.close());
-});
-
-function checkPopupPlacement(popup, x, y, allowSameScreenClamping) {
-  // Window.screenX|Y may be zero, if the user agent wishes to hide information
-  // about the screen of the output device. They also may incorrectly reflect
-  // the origin of content viewport; in that case, estimate window coordinates
-  // by subtracing estimated frame insets (top-heavy, horizontally centered).
-  // Synchronous estimated placements may be clamped to the current screen.
-  const error = 10;
-  const dX = popup.screenX - x - (popup.outerWidth - popup.innerWidth) / 2;
-  const dY = popup.screenY - y - (popup.outerHeight - popup.innerHeight);
-
-  assert_true(!popup.screenX || popup.screenX == x || Math.abs(dX) <= error ||
-              (allowSameScreenClamping && popup.screenX >= screen.availLeft &&
-               popup.screenX < screen.availLeft + screen.availWidth));
-  assert_true(!popup.screenY || popup.screenY == y || Math.abs(dY) <= error ||
-              (allowSameScreenClamping && popup.screenY >= screen.availTop &&
-               popup.screenY < screen.availTop + screen.availHeight));
-}
-
-async function testPopupOnScreen(popupTest, screen) {
-  // Show a popup child window on the associated screen.
-  const left = screen.availLeft + Math.floor(screen.availWidth / 2) - 150;
-  const top = screen.availTop + Math.floor(screen.availHeight / 2) - 50;
-  log(`Opening a popup on '${screen.label}' at (${left}, ${top})`);
-  let popup = window.open(
-      '/resources/blank.html', '',
-      `left=${left},top=${top},width=300,height=100`);
-  popups.push(popup);
-  if (autoCleanUp.checked)
-    popupTest.add_cleanup(popup.close);
-
-  // Window.open() synchronously returns a Window with estimated screenX|Y.
-  // Initial `screenX` and `screenY` values should match `left` and `top`.
-  log(`<div style='margin-left: 40px'>Initial bounds:
-         (${popup.screenX}, ${popup.screenY})
-       </div>`);
-  // Allow synchronous estimated placements to be clamped to the current screen.
-  checkPopupPlacement(popup, left, top, true);
-  popup.initialScreenX = popup.screenX;
-  popup.initialScreenY = popup.screenY;
-
-  // Await document.visibilitychange to check resolved Window.screenX|Y values
-  // after asynchronous window creation and clamped placement has occurred.
-  const visibilitychangeWatcher =
-      new EventWatcher(popupTest, popup.document, ['visibilitychange']);
-  await visibilitychangeWatcher.wait_for('visibilitychange');
-  popup.document.write(`Expected: (${left}, ${top}) <br> \
-       Initial: (${popup.initialScreenX}, ${popup.initialScreenY}) <br> \
-       Resolved: (${popup.screenX}, ${popup.screenY}) `);
-  log(`<div style='margin-left: 40px'>Resolved bounds:
-         (${popup.screenX}, ${popup.screenY})
-       </div>`);
-  // Do not allow resolved placements to be clamped to the current screen.
-  checkPopupPlacement(popup, left, top, false);
+  popups = [];
 }
 
 promise_test(async setUpTest => {
-  await setUpWindowManagement(setUpTest, setUpButton);
-  const screenDetails = await getScreenDetails();
-  assert_true(!!screenDetails, 'Error getting screen details');
-  assert_greater_than(screenDetails.screens.length, 0, 'Connect a screen');
-  for (const s of screenDetails.screens) {
-    promise_test(async popupTest => {
-      await addTestTriggerButtonAndAwaitClick(popupButtons,
-        `Open a popup on '${s.label}'`,
-        popupTest);
-      await testPopupOnScreen(popupTest, s);
-    }, `Open a popup on '${s.label}'`);
+  await setUpWindowManagement(setUpTest);
+  for (const s of window.screenDetails.screens) {
+    const name = `Open a popup on '${s.label}'`;
+    await promise_test(async test => {
+      await buttonClick(test, name);
+      popups.push(await openPopupOnScreen(s));
+      if (autoClose.checked)
+        closePopups();
+    }, name);
   }
 }, 'Use multi-screen details to open a popup window on each screen');
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/window-placement/resources/helpers.js b/third_party/blink/web_tests/external/wpt/window-placement/resources/helpers.js
index 92442f9..3c869f1 100644
--- a/third_party/blink/web_tests/external/wpt/window-placement/resources/helpers.js
+++ b/third_party/blink/web_tests/external/wpt/window-placement/resources/helpers.js
@@ -1,27 +1,42 @@
-
-// Logs (appends) an HTML string to a logger element in a list format.
-// An element in the document with id "logger" will be used as the log
-// container.
-function log(str) {
-  const entry = document.createElement('li');
-  entry.innerHTML = str;
-  const loggerElement = document.getElementById('logger');
-  loggerElement.appendChild(entry);
-  return entry;
+// Appends a list item with `innerHTML` to the document's 'list' element.
+function log(innerHTML) {
+  const li = document.createElement('li');
+  li.innerHTML = innerHTML;
+  document.getElementById('list').appendChild(li);
 }
 
-// Common setup for window management tests. Performs some basic assertions, and
-// then waits for a click on the `setUpButton` element (for manual tests).
-// Example usage:
-//  promise_test(async setUpTest => {
-//    await setUpWindowManagement(setUpTest, setUpButton);
-//    ...
-//  });
-async function setUpWindowManagement(setUpTest, setUpButton) {
+// Returns a string with the label and bounds of screen `s` for logging.
+function screenLog(s) {
+  return `'${s.label}': (${s.left},${s.top} ${s.width}x${s.height})`;
+}
+
+// Returns a string with the bounds of window `w` for logging.
+function windowLog(w) {
+  return `(${w.screenLeft},${w.screenTop} ${w.outerWidth}x${w.outerHeight})`;
+}
+
+// Appends a button with `innerHTML` to the document's `list` element.
+// Waits for a test driver or manual click, and disables the button afterwards.
+async function buttonClick(test, innerHTML) {
+  const button = document.createElement('button');
+  button.innerHTML = innerHTML;
+  const li = document.createElement('li');
+  li.appendChild(button)
+  document.getElementById('list').appendChild(li);
+  const click = new EventWatcher(test, button, ['click']).wait_for('click');
+  try {  // Support manual testing where test_driver is not running.
+    await test_driver.click(button);
+  } catch {
+  }
+  await click;
+  button.disabled = true;
+}
+
+// Grants `window-management` permission and caches `window.screenDetails`.
+async function setUpWindowManagement(test) {
   assert_true(
     'getScreenDetails' in self && 'isExtended' in screen,
-    `API not supported; use Chromium (not content_shell) and enable
-     chrome://flags/#enable-experimental-web-platform-features`);
+    `API not supported; use Chrome or Chromium (not content_shell)`);
   if (!screen.isExtended)
     log(`WARNING: Use multiple screens for full test coverage`);
   if (window.location.href.startsWith('file'))
@@ -31,38 +46,78 @@
     await test_driver.set_permission({ name: 'window-management' }, 'granted');
   } catch {
   }
-  const setUpWatcher = new EventWatcher(setUpTest, setUpButton, ['click']);
-  const setUpClick = setUpWatcher.wait_for('click');
-  try {  // Support manual testing where test_driver is not running.
-    await test_driver.click(setUpButton);
-  } catch {
-  }
-  await setUpClick;
-  setUpButton.disabled = true;
+  await buttonClick(test, 'Request screen details');
+  window.screenDetails = await window.getScreenDetails();
+  assert_true(!!window.screenDetails, 'Error getting screen details');
 }
 
-
-// Adds a button to the given `buttonContainer` element with the contents of
-// `name`. Attaches an event watcher to the given test and waits for a signal
-// from the test driver to click the button. If no test driver is available
-// (manual testing) then awaits an actual click from the user instead. If
-// `disableOnClick` is true, the button will also be disabled after it is
-// clicked.
-async function addTestTriggerButtonAndAwaitClick(buttonContainer, name, test) {
-  const button = document.createElement('button');
-  button.innerHTML = name;
-  const entry = document.createElement('li');
-  entry.appendChild(button);
-  buttonContainer.appendChild(entry);
-  const testWatcher = new EventWatcher(test, button, ['click']);
-  const buttonClick = testWatcher.wait_for('click');
-  // Disable the button when it is clicked.
-  button.onclick = function() {
-    button.disabled = true;
-  };
-  try {  // Support manual testing where test_driver is not running.
-    await test_driver.click(button);
-  } catch {
+// Polls until `condition` is true, with the given `interval` and `duration`.
+// Returns a promise that will be resolved on success or timeout.
+async function poll(condition, interval = 100, duration = 3000) {
+  const timeout = Date.now() + duration;
+  const loop = async (resolve) => {
+    if (condition() || Date.now() > timeout)
+      resolve();
+    else
+      step_timeout(loop, interval, resolve);
   }
-  await buttonClick;
+  return new Promise(loop);
+}
+
+// Open and return a popup on `screen`, optionally asserting placement.
+async function openPopupOnScreen(screen, assertPlacement = true) {
+  const left = screen.availLeft + Math.floor(screen.availWidth / 2) - 150;
+  const top = screen.availTop + Math.floor(screen.availHeight / 2) - 50;
+  const features = `left=${left},top=${top},width=300,height=100`;
+  log(`Opening a popup with features '${features}' on ${screenLog(screen)}`);
+  // Window.open() synchronously returns a Window with estimated screenLeft|Top,
+  // which may be clamped to the opener's screen or incompletely initialized.
+  let popup = window.open('/resources/blank.html', '', features);
+
+  if (assertPlacement) {
+    // Assert the popup is eventually placed at the expected location.
+    // This may occur after window load, document ready and visible, etc.
+    const initialBounds = windowLog(popup);
+    log(`<div style='margin-left: 40px'>Initial: ${initialBounds}</div>`);
+    await poll(() => { return popup.screenLeft == left &&
+                              popup.screenTop == top });
+    popup.document.write(`Requested: (${left},${top} 300x100) <br> \
+        Initial: ${initialBounds} <br> \
+        Resolved: ${windowLog(popup)}`);
+    log(`<div style='margin-left: 40px'>Resolved: ${windowLog(popup)}</div>`);
+    const context = `popup: ${windowLog(popup)}, ${screenLog(screen)}`;
+    assert_equals(popup.screenLeft, left, context);
+    assert_equals(popup.screenTop, top, context);
+  }
+
+  return popup;
+}
+
+// Returns true if window `w` bounds are on screen `s` with threshold `t`.
+function isWindowOnScreen(w, s, t = 100) {
+  return (w.screenLeft >= s.left - t) && (w.screenTop >= s.top - t) &&
+          (w.screenLeft + w.outerWidth <= s.left + s.width + t) &&
+          (w.screenTop + w.outerHeight <= s.top + s.height + t);
+}
+
+// Asserts window `w` currentScreen matches screen `s`. Awaits pending changes,
+// e.g. fullscreen promises may resolve before screen change: crbug.com/1330724.
+async function assertWindowHasCurrentScreen(w, s) {
+  log(`assertWindowHasCurrentScreen w: ${windowLog(w)} s: ${screenLog(s)}`);
+  await poll(() => { return s === w.screenDetails.currentScreen; });
+  assert_equals(screenLog(s), screenLog(w.screenDetails.currentScreen));
+}
+
+// Asserts window `w` bounds roughly match screen `s`. Awaits pending changes,
+// e.g. fullscreen promises may resolve before bounds change: crbug.com/1330724.
+async function assertWindowBoundsOnScreen(w, s) {
+  log(`assertWindowBoundsOnScreen w: ${windowLog(w)} s: ${screenLog(s)}`);
+  await poll(() => { return isWindowOnScreen(w, s); });
+  assert_true(isWindowOnScreen(w, s), `${windowLog(w)} on ${screenLog(s)}`);
+}
+
+// Asserts window `w` bounds and currentScreen match screen `s`.
+async function assertWindowOnScreen(w, s) {
+  await assertWindowHasCurrentScreen(w, s);
+  await assertWindowBoundsOnScreen(w, s);
 }
diff --git a/third_party/blink/web_tests/fast/backgrounds/mask-box-image-expected.png b/third_party/blink/web_tests/fast/backgrounds/mask-box-image-expected.png
index ded2a3d..8c51e74 100644
--- a/third_party/blink/web_tests/fast/backgrounds/mask-box-image-expected.png
+++ b/third_party/blink/web_tests/fast/backgrounds/mask-box-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/canvas/canvas-composite-transformclip-expected.png b/third_party/blink/web_tests/fast/canvas/canvas-composite-transformclip-expected.png
index 54ce94a..878e869 100644
--- a/third_party/blink/web_tests/fast/canvas/canvas-composite-transformclip-expected.png
+++ b/third_party/blink/web_tests/fast/canvas/canvas-composite-transformclip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/reflections/reflection-masks-expected.png b/third_party/blink/web_tests/fast/reflections/reflection-masks-expected.png
index fe3a00a6..0b760203 100644
--- a/third_party/blink/web_tests/fast/reflections/reflection-masks-expected.png
+++ b/third_party/blink/web_tests/fast/reflections/reflection-masks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/reflections/reflection-masks-opacity-expected.png b/third_party/blink/web_tests/fast/reflections/reflection-masks-opacity-expected.png
index 3d069fe0..afee756 100644
--- a/third_party/blink/web_tests/fast/reflections/reflection-masks-opacity-expected.png
+++ b/third_party/blink/web_tests/fast/reflections/reflection-masks-opacity-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/reflections/reflection-with-zoom-expected.png b/third_party/blink/web_tests/fast/reflections/reflection-with-zoom-expected.png
index ff54c04..5be7c58 100644
--- a/third_party/blink/web_tests/fast/reflections/reflection-with-zoom-expected.png
+++ b/third_party/blink/web_tests/fast/reflections/reflection-with-zoom-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
index 15f0fa2..8d10c22 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/paint/masks/fieldset-mask-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/paint/masks/fieldset-mask-expected.png
index 4e42bc8..387a1f7 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/paint/masks/fieldset-mask-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/paint/masks/fieldset-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/masks/direct-image-mask-expected.png b/third_party/blink/web_tests/platform/linux/compositing/masks/direct-image-mask-expected.png
index f6eac64b..0ca34a7 100644
--- a/third_party/blink/web_tests/platform/linux/compositing/masks/direct-image-mask-expected.png
+++ b/third_party/blink/web_tests/platform/linux/compositing/masks/direct-image-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-added-filters-expected.png
index eee50fd..084d9a4 100644
--- a/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-added-filters-expected.png
+++ b/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-added-filters-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-removed-filters-expected.png
index 0dcae1b..af18844 100644
--- a/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-removed-filters-expected.png
+++ b/third_party/blink/web_tests/platform/linux/compositing/masks/mask-with-removed-filters-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/masks/masked-ancestor-expected.png b/third_party/blink/web_tests/platform/linux/compositing/masks/masked-ancestor-expected.png
index 64e06cc..17cd1084 100644
--- a/third_party/blink/web_tests/platform/linux/compositing/masks/masked-ancestor-expected.png
+++ b/third_party/blink/web_tests/platform/linux/compositing/masks/masked-ancestor-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/masks/multiple-masks-expected.png b/third_party/blink/web_tests/platform/linux/compositing/masks/multiple-masks-expected.png
index ea02cfc..52854cbf 100644
--- a/third_party/blink/web_tests/platform/linux/compositing/masks/multiple-masks-expected.png
+++ b/third_party/blink/web_tests/platform/linux/compositing/masks/multiple-masks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/masks/simple-composited-mask-expected.png b/third_party/blink/web_tests/platform/linux/compositing/masks/simple-composited-mask-expected.png
index 290d75f..d9254a51 100644
--- a/third_party/blink/web_tests/platform/linux/compositing/masks/simple-composited-mask-expected.png
+++ b/third_party/blink/web_tests/platform/linux/compositing/masks/simple-composited-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png b/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
index d8ec334..9f9e7fc 100644
--- a/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
+++ b/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-image-image-expected.png b/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-image-image-expected.png
index b7529481..3e78ac9 100644
--- a/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-image-image-expected.png
+++ b/third_party/blink/web_tests/platform/linux/css3/blending/background-blend-mode-image-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/blending/effect-background-blend-mode-expected.png b/third_party/blink/web_tests/platform/linux/css3/blending/effect-background-blend-mode-expected.png
index 2383b51..0eb5df8 100644
--- a/third_party/blink/web_tests/platform/linux/css3/blending/effect-background-blend-mode-expected.png
+++ b/third_party/blink/web_tests/platform/linux/css3/blending/effect-background-blend-mode-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-1-expected.png b/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-1-expected.png
index 89591df..738ce2d1 100644
--- a/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-1-expected.png
+++ b/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-2-expected.png b/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-2-expected.png
index 9621add0..30044ce 100644
--- a/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-2-expected.png
+++ b/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-3-expected.png b/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-3-expected.png
index 468d8cf..6436d51 100644
--- a/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-3-expected.png
+++ b/third_party/blink/web_tests/platform/linux/css3/blending/mix-blend-mode-isolated-group-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-expected.png b/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-expected.png
index 92e04f5..d07bbe0d 100644
--- a/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-outset-expected.png b/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-outset-expected.png
index 3a52a1a3..3f4c20f 100644
--- a/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-outset-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/borders/block-mask-overlay-image-outset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/borders/border-inner-bleed-expected.png b/third_party/blink/web_tests/platform/linux/fast/borders/border-inner-bleed-expected.png
index 7dcd37d..a7c0a99 100644
--- a/third_party/blink/web_tests/platform/linux/fast/borders/border-inner-bleed-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/borders/border-inner-bleed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-expected.png b/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-expected.png
index 08fe0f7..7a94b84 100644
--- a/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-expected.png b/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-expected.png
index 473420f..822c23d7 100644
--- a/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-expected.png
index 913823b1..231ddda8f 100644
--- a/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part1-expected.png b/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part1-expected.png
index 8554db71..8cde169 100644
--- a/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part1-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part2-expected.png b/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part2-expected.png
index b9eb8f7d..d8d8ad76 100644
--- a/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part2-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-composite-shadow-part2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/reflection/reflection-with-rotation-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/reflection/reflection-with-rotation-expected.png
index cf35166..490d6eb 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/reflection/reflection-with-rotation-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/reflection/reflection-with-rotation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png
index 7f305274..03efd24 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
index 36258d69..f481899 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png
index 4f3bfdc9..bcc02d2 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png
index ed7feb2f..d1d7f1b 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-path-04-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-path-04-b-expected.png
index aa9882a..10f86ef5 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-path-04-b-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/masking-path-04-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png b/third_party/blink/web_tests/platform/linux/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png
index a059d5d..e8767e62 100644
--- a/third_party/blink/web_tests/platform/linux/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/as-background-image/svg-as-background-6-expected.png b/third_party/blink/web_tests/platform/linux/svg/as-background-image/svg-as-background-6-expected.png
index a50d758..875796a 100644
--- a/third_party/blink/web_tests/platform/linux/svg/as-background-image/svg-as-background-6-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/as-background-image/svg-as-background-6-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/batik/masking/maskRegions-expected.png b/third_party/blink/web_tests/platform/linux/svg/batik/masking/maskRegions-expected.png
index c4f7dd07..a8d9d6a 100644
--- a/third_party/blink/web_tests/platform/linux/svg/batik/masking/maskRegions-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/batik/masking/maskRegions-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/batik/text/textEffect2-expected.png b/third_party/blink/web_tests/platform/linux/svg/batik/text/textEffect2-expected.png
index e4802df..7826210a 100644
--- a/third_party/blink/web_tests/platform/linux/svg/batik/text/textEffect2-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/batik/text/textEffect2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/batik/text/textProperties-expected.png b/third_party/blink/web_tests/platform/linux/svg/batik/text/textProperties-expected.png
index 2acfeaa..eac29d6 100644
--- a/third_party/blink/web_tests/platform/linux/svg/batik/text/textProperties-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/batik/text/textProperties-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/custom/clip-mask-negative-scale-expected.png b/third_party/blink/web_tests/platform/linux/svg/custom/clip-mask-negative-scale-expected.png
index d5cf659..90e38f3 100644
--- a/third_party/blink/web_tests/platform/linux/svg/custom/clip-mask-negative-scale-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/custom/clip-mask-negative-scale-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/transforms/text-with-mask-with-svg-transform-expected.png b/third_party/blink/web_tests/platform/linux/svg/transforms/text-with-mask-with-svg-transform-expected.png
index 22bbd80..01265d1 100644
--- a/third_party/blink/web_tests/platform/linux/svg/transforms/text-with-mask-with-svg-transform-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/transforms/text-with-mask-with-svg-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/zoom/page/zoom-mask-with-percentages-expected.png b/third_party/blink/web_tests/platform/linux/svg/zoom/page/zoom-mask-with-percentages-expected.png
index 9bc99995..9f82103 100644
--- a/third_party/blink/web_tests/platform/linux/svg/zoom/page/zoom-mask-with-percentages-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/zoom/page/zoom-mask-with-percentages-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-expected.png
index 435ef9b..f5c8ea5 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png
index b431a0b..9c56e02a 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-expected.png
index 454d62c..d42789d 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-variable-expected.png b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-variable-expected.png
index 0f5f56da..196dacae 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-variable-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/text-antialias/colrv1-variable-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png
index d2bf2d1..c285e4f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png
index 0fd1ef8..49ad3c8 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-expected.png
index e49fe5ec..353cec6 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-variable-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-variable-expected.png
index c01aa6f..4384de9 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-variable-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/text-antialias/colrv1-variable-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png
index f641e0f..2032650b 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png
index d2bf2d1..c285e4f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png
index 0fd1ef8..49ad3c8 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/direct-image-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/direct-image-mask-expected.png
deleted file mode 100644
index 091e5e72..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/direct-image-mask-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/mask-with-added-filters-expected.png
deleted file mode 100644
index 3a4d00e..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/mask-with-added-filters-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/mask-with-removed-filters-expected.png
deleted file mode 100644
index 2df70a3..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/mask-with-removed-filters-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/masked-ancestor-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/masked-ancestor-expected.png
deleted file mode 100644
index 33245f2..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/masked-ancestor-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/multiple-masks-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/multiple-masks-expected.png
deleted file mode 100644
index 47bbb0e2..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/multiple-masks-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/simple-composited-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/simple-composited-mask-expected.png
deleted file mode 100644
index 324c154..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/compositing/masks/simple-composited-mask-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/backgrounds/mask-box-image-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/backgrounds/mask-box-image-expected.png
deleted file mode 100644
index 8c51e74..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/backgrounds/mask-box-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/borders/border-inner-bleed-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/borders/border-inner-bleed-expected.png
deleted file mode 100644
index 2ebbc36..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/borders/border-inner-bleed-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/reflections/reflection-masks-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/reflections/reflection-masks-expected.png
deleted file mode 100644
index 0b760203..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/reflections/reflection-masks-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/reflections/reflection-masks-opacity-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/reflections/reflection-masks-opacity-expected.png
deleted file mode 100644
index afee756..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/reflections/reflection-masks-opacity-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/shadow-multiple-expected.png
deleted file mode 100644
index 575d2b5..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/shadow-multiple-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png
deleted file mode 100644
index 27fd4525..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
deleted file mode 100644
index 74273ba..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png
deleted file mode 100644
index 8b5a4ce..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png
deleted file mode 100644
index e506bec..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/batik/masking/maskRegions-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/batik/masking/maskRegions-expected.png
deleted file mode 100644
index ecd43b2c..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/batik/masking/maskRegions-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/custom/clip-mask-negative-scale-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/custom/clip-mask-negative-scale-expected.png
deleted file mode 100644
index 3fe10baa..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/custom/clip-mask-negative-scale-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/custom/grayscale-gradient-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/custom/grayscale-gradient-mask-expected.png
deleted file mode 100644
index 3f79c65..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/custom/grayscale-gradient-mask-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/filters/filter-clip-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/filters/filter-clip-expected.png
deleted file mode 100644
index 9a7b28c..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/svg/filters/filter-clip-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png b/third_party/blink/web_tests/platform/mac-mac11/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png
index b6ee3b6..3979a62 100644
--- a/third_party/blink/web_tests/platform/mac-mac11/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac11/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/direct-image-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/direct-image-mask-expected.png
deleted file mode 100644
index 091e5e72..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/direct-image-mask-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/mask-with-added-filters-expected.png
deleted file mode 100644
index 3a4d00e..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/mask-with-added-filters-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/mask-with-removed-filters-expected.png
deleted file mode 100644
index 2df70a3..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/mask-with-removed-filters-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/masked-ancestor-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/masked-ancestor-expected.png
deleted file mode 100644
index 33245f2..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/masked-ancestor-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/multiple-masks-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/multiple-masks-expected.png
deleted file mode 100644
index 47bbb0e2..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/multiple-masks-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/simple-composited-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/simple-composited-mask-expected.png
deleted file mode 100644
index 324c154..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/compositing/masks/simple-composited-mask-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/backgrounds/mask-box-image-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/backgrounds/mask-box-image-expected.png
deleted file mode 100644
index 8c51e74..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/backgrounds/mask-box-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/borders/border-inner-bleed-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/borders/border-inner-bleed-expected.png
deleted file mode 100644
index 2ebbc36..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/borders/border-inner-bleed-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/reflections/reflection-masks-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/reflections/reflection-masks-expected.png
deleted file mode 100644
index 0b760203..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/reflections/reflection-masks-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/reflections/reflection-masks-opacity-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/reflections/reflection-masks-opacity-expected.png
deleted file mode 100644
index afee756..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/reflections/reflection-masks-opacity-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/paint/invalidation/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/paint/invalidation/shadow-multiple-expected.png
deleted file mode 100644
index 575d2b5..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/paint/invalidation/shadow-multiple-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png
deleted file mode 100644
index 27fd4525..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
deleted file mode 100644
index 74273ba..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png
deleted file mode 100644
index 8b5a4ce..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png
deleted file mode 100644
index e506bec..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/batik/masking/maskRegions-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/batik/masking/maskRegions-expected.png
deleted file mode 100644
index ecd43b2c..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/batik/masking/maskRegions-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/custom/clip-mask-negative-scale-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/custom/clip-mask-negative-scale-expected.png
deleted file mode 100644
index 3fe10baa..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/custom/clip-mask-negative-scale-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/custom/grayscale-gradient-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/custom/grayscale-gradient-mask-expected.png
deleted file mode 100644
index 3f79c65..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/custom/grayscale-gradient-mask-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/filters/filter-clip-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/filters/filter-clip-expected.png
deleted file mode 100644
index 9a7b28c..0000000
--- a/third_party/blink/web_tests/platform/mac-mac12-arm64/svg/filters/filter-clip-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/direct-image-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/direct-image-mask-expected.png
deleted file mode 100644
index 091e5e72..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/direct-image-mask-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-added-filters-expected.png
deleted file mode 100644
index 3a4d00e..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-added-filters-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-removed-filters-expected.png
deleted file mode 100644
index 2df70a3..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/mask-with-removed-filters-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/masked-ancestor-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/masked-ancestor-expected.png
deleted file mode 100644
index 33245f2..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/masked-ancestor-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/multiple-masks-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/multiple-masks-expected.png
deleted file mode 100644
index 47bbb0e2..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/multiple-masks-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/simple-composited-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/simple-composited-mask-expected.png
deleted file mode 100644
index 324c154..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/compositing/masks/simple-composited-mask-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/backgrounds/mask-box-image-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/backgrounds/mask-box-image-expected.png
deleted file mode 100644
index 8c51e74..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/backgrounds/mask-box-image-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/borders/border-inner-bleed-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/borders/border-inner-bleed-expected.png
deleted file mode 100644
index 2ebbc36..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/borders/border-inner-bleed-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/reflections/reflection-masks-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/reflections/reflection-masks-expected.png
deleted file mode 100644
index 0b760203..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/reflections/reflection-masks-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/reflections/reflection-masks-opacity-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/reflections/reflection-masks-opacity-expected.png
deleted file mode 100644
index afee756..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/fast/reflections/reflection-masks-opacity-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/shadow-multiple-expected.png
deleted file mode 100644
index 575d2b5..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/shadow-multiple-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png
deleted file mode 100644
index 27fd4525..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
deleted file mode 100644
index 74273ba..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png
deleted file mode 100644
index 8b5a4ce..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png
deleted file mode 100644
index e506bec..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/batik/masking/maskRegions-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/batik/masking/maskRegions-expected.png
deleted file mode 100644
index ecd43b2c..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/batik/masking/maskRegions-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/custom/clip-mask-negative-scale-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/custom/clip-mask-negative-scale-expected.png
deleted file mode 100644
index 3fe10baa..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/custom/clip-mask-negative-scale-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/custom/grayscale-gradient-mask-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/custom/grayscale-gradient-mask-expected.png
deleted file mode 100644
index 3f79c65..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/custom/grayscale-gradient-mask-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/filters/filter-clip-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/filters/filter-clip-expected.png
deleted file mode 100644
index 9a7b28c..0000000
--- a/third_party/blink/web_tests/platform/mac-mac13-arm64/svg/filters/filter-clip-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/masks/direct-image-mask-expected.png b/third_party/blink/web_tests/platform/mac/compositing/masks/direct-image-mask-expected.png
index 352937a..091e5e72 100644
--- a/third_party/blink/web_tests/platform/mac/compositing/masks/direct-image-mask-expected.png
+++ b/third_party/blink/web_tests/platform/mac/compositing/masks/direct-image-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png
index ff1b35c..3a4d00e 100644
--- a/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png
+++ b/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-removed-filters-expected.png
index aa5f78f..2df70a3 100644
--- a/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-removed-filters-expected.png
+++ b/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-removed-filters-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/masks/masked-ancestor-expected.png b/third_party/blink/web_tests/platform/mac/compositing/masks/masked-ancestor-expected.png
index 044eef1..33245f2 100644
--- a/third_party/blink/web_tests/platform/mac/compositing/masks/masked-ancestor-expected.png
+++ b/third_party/blink/web_tests/platform/mac/compositing/masks/masked-ancestor-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/masks/multiple-masks-expected.png b/third_party/blink/web_tests/platform/mac/compositing/masks/multiple-masks-expected.png
index 38ca239..47bbb0e2 100644
--- a/third_party/blink/web_tests/platform/mac/compositing/masks/multiple-masks-expected.png
+++ b/third_party/blink/web_tests/platform/mac/compositing/masks/multiple-masks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/masks/simple-composited-mask-expected.png b/third_party/blink/web_tests/platform/mac/compositing/masks/simple-composited-mask-expected.png
index 8012646..324c154 100644
--- a/third_party/blink/web_tests/platform/mac/compositing/masks/simple-composited-mask-expected.png
+++ b/third_party/blink/web_tests/platform/mac/compositing/masks/simple-composited-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png b/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
index d8ec334..9f9e7fc 100644
--- a/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-crossfade-image-gradient-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-image-image-expected.png b/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-image-image-expected.png
index b7529481..3e78ac9 100644
--- a/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-image-image-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-image-image-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/blending/effect-background-blend-mode-expected.png b/third_party/blink/web_tests/platform/mac/css3/blending/effect-background-blend-mode-expected.png
index 2383b51..0eb5df8 100644
--- a/third_party/blink/web_tests/platform/mac/css3/blending/effect-background-blend-mode-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/blending/effect-background-blend-mode-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-1-expected.png b/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-1-expected.png
index 89591df..738ce2d1 100644
--- a/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-1-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-2-expected.png b/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-2-expected.png
index 9621add0..30044ce 100644
--- a/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-2-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-3-expected.png b/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-3-expected.png
index 468d8cf..6436d51 100644
--- a/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-3-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/blending/mix-blend-mode-isolated-group-3-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-expected.png b/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-expected.png
index 649e3dd..3b3e27f 100644
--- a/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-subregion-expected.png b/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-subregion-expected.png
index cd4a122..3d55a4a 100644
--- a/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-subregion-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-subregion-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/border-image-rotate-transform-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/border-image-rotate-transform-expected.png
index e747c1f..0bbcdfd 100644
--- a/third_party/blink/web_tests/platform/mac/fast/borders/border-image-rotate-transform-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/borders/border-image-rotate-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/border-inner-bleed-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/border-inner-bleed-expected.png
index 3e773ec..2ebbc36 100644
--- a/third_party/blink/web_tests/platform/mac/fast/borders/border-inner-bleed-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/borders/border-inner-bleed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-expected.png
index dd6f072..cfee372 100644
--- a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part1-expected.png b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part1-expected.png
index 30eab1f..082b060 100644
--- a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part1-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part2-expected.png b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part2-expected.png
index ac9be292..87f0e1f 100644
--- a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part2-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-shadow-part2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-expected.png
index d2bf2d1..c285e4f 100644
--- a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png
index 0fd1ef8..49ad3c8 100644
--- a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/reflection/reflection-with-rotation-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/reflection/reflection-with-rotation-expected.png
index 49c543b..ba3813fc 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/reflection/reflection-with-rotation-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/reflection/reflection-with-rotation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/shadow-multiple-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/shadow-multiple-expected.png
index 4876e755b3..575d2b5 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/shadow-multiple-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/shadow-multiple-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png
index a170c1f0..27fd4525 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
index 206559a..74273ba 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png
index 5b6f9d62..8b5a4ce 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png
index a4f25d7..e506bec 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png b/third_party/blink/web_tests/platform/mac/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png
index 74131a1..83177d75 100644
--- a/third_party/blink/web_tests/platform/mac/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/as-background-image/svg-as-background-6-expected.png b/third_party/blink/web_tests/platform/mac/svg/as-background-image/svg-as-background-6-expected.png
index 7f080f3..76626da 100644
--- a/third_party/blink/web_tests/platform/mac/svg/as-background-image/svg-as-background-6-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/as-background-image/svg-as-background-6-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/batik/masking/maskRegions-expected.png b/third_party/blink/web_tests/platform/mac/svg/batik/masking/maskRegions-expected.png
index 4a60dc1..ecd43b2c 100644
--- a/third_party/blink/web_tests/platform/mac/svg/batik/masking/maskRegions-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/batik/masking/maskRegions-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/custom/clip-mask-negative-scale-expected.png b/third_party/blink/web_tests/platform/mac/svg/custom/clip-mask-negative-scale-expected.png
index 543bd8b..3fe10baa 100644
--- a/third_party/blink/web_tests/platform/mac/svg/custom/clip-mask-negative-scale-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/custom/clip-mask-negative-scale-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/transforms/text-with-mask-with-svg-transform-expected.png b/third_party/blink/web_tests/platform/mac/svg/transforms/text-with-mask-with-svg-transform-expected.png
index 25aa2dd..bc877806 100644
--- a/third_party/blink/web_tests/platform/mac/svg/transforms/text-with-mask-with-svg-transform-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/transforms/text-with-mask-with-svg-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/zoom/page/zoom-mask-with-percentages-expected.png b/third_party/blink/web_tests/platform/mac/svg/zoom/page/zoom-mask-with-percentages-expected.png
index 05a26b2..62535deb 100644
--- a/third_party/blink/web_tests/platform/mac/svg/zoom/page/zoom-mask-with-percentages-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/zoom/page/zoom-mask-with-percentages-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-expected.png
index 435ef9b..f5c8ea5 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png
index b431a0b..9c56e02a 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-expected.png b/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-expected.png
index e2b28d2..8dfeac7 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-variable-expected.png b/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-variable-expected.png
index 03b2964..b406a78 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-variable-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/text-antialias/colrv1-variable-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/masks/direct-image-mask-expected.png b/third_party/blink/web_tests/platform/win/compositing/masks/direct-image-mask-expected.png
index ba7de06..b0f2fc48 100644
--- a/third_party/blink/web_tests/platform/win/compositing/masks/direct-image-mask-expected.png
+++ b/third_party/blink/web_tests/platform/win/compositing/masks/direct-image-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png
index c9ad346..3ba49d6 100644
--- a/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png
+++ b/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-removed-filters-expected.png
index 8fe85e2..33773cb 100644
--- a/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-removed-filters-expected.png
+++ b/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-removed-filters-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/masks/masked-ancestor-expected.png b/third_party/blink/web_tests/platform/win/compositing/masks/masked-ancestor-expected.png
index 9cf4e62..4fc57d8 100644
--- a/third_party/blink/web_tests/platform/win/compositing/masks/masked-ancestor-expected.png
+++ b/third_party/blink/web_tests/platform/win/compositing/masks/masked-ancestor-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/masks/multiple-masks-expected.png b/third_party/blink/web_tests/platform/win/compositing/masks/multiple-masks-expected.png
index 8ab75b8..62e5806 100644
--- a/third_party/blink/web_tests/platform/win/compositing/masks/multiple-masks-expected.png
+++ b/third_party/blink/web_tests/platform/win/compositing/masks/multiple-masks-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/masks/simple-composited-mask-expected.png b/third_party/blink/web_tests/platform/win/compositing/masks/simple-composited-mask-expected.png
index f9f14897..149909cc 100644
--- a/third_party/blink/web_tests/platform/win/compositing/masks/simple-composited-mask-expected.png
+++ b/third_party/blink/web_tests/platform/win/compositing/masks/simple-composited-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-expected.png b/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-expected.png
index f1b428a..c67931a 100644
--- a/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-expected.png
+++ b/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-subregion-expected.png b/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-subregion-expected.png
index 2c04349..3a9cd7b 100644
--- a/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-subregion-expected.png
+++ b/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-subregion-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/borders/border-image-rotate-transform-expected.png b/third_party/blink/web_tests/platform/win/fast/borders/border-image-rotate-transform-expected.png
index f83dca2..731e3b82 100644
--- a/third_party/blink/web_tests/platform/win/fast/borders/border-image-rotate-transform-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/borders/border-image-rotate-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/borders/border-inner-bleed-expected.png b/third_party/blink/web_tests/platform/win/fast/borders/border-inner-bleed-expected.png
index 5c06a96..fc74e627 100644
--- a/third_party/blink/web_tests/platform/win/fast/borders/border-inner-bleed-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/borders/border-inner-bleed-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-expected.png b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-expected.png
index b58628c..f98fb8c 100644
--- a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part1-expected.png b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part1-expected.png
index 921b40d..5c30ac2 100644
--- a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part1-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part2-expected.png b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part2-expected.png
index 94938e2..583f1c5 100644
--- a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part2-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-shadow-part2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-expected.png b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-expected.png
index 93f7d9f..6c8754f 100644
--- a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png
index 32a40d3..2503b133 100644
--- a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-composite-video-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/reflection/reflection-with-rotation-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/reflection/reflection-with-rotation-expected.png
index fc9c5ee..f6f402d 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/reflection/reflection-with-rotation-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/reflection/reflection-with-rotation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png
index 08904d9..0cc642e6 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/svg/absolute-sized-content-with-resources-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
index c2e2115..cc4ccabc 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png
index a5314648..bc95367 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-intro-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png
index c928840..5616659 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/masking-mask-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png b/third_party/blink/web_tests/platform/win/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png
index 471d6b3a..47fd1a2 100644
--- a/third_party/blink/web_tests/platform/win/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/as-background-image/background-image-preserveaspectRatio-support-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/as-background-image/svg-as-background-6-expected.png b/third_party/blink/web_tests/platform/win/svg/as-background-image/svg-as-background-6-expected.png
index 2ef258e..060c3605 100644
--- a/third_party/blink/web_tests/platform/win/svg/as-background-image/svg-as-background-6-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/as-background-image/svg-as-background-6-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/batik/masking/maskRegions-expected.png b/third_party/blink/web_tests/platform/win/svg/batik/masking/maskRegions-expected.png
index 49a7b75..5d7dc6a 100644
--- a/third_party/blink/web_tests/platform/win/svg/batik/masking/maskRegions-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/batik/masking/maskRegions-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/custom/clip-mask-negative-scale-expected.png b/third_party/blink/web_tests/platform/win/svg/custom/clip-mask-negative-scale-expected.png
index fa6993b8..0e8908e 100644
--- a/third_party/blink/web_tests/platform/win/svg/custom/clip-mask-negative-scale-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/custom/clip-mask-negative-scale-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/transforms/text-with-mask-with-svg-transform-expected.png b/third_party/blink/web_tests/platform/win/svg/transforms/text-with-mask-with-svg-transform-expected.png
index 8a2bdcef..f69008e7 100644
--- a/third_party/blink/web_tests/platform/win/svg/transforms/text-with-mask-with-svg-transform-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/transforms/text-with-mask-with-svg-transform-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/zoom/page/zoom-mask-with-percentages-expected.png b/third_party/blink/web_tests/platform/win/svg/zoom/page/zoom-mask-with-percentages-expected.png
index 1c2ddf4a..57f4c53 100644
--- a/third_party/blink/web_tests/platform/win/svg/zoom/page/zoom-mask-with-percentages-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/zoom/page/zoom-mask-with-percentages-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-expected.png
index 3f3c35aa..c5f2def 100644
--- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png
index 6ccaf72..b99c08431 100644
--- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-subregion-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-expected.png
index a9fee7f..5c6f9e1 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-variable-expected.png b/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-variable-expected.png
index e90236e..988a51b 100644
--- a/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-variable-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/text-antialias/colrv1-variable-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/fast/backgrounds/repeat/mask-negative-offset-repeat-expected.png b/third_party/blink/web_tests/platform/win11-arm64/fast/backgrounds/repeat/mask-negative-offset-repeat-expected.png
new file mode 100644
index 0000000..74fba6d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win11-arm64/fast/backgrounds/repeat/mask-negative-offset-repeat-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk-expected.png b/third_party/blink/web_tests/platform/win11-arm64/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk-expected.png
deleted file mode 100644
index 5588c558..0000000
--- a/third_party/blink/web_tests/platform/win11-arm64/fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/fast/dynamic/text-combine-expected.png b/third_party/blink/web_tests/platform/win11-arm64/fast/dynamic/text-combine-expected.png
deleted file mode 100644
index ab21af1..0000000
--- a/third_party/blink/web_tests/platform/win11-arm64/fast/dynamic/text-combine-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/Kusa-Makura-background-canvas-expected.png b/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/Kusa-Makura-background-canvas-expected.png
deleted file mode 100644
index 611a77a..0000000
--- a/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/Kusa-Makura-background-canvas-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/japanese-ruby-vertical-lr-expected.png b/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/japanese-ruby-vertical-lr-expected.png
deleted file mode 100644
index 8cab23e..0000000
--- a/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/japanese-ruby-vertical-lr-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/text-combine-various-fonts-expected.png b/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/text-combine-various-fonts-expected.png
deleted file mode 100644
index 807b14e..0000000
--- a/third_party/blink/web_tests/platform/win11-arm64/fast/writing-mode/text-combine-various-fonts-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/http/tests/fetch/serviceworker/stream-reader-base-https-other-https-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/http/tests/fetch/serviceworker/stream-reader-base-https-other-https-expected.txt
new file mode 100644
index 0000000..c6c66b3
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win11-arm64/http/tests/fetch/serviceworker/stream-reader-base-https-other-https-expected.txt
@@ -0,0 +1,14 @@
+This is a testharness.js-based test.
+Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: network error
+PASS Startup
+PASS stream-reader-serviceworker
+PASS ReadableStreamReader acquisition / releasing
+PASS read contents with ReadableStreamReader
+FAIL parallel read promise_test: Unhandled rejection with value: object "TypeError: network error"
+PASS acquiring a reader should not set bodyUsed.
+FAIL Clone after reading promise_test: Unhandled rejection with value: object "TypeError: network error"
+PASS Cancelling stream stops downloading.
+FAIL Cancelling stream should not affect cloned one. promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch"
+PASS Streaming error should be reported as a TypeError.
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win11-arm64/http/tests/fetch/window/stream-reader-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/http/tests/fetch/window/stream-reader-expected.txt
new file mode 100644
index 0000000..bc96afa5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win11-arm64/http/tests/fetch/window/stream-reader-expected.txt
@@ -0,0 +1,15 @@
+CONSOLE ERROR: Uncaught (in promise) TypeError: network error
+CONSOLE ERROR: Uncaught (in promise) TypeError: network error
+This is a testharness.js-based test.
+Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: network error
+PASS Startup
+PASS ReadableStreamReader acquisition / releasing
+PASS read contents with ReadableStreamReader
+FAIL parallel read promise_test: Unhandled rejection with value: object "TypeError: network error"
+PASS acquiring a reader should not set bodyUsed.
+FAIL Clone after reading promise_test: Unhandled rejection with value: object "TypeError: network error"
+PASS Cancelling stream stops downloading.
+FAIL Cancelling stream should not affect cloned one. promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch"
+PASS Streaming error should be reported as a TypeError.
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win11-arm64/http/tests/images/document-policy-oversized-images-forced-layout-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/http/tests/images/document-policy-oversized-images-forced-layout-expected.txt
deleted file mode 100644
index da7b2ea..0000000
--- a/third_party/blink/web_tests/platform/win11-arm64/http/tests/images/document-policy-oversized-images-forced-layout-expected.txt
+++ /dev/null
@@ -1 +0,0 @@
-CONSOLE ERROR: Document policy violation: oversized-images is not allowed in this document.
diff --git a/third_party/blink/web_tests/platform/win11-arm64/http/tests/inspector-protocol/browser/set-download-behavior-deny-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/http/tests/inspector-protocol/browser/set-download-behavior-deny-expected.txt
new file mode 100644
index 0000000..9e6857e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win11-arm64/http/tests/inspector-protocol/browser/set-download-behavior-deny-expected.txt
@@ -0,0 +1,4 @@
+Tests download is canceled when behavior is set to deny.
+Downloading via a navigation: 
+Error while evaluating 'location.href = "/devtools/network/resources/resource.php?download=1"': {"code":-32000,"message":"Inspected target navigated or closed"}
+
diff --git a/third_party/blink/web_tests/platform/win11-arm64/http/tests/inspector-protocol/network-data-length-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/http/tests/inspector-protocol/network-data-length-expected.txt
index 0e35c4a..034c145 100644
--- a/third_party/blink/web_tests/platform/win11-arm64/http/tests/inspector-protocol/network-data-length-expected.txt
+++ b/third_party/blink/web_tests/platform/win11-arm64/http/tests/inspector-protocol/network-data-length-expected.txt
@@ -6,32 +6,32 @@
   isChunked: true
   isH2: false
   redirected: false
-  headersSize: 175
+  headersSize: 173
   receivedDataSize: 2631
-  reportedTotalSize: 2811
+  reportedTotalSize: 2809
 
 url: http://127.0.0.1:8000/inspector-protocol/resources/data-xfer-resource.php?size=4&flush_header_with_x_bytes=1&wait_after_headers_packet=25&flush_every=1&wait_every_x_bytes=1&wait_duration_every_x_bytes=25
   isChunked: true
   isH2: false
   redirected: false
-  headersSize: 175
+  headersSize: 173
   receivedDataSize: 2631
-  reportedTotalSize: 2811
+  reportedTotalSize: 2809
 
 url: http://127.0.0.1:8000/inspector-protocol/resources/data-xfer-resource.php?redirect=1
   isChunked: false
   isH2: false
   redirected: false
-  headersSize: 169
+  headersSize: 167
   receivedDataSize: 2123
-  reportedTotalSize: 2292
+  reportedTotalSize: 2290
 
 url: http://127.0.0.1:8000/inspector-protocol/resources/data-xfer-resource.php?cached=1
   isChunked: false
   isH2: false
   redirected: false
-  headersSize: 169
+  headersSize: 167
   receivedDataSize: 2470
-  reportedTotalSize: 2639
+  reportedTotalSize: 2637
 
 
diff --git a/third_party/blink/web_tests/platform/win11-arm64/http/tests/media/mixed-range-response-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/http/tests/media/mixed-range-response-expected.txt
new file mode 100644
index 0000000..bf5e5c52
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win11-arm64/http/tests/media/mixed-range-response-expected.txt
@@ -0,0 +1,26 @@
+CONSOLE ERROR: Access to audio at 'http://localhost:8000/media/resources/load-video.php?name=../../../../media/content/silence.oga&type=audio/ogg' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
+CONSOLE ERROR: Access to audio at 'http://localhost:8000/media/resources/load-video.php?name=../../../../media/content/silence.oga&type=audio/ogg&cors_allow_origin=http://127.0.0.1:8000' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
+CONSOLE ERROR: Access to audio at 'http://localhost:8000/resources/redirect.php?url=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
+CONSOLE ERROR: Access to audio at 'http://localhost:8000/resources/redirect.php?url=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000&cors_allow_origin=http://127.0.0.1:8000' from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
+CONSOLE ERROR: Access to audio at 'http://localhost:8000/media/resources/load-video.php?name=../../../../media/content/silence.oga&type=audio/ogg&cors_allow_origin=http://127.0.0.1:8000' (redirected from 'http://localhost:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000&cors_allow_origin=http://127.0.0.1:8000') from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
+CONSOLE ERROR: Access to audio at 'http://localhost:8000/media/resources/load-video.php?name=../../../../media/content/silence.oga&type=audio/ogg&cors_allow_origin=http://127.0.0.1:8000' (redirected from 'http://127.0.0.1:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000') from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
+CONSOLE ERROR: Access to audio at 'http://127.0.0.1:8000/media/resources/load-video.php?name=../../../../media/content/silence.oga&type=audio/ogg&cors_allow_origin=*' (redirected from 'http://localhost:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2F127.0.0.1%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3D*&cors_allow_origin=http://127.0.0.1:8000') from origin 'http://127.0.0.1:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
+This is a testharness.js-based test.
+FAIL Redirect from same-origin to same-origin must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://127.0.0.1:8000/resources/redirect.php?url=http%3A%2F%2F127.0.0.1%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg"
+FAIL Redirect from same-origin to remote-origin must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://127.0.0.1:8000/resources/redirect.php?url=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg"
+PASS CORS-disallowed remote-origin with crossOrigin=anonymous must fail.
+FAIL CORS-allowed remote-origin with crossOrigin=anonymous must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://localhost:8000/media/resources/load-video.php?name=../../../../media/content/silence.oga&type=audio/ogg&cors_allow_origin=http://127.0.0.1:8000"
+FAIL Redirect from same-origin to same-origin with crossOrigin=anonymous must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://127.0.0.1:8000/resources/redirect.php?url=http%3A%2F%2F127.0.0.1%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg"
+PASS Redirect from same-origin to CORS-disallowed remote-origin with crossOrigin=anonymous must fail.
+FAIL Redirect from same-origin to CORS-allowed remote-origin with crossOrigin=anonymous must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://127.0.0.1:8000/resources/redirect.php?url=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000"
+PASS Redirect from CORS-disallowed remote-origin to CORS-allowed remote-origin with crossOrigin=anonymous must fail.
+FAIL Redirect from CORS-allowed remote-origin to CORS-allowed remote-origin with crossOrigin=anonymous must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://localhost:8000/resources/redirect.php?url=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000&cors_allow_origin=http://127.0.0.1:8000"
+FAIL Mixing same-origin responses must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://127.0.0.1:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2F127.0.0.1%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg"
+PASS Mixing same-origin response and remote-origin response must fail.
+PASS Mixing remote-origin response and same-origin response must fail.
+FAIL Mixing same remote-origin responses must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://localhost:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg"
+FAIL Mixing same CORS-allowed remote-origin responses with crossOrigin=anonymous must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://localhost:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000&cors_allow_origin=http://127.0.0.1:8000"
+FAIL Mixing same-origin response and CORS-allowed remote-origin response with crossOrigin=anonymous must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://127.0.0.1:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2Flocalhost%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3Dhttp%3A%2F%2F127.0.0.1%3A8000"
+FAIL Mixing CORS-allowed remote-origin response and same-origin response with crossOrigin=anonymous must succeed. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://localhost:8000/media/resources/mixed-range-response.php?location=http%3A%2F%2F127.0.0.1%3A8000%2Fmedia%2Fresources%2Fload-video.php%3Fname%3D..%2F..%2F..%2F..%2Fmedia%2Fcontent%2Fsilence.oga%26type%3Daudio%2Fogg%26cors_allow_origin%3D*&cors_allow_origin=http://127.0.0.1:8000"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win11-arm64/http/tests/serviceworker/service-worker-mixed-response-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/http/tests/serviceworker/service-worker-mixed-response-expected.txt
new file mode 100644
index 0000000..98d1531
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win11-arm64/http/tests/serviceworker/service-worker-mixed-response-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Tests for Service Worker generated mixed responses. promise_test: Unhandled rejection with value: "error event should not be fired. url: http://127.0.0.1:8000/media/resources/load-video.php?name=../../../../media/content/silence.oga&type=audio/ogg&SW_FIRST=&SW_SECOND=&prevent_cache=1"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/win11-arm64/media/track/track-cue-rendering-ruby-expected.png b/third_party/blink/web_tests/platform/win11-arm64/media/track/track-cue-rendering-ruby-expected.png
index c1323cea..16c9937 100644
--- a/third_party/blink/web_tests/platform/win11-arm64/media/track/track-cue-rendering-ruby-expected.png
+++ b/third_party/blink/web_tests/platform/win11-arm64/media/track/track-cue-rendering-ruby-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png b/third_party/blink/web_tests/platform/win11-arm64/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png
deleted file mode 100644
index b970889..0000000
--- a/third_party/blink/web_tests/platform/win11-arm64/svg/W3C-SVG-1.1/text-fonts-01-t-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/svg/W3C-SVG-1.1/text-intro-01-t-expected.png b/third_party/blink/web_tests/platform/win11-arm64/svg/W3C-SVG-1.1/text-intro-01-t-expected.png
deleted file mode 100644
index d29f5ae..0000000
--- a/third_party/blink/web_tests/platform/win11-arm64/svg/W3C-SVG-1.1/text-intro-01-t-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/svg/text/textLength-spacingAndGlyphs-decoration-expected.png b/third_party/blink/web_tests/platform/win11-arm64/svg/text/textLength-spacingAndGlyphs-decoration-expected.png
index c70801b..a08cc32 100644
--- a/third_party/blink/web_tests/platform/win11-arm64/svg/text/textLength-spacingAndGlyphs-decoration-expected.png
+++ b/third_party/blink/web_tests/platform/win11-arm64/svg/text/textLength-spacingAndGlyphs-decoration-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/virtual/exotic-color-space/images/missing-image-border-zoom-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/virtual/exotic-color-space/images/missing-image-border-zoom-expected.txt
deleted file mode 100644
index dfddf31..0000000
--- a/third_party/blink/web_tests/platform/win11-arm64/virtual/exotic-color-space/images/missing-image-border-zoom-expected.txt
+++ /dev/null
@@ -1 +0,0 @@
-Blocked access to external URL https://www.example.com/doesntexist.png
diff --git a/third_party/blink/web_tests/platform/win11-arm64/virtual/fledge/http/tests/inspector-protocol/timeline/auction-worklet-network-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/virtual/fledge/http/tests/inspector-protocol/timeline/auction-worklet-network-expected.txt
index a329854..1ae371e6 100644
--- a/third_party/blink/web_tests/platform/win11-arm64/virtual/fledge/http/tests/inspector-protocol/timeline/auction-worklet-network-expected.txt
+++ b/third_party/blink/web_tests/platform/win11-arm64/virtual/fledge/http/tests/inspector-protocol/timeline/auction-worklet-network-expected.txt
@@ -8,7 +8,7 @@
     url : https://a.test:8443/inspector-protocol/resources/fledge_bidding_logic.js.php
 }
 ResourceReceiveResponse {
-    encodedDataLength : 228
+    encodedDataLength : 226
     fromCache : false
     fromServiceWorker : false
     mimeType : application/javascript
@@ -37,7 +37,7 @@
 ResourceFinish {
     decodedBodyLength : 598
     didFail : false
-    encodedDataLength : 228
+    encodedDataLength : 226
     finishTime : <number>
     requestId : <string>
 }
@@ -49,7 +49,7 @@
     url : https://a.test:8443/inspector-protocol/resources/fledge_decision_logic.js.php
 }
 ResourceReceiveResponse {
-    encodedDataLength : 228
+    encodedDataLength : 226
     fromCache : false
     fromServiceWorker : false
     mimeType : application/javascript
@@ -78,7 +78,7 @@
 ResourceFinish {
     decodedBodyLength : 522
     didFail : false
-    encodedDataLength : 228
+    encodedDataLength : 226
     finishTime : <number>
     requestId : <string>
 }
diff --git a/third_party/blink/web_tests/platform/win11-arm64/virtual/partitioned-cookies/http/tests/inspector-protocol/network/is-same-site-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/virtual/partitioned-cookies/http/tests/inspector-protocol/network/is-same-site-expected.txt
new file mode 100644
index 0000000..e663374d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win11-arm64/virtual/partitioned-cookies/http/tests/inspector-protocol/network/is-same-site-expected.txt
@@ -0,0 +1,132 @@
+Verifies that same site requests are marked as such
+requests[
+    [0] : {
+        headers : {
+            Referer : http://127.0.0.1:8000/inspector-protocol/network/resources/same-site-iframe.html
+            User-Agent : <string>
+            sec-ch-ua : "content_shell";v="999"
+            sec-ch-ua-mobile : ?0
+            sec-ch-ua-platform : "Unknown"
+        }
+        initialPriority : Medium
+        isSameSite : true
+        method : GET
+        mixedContentType : none
+        referrerPolicy : strict-origin-when-cross-origin
+        url : http://127.0.0.1:8000/inspector-protocol/network/resources/relative.png
+    }
+    [1] : {
+        headers : {
+            Referer : http://127.0.0.1:8000/inspector-protocol/network/resources/same-site-root.html
+            User-Agent : <string>
+            sec-ch-ua : "content_shell";v="999"
+            sec-ch-ua-mobile : ?0
+            sec-ch-ua-platform : "Unknown"
+        }
+        initialPriority : Low
+        isSameSite : true
+        method : GET
+        mixedContentType : none
+        referrerPolicy : strict-origin-when-cross-origin
+        url : http://127.0.0.1:8000/inspector-protocol/network/resources/root-relative-image.png
+    }
+    [2] : {
+        headers : {
+            Referer : http://127.0.0.1:8000/inspector-protocol/network/resources/same-site-root.html
+            Upgrade-Insecure-Requests : 1
+            User-Agent : <string>
+            sec-ch-ua : "content_shell";v="999"
+            sec-ch-ua-mobile : ?0
+            sec-ch-ua-platform : "Unknown"
+        }
+        initialPriority : VeryHigh
+        isSameSite : true
+        method : GET
+        mixedContentType : none
+        referrerPolicy : strict-origin-when-cross-origin
+        url : http://127.0.0.1:8000/inspector-protocol/network/resources/same-site-iframe.html
+    }
+    [3] : {
+        headers : {
+            Upgrade-Insecure-Requests : 1
+            User-Agent : <string>
+            sec-ch-ua : "content_shell";v="999"
+            sec-ch-ua-mobile : ?0
+            sec-ch-ua-platform : "Unknown"
+        }
+        initialPriority : VeryHigh
+        isSameSite : true
+        method : GET
+        mixedContentType : none
+        referrerPolicy : strict-origin-when-cross-origin
+        url : http://127.0.0.1:8000/inspector-protocol/network/resources/same-site-root.html
+    }
+    [4] : {
+        headers : {
+            Referer : http://127.0.0.1:8000/inspector-protocol/network/resources/same-site-iframe.html
+            User-Agent : <string>
+            sec-ch-ua : "content_shell";v="999"
+            sec-ch-ua-mobile : ?0
+            sec-ch-ua-platform : "Unknown"
+        }
+        initialPriority : Medium
+        isSameSite : true
+        method : GET
+        mixedContentType : none
+        referrerPolicy : strict-origin-when-cross-origin
+        url : http://127.0.0.1:8000/root.png
+    }
+    [5] : {
+        headers : {
+            Referer : http://devtools.oopif.test:8000/
+            User-Agent : <string>
+            sec-ch-ua : "content_shell";v="999"
+            sec-ch-ua-mobile : ?0
+            sec-ch-ua-platform : "Unknown"
+        }
+        initialPriority : Medium
+        isSameSite : false
+        method : GET
+        mixedContentType : none
+        referrerPolicy : strict-origin-when-cross-origin
+        url : http://127.0.0.1:8000/root.png
+    }
+    [6] : {
+        headers : {
+            Referer : http://127.0.0.1:8000/
+            User-Agent : <string>
+        }
+        initialPriority : Low
+        isSameSite : false
+        method : GET
+        mixedContentType : none
+        referrerPolicy : strict-origin-when-cross-origin
+        url : http://devtools.oopif.test:8000/external-image.png
+    }
+    [7] : {
+        headers : {
+            Referer : http://devtools.oopif.test:8000/inspector-protocol/network/resources/same-site-iframe.html
+            User-Agent : <string>
+        }
+        initialPriority : Medium
+        isSameSite : false
+        method : GET
+        mixedContentType : none
+        referrerPolicy : strict-origin-when-cross-origin
+        url : http://devtools.oopif.test:8000/inspector-protocol/network/resources/relative.png
+    }
+    [8] : {
+        headers : {
+            Referer : http://127.0.0.1:8000/
+            Upgrade-Insecure-Requests : 1
+            User-Agent : <string>
+        }
+        initialPriority : VeryHigh
+        isSameSite : false
+        method : GET
+        mixedContentType : none
+        referrerPolicy : strict-origin-when-cross-origin
+        url : http://devtools.oopif.test:8000/inspector-protocol/network/resources/same-site-iframe.html
+    }
+]
+
diff --git a/third_party/blink/web_tests/platform/win11-arm64/virtual/text-antialias/international/001-expected.png b/third_party/blink/web_tests/platform/win11-arm64/virtual/text-antialias/international/001-expected.png
deleted file mode 100644
index df15adb2..0000000
--- a/third_party/blink/web_tests/platform/win11-arm64/virtual/text-antialias/international/001-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/svg/clip-path/clip-path-childs-clipped-expected.png b/third_party/blink/web_tests/svg/clip-path/clip-path-childs-clipped-expected.png
index c71b038..73929f5 100644
--- a/third_party/blink/web_tests/svg/clip-path/clip-path-childs-clipped-expected.png
+++ b/third_party/blink/web_tests/svg/clip-path/clip-path-childs-clipped-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-2-expected.png b/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-2-expected.png
index b98c1aad..a025ef1 100644
--- a/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-2-expected.png
+++ b/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-expected.png b/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-expected.png
index a56f9cbc..3f79c65 100644
--- a/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-expected.png
+++ b/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-color-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-color-attr-expected.png
index 8b1b9a63..c0e85ad 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-color-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-color-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-color-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-color-prop-expected.png
index 8b1b9a63..c0e85ad 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-color-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-color-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/feDropShadow-expected.png b/third_party/blink/web_tests/svg/filters/feDropShadow-expected.png
index e0479cec..11a1515e 100644
--- a/third_party/blink/web_tests/svg/filters/feDropShadow-expected.png
+++ b/third_party/blink/web_tests/svg/filters/feDropShadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/filter-clip-expected.png b/third_party/blink/web_tests/svg/filters/filter-clip-expected.png
index a44edc7..9a7b28c 100644
--- a/third_party/blink/web_tests/svg/filters/filter-clip-expected.png
+++ b/third_party/blink/web_tests/svg/filters/filter-clip-expected.png
Binary files differ
diff --git a/third_party/ipcz/include/ipcz/ipcz.h b/third_party/ipcz/include/ipcz/ipcz.h
index 665533d4..b2072b9 100644
--- a/third_party/ipcz/include/ipcz/ipcz.h
+++ b/third_party/ipcz/include/ipcz/ipcz.h
@@ -192,48 +192,44 @@
 
 #define IPCZ_INVALID_DRIVER_HANDLE ((IpczDriverHandle)0)
 
-// Flags given to the ipcz activity handler by a driver transport to notify ipcz
-// about incoming data or state changes.
+// Flags which may be passed by a driver to an IpczTransportActivityHandler when
+// notifying ipcz about transport activity.
 typedef uint32_t IpczTransportActivityFlags;
 
-// If set, the driver encountered an unrecoverable error using the transport and
-// ipcz should discard it. Note that the driver is free to issue such
-// notifications many times as long as it remains active, but ipcz will generally
-// request deactivation ASAP once an error is signaled.
+// Indicates that the driver encountered an unrecoverable error while using the
+// transport. This generally results in ipcz deactivating the transport via the
+// driver's DeactivateTransport().
 #define IPCZ_TRANSPORT_ACTIVITY_ERROR IPCZ_FLAG_BIT(0)
 
-// When ipcz wants to deactivate a transport, it invokes the driver's
-// DeactivateTransport() function. Once the driver has finished any clean up and
-// can ensure that the transport's activity handler will no longer be invoked,
-// it must then invoke the activity handler one final time with this flag set.
-// This finalizes deactivation and allows ipcz to free any associated resources.
+// Informs ipcz that the driver will no longer invoke the activity handler for
+// a given listener, as the driver is no longer listening for activity on the
+// corresponding transport.
 #define IPCZ_TRANSPORT_ACTIVITY_DEACTIVATED IPCZ_FLAG_BIT(1)
 
 #if defined(__cplusplus)
 extern "C" {
 #endif
 
-// Notifies ipcz of activity on a transport. `transport` must be a handle to a
-// transport which is currently activated. The `transport` handle is acquired
-// exclusively by the driver transport via an ipcz call to the driver's
-// ActivateTransport(), which also provides the handle to the driver.
+// Notifies ipcz of activity on a transport. `listener` must be a handle to an
+// active transport's listener, as provided to the driver by ipcz via
+// ActivateTransport().
 //
-// The driver must use this function to feed incoming data and driver handles
-// from the transport to ipcz, or to inform ipcz of any error conditions
-// resulting in unexpected and irrecoverable dysfunction of the transport.
+// Drivers use this function to feed incoming data and driver handles from a
+// transport to ipcz, or to inform ipcz of any unrecoverable dysfunction of the
+// transport. In the latter case, drivers specify IPCZ_TRANSPORT_ACTIVITY_ERROR
+// in `flags` to instigate deactivation and disposal of the transport by ipcz.
 //
-// If the driver encounters an unrecoverable error while performing I/O on the
-// transport, it should invoke this with the IPCZ_TRANSPORT_ACTIVITY_ERROR flag
-// to instigate deactivation of the transport by ipcz via a subsequent
-// DeactivateTransport() call.
+// If IPCZ_TRANSPORT_ACTIVITY_DEACTIVATED is set in `flags`, this must be the
+// last call made by the driver for the given `listener`. See also
+// DeactivateTransport() defined on IpczDriver below.
 //
 // `options` is currently unused and must be null.
 //
-// NOTE: It is the driver's responsibility to ensure that calls to this function
-// for the same value of `transport` are mutually exclusive. Overlapping calls
-// are unsafe and will result in undefined behavior.
+// IMPORTANT: Drivers must ensure that all calls to this handler for the same
+// `listener` are mutually exclusive. Overlapping calls are unsafe and will
+// result in undefined behavior.
 typedef IpczResult(IPCZ_API* IpczTransportActivityHandler)(
-    IpczHandle transport,                    // in
+    IpczHandle listener,                     // in
     const void* data,                        // in
     size_t num_bytes,                        // in
     const IpczDriverHandle* driver_handles,  // in
@@ -259,11 +255,6 @@
 // I/O operations to facilitate communication between nodes, giving embedding
 // systems full control over choice of OS-specific transport mechanisms and I/O
 // scheduling decisions.
-//
-// The driver API is meant to be used by both the application embedding ipcz,
-// particularly for creating transports to make initial contact between nodes,
-// as well as by ipcz itself to delegate creation and management of new
-// transports which ipcz brokers between nodes.
 struct IPCZ_ALIGN(8) IpczDriver {
   // The exact size of this structure in bytes. Must be set accurately by the
   // application before passing this structure to any ipcz API functions.
@@ -284,12 +275,12 @@
   // Serializes a driver object identified by `handle` into a collection of
   // bytes and readily transmissible driver objects, for eventual transmission
   // over `transport`. At a minimum this must support serialization of transport
-  // and memory objects allocated by ipcz through the driver. Any other driver
-  // objects intended for applications to box and transmit through portals must
-  // also be serializable here.
+  // and memory objects created by the same driver. Any other driver objects
+  // intended for applications to box and transmit through portals must also be
+  // serializable here.
   //
-  // If the specified object is invalid or unserializable, the driver must
-  // ignore all other arguments (including `transport`) and return
+  // If the object identified by `handle` is invalid or unserializable, the
+  // driver must ignore all other arguments (including `transport`) and return
   // IPCZ_RESULT_INVALID_ARGUMENT.
   //
   // If the object can be serialized but success may depend on the value of
@@ -307,27 +298,27 @@
   // object through a more capable broker node.
   //
   // For all other outcomes, the object identified by `handle` is considered to
-  // be serializable and ultimately transmissible.
+  // be serializable.
   //
   // `num_bytes` and `num_handles` on input point to the capacities of the
-  // respective output buffers provided by ipcz. If either capacity pointer is
-  // null, a capacity of zero is implied; and if either input capacity is zero,
-  // the corresponding input buffer may be null.
+  // respective output buffers provided by `data` and `handles`. If either
+  // capacity pointer is null, a capacity of zero is implied; and if either
+  // input capacity is zero, the corresponding output buffer may be null.
   //
   // Except in the failure modes described above, the driver must update any
   // non-null capacity input to reflect the exact capacity required to serialize
   // the object. For example if `num_bytes` is non-null and the object
   // serializes to 8 bytes of data, `*num_bytes` must be set to 8 upon return.
   //
-  // If the required data or handle capacity is larger than the respective input
-  // capacity, the driver must return IPCZ_RESULT_RESUORCE_EXHAUSTED without
-  // modifying the contents of either `data` or `handles` buffers.
+  // If serializing the object requires more data or handle capacity than ipcz
+  // provided, the driver must return IPCZ_RESULT_RESUORCE_EXHAUSTED after
+  // updating the capacity values as described above. In this case the driver
+  // must not touch `data` or `handles`.
   //
   // Finally, if the input capacities were both sufficient, the driver must fill
   // `data` and `handles` with a serialized representation of the object and
   // return IPCZ_RESULT_OK. In this case ipcz relinquishes `handle` and will no
-  // longer refer to it unless the driver outputs it back in `handles`, implying
-  // that it was already transmissible as-is.
+  // longer refer to it.
   IpczResult(IPCZ_API* Serialize)(IpczDriverHandle handle,     // in
                                   IpczDriverHandle transport,  // in
                                   uint32_t flags,              // in
@@ -341,12 +332,12 @@
   // =============
   //
   // Deserializes a driver object from a collection of bytes and transmissible
-  // driver objects which was originally produced by Serialize() and received on
-  // the calling node via `transport`.
+  // driver handles that was originally produced by Serialize() and received by
+  // activity on `transport`.
   //
   // Any return value other than IPCZ_RESULT_OK indicates an error and implies
-  // that `handle` is unmodified. Otherwise `handle` must contain a valid driver
-  // handle to the deserialized object.
+  // that `handle` is unmodified. Otherwise `*handle` must be set to a valid
+  // driver handle which identifies the deserialized object upon return.
   IpczResult(IPCZ_API* Deserialize)(
       const volatile void* data,               // in
       size_t num_bytes,                        // in
@@ -372,6 +363,9 @@
   //
   // Any return value other than IPCZ_RESULT_OK indicates an error and implies
   // that `new_transport0` and `new_transport1` are unmodified.
+  //
+  // Returned transports may be used immediately by ipcz for Transmit(), even
+  // if the transports are not yet activated.
   IpczResult(IPCZ_API* CreateTransports)(
       IpczDriverHandle transport0,        // in
       IpczDriverHandle transport1,        // in
@@ -383,34 +377,33 @@
   // ActivateTransport()
   // ===================
   //
-  // Called by ipcz to activate a transport. `driver_transport` is the
-  // driver-side handle assigned to the transport by the driver, either as given
-  // to ipcz via ConnectNode(), or as returned by the driver from an ipcz call
-  // out to CreateTransports().
+  // Called by ipcz to activate a given `transport`, either as given to ipcz via
+  // ConnectNode(), or as returned by the driver from CreateTransports().
   //
-  // `transport` is a handle the driver can use when calling `activity_handler`
-  // to update ipcz regarding any incoming data or state changes from the
+  // `listener` is a handle the driver must use when calling `activity_handler`
+  // to notify ipcz about any incoming data or state changes on the identified
   // transport.
   //
   // Before this returns, the driver should establish any I/O monitoring or
-  // scheduling state necessary to support operation of the endpoint, and once
-  // it returns ipcz may immediately begin making Transmit() calls on
-  // `driver_transport`.
+  // scheduling state necessary to support operation of the endpoint.
   //
   // Any return value other than IPCZ_RESULT_OK indicates an error, and the
-  // endpoint will be dropped by ipcz. Otherwise the endpoint may be used
-  // immediately to accept or submit data, and it should continue to operate
-  // until ipcz calls Close() on `driver_transport`.
+  // transport will be closed by ipcz. Otherwise the transport may immediately
+  // begin to invoke `activity_handler` and may continue to do so until
+  // deactivated via DeactivateTransport().
   //
-  // Note that `activity_handler` invocations MUST be mutually exclusive,
-  // because transmissions from ipcz are expected to arrive and be processed
-  // strictly in-order.
+  // Note that while `activity_handler` may be invoked by the driver from any
+  // thread, invocations MUST be mutually exclusive for a given `listener`.
+  // Overlapping invocations are unsafe and will result in undefined behavior.
   //
-  // The driver may elicit forced destruction of itself by calling
-  // `activity_handler` with the flag IPCZ_TRANSPORT_ACTIVITY_DEACTIVATED.
+  // The driver may elicit forced deactivation and destruction of an active
+  // transport by calling `activity_handler` with the
+  // IPCZ_TRANSPORT_ACTIVITY_DEACTIVATED flag. Otherwise ipcz will eventually
+  // deactivate `transport` when it's no longer in use by calling
+  // DeactivateTransport().
   IpczResult(IPCZ_API* ActivateTransport)(
-      IpczDriverHandle driver_transport,              // in
-      IpczHandle transport,                           // in
+      IpczDriverHandle transport,                     // in
+      IpczHandle listener,                            // in
       IpczTransportActivityHandler activity_handler,  // in
       uint32_t flags,                                 // in
       const void* options);                           // in
@@ -418,19 +411,20 @@
   // DeactivateTransport()
   // =====================
   //
-  // Called by ipcz to deactivate a transport. The driver does not need to
-  // complete deactivation synchronously, but it must begin to deactivate the
-  // transport and must invoke the transport's activity handler one final time
-  // with IPCZ_TRANSPORT_ACTIVITY_DEACTIVATED once finished. Beyond that point,
-  // the activity handler must no longer be invoked for that transport.
+  // Called by ipcz to deactivate a transport that is no longer needed.
   //
-  // Note that even after deactivation, ipcz may continue to call into the
-  // transport until it's closed with an explicit call to the driver's Close()
-  // by ipcz.
-  IpczResult(IPCZ_API* DeactivateTransport)(
-      IpczDriverHandle driver_transport,  // in
-      uint32_t flags,                     // in
-      const void* options);               // in
+  // The driver does not need to complete deactivation synchronously, but it
+  // must eventually (soon) cease operation of the transport and finalize the
+  // deactivation by invoking activity handler one final time with
+  // IPCZ_TRANSPORT_ACTIVITY_DEACTIVATED. Failure to do this will result in
+  // resource leaks.
+  //
+  // Note that even after deactivation, ipcz may continue to call into
+  // `transport` for other operations (e.g. Serialize() or Transmit()) until
+  // it's closed by ipcz with an explicit call to the driver's Close().
+  IpczResult(IPCZ_API* DeactivateTransport)(IpczDriverHandle transport,  // in
+                                            uint32_t flags,              // in
+                                            const void* options);        // in
 
   // Transmit()
   // ==========
@@ -440,21 +434,19 @@
   // it must return a result other than IPCZ_RESULT_OK, and this will cause the
   // transport's connection to be severed.
   //
-  // Note that any driver handles in `driver_handles` were obtained by ipcz from
-  // the driver itself, by some prior call to the driver's own Serialize()
+  // Note that all handles in `driver_handles` were obtained by ipcz from the
+  // driver itself, as returned by a prior call to the driver's own Serialize()
   // function. These handles are therefore expected to be directly transmissible
   // by the driver alongside any data in `data`.
   //
-  // The net result of this transmission should be an activity handler
-  // invocation on the corresponding remote transport by the driver on its node.
-  // It is the driver's responsibility to get any data and handles to the other
-  // transport, and to ensure that all transmissions from transport end up
-  // invoking the activity handler on the peer transport in the same order they
-  // were transmitted.
+  // The driver is responsible for ensuring that every Transmit() on a transport
+  // results in a corresponding activity handler invocation on the remote peer's
+  // transport, even if `num_bytes` and `num_driver_handles` are both zero.
   //
-  // If ipcz only wants to wake the peer node rather than transmit data or
-  // handles, `num_bytes` and `num_driver_handles` may both be zero.
-  IpczResult(IPCZ_API* Transmit)(IpczDriverHandle driver_transport,       // in
+  // IMPORTANT: For any sequence of Transmit() calls from the same thread, the
+  // corresponding activity handler invocations on the peer transport must
+  // occur in the same order.
+  IpczResult(IPCZ_API* Transmit)(IpczDriverHandle transport,              // in
                                  const void* data,                        // in
                                  size_t num_bytes,                        // in
                                  const IpczDriverHandle* driver_handles,  // in
@@ -468,7 +460,7 @@
   // The ipcz Reject() API can be used by an application to reject a specific
   // parcel received from a portal. If the parcel in question came from a
   // remote node, ipcz invokes ReportBadTransportActivity() to notify the driver
-  // about the `transport` which delivered the rejected parcel.
+  // about the `transport` which received the rejected parcel.
   //
   // `context` is an opaque value passed by the application to the Reject() call
   // which elicited this invocation.
@@ -1006,9 +998,10 @@
   // =============
   //
   // Connects `node` to another node in the system using an application-provided
-  // driver transport handle in `driver_transport` for communication. If this
-  // call will succeed, ipcz will call back into the driver to activate this
-  // transport via ActivateTransport() before returning.
+  // driver transport handle in `transport` for communication. If this call will
+  // succeed, ipcz will call back into the driver to activate the transport via
+  // ActivateTransport() before returning, and may call Transmit() before or
+  // after that as well.
   //
   // The application is responsible for delivering the other endpoint of the
   // transport to whatever other node will use it with its own corresponding
@@ -1069,12 +1062,12 @@
   //    IPCZ_RESULT_OUT_OF_RANGE if `num_initial_portals` is larger than the
   //        ipcz implementation allows. There is no hard limit specified, but
   //        any ipcz implementation must support at least 8 initial portals.
-  IpczResult(IPCZ_API* ConnectNode)(IpczHandle node,                    // in
-                                    IpczDriverHandle driver_transport,  // in
-                                    size_t num_initial_portals,         // in
-                                    IpczConnectNodeFlags flags,         // in
-                                    const void* options,                // in
-                                    IpczHandle* initial_portals);       // out
+  IpczResult(IPCZ_API* ConnectNode)(IpczHandle node,               // in
+                                    IpczDriverHandle transport,    // in
+                                    size_t num_initial_portals,    // in
+                                    IpczConnectNodeFlags flags,    // in
+                                    const void* options,           // in
+                                    IpczHandle* initial_portals);  // out
 
   // OpenPortals()
   // =============
diff --git a/third_party/ipcz/src/ipcz/api_object.h b/third_party/ipcz/src/ipcz/api_object.h
index 9a4610f..e57c85f 100644
--- a/third_party/ipcz/src/ipcz/api_object.h
+++ b/third_party/ipcz/src/ipcz/api_object.h
@@ -23,7 +23,7 @@
     kNode,
     kPortal,
     kBox,
-    kTransport,
+    kTransportListener,
     kParcel,
   };
 
diff --git a/third_party/ipcz/src/ipcz/driver_transport.cc b/third_party/ipcz/src/ipcz/driver_transport.cc
index a8cb7a1..096f1b3b 100644
--- a/third_party/ipcz/src/ipcz/driver_transport.cc
+++ b/third_party/ipcz/src/ipcz/driver_transport.cc
@@ -19,21 +19,21 @@
 
 namespace {
 
-IpczResult IPCZ_API NotifyTransport(IpczHandle transport,
+IpczResult IPCZ_API NotifyTransport(IpczHandle listener,
                                     const void* data,
                                     size_t num_bytes,
                                     const IpczDriverHandle* driver_handles,
                                     size_t num_driver_handles,
                                     IpczTransportActivityFlags flags,
                                     const void* options) {
-  DriverTransport* t = DriverTransport::FromHandle(transport);
+  DriverTransport* t = DriverTransport::FromHandle(listener);
   if (!t) {
     return IPCZ_RESULT_INVALID_ARGUMENT;
   }
 
   if (flags & IPCZ_TRANSPORT_ACTIVITY_DEACTIVATED) {
     const Ref<DriverTransport> doomed_transport =
-        DriverTransport::TakeFromHandle(transport);
+        DriverTransport::TakeFromHandle(listener);
     doomed_transport->NotifyDeactivated();
     return IPCZ_RESULT_OK;
   }
diff --git a/third_party/ipcz/src/ipcz/driver_transport.h b/third_party/ipcz/src/ipcz/driver_transport.h
index e95bfff..c1f79e67 100644
--- a/third_party/ipcz/src/ipcz/driver_transport.h
+++ b/third_party/ipcz/src/ipcz/driver_transport.h
@@ -26,7 +26,7 @@
 // on the transport, and ipcz calls into this object to submit outgoing messages
 // for transmission by the driver.
 class DriverTransport
-    : public APIObjectImpl<DriverTransport, APIObject::kTransport> {
+    : public APIObjectImpl<DriverTransport, APIObject::kTransportListener> {
  public:
   using Pair = std::pair<Ref<DriverTransport>, Ref<DriverTransport>>;
 
diff --git a/third_party/ipcz/src/reference_drivers/async_reference_driver.cc b/third_party/ipcz/src/reference_drivers/async_reference_driver.cc
index 98ae2c4..0705d2ad 100644
--- a/third_party/ipcz/src/reference_drivers/async_reference_driver.cc
+++ b/third_party/ipcz/src/reference_drivers/async_reference_driver.cc
@@ -211,11 +211,11 @@
 }
 
 IpczResult IPCZ_API ActivateTransport(IpczDriverHandle transport,
-                                      IpczHandle ipcz_transport,
+                                      IpczHandle listener,
                                       IpczTransportActivityHandler handler,
                                       uint32_t,
                                       const void*) {
-  AsyncTransport::FromHandle(transport)->Activate(ipcz_transport, handler);
+  AsyncTransport::FromHandle(transport)->Activate(listener, handler);
   return IPCZ_RESULT_OK;
 }
 
diff --git a/third_party/ipcz/src/reference_drivers/multiprocess_reference_driver.cc b/third_party/ipcz/src/reference_drivers/multiprocess_reference_driver.cc
index 23f57256..4f655f49 100644
--- a/third_party/ipcz/src/reference_drivers/multiprocess_reference_driver.cc
+++ b/third_party/ipcz/src/reference_drivers/multiprocess_reference_driver.cc
@@ -306,33 +306,33 @@
 }
 
 IpczResult IPCZ_API
-ActivateTransport(IpczDriverHandle driver_transport,
-                  IpczHandle transport,
+ActivateTransport(IpczDriverHandle transport,
+                  IpczHandle listener,
                   IpczTransportActivityHandler activity_handler,
                   uint32_t flags,
                   const void* options) {
-  MultiprocessTransport::FromHandle(driver_transport)
-      ->Activate(transport, activity_handler);
+  MultiprocessTransport::FromHandle(transport)->Activate(listener,
+                                                         activity_handler);
   return IPCZ_RESULT_OK;
 }
 
-IpczResult IPCZ_API DeactivateTransport(IpczDriverHandle driver_transport,
+IpczResult IPCZ_API DeactivateTransport(IpczDriverHandle transport,
                                         uint32_t flags,
                                         const void* options) {
-  MultiprocessTransport::FromHandle(driver_transport)->Deactivate();
+  MultiprocessTransport::FromHandle(transport)->Deactivate();
   return IPCZ_RESULT_OK;
 }
 
-IpczResult IPCZ_API Transmit(IpczDriverHandle driver_transport,
+IpczResult IPCZ_API Transmit(IpczDriverHandle transport,
                              const void* data,
                              size_t num_bytes,
                              const IpczDriverHandle* handles,
                              size_t num_handles,
                              uint32_t flags,
                              const void* options) {
-  return MultiprocessTransport::FromHandle(driver_transport)
-      ->Transmit(absl::MakeSpan(static_cast<const uint8_t*>(data), num_bytes),
-                 absl::MakeSpan(handles, num_handles));
+  return MultiprocessTransport::FromHandle(transport)->Transmit(
+      absl::MakeSpan(static_cast<const uint8_t*>(data), num_bytes),
+      absl::MakeSpan(handles, num_handles));
 }
 
 IpczResult IPCZ_API ReportBadTransportActivity(IpczDriverHandle transport,
diff --git a/third_party/ipcz/src/reference_drivers/sync_reference_driver.cc b/third_party/ipcz/src/reference_drivers/sync_reference_driver.cc
index 8b086c6..0a66de0 100644
--- a/third_party/ipcz/src/reference_drivers/sync_reference_driver.cc
+++ b/third_party/ipcz/src/reference_drivers/sync_reference_driver.cc
@@ -340,32 +340,31 @@
   return IPCZ_RESULT_OK;
 }
 
-IpczResult IPCZ_API ActivateTransport(IpczDriverHandle driver_transport,
-                                      IpczHandle transport,
+IpczResult IPCZ_API ActivateTransport(IpczDriverHandle transport,
+                                      IpczHandle listener,
                                       IpczTransportActivityHandler handler,
                                       uint32_t flags,
                                       const void* options) {
-  return InProcessTransport::FromHandle(driver_transport)
-      ->Activate(transport, handler);
+  return InProcessTransport::FromHandle(transport)->Activate(listener, handler);
 }
 
-IpczResult IPCZ_API DeactivateTransport(IpczDriverHandle driver_transport,
+IpczResult IPCZ_API DeactivateTransport(IpczDriverHandle transport,
                                         uint32_t flags,
                                         const void* options) {
-  InProcessTransport::FromHandle(driver_transport)->Deactivate();
+  InProcessTransport::FromHandle(transport)->Deactivate();
   return IPCZ_RESULT_OK;
 }
 
-IpczResult IPCZ_API Transmit(IpczDriverHandle driver_transport,
+IpczResult IPCZ_API Transmit(IpczDriverHandle transport,
                              const void* data,
                              size_t num_bytes,
                              const IpczDriverHandle* handles,
                              size_t num_handles,
                              uint32_t flags,
                              const void* options) {
-  return InProcessTransport::FromHandle(driver_transport)
-      ->Transmit(absl::MakeSpan(static_cast<const uint8_t*>(data), num_bytes),
-                 absl::MakeSpan(handles, num_handles));
+  return InProcessTransport::FromHandle(transport)->Transmit(
+      absl::MakeSpan(static_cast<const uint8_t*>(data), num_bytes),
+      absl::MakeSpan(handles, num_handles));
 }
 
 }  // namespace
diff --git a/third_party/ipcz/src/reference_drivers/sync_reference_driver_test.cc b/third_party/ipcz/src/reference_drivers/sync_reference_driver_test.cc
index a2b8760..ca328a17 100644
--- a/third_party/ipcz/src/reference_drivers/sync_reference_driver_test.cc
+++ b/third_party/ipcz/src/reference_drivers/sync_reference_driver_test.cc
@@ -35,7 +35,7 @@
 // This is used by tests to conveniently handle driver transport notifications
 // with lambdas.
 class TransportReceiver
-    : public APIObjectImpl<TransportReceiver, APIObject::kTransport> {
+    : public APIObjectImpl<TransportReceiver, APIObject::kTransportListener> {
  public:
   explicit TransportReceiver(TransportHandlers handlers)
       : handlers_(std::move(handlers)) {}
diff --git a/tools/binary_size/libsupersize/viewer/static/dom.js b/tools/binary_size/libsupersize/viewer/static/dom.js
index 43fa4eb..be0f7cc5 100644
--- a/tools/binary_size/libsupersize/viewer/static/dom.js
+++ b/tools/binary_size/libsupersize/viewer/static/dom.js
@@ -60,6 +60,32 @@
       element.className = className;
     return element;
   },
+  /**
+   * Schedule a one-time |task| call on next animation frame when |node| is
+   * added to the DOM, or if |node| is already in the DOM.
+   * @param {!Node} node
+   * @param {!function(): *} task
+   */
+  onNodeAdded(node, task) {
+    if (document.contains(node)) {
+      requestAnimationFrame(task);
+      return;
+    }
+    let found = false;
+    const observer = new MutationObserver((mutations) => {
+      for (const mutation of mutations) {
+        for (const node of mutation.addedNodes) {
+          if (node.contains(node)) {
+            observer.disconnect();
+            found = true;
+            requestAnimationFrame(task);
+            return;
+          }
+        }
+      }
+    });
+    observer.observe(document, {subtree: true, childList: true});
+  },
 };
 
 /** Centralized object for element access. */
diff --git a/tools/binary_size/libsupersize/viewer/static/state.js b/tools/binary_size/libsupersize/viewer/static/state.js
index 0f97490..1545bb95 100644
--- a/tools/binary_size/libsupersize/viewer/static/state.js
+++ b/tools/binary_size/libsupersize/viewer/static/state.js
@@ -73,10 +73,11 @@
 class QueryParamUiState extends UiState {
   /**
    * @param {string} name
-   * @param {?function(string): StateValue} parser
    * @param {!StateValue} defaultValue
+   * @param {?function(string): StateValue} parser
+   * @param {boolean} isHash
    */
-  constructor(name, defaultValue, parser) {
+  constructor(name, defaultValue, parser, isHash) {
     super(defaultValue);
 
     /** @public @const {string} */
@@ -85,6 +86,9 @@
     /** @private @const {?function(string): StateValue} null = identity. */
     this.parser = parser;
 
+    /** @public @const {boolean} */
+    this.isHash = isHash;
+
     /** @public {string} */
     this.hidden = false;
   }
@@ -124,8 +128,9 @@
   /**
    * @param {string} name
    * @param {!HasValue} elt
+   * @param {boolean} isHash
    */
-  constructor(name, elt) {
+  constructor(name, elt, isHash) {
     let parser = null;
     let readElt = () => elt.value;
     let writeElt = (v) => {
@@ -178,7 +183,7 @@
       throw new Error('Unknown element type.');
     }
 
-    super(name, readElt(), parser);
+    super(name, readElt(), parser, isHash);
 
     /** @private @const {function(): StateValue} */
     this.readElt = readElt;
@@ -222,13 +227,14 @@
      * Instantiation helper that also pushes object to |uiStates|.
      * @param {string} name
      * @param {?HasValue} elt
+     * @param {boolean=} isHash
      */
-    const newUiState = (name, elt) => {
+    const newUiState = (name, elt, isHash = false) => {
       if (!elt) {
         // Assume string value with defaultValue == ''.
-        this.uiStates.push(new QueryParamUiState(name, '', null));
+        this.uiStates.push(new QueryParamUiState(name, '', null, isHash));
       } else {
-        this.uiStates.push(new ElementUiState(name, elt));
+        this.uiStates.push(new ElementUiState(name, elt, isHash));
       }
       return this.uiStates[this.uiStates.length - 1];
     };
@@ -279,12 +285,15 @@
    * @private
    */
   toString() {
-    const params = new URLSearchParams();
+    const queryParams = new URLSearchParams();
+    const hashParams = new URLSearchParams();
     for (const st of this.uiStates) {
-      st.writeToSearchParams(params);
+      st.writeToSearchParams(st.isHash ? hashParams : queryParams);
     }
-    const queryString = params.toString();
-    return queryString.length > 0 ? `?${queryString}` : '';
+    const queryString = queryParams.toString();
+    const hashString = hashParams.toString();
+    return (queryString.length > 0 ? `?${queryString}` : '') +
+        (hashString.length > 0 ? `#${hashString}` : '');
   }
 
   /** @private */
@@ -361,9 +370,10 @@
 
   /** @public */
   init() {
-    const params = new URLSearchParams(location.search.slice(1));
+    const queryParams = new URLSearchParams(location.search.slice(1));
+    const hashParams = new URLSearchParams(location.hash.slice(1));
     for (const st of this.uiStates) {
-      st.readFromSearchParams(params);
+      st.readFromSearchParams(st.isHash ? hashParams : queryParams);
     }
     // At this point it's possible to update the URL to fix mistakes and
     // canonicalize (e.g., param ordering). However, we choose to NOT do this
diff --git a/tools/binary_size/libsupersize/viewer/static/symbol-tree-ui.js b/tools/binary_size/libsupersize/viewer/static/symbol-tree-ui.js
index 3649e4f1..ca0422e6 100644
--- a/tools/binary_size/libsupersize/viewer/static/symbol-tree-ui.js
+++ b/tools/binary_size/libsupersize/viewer/static/symbol-tree-ui.js
@@ -48,7 +48,6 @@
     this.boundHandleFocusOut = this.handleFocusOut.bind(this);
   }
 
-
   /**
    * Displays an error modal to indicate that the symbol tree is empty.
    * @param {boolean} show
@@ -189,8 +188,8 @@
   handleRefocus(event) {
     // Prevent click that would cause another focus event.
     event.preventDefault();
-    // focusout handler will handle cleanup.
     /** @type {!HTMLElement} */ (event.currentTarget).blur();
+    // Let focusout handles the cleanup.
   }
 
   /**
diff --git a/tools/binary_size/libsupersize/viewer/static/tree-ui.js b/tools/binary_size/libsupersize/viewer/static/tree-ui.js
index 6ce7975..a2e994da 100644
--- a/tools/binary_size/libsupersize/viewer/static/tree-ui.js
+++ b/tools/binary_size/libsupersize/viewer/static/tree-ui.js
@@ -24,6 +24,9 @@
 class TreeUi {
   /** @param {!HTMLUListElement} rootElt */
   constructor(rootElt) {
+    /** @protected @const {!HTMLUListElement} rootElt */
+    this.rootElt = rootElt;
+
     /**
      * @protected {HTMLCollectionOf<!TreeNodeElement>} Collection of all tree
      * node elements. Updates itself automatically.
@@ -125,6 +128,44 @@
   }
 
   /**
+   * @param {!HTMLAnchorElement} link
+   * @return {!HTMLLIElement}
+   * @protected
+   */
+  getTreeItemFromLink(link) {
+    // Canonical structure:
+    // <li>                       <!-- |treeitem| -->
+    //   <a class="node">...</a>  <!-- |link| -->
+    //   <ul>...</ul>             <!-- |group| -->
+    // </li>
+    return /** @type {!HTMLLIElement} */ (link.parentElement);
+  }
+
+  /**
+   * @param {!HTMLAnchorElement} link
+   * @return {!HTMLUListElement}
+   * @protected
+   */
+  getGroupFromLink(link) {
+    return /** @type {!HTMLUListElement} */ (link.nextElementSibling);
+  }
+
+  /**
+   * @param {!HTMLElement} link
+   * @param {!Array<DocumentFragment>} childrenElements
+   * @protected
+   */
+  autoExpandAttentionWorthyChild(link, childrenElements) {
+    if (childrenElements.length === 1) {
+      // Open inner element if it only has a single child; this ensures nodes
+      // like "java"->"com"->"google" are opened all at once.
+      const node = /** @type {!TreeNodeElement} */ (
+          childrenElements[0].querySelector('.node'));
+      node.click();
+    }
+  }
+
+  /**
    * Populates |link| with
    * @param {!HTMLAnchorElement} link
    * @protected
@@ -132,16 +173,10 @@
   async expandGroupElement(link) {
     const childrenData = await this.getGroupChildrenData(link);
     const newElements = childrenData.map((data) => this.makeNodeElement(data));
-    if (newElements.length === 1) {
-      // Open inner element if it only has a single child; this ensures nodes
-      // like "java"->"com"->"google" are opened all at once.
-      /** @type {!TreeNodeElement} */
-      const childLink = newElements[0].querySelector('.node');
-      childLink.click();  // Can trigger further expansion.
-    }
+    this.autoExpandAttentionWorthyChild(link, newElements);
     const newElementsFragment = dom.createFragment(newElements);
     requestAnimationFrame(() => {
-      link.nextElementSibling.appendChild(newElementsFragment);
+      this.getGroupFromLink(link).appendChild(newElementsFragment);
     });
   }
 
@@ -152,15 +187,9 @@
    */
   async toggleGroupElement(event) {
     event.preventDefault();
-
-    // Canonical structure:
-    // <li>                       <!-- |treeitem| -->
-    //   <a class="node">...</a>  <!-- |link| -->
-    //   <ul>...</ul>             <!-- |group| -->
-    // </li>
     const link = /** @type {!HTMLAnchorElement} */ (event.currentTarget);
-    const treeitem = /** @type {!HTMLLIElement} */ (link.parentElement);
-    const group = /** @type {!HTMLUListElement} */ (link.nextElementSibling);
+    const treeitem = this.getTreeItemFromLink(link);
+    const group = this.getGroupFromLink(link);
 
     const isExpanded = treeitem.getAttribute('aria-expanded') === 'true';
     if (isExpanded) {
@@ -282,6 +311,35 @@
     return false;
   }
 
+  /**
+   * Handler for gaining focus relative to other TreeUi instances.
+   * @protected
+   */
+  onTreeFocus() {}
+
+  /**
+   * Handler for losing focus relative to other TreeUi instances, i.e., this
+   * does NOT fire when non-TreeUi UI elements gain focus.
+   * @protected
+   */
+  onTreeBlur() {}
+
   /** @public */
-  init() {}
+  focus() {
+    if (TreeUi.activeTreeUi !== this) {
+      if (TreeUi.activeTreeUi)
+        TreeUi.activeTreeUi.onTreeBlur();
+      TreeUi.activeTreeUi = this;
+      TreeUi.activeTreeUi.onTreeFocus();
+    }
+  }
+
+  /** @public */
+  init() {
+    // Each instance contributes to managing focus / blur dynamics.
+    this.rootElt.addEventListener('click', () => this.focus());
+  }
 }
+
+/** @type {?TreeUi} */
+TreeUi.activeTreeUi = null;
diff --git a/tools/binary_size/libsupersize/viewer/static/tree-worker-wasm.js b/tools/binary_size/libsupersize/viewer/static/tree-worker-wasm.js
index 54646028..2953b73 100644
--- a/tools/binary_size/libsupersize/viewer/static/tree-worker-wasm.js
+++ b/tools/binary_size/libsupersize/viewer/static/tree-worker-wasm.js
@@ -128,6 +128,7 @@
   Module._free(heapBuffer.byteOffset);
 }
 
+/** @return {SizeProperties} */
 function wasmLoadSizeProperties() {
   const cwrapQueryProperty =
       Module.cwrap('QueryProperty', 'number', ['string']);
diff --git a/tools/clang/blink_gc_plugin/BadPatternFinder.cpp b/tools/clang/blink_gc_plugin/BadPatternFinder.cpp
index 0a763ef5..b671d3ae 100644
--- a/tools/clang/blink_gc_plugin/BadPatternFinder.cpp
+++ b/tools/clang/blink_gc_plugin/BadPatternFinder.cpp
@@ -21,9 +21,7 @@
 
 TypeMatcher GarbageCollectedType() {
   auto has_gc_base = hasCanonicalType(hasDeclaration(
-      cxxRecordDecl(isDerivedFrom(hasAnyName("::blink::GarbageCollected",
-                                             "::blink::GarbageCollectedMixin",
-                                             "::cppgc::GarbageCollected",
+      cxxRecordDecl(isDerivedFrom(hasAnyName("::cppgc::GarbageCollected",
                                              "::cppgc::GarbageCollectedMixin")))
           .bind("gctype")));
   return anyOf(has_gc_base,
@@ -31,10 +29,8 @@
 }
 
 auto MemberType() {
-  auto has_member_name = hasAnyName("::blink::Member", "::blink::WeakMember",
-                                    "::cppgc::internal::BasicMember");
-  return anyOf(hasType(recordDecl(has_member_name)),
-               hasType(typeAliasTemplateDecl(has_member_name)));
+  return hasType(hasCanonicalType(hasDeclaration(cxxRecordDecl(
+      isSameOrDerivedFrom(hasName("::cppgc::internal::BasicMember"))))));
 }
 
 class UniquePtrGarbageCollectedMatcher : public MatchFinder::MatchCallback {
diff --git a/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp b/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp
index e0742a0..1de2408 100644
--- a/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp
+++ b/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp
@@ -85,7 +85,7 @@
       options_(options),
       cache_(instance),
       json_(0) {
-  // Only check structures in the blink, cppgc and pdfium.
+  // Only check structures in blink, cppgc and pdfium.
   options_.checked_namespaces.insert("blink");
   options_.checked_namespaces.insert("cppgc");
 
@@ -96,12 +96,9 @@
 
   // Ignore GC implementation files.
   options_.ignored_directories.push_back(
-      "third_party/blink/renderer/platform/heap/");
+      "third_party/blink/renderer/platform/heap/collection_support/");
   options_.ignored_directories.push_back("v8/src/heap/cppgc/");
   options_.ignored_directories.push_back("v8/src/heap/cppgc-js/");
-
-  options_.allowed_directories.push_back(
-      "third_party/blink/renderer/platform/heap/test/");
 }
 
 void BlinkGCPluginConsumer::HandleTranslationUnit(ASTContext& context) {
@@ -647,10 +644,6 @@
 #endif
   for (const auto& ignored_dir : options_.ignored_directories)
     if (filename.find(ignored_dir) != std::string::npos) {
-      for (const auto& allowed_dir : options_.allowed_directories) {
-        if (filename.find(allowed_dir) != std::string::npos)
-          return false;
-      }
       return true;
     }
   return false;
diff --git a/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h b/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h
index d80a79f..9c3eac3d 100644
--- a/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h
+++ b/tools/clang/blink_gc_plugin/BlinkGCPluginOptions.h
@@ -62,8 +62,6 @@
   std::set<std::string> checked_namespaces;
   std::vector<std::string> checked_directories;
   std::vector<std::string> ignored_directories;
-  // |allowed_directories| overrides |ignored_directories|.
-  std::vector<std::string> allowed_directories;
 };
 
 #endif  // TOOLS_BLINK_GC_PLUGIN_BLINK_GC_PLUGIN_OPTIONS_H_
diff --git a/tools/clang/blink_gc_plugin/Config.h b/tools/clang/blink_gc_plugin/Config.h
index 8cfef79..aeea156 100644
--- a/tools/clang/blink_gc_plugin/Config.h
+++ b/tools/clang/blink_gc_plugin/Config.h
@@ -57,9 +57,6 @@
                        llvm::StringRef ns_name,
                        RecordInfo* info,
                        RecordInfo::TemplateArgs* args) {
-    if (name == "Member") {
-      return VerifyNamespaceAndArgCount("blink", 1, ns_name, info, args);
-    }
     if (name == "BasicMember") {
       if (!VerifyNamespaceAndArgCount("cppgc", 2, ns_name, info, args))
         return false;
@@ -72,9 +69,6 @@
                            llvm::StringRef ns_name,
                            RecordInfo* info,
                            RecordInfo::TemplateArgs* args) {
-    if (name == "WeakMember") {
-      return VerifyNamespaceAndArgCount("blink", 1, ns_name, info, args);
-    }
     if (name == "BasicMember") {
       if (!VerifyNamespaceAndArgCount("cppgc", 2, ns_name, info, args))
         return false;
@@ -87,9 +81,6 @@
                            llvm::StringRef ns_name,
                            RecordInfo* info,
                            RecordInfo::TemplateArgs* args) {
-    if ((name == "Persistent") || (name == "WeakPersistent")) {
-      return VerifyNamespaceAndArgCount("blink", 1, ns_name, info, args);
-    }
     if (name == "BasicPersistent") {
       return VerifyNamespaceAndArgCount("cppgc", 1, ns_name, info, args);
     }
@@ -100,10 +91,6 @@
                                       llvm::StringRef ns_name,
                                       RecordInfo* info,
                                       RecordInfo::TemplateArgs* args) {
-    if ((name == "CrossThreadPersistent") ||
-        (name == "CrossThreadWeakPersistent")) {
-      return VerifyNamespaceAndArgCount("blink", 1, ns_name, info, args);
-    }
     if (name == "BasicCrossThreadPersistent") {
       return VerifyNamespaceAndArgCount("cppgc", 1, ns_name, info, args);
     }
diff --git a/tools/clang/blink_gc_plugin/process-graph.py b/tools/clang/blink_gc_plugin/process-graph.py
index c9c3c8d..4f5f4ce 100755
--- a/tools/clang/blink_gc_plugin/process-graph.py
+++ b/tools/clang/blink_gc_plugin/process-graph.py
@@ -362,8 +362,6 @@
     ignored_cycles.append(block)
 
 gc_bases = (
-  'blink::GarbageCollected',
-  'blink::GarbageCollectedMixin',
   'cppgc::GarbageCollected',
   'cppgc::GarbageCollectedMixin',
 )
diff --git a/tools/clang/blink_gc_plugin/tests/heap/stubs.h b/tools/clang/blink_gc_plugin/tests/heap/stubs.h
index fde6a6bc..724386e 100644
--- a/tools/clang/blink_gc_plugin/tests/heap/stubs.h
+++ b/tools/clang/blink_gc_plugin/tests/heap/stubs.h
@@ -167,8 +167,6 @@
 
 }  // namespace absl
 
-#if defined(USE_V8_OILPAN)
-
 namespace cppgc {
 
 class Visitor {
@@ -181,13 +179,23 @@
 };
 
 namespace internal {
+class WriteBarrierPolicyImpl;
+class CheckingPolicyImpl;
+class StorateTypeImpl;
+class LocationPolicyImpl;
+
 class StrongMemberTag;
 class WeakMemberTag;
 
+template <typename StorageType>
 class MemberBase {};
 
-template <typename T, typename Tag>
-class BasicMember : public MemberBase {
+template <typename T,
+          typename WeaknessTag,
+          typename WriteBarrierPolicy,
+          typename CheckingPolicy,
+          typename StorageType>
+class BasicMember : public MemberBase<StorageType> {
  public:
   operator T*() const { return 0; }
   T* operator->() const { return 0; }
@@ -199,7 +207,10 @@
 
 class PersistentBase {};
 
-template <typename T, typename Tag>
+template <typename T,
+          typename WeaknessPolicy,
+          typename LocationPolicy,
+          typename CheckingPolicy>
 class BasicPersistent : public PersistentBase {
  public:
   operator T*() const { return 0; }
@@ -210,8 +221,13 @@
 class StrongCrossThreadPersistentPolicy;
 class WeakCrossThreadPersistentPolicy;
 
-template <typename T, typename Tag>
-class BasicCrossThreadPersistent : public PersistentBase {
+class CrossThreadPersistentBase : public PersistentBase {};
+
+template <typename T,
+          typename WeaknessPolicy,
+          typename LocationPolicy,
+          typename CheckingPolicy>
+class BasicCrossThreadPersistent : public CrossThreadPersistentBase {
  public:
   operator T*() const { return 0; }
   T* operator->() const { return 0; }
@@ -243,25 +259,43 @@
 };
 
 template <typename T>
-using Member = internal::BasicMember<T, internal::StrongMemberTag>;
+using Member = internal::BasicMember<T,
+                                     internal::StrongMemberTag,
+                                     internal::WriteBarrierPolicyImpl,
+                                     internal::CheckingPolicyImpl,
+                                     internal::StorateTypeImpl>;
 template <typename T>
-using WeakMember = internal::BasicMember<T, internal::WeakMemberTag>;
+using WeakMember = internal::BasicMember<T,
+                                         internal::WeakMemberTag,
+                                         internal::WriteBarrierPolicyImpl,
+                                         internal::CheckingPolicyImpl,
+                                         internal::StorateTypeImpl>;
 
 template <typename T>
-using Persistent =
-    internal::BasicPersistent<T, internal::StrongPersistentPolicy>;
+using Persistent = internal::BasicPersistent<T,
+                                             internal::StrongPersistentPolicy,
+                                             internal::LocationPolicyImpl,
+                                             internal::CheckingPolicyImpl>;
 template <typename T>
-using WeakPersistent =
-    internal::BasicPersistent<T, internal::WeakPersistentPolicy>;
+using WeakPersistent = internal::BasicPersistent<T,
+                                                 internal::WeakPersistentPolicy,
+                                                 internal::LocationPolicyImpl,
+                                                 internal::CheckingPolicyImpl>;
 
 namespace subtle {
 
 template <typename T>
-using CrossThreadPersistent = internal::
-    BasicCrossThreadPersistent<T, internal::StrongCrossThreadPersistentPolicy>;
+using CrossThreadPersistent = internal::BasicCrossThreadPersistent<
+    T,
+    internal::StrongCrossThreadPersistentPolicy,
+    internal::LocationPolicyImpl,
+    internal::CheckingPolicyImpl>;
 template <typename T>
-using CrossThreadWeakPersistent = internal::
-    BasicCrossThreadPersistent<T, internal::WeakCrossThreadPersistentPolicy>;
+using CrossThreadWeakPersistent = internal::BasicCrossThreadPersistent<
+    T,
+    internal::WeakCrossThreadPersistentPolicy,
+    internal::LocationPolicyImpl,
+    internal::CheckingPolicyImpl>;
 
 }  // namespace subtle
 
@@ -293,88 +327,6 @@
 template <typename T>
 using CrossThreadWeakPersistent = cppgc::subtle::CrossThreadWeakPersistent<T>;
 
-#else  // !defined(USE_V8_OILPAN)
-
-namespace blink {
-
-class Visitor {
- public:
-  template <typename T, void (T::*method)(Visitor*)>
-  void RegisterWeakMembers(const T* obj);
-
-  template <typename T>
-  void Trace(const T&);
-};
-
-template <typename T>
-class GarbageCollected {
- public:
-  void* operator new(size_t, void* location) { return location; }
-
- private:
-  void* operator new(size_t) = delete;
-  void* operator new[](size_t) = delete;
-};
-
-template <typename T, typename... Args>
-T* MakeGarbageCollected(Args&&... args) {
-  return new (reinterpret_cast<void*>(0x87654321)) T(args...);
-}
-
-class GarbageCollectedMixin {
- public:
-  virtual void AdjustAndMark(Visitor*) const = 0;
-  virtual bool IsHeapObjectAlive(Visitor*) const = 0;
-  virtual void Trace(Visitor*) const {}
-};
-
-template<typename T> class Member {
-public:
-    operator T*() const { return 0; }
-    T* operator->() const { return 0; }
-    bool operator!() const { return false; }
-
-   private:
-    uint32_t compressed;
-};
-
-template<typename T> class WeakMember {
-public:
-    operator T*() const { return 0; }
-    T* operator->() const { return 0; }
-    bool operator!() const { return false; }
-};
-
-template<typename T> class Persistent {
-public:
-    operator T*() const { return 0; }
-    T* operator->() const { return 0; }
-    bool operator!() const { return false; }
-};
-
-template<typename T> class WeakPersistent {
-public:
-    operator T*() const { return 0; }
-    T* operator->() const { return 0; }
-    bool operator!() const { return false; }
-};
-
-template<typename T> class CrossThreadPersistent {
-public:
-    operator T*() const { return 0; }
-    T* operator->() const { return 0; }
-    bool operator!() const { return false; }
-};
-
-template<typename T> class CrossThreadWeakPersistent {
-public:
-    operator T*() const { return 0; }
-    T* operator->() const { return 0; }
-    bool operator!() const { return false; }
-};
-
-#endif  // !defined(USE_V8_OILPAN)
-
 using namespace WTF;
 
 #define DISALLOW_NEW()                                            \
diff --git a/tools/clang/blink_gc_plugin/tests/test.py b/tools/clang/blink_gc_plugin/tests/test.py
index 9536cf29..cfdfdd59 100755
--- a/tools/clang/blink_gc_plugin/tests/test.py
+++ b/tools/clang/blink_gc_plugin/tests/test.py
@@ -18,14 +18,11 @@
 class BlinkGcPluginTest(plugin_testing.ClangPluginTest):
   """Test harness for the Blink GC plugin."""
 
-  def __init__(self, use_cppgc, *args, **kwargs):
+  def __init__(self, *args, **kwargs):
     super(BlinkGcPluginTest, self).__init__(*args, **kwargs)
-    self.use_cppgc = use_cppgc
 
   def AdjustClangArguments(self, clang_cmd):
     clang_cmd.append('-Wno-inaccessible-base')
-    if self.use_cppgc:
-      clang_cmd.append('-DUSE_V8_OILPAN')
 
   def ProcessOneResult(self, test_name, actual):
     # Some Blink GC plugins dump a JSON representation of the object graph, and
@@ -47,11 +44,6 @@
         # Clean up the .graph.json file to prevent false passes from stale
         # results from a previous run.
         os.remove('%s.graph.json' % test_name)
-    if self.use_cppgc:
-      if os.path.exists('%s.cppgc.txt' % test_name):
-        # Some tests include namespace names in the output and thus require a
-        # different output file for comparison.
-        test_name = '%s.cppgc' % test_name
     return super(BlinkGcPluginTest, self).ProcessOneResult(test_name, actual)
 
 
@@ -66,24 +58,8 @@
 
   dir_name = os.path.dirname(os.path.realpath(__file__))
 
-  num_failures_blink = BlinkGcPluginTest(
-      False,  # USE_V8_OILPAN
-      dir_name,
-      args.clang_path,
-      'blink-gc-plugin',
-      args.reset_results).Run()
-
-  num_failures_cppgc = BlinkGcPluginTest(
-      True,  # USE_V8_OILPAN
-      dir_name,
-      args.clang_path,
-      'blink-gc-plugin',
-      args.reset_results).Run()
-
-  print("\nBlink GC Plugin Summary: %d tests failed without USE_V8_OILPAN, " \
-   "%d tests failed with USE_V8_OILPAN" % (
-      num_failures_blink, num_failures_cppgc))
-  return num_failures_blink + num_failures_cppgc
+  return BlinkGcPluginTest(dir_name, args.clang_path, 'blink-gc-plugin',
+                           args.reset_results).Run()
 
 
 if __name__ == '__main__':
diff --git a/tools/clang/blink_gc_plugin/tests/trace_if_needed.cppgc.txt b/tools/clang/blink_gc_plugin/tests/trace_if_needed.cppgc.txt
deleted file mode 100644
index 1acc31c..0000000
--- a/tools/clang/blink_gc_plugin/tests/trace_if_needed.cppgc.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-trace_if_needed.cpp:9:1: warning: [blink-gc] Class 'TemplatedObject<cppgc::internal::BasicMember<blink::HeapObject, cppgc::internal::StrongMemberTag>>' has untraced fields that require tracing.
-template <typename T>
-^
-./trace_if_needed.h:21:5: note: [blink-gc] Untraced field 'm_two' declared here:
-    T m_two;
-    ^
-1 warning generated.
diff --git a/tools/clang/blink_gc_plugin/tests/trace_if_needed.txt b/tools/clang/blink_gc_plugin/tests/trace_if_needed.txt
index e789c81..a39af8b3 100644
--- a/tools/clang/blink_gc_plugin/tests/trace_if_needed.txt
+++ b/tools/clang/blink_gc_plugin/tests/trace_if_needed.txt
@@ -1,4 +1,4 @@
-trace_if_needed.cpp:9:1: warning: [blink-gc] Class 'TemplatedObject<blink::Member<blink::HeapObject>>' has untraced fields that require tracing.
+trace_if_needed.cpp:9:1: warning: [blink-gc] Class 'TemplatedObject<cppgc::internal::BasicMember<blink::HeapObject, cppgc::internal::StrongMemberTag, cppgc::internal::WriteBarrierPolicyImpl, cppgc::internal::CheckingPolicyImpl, cppgc::internal::StorateTypeImpl>>' has untraced fields that require tracing.
 template <typename T>
 ^
 ./trace_if_needed.h:21:5: note: [blink-gc] Untraced field 'm_two' declared here:
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec
index b7fe3bcb..bcc7aa7 100644
--- a/tools/gritsettings/resource_ids.spec
+++ b/tools/gritsettings/resource_ids.spec
@@ -326,6 +326,10 @@
     "META": {"sizes": {"includes": [30],}},
     "includes": [3320],
   },
+  "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/sandbox_internals/resources.grd": {
+    "META": {"sizes": {"includes": [5],}},
+    "includes": [3330],
+  },
   "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/segmentation_internals/resources.grd": {
     "META": {"sizes": {"includes": [10]}},
     "includes": [3340],
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 9fc70cd0..039e53f 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -59991,6 +59991,7 @@
   <int value="-1557747651" label="FractionalScrollOffsets:disabled"/>
   <int value="-1557527869" label="LoadingWithMojo:disabled"/>
   <int value="-1556805396" label="ScreenshotsForAndroidV2:enabled"/>
+  <int value="-1555616901" label="ShoppingListTrackByDefault:disabled"/>
   <int value="-1555510175" label="PasswordImport:enabled"/>
   <int value="-1555375841" label="FedCmRpContext:enabled"/>
   <int value="-1554921134"
@@ -60229,6 +60230,7 @@
   <int value="-1439701253"
       label="EnableExternalKeyboardsInDiagnosticsApp:enabled"/>
   <int value="-1438279809" label="GamepadExtensions:disabled"/>
+  <int value="-1437913839" label="AndroidAppIntegrationSafeSearch:disabled"/>
   <int value="-1437526584" label="HelpAppReleaseNotes:enabled"/>
   <int value="-1437091873" label="ArcInputOverlayAlphaV2:disabled"/>
   <int value="-1436892902" label="FastPairSavedDevices:disabled"/>
@@ -61339,6 +61341,7 @@
   <int value="-871419968" label="FilesTrashDrive:enabled"/>
   <int value="-870994173" label="NtpChromeCartModule:enabled"/>
   <int value="-870120067" label="EnableSearchBoxSelection:enabled"/>
+  <int value="-869690461" label="ShoppingListTrackByDefault:enabled"/>
   <int value="-868138290" label="CrostiniPortForwarding:disabled"/>
   <int value="-868041476" label="OmniboxFocusTriggersSRPZeroSuggest:enabled"/>
   <int value="-867571486" label="PrivateStateTokens:disabled"/>
@@ -64491,6 +64494,7 @@
   <int value="783270752" label="AndroidHistoryManager:enabled"/>
   <int value="783443490" label="ArcInputOverlayBeta:enabled"/>
   <int value="785273919" label="CompositingBasedThrottling:disabled"/>
+  <int value="785795587" label="AndroidAppIntegrationSafeSearch:enabled"/>
   <int value="786070201"
       label="EcheSWAProcessAndroidAccessibilityTree:disabled"/>
   <int value="787080596" label="DynamicTcmallocTuning:enabled"/>
diff --git a/tools/metrics/histograms/metadata/content/histograms.xml b/tools/metrics/histograms/metadata/content/histograms.xml
index 485daf95..f4f93a0 100644
--- a/tools/metrics/histograms/metadata/content/histograms.xml
+++ b/tools/metrics/histograms/metadata/content/histograms.xml
@@ -766,8 +766,8 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.ActivityLoggingEnabled" enum="Boolean"
-    expires_after="2023-07-23">
-  <owner>rogerm@chromium.org</owner>
+    expires_after="2024-01-31">
+  <owner>dewittj@chromium.org</owner>
   <owner>feed@chromium.org</owner>
   <summary>
     Whether the feed was fetched with activity logging enabled. This is logged
diff --git a/tools/metrics/histograms/metadata/cookie/histograms.xml b/tools/metrics/histograms/metadata/cookie/histograms.xml
index b78529a..f4f2ba7 100644
--- a/tools/metrics/histograms/metadata/cookie/histograms.xml
+++ b/tools/metrics/histograms/metadata/cookie/histograms.xml
@@ -300,6 +300,19 @@
   </summary>
 </histogram>
 
+<histogram name="Cookie.ErrorInitializeDB" enum="SqliteLoggedResultCode"
+    expires_after="2023-11-12">
+  <owner>wfh@chromium.org</owner>
+  <owner>src/net/cookies/OWNERS</owner>
+  <summary>
+    The exact database error encountered if initializing the cookies database
+    fails catastrophically. Initializing the cookies database happens once per
+    network context configured with persistent cookies, so this metric could be
+    reported multiple times from the same client. Catastrophic errors are
+    defined in sql::IsErrorCatastrophic.
+  </summary>
+</histogram>
+
 <histogram name="Cookie.ExpirationDuration400DaysGT" units="days"
     expires_after="2024-02-20">
   <owner>arichiv@chromium.org</owner>
@@ -909,6 +922,20 @@
   <summary>For each cookie added to the store, record it's type(s).</summary>
 </histogram>
 
+<histogram name="Cookie.WinGetLastErrorInitializeDB" enum="WinGetLastError"
+    expires_after="2023-11-12">
+  <owner>wfh@chromium.org</owner>
+  <owner>src/net/cookies/OWNERS</owner>
+  <summary>
+    The result of calling ::GetLastError if initializing the cookies database
+    fails catastrophically. Initializing the cookies database happens once per
+    network context configured with persistent cookies, so this metric could be
+    reported multiple times from the same client. Catastrophic errors are
+    defined in sql::IsErrorCatastrophic. This metric is only reported on
+    Windows.
+  </summary>
+</histogram>
+
 </histograms>
 
 </histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/gpu/histograms.xml b/tools/metrics/histograms/metadata/gpu/histograms.xml
index cc842c2..01ae883 100644
--- a/tools/metrics/histograms/metadata/gpu/histograms.xml
+++ b/tools/metrics/histograms/metadata/gpu/histograms.xml
@@ -1398,17 +1398,6 @@
   </summary>
 </histogram>
 
-<histogram name="GPU.SupportsDisableMsaa" enum="BooleanSupported"
-    expires_after="2023-12-10">
-  <owner>vasilyt@chromium.org</owner>
-  <owner>graphics-dev@chromium.org</owner>
-  <summary>
-    This metric records if we had support for non-aa draws with hardware MSAA
-    via GL_EXT_multisample_compatibility. Recorded once for each raster task
-    that had non-aa draw.
-  </summary>
-</histogram>
-
 <histogram name="GPU.SupportsDX12" enum="BooleanSupported"
     expires_after="2023-11-01">
   <owner>magchen@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml
index 3a43ad4..d1443491 100644
--- a/tools/metrics/histograms/metadata/omnibox/histograms.xml
+++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -1515,6 +1515,16 @@
   </summary>
 </histogram>
 
+<histogram name="Omnibox.ScrollToTLD.Duration" units="ms"
+    expires_after="2023-08-12">
+  <owner>peilinwang@google.com</owner>
+  <owner>woa-performance-bugs+jank@google.com</owner>
+  <summary>
+    Measures the amount of time it takes to call UrlBar.scrollToTLD(). Logged
+    once per call.
+  </summary>
+</histogram>
+
 <histogram name="Omnibox.Search.OffTheRecord" enum="BooleanOffTheRecord"
     expires_after="2024-02-01">
   <owner>jdonnelly@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index ddd7a26a..cb0c26bb 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -10561,6 +10561,19 @@
   </summary>
 </histogram>
 
+<histogram name="ReportingAndNEL.ErrorInitializeDB"
+    enum="SqliteLoggedResultCode" expires_after="2023-11-12">
+  <owner>wfh@chromium.org</owner>
+  <owner>src/net/reporting/OWNERS</owner>
+  <summary>
+    The exact database error encountered when initializing the Reporting and NEL
+    database, if initialization fails catastrophically. This is recorded if the
+    database initialization fails catastrophically when the DB initialization
+    attempt is made, which typically occurs upon the first network request after
+    startup. Catastrophic errors are defined in sql::IsErrorCatastrophic.
+  </summary>
+</histogram>
+
 <histogram name="ReportingAndNEL.NumberOfLoadedNELPolicies"
     units="policy count" expires_after="2023-06-25">
   <owner>yhirano@chromium.org</owner>
@@ -10618,6 +10631,19 @@
   </summary>
 </histogram>
 
+<histogram name="ReportingAndNEL.WinGetLastErrorInitializeDB"
+    enum="WinGetLastError" expires_after="2023-11-12">
+  <owner>wfh@chromium.org</owner>
+  <owner>src/net/reporting/OWNERS</owner>
+  <summary>
+    The result of calling ::GetLastError() if initializing the Reporting and NEL
+    database fails catastrophically. This is recorded, on Windows only, if the
+    database initialization fails when the DB initialization attempt is made,
+    which typically occurs upon the first network request after startup.
+    Catastrophic errors are defined in sql::IsErrorCatastrophic.
+  </summary>
+</histogram>
+
 <histogram name="Reset.ChromeOS.PowerwashDialogShown"
     enum="PowerwashDialogViewType" expires_after="M77">
   <owner>merkulova@chromium.org</owner>
diff --git a/ui/views/bubble/bubble_frame_view.cc b/ui/views/bubble/bubble_frame_view.cc
index bd31dd7..ca2270cef 100644
--- a/ui/views/bubble/bubble_frame_view.cc
+++ b/ui/views/bubble/bubble_frame_view.cc
@@ -103,6 +103,17 @@
   main_image_->SetVisible(false);
   subtitle_->SetVisible(false);
 
+  auto minimize = CreateMinimizeButton(base::BindRepeating(
+      [](BubbleFrameView* view, const ui::Event& event) {
+        if (view->input_protector_.IsPossiblyUnintendedInteraction(event))
+          return;
+        view->GetWidget()->Minimize();
+      },
+      this));
+  minimize->SetProperty(views::kElementIdentifierKey, kMinimizeButtonElementId);
+  minimize->SetVisible(false);
+  minimize_ = AddChildView(std::move(minimize));
+
   auto close = CreateCloseButton(base::BindRepeating(
       [](BubbleFrameView* view, const ui::Event& event) {
         if (view->input_protector_.IsPossiblyUnintendedInteraction(event))
@@ -115,17 +126,6 @@
   close->SetVisible(false);
   close_ = AddChildView(std::move(close));
 
-  auto minimize = CreateMinimizeButton(base::BindRepeating(
-      [](BubbleFrameView* view, const ui::Event& event) {
-        if (view->input_protector_.IsPossiblyUnintendedInteraction(event))
-          return;
-        view->GetWidget()->Minimize();
-      },
-      this));
-  minimize->SetProperty(views::kElementIdentifierKey, kMinimizeButtonElementId);
-  minimize->SetVisible(false);
-  minimize_ = AddChildView(std::move(minimize));
-
   auto progress_indicator = std::make_unique<ProgressBar>(
       kProgressIndicatorHeight, /*allow_round_corner=*/false);
   progress_indicator->SetBackgroundColor(SK_ColorTRANSPARENT);
diff --git a/ui/views/bubble/bubble_frame_view.h b/ui/views/bubble/bubble_frame_view.h
index ce28272..d5070a209 100644
--- a/ui/views/bubble/bubble_frame_view.h
+++ b/ui/views/bubble/bubble_frame_view.h
@@ -349,12 +349,12 @@
 
   raw_ptr<Label> subtitle_ = nullptr;
 
+  // The optional minimize button (the _).
+  raw_ptr<Button> minimize_ = nullptr;
+
   // The optional close button (the X).
   raw_ptr<Button> close_ = nullptr;
 
-  // The optional minimize button.
-  raw_ptr<Button> minimize_ = nullptr;
-
   // The optional progress bar. Used to indicate bubble pending state. By
   // default it is invisible.
   raw_ptr<ProgressBar> progress_indicator_ = nullptr;
diff --git a/ui/views/bubble/bubble_frame_view_unittest.cc b/ui/views/bubble/bubble_frame_view_unittest.cc
index d62a456..87473f24 100644
--- a/ui/views/bubble/bubble_frame_view_unittest.cc
+++ b/ui/views/bubble/bubble_frame_view_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "ui/views/bubble/bubble_frame_view.h"
 
+#include <algorithm>
 #include <memory>
 #include <utility>
 
@@ -30,6 +31,7 @@
 #include "ui/views/test/test_views.h"
 #include "ui/views/test/view_metadata_test_utils.h"
 #include "ui/views/test/views_test_base.h"
+#include "ui/views/view_class_properties.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_delegate.h"
 #include "ui/views/widget/widget_interactive_uitest_utils.h"
@@ -1470,4 +1472,27 @@
             bubble->GetWindowBoundsInScreen().width());
 }
 
+// Close should be the next element after minimize.
+TEST_F(BubbleFrameViewTest, MinimizeBeforeClose) {
+  auto delegate_unique = std::make_unique<TestBubbleDialogDelegateView>();
+  TestBubbleDialogDelegateView* const delegate = delegate_unique.get();
+  TestAnchor anchor(CreateParams(Widget::InitParams::TYPE_WINDOW));
+  delegate->SetAnchorView(anchor.widget().GetContentsView());
+  delegate->SetShouldShowCloseButton(true);
+  delegate->SetCanMinimize(true);
+  Widget* bubble =
+      BubbleDialogDelegateView::CreateBubble(std::move(delegate_unique));
+  bubble->Show();
+
+  auto minimze_iter = std::find_if(
+      delegate->GetBubbleFrameView()->children().begin(),
+      delegate->GetBubbleFrameView()->children().end(), [](views::View* child) {
+        return child->GetProperty(views::kElementIdentifierKey) ==
+               BubbleFrameView::kMinimizeButtonElementId;
+      });
+  ASSERT_NE(minimze_iter, delegate->GetBubbleFrameView()->children().end());
+  EXPECT_EQ((*++minimze_iter)->GetProperty(views::kElementIdentifierKey),
+            BubbleFrameView::kCloseButtonElementId);
+}
+
 }  // namespace views
diff --git a/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts b/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts
index 9aa5d40..1910687 100644
--- a/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts
+++ b/ui/webui/resources/cr_components/color_change_listener/colors_css_updater.ts
@@ -20,8 +20,8 @@
 let documentInstance: ColorChangeUpdater|null = null;
 
 // <if expr="chromeos_ash">
-const COLOR_PROVIDER_CHANGED: string = 'color-provider-changed';
-type ColorChangeListener = () => void;
+// Event fired after updated colors have been fetched and applied.
+export const COLOR_PROVIDER_CHANGED: string = 'color-provider-changed';
 // </if>
 
 export class ColorChangeUpdater {
@@ -115,18 +115,6 @@
   }
 }
 
-// <if expr="chromeos_ash">
-export function addColorChangeListener(listener: ColorChangeListener) {
-  ColorChangeUpdater.forDocument().eventTarget.addEventListener(
-      COLOR_PROVIDER_CHANGED, listener);
-}
-
-export function removeColorChangeListener(listener: ColorChangeListener) {
-  ColorChangeUpdater.forDocument().eventTarget.removeEventListener(
-      COLOR_PROVIDER_CHANGED, listener);
-}
-// </if>
-
 /**
  * Starts listening for ColorProvider changes from the browser and updates the
  * top level HTML document whenever changes occur.
diff --git a/ui/webui/resources/cr_components/help_bubble/help_bubble.html b/ui/webui/resources/cr_components/help_bubble/help_bubble.html
index 1e40d6e..6fa19eb 100644
--- a/ui/webui/resources/cr_components/help_bubble/help_bubble.html
+++ b/ui/webui/resources/cr_components/help_bubble/help_bubble.html
@@ -1,6 +1,14 @@
 <link rel="stylesheet" href="chrome://theme/colors.css?sets=ui,chrome&shadow_host=true">
 <style include="cr-hidden-style">
   :host {
+    /* Color declarations.
+     * TODO(crbug.com/1454258): Temporary fallback values for cases where
+     * colors.css and its colors are not available within the WebUI. */
+    --help-bubble-background: var(--color-feature-promo-bubble-background,
+        var(--google-blue-700));
+    --help-bubble-foreground: var(--color-feature-promo-bubble-foreground,
+        var(--google-grey-200));
+
     /* Variable declarations. Some of these will change for the 2023 refresh. */
     --help-bubble-border-radius: 8px;
     --help-bubble-close-button-icon-size: 16px;
@@ -41,7 +49,7 @@
   /* #inner-arrow is rotated and positioned in a container to simplify
    * positioning */
   #inner-arrow {
-    background-color: var(--color-feature-promo-bubble-background);
+    background-color: var(--help-bubble-background);
     height: var(--help-bubble-arrow-size);
     left: calc(0px - var(--help-bubble-arrow-size-half));
     position: absolute;
@@ -119,8 +127,8 @@
 
   #progress div {
     --help-bubble-progress-size: 8px;
-    background-color: var(--color-feature-promo-bubble-foreground);
-    border: 1px solid var(--color-feature-promo-bubble-foreground);
+    background-color: var(--help-bubble-foreground);
+    border: 1px solid var(--help-bubble-foreground);
     border-radius: 50%;
     display: inline-block;
     height: var(--help-bubble-progress-size);
@@ -130,7 +138,7 @@
   }
 
   #progress .total-progress {
-    background-color: var(--color-feature-promo-bubble-background);
+    background-color: var(--help-bubble-background);
   }
 
   #topBody,
@@ -154,11 +162,11 @@
   }
 
   .help-bubble {
-    --cr-focus-outline-color: var(--color-feature-promo-bubble-foreground);
-    background-color: var(--color-feature-promo-bubble-background);
+    --cr-focus-outline-color: var(--help-bubble-foreground);
+    background-color: var(--help-bubble-background);
     border-radius: var(--help-bubble-border-radius);
     box-sizing: border-box;
-    color: var(--color-feature-promo-bubble-foreground);
+    color: var(--help-bubble-foreground);
     display: flex;
     flex-direction: column;
     justify-content: space-between;
@@ -188,14 +196,18 @@
    */
   cr-icon-button,
   cr-button {
-    --help-bubble-button-foreground: var(--color-feature-promo-bubble-foreground);
-    --help-bubble-button-background: var(--color-feature-promo-bubble-background);
+    --help-bubble-button-foreground: var(--help-bubble-foreground);
+    --help-bubble-button-background: var(--help-bubble-background);
     --help-bubble-button-hover-alpha: 10%;
   }
 
   cr-button.default-button {
-    --help-bubble-button-foreground: var(--color-feature-promo-bubble-default-button-foreground);
-    --help-bubble-button-background: var(--color-feature-promo-bubble-default-button-background);
+    --help-bubble-button-foreground: var(
+        --color-feature-promo-bubble-default-button-foreground,
+        var(--help-bubble-background));
+    --help-bubble-button-background: var(
+        --color-feature-promo-bubble-default-button-background,
+        var(--help-bubble-foreground));
     --help-bubble-button-hover-alpha: 6%;
   }
 
@@ -240,10 +252,10 @@
     --help-bubble-body-icon-size: 24px;
     --iron-icon-height: var(--help-bubble-body-icon-image-size);
     --iron-icon-width: var(--help-bubble-body-icon-image-size);
-    background-color: var(--color-feature-promo-bubble-foreground);
+    background-color: var(--help-bubble-foreground);
     border-radius: 50%;
     box-sizing: border-box;
-    color: var(--color-feature-promo-bubble-background);
+    color: var(--help-bubble-background);
     height: var(--help-bubble-body-icon-size);
     margin-inline-end: var(--help-bubble-element-spacing);
     padding: calc((var(--help-bubble-body-icon-size) -
@@ -264,14 +276,14 @@
   }
 
   #buttons cr-button {
-    --border-color: var(--color-feature-promo-bubble-foreground);
-    --focus-shadow-color: var(--color-feature-promo-bubble-foreground);
+    --border-color: var(--help-bubble-foreground);
+    --focus-shadow-color: var(--help-bubble-foreground);
     --text-color: var(--help-bubble-button-foreground);
     background-color: var(--help-bubble-button-background);
   }
 
   #buttons cr-button:focus {
-    border: 2px solid var(--color-feature-promo-bubble-background);
+    border: 2px solid var(--help-bubble-background);
     padding: 7px 15px;
   }
 
diff --git a/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html b/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html
index 141c3813..402a291 100644
--- a/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html
+++ b/ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html
@@ -141,9 +141,9 @@
 
       :host-context([chrome-refresh-2023]):host(:focus-visible) #bar {
         background-clip: padding-box;
-        border-color: transparent;
+        border: none;
         outline: 2px solid var(--cr-toggle-checked-bar-color);
-        outline-offset: 1px;
+        outline-offset: 2px;
       }
 
       #knob {