diff --git a/.eslintrc.js b/.eslintrc.js
index 387c492..7b7bd06 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -74,6 +74,11 @@
       'semi': 'off',
       '@typescript-eslint/semi': ['error'],
 
+      // https://google.github.io/styleguide/tsguide.html#arrayt-type
+      '@typescript-eslint/array-type': ['error', {
+        default: 'array-simple',
+      }],
+
       // https://google.github.io/styleguide/jsguide.html#naming
       '@typescript-eslint/naming-convention': [
         'error',
diff --git a/DEPS b/DEPS
index 2bcdc7a8..f32b021 100644
--- a/DEPS
+++ b/DEPS
@@ -280,19 +280,19 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '6db6110a1089987cb9591b65994842d62ca100a2',
+  'skia_revision': '2d6e13210d3030dc5a10308d6aa9c3bd81c1dcb4',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '724dc8eb3b40db5a282f32149e27fc04c68cde25',
+  'v8_revision': '803d5313a8ce5bdf5d165d423e1bc15106f694c8',
   # 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': 'cd1b22eecd83f199bd3f67a579998f2a8922abc8',
+  'angle_revision': 'a4e00c64528d21f5fab3ab4900357d31ee3dbdc1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '1d6a1036bdb37072ea2f946df2bcbec367b99c3a',
+  'swiftshader_revision': '16e026a959f1bc80ff237aa81b4a63b52517dec1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -351,7 +351,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': '6f2de7bf2ddaa1cdd03241a5de5333f07d33756e',
+  'catapult_revision': '6b65e0427dd4018366a81be0f2f9704e0932400c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -359,7 +359,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': 'ec0f408cb1745c663032154329a7ae757601d588',
+  'devtools_frontend_revision': '70130c820e36839b359b1843a09875511f14e93b',
   # 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.
@@ -395,7 +395,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'fcceb0ee8005fa73c5cb4155c87201800343e70d',
+  'dawn_revision': 'e427a9ba5ec2d2d0b7e4a083cbc26ba465bbc24a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -861,7 +861,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': 'U3cbYvvMVs4vqc4cLCCaaPZyYi0dFdO2NAn6LeeJe5UC',
+          'version': 'qxzLpPnQ0wbBX8Qp0iL8neLcakE9ZnRw0TCY0sLIHvEC',
         },
       ],
       'dep_type': 'cipd',
@@ -929,7 +929,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': '2PIre0lzgUsBMZAlMGDVj_noHBvi860uvfYkFtl_UQcC',
+          'version': 'Wp5QJnaBXtZUKJgQC5gmoQwAjWWDE6cBkjRAoSu8IIoC',
       },
     ],
     'condition': 'checkout_android',
@@ -1564,7 +1564,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '3c4bdd0f331990d7fae52ae52f56f5762614cc33',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'acc008eff9c38f106b21ee30f6fac8741cb77878',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1734,7 +1734,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'a6bab72c7259ca3131b00a856cd9be23fc15bbd3',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '7b19036b80ef8377f8c479ae4bd0bd499362c218',
+    Var('webrtc_git') + '/src.git' + '@' + 'cbfdcc535e595dad73249be55b1340bc2561412c',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1807,7 +1807,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@f1f2db8e4623c8eb9afae5b2ecd760bdc4974e88',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@46b9d6fc5a491a4c89b9435c16394db178caaab9',
     'condition': 'checkout_src_internal',
   },
 
@@ -1837,7 +1837,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': '_EmWiRK4YKQYXdIg82dimOKVzBuk0ymxXpMrNUnFp5oC',
+        'version': 'OQSGJdsQEXEA4J8QTQ69mqKbuFIpZnOjAGOpsLKEuokC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1848,7 +1848,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'io4VSsaXsNRuxM1tScwumF8LRye8D8XSEkjTlQg5h-sC',
+        'version': 'YBHwTryNw4JMZuLtFF07h5f5LLwZiQLche2sGD-DedwC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/ash/system/keyboard_brightness/unified_keyboard_brightness_slider_controller.cc b/ash/system/keyboard_brightness/unified_keyboard_brightness_slider_controller.cc
index 76bc1511d..19d937f 100644
--- a/ash/system/keyboard_brightness/unified_keyboard_brightness_slider_controller.cc
+++ b/ash/system/keyboard_brightness/unified_keyboard_brightness_slider_controller.cc
@@ -24,6 +24,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "chromeos/dbus/power/power_manager_client.h"
 #include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/color_utils.h"
 
 namespace ash {
 
@@ -90,8 +91,12 @@
           rb.GetImageSkiaNamed(IDR_SETTINGS_RGB_KEYBOARD_RAINBOW_COLOR_48_PNG);
       button->SetBackgroundImage(*image);
     } else {
-      button->SetBackgroundColor(
-          ConvertBacklightColorToIconBackgroundColor(backlight_color));
+      SkColor color =
+          ConvertBacklightColorToIconBackgroundColor(backlight_color);
+      button->SetBackgroundColor(color);
+      button->SetIconColor(color_utils::GetLuma(color) < 125
+                               ? gfx::kGoogleGrey200
+                               : gfx::kGoogleGrey900);
     }
     button->SetBorder(views::CreateRoundedRectBorder(
         /*thickness=*/4, /*corner_radius=*/16,
diff --git a/ash/webui/os_feedback_ui/os_feedback_ui.cc b/ash/webui/os_feedback_ui/os_feedback_ui.cc
index d63c6473..e8444dd1 100644
--- a/ash/webui/os_feedback_ui/os_feedback_ui.cc
+++ b/ash/webui/os_feedback_ui/os_feedback_ui.cc
@@ -61,6 +61,7 @@
       {"userEmailLabel", IDS_FEEDBACK_TOOL_USER_EMAIL_LABEL},
       {"shareDiagnosticDataLabel",
        IDS_FEEDBACK_TOOL_SHARE_DIAGNOSTIC_DATA_LABEL},
+      {"sharePageUrlLabel", IDS_FEEDBACK_TOOL_SHARE_PAGE_URL_LABEL},
       {"confirmationTitleOnline", IDS_FEEDBACK_TOOL_PAGE_TITLE_AFTER_SENT},
       {"confirmationTitleOffline", IDS_FEEDBACK_TOOL_PAGE_TITLE_SEND_OFFLINE},
       {"exploreAppDescription",
diff --git a/ash/webui/os_feedback_ui/resources/os_feedback_shared_css.html b/ash/webui/os_feedback_ui/resources/os_feedback_shared_css.html
index 436ef83..fb6211c 100644
--- a/ash/webui/os_feedback_ui/resources/os_feedback_shared_css.html
+++ b/ash/webui/os_feedback_ui/resources/os_feedback_shared_css.html
@@ -42,6 +42,11 @@
       margin-block-end: 0;
     }
 
+    .overflow-text {
+      overflow: hidden;
+      text-overflow: ellipsis;
+    }
+
     h2 {
       color: var(--cros-text-color-secondary);
       font-family: var(--feedback-google-sans-font-family);
diff --git a/ash/webui/os_feedback_ui/resources/share_data_page.html b/ash/webui/os_feedback_ui/resources/share_data_page.html
index 1cd1a485..f781a04 100644
--- a/ash/webui/os_feedback_ui/resources/share_data_page.html
+++ b/ash/webui/os_feedback_ui/resources/share_data_page.html
@@ -1,5 +1,7 @@
 <style include="os-feedback-shared">
-  a[href] {
+  #legalHelpPageUrl,
+  #privacyPolicyUrl,
+  #termsOfServiceUrl {
     text-decoration: none;
   }
 
@@ -92,6 +94,16 @@
     margin-bottom: 24px;
   }
 
+  #pageUrl {
+    display: flex;
+    white-space: nowrap;
+  }
+
+  #tooltipContent {
+    white-space: normal;
+    word-wrap: break-word
+  }
+
   .disabled-input-text {
     color: var(--cros-text-color-disabled);
   }
@@ -144,9 +156,13 @@
       <div id="pageUrl" class="checkbox-field-container">
         <input id="pageUrlCheckbox" type="checkbox" aria-labelledby="pageUrlLabel"
             checked>
-        <label id="pageUrlLabel">share url:</label>
-        <input id="pageUrlText" aria-labelledby="pageUrlLabel" type="text"
-            value$="[[feedbackContext.pageUrl.url]]" dir="ltr">
+        <label id="pageUrlLabel">[[i18n('sharePageUrlLabel')]]&nbsp;</label>
+        <a href="[[feedbackContext.pageUrl.url]]" class="overflow-text" id="pageUrlText" target="_blank">
+          [[feedbackContext.pageUrl.url]]
+        </a>
+        <paper-tooltip for="pageUrlText" fitToVisibleBounds>
+          <div id="tooltipContent">[[feedbackContext.pageUrl.url]]</div>
+        </paper-tooltip>
       </div>
       <!-- System Information -->
       <div id="sysInfoContainer" class="checkbox-field-container">
diff --git a/ash/webui/os_feedback_ui/resources/share_data_page.js b/ash/webui/os_feedback_ui/resources/share_data_page.js
index 68ebb31..d342f05 100644
--- a/ash/webui/os_feedback_ui/resources/share_data_page.js
+++ b/ash/webui/os_feedback_ui/resources/share_data_page.js
@@ -6,6 +6,7 @@
 import './file_attachment.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js';
+import 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js';
 
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/js/i18n_behavior.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -198,7 +199,7 @@
 
     if (this.getElement_('#pageUrlCheckbox').checked) {
       report.feedbackContext.pageUrl = {
-        url: this.getElement_('#pageUrlText').value
+        url: this.getElement_('#pageUrlText').textContent.trim()
       };
     }
 
diff --git a/ash/webui/personalization_app/search/BUILD.gn b/ash/webui/personalization_app/search/BUILD.gn
index 9f58d2e4..82a3c47 100644
--- a/ash/webui/personalization_app/search/BUILD.gn
+++ b/ash/webui/personalization_app/search/BUILD.gn
@@ -10,4 +10,5 @@
 mojom("mojo_bindings") {
   sources = [ "search.mojom" ]
   public_deps = [ "//mojo/public/mojom/base" ]
+  webui_module_path = "/"
 }
diff --git a/ash/wm/desks/desk_preview_view.cc b/ash/wm/desks/desk_preview_view.cc
index 12bcae0..9545134c 100644
--- a/ash/wm/desks/desk_preview_view.cc
+++ b/ash/wm/desks/desk_preview_view.cc
@@ -507,7 +507,6 @@
 void DeskPreviewView::MaybeActivateHighlightedView() {
   DesksController::Get()->ActivateDesk(mini_view_->desk(),
                                        DesksSwitchSource::kMiniViewButton);
-  RequestFocus();
 }
 
 void DeskPreviewView::MaybeCloseHighlightedView(bool primary_action) {
diff --git a/ash/wm/splitview/split_view_controller.cc b/ash/wm/splitview/split_view_controller.cc
index 53afaa0..a664fbfd 100644
--- a/ash/wm/splitview/split_view_controller.cc
+++ b/ash/wm/splitview/split_view_controller.cc
@@ -1777,6 +1777,14 @@
   // called. In clamshell mode, |OverviewController::CanEndOverview| always
   // returns true, meaning that overview is guaranteed to end successfully.
   DCHECK(!InClamshellSplitViewMode());
+
+  // If the `root_window_`is the root window of the display which is going to
+  // be removed, there's no need to start overview.
+  if (GetRootWindowSettings(root_window_)->display_id ==
+      display::kInvalidDisplayId) {
+    return;
+  }
+
   // If we are in tablet split view with only one snapped window, make sure we
   // are in overview (see https://crbug.com/1027179).
   if (state_ == State::kLeftSnapped || state_ == State::kRightSnapped) {
diff --git a/ash/wm/splitview/split_view_controller_unittest.cc b/ash/wm/splitview/split_view_controller_unittest.cc
index 1721a0c..550f158 100644
--- a/ash/wm/splitview/split_view_controller_unittest.cc
+++ b/ash/wm/splitview/split_view_controller_unittest.cc
@@ -1003,6 +1003,41 @@
   EXPECT_NEAR(window2_width, old_window1_width, 1);
 }
 
+// Verify that disconnecting a display which has a snapped window in it in
+// tablet mode won't lead to a crash. Regression test for
+// https://crbug.com/1316230.
+TEST_F(SplitViewControllerTest,
+       DisplayDisconnectionWithSnappedWindowInTabletMode) {
+  ui::ScopedAnimationDurationScaleMode animation_scale(
+      ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION);
+
+  UpdateDisplay("800x600,800x600");
+
+  Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true);
+  EXPECT_TRUE(EnterOverview());
+
+  // Turn off the display mirror mode.
+  Shell::Get()->display_manager()->SetMirrorMode(display::MirrorMode::kOff,
+                                                 absl::nullopt);
+
+  std::unique_ptr<aura::Window> w1(
+      CreateTestWindowInShellWithBounds(gfx::Rect(0, 0, 100, 100)));
+  std::unique_ptr<aura::Window> w2(
+      CreateTestWindowInShellWithBounds(gfx::Rect(900, 0, 100, 100)));
+  ASSERT_NE(w1->GetRootWindow(), w2->GetRootWindow());
+
+  // Snap the window on the second display.
+  auto* split_view_controller_on_display2 =
+      SplitViewController::Get(w2->GetRootWindow());
+  split_view_controller_on_display2->SnapWindow(w2.get(),
+                                                SplitViewController::LEFT);
+  ASSERT_TRUE(split_view_controller_on_display2->split_view_divider());
+
+  // Now disconnect the second display, verify there's no crash.
+  UpdateDisplay("800x600");
+  base::RunLoop().RunUntilIdle();
+}
+
 // Tests that the bounds of the snapped windows and divider are adjusted when
 // the screen display configuration changes.
 TEST_F(SplitViewControllerTest, DisplayConfigurationChangeTest) {
diff --git a/base/allocator/allocator_interception_mac.mm b/base/allocator/allocator_interception_mac.mm
index 9f01527e..dcac0c2 100644
--- a/base/allocator/allocator_interception_mac.mm
+++ b/base/allocator/allocator_interception_mac.mm
@@ -236,7 +236,7 @@
 
 bool CanGetContextForCFAllocator() {
 #if BUILDFLAG(IS_IOS)
-  return !base::ios::IsRunningOnOrLater(16, 0, 0);
+  return !base::ios::IsRunningOnOrLater(17, 0, 0);
 #else
   return !base::mac::IsOSLaterThan13_DontCallThis();
 #endif
diff --git a/base/android/apk_assets.cc b/base/android/apk_assets.cc
index b2dfaff..c3ec27f 100644
--- a/base/android/apk_assets.cc
+++ b/base/android/apk_assets.cc
@@ -29,7 +29,8 @@
   CHECK_EQ(3U, results.size());
   int fd = static_cast<int>(results[0]);
   region->offset = results[1];
-  region->size = results[2];
+  // Not a checked_cast because open() may return -1.
+  region->size = static_cast<size_t>(results[2]);
   return fd;
 }
 
diff --git a/base/android/build_info.cc b/base/android/build_info.cc
index 319db1e..15ae0c5a 100644
--- a/base/android/build_info.cc
+++ b/base/android/build_info.cc
@@ -21,11 +21,11 @@
 namespace {
 
 // We are leaking these strings.
-const char* StrDupParam(const std::vector<std::string>& params, int index) {
+const char* StrDupParam(const std::vector<std::string>& params, size_t index) {
   return strdup(params[index].c_str());
 }
 
-int GetIntParam(const std::vector<std::string>& params, int index) {
+int GetIntParam(const std::vector<std::string>& params, size_t index) {
   int ret = 0;
   bool success = StringToInt(params[index], &ret);
   DCHECK(success);
diff --git a/base/android/child_process_service.cc b/base/android/child_process_service.cc
index 077f7a8d..4808d41a 100644
--- a/base/android/child_process_service.cc
+++ b/base/android/child_process_service.cc
@@ -27,7 +27,7 @@
     const JavaParamRef<jlongArray>& j_sizes) {
   std::vector<absl::optional<std::string>> keys;
   JavaObjectArrayReader<jstring> keys_array(j_keys);
-  keys.reserve(keys_array.size());
+  keys.reserve(checked_cast<size_t>(keys_array.size()));
   for (auto str : keys_array) {
     absl::optional<std::string> key;
     if (str) {
@@ -54,7 +54,7 @@
     base::MemoryMappedFile::Region region = {offsets.at(i),
                                              static_cast<size_t>(sizes.at(i))};
     const absl::optional<std::string>& key = keys.at(i);
-    int id = ids.at(i);
+    const auto id = static_cast<GlobalDescriptors::Key>(ids.at(i));
     int fd = fds.at(i);
     if (key) {
       base::FileDescriptorStore::GetInstance().Set(*key, base::ScopedFD(fd),
diff --git a/base/android/cpu_features.cc b/base/android/cpu_features.cc
index 526794ab..0af5e60d 100644
--- a/base/android/cpu_features.cc
+++ b/base/android/cpu_features.cc
@@ -15,7 +15,7 @@
 }
 
 jlong JNI_CpuFeatures_GetCpuFeatures(JNIEnv*) {
-  return android_getCpuFeatures();
+  return static_cast<jlong>(android_getCpuFeatures());
 }
 
 }  // namespace android
diff --git a/base/android/early_trace_event_binding.cc b/base/android/early_trace_event_binding.cc
index f9e79ef..811bdea8 100644
--- a/base/android/early_trace_event_binding.cc
+++ b/base/android/early_trace_event_binding.cc
@@ -106,7 +106,8 @@
   std::string name = ConvertJavaStringToUTF8(env, jname);
 
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP_AND_FLAGS0(
-      internal::kJavaTraceCategory, name.c_str(), TRACE_ID_LOCAL(id),
+      internal::kJavaTraceCategory, name.c_str(),
+      TRACE_ID_LOCAL(static_cast<uint64_t>(id)),
       TimeTicks::FromJavaNanoTime(time_ns),
       TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY);
 }
@@ -119,7 +120,8 @@
   std::string name = ConvertJavaStringToUTF8(env, jname);
 
   TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP_AND_FLAGS0(
-      internal::kJavaTraceCategory, name.c_str(), TRACE_ID_LOCAL(id),
+      internal::kJavaTraceCategory, name.c_str(),
+      TRACE_ID_LOCAL(static_cast<uint64_t>(id)),
       TimeTicks::FromJavaNanoTime(time_ns),
       TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY);
 }
diff --git a/base/android/jank_metric_uma_recorder.cc b/base/android/jank_metric_uma_recorder.cc
index ff09dab..ae09c6f 100644
--- a/base/android/jank_metric_uma_recorder.cc
+++ b/base/android/jank_metric_uma_recorder.cc
@@ -23,7 +23,7 @@
 
 void AddFrameToTrace(int64_t timestamp_ns, int64_t durations_ns) {
 #if BUILDFLAG(ENABLE_BASE_TRACING)
-  auto t = perfetto::Track(timestamp_ns);
+  auto t = perfetto::Track(checked_cast<uint64_t>(timestamp_ns));
   TRACE_EVENT_BEGIN(
       "ui", "AndroidFrameVsync", t, [&](perfetto::EventContext ctx) {
         ctx.event()->set_timestamp_absolute_us(timestamp_ns / 1000);
@@ -75,7 +75,7 @@
   std::string missed_frames_histogram_name =
       base::StrCat({"Android.Jank.MissedFrames.", scenario_name});
 
-  for (unsigned i = 0; i < timestamps_ns.size(); ++i) {
+  for (size_t i = 0; i < timestamps_ns.size(); ++i) {
     AddFrameToTrace(timestamps_ns[i], durations_ns[i]);
   }
 
diff --git a/base/android/java_runtime.cc b/base/android/java_runtime.cc
index 61916516..394881c 100644
--- a/base/android/java_runtime.cc
+++ b/base/android/java_runtime.cc
@@ -5,16 +5,20 @@
 #include "base/android/java_runtime.h"
 
 #include "base/android_runtime_jni_headers/Runtime_jni.h"
+#include "base/numerics/safe_conversions.h"
 
 namespace base {
 namespace android {
 
-void JavaRuntime::GetMemoryUsage(long* total_memory, long* free_memory) {
+void JavaRuntime::GetMemoryUsage(uint64_t* total_memory,
+                                 uint64_t* free_memory) {
   JNIEnv* env = base::android::AttachCurrentThread();
   base::android::ScopedJavaLocalRef<jobject> runtime =
       JNI_Runtime::Java_Runtime_getRuntime(env);
-  *total_memory = JNI_Runtime::Java_Runtime_totalMemory(env, runtime);
-  *free_memory = JNI_Runtime::Java_Runtime_freeMemory(env, runtime);
+  *total_memory = checked_cast<uint64_t>(
+      JNI_Runtime::Java_Runtime_totalMemory(env, runtime));
+  *free_memory = checked_cast<uint64_t>(
+      JNI_Runtime::Java_Runtime_freeMemory(env, runtime));
 }
 
 }  // namespace android
diff --git a/base/android/java_runtime.h b/base/android/java_runtime.h
index 2034fb9..2a3aa07 100644
--- a/base/android/java_runtime.h
+++ b/base/android/java_runtime.h
@@ -16,7 +16,7 @@
  public:
   // Fills the total memory used and memory allocated for objects by the java
   // heap in the current process. Returns true on success.
-  static void GetMemoryUsage(long* total_memory, long* free_memory);
+  static void GetMemoryUsage(uint64_t* total_memory, uint64_t* free_memory);
 };
 
 }  // namespace android
diff --git a/base/android/jni_array.cc b/base/android/jni_array.cc
index 40ea0872..9b80310b 100644
--- a/base/android/jni_array.cc
+++ b/base/android/jni_array.cc
@@ -9,6 +9,7 @@
 #include "base/android/jni_android.h"
 #include "base/android/jni_string.h"
 #include "base/check_op.h"
+#include "base/numerics/safe_conversions.h"
 
 namespace base {
 namespace android {
@@ -30,11 +31,12 @@
 ScopedJavaLocalRef<jbyteArray> ToJavaByteArray(JNIEnv* env,
                                                const uint8_t* bytes,
                                                size_t len) {
-  jbyteArray byte_array = env->NewByteArray(len);
+  const jsize len_jsize = checked_cast<jsize>(len);
+  jbyteArray byte_array = env->NewByteArray(len_jsize);
   CheckException(env);
   DCHECK(byte_array);
 
-  env->SetByteArrayRegion(byte_array, 0, len,
+  env->SetByteArrayRegion(byte_array, 0, len_jsize,
                           reinterpret_cast<const jbyte*>(bytes));
   CheckException(env);
 
@@ -56,11 +58,12 @@
 ScopedJavaLocalRef<jbooleanArray> ToJavaBooleanArray(JNIEnv* env,
                                                      const bool* bools,
                                                      size_t len) {
-  jbooleanArray boolean_array = env->NewBooleanArray(len);
+  const jsize len_jsize = checked_cast<jsize>(len);
+  jbooleanArray boolean_array = env->NewBooleanArray(len_jsize);
   CheckException(env);
   DCHECK(boolean_array);
 
-  env->SetBooleanArrayRegion(boolean_array, 0, len,
+  env->SetBooleanArrayRegion(boolean_array, 0, len_jsize,
                              reinterpret_cast<const jboolean*>(bools));
   CheckException(env);
 
@@ -70,11 +73,12 @@
 ScopedJavaLocalRef<jintArray> ToJavaIntArray(JNIEnv* env,
                                              const int* ints,
                                              size_t len) {
-  jintArray int_array = env->NewIntArray(len);
+  const jsize len_jsize = checked_cast<jsize>(len);
+  jintArray int_array = env->NewIntArray(len_jsize);
   CheckException(env);
   DCHECK(int_array);
 
-  env->SetIntArrayRegion(int_array, 0, len,
+  env->SetIntArrayRegion(int_array, 0, len_jsize,
                          reinterpret_cast<const jint*>(ints));
   CheckException(env);
 
@@ -89,11 +93,12 @@
 ScopedJavaLocalRef<jlongArray> ToJavaLongArray(JNIEnv* env,
                                                const int64_t* longs,
                                                size_t len) {
-  jlongArray long_array = env->NewLongArray(len);
+  const jsize len_jsize = checked_cast<jsize>(len);
+  jlongArray long_array = env->NewLongArray(len_jsize);
   CheckException(env);
   DCHECK(long_array);
 
-  env->SetLongArrayRegion(long_array, 0, len,
+  env->SetLongArrayRegion(long_array, 0, len_jsize,
                           reinterpret_cast<const jlong*>(longs));
   CheckException(env);
 
@@ -110,11 +115,12 @@
 // Returns a new Java float array converted from the given C++ float array.
 BASE_EXPORT ScopedJavaLocalRef<jfloatArray>
 ToJavaFloatArray(JNIEnv* env, const float* floats, size_t len) {
-  jfloatArray float_array = env->NewFloatArray(len);
+  const jsize len_jsize = checked_cast<jsize>(len);
+  jfloatArray float_array = env->NewFloatArray(len_jsize);
   CheckException(env);
   DCHECK(float_array);
 
-  env->SetFloatArrayRegion(float_array, 0, len,
+  env->SetFloatArrayRegion(float_array, 0, len_jsize,
                            reinterpret_cast<const jfloat*>(floats));
   CheckException(env);
 
@@ -129,11 +135,12 @@
 
 BASE_EXPORT ScopedJavaLocalRef<jdoubleArray>
 ToJavaDoubleArray(JNIEnv* env, const double* doubles, size_t len) {
-  jdoubleArray double_array = env->NewDoubleArray(len);
+  const jsize len_jsize = checked_cast<jsize>(len);
+  jdoubleArray double_array = env->NewDoubleArray(len_jsize);
   CheckException(env);
   DCHECK(double_array);
 
-  env->SetDoubleArrayRegion(double_array, 0, len,
+  env->SetDoubleArrayRegion(double_array, 0, len_jsize,
                             reinterpret_cast<const jdouble*>(doubles));
   CheckException(env);
 
@@ -150,11 +157,12 @@
     JNIEnv* env,
     ScopedJavaLocalRef<jclass> clazz,
     base::span<const ScopedJavaLocalRef<jobject>> v) {
-  jobjectArray joa = env->NewObjectArray(v.size(), clazz.obj(), nullptr);
+  jobjectArray joa =
+      env->NewObjectArray(checked_cast<jsize>(v.size()), clazz.obj(), nullptr);
   CheckException(env);
 
   for (size_t i = 0; i < v.size(); ++i) {
-    env->SetObjectArrayElement(joa, i, v[i].obj());
+    env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj());
   }
   return ScopedJavaLocalRef<jobjectArray>(env, joa);
 }
@@ -170,12 +178,12 @@
     base::span<const ScopedJavaGlobalRef<jobject>> v) {
   ScopedJavaLocalRef<jclass> object_array_clazz =
       GetClass(env, "java/lang/Object");
-  jobjectArray joa =
-      env->NewObjectArray(v.size(), object_array_clazz.obj(), nullptr);
+  jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()),
+                                         object_array_clazz.obj(), nullptr);
   CheckException(env);
 
   for (size_t i = 0; i < v.size(); ++i) {
-    env->SetObjectArrayElement(joa, i, v[i].obj());
+    env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj());
   }
   return ScopedJavaLocalRef<jobjectArray>(env, joa);
 }
@@ -184,11 +192,12 @@
     JNIEnv* env,
     base::span<const ScopedJavaLocalRef<jobject>> v,
     ScopedJavaLocalRef<jclass> type) {
-  jobjectArray joa = env->NewObjectArray(v.size(), type.obj(), nullptr);
+  jobjectArray joa =
+      env->NewObjectArray(checked_cast<jsize>(v.size()), type.obj(), nullptr);
   CheckException(env);
 
   for (size_t i = 0; i < v.size(); ++i) {
-    env->SetObjectArrayElement(joa, i, v[i].obj());
+    env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj());
   }
   return ScopedJavaLocalRef<jobjectArray>(env, joa);
 }
@@ -197,11 +206,12 @@
     JNIEnv* env,
     base::span<const ScopedJavaGlobalRef<jobject>> v,
     ScopedJavaLocalRef<jclass> type) {
-  jobjectArray joa = env->NewObjectArray(v.size(), type.obj(), nullptr);
+  jobjectArray joa =
+      env->NewObjectArray(checked_cast<jsize>(v.size()), type.obj(), nullptr);
   CheckException(env);
 
   for (size_t i = 0; i < v.size(); ++i) {
-    env->SetObjectArrayElement(joa, i, v[i].obj());
+    env->SetObjectArrayElement(joa, static_cast<jsize>(i), v[i].obj());
   }
   return ScopedJavaLocalRef<jobjectArray>(env, joa);
 }
@@ -210,14 +220,14 @@
     JNIEnv* env,
     base::span<const std::string> v) {
   ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
-  jobjectArray joa =
-      env->NewObjectArray(v.size(), byte_array_clazz.obj(), nullptr);
+  jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()),
+                                         byte_array_clazz.obj(), nullptr);
   CheckException(env);
 
   for (size_t i = 0; i < v.size(); ++i) {
     ScopedJavaLocalRef<jbyteArray> byte_array = ToJavaByteArray(
         env, reinterpret_cast<const uint8_t*>(v[i].data()), v[i].length());
-    env->SetObjectArrayElement(joa, i, byte_array.obj());
+    env->SetObjectArrayElement(joa, static_cast<jsize>(i), byte_array.obj());
   }
   return ScopedJavaLocalRef<jobjectArray>(env, joa);
 }
@@ -226,14 +236,14 @@
     JNIEnv* env,
     base::span<const std::vector<uint8_t>> v) {
   ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
-  jobjectArray joa =
-      env->NewObjectArray(v.size(), byte_array_clazz.obj(), nullptr);
+  jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()),
+                                         byte_array_clazz.obj(), nullptr);
   CheckException(env);
 
   for (size_t i = 0; i < v.size(); ++i) {
     ScopedJavaLocalRef<jbyteArray> byte_array =
         ToJavaByteArray(env, v[i].data(), v[i].size());
-    env->SetObjectArrayElement(joa, i, byte_array.obj());
+    env->SetObjectArrayElement(joa, static_cast<jsize>(i), byte_array.obj());
   }
   return ScopedJavaLocalRef<jobjectArray>(env, joa);
 }
@@ -242,12 +252,13 @@
     JNIEnv* env,
     base::span<const std::string> v) {
   ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
-  jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), nullptr);
+  jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()),
+                                         string_clazz.obj(), nullptr);
   CheckException(env);
 
   for (size_t i = 0; i < v.size(); ++i) {
     ScopedJavaLocalRef<jstring> item = ConvertUTF8ToJavaString(env, v[i]);
-    env->SetObjectArrayElement(joa, i, item.obj());
+    env->SetObjectArrayElement(joa, static_cast<jsize>(i), item.obj());
   }
   return ScopedJavaLocalRef<jobjectArray>(env, joa);
 }
@@ -258,14 +269,14 @@
   ScopedJavaLocalRef<jclass> string_array_clazz =
       GetClass(env, "[Ljava/lang/String;");
 
-  jobjectArray joa =
-      env->NewObjectArray(vec_outer.size(), string_array_clazz.obj(), nullptr);
+  jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(vec_outer.size()),
+                                         string_array_clazz.obj(), nullptr);
   CheckException(env);
 
   for (size_t i = 0; i < vec_outer.size(); ++i) {
     ScopedJavaLocalRef<jobjectArray> inner =
         ToJavaArrayOfStrings(env, vec_outer[i]);
-    env->SetObjectArrayElement(joa, i, inner.obj());
+    env->SetObjectArrayElement(joa, static_cast<jsize>(i), inner.obj());
   }
 
   return ScopedJavaLocalRef<jobjectArray>(env, joa);
@@ -277,14 +288,14 @@
   ScopedJavaLocalRef<jclass> string_array_clazz =
       GetClass(env, "[Ljava/lang/String;");
 
-  jobjectArray joa =
-      env->NewObjectArray(vec_outer.size(), string_array_clazz.obj(), nullptr);
+  jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(vec_outer.size()),
+                                         string_array_clazz.obj(), nullptr);
   CheckException(env);
 
   for (size_t i = 0; i < vec_outer.size(); ++i) {
     ScopedJavaLocalRef<jobjectArray> inner =
         ToJavaArrayOfStrings(env, vec_outer[i]);
-    env->SetObjectArrayElement(joa, i, inner.obj());
+    env->SetObjectArrayElement(joa, static_cast<jsize>(i), inner.obj());
   }
 
   return ScopedJavaLocalRef<jobjectArray>(env, joa);
@@ -294,12 +305,13 @@
     JNIEnv* env,
     base::span<const std::u16string> v) {
   ScopedJavaLocalRef<jclass> string_clazz = GetClass(env, "java/lang/String");
-  jobjectArray joa = env->NewObjectArray(v.size(), string_clazz.obj(), nullptr);
+  jobjectArray joa = env->NewObjectArray(checked_cast<jsize>(v.size()),
+                                         string_clazz.obj(), nullptr);
   CheckException(env);
 
   for (size_t i = 0; i < v.size(); ++i) {
     ScopedJavaLocalRef<jstring> item = ConvertUTF16ToJavaString(env, v[i]);
-    env->SetObjectArrayElement(joa, i, item.obj());
+    env->SetObjectArrayElement(joa, static_cast<jsize>(i), item.obj());
   }
   return ScopedJavaLocalRef<jobjectArray>(env, joa);
 }
@@ -315,7 +327,8 @@
   out->resize(back + len);
   for (size_t i = 0; i < len; ++i) {
     ScopedJavaLocalRef<jstring> str(
-        env, static_cast<jstring>(env->GetObjectArrayElement(array.obj(), i)));
+        env, static_cast<jstring>(env->GetObjectArrayElement(
+                 array.obj(), static_cast<jsize>(i))));
     ConvertJavaStringToUTF16(env, str.obj(), out->data() + back + i);
   }
 }
@@ -331,7 +344,8 @@
   out->resize(back + len);
   for (size_t i = 0; i < len; ++i) {
     ScopedJavaLocalRef<jstring> str(
-        env, static_cast<jstring>(env->GetObjectArrayElement(array.obj(), i)));
+        env, static_cast<jstring>(env->GetObjectArrayElement(
+                 array.obj(), static_cast<jsize>(i))));
     ConvertJavaStringToUTF8(env, str.obj(), out->data() + back + i);
   }
 }
@@ -347,7 +361,7 @@
     return;
   size_t back = out->size();
   out->resize(back + len);
-  env->GetByteArrayRegion(byte_array.obj(), 0, len,
+  env->GetByteArrayRegion(byte_array.obj(), 0, static_cast<jsize>(len),
                           reinterpret_cast<int8_t*>(out->data() + back));
 }
 
@@ -397,7 +411,8 @@
   out->resize(len);
   if (!len)
     return;
-  env->GetIntArrayRegion(int_array.obj(), 0, len, out->data());
+  env->GetIntArrayRegion(int_array.obj(), 0, static_cast<jsize>(len),
+                         out->data());
 }
 
 void JavaLongArrayToInt64Vector(JNIEnv* env,
@@ -418,7 +433,8 @@
   out->resize(len);
   if (!len)
     return;
-  env->GetLongArrayRegion(long_array.obj(), 0, len, out->data());
+  env->GetLongArrayRegion(long_array.obj(), 0, static_cast<jsize>(len),
+                          out->data());
 }
 
 void JavaFloatArrayToFloatVector(JNIEnv* env,
@@ -429,7 +445,8 @@
   out->resize(len);
   if (!len)
     return;
-  env->GetFloatArrayRegion(float_array.obj(), 0, len, out->data());
+  env->GetFloatArrayRegion(float_array.obj(), 0, static_cast<jsize>(len),
+                           out->data());
 }
 
 void JavaDoubleArrayToDoubleVector(JNIEnv* env,
@@ -440,7 +457,8 @@
   out->resize(len);
   if (!len)
     return;
-  env->GetDoubleArrayRegion(double_array.obj(), 0, len, out->data());
+  env->GetDoubleArrayRegion(double_array.obj(), 0, static_cast<jsize>(len),
+                            out->data());
 }
 
 void JavaArrayOfByteArrayToStringVector(JNIEnv* env,
@@ -451,9 +469,9 @@
   out->resize(len);
   for (size_t i = 0; i < len; ++i) {
     ScopedJavaLocalRef<jbyteArray> bytes_array(
-        env,
-        static_cast<jbyteArray>(env->GetObjectArrayElement(array.obj(), i)));
-    jsize bytes_len = env->GetArrayLength(bytes_array.obj());
+        env, static_cast<jbyteArray>(env->GetObjectArrayElement(
+                 array.obj(), static_cast<jsize>(i))));
+    size_t bytes_len = SafeGetArrayLength(env, bytes_array);
     jbyte* bytes = env->GetByteArrayElements(bytes_array.obj(), nullptr);
     (*out)[i].assign(reinterpret_cast<const char*>(bytes), bytes_len);
     env->ReleaseByteArrayElements(bytes_array.obj(), bytes, JNI_ABORT);
@@ -468,8 +486,8 @@
   out->resize(len);
   for (size_t i = 0; i < len; ++i) {
     ScopedJavaLocalRef<jbyteArray> bytes_array(
-        env,
-        static_cast<jbyteArray>(env->GetObjectArrayElement(array.obj(), i)));
+        env, static_cast<jbyteArray>(env->GetObjectArrayElement(
+                 array.obj(), static_cast<jsize>(i))));
     JavaByteArrayToByteVector(env, bytes_array, &(*out)[i]);
   }
 }
@@ -483,8 +501,8 @@
   out->resize(len);
   for (size_t i = 0; i < len; ++i) {
     ScopedJavaLocalRef<jobjectArray> strings_array(
-        env,
-        static_cast<jobjectArray>(env->GetObjectArrayElement(array.obj(), i)));
+        env, static_cast<jobjectArray>(env->GetObjectArrayElement(
+                 array.obj(), static_cast<jsize>(i))));
 
     out->at(i).clear();
     AppendJavaStringArrayToStringVector(env, strings_array, &out->at(i));
@@ -500,8 +518,8 @@
   out->resize(len);
   for (size_t i = 0; i < len; ++i) {
     ScopedJavaLocalRef<jobjectArray> strings_array(
-        env,
-        static_cast<jobjectArray>(env->GetObjectArrayElement(array.obj(), i)));
+        env, static_cast<jobjectArray>(env->GetObjectArrayElement(
+                 array.obj(), static_cast<jsize>(i))));
 
     out->at(i).clear();
     AppendJavaStringArrayToStringVector(env, strings_array, &out->at(i));
@@ -516,8 +534,8 @@
   out->resize(len);
   for (size_t i = 0; i < len; ++i) {
     ScopedJavaLocalRef<jintArray> int_array(
-        env,
-        static_cast<jintArray>(env->GetObjectArrayElement(array.obj(), i)));
+        env, static_cast<jintArray>(env->GetObjectArrayElement(
+                 array.obj(), static_cast<jsize>(i))));
     JavaIntArrayToIntVector(env, int_array, &out->at(i));
   }
 }
diff --git a/base/android/jni_string.cc b/base/android/jni_string.cc
index 2d1ec3c..1eadc75 100644
--- a/base/android/jni_string.cc
+++ b/base/android/jni_string.cc
@@ -6,6 +6,7 @@
 
 #include "base/android/jni_android.h"
 #include "base/logging.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 
 namespace {
@@ -13,8 +14,8 @@
 // Internal version that does not use a scoped local pointer.
 jstring ConvertUTF16ToJavaStringImpl(JNIEnv* env,
                                      const base::StringPiece16& str) {
-  jstring result =
-      env->NewString(reinterpret_cast<const jchar*>(str.data()), str.length());
+  jstring result = env->NewString(reinterpret_cast<const jchar*>(str.data()),
+                                  base::checked_cast<jsize>(str.length()));
   base::android::CheckException(env);
   return result;
 }
@@ -32,7 +33,7 @@
     return;
   }
   const jsize length = env->GetStringLength(str);
-  if (!length) {
+  if (length <= 0) {
     result->clear();
     CheckException(env);
     return;
@@ -42,7 +43,8 @@
   // function that yields plain (non Java-modified) UTF8.
   const jchar* chars = env->GetStringChars(str, NULL);
   DCHECK(chars);
-  UTF16ToUTF8(reinterpret_cast<const char16_t*>(chars), length, result);
+  UTF16ToUTF8(reinterpret_cast<const char16_t*>(chars),
+              static_cast<size_t>(length), result);
   env->ReleaseStringChars(str, chars);
   CheckException(env);
 }
@@ -84,7 +86,7 @@
     return;
   }
   const jsize length = env->GetStringLength(str);
-  if (!length) {
+  if (length <= 0) {
     result->clear();
     CheckException(env);
     return;
@@ -93,7 +95,8 @@
   DCHECK(chars);
   // GetStringChars isn't required to NULL-terminate the strings
   // it returns, so the length must be explicitly checked.
-  result->assign(reinterpret_cast<const char16_t*>(chars), length);
+  result->assign(reinterpret_cast<const char16_t*>(chars),
+                 static_cast<size_t>(length));
   env->ReleaseStringChars(str, chars);
   CheckException(env);
 }
diff --git a/base/android/library_loader/library_prefetcher.cc b/base/android/library_loader/library_prefetcher.cc
index 411260e..1ad25a6 100644
--- a/base/android/library_loader/library_prefetcher.cc
+++ b/base/android/library_loader/library_prefetcher.cc
@@ -115,8 +115,8 @@
     PLOG(ERROR) << "Cannot get the time.";
     return false;
   }
-  uint64_t now =
-      static_cast<uint64_t>(ts.tv_sec) * 1000 * 1000 * 1000 + ts.tv_nsec;
+  uint64_t now = static_cast<uint64_t>(ts.tv_sec) * 1000 * 1000 * 1000 +
+                 static_cast<uint64_t>(ts.tv_nsec);
   std::vector<unsigned char> residency;
   if (!Mincore(start, end, &residency))
     return false;
@@ -145,19 +145,20 @@
   CHECK_LE(kEndOfText, end);
   auto start_end = base::StringPrintf("%" PRIuS " %" PRIuS "\n",
                                       kStartOfText - start, kEndOfText - start);
-  file.WriteAtCurrentPos(start_end.c_str(), start_end.size());
+  file.WriteAtCurrentPos(start_end.c_str(), static_cast<int>(start_end.size()));
 
   for (const auto& data_point : *data) {
     auto timestamp =
         base::StringPrintf("%" PRIu64 " ", data_point.timestamp_nanos);
-    file.WriteAtCurrentPos(timestamp.c_str(), timestamp.size());
+    file.WriteAtCurrentPos(timestamp.c_str(),
+                           static_cast<int>(timestamp.size()));
 
     std::vector<char> dump;
     dump.reserve(data_point.residency.size() + 1);
     for (auto c : data_point.residency)
       dump.push_back(c ? '1' : '0');
     dump[dump.size() - 1] = '\n';
-    file.WriteAtCurrentPos(&dump[0], dump.size());
+    file.WriteAtCurrentPos(&dump[0], checked_cast<int>(dump.size()));
   }
 }
 
@@ -284,8 +285,9 @@
   if (!ok)
     return -1;
   total_pages += residency.size();
-  resident_pages += std::count_if(residency.begin(), residency.end(),
-                                  [](unsigned char x) { return x & 1; });
+  resident_pages +=
+      static_cast<size_t>(std::count_if(residency.begin(), residency.end(),
+                                        [](unsigned char x) { return x & 1; }));
   if (total_pages == 0)
     return -1;
   return static_cast<int>((100 * resident_pages) / total_pages);
diff --git a/base/android/reached_code_profiler.cc b/base/android/reached_code_profiler.cc
index 2c2c8b6..a69221d 100644
--- a/base/android/reached_code_profiler.cc
+++ b/base/android/reached_code_profiler.cc
@@ -166,7 +166,8 @@
     // Start the interval timer.
     struct itimerspec its;
     memset(&its, 0, sizeof(its));
-    its.it_interval.tv_nsec = sampling_interval.InNanoseconds();
+    its.it_interval.tv_nsec =
+        checked_cast<long>(sampling_interval.InNanoseconds());
     its.it_value = its.it_interval;
     ret = timer_settime(timerid, 0, &its, nullptr);
     if (ret) {
diff --git a/base/android/task_scheduler/task_runner_android.cc b/base/android/task_scheduler/task_runner_android.cc
index b69b484..9fbed8d 100644
--- a/base/android/task_scheduler/task_runner_android.cc
+++ b/base/android/task_scheduler/task_runner_android.cc
@@ -33,9 +33,10 @@
       jboolean may_block,
       jbyte extension_id,
       const base::android::JavaParamRef<jbyteArray>& extension_data) {
-    return TaskTraits(static_cast<TaskPriority>(priority), may_block,
-                      TaskTraitsExtensionStorage(
-                          extension_id, GetExtensionData(env, extension_data)));
+    return TaskTraits(
+        static_cast<TaskPriority>(priority), may_block,
+        TaskTraitsExtensionStorage(static_cast<uint8_t>(extension_id),
+                                   GetExtensionData(env, extension_data)));
   }
 
  private:
diff --git a/base/android/thread_instruction_count.h b/base/android/thread_instruction_count.h
index 845d7bd2..fe5e2d7 100644
--- a/base/android/thread_instruction_count.h
+++ b/base/android/thread_instruction_count.h
@@ -40,21 +40,21 @@
   static bool IsSupported();
 
   // Returns the number of retired instructions relative to some epoch count,
-  // or -1 if getting the current instruction count failed / is disabled.
+  // or 0 if getting the current instruction count failed / is disabled.
   static ThreadInstructionCount Now();
 
-  constexpr ThreadInstructionCount() : value_(-1) {}
-  explicit constexpr ThreadInstructionCount(int64_t value) : value_(value) {}
+  explicit constexpr ThreadInstructionCount(uint64_t value = 0)
+      : value_(value) {}
 
   constexpr ThreadInstructionDelta operator-(
       ThreadInstructionCount other) const {
-    return ThreadInstructionDelta(value_ - other.value_);
+    return ThreadInstructionDelta(static_cast<int64_t>(value_ - other.value_));
   }
 
-  constexpr int64_t ToInternalValue() const { return value_; }
+  constexpr uint64_t ToInternalValue() const { return value_; }
 
  private:
-  int64_t value_;
+  uint64_t value_;
 };
 
 }  // namespace android
diff --git a/base/android/trace_event_binding.cc b/base/android/trace_event_binding.cc
index 2c248bf..f562d985 100644
--- a/base/android/trace_event_binding.cc
+++ b/base/android/trace_event_binding.cc
@@ -282,7 +282,8 @@
                                       jlong jid) {
   TraceEventDataConverter converter(env, jname, nullptr);
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_FLAGS0(
-      internal::kJavaTraceCategory, converter.name(), TRACE_ID_LOCAL(jid),
+      internal::kJavaTraceCategory, converter.name(),
+      TRACE_ID_LOCAL(static_cast<uint64_t>(jid)),
       TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY);
 }
 
@@ -291,7 +292,8 @@
                                        jlong jid) {
   TraceEventDataConverter converter(env, jname, nullptr);
   TRACE_EVENT_NESTABLE_ASYNC_END_WITH_FLAGS0(
-      internal::kJavaTraceCategory, converter.name(), TRACE_ID_LOCAL(jid),
+      internal::kJavaTraceCategory, converter.name(),
+      TRACE_ID_LOCAL(static_cast<uint64_t>(jid)),
       TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY);
 }
 
diff --git a/base/android/unguessable_token_android.cc b/base/android/unguessable_token_android.cc
index 429f7f6..413bbf5 100644
--- a/base/android/unguessable_token_android.cc
+++ b/base/android/unguessable_token_android.cc
@@ -16,15 +16,17 @@
   const uint64_t low = token.GetLowForSerialization();
   DCHECK(high);
   DCHECK(low);
-  return Java_UnguessableToken_create(env, high, low);
+  return Java_UnguessableToken_create(env, static_cast<jlong>(high),
+                                      static_cast<jlong>(low));
 }
 
 base::UnguessableToken UnguessableTokenAndroid::FromJavaUnguessableToken(
     JNIEnv* env,
     const JavaRef<jobject>& token) {
-  const uint64_t high =
-      Java_UnguessableToken_getHighForSerialization(env, token);
-  const uint64_t low = Java_UnguessableToken_getLowForSerialization(env, token);
+  const uint64_t high = static_cast<uint64_t>(
+      Java_UnguessableToken_getHighForSerialization(env, token));
+  const uint64_t low = static_cast<uint64_t>(
+      Java_UnguessableToken_getLowForSerialization(env, token));
   DCHECK(high);
   DCHECK(low);
   return base::UnguessableToken::Deserialize(high, low);
diff --git a/base/check.cc b/base/check.cc
index 7ea731e..89b7ad74 100644
--- a/base/check.cc
+++ b/base/check.cc
@@ -36,8 +36,8 @@
   // reporting and at most report once per thread.
   static std::atomic<bool> has_dumped = false;
   if (!has_dumped.load(std::memory_order_relaxed)) {
-    const std::string str = log_message->str();
-    // Copy the LogMessage string to stack memory to make sure it can be
+    const std::string str = log_message->GetMessageWithoutPrefix();
+    // Copy the LogMessage message to stack memory to make sure it can be
     // recovered in crash dumps.
     // TODO(pbos): Surface DCHECK_MESSAGE well in crash reporting to make this
     // redundant, then remove it.
diff --git a/base/logging.cc b/base/logging.cc
index 9173128..e69a5b2 100644
--- a/base/logging.cc
+++ b/base/logging.cc
@@ -911,6 +911,10 @@
   }
 }
 
+std::string LogMessage::GetMessageWithoutPrefix() const {
+  return str().substr(message_start_);
+}
+
 // writes the common header info to the stream
 void LogMessage::Init(const char* file, int line) {
   base::StringPiece filename(file);
diff --git a/base/logging.h b/base/logging.h
index dba8d3e..48d1eb2 100644
--- a/base/logging.h
+++ b/base/logging.h
@@ -646,8 +646,11 @@
 
   std::ostream& stream() { return stream_; }
 
-  LogSeverity severity() { return severity_; }
-  std::string str() { return stream_.str(); }
+  LogSeverity severity() const { return severity_; }
+  std::string str() const { return stream_.str(); }
+
+  // Gets the log message (w/o prefix).
+  std::string GetMessageWithoutPrefix() const;
 
  private:
   void Init(const char* file, int line);
diff --git a/base/logging_unittest.cc b/base/logging_unittest.cc
index 69a8ada..feba067 100644
--- a/base/logging_unittest.cc
+++ b/base/logging_unittest.cc
@@ -905,6 +905,14 @@
   }
 }
 
+TEST_F(LoggingTest, GetMessageWithoutPrefixStripsPrefix) {
+  EXPECT_EQ("", LogMessage("", 0, LOGGING_ERROR).GetMessageWithoutPrefix());
+
+  LogMessage msg("", 0, LOGGING_ERROR);
+  msg.stream() << "Hello";
+  EXPECT_EQ("Hello", msg.GetMessageWithoutPrefix());
+}
+
 #if !BUILDFLAG(USE_RUNTIME_VLOG)
 TEST_F(LoggingTest, BuildTimeVLOG) {
   // Use a static because only captureless lambdas can be converted to a
diff --git a/base/process/internal_linux.cc b/base/process/internal_linux.cc
index 17c5cdd..bcd8b57 100644
--- a/base/process/internal_linux.cc
+++ b/base/process/internal_linux.cc
@@ -212,7 +212,7 @@
   if (!StringToUint64(cpu[0], &user) || !StringToUint64(cpu[1], &nice))
     return TimeDelta();
 
-  return ClockTicksToTimeDelta(user + nice);
+  return ClockTicksToTimeDelta(checked_cast<int64_t>(user + nice));
 }
 
 TimeDelta ClockTicksToTimeDelta(int64_t clock_ticks) {
@@ -224,7 +224,7 @@
   //   0000040          17         100           3   134512692
   // which means the answer is 100.
   // It may be the case that this value is always 100.
-  static const int kHertz = sysconf(_SC_CLK_TCK);
+  static const long kHertz = sysconf(_SC_CLK_TCK);
 
   return Microseconds(Time::kMicrosecondsPerSecond * clock_ticks / kHertz);
 }
diff --git a/base/process/launch.h b/base/process/launch.h
index eb2e6904..05aae30 100644
--- a/base/process/launch.h
+++ b/base/process/launch.h
@@ -434,7 +434,7 @@
 //
 // It is unsafe to use any pthread APIs after ForkWithFlags().
 // However, performing an exec() will lift this restriction.
-BASE_EXPORT pid_t ForkWithFlags(unsigned long flags, pid_t* ptid, pid_t* ctid);
+BASE_EXPORT pid_t ForkWithFlags(int flags, pid_t* ptid, pid_t* ctid);
 #endif
 
 namespace internal {
diff --git a/base/process/launch_posix.cc b/base/process/launch_posix.cc
index be8f024..9196ad28 100644
--- a/base/process/launch_posix.cc
+++ b/base/process/launch_posix.cc
@@ -138,8 +138,9 @@
 
 // glibc's sigaction() will prevent access to sa_restorer, so we need to roll
 // our own.
-int sys_rt_sigaction(int sig, const struct kernel_sigaction* act,
-                     struct kernel_sigaction* oact) {
+long sys_rt_sigaction(int sig,
+                      const struct kernel_sigaction* act,
+                      struct kernel_sigaction* oact) {
   return syscall(SYS_rt_sigaction, sig, act, oact, sizeof(kernel_sigset_t));
 }
 
@@ -151,7 +152,7 @@
 void ResetChildSignalHandlersToDefaults(void) {
   for (int signum = 1; ; ++signum) {
     struct kernel_sigaction act = {nullptr};
-    int sigaction_get_ret = sys_rt_sigaction(signum, nullptr, &act);
+    long sigaction_get_ret = sys_rt_sigaction(signum, nullptr, &act);
     if (sigaction_get_ret && errno == EINVAL) {
 #if !defined(NDEBUG)
       // Linux supports 32 real-time signals from 33 to 64.
@@ -250,8 +251,10 @@
     char *endptr;
     errno = 0;
     const long int fd = strtol(fd_dir.name(), &endptr, 10);
-    if (fd_dir.name()[0] == 0 || *endptr || fd < 0 || errno)
+    if (fd_dir.name()[0] == 0 || *endptr || fd < 0 || errno ||
+        !IsValueInRangeForNumericType<int>(fd)) {
       continue;
+    }
     if (fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO)
       continue;
     // Cannot use STL iterators here, since debug iterators use locks.
@@ -265,7 +268,7 @@
     if (fd == dir_fd)
       continue;
 
-    int ret = IGNORE_EINTR(close(fd));
+    int ret = IGNORE_EINTR(close(static_cast<int>(fd)));
     DPCHECK(ret == 0);
   }
 }
@@ -620,7 +623,7 @@
             HANDLE_EINTR(read(pipe_fd[0], buffer, sizeof(buffer)));
         if (bytes_read <= 0)
           break;
-        output->append(buffer, bytes_read);
+        output->append(buffer, static_cast<size_t>(bytes_read));
       }
       close(pipe_fd[0]);
 
@@ -697,10 +700,8 @@
 // new stack pointers and print a warning that may confuse the user.
 __attribute__((no_sanitize_address))
 #endif
-NOINLINE pid_t CloneAndLongjmpInChild(unsigned long flags,
-                                      pid_t* ptid,
-                                      pid_t* ctid,
-                                      jmp_buf* env) {
+NOINLINE pid_t
+CloneAndLongjmpInChild(int flags, pid_t* ptid, pid_t* ctid, jmp_buf* env) {
   // We use the libc clone wrapper instead of making the syscall
   // directly because making the syscall may fail to update the libc's
   // internal pid cache. The libc interface unfortunately requires
@@ -720,7 +721,7 @@
 
 }  // anonymous namespace
 
-pid_t ForkWithFlags(unsigned long flags, pid_t* ptid, pid_t* ctid) {
+pid_t ForkWithFlags(int flags, pid_t* ptid, pid_t* ctid) {
   const bool clone_tls_used = flags & CLONE_SETTLS;
   const bool invalid_ctid =
       (flags & (CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)) && !ctid;
diff --git a/base/process/process_handle_linux.cc b/base/process/process_handle_linux.cc
index b31e018..33c4f166 100644
--- a/base/process/process_handle_linux.cc
+++ b/base/process/process_handle_linux.cc
@@ -5,6 +5,7 @@
 #include "base/process/process_handle.h"
 
 #include "base/files/file_util.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/process/internal_linux.h"
 #include "build/build_config.h"
 #if BUILDFLAG(IS_AIX)
@@ -19,7 +20,8 @@
       internalAIX::ReadProcStatsAndGetFieldAsInt64(process,
                                                    internalAIX::VM_PPID);
 #else
-      internal::ReadProcStatsAndGetFieldAsInt64(process, internal::VM_PPID);
+      checked_cast<ProcessId>(internal::ReadProcStatsAndGetFieldAsInt64(
+          process, internal::VM_PPID));
 #endif
   // TODO(zijiehe): Returns 0 if |process| does not have a parent process.
   if (pid)
diff --git a/base/process/process_iterator_linux.cc b/base/process/process_iterator_linux.cc
index fd1821a2..f69f95f 100644
--- a/base/process/process_iterator_linux.cc
+++ b/base/process/process_iterator_linux.cc
@@ -9,6 +9,7 @@
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/notreached.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/process/internal_linux.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
@@ -136,8 +137,10 @@
   }
 
   entry_.pid_ = pid;
-  entry_.ppid_ = GetProcStatsFieldAsInt64(proc_stats, internal::VM_PPID);
-  entry_.gid_ = GetProcStatsFieldAsInt64(proc_stats, internal::VM_PGRP);
+  entry_.ppid_ = checked_cast<ProcessId>(
+      GetProcStatsFieldAsInt64(proc_stats, internal::VM_PPID));
+  entry_.gid_ = checked_cast<ProcessId>(
+      GetProcStatsFieldAsInt64(proc_stats, internal::VM_PGRP));
   entry_.cmd_line_args_.assign(cmd_line_args.begin(), cmd_line_args.end());
   entry_.exe_file_ = GetProcessExecutablePath(pid).BaseName().value();
   return true;
diff --git a/base/process/process_linux.cc b/base/process/process_linux.cc
index eae3a21..4fd2586 100644
--- a/base/process/process_linux.cc
+++ b/base/process/process_linux.cc
@@ -225,7 +225,7 @@
     return false;
 
   int priority = background ? kBackgroundPriority : kForegroundPriority;
-  int result = setpriority(PRIO_PROCESS, process_, priority);
+  int result = setpriority(PRIO_PROCESS, static_cast<id_t>(process_), priority);
   DPCHECK(result == 0);
   return result == 0;
 }
diff --git a/base/process/process_metrics.h b/base/process/process_metrics.h
index f897b204..6000d9a 100644
--- a/base/process/process_metrics.h
+++ b/base/process/process_metrics.h
@@ -271,7 +271,7 @@
 
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || \
     BUILDFLAG(IS_AIX)
-  CPU::CoreType GetCoreType(int core_index);
+  CPU::CoreType GetCoreType(uint32_t core_index);
 #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) ||
         // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_AIX)
 
@@ -434,7 +434,7 @@
 // This should be used with care as no synchronization with running threads is
 // done. This is mostly useful to guarantee being single-threaded.
 // Returns 0 on failure.
-BASE_EXPORT int GetNumberOfThreads(ProcessHandle process);
+BASE_EXPORT int64_t GetNumberOfThreads(ProcessHandle process);
 
 // /proc/self/exe refers to the current executable.
 BASE_EXPORT extern const char kProcSelfExe[];
diff --git a/base/process/process_metrics_linux.cc b/base/process/process_metrics_linux.cc
index 9ba7a86e..c3289d7 100644
--- a/base/process/process_metrics_linux.cc
+++ b/base/process/process_metrics_linux.cc
@@ -22,6 +22,7 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/notreached.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/process/internal_linux.h"
 #include "base/process/process_metrics_iocounters.h"
 #include "base/strings/string_number_conversions.h"
@@ -173,7 +174,7 @@
 
 size_t ProcessMetrics::GetResidentSetSize() const {
   return internal::ReadProcStatsAndGetFieldAsSizeT(process_, internal::VM_RSS) *
-      getpagesize();
+         checked_cast<size_t>(getpagesize());
 }
 
 TimeDelta ProcessMetrics::GetCumulativeCPUUsage() {
@@ -340,7 +341,8 @@
   SystemMemoryInfoKB meminfo;
   if (!GetSystemMemoryInfo(&meminfo))
     return 0;
-  return meminfo.total - meminfo.free - meminfo.buffers - meminfo.cached;
+  return checked_cast<size_t>(meminfo.total - meminfo.free - meminfo.buffers -
+                              meminfo.cached);
 }
 
 int ParseProcStatCPU(StringPiece input) {
@@ -375,7 +377,7 @@
   return -1;
 }
 
-int GetNumberOfThreads(ProcessHandle process) {
+int64_t GetNumberOfThreads(ProcessHandle process) {
   return internal::ReadProcStatsAndGetFieldAsInt64(process,
                                                    internal::VM_NUMTHREADS);
 }
@@ -431,7 +433,7 @@
       if (time > 0) {
         time_in_state_per_thread.push_back(
             {tid, current_core_type, current_core_index, frequency,
-             internal::ClockTicksToTimeDelta(time)});
+             internal::ClockTicksToTimeDelta(checked_cast<int64_t>(time))});
       }
     } else {
       // Data without a header is not supported.
@@ -440,17 +442,17 @@
 
     // Advance line.
     DCHECK_GT(num_chars, 0);
-    pos += num_chars;
+    pos += static_cast<size_t>(num_chars);
   }
 
   return true;
 }
 
-CPU::CoreType ProcessMetrics::GetCoreType(int core_index) {
+CPU::CoreType ProcessMetrics::GetCoreType(uint32_t core_index) {
   const std::vector<CPU::CoreType>& core_types = CPU::GetGuessedCoreTypes();
-  if (static_cast<size_t>(core_index) >= core_types.size())
+  if (core_index >= core_types.size())
     return CPU::CoreType::kUnknown;
-  return core_types[static_cast<size_t>(core_index)];
+  return core_types[core_index];
 }
 
 const char kProcSelfExe[] = "/proc/self/exe";
@@ -680,9 +682,11 @@
 
 Value VmStatInfo::ToValue() const {
   Value res(Value::Type::DICTIONARY);
-  res.SetIntKey("pswpin", pswpin);
-  res.SetIntKey("pswpout", pswpout);
-  res.SetIntKey("pgmajfault", pgmajfault);
+  // TODO(crbug.com/1334256): Make base::Value able to hold unsigned long and
+  // remove casts below.
+  res.SetIntKey("pswpin", static_cast<int>(pswpin));
+  res.SetIntKey("pswpout", static_cast<int>(pswpout));
+  res.SetIntKey("pgmajfault", static_cast<int>(pgmajfault));
   return res;
 }
 
diff --git a/base/process/process_metrics_posix.cc b/base/process/process_metrics_posix.cc
index ae6d3a6..5926815 100644
--- a/base/process/process_metrics_posix.cc
+++ b/base/process/process_metrics_posix.cc
@@ -26,6 +26,8 @@
 
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
 #include <features.h>
+
+#include "base/numerics/safe_conversions.h"
 #endif
 
 namespace base {
@@ -88,7 +90,7 @@
 void IncreaseFdLimitTo(unsigned int max_descriptors) {
   struct rlimit limits;
   if (getrlimit(RLIMIT_NOFILE, &limits) == 0) {
-    unsigned int new_limit = max_descriptors;
+    rlim_t new_limit = max_descriptors;
     if (max_descriptors <= limits.rlim_cur)
       return;
     if (limits.rlim_max > 0 && limits.rlim_max < max_descriptors) {
@@ -119,7 +121,7 @@
   struct mallinfo minfo = mallinfo();
 #endif
 #undef MALLINFO2_FOUND_IN_LIBC
-  return minfo.hblkhd + minfo.arena;
+  return checked_cast<size_t>(minfo.hblkhd + minfo.arena);
 }
 
 }  // namespace
diff --git a/base/process/process_metrics_unittest.cc b/base/process/process_metrics_unittest.cc
index eceae04..8ab3e9b1 100644
--- a/base/process/process_metrics_unittest.cc
+++ b/base/process/process_metrics_unittest.cc
@@ -601,7 +601,7 @@
 // http://crbug.com/396455
 TEST(ProcessMetricsTest, DISABLED_GetNumberOfThreads) {
   const ProcessHandle current = GetCurrentProcessHandle();
-  const int initial_threads = GetNumberOfThreads(current);
+  const int64_t initial_threads = GetNumberOfThreads(current);
   ASSERT_GT(initial_threads, 0);
   const int kNumAdditionalThreads = 10;
   {
diff --git a/base/process/process_posix.cc b/base/process/process_posix.cc
index bddae2a..83501156e 100644
--- a/base/process/process_posix.cc
+++ b/base/process/process_posix.cc
@@ -67,9 +67,9 @@
   }
 
   pid_t ret_pid = HANDLE_EINTR(waitpid(handle, status, WNOHANG));
-  static const int64_t kMaxSleepInMicroseconds = 1 << 18;  // ~256 milliseconds.
-  int64_t max_sleep_time_usecs = 1 << 10;                  // ~1 milliseconds.
-  int64_t double_sleep_time = 0;
+  static const uint32_t kMaxSleepInMicroseconds = 1 << 18;  // ~256 ms.
+  uint32_t max_sleep_time_usecs = 1 << 10;                  // ~1 ms.
+  int double_sleep_time = 0;
 
   // If the process hasn't exited yet, then sleep and try again.
   base::TimeTicks wakeup_time = base::TimeTicks::Now() + wait;
@@ -77,12 +77,10 @@
     base::TimeTicks now = base::TimeTicks::Now();
     if (now > wakeup_time)
       break;
-    // Guaranteed to be non-negative!
-    int64_t sleep_time_usecs = (wakeup_time - now).InMicroseconds();
-    // Sleep for a bit while we wait for the process to finish.
-    if (sleep_time_usecs > max_sleep_time_usecs)
-      sleep_time_usecs = max_sleep_time_usecs;
 
+    const uint32_t sleep_time_usecs = static_cast<uint32_t>(
+        std::min(static_cast<uint64_t>((wakeup_time - now).InMicroseconds()),
+                 uint64_t{max_sleep_time_usecs}));
     // usleep() will return 0 and set errno to EINTR on receipt of a signal
     // such as SIGCHLD.
     usleep(sleep_time_usecs);
@@ -394,7 +392,7 @@
 
 int Process::GetPriority() const {
   DCHECK(IsValid());
-  return getpriority(PRIO_PROCESS, process_);
+  return getpriority(PRIO_PROCESS, static_cast<id_t>(process_));
 }
 
 }  // namespace base
diff --git a/base/trace_event/java_heap_dump_provider_android.cc b/base/trace_event/java_heap_dump_provider_android.cc
index 624f743..3e4881e 100644
--- a/base/trace_event/java_heap_dump_provider_android.cc
+++ b/base/trace_event/java_heap_dump_provider_android.cc
@@ -21,8 +21,8 @@
 bool JavaHeapDumpProvider::OnMemoryDump(const MemoryDumpArgs& args,
                                         ProcessMemoryDump* pmd) {
   // These numbers come from java.lang.Runtime stats.
-  long total_heap_size = 0;
-  long free_heap_size = 0;
+  uint64_t total_heap_size = 0;
+  uint64_t free_heap_size = 0;
   android::JavaRuntime::GetMemoryUsage(&total_heap_size, &free_heap_size);
 
   MemoryAllocatorDump* outer_dump = pmd->CreateAllocatorDump("java_heap");
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index 233de40f..b9a75572 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-8.20220707.1.1
+8.20220707.2.1
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java
index 58e8de92..2198b2a2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java
@@ -389,6 +389,7 @@
     @Test
     @SmallTest
     @DisableIf.Device(type = {UiDisableIf.TABLET}) // see crbug.com/1177417
+    @DisabledTest(message = "https://crbug.com/1311737")
     public void testTypeBeforeDeferredInitialization() throws Exception {
         // Start the Activity.  It should pause and assume that a promo dialog has appeared.
         mTestDelegate.shouldDelayDeferredInitialization = true;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java
index 87cab2c..692ac20 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersCoordinatorTest.java
@@ -21,6 +21,7 @@
 import android.view.ViewGroup;
 
 import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.RecyclerView;
 import androidx.test.core.app.ActivityScenario;
 
 import com.google.android.material.tabs.TabLayout;
@@ -60,6 +61,7 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 
@@ -175,9 +177,11 @@
     private Intent mHistoryActivityIntent = new Intent();
     private Intent mOpenUrlIntent = new Intent();
     private Activity mActivity;
-    private Promise mPromise = new Promise();
+    private Promise<HistoryClustersResult> mPromise = new Promise();
     private ClusterVisit mVisit1;
     private ClusterVisit mVisit2;
+    private HistoryCluster mCluster;
+    private HistoryClustersResult mClusterResult;
     private TestHistoryClustersDelegate mHistoryClustersDelegate =
             new TestHistoryClustersDelegate();
     private List<ClusterVisit> mVisitsForRemoval = new ArrayList<>();
@@ -195,6 +199,9 @@
                 new ArrayList<>(), mGurl1, 123L, new ArrayList<>());
         mVisit2 = new ClusterVisit(1.0F, mGurl2, "Title 2", "bar.com", new ArrayList<>(),
                 new ArrayList<>(), mGurl2, 123L, new ArrayList<>());
+        mCluster = new HistoryCluster(Arrays.asList(mVisit1, mVisit2), "\"label\"", "label",
+                Collections.emptyList(), 123L, Arrays.asList("pugs", "terriers"));
+        mClusterResult = new HistoryClustersResult(Arrays.asList(mCluster), "dogs", false, false);
 
         mActivityScenario =
                 ActivityScenario.launch(ChromeTabbedActivity.class).onActivity(activity -> {
@@ -345,6 +352,46 @@
         assertThat(mVisitsForRemoval, Matchers.containsInAnyOrder(mVisit1, mVisit2));
     }
 
+    @Test
+    public void testSetQueryState() {
+        mHistoryClustersCoordinator.inflateActivityView();
+        mHistoryClustersCoordinator.setQueryState(QueryState.forQuery("dogs"));
+        fulfillPromise(mPromise, mClusterResult);
+
+        RecyclerView recyclerView = mHistoryClustersCoordinator.getRecyclerViewFortesting();
+        recyclerView.measure(0, 0);
+        recyclerView.layout(0, 0, 600, 1000);
+
+        assertHasViewWithClass(recyclerView, HistoryClustersRelatedSearchesChipLayout.class);
+        assertHasViewWithClass(recyclerView, HistoryClustersItemView.class);
+        assertHasViewWithClass(recyclerView, HistoryClusterView.class);
+    }
+
+    @Test
+    public void testDestroy() {
+        mHistoryClustersCoordinator.inflateActivityView();
+        mHistoryClustersCoordinator.setQueryState(QueryState.forQuery("dogs"));
+        mHistoryClustersCoordinator.destroy();
+
+        // Fulfilling the promise post-destroy shouldn't crash or do anything else for that matter.
+        fulfillPromise(mPromise, mClusterResult);
+    }
+
+    private <T> void fulfillPromise(Promise<T> promise, T result) {
+        promise.fulfill(result);
+        ShadowLooper.idleMainLooper();
+    }
+
+    private void assertHasViewWithClass(RecyclerView recyclerView, Class clazz) {
+        for (int i = 0; i < recyclerView.getAdapter().getItemCount(); i++) {
+            RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForAdapterPosition(i);
+            if (clazz.equals(viewHolder.itemView.getClass())) {
+                return;
+            }
+        }
+        assertFalse(true);
+    }
+
     private static void resetStaticState() {
         DisplayAndroidManager.resetInstanceForTesting();
         TabWindowManagerSingleton.resetTabModelSelectorFactoryForTesting();
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 51fa151..99e6869 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1057,8 +1057,6 @@
     "password_manager/password_reuse_manager_factory.h",
     "password_manager/password_scripts_fetcher_factory.cc",
     "password_manager/password_scripts_fetcher_factory.h",
-    "password_manager/password_store_backend_sync_delegate_impl.cc",
-    "password_manager/password_store_backend_sync_delegate_impl.h",
     "password_manager/password_store_factory.cc",
     "password_manager/password_store_factory.h",
     "password_manager/password_store_utils.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 4beea75..2e9fc611 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -8178,6 +8178,16 @@
      FEATURE_VALUE_TYPE(features::kDelegatedCompositing)},
 #endif
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \
+    BUILDFLAG(IS_CHROMEOS_ASH)
+    {"document-picture-in-picture-api",
+     flag_descriptions::kDocumentPictureInPictureApiName,
+     flag_descriptions::kDocumentPictureInPictureApiDescription,
+     kOsMac | kOsWin | kOsLinux | kOsCrOS,
+     FEATURE_VALUE_TYPE(features::kPictureInPictureV2)},
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) ||
+        // BUILDFLAG(IS_CHROMEOS_ASH)
+
     {"web-midi", flag_descriptions::kWebMidiName,
      flag_descriptions::kWebMidiDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kWebMidi)},
diff --git a/chrome/browser/ash/crosapi/test_controller_ash.cc b/chrome/browser/ash/crosapi/test_controller_ash.cc
index 366fe177..f3f48b0 100644
--- a/chrome/browser/ash/crosapi/test_controller_ash.cc
+++ b/chrome/browser/ash/crosapi/test_controller_ash.cc
@@ -32,6 +32,8 @@
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/views/tabs/tab_scrubber_chromeos.h"
+#include "chromeos/ash/components/dbus/userdataauth/cryptohome_misc_client.h"
+#include "chromeos/ash/components/network/network_handler_test_helper.h"
 #include "chromeos/dbus/shill/shill_profile_client.h"
 #include "chromeos/dbus/shill/shill_third_party_vpn_driver_client.h"
 #include "components/version_info/version_info.h"
@@ -514,6 +516,38 @@
 #endif  // defined(USE_CUPS)
 }
 
+void TestControllerAsh::BindShillClientTestInterface(
+    mojo::PendingReceiver<crosapi::mojom::ShillClientTestInterface> receiver,
+    BindShillClientTestInterfaceCallback callback) {
+  mojo::MakeSelfOwnedReceiver<crosapi::mojom::ShillClientTestInterface>(
+      std::make_unique<crosapi::ShillClientTestInterfaceAsh>(),
+      std::move(receiver));
+  std::move(callback).Run();
+}
+
+void TestControllerAsh::GetSanitizedActiveUsername(
+    GetSanitizedActiveUsernameCallback callback) {
+  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
+  user_manager::User* user = user_manager->GetActiveUser();
+  CHECK(user);
+
+  ::user_data_auth::GetSanitizedUsernameRequest request;
+
+  request.set_username(
+      cryptohome::CreateAccountIdentifierFromAccountId(user->GetAccountId())
+          .account_id());
+  ash::CryptohomeMiscClient::Get()->GetSanitizedUsername(
+      request,
+      base::BindOnce(
+          [](GetSanitizedActiveUsernameCallback callback,
+             absl::optional<::user_data_auth::GetSanitizedUsernameReply>
+                 result) {
+            CHECK(result.has_value());
+            std::move(callback).Run(result->sanitized_username());
+          },
+          std::move(callback)));
+}
+
 // This class waits for overview mode to either enter or exit and fires a
 // callback. This class will fire the callback at most once.
 class TestControllerAsh::OverviewWaiter : public ash::OverviewObserver {
@@ -605,4 +639,100 @@
   client->OnPlatformMessage(shill_key, message);
 }
 
+////////////
+// ShillClientTestInterfaceAsh
+
+ShillClientTestInterfaceAsh::ShillClientTestInterfaceAsh() = default;
+ShillClientTestInterfaceAsh::~ShillClientTestInterfaceAsh() = default;
+
+void ShillClientTestInterfaceAsh::AddDevice(const std::string& device_path,
+                                            const std::string& type,
+                                            const std::string& name,
+                                            AddDeviceCallback callback) {
+  auto* device_test = chromeos::ShillDeviceClient::Get()->GetTestInterface();
+  device_test->AddDevice(device_path, type, name);
+  std::move(callback).Run();
+}
+
+void ShillClientTestInterfaceAsh::ClearDevices(ClearDevicesCallback callback) {
+  auto* device_test = chromeos::ShillDeviceClient::Get()->GetTestInterface();
+  device_test->ClearDevices();
+  std::move(callback).Run();
+}
+
+void ShillClientTestInterfaceAsh::SetDeviceProperty(
+    const std::string& device_path,
+    const std::string& name,
+    ::base::Value value,
+    bool notify_changed,
+    SetDevicePropertyCallback callback) {
+  auto* device_test = chromeos::ShillDeviceClient::Get()->GetTestInterface();
+  device_test->SetDeviceProperty(device_path, name, value, notify_changed);
+  std::move(callback).Run();
+}
+
+void ShillClientTestInterfaceAsh::SetSimLocked(const std::string& device_path,
+                                               bool enabled,
+                                               SetSimLockedCallback callback) {
+  auto* device_test = chromeos::ShillDeviceClient::Get()->GetTestInterface();
+  device_test->SetSimLocked(device_path, enabled);
+  std::move(callback).Run();
+}
+
+void ShillClientTestInterfaceAsh::AddService(
+    const std::string& service_path,
+    const std::string& guid,
+    const std::string& name,
+    const std::string& type,
+    const std::string& state,
+    bool visible,
+    SetDevicePropertyCallback callback) {
+  auto* service_test = chromeos::ShillServiceClient::Get()->GetTestInterface();
+  service_test->AddService(service_path, guid, name, type, state, visible);
+  std::move(callback).Run();
+}
+
+void ShillClientTestInterfaceAsh::ClearServices(
+    ClearServicesCallback callback) {
+  auto* service_test = chromeos::ShillServiceClient::Get()->GetTestInterface();
+  service_test->ClearServices();
+  std::move(callback).Run();
+}
+
+void ShillClientTestInterfaceAsh::SetServiceProperty(
+    const std::string& service_path,
+    const std::string& property,
+    base::Value value,
+    SetServicePropertyCallback callback) {
+  auto* service_test = chromeos::ShillServiceClient::Get()->GetTestInterface();
+  service_test->SetServiceProperty(service_path, property, value);
+  std::move(callback).Run();
+}
+
+void ShillClientTestInterfaceAsh::AddProfile(const std::string& profile_path,
+                                             const std::string& userhash,
+                                             AddProfileCallback callback) {
+  auto* profile_test = chromeos::ShillProfileClient::Get()->GetTestInterface();
+  profile_test->AddProfile(profile_path, userhash);
+  std::move(callback).Run();
+}
+
+void ShillClientTestInterfaceAsh::AddServiceToProfile(
+    const std::string& profile_path,
+    const std::string& service_path,
+    AddServiceToProfileCallback callback) {
+  auto* profile_test = chromeos::ShillProfileClient::Get()->GetTestInterface();
+  profile_test->AddService(profile_path, service_path);
+  std::move(callback).Run();
+}
+
+void ShillClientTestInterfaceAsh::AddIPConfig(const std::string& ip_config_path,
+                                              ::base::Value properties,
+                                              AddIPConfigCallback callback) {
+  auto* ip_config_test =
+      chromeos::ShillIPConfigClient::Get()->GetTestInterface();
+  ip_config_test->AddIPConfig(ip_config_path, properties);
+  std::move(callback).Run();
+}
+
 }  // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/test_controller_ash.h b/chrome/browser/ash/crosapi/test_controller_ash.h
index 9c36a59..3faae57 100644
--- a/chrome/browser/ash/crosapi/test_controller_ash.h
+++ b/chrome/browser/ash/crosapi/test_controller_ash.h
@@ -85,6 +85,13 @@
       const std::string& job_title,
       CreateAndCancelPrintJobCallback callback) override;
 
+  void BindShillClientTestInterface(
+      mojo::PendingReceiver<crosapi::mojom::ShillClientTestInterface> receiver,
+      BindShillClientTestInterfaceCallback callback) override;
+
+  void GetSanitizedActiveUsername(
+      GetSanitizedActiveUsernameCallback callback) override;
+
   mojo::Remote<mojom::StandaloneBrowserTestController>&
   GetStandaloneBrowserTestController() {
     DCHECK(standalone_browser_test_controller_.is_bound());
@@ -141,6 +148,51 @@
                          uint32_t message) override;
 };
 
+class ShillClientTestInterfaceAsh
+    : public crosapi::mojom::ShillClientTestInterface {
+ public:
+  ShillClientTestInterfaceAsh();
+  ~ShillClientTestInterfaceAsh() override;
+
+  void AddDevice(const std::string& device_path,
+                 const std::string& type,
+                 const std::string& name,
+                 AddDeviceCallback callback) override;
+  void ClearDevices(ClearDevicesCallback callback) override;
+  void SetDeviceProperty(const std::string& device_path,
+                         const std::string& name,
+                         ::base::Value value,
+                         bool notify_changed,
+                         SetDevicePropertyCallback callback) override;
+  void SetSimLocked(const std::string& device_path,
+                    bool enabled,
+                    SetSimLockedCallback callback) override;
+
+  void AddService(const std::string& service_path,
+                  const std::string& guid,
+                  const std::string& name,
+                  const std::string& type,
+                  const std::string& state,
+                  bool visible,
+                  AddServiceCallback callback) override;
+  void ClearServices(ClearServicesCallback callback) override;
+  void SetServiceProperty(const std::string& service_path,
+                          const std::string& property,
+                          base::Value value,
+                          SetServicePropertyCallback callback) override;
+
+  void AddProfile(const std::string& profile_path,
+                  const std::string& userhash,
+                  AddProfileCallback callback) override;
+  void AddServiceToProfile(const std::string& profile_path,
+                           const std::string& service_path,
+                           AddServiceToProfileCallback callback) override;
+
+  void AddIPConfig(const std::string& ip_config_path,
+                   ::base::Value properties,
+                   AddIPConfigCallback callback) override;
+};
+
 }  // namespace crosapi
 
 #endif  // CHROME_BROWSER_ASH_CROSAPI_TEST_CONTROLLER_ASH_H_
diff --git a/chrome/browser/ash/network_change_manager_client_browsertest.cc b/chrome/browser/ash/network_change_manager_client_browsertest.cc
index 691d0f6..a79892b 100644
--- a/chrome/browser/ash/network_change_manager_client_browsertest.cc
+++ b/chrome/browser/ash/network_change_manager_client_browsertest.cc
@@ -138,7 +138,7 @@
 // Tests that network changes from shill are received by both the
 // NetworkChangeNotifier and NetworkConnectionTracker.
 IN_PROC_BROWSER_TEST_F(NetworkChangeManagerClientBrowserTest,
-                       ReceiveNotifications) {
+                       DISABLED_ReceiveNotifications) {
   // TODO(b/229673213): Remove log once flakiness is fixed.
   LOG(INFO) << "ReceiveNotifications test start";
   NetObserver net_observer;
diff --git a/chrome/browser/browser_switcher/browser_switcher_service_browsertest.cc b/chrome/browser/browser_switcher/browser_switcher_service_browsertest.cc
index 4bad2e8..27c841c 100644
--- a/chrome/browser/browser_switcher/browser_switcher_service_browsertest.cc
+++ b/chrome/browser/browser_switcher/browser_switcher_service_browsertest.cc
@@ -157,6 +157,7 @@
 #endif
   }
 
+#if BUILDFLAG(IS_WIN)
   void SetUseIeSitelist(bool use_ie_sitelist) {
     policy::PolicyMap policies;
     EnableBrowserSwitcher(&policies);
@@ -165,6 +166,7 @@
     provider_.UpdateChromePolicy(policies);
     base::RunLoop().RunUntilIdle();
   }
+#endif
 
   void SetExternalUrl(const std::string& url) {
     policy::PolicyMap policies;
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc
index 964609a..6e32a44 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_apitest.cc
@@ -89,17 +89,12 @@
         ->set_test_mode(true);
   }
 
-  bool RunAutotestPrivateExtensionTest(const std::string& test_suite) {
-    return RunAutotestPrivateExtensionTest(
-        test_suite,
-        /*suite_args=*/std::vector<base::Value>());
-  }
-
-  bool RunAutotestPrivateExtensionTest(const std::string& test_suite,
-                                       std::vector<base::Value> suite_args) {
-    base::DictionaryValue custom_args;
-    custom_args.SetKey("testSuite", base::Value(test_suite));
-    custom_args.SetKey("args", base::Value(suite_args));
+  bool RunAutotestPrivateExtensionTest(
+      const std::string& test_suite,
+      base::Value::List suite_args = base::Value::List()) {
+    base::Value::Dict custom_args;
+    custom_args.Set("testSuite", test_suite);
+    custom_args.Set("args", std::move(suite_args));
 
     std::string json;
     if (!base::JSONWriter::Write(custom_args, &json)) {
@@ -219,10 +214,10 @@
 
   const bool mark_time_of_first_add = GetParam();
 
-  base::DictionaryValue options;
-  options.SetBoolKey("markTimeOfFirstAdd", mark_time_of_first_add);
-  std::vector<base::Value> suite_args;
-  suite_args.emplace_back(std::move(options));
+  base::Value::Dict options;
+  options.Set("markTimeOfFirstAdd", mark_time_of_first_add);
+  base::Value::List suite_args;
+  suite_args.Append(std::move(options));
 
   ASSERT_TRUE(
       RunAutotestPrivateExtensionTest("holdingSpace", std::move(suite_args)))
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
index 15e5cb3..58aa0931 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
@@ -288,12 +288,12 @@
         *params->change_info.arc_removable_media_access_enabled);
   }
   if (params->change_info.folder_shortcuts) {
-    std::vector<base::Value> folder_shortcuts;
+    base::Value::List folder_shortcuts;
     for (auto& shortcut : *params->change_info.folder_shortcuts) {
-      folder_shortcuts.push_back(base::Value(shortcut));
+      folder_shortcuts.Append(shortcut);
     }
-    service->Set(ash::prefs::kFilesAppFolderShortcuts,
-                 base::Value(std::move(folder_shortcuts)));
+    service->SetList(ash::prefs::kFilesAppFolderShortcuts,
+                     std::move(folder_shortcuts));
   }
 
   return RespondNow(NoArguments());
diff --git a/chrome/browser/device_reauth/android/biometric_authenticator_android.cc b/chrome/browser/device_reauth/android/biometric_authenticator_android.cc
index 9fcbc92..e7de6eb 100644
--- a/chrome/browser/device_reauth/android/biometric_authenticator_android.cc
+++ b/chrome/browser/device_reauth/android/biometric_authenticator_android.cc
@@ -14,6 +14,7 @@
 #include "base/location.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
 #include "base/time/time.h"
 #include "chrome/browser/device_reauth/android/biometric_authenticator_bridge_impl.h"
 #include "components/autofill/core/common/autofill_features.h"
@@ -27,7 +28,6 @@
 #include "ui/android/view_android.h"
 
 using content::WebContents;
-using device_reauth::BiometricAuthFinalResult;
 using device_reauth::BiometricAuthUIResult;
 using device_reauth::BiometricsAvailability;
 using password_manager::UiCredential;
@@ -141,6 +141,13 @@
                      base::Unretained(this)));
 }
 
+void BiometricAuthenticatorAndroid::AuthenticateWithMessage(
+    device_reauth::BiometricAuthRequester requester,
+    const std::u16string message,
+    AuthenticateCallback callback) {
+  NOTIMPLEMENTED();
+}
+
 void BiometricAuthenticatorAndroid::Cancel(
     device_reauth::BiometricAuthRequester requester) {
   // The object cancelling the auth is not the same as the one to which
diff --git a/chrome/browser/device_reauth/android/biometric_authenticator_android.h b/chrome/browser/device_reauth/android/biometric_authenticator_android.h
index e446c46..322598b 100644
--- a/chrome/browser/device_reauth/android/biometric_authenticator_android.h
+++ b/chrome/browser/device_reauth/android/biometric_authenticator_android.h
@@ -13,6 +13,37 @@
 #include "components/password_manager/core/browser/origin_credential_store.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
+// The result of the biometric authentication.
+//
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class BiometricAuthFinalResult {
+  // This value is used for when we don't know the exact auth method used. This
+  // can be the case on Android versions under 11.
+  kSuccessWithUnknownMethod = 0,
+  kSuccessWithBiometrics = 1,
+  kSuccessWithDeviceLock = 2,
+  kCanceledByUser = 3,
+  kFailed = 4,
+
+  // Deprecated in favour of kCanceledByChrome. Recorded when the auth succeeds
+  // after Chrome cancelled it.
+  // kSuccessButCanceled = 5,
+
+  // Deprecated in favour of kCanceledByChrome. Recorded when the auth fails
+  // after Chrome cancelled it.
+  // kFailedAndCanceled = 6,
+
+  // Recorded if an authentication was requested within 60s of the previous
+  // successful authentication.
+  kAuthStillValid = 7,
+
+  // Recorded when the authentication flow is cancelled by Chrome.
+  kCanceledByChrome = 8,
+
+  kMaxValue = kCanceledByChrome,
+};
+
 // Android implementation of the BiometricAuthenticator interface.
 class BiometricAuthenticatorAndroid
     : public device_reauth::BiometricAuthenticator {
@@ -28,6 +59,13 @@
   void Authenticate(device_reauth::BiometricAuthRequester requester,
                     AuthenticateCallback callback) override;
 
+  // Trigges an authentication flow based on biometrics, with the
+  // screen lock as fallback. Displays `message` in the authentication UI.
+  // Note: this only supports one authentication request at a time.
+  void AuthenticateWithMessage(device_reauth::BiometricAuthRequester requester,
+                               const std::u16string message,
+                               AuthenticateCallback callback) override;
+
   // Should be called by the object using the authenticator if the purpose
   // for which the auth was requested becomes obsolete or the object is
   // destroyed.
diff --git a/chrome/browser/device_reauth/android/biometric_authenticator_android_unittest.cc b/chrome/browser/device_reauth/android/biometric_authenticator_android_unittest.cc
index 0e8c30c..5091a49d 100644
--- a/chrome/browser/device_reauth/android/biometric_authenticator_android_unittest.cc
+++ b/chrome/browser/device_reauth/android/biometric_authenticator_android_unittest.cc
@@ -25,7 +25,6 @@
 using base::Bucket;
 using base::test::RunOnceCallback;
 using device_reauth::BiometricAuthenticator;
-using device_reauth::BiometricAuthFinalResult;
 using device_reauth::BiometricAuthRequester;
 using device_reauth::BiometricAuthUIResult;
 using device_reauth::BiometricsAvailability;
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc b/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
index bae6384..52562af 100644
--- a/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
+++ b/chrome/browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc
@@ -5,8 +5,6 @@
 #include <memory>
 #include <utility>
 
-#include "ash/components/cryptohome/cryptohome_parameters.h"
-#include "ash/constants/ash_switches.h"
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/callback_helpers.h"
@@ -20,23 +18,6 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/extensions/api/networking_private/networking_private_ui_delegate_chromeos.h"
 #include "chrome/browser/extensions/extension_apitest.h"
-#include "chromeos/ash/components/dbus/userdataauth/cryptohome_misc_client.h"
-#include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h"
-#include "chromeos/ash/components/network/cellular_metrics_logger.h"
-#include "chromeos/ash/components/network/managed_network_configuration_handler.h"
-#include "chromeos/ash/components/network/network_certificate_handler.h"
-#include "chromeos/ash/components/network/network_handler_test_helper.h"
-#include "chromeos/ash/components/network/onc/network_onc_utils.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
-#include "chromeos/dbus/shill/shill_device_client.h"
-#include "chromeos/dbus/shill/shill_ipconfig_client.h"
-#include "chromeos/dbus/shill/shill_manager_client.h"
-#include "chromeos/dbus/shill/shill_profile_client.h"
-#include "chromeos/dbus/shill/shill_service_client.h"
-#include "chromeos/network/network_handler.h"
-#include "chromeos/network/network_state.h"
-#include "chromeos/network/network_state_handler.h"
-#include "chromeos/network/network_type_pattern.h"
 #include "components/onc/onc_constants.h"
 #include "components/onc/onc_pref_names.h"
 #include "components/policy/core/browser/browser_policy_connector.h"
@@ -55,16 +36,44 @@
 #include "components/user_manager/user_names.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/test_utils.h"
-#include "dbus/object_path.h"
 #include "extensions/browser/api/networking_private/networking_private_chromeos.h"
 #include "extensions/browser/api/networking_private/networking_private_delegate_factory.h"
 #include "extensions/common/switches.h"
 #include "extensions/common/value_builder.h"
 #include "extensions/test/extension_test_message_listener.h"
 #include "testing/gmock/include/gmock/gmock.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "ash/components/cryptohome/cryptohome_parameters.h"
+#include "ash/constants/ash_switches.h"
+#include "chromeos/ash/components/dbus/userdataauth/cryptohome_misc_client.h"
+#include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h"
+#include "chromeos/ash/components/network/cellular_metrics_logger.h"
+#include "chromeos/ash/components/network/managed_network_configuration_handler.h"
+#include "chromeos/ash/components/network/network_certificate_handler.h"
+#include "chromeos/ash/components/network/network_handler_test_helper.h"
+#include "chromeos/ash/components/network/onc/network_onc_utils.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/shill/shill_device_client.h"
+#include "chromeos/dbus/shill/shill_ipconfig_client.h"
+#include "chromeos/dbus/shill/shill_manager_client.h"
+#include "chromeos/dbus/shill/shill_profile_client.h"
+#include "chromeos/dbus/shill/shill_service_client.h"
+#include "chromeos/network/network_handler.h"
+#include "chromeos/network/network_state.h"
+#include "chromeos/network/network_state_handler.h"
+#include "chromeos/network/network_type_pattern.h"
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#include "chromeos/crosapi/mojom/test_controller.mojom-test-utils.h"
+#include "chromeos/crosapi/mojom/test_controller.mojom.h"
+#include "chromeos/lacros/lacros_service.h"
+
+using crosapi::mojom::ShillClientTestInterfaceAsyncWaiter;
+#endif
+
 // This tests the Chrome OS implementation of the networkingPrivate API
 // (NetworkingPrivateChromeOS). Note: The test expectations for chromeos, and
 // win/mac (NetworkingPrivateServiceClient) are different to reflect the
@@ -73,6 +82,7 @@
 using testing::Return;
 using testing::_;
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
 using ash::UserDataAuthClient;
 using chromeos::ShillDeviceClient;
 using chromeos::ShillIPConfigClient;
@@ -83,41 +93,30 @@
 using extensions::NetworkingPrivateDelegate;
 using extensions::NetworkingPrivateDelegateFactory;
 using extensions::NetworkingPrivateChromeOS;
+#endif
 
 namespace {
 
-const char kUser1ProfilePath[] = "/profile/user1/shill";
-const char kEthernetDevicePath[] = "/device/stub_ethernet_device";
-const char kWifiDevicePath[] = "/device/stub_wifi_device1";
+const char kCellular1ServicePath[] = "stub_cellular1";
 const char kCellularDevicePath[] = "/device/stub_cellular_device1";
+const char kEthernetDevicePath[] = "/device/stub_ethernet_device";
 const char kIPConfigPath[] = "/ipconfig/ipconfig1";
-
+const char kUser1ProfilePath[] = "/profile/user1/shill";
 const char kWifi1ServicePath[] = "stub_wifi1";
 const char kWifi2ServicePath[] = "stub_wifi2";
-const char kCellular1ServicePath[] = "stub_cellular1";
+const char kWifiDevicePath[] = "/device/stub_wifi_device1";
 
-class UIDelegateStub : public NetworkingPrivateDelegate::UIDelegate {
+class NetworkingPrivateChromeOSApiTestBase
+    : public extensions::ExtensionApiTest {
  public:
-  static int s_show_account_details_called_;
-
- private:
-  // UIDelegate
-  void ShowAccountDetails(const std::string& guid) const override {
-    ++s_show_account_details_called_;
+  // From extensions::ExtensionApiTest
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    extensions::ExtensionApiTest::SetUpCommandLine(command_line);
+    // Allowlist the extension ID of the test extension.
+    command_line->AppendSwitchASCII(
+        extensions::switches::kAllowlistedExtensionID,
+        "epcifkihnkjgphfkloaaleeakhpmgdmn");
   }
-};
-
-// static
-int UIDelegateStub::s_show_account_details_called_ = 0;
-
-class NetworkingPrivateChromeOSApiTest : public extensions::ExtensionApiTest {
- public:
-  NetworkingPrivateChromeOSApiTest() {}
-
-  NetworkingPrivateChromeOSApiTest(const NetworkingPrivateChromeOSApiTest&) =
-      delete;
-  NetworkingPrivateChromeOSApiTest& operator=(
-      const NetworkingPrivateChromeOSApiTest&) = delete;
 
   bool RunNetworkingSubtest(const std::string& test) {
     const std::string arg =
@@ -127,62 +126,107 @@
         {.custom_arg = arg.c_str(), .launch_as_platform_app = true});
   }
 
-  void SetUpInProcessBrowserTestFixture() override {
-    provider_.SetDefaultReturns(
-        /*is_initialization_complete_return=*/true,
-        /*is_first_policy_load_complete_return=*/true);
-    policy::BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_);
+  void ConfigFakeNetwork() {
+    ClearDevices();
+    ClearServices();
 
-    extensions::ExtensionApiTest::SetUpInProcessBrowserTestFixture();
+    std::string userhash = GetSanitizedActiveUsername();
+
+    // Sends a notification about the added profile.
+    AddProfile(kUser1ProfilePath, userhash);
+
+    // Add IPConfigs
+    base::DictionaryValue ipconfig;
+    ipconfig.SetKey(shill::kAddressProperty, base::Value("0.0.0.0"));
+    ipconfig.SetKey(shill::kGatewayProperty, base::Value("0.0.0.1"));
+    ipconfig.SetKey(shill::kPrefixlenProperty, base::Value(0));
+    ipconfig.SetKey(shill::kMethodProperty, base::Value(shill::kTypeIPv4));
+    AddIPConfig(kIPConfigPath, ipconfig);
+
+    // Add Devices
+    AddDevice(kEthernetDevicePath, shill::kTypeEthernet,
+              "stub_ethernet_device1");
+
+    AddDevice(kWifiDevicePath, shill::kTypeWifi, "stub_wifi_device1");
+    base::ListValue wifi_ip_configs;
+    wifi_ip_configs.Append(kIPConfigPath);
+    SetDeviceProperty(kWifiDevicePath, shill::kIPConfigsProperty,
+                      wifi_ip_configs);
+    SetDeviceProperty(kWifiDevicePath, shill::kAddressProperty,
+                      base::Value("001122aabbcc"));
+
+    // Add Services
+    AddService("stub_ethernet", "eth0", shill::kTypeEthernet,
+               shill::kStateOnline);
+    SetServiceProperty("stub_ethernet", shill::kProfileProperty,
+                       base::Value(GetSharedProfilePath()));
+    AddServiceToProfile(GetSharedProfilePath(), "stub_ethernet");
+
+    AddService(kWifi1ServicePath, "wifi1", shill::kTypeWifi,
+               shill::kStateOnline);
+    SetServiceProperty(kWifi1ServicePath, shill::kSecurityClassProperty,
+                       base::Value(shill::kSecurityWep));
+    SetServiceProperty(kWifi1ServicePath, shill::kWifiBSsid,
+                       base::Value("00:01:02:03:04:05"));
+    SetServiceProperty(kWifi1ServicePath, shill::kSignalStrengthProperty,
+                       base::Value(40));
+    SetServiceProperty(kWifi1ServicePath, shill::kProfileProperty,
+                       base::Value(kUser1ProfilePath));
+    SetServiceProperty(kWifi1ServicePath, shill::kConnectableProperty,
+                       base::Value(true));
+    SetServiceProperty(kWifi1ServicePath, shill::kDeviceProperty,
+                       base::Value(kWifiDevicePath));
+    base::DictionaryValue static_ipconfig;
+    static_ipconfig.SetKey(shill::kAddressProperty, base::Value("1.2.3.4"));
+    static_ipconfig.SetKey(shill::kGatewayProperty, base::Value("0.0.0.0"));
+    static_ipconfig.SetKey(shill::kPrefixlenProperty, base::Value(1));
+    SetServiceProperty(kWifi1ServicePath, shill::kStaticIPConfigProperty,
+                       static_ipconfig);
+    base::ListValue frequencies1;
+    frequencies1.Append(2400);
+    SetServiceProperty(kWifi1ServicePath, shill::kWifiFrequencyListProperty,
+                       frequencies1);
+    SetServiceProperty(kWifi1ServicePath, shill::kWifiFrequency,
+                       base::Value(2400));
+    AddServiceToProfile(kUser1ProfilePath, kWifi1ServicePath);
+
+    AddService(kWifi2ServicePath, "wifi2_PSK", shill::kTypeWifi,
+               shill::kStateIdle);
+    SetServiceProperty(kWifi2ServicePath, shill::kSecurityClassProperty,
+                       base::Value(shill::kSecurityPsk));
+    SetServiceProperty(kWifi2ServicePath, shill::kSignalStrengthProperty,
+                       base::Value(80));
+    SetServiceProperty(kWifi2ServicePath, shill::kConnectableProperty,
+                       base::Value(true));
+
+    base::ListValue frequencies2;
+    frequencies2.Append(2400);
+    frequencies2.Append(5000);
+    SetServiceProperty(kWifi2ServicePath, shill::kWifiFrequencyListProperty,
+                       frequencies2);
+    SetServiceProperty(kWifi2ServicePath, shill::kWifiFrequency,
+                       base::Value(5000));
+    SetServiceProperty(kWifi2ServicePath, shill::kProfileProperty,
+                       base::Value(kUser1ProfilePath));
+    AddServiceToProfile(kUser1ProfilePath, kWifi2ServicePath);
+
+    AddService("stub_vpn1", "vpn1", shill::kTypeVPN, shill::kStateOnline);
+    SetServiceProperty("stub_vpn1", shill::kProviderTypeProperty,
+                       base::Value(shill::kProviderOpenVpn));
+    AddServiceToProfile(kUser1ProfilePath, "stub_vpn1");
+
+    AddService("stub_vpn2", "vpn2", shill::kTypeVPN, shill::kStateOffline);
+    SetServiceProperty("stub_vpn2", shill::kProviderTypeProperty,
+                       base::Value(shill::kProviderThirdPartyVpn));
+    SetServiceProperty("stub_vpn2", shill::kProviderHostProperty,
+                       base::Value("third_party_provider_extension_id"));
+    AddServiceToProfile(kUser1ProfilePath, "stub_vpn2");
   }
 
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    extensions::ExtensionApiTest::SetUpCommandLine(command_line);
-    // Allowlist the extension ID of the test extension.
-    command_line->AppendSwitchASCII(
-        extensions::switches::kAllowlistedExtensionID,
-        "epcifkihnkjgphfkloaaleeakhpmgdmn");
-
-    // TODO(pneubeck): Remove the following hack, once the NetworkingPrivateAPI
-    // uses the ProfileHelper to obtain the userhash crbug/238623.
-    cryptohome::AccountIdentifier login_user;
-    login_user.set_account_id(user_manager::CanonicalizeUserID(
-        command_line->GetSwitchValueNative(ash::switches::kLoginUser)));
-    const std::string sanitized_user =
-        UserDataAuthClient::GetStubSanitizedUsername(login_user);
-    command_line->AppendSwitchASCII(ash::switches::kLoginProfile,
-                                    sanitized_user);
-  }
-
-  void InitializeSanitizedUsername() {
-    user_manager::UserManager* user_manager = user_manager::UserManager::Get();
-    user_manager::User* user = user_manager->GetActiveUser();
-    CHECK(user);
-    std::string userhash;
-    ::user_data_auth::GetSanitizedUsernameRequest request;
-    request.set_username(
-        cryptohome::CreateAccountIdentifierFromAccountId(user->GetAccountId())
-            .account_id());
-    ash::CryptohomeMiscClient::Get()->GetSanitizedUsername(
-        request,
-        base::BindOnce(
-            [](std::string* out,
-               absl::optional<::user_data_auth::GetSanitizedUsernameReply>
-                   result) {
-              CHECK(result.has_value());
-              *out = result->sanitized_username();
-            },
-            &userhash_));
-    content::RunAllPendingInMessageLoop();
-    CHECK(!userhash_.empty());
-  }
-
-  void SetupCellular() {
-    UIDelegateStub::s_show_account_details_called_ = 0;
-
+  virtual void SetupCellular() {
     // Add a Cellular GSM Device.
-    device_test()->AddDevice(kCellularDevicePath, shill::kTypeCellular,
-                             "stub_cellular_device1");
+    AddDevice(kCellularDevicePath, shill::kTypeCellular,
+              "stub_cellular_device1");
     base::DictionaryValue home_provider;
     home_provider.SetStringKey("name", "Cellular1_Provider");
     home_provider.SetStringKey("code", "000000");
@@ -205,31 +249,89 @@
                       base::Value("test_min"));
     SetDeviceProperty(kCellularDevicePath, shill::kModelIdProperty,
                       base::Value("test_model_id"));
-    device_test()->SetSimLocked(kCellularDevicePath, false);
+    SetSimLocked(kCellularDevicePath, false);
 
     // Add the Cellular Service.
     AddService(kCellular1ServicePath, "cellular1", shill::kTypeCellular,
                shill::kStateIdle);
-    service_test()->SetServiceProperty(kCellular1ServicePath,
-                                       shill::kCellularAllowRoamingProperty,
-                                       base::Value(false));
-    service_test()->SetServiceProperty(
-        kCellular1ServicePath, shill::kAutoConnectProperty, base::Value(true));
-    service_test()->SetServiceProperty(kCellular1ServicePath,
-                                       shill::kIccidProperty,
-                                       base::Value("test_iccid"));
-    service_test()->SetServiceProperty(
-        kCellular1ServicePath, shill::kNetworkTechnologyProperty,
-        base::Value(shill::kNetworkTechnologyGsm));
-    service_test()->SetServiceProperty(
-        kCellular1ServicePath, shill::kActivationStateProperty,
-        base::Value(shill::kActivationStateNotActivated));
-    service_test()->SetServiceProperty(kCellular1ServicePath,
-                                       shill::kRoamingStateProperty,
-                                       base::Value(shill::kRoamingStateHome));
+    SetServiceProperty(kCellular1ServicePath,
+                       shill::kCellularAllowRoamingProperty,
+                       base::Value(false));
+    SetServiceProperty(kCellular1ServicePath, shill::kAutoConnectProperty,
+                       base::Value(true));
+    SetServiceProperty(kCellular1ServicePath, shill::kIccidProperty,
+                       base::Value("test_iccid"));
+    SetServiceProperty(kCellular1ServicePath, shill::kNetworkTechnologyProperty,
+                       base::Value(shill::kNetworkTechnologyGsm));
+    SetServiceProperty(kCellular1ServicePath, shill::kActivationStateProperty,
+                       base::Value(shill::kActivationStateNotActivated));
+    SetServiceProperty(kCellular1ServicePath, shill::kRoamingStateProperty,
+                       base::Value(shill::kRoamingStateHome));
 
-    profile_test()->AddService(kUser1ProfilePath, kCellular1ServicePath);
-    content::RunAllPendingInMessageLoop();
+    AddServiceToProfile(kUser1ProfilePath, kCellular1ServicePath);
+  }
+
+  virtual std::string GetSanitizedActiveUsername() = 0;
+
+  virtual void AddDevice(const std::string& device_path,
+                         const std::string& type,
+                         const std::string& name) = 0;
+  virtual void SetDeviceProperty(const std::string& device_path,
+                                 const std::string& name,
+                                 const base::Value& value) = 0;
+  virtual void SetSimLocked(const std::string& device_path, bool enabled) = 0;
+  virtual void ClearDevices() = 0;
+  virtual void AddService(const std::string& service_path,
+                          const std::string& name,
+                          const std::string& type,
+                          const std::string& state) = 0;
+  virtual void ClearServices() = 0;
+  virtual void SetServiceProperty(const std::string& service_path,
+                                  const std::string& property,
+                                  const base::Value& value) = 0;
+  virtual void AddProfile(const std::string& profile_path,
+                          const std::string& userhash) = 0;
+
+  virtual void AddServiceToProfile(const std::string& profile_path,
+                                   const std::string& service_path) = 0;
+  virtual std::string GetSharedProfilePath() = 0;
+  virtual void AddIPConfig(const std::string& ip_config_path,
+                           const base::Value& properties) = 0;
+};
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+class UIDelegateStub : public NetworkingPrivateDelegate::UIDelegate {
+ public:
+  static int s_show_account_details_called_;
+
+ private:
+  // UIDelegate
+  void ShowAccountDetails(const std::string& guid) const override {
+    ++s_show_account_details_called_;
+  }
+};
+
+// static
+int UIDelegateStub::s_show_account_details_called_ = 0;
+
+class NetworkingPrivateChromeOSApiTestAsh
+    : public NetworkingPrivateChromeOSApiTestBase {
+ public:
+  NetworkingPrivateChromeOSApiTestAsh() = default;
+
+  NetworkingPrivateChromeOSApiTestAsh(
+      const NetworkingPrivateChromeOSApiTestAsh&) = delete;
+  NetworkingPrivateChromeOSApiTestAsh& operator=(
+      const NetworkingPrivateChromeOSApiTestAsh&) = delete;
+
+  static std::unique_ptr<KeyedService> CreateNetworkingPrivateDelegate(
+      content::BrowserContext* context) {
+    std::unique_ptr<NetworkingPrivateDelegate> result(
+        new NetworkingPrivateChromeOS(context));
+    std::unique_ptr<NetworkingPrivateDelegate::UIDelegate> ui_delegate(
+        new UIDelegateStub);
+    result->set_ui_delegate(std::move(ui_delegate));
+    return result;
   }
 
   void SetupTether() {
@@ -247,159 +349,6 @@
         false /* has_connected_to_host */);
   }
 
-  void AddService(const std::string& service_path,
-                  const std::string& name,
-                  const std::string& type,
-                  const std::string& state) {
-    service_test()->AddService(service_path, service_path + "_guid", name, type,
-                               state, true /* add_to_visible */);
-  }
-
-  void SetDeviceProperty(const std::string& device_path,
-                         const std::string& name,
-                         const base::Value& value) {
-    device_test()->SetDeviceProperty(device_path, name, value,
-                                     /*notify_changed=*/true);
-  }
-
-  static std::unique_ptr<KeyedService> CreateNetworkingPrivateDelegate(
-      content::BrowserContext* context) {
-    std::unique_ptr<NetworkingPrivateDelegate> result(
-        new NetworkingPrivateChromeOS(context));
-    std::unique_ptr<NetworkingPrivateDelegate::UIDelegate> ui_delegate(
-        new UIDelegateStub);
-    result->set_ui_delegate(std::move(ui_delegate));
-    return result;
-  }
-
-  void SetUpOnMainThread() override {
-    extensions::ExtensionApiTest::SetUpOnMainThread();
-    content::RunAllPendingInMessageLoop();
-
-    NetworkingPrivateDelegateFactory::GetInstance()->SetTestingFactory(
-        profile(), base::BindRepeating(&CreateNetworkingPrivateDelegate));
-
-    InitializeSanitizedUsername();
-
-    network_handler_test_helper_ =
-        std::make_unique<chromeos::NetworkHandlerTestHelper>();
-    device_test()->ClearDevices();
-    service_test()->ClearServices();
-
-    // Sends a notification about the added profile.
-    profile_test()->AddProfile(kUser1ProfilePath, userhash_);
-
-    // Add IPConfigs
-    base::DictionaryValue ipconfig;
-    ipconfig.SetKey(shill::kAddressProperty, base::Value("0.0.0.0"));
-    ipconfig.SetKey(shill::kGatewayProperty, base::Value("0.0.0.1"));
-    ipconfig.SetKey(shill::kPrefixlenProperty, base::Value(0));
-    ipconfig.SetKey(shill::kMethodProperty, base::Value(shill::kTypeIPv4));
-    network_handler_test_helper_->ip_config_test()->AddIPConfig(kIPConfigPath,
-                                                                ipconfig);
-
-    // Add Devices
-    device_test()->AddDevice(kEthernetDevicePath, shill::kTypeEthernet,
-                             "stub_ethernet_device1");
-
-    device_test()->AddDevice(kWifiDevicePath, shill::kTypeWifi,
-                             "stub_wifi_device1");
-    base::ListValue wifi_ip_configs;
-    wifi_ip_configs.Append(kIPConfigPath);
-    SetDeviceProperty(kWifiDevicePath, shill::kIPConfigsProperty,
-                      wifi_ip_configs);
-    SetDeviceProperty(kWifiDevicePath, shill::kAddressProperty,
-                      base::Value("001122aabbcc"));
-
-    // Add Services
-    AddService("stub_ethernet", "eth0", shill::kTypeEthernet,
-               shill::kStateOnline);
-    service_test()->SetServiceProperty(
-        "stub_ethernet", shill::kProfileProperty,
-        base::Value(ShillProfileClient::GetSharedProfilePath()));
-    profile_test()->AddService(ShillProfileClient::GetSharedProfilePath(),
-                               "stub_ethernet");
-
-    AddService(kWifi1ServicePath, "wifi1", shill::kTypeWifi,
-               shill::kStateOnline);
-    service_test()->SetServiceProperty(kWifi1ServicePath,
-                                       shill::kSecurityClassProperty,
-                                       base::Value(shill::kSecurityWep));
-    service_test()->SetServiceProperty(kWifi1ServicePath, shill::kWifiBSsid,
-                                       base::Value("00:01:02:03:04:05"));
-    service_test()->SetServiceProperty(
-        kWifi1ServicePath, shill::kSignalStrengthProperty, base::Value(40));
-    service_test()->SetServiceProperty(kWifi1ServicePath,
-                                       shill::kProfileProperty,
-                                       base::Value(kUser1ProfilePath));
-    service_test()->SetServiceProperty(
-        kWifi1ServicePath, shill::kConnectableProperty, base::Value(true));
-    service_test()->SetServiceProperty(kWifi1ServicePath,
-                                       shill::kDeviceProperty,
-                                       base::Value(kWifiDevicePath));
-    base::DictionaryValue static_ipconfig;
-    static_ipconfig.SetKey(shill::kAddressProperty, base::Value("1.2.3.4"));
-    static_ipconfig.SetKey(shill::kGatewayProperty, base::Value("0.0.0.0"));
-    static_ipconfig.SetKey(shill::kPrefixlenProperty, base::Value(1));
-    service_test()->SetServiceProperty(
-        kWifi1ServicePath, shill::kStaticIPConfigProperty, static_ipconfig);
-    base::ListValue frequencies1;
-    frequencies1.Append(2400);
-    service_test()->SetServiceProperty(
-        kWifi1ServicePath, shill::kWifiFrequencyListProperty, frequencies1);
-    service_test()->SetServiceProperty(kWifi1ServicePath, shill::kWifiFrequency,
-                                       base::Value(2400));
-    profile_test()->AddService(kUser1ProfilePath, kWifi1ServicePath);
-
-    AddService(kWifi2ServicePath, "wifi2_PSK", shill::kTypeWifi,
-               shill::kStateIdle);
-    service_test()->SetServiceProperty(kWifi2ServicePath,
-                                       shill::kSecurityClassProperty,
-                                       base::Value(shill::kSecurityPsk));
-    service_test()->SetServiceProperty(
-        kWifi2ServicePath, shill::kSignalStrengthProperty, base::Value(80));
-    service_test()->SetServiceProperty(
-        kWifi2ServicePath, shill::kConnectableProperty, base::Value(true));
-
-    base::ListValue frequencies2;
-    frequencies2.Append(2400);
-    frequencies2.Append(5000);
-    service_test()->SetServiceProperty(
-        kWifi2ServicePath, shill::kWifiFrequencyListProperty, frequencies2);
-    service_test()->SetServiceProperty(kWifi2ServicePath, shill::kWifiFrequency,
-                                       base::Value(5000));
-    service_test()->SetServiceProperty(kWifi2ServicePath,
-                                       shill::kProfileProperty,
-                                       base::Value(kUser1ProfilePath));
-    profile_test()->AddService(kUser1ProfilePath, kWifi2ServicePath);
-
-    AddService("stub_vpn1", "vpn1", shill::kTypeVPN, shill::kStateOnline);
-    service_test()->SetServiceProperty("stub_vpn1",
-                                       shill::kProviderTypeProperty,
-                                       base::Value(shill::kProviderOpenVpn));
-    profile_test()->AddService(kUser1ProfilePath, "stub_vpn1");
-
-    AddService("stub_vpn2", "vpn2", shill::kTypeVPN, shill::kStateOffline);
-    service_test()->SetServiceProperty(
-        "stub_vpn2", shill::kProviderTypeProperty,
-        base::Value(shill::kProviderThirdPartyVpn));
-    service_test()->SetServiceProperty(
-        "stub_vpn2", shill::kProviderHostProperty,
-        base::Value("third_party_provider_extension_id"));
-    profile_test()->AddService(kUser1ProfilePath, "stub_vpn2");
-
-    PrefProxyConfigTrackerImpl::RegisterProfilePrefs(user_prefs_.registry());
-    PrefProxyConfigTrackerImpl::RegisterPrefs(local_state_.registry());
-    network_handler_test_helper_->RegisterPrefs(user_prefs_.registry(),
-                                                local_state_.registry());
-
-    network_handler_test_helper_->InitializePrefs(&user_prefs_, &local_state_);
-
-    content::RunAllPendingInMessageLoop();
-  }
-
-  void TearDownOnMainThread() { network_handler_test_helper_.reset(); }
-
   ShillServiceClient::TestInterface* service_test() {
     return network_handler_test_helper_->service_test();
   }
@@ -413,69 +362,374 @@
     return network_handler_test_helper_->manager_test();
   }
 
+  // extensions::ExtensionApiTest overrides:
+
+  void SetUpInProcessBrowserTestFixture() override {
+    provider_.SetDefaultReturns(
+        /*is_initialization_complete_return=*/true,
+        /*is_first_policy_load_complete_return=*/true);
+    policy::BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_);
+
+    extensions::ExtensionApiTest::SetUpInProcessBrowserTestFixture();
+  }
+
+  void SetUpOnMainThread() override {
+    extensions::ExtensionApiTest::SetUpOnMainThread();
+    content::RunAllPendingInMessageLoop();
+
+    NetworkingPrivateDelegateFactory::GetInstance()->SetTestingFactory(
+        profile(), base::BindRepeating(&CreateNetworkingPrivateDelegate));
+
+    network_handler_test_helper_ =
+        std::make_unique<chromeos::NetworkHandlerTestHelper>();
+
+    ConfigFakeNetwork();
+
+    PrefProxyConfigTrackerImpl::RegisterProfilePrefs(user_prefs_.registry());
+    PrefProxyConfigTrackerImpl::RegisterPrefs(local_state_.registry());
+    network_handler_test_helper_->RegisterPrefs(user_prefs_.registry(),
+                                                local_state_.registry());
+
+    network_handler_test_helper_->InitializePrefs(&user_prefs_, &local_state_);
+
+    base::RunLoop().RunUntilIdle();
+  }
+
+  void TearDownOnMainThread() override { network_handler_test_helper_.reset(); }
+
+  // NetworkingPrivateChromeOSApiTestBase overrides:
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    NetworkingPrivateChromeOSApiTestBase::SetUpCommandLine(command_line);
+
+    // TODO(pneubeck): Remove the following hack, once the NetworkingPrivateAPI
+    // uses the ProfileHelper to obtain the userhash crbug/238623.
+    cryptohome::AccountIdentifier login_user;
+    login_user.set_account_id(user_manager::CanonicalizeUserID(
+        command_line->GetSwitchValueNative(ash::switches::kLoginUser)));
+    const std::string sanitized_user =
+        UserDataAuthClient::GetStubSanitizedUsername(login_user);
+    command_line->AppendSwitchASCII(ash::switches::kLoginProfile,
+                                    sanitized_user);
+  }
+
+  std::string GetSanitizedActiveUsername() override {
+    user_manager::UserManager* user_manager = user_manager::UserManager::Get();
+    user_manager::User* user = user_manager->GetActiveUser();
+    CHECK(user);
+    std::string userhash;
+    ::user_data_auth::GetSanitizedUsernameRequest request;
+    request.set_username(
+        cryptohome::CreateAccountIdentifierFromAccountId(user->GetAccountId())
+            .account_id());
+    ash::CryptohomeMiscClient::Get()->GetSanitizedUsername(
+        request,
+        base::BindOnce(
+            [](std::string* out,
+               absl::optional<::user_data_auth::GetSanitizedUsernameReply>
+                   result) {
+              CHECK(result.has_value());
+              *out = result->sanitized_username();
+            },
+            &userhash));
+    base::RunLoop().RunUntilIdle();
+    CHECK(!userhash.empty());
+    return userhash;
+  }
+
+  void SetupCellular() override {
+    UIDelegateStub::s_show_account_details_called_ = 0;
+    NetworkingPrivateChromeOSApiTestBase::SetupCellular();
+    base::RunLoop().RunUntilIdle();
+  }
+
+  void AddDevice(const std::string& device_path,
+                 const std::string& type,
+                 const std::string& name) override {
+    device_test()->AddDevice(device_path, type, name);
+  }
+
+  void ClearDevices() override { device_test()->ClearDevices(); }
+
+  void SetDeviceProperty(const std::string& device_path,
+                         const std::string& name,
+                         const base::Value& value) override {
+    device_test()->SetDeviceProperty(device_path, name, value,
+                                     /*notify_changed=*/true);
+  }
+
+  void SetSimLocked(const std::string& device_path, bool enabled) override {
+    device_test()->SetSimLocked(device_path, enabled);
+  }
+
+  void AddService(const std::string& service_path,
+                  const std::string& name,
+                  const std::string& type,
+                  const std::string& state) override {
+    service_test()->AddService(service_path, service_path + "_guid", name, type,
+                               state, true /* add_to_visible */);
+  }
+
+  void ClearServices() override { service_test()->ClearServices(); }
+
+  void SetServiceProperty(const std::string& service_path,
+                          const std::string& property,
+                          const base::Value& value) override {
+    service_test()->SetServiceProperty(service_path, property, value);
+  }
+
+  void AddIPConfig(const std::string& ip_config_path,
+                   const base::Value& properties) override {
+    network_handler_test_helper_->ip_config_test()->AddIPConfig(ip_config_path,
+                                                                properties);
+  }
+
+  void AddProfile(const std::string& profile_path,
+                  const std::string& userhash) override {
+    profile_test()->AddProfile(profile_path, userhash);
+  }
+
+  void AddServiceToProfile(const std::string& profile_path,
+                           const std::string& service_path) override {
+    profile_test()->AddService(profile_path, service_path);
+  }
+
+  std::string GetSharedProfilePath() override {
+    return ShillProfileClient::GetSharedProfilePath();
+  }
+
  protected:
   std::unique_ptr<chromeos::NetworkHandlerTestHelper>
       network_handler_test_helper_;
   testing::NiceMock<policy::MockConfigurationPolicyProvider> provider_;
   sync_preferences::TestingPrefServiceSyncable user_prefs_;
   TestingPrefServiceSimple local_state_;
-  std::string userhash_;
 };
+#else
+class NetworkingPrivateChromeOSApiTestLacros
+    : public NetworkingPrivateChromeOSApiTestBase {
+ public:
+  NetworkingPrivateChromeOSApiTestLacros() {}
+
+  NetworkingPrivateChromeOSApiTestLacros(
+      const NetworkingPrivateChromeOSApiTestLacros&) = delete;
+  NetworkingPrivateChromeOSApiTestLacros& operator=(
+      const NetworkingPrivateChromeOSApiTestLacros&) = delete;
+
+  bool SetUpAsh() {
+    auto* service = chromeos::LacrosService::Get();
+    if (!service->IsAvailable<crosapi::mojom::TestController>() ||
+        service->GetInterfaceVersion(crosapi::mojom::TestController::Uuid_) <
+            static_cast<int>(crosapi::mojom::TestController::MethodMinVersions::
+                                 kBindShillClientTestInterfaceMinVersion)) {
+      LOG(ERROR) << "Unsupported ash version.";
+      return false;
+    }
+    crosapi::mojom::TestControllerAsyncWaiter test_controller_waiter{
+        service->GetRemote<crosapi::mojom::TestController>().get()};
+
+    test_controller_waiter.BindShillClientTestInterface(
+        shill_test_.BindNewPipeAndPassReceiver());
+
+    ConfigFakeNetwork();
+
+    return true;
+  }
+
+  // NetworkingPrivateChromeOSApiTestBase overrides
+
+  std::string GetSanitizedActiveUsername() override {
+    auto* service = chromeos::LacrosService::Get();
+    if (!service->IsAvailable<crosapi::mojom::TestController>() ||
+        service->GetInterfaceVersion(crosapi::mojom::TestController::Uuid_) <
+            static_cast<int>(crosapi::mojom::TestController::MethodMinVersions::
+                                 kGetSanitizedActiveUsernameMinVersion)) {
+      LOG(ERROR) << "Unsupported ash version.";
+      return "";
+    }
+
+    crosapi::mojom::TestControllerAsyncWaiter test_controller_waiter{
+        service->GetRemote<crosapi::mojom::TestController>().get()};
+
+    std::string userhash;
+    test_controller_waiter.GetSanitizedActiveUsername(&userhash);
+    return userhash;
+  }
+
+  void AddDevice(const std::string& device_path,
+                 const std::string& type,
+                 const std::string& name) override {
+    ShillClientTestInterfaceAsyncWaiter(shill_test_.get())
+        .AddDevice(device_path, type, name);
+  }
+
+  void SetDeviceProperty(const std::string& device_path,
+                         const std::string& name,
+                         const base::Value& value) override {
+    ShillClientTestInterfaceAsyncWaiter(shill_test_.get())
+        .SetDeviceProperty(device_path, name, value.Clone(),
+                           /*notify_changed=*/true);
+  }
+
+  void SetSimLocked(const std::string& device_path, bool enabled) override {
+    ShillClientTestInterfaceAsyncWaiter(shill_test_.get())
+        .SetSimLocked(device_path, enabled);
+  }
+
+  void ClearDevices() override {
+    ShillClientTestInterfaceAsyncWaiter(shill_test_.get()).ClearDevices();
+  }
+
+  void AddService(const std::string& service_path,
+                  const std::string& name,
+                  const std::string& type,
+                  const std::string& state) override {
+    ShillClientTestInterfaceAsyncWaiter(shill_test_.get())
+        .AddService(service_path, service_path + "_guid", name, type, state,
+                    true /* add_to_visible */);
+  }
+
+  void ClearServices() override {
+    ShillClientTestInterfaceAsyncWaiter(shill_test_.get()).ClearServices();
+  }
+
+  void SetServiceProperty(const std::string& service_path,
+                          const std::string& property,
+                          const base::Value& value) override {
+    ShillClientTestInterfaceAsyncWaiter(shill_test_.get())
+        .SetServiceProperty(service_path, property, value.Clone());
+  }
+
+  void AddIPConfig(const std::string& ip_config_path,
+                   const base::Value& properties) override {
+    ShillClientTestInterfaceAsyncWaiter(shill_test_.get())
+        .AddIPConfig(ip_config_path, properties.Clone());
+  }
+
+  void AddProfile(const std::string& profile_path,
+                  const std::string& userhash) override {
+    ShillClientTestInterfaceAsyncWaiter(shill_test_.get())
+        .AddProfile(profile_path, userhash);
+  }
+
+  void AddServiceToProfile(const std::string& profile_path,
+                           const std::string& service_path) override {
+    ShillClientTestInterfaceAsyncWaiter(shill_test_.get())
+        .AddServiceToProfile(profile_path, service_path);
+  }
+
+  std::string GetSharedProfilePath() override {
+    // TODO(crbug.com/): get this information from Ash
+    const char kSharedProfilePath[] = "/profile/default";
+    return kSharedProfilePath;
+  }
+
+ protected:
+  mojo::Remote<crosapi::mojom::ShillClientTestInterface> shill_test_;
+};
+#endif
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+using NetworkingPrivateChromeOSApiTest = NetworkingPrivateChromeOSApiTestLacros;
+#else
+using NetworkingPrivateChromeOSApiTest = NetworkingPrivateChromeOSApiTestAsh;
+#endif
 
 // Place each subtest into a separate browser test so that the stub networking
 // library state is reset for each subtest run. This way they won't affect each
 // other.
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, StartConnect) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   EXPECT_TRUE(RunNetworkingSubtest("startConnect")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, StartDisconnect) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   EXPECT_TRUE(RunNetworkingSubtest("startDisconnect")) << message_;
 }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, StartActivate) {
   SetupCellular();
   EXPECT_TRUE(RunNetworkingSubtest("startActivate")) << message_;
   EXPECT_EQ(1, UIDelegateStub::s_show_account_details_called_);
 }
+#endif
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        StartConnectNonexistent) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   EXPECT_TRUE(RunNetworkingSubtest("startConnectNonexistent")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        StartDisconnectNonexistent) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   EXPECT_TRUE(RunNetworkingSubtest("startDisconnectNonexistent")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        StartGetPropertiesNonexistent) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   EXPECT_TRUE(RunNetworkingSubtest("startGetPropertiesNonexistent"))
       << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetNetworks) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   // Hide stub_wifi2.
-  service_test()->SetServiceProperty(kWifi2ServicePath, shill::kVisibleProperty,
-                                     base::Value(false));
+  SetServiceProperty(kWifi2ServicePath, shill::kVisibleProperty,
+                     base::Value(false));
   // Add a couple of additional networks that are not configured (saved).
   AddService("stub_wifi3", "wifi3", shill::kTypeWifi, shill::kStateIdle);
   AddService("stub_wifi4", "wifi4", shill::kTypeWifi, shill::kStateIdle);
   content::RunAllPendingInMessageLoop();
+
   EXPECT_TRUE(RunNetworkingSubtest("getNetworks")) << message_;
 }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetVisibleNetworks) {
   EXPECT_TRUE(RunNetworkingSubtest("getVisibleNetworks")) << message_;
 }
+#endif
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        GetVisibleNetworksWifi) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   EXPECT_TRUE(RunNetworkingSubtest("getVisibleNetworksWifi")) << message_;
 }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, EnabledNetworkTypes) {
   EXPECT_TRUE(RunNetworkingSubtest("enabledNetworkTypesDisable")) << message_;
   EXPECT_TRUE(RunNetworkingSubtest("enabledNetworkTypesEnable")) << message_;
@@ -488,13 +742,24 @@
   manager_test()->SetTechnologyInitializing("cellular", true);
   EXPECT_TRUE(RunNetworkingSubtest("getDeviceStates")) << message_;
 }
+#endif
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, RequestNetworkScan) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   EXPECT_TRUE(RunNetworkingSubtest("requestNetworkScan")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        RequestNetworkScanCellular) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   SetupCellular();
   EXPECT_TRUE(RunNetworkingSubtest("requestNetworkScanCellular")) << message_;
 }
@@ -502,23 +767,41 @@
 // Properties are filtered and translated through
 // ShillToONCTranslator::TranslateWiFiWithState
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetProperties) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   EXPECT_TRUE(RunNetworkingSubtest("getProperties")) << message_;
 }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        GetCellularProperties) {
   SetupCellular();
   EXPECT_TRUE(RunNetworkingSubtest("getPropertiesCellular")) << message_;
 }
+#endif
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetState) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   EXPECT_TRUE(RunNetworkingSubtest("getState")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetStateNonExistent) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   EXPECT_TRUE(RunNetworkingSubtest("getStateNonExistent")) << message_;
 }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        SetCellularProperties) {
   SetupCellular();
@@ -567,11 +850,18 @@
 
   EXPECT_TRUE(RunNetworkingSubtest("createNetworkForPolicyControlledNetwork"));
 }
+#endif
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, ForgetNetwork) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   EXPECT_TRUE(RunNetworkingSubtest("forgetNetwork")) << message_;
 }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        ForgetPolicyControlledNetwork) {
   constexpr char kUserPolicyBlob[] =
@@ -657,36 +947,63 @@
       kWifi1ServicePath, "TestErrorState");
   EXPECT_TRUE(RunNetworkingSubtest("getErrorState")) << message_;
 }
+#endif
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        OnNetworksChangedEventConnect) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   EXPECT_TRUE(RunNetworkingSubtest("onNetworksChangedEventConnect"))
       << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        OnNetworksChangedEventDisconnect) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   EXPECT_TRUE(RunNetworkingSubtest("onNetworksChangedEventDisconnect"))
       << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        OnNetworkListChangedEvent) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   EXPECT_TRUE(RunNetworkingSubtest("onNetworkListChangedEvent")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        OnDeviceStateListChangedEvent) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   EXPECT_TRUE(RunNetworkingSubtest("onDeviceStateListChangedEvent"))
       << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        OnDeviceScanningChangedEvent) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   SetupCellular();
   EXPECT_TRUE(RunNetworkingSubtest("onDeviceScanningChangedEvent")) << message_;
 }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        OnCertificateListsChangedEvent) {
   ExtensionTestMessageListener listener("eventListenerReady");
@@ -703,10 +1020,10 @@
                        GetCaptivePortalStatus) {
   // Ethernet defaults to online. Set wifi1 to idle -> 'Offline', and wifi2 to
   // redirect-found -> 'Portal'.
-  service_test()->SetServiceProperty(kWifi1ServicePath, shill::kStateProperty,
-                                     base::Value(shill::kStateIdle));
-  service_test()->SetServiceProperty(kWifi2ServicePath, shill::kStateProperty,
-                                     base::Value(shill::kStateRedirectFound));
+  SetServiceProperty(kWifi1ServicePath, shill::kStateProperty,
+                     base::Value(shill::kStateIdle));
+  SetServiceProperty(kWifi2ServicePath, shill::kStateProperty,
+                     base::Value(shill::kStateRedirectFound));
   base::RunLoop().RunUntilIdle();
 
   EXPECT_TRUE(RunNetworkingSubtest("getCaptivePortalStatus")) << message_;
@@ -722,28 +1039,43 @@
   ExtensionTestMessageListener listener("notifyPortalDetectorObservers");
   listener.SetOnSatisfied(
       base::BindLambdaForTesting([&](const std::string& message) {
-        service_test()->SetServiceProperty(
-            kWifi1ServicePath, shill::kStateProperty,
-            base::Value(shill::kStateRedirectFound));
+        SetServiceProperty(kWifi1ServicePath, shill::kStateProperty,
+                           base::Value(shill::kStateRedirectFound));
       }));
 
   EXPECT_TRUE(RunNetworkingSubtest("captivePortalNotification")) << message_;
 }
+#endif
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, UnlockCellularSim) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   SetupCellular();
   // Lock the SIM
-  device_test()->SetSimLocked(kCellularDevicePath, true);
+  SetSimLocked(kCellularDevicePath, true);
   EXPECT_TRUE(RunNetworkingSubtest("unlockCellularSim")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, SetCellularSimState) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   SetupCellular();
   EXPECT_TRUE(RunNetworkingSubtest("setCellularSimState")) << message_;
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest,
                        SelectCellularMobileNetwork) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   SetupCellular();
   // Create fake list of found networks.
   std::unique_ptr<base::ListValue> found_networks =
@@ -765,12 +1097,18 @@
 }
 
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, CellularSimPuk) {
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  if (!SetUpAsh()) {
+    GTEST_SKIP() << "Unsupported ash version.";
+  }
+#endif
   SetupCellular();
   // Lock the SIM
-  device_test()->SetSimLocked(kCellularDevicePath, true);
+  SetSimLocked(kCellularDevicePath, true);
   EXPECT_TRUE(RunNetworkingSubtest("cellularSimPuk")) << message_;
 }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
 IN_PROC_BROWSER_TEST_F(NetworkingPrivateChromeOSApiTest, GetGlobalPolicy) {
   base::DictionaryValue global_config;
   global_config.SetKey(
@@ -831,5 +1169,6 @@
                                {.launch_as_platform_app = true}))
       << message_;
 }
+#endif
 
 }  // namespace
diff --git a/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc b/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc
index f470fa7..77762d4 100644
--- a/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc
+++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate.cc
@@ -71,6 +71,7 @@
 using password_manager::LeakCheckCredential;
 using password_manager::PasswordChangeSuccessTracker;
 using password_manager::PasswordForm;
+using password_manager::PasswordScriptsFetcher;
 using password_manager::metrics_util::PasswordCheckScriptsCacheState;
 using ui::TimeFormat;
 
@@ -397,6 +398,15 @@
   }
 }
 
+void PasswordCheckDelegate::RefreshScriptsIfNecessary(
+    RefreshScriptsIfNecessaryCallback callback) {
+  if (PasswordScriptsFetcher* fetcher = GetPasswordScriptsFetcher()) {
+    fetcher->RefreshScriptsIfNecessary(std::move(callback));
+    return;
+  }
+  std::move(callback).Run();
+}
+
 void PasswordCheckDelegate::StartPasswordCheck(
     StartPasswordCheckCallback callback) {
   // If the delegate isn't initialized yet, enqueue the callback and return
@@ -719,8 +729,8 @@
       GetForBrowserContext(profile_);
 }
 
-password_manager::PasswordScriptsFetcher*
-PasswordCheckDelegate::GetPasswordScriptsFetcher() const {
+PasswordScriptsFetcher* PasswordCheckDelegate::GetPasswordScriptsFetcher()
+    const {
   return PasswordScriptsFetcherFactory::GetForBrowserContext(profile_);
 }
 
diff --git a/chrome/browser/extensions/api/passwords_private/password_check_delegate.h b/chrome/browser/extensions/api/passwords_private/password_check_delegate.h
index b0c44f517..649fad5 100644
--- a/chrome/browser/extensions/api/passwords_private/password_check_delegate.h
+++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate.h
@@ -46,6 +46,8 @@
  public:
   using StartPasswordCheckCallback =
       PasswordsPrivateDelegate::StartPasswordCheckCallback;
+  using RefreshScriptsIfNecessaryCallback =
+      PasswordsPrivateDelegate::RefreshScriptsIfNecessaryCallback;
 
   PasswordCheckDelegate(Profile* profile,
                         password_manager::SavedPasswordsPresenter* presenter);
@@ -96,6 +98,10 @@
       const api::passwords_private::InsecureCredential& credential,
       bool is_manual_flow);
 
+  // Refreshes the cache for automatic password change scripts if that is stale
+  // and runs `callback` once that is complete.
+  void RefreshScriptsIfNecessary(RefreshScriptsIfNecessaryCallback callback);
+
   // Checks that all preconditions for running a password check are fulfilled
   // and, once that is the case, launches the password check. Invokes `callback`
   // once a check is running or the request was stopped via
diff --git a/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc b/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
index 81c749c..af9af55 100644
--- a/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
+++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
@@ -119,6 +119,8 @@
 
 using MockStartPasswordCheckCallback =
     base::MockCallback<PasswordCheckDelegate::StartPasswordCheckCallback>;
+using MockRefreshScriptsIfNecessaryCallback = base::MockCallback<
+    PasswordsPrivateDelegate::RefreshScriptsIfNecessaryCallback>;
 
 PasswordsPrivateEventRouter* CreateAndUsePasswordsPrivateEventRouter(
     Profile* profile) {
@@ -974,6 +976,18 @@
                                              /*is_manual_flow=*/false);
 }
 
+TEST_F(PasswordCheckDelegateTest, RefreshScriptsIfNecessary) {
+  base::OnceClosure refresh_callback = base::DoNothing();
+  EXPECT_CALL(password_scripts_fetcher(), RefreshScriptsIfNecessary)
+      .WillOnce(MoveArg<0>(&refresh_callback));
+
+  MockRefreshScriptsIfNecessaryCallback callback;
+  delegate().RefreshScriptsIfNecessary(callback.Get());
+
+  EXPECT_CALL(callback, Run);
+  std::move(refresh_callback).Run();
+}
+
 TEST_F(PasswordCheckDelegateTest,
        RecordChangePasswordFlowStartedForAppWithWebRealm) {
   // Create an insecure credential.
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
index 9cf94fe..cf921c25 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
@@ -22,6 +22,7 @@
 #include "components/sync/driver/sync_service.h"
 #include "content/public/browser/web_contents.h"
 #include "extensions/browser/extension_function_registry.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace extensions {
 
@@ -52,15 +53,17 @@
       api::passwords_private::ChangeSavedPassword::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(parameters);
 
-  if (!GetDelegate(browser_context())
-           ->ChangeSavedPassword(parameters->ids, parameters->params)) {
-    return RespondNow(Error(
-        "Could not change the password. Either the password is empty, the user "
-        "is not authenticated, vector of ids is empty or no matching password "
-        "could be found at least for one of the ids."));
+  auto new_ids = GetDelegate(browser_context())
+                     ->ChangeSavedPassword(parameters->ids, parameters->params);
+  if (new_ids.has_value()) {
+    return RespondNow(ArgumentList(
+        api::passwords_private::ChangeSavedPassword::Results::Create(
+            new_ids.value())));
   }
-
-  return RespondNow(NoArguments());
+  return RespondNow(Error(
+      "Could not change the password. Either the password is empty, the user "
+      "is not authenticated, vector of ids is empty or no matching password "
+      "could be found at least for one of the ids."));
 }
 
 // PasswordsPrivateRemoveSavedPasswordFunction
@@ -405,6 +408,24 @@
   return RespondNow(NoArguments());
 }
 
+// PasswordsPrivateRefreshScriptsIfNecessaryFunction:
+PasswordsPrivateRefreshScriptsIfNecessaryFunction::
+    ~PasswordsPrivateRefreshScriptsIfNecessaryFunction() = default;
+
+ResponseAction PasswordsPrivateRefreshScriptsIfNecessaryFunction::Run() {
+  GetDelegate(browser_context())
+      ->RefreshScriptsIfNecessary(base::BindOnce(
+          &PasswordsPrivateRefreshScriptsIfNecessaryFunction::OnRefreshed,
+          base::RetainedRef(this)));
+
+  // OnRefreshed() might respond before we reach this point.
+  return did_respond() ? AlreadyResponded() : RespondLater();
+}
+
+void PasswordsPrivateRefreshScriptsIfNecessaryFunction::OnRefreshed() {
+  Respond(NoArguments());
+}
+
 // PasswordsPrivateStartPasswordCheckFunction:
 PasswordsPrivateStartPasswordCheckFunction::
     ~PasswordsPrivateStartPasswordCheckFunction() = default;
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_api.h b/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
index 4217839..319ca3e 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
@@ -353,6 +353,22 @@
   ResponseAction Run() override;
 };
 
+class PasswordsPrivateRefreshScriptsIfNecessaryFunction
+    : public ExtensionFunction {
+ public:
+  DECLARE_EXTENSION_FUNCTION("passwordsPrivate.refreshScriptsIfNecessary",
+                             PASSWORDSPRIVATE_REFRESHSCRIPTSIFNECESSARY)
+
+ protected:
+  ~PasswordsPrivateRefreshScriptsIfNecessaryFunction() override;
+
+  // ExtensionFunction overrides.
+  ResponseAction Run() override;
+
+ private:
+  void OnRefreshed();
+};
+
 class PasswordsPrivateStartPasswordCheckFunction : public ExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("passwordsPrivate.startPasswordCheck",
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
index d059774..a87932a 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_apitest.cc
@@ -367,6 +367,10 @@
   EXPECT_EQ(last_change_flow_url(), "");
 }
 
+IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest, RefreshScriptsIfNecessary) {
+  EXPECT_TRUE(RunPasswordsSubtest("refreshScriptsIfNecessary")) << message_;
+}
+
 IN_PROC_BROWSER_TEST_F(PasswordsPrivateApiTest, StartPasswordCheck) {
   set_start_password_check_state(
       password_manager::BulkLeakCheckService::State::kRunning);
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h
index 4ec0917f..be8983a 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h
@@ -34,6 +34,8 @@
   using PlaintextPasswordCallback =
       base::OnceCallback<void(absl::optional<std::u16string>)>;
 
+  using RefreshScriptsIfNecessaryCallback = base::OnceClosure;
+
   using StartPasswordCheckCallback =
       base::OnceCallback<void(password_manager::BulkLeakCheckService::State)>;
 
@@ -86,7 +88,10 @@
   // Changes the username and password corresponding to |ids|.
   // |ids|: The ids for the password entries being updated.
   // |params|: The struct which holds the new username, password and note.
-  virtual bool ChangeSavedPassword(
+  // Returns the ids if the change was successful (can be the same ids if the
+  // username and the password didn't change), nullopt otherwise.
+  virtual absl::optional<api::passwords_private::CredentialIds>
+  ChangeSavedPassword(
       const std::vector<int>& ids,
       const api::passwords_private::ChangeSavedPasswordParams& params) = 0;
 
@@ -198,6 +203,11 @@
       const api::passwords_private::InsecureCredential& credential,
       bool is_manual_flow) = 0;
 
+  // Refreshes the cache for automatic password change scripts if that is stale
+  // and runs `callback` once that is complete.
+  virtual void RefreshScriptsIfNecessary(
+      RefreshScriptsIfNecessaryCallback callback) = 0;
+
   // Requests to start a check for insecure passwords. Invokes |callback|
   // once a check is running or the request was stopped via StopPasswordCheck().
   virtual void StartPasswordCheck(StartPasswordCheckCallback callback) = 0;
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
index fd168dc3..27ebe3d 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -41,6 +41,7 @@
 #include "components/url_formatter/elide_url.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/base/clipboard/scoped_clipboard_writer.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "url/gurl.h"
@@ -235,7 +236,8 @@
   return success;
 }
 
-bool PasswordsPrivateDelegateImpl::ChangeSavedPassword(
+absl::optional<api::passwords_private::CredentialIds>
+PasswordsPrivateDelegateImpl::ChangeSavedPassword(
     const std::vector<int>& ids,
     const api::passwords_private::ChangeSavedPasswordParams& params) {
   DCHECK(!ids.empty());
@@ -245,7 +247,7 @@
   // |saved_passwords_presenter_| will update both of them anyway.
   const CredentialUIEntry* entry = credential_id_generator_.TryGetKey(ids[0]);
   if (!entry)
-    return false;
+    return absl::nullopt;
 
   CredentialUIEntry to_edit = *entry;
   to_edit.username = base::UTF8ToUTF16(params.username);
@@ -254,7 +256,32 @@
     to_edit.note = password_manager::PasswordNote(
         base::UTF8ToUTF16(*params.note), base::Time::Now());
   }
-  return saved_passwords_presenter_.EditSavedCredentials(to_edit);
+  // Collect the credentials that will be edited before executing the edit
+  // process.
+  auto forms_to_edit =
+      saved_passwords_presenter_.GetCorrespondingPasswordForms(entry->key());
+  bool success = saved_passwords_presenter_.EditSavedCredentials(to_edit);
+  if (!success) {
+    return absl::nullopt;
+  }
+
+  api::passwords_private::CredentialIds new_ids;
+  for (auto& form : forms_to_edit) {
+    // Calculate the new IDs using the new username and password.
+    form.username_value = to_edit.username;
+    form.password_value = to_edit.password;
+
+    auto new_id = std::make_unique<int>(
+        credential_id_generator_.GenerateId(CredentialUIEntry(form)));
+
+    if (form.IsUsingProfileStore()) {
+      new_ids.device_id = std::move(new_id);
+    }
+    if (form.IsUsingAccountStore()) {
+      new_ids.account_id = std::move(new_id);
+    }
+  }
+  return new_ids;
 }
 
 void PasswordsPrivateDelegateImpl::RemoveSavedPasswords(
@@ -571,6 +598,11 @@
                                                            is_manual_flow);
 }
 
+void PasswordsPrivateDelegateImpl::RefreshScriptsIfNecessary(
+    RefreshScriptsIfNecessaryCallback callback) {
+  password_check_delegate_.RefreshScriptsIfNecessary(std::move(callback));
+}
+
 void PasswordsPrivateDelegateImpl::StartPasswordCheck(
     StartPasswordCheckCallback callback) {
   password_check_delegate_.StartPasswordCheck(std::move(callback));
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
index 0b1e3be..41c082cc8 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
@@ -63,7 +63,7 @@
                    const std::u16string& note,
                    bool use_account_store,
                    content::WebContents* web_contents) override;
-  bool ChangeSavedPassword(
+  absl::optional<api::passwords_private::CredentialIds> ChangeSavedPassword(
       const std::vector<int>& ids,
       const api::passwords_private::ChangeSavedPasswordParams& params) override;
   void RemoveSavedPasswords(const std::vector<int>& ids) override;
@@ -107,6 +107,8 @@
   void RecordChangePasswordFlowStarted(
       const api::passwords_private::InsecureCredential& credential,
       bool is_manual_flow) override;
+  void RefreshScriptsIfNecessary(
+      RefreshScriptsIfNecessaryCallback callback) override;
   void StartPasswordCheck(StartPasswordCheckCallback callback) override;
   void StopPasswordCheck() override;
   api::passwords_private::PasswordCheckStatus GetPasswordCheckStatus() override;
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
index 92e561b..24e7fcf 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
@@ -54,7 +54,9 @@
 using password_manager::TestPasswordStore;
 using ::testing::_;
 using ::testing::Eq;
+using ::testing::IsNull;
 using ::testing::Ne;
+using ::testing::Pointee;
 using ::testing::Return;
 using ::testing::SizeIs;
 using ::testing::StrictMock;
@@ -464,7 +466,15 @@
   api::passwords_private::ChangeSavedPasswordParams params;
   params.password = "new_pass";
   params.username = "new_user";
-  EXPECT_TRUE(delegate.ChangeSavedPassword({sample_form_id}, params));
+
+  sample_form.username_value = u"new_user";
+  sample_form.password_value = u"new_pass";
+  int new_form_id = delegate.GetIdForCredential(
+      password_manager::CredentialUIEntry(sample_form));
+
+  auto result = delegate.ChangeSavedPassword({sample_form_id}, params);
+  EXPECT_THAT(result->account_id, IsNull());
+  EXPECT_THAT(result->device_id, Pointee(new_form_id));
 
   // Spin the loop to allow PasswordStore tasks posted when changing the
   // password to be completed.
@@ -511,7 +521,15 @@
   params.password = "new_pass";
   params.username = "new_user";
   params.note = std::make_unique<std::string>("new note");
-  EXPECT_TRUE(delegate.ChangeSavedPassword({sample_form_id}, params));
+
+  sample_form.password_value = u"new_pass";
+  sample_form.username_value = u"new_user";
+  int new_form_id = delegate.GetIdForCredential(
+      password_manager::CredentialUIEntry(sample_form));
+
+  auto result = delegate.ChangeSavedPassword({sample_form_id}, params);
+  EXPECT_THAT(result->account_id, IsNull());
+  EXPECT_THAT(result->device_id, Pointee(new_form_id));
 
   // Spin the loop to allow PasswordStore tasks posted when changing the
   // password to be completed.
@@ -526,6 +544,70 @@
   delegate.GetSavedPasswordsList(callback.Get());
 }
 
+TEST_F(PasswordsPrivateDelegateImplTest, ChangeSavedPasswordInBothStores) {
+  password_manager::PasswordForm profile_form = CreateSampleForm();
+  password_manager::PasswordForm account_form = profile_form;
+  account_form.in_store = password_manager::PasswordForm::Store::kAccountStore;
+  SetUpPasswordStores({profile_form, account_form});
+
+  PasswordsPrivateDelegateImpl delegate(&profile_);
+  // Spin the loop to allow PasswordStore tasks posted on the creation of
+  // |delegate| to be completed.
+  base::RunLoop().RunUntilIdle();
+
+  int profile_form_id = delegate.GetIdForCredential(
+      password_manager::CredentialUIEntry(profile_form));
+  int account_form_id = delegate.GetIdForCredential(
+      password_manager::CredentialUIEntry(account_form));
+
+  api::passwords_private::ChangeSavedPasswordParams params;
+  params.password = "new_pass";
+  params.username = "new_user";
+
+  profile_form.username_value = u"new_user";
+  profile_form.password_value = u"new_pass";
+  int new_profile_form_id = delegate.GetIdForCredential(
+      password_manager::CredentialUIEntry(profile_form));
+  account_form.username_value = u"new_user";
+  account_form.password_value = u"new_pass";
+  int new_account_form_id = delegate.GetIdForCredential(
+      password_manager::CredentialUIEntry(account_form));
+
+  auto result =
+      delegate.ChangeSavedPassword({profile_form_id, account_form_id}, params);
+  EXPECT_THAT(result->account_id, Pointee(new_account_form_id));
+  EXPECT_THAT(result->device_id, Pointee(new_profile_form_id));
+}
+
+TEST_F(PasswordsPrivateDelegateImplTest, ChangeSavedPasswordInAccountStore) {
+  password_manager::PasswordForm profile_form = CreateSampleForm();
+  profile_form.password_value = u"different_pass";
+  password_manager::PasswordForm account_form = CreateSampleForm();
+  account_form.in_store = password_manager::PasswordForm::Store::kAccountStore;
+  SetUpPasswordStores({profile_form, account_form});
+
+  PasswordsPrivateDelegateImpl delegate(&profile_);
+  // Spin the loop to allow PasswordStore tasks posted on the creation of
+  // |delegate| to be completed.
+  base::RunLoop().RunUntilIdle();
+
+  int account_form_id = delegate.GetIdForCredential(
+      password_manager::CredentialUIEntry(account_form));
+
+  api::passwords_private::ChangeSavedPasswordParams params;
+  params.password = "new_pass";
+  params.username = "new_user";
+
+  account_form.username_value = u"new_user";
+  account_form.password_value = u"new_pass";
+  int new_account_form_id = delegate.GetIdForCredential(
+      password_manager::CredentialUIEntry(account_form));
+
+  auto result = delegate.ChangeSavedPassword({account_form_id}, params);
+  EXPECT_THAT(result->account_id, Pointee(new_account_form_id));
+  EXPECT_THAT(result->device_id, IsNull());
+}
+
 // Checking callback result of RequestPlaintextPassword with reason Copy.
 // By implementation for Copy, callback will receive empty string.
 TEST_F(PasswordsPrivateDelegateImplTest, TestCopyPasswordCallbackResult) {
diff --git a/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc b/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc
index d67a5fa..095799bf1 100644
--- a/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc
+++ b/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc
@@ -89,15 +89,27 @@
   return !url.empty() && !password.empty();
 }
 
-bool TestPasswordsPrivateDelegate::ChangeSavedPassword(
+absl::optional<api::passwords_private::CredentialIds>
+TestPasswordsPrivateDelegate::ChangeSavedPassword(
     const std::vector<int>& ids,
     const api::passwords_private::ChangeSavedPasswordParams& params) {
+  constexpr int kDeviceIdIndex = 0;
+  constexpr int kAccountIdIndex = 1;
+
   for (int id : ids) {
     if (static_cast<size_t>(id) >= current_entries_.size()) {
-      return false;
+      return absl::nullopt;
     }
   }
-  return !params.password.empty() && !ids.empty();
+
+  if (params.password.empty() || ids.empty())
+    return absl::nullopt;
+
+  api::passwords_private::CredentialIds newIds;
+  newIds.device_id = std::make_unique<int>(ids[kDeviceIdIndex]);
+  newIds.account_id =
+      ids.size() == 2 ? std::make_unique<int>(ids[kAccountIdIndex]) : nullptr;
+  return newIds;
 }
 
 void TestPasswordsPrivateDelegate::RemoveSavedPasswords(
@@ -298,6 +310,11 @@
       credential.change_password_url ? *credential.change_password_url : "";
 }
 
+void TestPasswordsPrivateDelegate::RefreshScriptsIfNecessary(
+    RefreshScriptsIfNecessaryCallback callback) {
+  std::move(callback).Run();
+}
+
 void TestPasswordsPrivateDelegate::StartPasswordCheck(
     StartPasswordCheckCallback callback) {
   start_password_check_triggered_ = true;
diff --git a/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h b/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h
index 93bf92d..6428380d 100644
--- a/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h
+++ b/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h
@@ -24,14 +24,15 @@
   // PasswordsPrivateDelegate implementation.
   void GetSavedPasswordsList(UiEntriesCallback callback) override;
   void GetPasswordExceptionsList(ExceptionEntriesCallback callback) override;
-  // Fake implementation of GetUrlCollection. This returns value if |url| is
+  // Fake implementation of `GetUrlCollection`. This returns a value if `url` is
   // not empty.
   absl::optional<api::passwords_private::UrlCollection> GetUrlCollection(
       const std::string& url) override;
-  // Fake implementation. This returns value set by SetIsAccountStoreDefault.
+  // Fake implementation. This returns the value set by
+  // `SetIsAccountStoreDefault`.
   bool IsAccountStoreDefault(content::WebContents* web_contents) override;
-  // Fake implementation of AddPassword. This returns true if |url| and
-  // |password| aren't empty.
+  // Fake implementation of AddPassword. This returns true if `url` and
+  // `password` aren't empty.
   bool AddPassword(const std::string& url,
                    const std::u16string& username,
                    const std::u16string& password,
@@ -41,7 +42,7 @@
   // Fake implementation of ChangeSavedPassword. This succeeds if the current
   // list of entries has each of the ids, vector of ids isn't empty and if the
   // new password isn't empty.
-  bool ChangeSavedPassword(
+  absl::optional<api::passwords_private::CredentialIds> ChangeSavedPassword(
       const std::vector<int>& ids,
       const api::passwords_private::ChangeSavedPasswordParams& params) override;
   void RemoveSavedPasswords(const std::vector<int>& id) override;
@@ -72,28 +73,32 @@
       api::passwords_private::PlaintextReason reason,
       content::WebContents* web_contents,
       PlaintextInsecurePasswordCallback callback) override;
-  // Fake implementation of ChangeInsecureCredential. This succeeds if the
+  // Fake implementation of `ChangeInsecureCredential`. This succeeds if the
   // delegate knows of a insecure credential with the same id.
   bool ChangeInsecureCredential(
       const api::passwords_private::InsecureCredential& credential,
       base::StringPiece new_password) override;
-  // Fake implementation of RemoveInsecureCredential. This succeeds if the
+  // Fake implementation of `RemoveInsecureCredential`. This succeeds if the
   // delegate knows of a insecure credential with the same id.
   bool RemoveInsecureCredential(
       const api::passwords_private::InsecureCredential& credential) override;
-  // Fake implementation of MuteInsecureCredential. This succeeds if the
+  // Fake implementation of `MuteInsecureCredential`. This succeeds if the
   // delegate knows of a insecure credential with the same id.
   bool MuteInsecureCredential(
       const api::passwords_private::InsecureCredential& credential) override;
-  // Fake implementation of UnmuteInsecureCredential. This succeeds if the
+  // Fake implementation of `UnmuteInsecureCredential`. This succeeds if the
   // delegate knows of a insecure credential with the same id.
   bool UnmuteInsecureCredential(
       const api::passwords_private::InsecureCredential& credential) override;
-  // Fake implementation of RecordChangePasswordFlowStarted. Sets the url
-  // returned by |last_change_flow_url()|.
+  // Fake implementation of `RecordChangePasswordFlowStarted`. Sets the url
+  // returned by `last_change_flow_url()`.
   void RecordChangePasswordFlowStarted(
       const api::passwords_private::InsecureCredential& credential,
       bool is_manual_flow) override;
+  // Fake implementation of `RefreshScriptsIfNecessary` that directly calls
+  // `callback`.
+  void RefreshScriptsIfNecessary(
+      RefreshScriptsIfNecessaryCallback callback) override;
   void StartPasswordCheck(StartPasswordCheckCallback callback) override;
   void StopPasswordCheck() override;
   api::passwords_private::PasswordCheckStatus GetPasswordCheckStatus() override;
diff --git a/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.cc b/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.cc
index f8e99cb..444eb575 100644
--- a/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.cc
+++ b/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.cc
@@ -92,52 +92,52 @@
 }
 
 base::Value ToValue(const device::PublicKeyCredentialRpEntity& relying_party) {
-  base::Value value(base::Value::Type::DICTIONARY);
-  value.SetStringKey("id", relying_party.id);
+  base::Value::Dict value;
+  value.Set("id", relying_party.id);
   // `PublicKeyCredentialEntity.name` is required in the IDL but optional on the
   // mojo struct.
-  value.SetKey("name", base::Value(relying_party.name.value_or("")));
-  return value;
+  value.Set("name", relying_party.name.value_or(""));
+  return base::Value(std::move(value));
 }
 
 base::Value ToValue(const device::PublicKeyCredentialUserEntity& user) {
-  base::Value value(base::Value::Type::DICTIONARY);
-  value.SetStringKey("id", Base64UrlEncode(user.id));
+  base::Value::Dict value;
+  value.Set("id", Base64UrlEncode(user.id));
   // `PublicKeyCredentialEntity.name` is required in the IDL but optional on the
   // mojo struct.
-  value.SetKey("name", base::Value(user.name.value_or("")));
+  value.Set("name", user.name.value_or(""));
   if (user.display_name) {
-    value.SetKey("displayName", base::Value(*user.display_name));
+    value.Set("displayName", *user.display_name);
   }
-  return value;
+  return base::Value(std::move(value));
 }
 
 base::Value ToValue(
     const device::PublicKeyCredentialParams::CredentialInfo& params) {
-  base::Value value(base::Value::Type::DICTIONARY);
+  base::Value::Dict value;
   switch (params.type) {
     case device::CredentialType::kPublicKey:
-      value.SetKey("type", base::Value(device::kPublicKey));
+      value.Set("type", device::kPublicKey);
   }
-  value.SetIntKey("alg", params.algorithm);
-  return value;
+  value.Set("alg", params.algorithm);
+  return base::Value(std::move(value));
 }
 
 base::Value ToValue(const device::PublicKeyCredentialDescriptor& descriptor) {
-  base::Value value(base::Value::Type::DICTIONARY);
+  base::Value::Dict value;
   switch (descriptor.credential_type) {
     case device::CredentialType::kPublicKey:
-      value.SetKey("type", base::Value(device::kPublicKey));
+      value.Set("type", device::kPublicKey);
   }
-  value.SetStringKey("id", Base64UrlEncode(descriptor.id));
-  std::vector<base::Value> transports;
+  value.Set("id", Base64UrlEncode(descriptor.id));
+  base::Value::List transports;
   for (const device::FidoTransportProtocol& transport : descriptor.transports) {
-    transports.emplace_back(base::Value(ToString(transport)));
+    transports.Append(ToString(transport));
   }
   if (!transports.empty()) {
-    value.SetKey("transports", base::Value(std::move(transports)));
+    value.Set("transports", std::move(transports));
   }
-  return value;
+  return base::Value(std::move(value));
 }
 
 base::Value ToValue(
@@ -180,17 +180,17 @@
 
 base::Value ToValue(
     const device::AuthenticatorSelectionCriteria& authenticator_selection) {
-  base::Value value(base::Value::Type::DICTIONARY);
+  base::Value::Dict value;
   absl::optional<std::string> attachment;
   if (authenticator_selection.authenticator_attachment !=
       device::AuthenticatorAttachment::kAny) {
-    value.SetKey("authenticatorAttachment",
-                 ToValue(authenticator_selection.authenticator_attachment));
+    value.Set("authenticatorAttachment",
+              ToValue(authenticator_selection.authenticator_attachment));
   }
-  value.SetKey("residentKey", ToValue(authenticator_selection.resident_key));
-  value.SetKey("userVerification",
-               ToValue(authenticator_selection.user_verification_requirement));
-  return value;
+  value.Set("residentKey", ToValue(authenticator_selection.resident_key));
+  value.Set("userVerification",
+            ToValue(authenticator_selection.user_verification_requirement));
+  return base::Value(std::move(value));
 }
 
 base::Value ToValue(const device::AttestationConveyancePreference&
@@ -211,12 +211,11 @@
 
 base::Value ToValue(const blink::mojom::RemoteDesktopClientOverride&
                         remote_desktop_client_override) {
-  base::Value value(base::Value::Type::DICTIONARY);
-  value.SetStringKey("origin",
-                     remote_desktop_client_override.origin.Serialize());
-  value.SetBoolKey("sameOriginWithAncestors",
-                   remote_desktop_client_override.same_origin_with_ancestors);
-  return value;
+  base::Value::Dict value;
+  value.Set("origin", remote_desktop_client_override.origin.Serialize());
+  value.Set("sameOriginWithAncestors",
+            remote_desktop_client_override.same_origin_with_ancestors);
+  return base::Value(std::move(value));
 }
 
 base::Value ToValue(const blink::mojom::ProtectionPolicy policy) {
@@ -246,35 +245,30 @@
 }
 
 base::Value ToValue(const device::CableDiscoveryData& cable_authentication) {
-  base::Value value(base::Value::Type::DICTIONARY);
+  base::Value::Dict value;
   switch (cable_authentication.version) {
     case device::CableDiscoveryData::Version::INVALID:
       NOTREACHED();
       break;
     case device::CableDiscoveryData::Version::V1:
-      value.SetKey("version", base::Value(1));
-      value.SetKey(
-          "clientEid",
-          base::Value(Base64UrlEncode(cable_authentication.v1->client_eid)));
-      value.SetKey("authenticatorEid",
-                   base::Value(Base64UrlEncode(
-                       cable_authentication.v1->authenticator_eid)));
-      value.SetKey("sessionPreKey",
-                   base::Value(Base64UrlEncode(
-                       cable_authentication.v1->session_pre_key)));
+      value.Set("version", 1);
+      value.Set("clientEid",
+                Base64UrlEncode(cable_authentication.v1->client_eid));
+      value.Set("authenticatorEid",
+                Base64UrlEncode(cable_authentication.v1->authenticator_eid));
+      value.Set("sessionPreKey",
+                Base64UrlEncode(cable_authentication.v1->session_pre_key));
       break;
     case device::CableDiscoveryData::Version::V2:
-      value.SetKey("version", base::Value(2));
-      value.SetKey(
-          "clientEid",
-          base::Value(Base64UrlEncode(cable_authentication.v2->experiments)));
-      value.SetKey("authenticatorEid", base::Value(""));
-      value.SetKey("sessionPreKey",
-                   base::Value(Base64UrlEncode(
-                       cable_authentication.v2->server_link_data)));
+      value.Set("version", 2);
+      value.Set("clientEid",
+                Base64UrlEncode(cable_authentication.v2->experiments));
+      value.Set("authenticatorEid", "");
+      value.Set("sessionPreKey",
+                Base64UrlEncode(cable_authentication.v2->server_link_data));
       break;
   }
-  return value;
+  return base::Value(std::move(value));
 }
 
 absl::optional<device::FidoTransportProtocol> FidoTransportProtocolFromValue(
@@ -308,32 +302,30 @@
 
 base::Value ToValue(
     const blink::mojom::PublicKeyCredentialCreationOptionsPtr& options) {
-  base::Value value(base::Value::Type::DICTIONARY);
-  value.SetKey("rp", ToValue(options->relying_party));
-  value.SetKey("user", ToValue(options->user));
-  value.SetStringKey("challenge", Base64UrlEncode(options->challenge));
-  std::vector<base::Value> public_key_parameters;
+  base::Value::Dict value;
+  value.Set("rp", ToValue(options->relying_party));
+  value.Set("user", ToValue(options->user));
+  value.Set("challenge", Base64UrlEncode(options->challenge));
+  base::Value::List public_key_parameters;
   for (const device::PublicKeyCredentialParams::CredentialInfo& params :
        options->public_key_parameters) {
-    public_key_parameters.push_back(ToValue(params));
+    public_key_parameters.Append(ToValue(params));
   }
-  value.SetKey("pubKeyCredParams",
-               base::Value(std::move(public_key_parameters)));
-  std::vector<base::Value> exclude_credentials;
+  value.Set("pubKeyCredParams", std::move(public_key_parameters));
+  base::Value::List exclude_credentials;
   for (const device::PublicKeyCredentialDescriptor& descriptor :
        options->exclude_credentials) {
-    exclude_credentials.push_back(ToValue(descriptor));
+    exclude_credentials.Append(ToValue(descriptor));
   }
-  value.SetKey("excludeCredentials",
-               base::Value(std::move(exclude_credentials)));
+  value.Set("excludeCredentials", std::move(exclude_credentials));
   if (options->authenticator_selection) {
-    value.SetKey("authenticatorSelection",
-                 ToValue(*options->authenticator_selection));
+    value.Set("authenticatorSelection",
+              ToValue(*options->authenticator_selection));
   }
-  value.SetKey("attestation", ToValue(options->attestation));
+  value.Set("attestation", ToValue(options->attestation));
 
   base::Value::Dict& extensions =
-      value.GetDict().Set("extensions", base::Value::Dict())->GetDict();
+      value.Set("extensions", base::Value::Dict())->GetDict();
 
   if (options->hmac_create_secret) {
     extensions.Set("hmacCreateSecret", true);
@@ -344,21 +336,20 @@
     extensions.Set("credentialProtectionPolicy",
                    ToValue(options->protection_policy));
     extensions.Set("enforceCredentialProtectionPolicy",
-                   base::Value(options->enforce_protection_policy));
+                   options->enforce_protection_policy);
   }
 
   if (options->appid_exclude) {
-    extensions.Set("appIdExclude", base::Value(*options->appid_exclude));
+    extensions.Set("appIdExclude", *options->appid_exclude);
   }
 
   if (options->cred_props) {
-    extensions.Set("credProps", base::Value(true));
+    extensions.Set("credProps", true);
   }
 
   if (options->large_blob_enable != device::LargeBlobSupport::kNotRequested) {
-    base::Value large_blob_value(base::Value::Type::DICTIONARY);
-    large_blob_value.GetDict().Set("support",
-                                   ToValue(options->large_blob_enable));
+    base::Value::Dict large_blob_value;
+    large_blob_value.Set("support", ToValue(options->large_blob_enable));
     extensions.Set("largeBlob", std::move(large_blob_value));
   }
 
@@ -369,11 +360,11 @@
   }
 
   if (options->google_legacy_app_id_support) {
-    extensions.Set("googleLegacyAppidSupport", base::Value(true));
+    extensions.Set("googleLegacyAppidSupport", true);
   }
 
   if (options->min_pin_length_requested) {
-    extensions.Set("minPinLength", base::Value(true));
+    extensions.Set("minPinLength", true);
   }
 
   if (options->remote_desktop_client_override) {
@@ -383,39 +374,38 @@
 
   DCHECK(!options->prf_enable);
 
-  return value;
+  return base::Value(std::move(value));
 }
 
 base::Value ToValue(
     const blink::mojom::PublicKeyCredentialRequestOptionsPtr& options) {
-  base::Value value(base::Value::Type::DICTIONARY);
-  value.SetStringKey("challenge", Base64UrlEncode(options->challenge));
-  value.SetStringKey("rpId", options->relying_party_id);
+  base::Value::Dict value;
+  value.Set("challenge", Base64UrlEncode(options->challenge));
+  value.Set("rpId", options->relying_party_id);
 
-  std::vector<base::Value> allow_credentials;
+  base::Value::List allow_credentials;
   for (const device::PublicKeyCredentialDescriptor& descriptor :
        options->allow_credentials) {
-    allow_credentials.push_back(ToValue(descriptor));
+    allow_credentials.Append(ToValue(descriptor));
   }
-  value.SetKey("allowCredentials", base::Value(std::move(allow_credentials)));
+  value.Set("allowCredentials", std::move(allow_credentials));
 
-  value.SetKey("userVerification", ToValue(options->user_verification));
+  value.Set("userVerification", ToValue(options->user_verification));
 
   base::Value::Dict& extensions =
-      value.GetDict().Set("extensions", base::Value::Dict())->GetDict();
+      value.Set("extensions", base::Value::Dict())->GetDict();
 
   if (options->appid) {
-    extensions.Set("appid", base::Value(*options->appid));
+    extensions.Set("appid", *options->appid);
   }
 
-  std::vector<base::Value> cable_authentication_data;
+  base::Value::List cable_authentication_data;
   for (const device::CableDiscoveryData& cable :
        options->cable_authentication_data) {
-    cable_authentication_data.push_back(ToValue(cable));
+    cable_authentication_data.Append(ToValue(cable));
   }
   if (!cable_authentication_data.empty()) {
-    extensions.Set("cableAuthentication",
-                   base::Value(std::move(cable_authentication_data)));
+    extensions.Set("cableAuthentication", std::move(cable_authentication_data));
   }
 
   if (options->get_cred_blob) {
@@ -423,13 +413,13 @@
   }
 
   if (options->large_blob_read || options->large_blob_write) {
-    base::Value large_blob_value(base::Value::Type::DICTIONARY);
+    base::Value::Dict large_blob_value;
     if (options->large_blob_read) {
-      large_blob_value.GetDict().Set({"read"}, base::Value(true));
+      large_blob_value.Set("read", true);
     }
     if (options->large_blob_write) {
-      large_blob_value.GetDict().Set(
-          {"write"}, base::Value(Base64UrlEncode(*options->large_blob_write)));
+      large_blob_value.Set("write",
+                           Base64UrlEncode(*options->large_blob_write));
     }
     extensions.Set("largeBlob", std::move(large_blob_value));
   }
@@ -441,7 +431,7 @@
 
   DCHECK(!options->prf);
 
-  return value;
+  return base::Value(std::move(value));
 }
 
 std::pair<blink::mojom::MakeCredentialAuthenticatorResponsePtr, std::string>
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc
index 5d314d2..e2af634 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.cc
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc
@@ -76,6 +76,7 @@
 #include "extensions/browser/url_request_util.h"
 #include "extensions/common/extension_urls.h"
 #include "extensions/common/features/feature_channel.h"
+#include "extensions/common/permissions/permission_set.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -713,4 +714,39 @@
       Profile::FromBrowserContext(browser_context), extension);
 }
 
+std::unique_ptr<const PermissionSet>
+ChromeExtensionsBrowserClient::AddAdditionalAllowedHosts(
+    const PermissionSet& desired_permissions,
+    const PermissionSet& granted_permissions) const {
+  auto get_new_host_patterns = [](const URLPatternSet& desired_patterns,
+                                  const URLPatternSet& granted_patterns) {
+    URLPatternSet new_patterns = granted_patterns.Clone();
+    for (const URLPattern& pattern : desired_patterns) {
+      // The chrome://favicon permission is special. It is requested by
+      // extensions to access stored favicons, but is not a traditional
+      // host permission. Since it cannot be reasonably runtime-granted
+      // while the user is on the site (i.e., the user never visits
+      // chrome://favicon/), we auto-grant it and treat it like an API
+      // permission.
+      bool is_chrome_favicon = pattern.scheme() == content::kChromeUIScheme &&
+                               pattern.host() == chrome::kChromeUIFaviconHost;
+      if (is_chrome_favicon)
+        new_patterns.AddPattern(pattern);
+    }
+    return new_patterns;
+  };
+
+  URLPatternSet new_explicit_hosts =
+      get_new_host_patterns(desired_permissions.explicit_hosts(),
+                            granted_permissions.explicit_hosts());
+  URLPatternSet new_scriptable_hosts =
+      get_new_host_patterns(desired_permissions.scriptable_hosts(),
+                            granted_permissions.scriptable_hosts());
+
+  return std::make_unique<PermissionSet>(
+      granted_permissions.apis().Clone(),
+      granted_permissions.manifest_permissions().Clone(),
+      std::move(new_explicit_hosts), std::move(new_scriptable_hosts));
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.h b/chrome/browser/extensions/chrome_extensions_browser_client.h
index e774232..88df9d8 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.h
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.h
@@ -193,6 +193,9 @@
   std::vector<content::BrowserContext*> GetRelatedContextsForExtension(
       content::BrowserContext* browser_context,
       const Extension& extension) const override;
+  std::unique_ptr<const PermissionSet> AddAdditionalAllowedHosts(
+      const PermissionSet& desired_permissions,
+      const PermissionSet& granted_permissions) const override;
 
  private:
   friend struct base::LazyInstanceTraitsBase<ChromeExtensionsBrowserClient>;
diff --git a/chrome/browser/extensions/permissions_manager_unittest.cc b/chrome/browser/extensions/permissions_manager_unittest.cc
new file mode 100644
index 0000000..648807b
--- /dev/null
+++ b/chrome/browser/extensions/permissions_manager_unittest.cc
@@ -0,0 +1,65 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "extensions/browser/permissions_manager.h"
+
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_service_test_with_install.h"
+#include "chrome/browser/extensions/scripting_permissions_modifier.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/extension_id.h"
+#include "extensions/common/extension_set.h"
+#include "extensions/common/permissions/permissions_data.h"
+#include "extensions/common/url_pattern.h"
+#include "extensions/test/test_extension_dir.h"
+
+namespace extensions {
+
+using PermissionsManagerUnitTest = ExtensionServiceTestWithInstall;
+
+TEST_F(PermissionsManagerUnitTest, FaviconPermissionsAreNotWithheld) {
+  constexpr char kManifest[] =
+      R"({
+           "name": "<all urls> extension",
+           "manifest_version": 2,
+           "version": "0.1",
+           "permissions": ["<all_urls>"]
+         })";
+
+  TestExtensionDir test_dir;
+  test_dir.WriteManifest(kManifest);
+
+  InitializeEmptyExtensionService();
+  const Extension* extension =
+      PackAndInstallCRX(test_dir.UnpackedPath(), INSTALL_NEW);
+  ASSERT_TRUE(extension);
+
+  URLPattern chrome_favicon_pattern(Extension::kValidHostPermissionSchemes,
+                                    "chrome://favicon/");
+  EXPECT_TRUE(extension->permissions_data()
+                  ->active_permissions()
+                  .explicit_hosts()
+                  .ContainsPattern(chrome_favicon_pattern));
+
+  ScriptingPermissionsModifier(profile(), extension)
+      .SetWithholdHostPermissions(true);
+  EXPECT_TRUE(extension->permissions_data()
+                  ->active_permissions()
+                  .explicit_hosts()
+                  .ContainsPattern(chrome_favicon_pattern));
+
+  {
+    const ExtensionId id = extension->id();
+    service()->ReloadExtensionsForTest();
+    extension = registry()->enabled_extensions().GetByID(id);
+    ASSERT_TRUE(extension);
+  }
+  EXPECT_TRUE(extension->permissions_data()
+                  ->active_permissions()
+                  .explicit_hosts()
+                  .ContainsPattern(chrome_favicon_pattern));
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/extensions/permissions_updater.cc b/chrome/browser/extensions/permissions_updater.cc
index 09aec5cf..5cfe0d8 100644
--- a/chrome/browser/extensions/permissions_updater.cc
+++ b/chrome/browser/extensions/permissions_updater.cc
@@ -37,6 +37,7 @@
 #include "extensions/browser/extension_util.h"
 #include "extensions/browser/network_permissions_updater.h"
 #include "extensions/browser/notification_types.h"
+#include "extensions/browser/permissions_manager.h"
 #include "extensions/browser/renderer_startup_helper.h"
 #include "extensions/common/cors_util.h"
 #include "extensions/common/extension.h"
@@ -56,41 +57,6 @@
 
 namespace {
 
-// Returns a PermissionSet that has the active permissions of the extension,
-// bounded to its current manifest.
-std::unique_ptr<const PermissionSet> GetBoundedActivePermissions(
-    const Extension* extension,
-    const PermissionSet* active_permissions) {
-  // If the extension has used the optional permissions API, it will have a
-  // custom set of active permissions defined in the extension prefs. Here,
-  // we update the extension's active permissions based on the prefs.
-  if (!active_permissions)
-    return extension->permissions_data()->active_permissions().Clone();
-
-  const PermissionSet& required_permissions =
-      PermissionsParser::GetRequiredPermissions(extension);
-
-  // We restrict the active permissions to be within the bounds defined in the
-  // extension's manifest.
-  //  a) active permissions must be a subset of optional + default permissions
-  //  b) active permissions must contains all default permissions
-  std::unique_ptr<const PermissionSet> total_permissions =
-      PermissionSet::CreateUnion(
-          required_permissions,
-          PermissionsParser::GetOptionalPermissions(extension));
-
-  // Make sure the active permissions contain no more than optional + default.
-  std::unique_ptr<const PermissionSet> adjusted_active =
-      PermissionSet::CreateIntersection(*total_permissions,
-                                        *active_permissions);
-
-  // Make sure the active permissions contain the default permissions.
-  adjusted_active =
-      PermissionSet::CreateUnion(required_permissions, *adjusted_active);
-
-  return adjusted_active;
-}
-
 std::unique_ptr<PermissionsUpdater::Delegate>& GetDelegateWrapper() {
   static base::NoDestructor<std::unique_ptr<PermissionsUpdater::Delegate>>
       delegate_wrapper;
@@ -515,24 +481,27 @@
 }
 
 void PermissionsUpdater::InitializePermissions(const Extension* extension) {
-  std::unique_ptr<const PermissionSet> bounded_wrapper;
-  const PermissionSet* bounded_active = nullptr;
+  std::unique_ptr<const PermissionSet> desired_permissions_wrapper;
+  const PermissionSet* desired_permissions = nullptr;
+
+  PermissionsManager* permissions_manager =
+      PermissionsManager::Get(browser_context_);
+  DCHECK(permissions_manager);
+
   // If |extension| is a transient dummy extension, we do not want to look for
   // it in preferences.
   if (init_flag_ & INIT_FLAG_TRANSIENT) {
-    bounded_active = &extension->permissions_data()->active_permissions();
+    desired_permissions = &extension->permissions_data()->active_permissions();
   } else {
-    ExtensionPrefs* prefs = ExtensionPrefs::Get(browser_context_);
-    std::unique_ptr<const PermissionSet> active_permissions =
-        prefs->GetActivePermissions(extension->id());
-    bounded_wrapper =
-        GetBoundedActivePermissions(extension, active_permissions.get());
-    bounded_active = bounded_wrapper.get();
+    desired_permissions_wrapper =
+        PermissionsManager::Get(browser_context_)
+            ->GetExtensionDesiredPermissionsFromPrefs(*extension);
+    desired_permissions = desired_permissions_wrapper.get();
   }
 
   std::unique_ptr<const PermissionSet> granted_permissions =
-      ScriptingPermissionsModifier(browser_context_, extension)
-          .WithholdPermissionsIfNecessary(*bounded_active);
+      permissions_manager->GetEffectivePermissionsToGrant(*extension,
+                                                          *desired_permissions);
 
   if (GetDelegate())
     GetDelegate()->InitializePermissions(extension, &granted_permissions);
diff --git a/chrome/browser/extensions/scripting_permissions_modifier.cc b/chrome/browser/extensions/scripting_permissions_modifier.cc
index f2ea179b..4d9759a 100644
--- a/chrome/browser/extensions/scripting_permissions_modifier.cc
+++ b/chrome/browser/extensions/scripting_permissions_modifier.cc
@@ -11,6 +11,7 @@
 #include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_util.h"
+#include "extensions/browser/extensions_browser_client.h"
 #include "extensions/browser/permissions_manager.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/manifest_handlers/permissions_parser.h"
@@ -22,54 +23,6 @@
 
 namespace {
 
-// Iterates over |requested_permissions| and returns a permission set of any
-// permissions that should be  granted. These include any non-host
-// permissions or host permissions that are present in
-// |runtime_granted_permissions|. The returned permission set may contain new
-// patterns not found in either |requested_permissions| or
-// |runtime_granted_permissions| in the case of overlapping host permissions
-// (such as *://*.google.com/* and https://*/*, which would intersect with
-// https://*.google.com/*).
-std::unique_ptr<const PermissionSet> PartitionHostPermissions(
-    const PermissionSet& requested_permissions,
-    const PermissionSet& runtime_granted_permissions) {
-  auto segregate_url_permissions =
-      [](const URLPatternSet& requested_patterns,
-         const URLPatternSet& runtime_granted_patterns,
-         URLPatternSet* granted) {
-        *granted = URLPatternSet::CreateIntersection(
-            requested_patterns, runtime_granted_patterns,
-            URLPatternSet::IntersectionBehavior::kDetailed);
-        for (const URLPattern& pattern : requested_patterns) {
-          // The chrome://favicon permission is special. It is requested by
-          // extensions to access stored favicons, but is not a traditional
-          // host permission. Since it cannot be reasonably runtime-granted
-          // while the user is on the site (i.e., the user never visits
-          // chrome://favicon/), we auto-grant it and treat it like an API
-          // permission.
-          bool is_chrome_favicon =
-              pattern.scheme() == content::kChromeUIScheme &&
-              pattern.host() == chrome::kChromeUIFaviconHost;
-          if (is_chrome_favicon)
-            granted->AddPattern(pattern);
-        }
-      };
-
-  URLPatternSet granted_explicit_hosts;
-  URLPatternSet granted_scriptable_hosts;
-  segregate_url_permissions(requested_permissions.explicit_hosts(),
-                            runtime_granted_permissions.explicit_hosts(),
-                            &granted_explicit_hosts);
-  segregate_url_permissions(requested_permissions.scriptable_hosts(),
-                            runtime_granted_permissions.scriptable_hosts(),
-                            &granted_scriptable_hosts);
-
-  return std::make_unique<PermissionSet>(
-      requested_permissions.apis().Clone(),
-      requested_permissions.manifest_permissions().Clone(),
-      std::move(granted_explicit_hosts), std::move(granted_scriptable_hosts));
-}
-
 // Returns true if the extension should even be considered for being affected
 // by the runtime host permissions experiment.
 bool ShouldConsiderExtension(const Extension& extension) {
@@ -232,43 +185,6 @@
 }
 
 std::unique_ptr<const PermissionSet>
-ScriptingPermissionsModifier::WithholdPermissionsIfNecessary(
-    const PermissionSet& permissions) {
-  if (!ShouldConsiderExtension(*extension_)) {
-    // The withhold creation flag should never have been set in cases where
-    // withholding isn't allowed.
-    DCHECK(!(extension_->creation_flags() & Extension::WITHHOLD_PERMISSIONS));
-    return permissions.Clone();
-  }
-
-  if (permissions.effective_hosts().is_empty())
-    return permissions.Clone();  // No hosts to withhold.
-
-  bool should_withhold = false;
-  if (extension_->creation_flags() & Extension::WITHHOLD_PERMISSIONS) {
-    should_withhold = true;
-  } else {
-    should_withhold =
-        extension_prefs_->GetWithholdingPermissions(extension_->id());
-  }
-
-  if (!should_withhold)
-    return permissions.Clone();
-
-  // Only grant host permissions that the user has explicitly granted at
-  // runtime through the runtime host permissions feature or the optional
-  // permissions API.
-  std::unique_ptr<const PermissionSet> runtime_granted_permissions =
-      GetRuntimePermissionsFromPrefs();
-  // If there were no runtime granted permissions found in the prefs, default to
-  // a new empty set.
-  if (!runtime_granted_permissions) {
-    runtime_granted_permissions = std::make_unique<PermissionSet>();
-  }
-  return PartitionHostPermissions(permissions, *runtime_granted_permissions);
-}
-
-std::unique_ptr<const PermissionSet>
 ScriptingPermissionsModifier::GetRevokablePermissions() const {
   // No extra revokable permissions if the extension couldn't ever be affected.
   if (!ShouldConsiderExtension(*extension_))
@@ -296,14 +212,29 @@
         &extension_->permissions_data()->active_permissions();
   }
 
-  // Revokable permissions are those that would be withheld if there were no
-  // runtime-granted permissions.
-  PermissionSet empty_runtime_granted_permissions;
-  std::unique_ptr<const PermissionSet> granted_permissions =
-      PartitionHostPermissions(*current_granted_permissions,
-                               empty_runtime_granted_permissions);
+  std::unique_ptr<const PermissionSet> unrevokable_permissions;
+  {
+    PermissionSet apis_and_manifest(
+        current_granted_permissions->apis().Clone(),
+        current_granted_permissions->manifest_permissions().Clone(),
+        URLPatternSet(), URLPatternSet());
+    // TODO(devlin): We do this pattern of "required + optional" enough. Make it
+    // a part of PermissionsParser and stop duplicating the set each time.
+    std::unique_ptr<const PermissionSet> requested_permissions =
+        PermissionSet::CreateUnion(
+            PermissionsParser::GetRequiredPermissions(extension_.get()),
+            PermissionsParser::GetOptionalPermissions(extension_.get()));
+    // Unrevokable permissions include API permissions, manifest permissions,
+    // and host permissions that are always allowed.
+    unrevokable_permissions =
+        ExtensionsBrowserClient::Get()->AddAdditionalAllowedHosts(
+            *requested_permissions, apis_and_manifest);
+  }
+
+  // Revokable permissions are, predictably, any in the current set that aren't
+  // considered unrevokable.
   return PermissionSet::CreateDifference(*current_granted_permissions,
-                                         *granted_permissions);
+                                         *unrevokable_permissions);
 }
 
 void ScriptingPermissionsModifier::GrantWithheldHostPermissions() {
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 778a0fb2..82c118c 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1371,6 +1371,11 @@
     "owners": [ "garrick", "jasongustaman" ],
     "expiry_milestone": 109
   },
+  {
+    "name": "document-picture-in-picture-api",
+    "owners": [ "steimel", "media-dev" ],
+    "expiry_milestone": 120
+  },
    {
     "name": "document-transition",
     "owners": [ "khushalsagar", "vmpstr", "chrishtr" ],
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 256eea20..9ebd2e4 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -152,6 +152,11 @@
     "Defer text rendering in invisible CSS boxes until the boxes become "
     "visible.";
 
+const char kDocumentPictureInPictureApiName[] =
+    "Document Picture-in-Picture API";
+const char kDocumentPictureInPictureApiDescription[] =
+    "Enables API to open an always-on-top window with a full HTML document";
+
 const char kEditPasswordsInSettingsName[] = "Edit passwords in settings";
 const char kEditPasswordsInSettingsDescription[] =
     "Enables password editing in settings.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index c3eb436..68556fe2 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -100,6 +100,9 @@
 extern const char kDeferredFontShapingName[];
 extern const char kDeferredFontShapingDescription[];
 
+extern const char kDocumentPictureInPictureApiName[];
+extern const char kDocumentPictureInPictureApiDescription[];
+
 extern const char kForceStartupSigninPromoName[];
 extern const char kForceStartupSigninPromoDescription[];
 
diff --git a/chrome/browser/media/webrtc/webrtc_text_log_handler.cc b/chrome/browser/media/webrtc/webrtc_text_log_handler.cc
index db36e1a1..6b67dbcd 100644
--- a/chrome/browser/media/webrtc/webrtc_text_log_handler.cc
+++ b/chrome/browser/media/webrtc/webrtc_text_log_handler.cc
@@ -120,7 +120,9 @@
       sensitive_address = net::IPAddress(stripped).ToString();
       break;
     }
-    default: { break; }
+    default: {
+      break;
+    }
   }
   return sensitive_address;
 #else
@@ -525,7 +527,10 @@
          NumberToString(
              media::kChromeWideEchoCancellationProcessingFifoSize.Get()),
          ", minimize_resampling = ",
-         media::kChromeWideEchoCancellationMinimizeResampling.Get()
+         media::kChromeWideEchoCancellationMinimizeResampling.Get() ? "true"
+                                                                    : "false",
+         ", allow_all_sample_rates = ",
+         media::kChromeWideEchoCancellationAllowAllSampleRates.Get()
              ? "true"
              : "false"}));
   } else {
diff --git a/chrome/browser/nearby_sharing/nearby_notification_manager_unittest.cc b/chrome/browser/nearby_sharing/nearby_notification_manager_unittest.cc
index f7a7faf..bd9c75e 100644
--- a/chrome/browser/nearby_sharing/nearby_notification_manager_unittest.cc
+++ b/chrome/browser/nearby_sharing/nearby_notification_manager_unittest.cc
@@ -1870,9 +1870,10 @@
   }
 }
 
-TEST_P(NearbyNotificationManagerTest, ShowVisibilityReminder_Hidden_Mode) {
-  ExpectShowVisibilityReminderDcheckDeath();
-}
+// TODO: b/237714345 fix the test.
+// TEST_P(NearbyNotificationManagerTest, ShowVisibilityReminder_Hidden_Mode) {
+//   ExpectShowVisibilityReminderDcheckDeath();
+// }
 
 TEST_P(NearbyNotificationManagerTest,
        ShowVisibilityReminder_Notification_Clicked) {
diff --git a/chrome/browser/password_manager/password_store_backend_factory.cc b/chrome/browser/password_manager/password_store_backend_factory.cc
index 54d19b7..89e9374 100644
--- a/chrome/browser/password_manager/password_store_backend_factory.cc
+++ b/chrome/browser/password_manager/password_store_backend_factory.cc
@@ -25,8 +25,7 @@
 
 std::unique_ptr<PasswordStoreBackend> PasswordStoreBackend::Create(
     const base::FilePath& login_db_path,
-    PrefService* prefs,
-    std::unique_ptr<SyncDelegate> sync_delegate) {
+    PrefService* prefs) {
   TRACE_EVENT0("passwords", "PasswordStoreBackendCreation");
 #if !BUILDFLAG(IS_ANDROID) || BUILDFLAG(USE_LEGACY_PASSWORD_STORE_BACKEND)
   return std::make_unique<PasswordStoreBuiltInBackend>(
@@ -42,8 +41,7 @@
     return std::make_unique<PasswordStoreBackendMigrationDecorator>(
         std::make_unique<PasswordStoreBuiltInBackend>(
             CreateLoginDatabaseForProfileStorage(login_db_path)),
-        std::make_unique<PasswordStoreAndroidBackend>(prefs), prefs,
-        std::move(sync_delegate));
+        std::make_unique<PasswordStoreAndroidBackend>(prefs), prefs);
   }
   return std::make_unique<PasswordStoreBuiltInBackend>(
       CreateLoginDatabaseForProfileStorage(login_db_path));
diff --git a/chrome/browser/password_manager/password_store_backend_sync_delegate_impl.cc b/chrome/browser/password_manager/password_store_backend_sync_delegate_impl.cc
deleted file mode 100644
index 9a1c3908..0000000
--- a/chrome/browser/password_manager/password_store_backend_sync_delegate_impl.cc
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2022 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/password_manager/password_store_backend_sync_delegate_impl.h"
-
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/sync/sync_service_factory.h"
-#include "components/password_manager/core/browser/password_sync_util.h"
-#include "components/signin/public/identity_manager/account_info.h"
-#include "components/sync/driver/sync_service.h"
-
-using password_manager::sync_util::IsPasswordSyncEnabled;
-
-PasswordStoreBackendSyncDelegateImpl::PasswordStoreBackendSyncDelegateImpl(
-    Profile* profile)
-    : profile_(profile) {
-  DCHECK(profile_);
-}
-
-PasswordStoreBackendSyncDelegateImpl::~PasswordStoreBackendSyncDelegateImpl() =
-    default;
-
-bool PasswordStoreBackendSyncDelegateImpl::IsSyncingPasswordsEnabled() {
-  DCHECK(SyncServiceFactory::HasSyncService(profile_));
-  return IsPasswordSyncEnabled(SyncServiceFactory::GetForProfile(profile_));
-}
diff --git a/chrome/browser/password_manager/password_store_backend_sync_delegate_impl.h b/chrome/browser/password_manager/password_store_backend_sync_delegate_impl.h
deleted file mode 100644
index d9dff3f..0000000
--- a/chrome/browser/password_manager/password_store_backend_sync_delegate_impl.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2022 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_BACKEND_SYNC_DELEGATE_IMPL_H_
-#define CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_BACKEND_SYNC_DELEGATE_IMPL_H_
-
-#include "components/password_manager/core/browser/password_store_backend.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
-
-class Profile;
-
-class PasswordStoreBackendSyncDelegateImpl
-    : public password_manager::PasswordStoreBackend::SyncDelegate {
- public:
-  explicit PasswordStoreBackendSyncDelegateImpl(Profile* profile);
-  ~PasswordStoreBackendSyncDelegateImpl() override;
-
- private:
-  // SyncDelegate implementation.
-  bool IsSyncingPasswordsEnabled() override;
-
-  base::raw_ptr<Profile> profile_;
-};
-
-#endif  // CHROME_BROWSER_PASSWORD_MANAGER_PASSWORD_STORE_BACKEND_SYNC_DELEGATE_IMPL_H_
diff --git a/chrome/browser/password_manager/password_store_backend_sync_delegate_impl_unittest.cc b/chrome/browser/password_manager/password_store_backend_sync_delegate_impl_unittest.cc
deleted file mode 100644
index 3be8195..0000000
--- a/chrome/browser/password_manager/password_store_backend_sync_delegate_impl_unittest.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2022 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/password_manager/password_store_backend_sync_delegate_impl.h"
-
-#include <memory>
-
-#include "chrome/browser/sync/sync_service_factory.h"
-#include "chrome/test/base/testing_profile.h"
-#include "components/sync/driver/sync_service.h"
-#include "components/sync/driver/test_sync_service.h"
-#include "components/sync/driver/test_sync_user_settings.h"
-#include "content/public/test/browser_task_environment.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-class PasswordStoreBackendSyncDelegateImplTest : public testing::Test {
- protected:
-  PasswordStoreBackendSyncDelegateImplTest() {
-    TestingProfile::Builder builder;
-    builder.AddTestingFactory(SyncServiceFactory::GetInstance(),
-                              SyncServiceFactory::GetDefaultFactory());
-    testing_profile_ = builder.Build();
-
-    sync_service_ = static_cast<syncer::TestSyncService*>(
-        SyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
-            testing_profile_.get(),
-            base::BindRepeating(
-                [](content::BrowserContext*) -> std::unique_ptr<KeyedService> {
-                  return std::make_unique<syncer::TestSyncService>();
-                })));
-
-    sync_delegate_ = std::make_unique<PasswordStoreBackendSyncDelegateImpl>(
-        testing_profile_.get());
-  }
-
-  ~PasswordStoreBackendSyncDelegateImplTest() override = default;
-
-  syncer::TestSyncService* sync_service() { return sync_service_; }
-
-  password_manager::PasswordStoreBackend::SyncDelegate* sync_delegate() {
-    return sync_delegate_.get();
-  }
-
- private:
-  content::BrowserTaskEnvironment task_environment_;
-  std::unique_ptr<TestingProfile> testing_profile_;
-  raw_ptr<syncer::TestSyncService> sync_service_;
-  std::unique_ptr<PasswordStoreBackendSyncDelegateImpl> sync_delegate_;
-};
-
-TEST_F(PasswordStoreBackendSyncDelegateImplTest, SyncDisabled) {
-  sync_service()->SetTransportState(
-      syncer::SyncService::TransportState::DISABLED);
-  sync_service()->SetHasSyncConsent(false);
-  EXPECT_FALSE(sync_delegate()->IsSyncingPasswordsEnabled());
-}
-
-TEST_F(PasswordStoreBackendSyncDelegateImplTest,
-       SyncEnabledButNotForPasswords) {
-  sync_service()->SetTransportState(
-      syncer::SyncService::TransportState::ACTIVE);
-  sync_service()->SetHasSyncConsent(true);
-  static_cast<syncer::TestSyncUserSettings*>(sync_service()->GetUserSettings())
-      ->SetSelectedTypes(/*sync_everything=*/false,
-                         {syncer::UserSelectableType::kHistory});
-  EXPECT_FALSE(sync_delegate()->IsSyncingPasswordsEnabled());
-}
-
-TEST_F(PasswordStoreBackendSyncDelegateImplTest, SyncEnabled) {
-  sync_service()->SetTransportState(
-      syncer::SyncService::TransportState::ACTIVE);
-  sync_service()->SetHasSyncConsent(true);
-  AccountInfo active_info;
-  active_info.email = "test@email.com";
-  sync_service()->SetAccountInfo(active_info);
-  EXPECT_TRUE(sync_delegate()->IsSyncingPasswordsEnabled());
-}
diff --git a/chrome/browser/password_manager/password_store_factory.cc b/chrome/browser/password_manager/password_store_factory.cc
index 10a75cb..36480b47 100644
--- a/chrome/browser/password_manager/password_store_factory.cc
+++ b/chrome/browser/password_manager/password_store_factory.cc
@@ -13,7 +13,6 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/password_manager/affiliation_service_factory.h"
 #include "chrome/browser/password_manager/credentials_cleaner_runner_factory.h"
-#include "chrome/browser/password_manager/password_store_backend_sync_delegate_impl.h"
 #include "chrome/browser/password_manager/password_store_utils.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
@@ -76,16 +75,16 @@
   // about the sync service existence. And hence we cannot directly query the
   // status of password syncing. However, status of password syncing is
   // relevant for migrating passwords from the built-in backend to the Android
-  // backend. Since migration does *not* start immediately after start up, we
-  // inject a repeating callback that queries the sync service. Assumption is
-  // by the time the migration starts, the sync service will have been
-  // created. As a safety mechanism, if the sync service isn't created yet, we
-  // proceed as if the user isn't syncing which forces moving the passwords to
-  // the Android backend to avoid data loss.
+  // backend. Since migration does *not* start immediately after start up,
+  // SyncService will be propagated to PasswordStoreBackend after the backend
+  // creation once SyncService is initialized. Assumption is by the time the
+  // migration starts, the sync service will have been created. As a safety
+  // mechanism, if the sync service isn't created yet, we proceed as if the
+  // user isn't syncing which forces moving the passwords to the Android backend
+  // to avoid data loss.
   ps = new password_manager::PasswordStore(
-      password_manager::PasswordStoreBackend::Create(
-          profile->GetPath(), profile->GetPrefs(),
-          std::make_unique<PasswordStoreBackendSyncDelegateImpl>(profile)));
+      password_manager::PasswordStoreBackend::Create(profile->GetPath(),
+                                                     profile->GetPrefs()));
 #else
   NOTIMPLEMENTED();
 #endif
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 372c299..a82db3e 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -652,9 +652,6 @@
   { key::kAdditionalDnsQueryTypesEnabled,
     prefs::kAdditionalDnsQueryTypesEnabled,
     base::Value::Type::BOOLEAN },
-  { key::kSafeBrowsingForTrustedSourcesEnabled,
-    prefs::kSafeBrowsingForTrustedSourcesEnabled,
-    base::Value::Type::BOOLEAN },
   { key::kSafeBrowsingExtendedReportingEnabled,
     prefs::kSafeBrowsingScoutReportingEnabled,
     base::Value::Type::BOOLEAN },
@@ -673,9 +670,6 @@
   { key::kDisablePrintPreview,
     prefs::kPrintPreviewDisabled,
     base::Value::Type::BOOLEAN },
-  { key::kApplicationLocaleValue,
-    language::prefs::kApplicationLocale,
-    base::Value::Type::STRING },
   { key::kAlwaysOpenPdfExternally,
     prefs::kPluginsAlwaysOpenPdfExternally,
     base::Value::Type::BOOLEAN },
@@ -881,9 +875,6 @@
   { key::kPasswordLeakDetectionEnabled,
     password_manager::prefs::kPasswordLeakDetectionEnabled,
     base::Value::Type::BOOLEAN },
-  { key::kTotalMemoryLimitMb,
-    prefs::kTotalMemoryLimitMb,
-    base::Value::Type::INTEGER },
   { key::kPaymentMethodQueryEnabled,
     payments::kCanMakePaymentEnabled,
     base::Value::Type::BOOLEAN },
@@ -1418,6 +1409,9 @@
 #endif // BUILDFLAG(IS_LINUX)
 
 #if BUILDFLAG(IS_WIN)
+  { key::kApplicationLocaleValue,
+    language::prefs::kApplicationLocale,
+    base::Value::Type::STRING },
   { key::kChromeCleanupEnabled,
     prefs::kSwReporterEnabled,
     base::Value::Type::BOOLEAN },
@@ -1451,6 +1445,12 @@
   { key::kNetworkServiceSandboxEnabled,
     prefs::kNetworkServiceSandboxEnabled,
     base::Value::Type::BOOLEAN },
+  { key::kSafeBrowsingForTrustedSourcesEnabled,
+    prefs::kSafeBrowsingForTrustedSourcesEnabled,
+    base::Value::Type::BOOLEAN },
+  { key::kWindowOcclusionEnabled,
+    policy::policy_prefs::kNativeWindowOcclusionEnabled,
+    base::Value::Type::BOOLEAN },
 #else  // BUILDFLAG(IS_WIN)
   { key::kNtlmV2Enabled,
     prefs::kNtlmV2Enabled,
@@ -1467,6 +1467,9 @@
   { key::kPrintPdfAsImageAvailability,
     prefs::kPrintPdfAsImageAvailability,
     base::Value::Type::BOOLEAN },
+  { key::kTotalMemoryLimitMb,
+    prefs::kTotalMemoryLimitMb,
+    base::Value::Type::INTEGER },
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
 
 
@@ -1948,10 +1951,6 @@
       std::make_unique<WebUsbAllowDevicesForUrlsPolicyHandler>(chrome_schema));
   handlers->AddHandler(std::make_unique<FileSelectionDialogsPolicyHandler>());
   handlers->AddHandler(std::make_unique<JavascriptPolicyHandler>());
-  handlers->AddHandler(std::make_unique<SimplePolicyHandler>(
-      key::kWindowOcclusionEnabled,
-      policy::policy_prefs::kNativeWindowOcclusionEnabled,
-      base::Value::Type::BOOLEAN));
   handlers->AddHandler(std::make_unique<BrowsingHistoryPolicyHandler>());
 
   handlers->AddHandler(
@@ -1991,9 +1990,11 @@
 #else   // BUILDFLAG(IS_CHROMEOS)
   std::vector<std::unique_ptr<ConfigurationPolicyHandler>>
       signin_legacy_policies;
+#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
   signin_legacy_policies.push_back(std::make_unique<SimplePolicyHandler>(
       key::kForceBrowserSignin, prefs::kForceBrowserSignin,
       base::Value::Type::BOOLEAN));
+#endif  // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
   signin_legacy_policies.push_back(std::make_unique<SimplePolicyHandler>(
       key::kSigninAllowed,
 #if BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/profiles/guest_mode_policy_handler.cc b/chrome/browser/profiles/guest_mode_policy_handler.cc
index c5fd9d5..73357e666b 100644
--- a/chrome/browser/profiles/guest_mode_policy_handler.cc
+++ b/chrome/browser/profiles/guest_mode_policy_handler.cc
@@ -28,6 +28,7 @@
                       guest_mode_value->GetBool());
     return;
   }
+#if !BUILDFLAG(IS_CHROMEOS)
   // Disable guest mode by default if force signin is enabled.
   const base::Value* browser_signin_value =
       policies.GetValue(key::kBrowserSignin, base::Value::Type::INTEGER);
@@ -37,13 +38,16 @@
     prefs->SetBoolean(prefs::kBrowserGuestModeEnabled, false);
     return;
   }
+#endif
 
+#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
   const base::Value* force_signin_value =
       policies.GetValue(key::kForceBrowserSignin, base::Value::Type::BOOLEAN);
   if (!browser_signin_value && force_signin_value &&
       force_signin_value->GetBool()) {
     prefs->SetBoolean(prefs::kBrowserGuestModeEnabled, false);
   }
+#endif
 }
 
 }  // namespace policy
diff --git a/chrome/browser/profiles/guest_mode_policy_handler_unittest.cc b/chrome/browser/profiles/guest_mode_policy_handler_unittest.cc
index 3c41c83..11b0e1e 100644
--- a/chrome/browser/profiles/guest_mode_policy_handler_unittest.cc
+++ b/chrome/browser/profiles/guest_mode_policy_handler_unittest.cc
@@ -46,19 +46,23 @@
   EXPECT_FALSE(prefs_.GetValue(prefs::kBrowserGuestModeEnabled, nullptr));
 }
 
+#if !BUILDFLAG(IS_CHROMEOS)
 TEST_F(GuestModePolicyHandlerTest, ForceSigninDisabled) {
-  SetUpPolicy(key::kForceBrowserSignin, false);
+  SetUpPolicy(key::kBrowserSignin,
+              static_cast<int>(policy::BrowserSigninMode::kDisabled));
   handler_.ApplyPolicySettings(policies_, &prefs_);
   EXPECT_FALSE(prefs_.GetValue(prefs::kBrowserGuestModeEnabled, nullptr));
 
-  SetUpPolicy(key::kForceBrowserSignin, 0);  // Invalid format
+  SetUpPolicy(key::kBrowserSignin,
+              static_cast<int>(policy::BrowserSigninMode::kEnabled));
   handler_.ApplyPolicySettings(policies_, &prefs_);
   EXPECT_FALSE(prefs_.GetValue(prefs::kBrowserGuestModeEnabled, nullptr));
 }
 
 TEST_F(GuestModePolicyHandlerTest, GuestModeDisabledByDefault) {
   bool value;
-  SetUpPolicy(key::kForceBrowserSignin, true);
+  SetUpPolicy(key::kBrowserSignin,
+              static_cast<int>(policy::BrowserSigninMode::kForced));
   handler_.ApplyPolicySettings(policies_, &prefs_);
   EXPECT_TRUE(prefs_.GetBoolean(prefs::kBrowserGuestModeEnabled, &value));
   EXPECT_FALSE(value);
@@ -67,7 +71,8 @@
 TEST_F(GuestModePolicyHandlerTest,
        GuestModeDisabledByDefaultWithInvalidFormat) {
   bool value;
-  SetUpPolicy(key::kForceBrowserSignin, true);
+  SetUpPolicy(key::kBrowserSignin,
+              static_cast<int>(policy::BrowserSigninMode::kForced));
   SetUpPolicy(key::kBrowserGuestModeEnabled, 0);
   handler_.ApplyPolicySettings(policies_, &prefs_);
   EXPECT_TRUE(prefs_.GetBoolean(prefs::kBrowserGuestModeEnabled, &value));
@@ -76,7 +81,8 @@
 
 TEST_F(GuestModePolicyHandlerTest, GuestModeSet) {
   bool value;
-  SetUpPolicy(key::kForceBrowserSignin, true);
+  SetUpPolicy(key::kBrowserSignin,
+              static_cast<int>(policy::BrowserSigninMode::kForced));
   SetUpPolicy(key::kBrowserGuestModeEnabled, true);
   handler_.ApplyPolicySettings(policies_, &prefs_);
   EXPECT_TRUE(prefs_.GetBoolean(prefs::kBrowserGuestModeEnabled, &value));
@@ -114,13 +120,7 @@
   SetUpPolicy(key::kBrowserSignin, false);
   handler_.ApplyPolicySettings(policies_, &prefs_);
   EXPECT_FALSE(prefs_.GetBoolean(prefs::kBrowserGuestModeEnabled, &value));
-
-  // Even with forceBrowserSignin enable.
-  SetUpPolicy(key::kBrowserSignin,
-              static_cast<int>(BrowserSigninMode::kEnabled));
-  SetUpPolicy(key::kForceBrowserSignin, true);
-  handler_.ApplyPolicySettings(policies_, &prefs_);
-  EXPECT_FALSE(prefs_.GetBoolean(prefs::kBrowserGuestModeEnabled, &value));
 }
+#endif  //  !BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace policy
diff --git a/chrome/browser/profiles/off_the_record_profile_impl.cc b/chrome/browser/profiles/off_the_record_profile_impl.cc
index d8a2f46..342e297 100644
--- a/chrome/browser/profiles/off_the_record_profile_impl.cc
+++ b/chrome/browser/profiles/off_the_record_profile_impl.cc
@@ -98,6 +98,10 @@
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #endif
 
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#include "chromeos/startup/browser_init_params.h"
+#endif
+
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_special_storage_policy.h"
@@ -345,7 +349,9 @@
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
 bool OffTheRecordProfileImpl::IsMainProfile() const {
-  return false;
+  return chromeos::BrowserInitParams::Get()->session_type ==
+             crosapi::mojom::SessionType::kGuestSession &&
+         profile_->IsMainProfile();
 }
 #endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
 
diff --git a/chrome/browser/profiles/profile_keyed_service_browsertest.cc b/chrome/browser/profiles/profile_keyed_service_browsertest.cc
index 4f89905..53e7208 100644
--- a/chrome/browser/profiles/profile_keyed_service_browsertest.cc
+++ b/chrome/browser/profiles/profile_keyed_service_browsertest.cc
@@ -356,6 +356,7 @@
     "PasswordsPrivateEventRouter",
     "PermissionAuditingService",
     "PermissionHelper",
+    "PermissionsManager",
     "PermissionsUpdaterShutdownFactory",
     "PersonalDataManager",
     "PinnedTabService",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
index d6e8d44..104b21c1 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -30,13 +30,11 @@
   "background/braille/cursor_dots.js",
   "background/braille/liblouis.js",
   "background/braille/pan_strategy.js",
-  "background/braille/spans.js",
   "background/chromevox.js",
   "background/focus_bounds.js",
   "background/logging/log_store.js",
   "background/output/output_role_info.js",
   "background/output/output_types.js",
-  "background/phonetic_data.js",
   "common/abstract_earcons.js",
   "common/background_bridge.js",
   "common/braille/braille_interface.js",
@@ -45,7 +43,6 @@
   "common/bridge_constants.js",
   "common/bridge_helper.js",
   "common/extension_bridge.js",
-  "common/locale_output_helper.js",
   "common/log_types.js",
   "common/msgs.js",
   "common/panel_bridge.js",
@@ -80,6 +77,7 @@
   "background/braille/cursor_dots.js",
   "background/braille/expanding_braille_translator.js",
   "background/braille/pan_strategy.js",
+  "background/braille/spans.js",
   "background/chromevox_state.js",
   "background/classic_background.js",
   "background/color.js",
@@ -119,6 +117,7 @@
   "background/panel/panel_background.js",
   "background/panel/panel_node_menu_background.js",
   "background/panel/panel_tab_menu_background.js",
+  "background/phonetic_data.js",
   "background/pointer_handler.js",
   "background/prefs.js",
   "background/range_automation_handler.js",
@@ -138,6 +137,7 @@
   "common/key_sequence.js",
   "common/key_util.js",
   "common/keyboard_handler.js",
+  "common/locale_output_helper.js",
   "common/panel_command.js",
   "common/tts_base.js",
   "learn_mode/learn_mode.js",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
index 052f0cb..de57d7a 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
@@ -25,6 +25,7 @@
 import {ChromeVoxPrefs} from '/chromevox/background/prefs.js';
 import {RangeAutomationHandler} from '/chromevox/background/range_automation_handler.js';
 import {ExtensionBridge} from '/chromevox/common/extension_bridge.js';
+import {LocaleOutputHelper} from '/chromevox/common/locale_output_helper.js';
 import {PanelCommand, PanelCommandType} from '/chromevox/common/panel_command.js';
 import {JaPhoneticMap} from '/chromevox/third_party/tamachiyomi/ja_phonetic_map.js';
 import {CursorRange} from '/common/cursors/range.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js
index 5b0de8f..b2d37b1 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js
@@ -9,6 +9,7 @@
 import {BrailleTranslatorManager} from '/chromevox/background/braille/braille_translator_manager.js';
 import {ExpandingBrailleTranslator} from '/chromevox/background/braille/expanding_braille_translator.js';
 import {PanStrategy} from '/chromevox/background/braille/pan_strategy.js';
+import {ValueSpan} from '/chromevox/background/braille/spans.js';
 
 export class BrailleDisplayManager {
   /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js
index 98f70fcb..c9b660a7 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler.js
@@ -9,6 +9,7 @@
  */
 import {BrailleTranslatorManager} from '/chromevox/background/braille/braille_translator_manager.js';
 import {ExpandingBrailleTranslator} from '/chromevox/background/braille/expanding_braille_translator.js';
+import {ExtraCellsSpan, ValueSelectionSpan, ValueSpan} from '/chromevox/background/braille/spans.js';
 import {EventGenerator} from '/common/event_generator.js';
 
 export class BrailleInputHandler {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js
index 9f52e22..2722fd3 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_input_handler_test.js
@@ -440,6 +440,9 @@
     await importModule(
         'ExpandingBrailleTranslator',
         '/chromevox/background/braille/expanding_braille_translator.js');
+    await importModule(
+        ['ExtraCellsSpan', 'ValueSelectionSpan', 'ValueSpan'],
+        '/chromevox/background/braille/spans.js');
 
     chrome.runtime.onConnectExternal = new FakeChromeEvent();
     this.port = new FakePort();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js
index a02e7d53..1018262 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator.js
@@ -6,6 +6,7 @@
  * @fileoverview Translates text to braille, optionally with some parts
  * uncontracted.
  */
+import {BrailleTextStyleSpan, ExtraCellsSpan, ValueSelectionSpan, ValueSpan} from '/chromevox/background/braille/spans.js';
 
 /**
  * A wrapper around one or two braille translators that uses contracted
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js
index 05bdf6a4..3ad9bcb 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/expanding_braille_translator_test.js
@@ -15,6 +15,9 @@
     await importModule(
         'ExpandingBrailleTranslator',
         '/chromevox/background/braille/expanding_braille_translator.js');
+    await importModule(
+        ['ExtraCellsSpan', 'ValueSelectionSpan', 'ValueSpan'],
+        '/chromevox/background/braille/spans.js');
   }
 };
 
@@ -24,7 +27,6 @@
   '../../testing/fake_dom.js',
   '../../common/spannable.js',
   'liblouis.js',
-  'spans.js',
 ];
 
 /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js
index bda84b7..51aa8c8e 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/spans.js
@@ -7,16 +7,8 @@
  * and selections.
  */
 
-goog.provide('BrailleTextStyleSpan');
-goog.provide('ExtraCellsSpan');
-goog.provide('ValueSelectionSpan');
-goog.provide('ValueSpan');
-
-goog.require('LibLouis.FormType');
-goog.require('Spannable');
-
 /** Attached to the value region of a braille spannable. */
-ValueSpan = class {
+export class ValueSpan {
   /** @param {number} offset The offset of the span into the value. */
   constructor(offset) {
     /**
@@ -42,7 +34,7 @@
   toJson() {
     return this;
   }
-};
+}
 
 
 Spannable.registerSerializableSpan(
@@ -50,7 +42,7 @@
 
 
 /** Attached to the selected text within a value. */
-ValueSelectionSpan = class {};
+export class ValueSelectionSpan {}
 
 
 Spannable.registerStatelessSerializableSpan(
@@ -62,19 +54,19 @@
  * This is supported by the {@code ExpandingBrailleTranslator}
  * class.
  */
-ExtraCellsSpan = class {
+export class ExtraCellsSpan {
   constructor() {
     /** @type {ArrayBuffer} */
     this.cells = new Uint8Array(0).buffer;
   }
-};
+}
 
 
 /** Indicates a text form during translation in Liblouis. */
-BrailleTextStyleSpan = class {
+export class BrailleTextStyleSpan {
   /** @param {LibLouis.FormType} formType */
   constructor(formType) {
     /** @type {LibLouis.FormType} */
     this.formType = formType;
   }
-};
+}
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js
index fcb16c3..6754bc87 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js
@@ -17,6 +17,7 @@
 import {EventSourceState} from '/chromevox/background/event_source.js';
 import {GestureInterface} from '/chromevox/background/gesture_interface.js';
 import {Output} from '/chromevox/background/output/output.js';
+import {PhoneticData} from '/chromevox/background/phonetic_data.js';
 import {ChromeVoxPrefs} from '/chromevox/background/prefs.js';
 import {SmartStickyMode} from '/chromevox/background/smart_sticky_mode.js';
 import {AbstractTts} from '/chromevox/common/abstract_tts.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js
index b4cedb7..deadfea 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing.js
@@ -7,6 +7,7 @@
  * appropriate spoken and braille feedback.
  */
 import {BrailleBackground} from '/chromevox/background/braille/braille_background.js';
+import {BrailleTextStyleSpan, ValueSelectionSpan, ValueSpan} from '/chromevox/background/braille/spans.js';
 import {ChromeVoxState, ChromeVoxStateObserver} from '/chromevox/background/chromevox_state.js';
 import {Color} from '/chromevox/background/color.js';
 import {EditableLine} from '/chromevox/background/editing/editable_line.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js
index c647c371..110d90c 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js
@@ -16,12 +16,11 @@
 goog.require('BrailleKeyEvent');
 goog.require('BridgeHelper');
 goog.require('ChromeVox');
-goog.require('ExtraCellsSpan');
 goog.require('FocusBounds');
+goog.require('JaPhoneticData');
 goog.require('KeyCode');
 goog.require('LibLouis');
 goog.require('LibLouis.FormType');
-goog.require('LocaleOutputHelper');
 goog.require('LogStore');
 goog.require('LogType');
 goog.require('Msgs');
@@ -37,7 +36,6 @@
 goog.require('PanelBridge');
 goog.require('PanelNodeMenuData');
 goog.require('PanelTabMenuItemData');
-goog.require('PhoneticData');
 goog.require('QueueMode');
 goog.require('Spannable');
 goog.require('SpeechLog');
@@ -47,8 +45,6 @@
 goog.require('TreePathRecoveryStrategy');
 goog.require('TtsCategory');
 goog.require('TtsInterface');
-goog.require('ValueSelectionSpan');
-goog.require('ValueSpan');
 
 goog.require('constants');
 goog.require('cursors.Cursor');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js
index 06ee563a..915a966 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js
@@ -5,12 +5,15 @@
 /**
  * @fileoverview Provides output services for ChromeVox.
  */
+import {ValueSelectionSpan, ValueSpan} from '/chromevox/background/braille/spans.js';
 import {EventSourceState} from '/chromevox/background/event_source.js';
 import {OutputAncestryInfo} from '/chromevox/background/output/output_ancestry_info.js';
 import {OutputFormatParser, OutputFormatParserObserver} from '/chromevox/background/output/output_format_parser.js';
 import {OutputFormatTree} from '/chromevox/background/output/output_format_tree.js';
 import {OutputRulesStr} from '/chromevox/background/output/output_logger.js';
+import {PhoneticData} from '/chromevox/background/phonetic_data.js';
 import {EventSourceType} from '/chromevox/common/event_source_type.js';
+import {LocaleOutputHelper} from '/chromevox/common/locale_output_helper.js';
 import {CursorRange} from '/common/cursors/range.js';
 
 const AriaCurrentState = chrome.automation.AriaCurrentState;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data.js
index e3e4bfb..dae8f7a 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data.js
@@ -5,14 +5,9 @@
 /**
  * @fileoverview Provides phonetic disambiguation functionality across multiple
  * languages for ChromeVox.
- *
  */
 
-goog.provide('PhoneticData');
-
-goog.require('JaPhoneticData');
-
-PhoneticData = class {
+export class PhoneticData {
   /**
    * Returns the phonetic disambiguation for |char| in |locale|.
    * Returns empty string if disambiguation can't be found.
@@ -67,4 +62,4 @@
     }
     return result.join(', ');
   }
-};
+}
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data_test.js
index 5b3d5ca..bbfb63a 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/phonetic_data_test.js
@@ -9,8 +9,11 @@
  */
 ChromeVoxPhoneticDataTest = class extends AccessibilityTestBase {
   /** @override */
-  setUp() {
-    super.setUp();
+  async setUpDeferred() {
+    await super.setUpDeferred();
+    await importModule(
+        'PhoneticData', '/chromevox/background/phonetic_data.js');
+
     JaPhoneticData.init(JA_TEST_MAP);
   }
 };
@@ -19,7 +22,6 @@
 ChromeVoxPhoneticDataTest.prototype.extraLibraries = [
   '../../common/testing/assert_additions.js',
   '../testing/fake_dom.js',
-  'phonetic_data.js',
   '../third_party/tamachiyomi/ja_phonetic_data.js',
 ];
 
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js
index c2fa8297..179692a1 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/tts_background.js
@@ -7,6 +7,7 @@
  * extension API.
  */
 
+import {PhoneticData} from '/chromevox/background/phonetic_data.js';
 import {AbstractTts} from '/chromevox/common/abstract_tts.js';
 import {PanelCommand, PanelCommandType} from '/chromevox/common/panel_command.js';
 import {ChromeTtsBase} from '/chromevox/common/tts_base.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper.js
index c639d3f..44c6dd9 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper.js
@@ -10,9 +10,7 @@
  * https://en.wikipedia.org/wiki/Locale_(computer_software)
  */
 
-goog.provide('LocaleOutputHelper');
-
-LocaleOutputHelper = class {
+export class LocaleOutputHelper {
   /** @private */
   constructor() {
     /**
@@ -183,7 +181,7 @@
     return chrome.accessibilityPrivate.getDisplayNameForLocale(
                locale, locale) !== '';
   }
-};
+}
 
 /** @type {LocaleOutputHelper} */
 LocaleOutputHelper.instance;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper_test.js
index 56ee11c..82b1cd9f9 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/locale_output_helper_test.js
@@ -30,8 +30,12 @@
   }
 
   /** @override */
-  setUp() {
-    super.setUp();
+  async setUpDeferred() {
+    await super.setUpDeferred();
+
+    await importModule(
+        'LocaleOutputHelper', '/chromevox/common/locale_output_helper.js');
+
     // Mock this api to return a predefined set of voices.
     chrome.tts.getVoices = function(callback) {
       callback([
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js
index b640f2a..53fb809 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js
@@ -10,14 +10,12 @@
 goog.require('BluetoothBrailleDisplayListener');
 goog.require('BluetoothBrailleDisplayManager');
 goog.require('ChromeVox');
-goog.require('ExtraCellsSpan');
 goog.require('LibLouis');
+goog.require('LibLouis.FormType');
 goog.require('Msgs');
 goog.require('Spannable');
 goog.require('SpeechLog');
 goog.require('TtsInterface');
-goog.require('ValueSelectionSpan');
-goog.require('ValueSpan');
 
 goog.require('constants');
 goog.require('goog.i18n.MessageFormat');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js
index d7e7c0ed..36408319 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel.js
@@ -11,6 +11,7 @@
 import {GestureCommandData} from '/chromevox/common/gesture_command_data.js';
 import {KeyMap} from '/chromevox/common/key_map.js';
 import {KeyUtil} from '/chromevox/common/key_util.js';
+import {LocaleOutputHelper} from '/chromevox/common/locale_output_helper.js';
 import {PanelCommand, PanelCommandType} from '/chromevox/common/panel_command.js';
 import {ISearchUI} from '/chromevox/panel/i_search_ui.js';
 import {PanelInterface} from '/chromevox/panel/panel_interface.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js
index 405b20d..9190f48 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js
@@ -13,7 +13,6 @@
 goog.require('EarconDescription');
 goog.require('FocusBounds');
 goog.require('KeyCode');
-goog.require('LocaleOutputHelper');
 goog.require('LogStore');
 goog.require('Msgs');
 goog.require('NavBraille');
@@ -31,8 +30,6 @@
 goog.require('Spannable');
 goog.require('TextLog');
 goog.require('TtsCategory');
-goog.require('ValueSelectionSpan');
-goog.require('ValueSpan');
 
 goog.require('constants');
 goog.require('cursors.Cursor');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js
index f3dabad..ca5f5d71 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_test.js
@@ -18,6 +18,8 @@
         'CommandHandlerInterface',
         '/chromevox/background/command_handler_interface.js');
     await importModule(
+        'LocaleOutputHelper', '/chromevox/common/locale_output_helper.js');
+    await importModule(
         ['PanelCommand', 'PanelCommandType'],
         '/chromevox/common/panel_command.js');
     await importModule('CursorRange', '/common/cursors/range.js');
diff --git a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.html b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.html
index 3575179b..15b5939 100644
--- a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.html
+++ b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.html
@@ -131,10 +131,6 @@
     border-bottom-color: var(--scrollable-border-color);
   }
 
-  #contentArea {
-    scroll-behavior: smooth;
-  }
-
   iron-collapse {
     --iron-collapse-transition-duration: 300ms;
   }
diff --git a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.ts b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.ts
index b4106e9..5dbc1d2d 100644
--- a/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.ts
+++ b/chrome/browser/resources/privacy_sandbox/privacy_sandbox_dialog_app.ts
@@ -131,10 +131,7 @@
         // ...and scroll the content area up to make the section content
         // visible.
         const rect = this.$.expandSection.getBoundingClientRect();
-        // If the section is expanding, scroll the content area so the learn
-        // more section is at the top. If the section is collapsing, scroll
-        // the content area to the top.
-        this.$.contentArea.scrollTo({top: newVal ? rect.top : 0});
+        this.$.contentArea.scrollTo({top: rect.top, behavior: 'smooth'});
       }, duration * 0.7);
     }
   }
@@ -142,29 +139,6 @@
   private promptActionOccurred(action: PrivacySandboxPromptAction) {
     PrivacySandboxDialogBrowserProxy.getInstance().promptActionOccurred(action);
   }
-
-  // Methods to be used only for testing, in WebUI or native browser tests.
-  public waitForScrollToEndForTesting() {
-    return new Promise(resolve => {
-      let timer: ReturnType<typeof setTimeout>|null = null;
-      this.$.contentArea.addEventListener('scroll', _ => {
-        if (timer !== null) {
-          clearTimeout(timer);
-        }
-        timer = setTimeout(resolve, 150);
-      });
-    });
-  }
-
-  public async expandLearnMoreSectionForTesting() {
-    this.expanded_ = true;
-    const collapseElement: HTMLElement|null =
-        this.$.expandSection.querySelector('iron-collapse');
-    collapseElement!.style.setProperty(
-        '--iron-collapse-transition-duration', '0ms');
-    this.$.contentArea.style.setProperty('scroll-behavior', 'auto');
-    await this.waitForScrollToEndForTesting();
-  }
 }
 
 declare global {
diff --git a/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts b/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts
index 0327cc6..42d7f35 100644
--- a/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts
+++ b/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts
@@ -33,11 +33,13 @@
 import {PasswordRequestorMixin} from './password_requestor_mixin.js';
 
 export type SavedPasswordEditedEvent =
-    CustomEvent<chrome.passwordsPrivate.ChangeSavedPasswordParams>;
+    CustomEvent<chrome.passwordsPrivate.CredentialIds>;
+
+const SAVED_PASSWORD_EDITED_EVENT_NAME = 'saved-password-edited';
 
 declare global {
   interface HTMLElementEventMap {
-    'saved-password-edited': SavedPasswordEditedEvent;
+    [SAVED_PASSWORD_EDITED_EVENT_NAME]: SavedPasswordEditedEvent;
   }
 }
 
@@ -524,20 +526,22 @@
 
     PasswordManagerImpl.getInstance()
         .changeSavedPassword(idsToChange, params)
-        .finally(() => {
+        .then(newIds => {
           if (this.isPasswordViewPageEnabled_) {
-            this.dispatchChangePasswordEvent_(params);
+            this.dispatchChangePasswordEvent_(newIds);
           }
+        })
+        .finally(() => {
           this.close();
         });
   }
 
   private dispatchChangePasswordEvent_(
-      params: chrome.passwordsPrivate.ChangeSavedPasswordParams) {
-    this.dispatchEvent(new CustomEvent('saved-password-edited', {
+      newIds: chrome.passwordsPrivate.CredentialIds) {
+    this.dispatchEvent(new CustomEvent(SAVED_PASSWORD_EDITED_EVENT_NAME, {
       bubbles: true,
       composed: true,
-      detail: params,
+      detail: newIds,
     }));
   }
 
diff --git a/chrome/browser/resources/settings/autofill_page/password_list_item.ts b/chrome/browser/resources/settings/autofill_page/password_list_item.ts
index 0e95bf8af..9337096 100644
--- a/chrome/browser/resources/settings/autofill_page/password_list_item.ts
+++ b/chrome/browser/resources/settings/autofill_page/password_list_item.ts
@@ -109,19 +109,14 @@
       return;
     }
     const params = new URLSearchParams();
-    params.set(PasswordViewPageUrlParams.SITE, this.entry.urls.shown);
-    params.set(PasswordViewPageUrlParams.USERNAME, this.entry.username);
-    // For sync'ing and signed-out users, there is strictly only one password
-    // store, and hence no need to specify store information.
-    // For account store users, a credential can exist in one or both of the
-    // device and account stores, in which case, store information is required.
-    // For consistency with the sync'ing and signed-out case, store information
-    // isn't provided when the credentials exist only in the device store.
-    if (this.entry.isPresentInAccount()) {
-      params.set(PasswordViewPageUrlParams.IN_ACCOUNT, 'true');
-      if (this.entry.isPresentOnDevice()) {
-        params.set(PasswordViewPageUrlParams.ON_DEVICE, 'true');
-      }
+    if (this.entry.deviceId !== null) {
+      params.set(
+          PasswordViewPageUrlParams.DEVICE_ID, this.entry.deviceId.toString());
+    }
+    if (this.entry.accountId !== null) {
+      params.set(
+          PasswordViewPageUrlParams.ACCOUNT_ID,
+          this.entry.accountId.toString());
     }
     recordPasswordViewInteraction(
         PasswordViewPageInteractions.CREDENTIAL_ROW_CLICKED);
diff --git a/chrome/browser/resources/settings/autofill_page/password_manager_proxy.ts b/chrome/browser/resources/settings/autofill_page/password_manager_proxy.ts
index 4129510..f5c20fd4 100644
--- a/chrome/browser/resources/settings/autofill_page/password_manager_proxy.ts
+++ b/chrome/browser/resources/settings/autofill_page/password_manager_proxy.ts
@@ -77,11 +77,13 @@
   /**
    * Changes the saved password corresponding to |ids|.
    * @param ids The ids for the password entry being updated.
-   * @return A promise that resolves when the password is updated for all ids.
+   * @return A promise that resolves with the new IDs when the password is
+   *     updated for all ids.
    */
   changeSavedPassword(
-      ids: number[],
-      params: chrome.passwordsPrivate.ChangeSavedPasswordParams): Promise<void>;
+      ids: Array<number>,
+      params: chrome.passwordsPrivate.ChangeSavedPasswordParams):
+      Promise<chrome.passwordsPrivate.CredentialIds>;
 
   /**
    * Should remove the saved password and notify that the list has changed.
@@ -207,6 +209,13 @@
   optInForAccountStorage(optIn: boolean): void;
 
   /**
+   * Refreshes the cache for automatic password change scripts if the cache is
+   * stale.
+   * @return A promise that resolves when the cache is fresh.
+   */
+  refreshScriptsIfNecessary(): Promise<void>;
+
+  /**
    * Requests the start of the bulk password check.
    */
   startBulkPasswordCheck(): Promise<void>;
@@ -417,8 +426,11 @@
   changeSavedPassword(
       ids: number[],
       params: chrome.passwordsPrivate.ChangeSavedPasswordParams) {
-    return new Promise<void>(resolve => {
-      chrome.passwordsPrivate.changeSavedPassword(ids, params, resolve);
+    return new Promise<chrome.passwordsPrivate.CredentialIds>(resolve => {
+      chrome.passwordsPrivate.changeSavedPassword(
+          ids, params, (newIds: chrome.passwordsPrivate.CredentialIds) => {
+            resolve(newIds);
+          });
     });
   }
 
@@ -550,6 +562,12 @@
     chrome.passwordsPrivate.optInForAccountStorage(optIn);
   }
 
+  refreshScriptsIfNecessary() {
+    return new Promise<void>(resolve => {
+      chrome.passwordsPrivate.refreshScriptsIfNecessary(resolve);
+    });
+  }
+
   startBulkPasswordCheck() {
     return new Promise<void>((resolve, reject) => {
       chrome.passwordsPrivate.startPasswordCheck(() => {
diff --git a/chrome/browser/resources/settings/autofill_page/password_view.ts b/chrome/browser/resources/settings/autofill_page/password_view.ts
index 50592e8..fb1e0dc 100644
--- a/chrome/browser/resources/settings/autofill_page/password_view.ts
+++ b/chrome/browser/resources/settings/autofill_page/password_view.ts
@@ -63,10 +63,8 @@
 }
 
 export enum PasswordViewPageUrlParams {
-  SITE = 'site',
-  USERNAME = 'username',
-  IN_ACCOUNT = 'inAccount',
-  ON_DEVICE = 'onDevice',
+  ACCOUNT_ID = 'accountId',
+  DEVICE_ID = 'deviceId',
 }
 
 export function recordPasswordViewInteraction(
@@ -107,6 +105,8 @@
 
   static get properties() {
     return {
+      accountId_: Number,
+
       activeDialogAnchorStack_: {
         type: Array,
         value: () => [],
@@ -123,6 +123,8 @@
         notify: true,
       },
 
+      deviceId_: Number,
+
       isPasswordNotesEnabled_: {
         type: Boolean,
         value() {
@@ -130,20 +132,21 @@
         },
       },
 
-      inAccount_: Boolean,
-
       isPasswordVisible_: {
         type: Boolean,
         value: false,
       },
 
-      onDevice_: Boolean,
-
       password_: {
         type: String,
         value: '',
       },
 
+      showEditDialog_: {
+        type: Boolean,
+        value: false,
+      },
+
       // <if expr="chromeos_ash or chromeos_lacros">
       showPasswordPromptDialog_: Boolean,
       // </if>
@@ -154,40 +157,32 @@
        */
       recentlyEdited_: Boolean,
 
-      site: {
-        type: String,
-        value: '',
-      },
-
-      username: {
-        type: String,
-        value: '',
-      },
     };
   }
 
   static get observers() {
     return [
-      'savedPasswordsChanged_(savedPasswords.splices, site, username, ' +
-      'inAccount_, onDevice_)'
+      'savedPasswordsChanged_(savedPasswords.splices, accountId_, deviceId_)'
     ];
   }
 
-  private activeDialogAnchorStack_: HTMLElement[];
+  /**
+   * Valid values for accountId_ and deviceId_ are null or number. They are set
+   * to undefined for early return in the observer.
+   */
+  private accountId_: number|null|undefined;
+  private deviceId_: number|null|undefined;
+  private activeDialogAnchorStack_: Array<HTMLElement>;
   private toastText_: string;
   credential: MultiStorePasswordUiEntry|null;
-  private inAccount_: boolean|undefined;
   private isPasswordNotesEnabled_: boolean;
   private isPasswordVisible_: boolean;
-  private onDevice_: boolean|undefined;
   private password_: string;
   private recentlyEdited_: boolean;
   // <if expr="chromeos_ash or chromeos_lacros">
   private showPasswordPromptDialog_: boolean;
   // </if>
   private showEditDialog_: boolean;
-  site: string;
-  username: string;
 
   // <if expr="chromeos_ash or chromeos_lacros">
   override connectedCallback() {
@@ -208,10 +203,8 @@
 
   override currentRouteChanged(route: Route): void {
     if (route !== routes.PASSWORD_VIEW) {
-      this.site = '';
-      this.username = '';
-      this.inAccount_ = undefined;
-      this.onDevice_ = undefined;
+      this.accountId_ = undefined;
+      this.deviceId_ = undefined;
       this.recentlyEdited_ = false;
       this.password_ = '';
       this.credential = null;
@@ -220,29 +213,16 @@
     }
     const queryParameters = Router.getInstance().getQueryParameters();
 
-    const site = queryParameters.get(PasswordViewPageUrlParams.SITE);
-    if (!site) {
-      return;
-    }
-
-    this.username =
-        queryParameters.get(PasswordViewPageUrlParams.USERNAME) || '';
-    this.site = site;
-
-    // inAccount | onDevice
-    // ----------+---------
-    // true      | -/false  : look for the credential stored in account
-    // -/false   | true     : look for the credential stored on device
-    // true      | true     : look for the credential stored in both
-    // -/false   | -/false  : look for the credential stored on device
-    if (!queryParameters.has(PasswordViewPageUrlParams.IN_ACCOUNT)) {
-      this.onDevice_ = true;
-      this.inAccount_ = false;
-      return;
-    }
-
-    this.onDevice_ = queryParameters.has(PasswordViewPageUrlParams.ON_DEVICE);
-    this.inAccount_ = queryParameters.has(PasswordViewPageUrlParams.IN_ACCOUNT);
+    const convertToNullOrNumber = (input: string|null) => {
+      if (!input || Number.isNaN(Number(input))) {
+        return null;
+      }
+      return Number(input);
+    };
+    this.accountId_ = convertToNullOrNumber(
+        queryParameters.get(PasswordViewPageUrlParams.ACCOUNT_ID));
+    this.deviceId_ = convertToNullOrNumber(
+        queryParameters.get(PasswordViewPageUrlParams.DEVICE_ID));
   }
 
   override onPasswordRemoveDialogPasswordsRemoved(
@@ -355,21 +335,19 @@
 
   private onSavedPasswordEdited_(event: SavedPasswordEditedEvent) {
     this.recentlyEdited_ = true;
-
-    const newUsername = event.detail.username;
-    if (event.detail.username !== this.credential!.username ||
-        event.detail.password !== this.credential!.password ||
-        event.detail.note !== this.credential!.note) {
-      recordPasswordViewInteraction(
-          PasswordViewPageInteractions.CREDENTIAL_EDITED);
-    }
-    if (this.credential!.username === newUsername) {
-      return;
-    }
-    // The dialog is recently closed. If the username has changed, reroute the
-    // page to the new credential.
+    // The dialog is recently closed. Use the new IDs to update the URL.
     const newParams = Router.getInstance().getQueryParameters();
-    newParams.set(PasswordViewPageUrlParams.USERNAME, newUsername);
+
+    if (event.detail.accountId !== undefined) {
+      newParams.set(
+          PasswordViewPageUrlParams.ACCOUNT_ID,
+          event.detail.accountId.toString());
+    }
+    if (event.detail.deviceId !== undefined) {
+      newParams.set(
+          PasswordViewPageUrlParams.DEVICE_ID,
+          event.detail.deviceId.toString());
+    }
     Router.getInstance().updateRouteParams(newParams);
   }
 
@@ -447,15 +425,13 @@
     this.isPasswordVisible_ = false;
     // When an observed property changes, the observer will be called. Make sure
     // that all properties are set.
-    if (!this.savedPasswords.length ||
-        !(!!this.site && this.inAccount_ !== undefined &&
-          this.onDevice_ !== undefined)) {
+    if (!this.savedPasswords.length || this.accountId_ === undefined ||
+        this.deviceId_ === undefined) {
       return;
     }
     const item = this.savedPasswords.find((item: MultiStorePasswordUiEntry) => {
-      return item.urls.shown === this.site && item.username === this.username &&
-          item.isPresentInAccount() === this.inAccount_ &&
-          item.isPresentOnDevice() === this.onDevice_;
+      return item.accountId === this.accountId_ &&
+          item.deviceId === this.deviceId_;
     });
 
     if (!item) {
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_section.ts b/chrome/browser/resources/settings/autofill_page/passwords_section.ts
index ad9d3e1..cb513f6 100644
--- a/chrome/browser/resources/settings/autofill_page/passwords_section.ts
+++ b/chrome/browser/resources/settings/autofill_page/passwords_section.ts
@@ -36,31 +36,31 @@
 import {CrLinkRowElement} from 'chrome://resources/cr_elements/cr_link_row/cr_link_row.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js';
 import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js';
-import {I18nMixin} from 'chrome://resources/js/i18n_mixin.js';
+import {I18nMixin, I18nMixinInterface} from 'chrome://resources/js/i18n_mixin.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-import {WebUIListenerMixin} from 'chrome://resources/js/web_ui_listener_mixin.js';
+import {WebUIListenerMixin, WebUIListenerMixinInterface} from 'chrome://resources/js/web_ui_listener_mixin.js';
 import {DomRepeat, DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {GlobalScrollTargetMixin} from '../global_scroll_target_mixin.js';
+import {GlobalScrollTargetMixin, GlobalScrollTargetMixinInterface} from '../global_scroll_target_mixin.js';
 import {HatsBrowserProxyImpl, TrustSafetyInteraction} from '../hats_browser_proxy.js';
 import {loadTimeData} from '../i18n_setup.js';
 import {OpenWindowProxyImpl} from '../open_window_proxy.js';
 import {StoredAccount, SyncBrowserProxyImpl, SyncPrefs, SyncStatus, TrustedVaultBannerState} from '../people_page/sync_browser_proxy.js';
-import {PrefsMixin} from '../prefs/prefs_mixin.js';
+import {PrefsMixin, PrefsMixinInterface} from '../prefs/prefs_mixin.js';
 import {routes} from '../route.js';
-import {Route, Router} from '../router.js';
+import {Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js';
 
 // <if expr="chromeos_ash or chromeos_lacros">
 import {BlockingRequestManager} from './blocking_request_manager.js';
 // </if>
-import {MergeExceptionsStoreCopiesMixin} from './merge_exceptions_store_copies_mixin.js';
-import {MergePasswordsStoreCopiesMixin} from './merge_passwords_store_copies_mixin.js';
+import {MergeExceptionsStoreCopiesMixin, MergeExceptionsStoreCopiesMixinInterface} from './merge_exceptions_store_copies_mixin.js';
+import {MergePasswordsStoreCopiesMixin, MergePasswordsStoreCopiesMixinInterface} from './merge_passwords_store_copies_mixin.js';
 import {MultiStoreExceptionEntry} from './multi_store_exception_entry.js';
 import {MultiStorePasswordUiEntry} from './multi_store_password_ui_entry.js';
-import {PasswordCheckMixin} from './password_check_mixin.js';
+import {PasswordCheckMixin, PasswordCheckMixinInterface} from './password_check_mixin.js';
 import {AddCredentialFromSettingsUserInteractions, PasswordEditDialogElement} from './password_edit_dialog.js';
 import {PasswordCheckReferrer, PasswordExceptionListChangedListener, PasswordManagerImpl, PasswordManagerProxy} from './password_manager_proxy.js';
-import {PasswordRequestorMixin} from './password_requestor_mixin.js';
+import {PasswordRequestorMixin, PasswordRequestorMixinInterface} from './password_requestor_mixin.js';
 import {PasswordsListHandlerElement} from './passwords_list_handler.js';
 import {getTemplate} from './passwords_section.html.js';
 
@@ -109,10 +109,18 @@
   };
 }
 
-const PasswordsSectionElementBase = MergePasswordsStoreCopiesMixin(
-    PasswordRequestorMixin(PrefsMixin(GlobalScrollTargetMixin(
-        MergeExceptionsStoreCopiesMixin(WebUIListenerMixin(
-            I18nMixin(PasswordCheckMixin(PolymerElement))))))));
+const PasswordsSectionElementBase =
+    MergePasswordsStoreCopiesMixin(PasswordRequestorMixin(
+        PrefsMixin(GlobalScrollTargetMixin(RouteObserverMixin(
+            MergeExceptionsStoreCopiesMixin(WebUIListenerMixin(
+                I18nMixin(PasswordCheckMixin(PolymerElement))))))))) as {
+      new (): PolymerElement & PasswordCheckMixinInterface &
+          I18nMixinInterface & WebUIListenerMixinInterface &
+          MergeExceptionsStoreCopiesMixinInterface &
+          RouteObserverMixinInterface & GlobalScrollTargetMixinInterface &
+          PrefsMixinInterface & PasswordRequestorMixinInterface &
+          MergePasswordsStoreCopiesMixinInterface,
+    };
 
 export class PasswordsSectionElement extends PasswordsSectionElementBase {
   static get is() {
@@ -245,6 +253,14 @@
             'eligibleForAccountStorage_)',
       },
 
+      isAutomaticPasswordChangeEnabled_: {
+        type: Boolean,
+        value() {
+          return loadTimeData.getBoolean(
+              'enableAutomaticPasswordChangeInSettings');
+        }
+      },
+
       isPasswordViewPageEnabled_: {
         type: Boolean,
         value() {
@@ -317,6 +333,7 @@
   private hasPasswordExceptions_: boolean;
   private shouldShowBanner_: boolean;
   private isAccountStoreUser_: boolean;
+  private isAutomaticPasswordChangeEnabled_: boolean;
   private isPasswordViewPageEnabled_: boolean;
   private isUnifiedPasswordManagerEnabled_: boolean;
   private shouldShowDevicePasswordsLink_: boolean;
@@ -449,6 +466,16 @@
     this.setIsOptedInForAccountStorageListener_ = null;
   }
 
+  override currentRouteChanged(route: Route): void {
+    super.currentRouteChanged(route);
+
+    // If password change scripts are enabled, the scripts cache should be
+    // refreshed to minimize any UI modifications on the password check page.
+    if (route === routes.PASSWORDS && this.isAutomaticPasswordChangeEnabled_) {
+      this.passwordManager_.refreshScriptsIfNecessary();
+    }
+  }
+
   private computeShowAddPasswordButton_(): boolean {
     // Don't show add button if password manager is disabled by policy.
     return !(
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn
index 2df2b3ec..ff61bdf 100644
--- a/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -14,6 +14,7 @@
 
 assert(is_chromeos_ash)
 
+# root_gen_dir is "gen"
 # target_gen_dir is "gen/chrome/browser/resources/settings/chromeos"
 
 preprocessed_folder = "preprocessed"
@@ -135,13 +136,17 @@
 
 # Preprocess all WebUI mojom files, which are bundled in optimized builds.
 preprocess_if_expr("preprocess_mojo_webui") {
-  deps = [ ":generate_settings_mojo_webui" ]
+  deps = [
+    ":generate_personalization_search_mojo_webui",
+    ":generate_settings_mojo_webui",
+  ]
   in_folder = "$target_gen_dir"
   out_folder = "$target_gen_dir/$preprocessed_folder"
   out_manifest = "$target_gen_dir/$mojo_webui_manifest"
   in_files = [
     "mojom-webui/routes.mojom-webui.js",
     "mojom-webui/setting.mojom-webui.js",
+    "mojom-webui/personalization/search.mojom-webui.js",
   ]
 }
 
@@ -155,6 +160,13 @@
   outputs = [ "$target_gen_dir/mojom-webui/{{source_file_part}}" ]
 }
 
+copy("generate_personalization_search_mojo_webui") {
+  deps = [ "//ash/webui/personalization_app/search:mojo_bindings_webui_js" ]
+  sources = [ "$root_gen_dir/mojom-webui/ash/webui/personalization_app/search/search.mojom-webui.js" ]
+  outputs =
+      [ "$target_gen_dir/mojom-webui/personalization/{{source_file_part}}" ]
+}
+
 # Mojo files generated by non-OS-settings targets, not bundled.
 preprocess_if_expr("preprocess_external_mojo") {
   deps = [
@@ -887,6 +899,7 @@
   deps = [
     ":personalization_search_handler",
     ":settings_search_handler",
+    "//ash/webui/personalization_app/search:mojo_bindings_webui_js",
     "//mojo/public/mojom/base:base_webui_js",
   ]
 }
diff --git a/chrome/browser/resources/settings/chromeos/combined_search_handler.js b/chrome/browser/resources/settings/chromeos/combined_search_handler.js
index ea0177ec..717ad34c 100644
--- a/chrome/browser/resources/settings/chromeos/combined_search_handler.js
+++ b/chrome/browser/resources/settings/chromeos/combined_search_handler.js
@@ -5,12 +5,13 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {String16} from 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-webui.js';
 
+import {SearchResult as PersonalizationSearchResult} from '../mojom-webui/personalization/search.mojom-webui.js';
+
 import {getPersonalizationSearchHandler} from './personalization_search_handler.js';
 import {getSettingsSearchHandler} from './settings_search_handler.js';
 
 /**
- * @typedef {chromeos.settings.mojom.SearchResult|
- *           ash.personalizationApp.mojom.SearchResult}
+ * @typedef {chromeos.settings.mojom.SearchResult|PersonalizationSearchResult}
  */
 export let SearchResult;
 
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni
index 00db6c82..e4ef917 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings.gni
+++ b/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -21,6 +21,10 @@
           "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/settings/chromeos/constants",
           root_build_dir),
   "browser_resolver_prefix_replacements=\"../mojom-webui/=../\"",
+  "js_module_root=" + rebase_path(
+          "$root_gen_dir/mojom-webui/ash/webui/personalization_app/search",
+          root_build_dir),
+  "browser_resolver_prefix_replacements=\"../mojom-webui/personalization/=../\"",
 ]
 
 # TODO(crbug.com/1315757) Remove once ChromeOS Settings is fully migrated to
diff --git a/chrome/browser/resources/side_panel/read_anything/app.html b/chrome/browser/resources/side_panel/read_anything/app.html
index 6f0c8a6..0a17ab22 100644
--- a/chrome/browser/resources/side_panel/read_anything/app.html
+++ b/chrome/browser/resources/side_panel/read_anything/app.html
@@ -25,4 +25,5 @@
     font-family: Calibri, 'Times New Roman', serif;
   }
 </style>
-<div id="container" class$="[[fontName_]]"></div>
+<div id="container" class$="[[fontName_]]" style$="font-size:[[fontSize_]]px;">
+</div>
diff --git a/chrome/browser/resources/side_panel/read_anything/app.ts b/chrome/browser/resources/side_panel/read_anything/app.ts
index 5b42728..d06f4263 100644
--- a/chrome/browser/resources/side_panel/read_anything/app.ts
+++ b/chrome/browser/resources/side_panel/read_anything/app.ts
@@ -32,6 +32,12 @@
     assert(readAnythingApp);
     readAnythingApp.updateContent();
   };
+
+  chrome.readAnything.updateFontSize = function() {
+    const readAnythingApp = document.querySelector('read-anything-app');
+    assert(readAnythingApp);
+    readAnythingApp.updateFontSize();
+  };
 }
 
 export class ReadAnythingElement extends ReadAnythingElementBase {
@@ -52,6 +58,7 @@
   }
 
   private fontName_: string;
+  private fontSize_: number;
 
   // Defines the valid font names that can be passed to front-end and maps
   // them to a corresponding class style in app.html. Must stay in-sync with
@@ -172,6 +179,10 @@
     this.fontName_ =
         validFontName ? validFontName.cssClass : this.defaultFontName;
   }
+
+  updateFontSize() {
+    this.fontSize_ = chrome.readAnything.fontSize;
+  }
 }
 
 declare global {
diff --git a/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts b/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts
index b6439d5..49a1f7f 100644
--- a/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts
+++ b/chrome/browser/resources/side_panel/read_anything/read_anything.d.ts
@@ -17,6 +17,8 @@
     // A font name, defined in ReadAnythingFontModel.
     let fontName: string;
 
+    let fontSize: number;
+
     // Returns a list of AXNodeIDs corresponding to the unignored children of
     // the AXNode for the provided AXNodeID.
     function getChildren(nodeId: number): number[];
@@ -81,5 +83,9 @@
     // Ping that the font name has been changed in the ReadAnythingToolbar and
     // is available to consume.
     function updateFontName(): void;
+
+    // Ping that the font size has been changed for the distilled contents and
+    // is available to consume.
+    function updateFontSize(): void;
   }
 }
diff --git a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.html b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.html
index 693b1280..0f3f359 100644
--- a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.html
+++ b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.html
@@ -143,6 +143,11 @@
     padding-top: 50px;
   }
 
+  button[disabled] {
+    cursor: auto;
+    pointer-events: none;
+  }
+
   @media (prefers-color-scheme: dark) {
     :host {
       --account-button-hover-color: var(--google-grey-800);
@@ -179,7 +184,7 @@
     <h3>$i18n{accountSelectionLacrosSubtitle}</h3>
   </div>
   <button id="other-account-button" class="account-button"
-          on-click="onOtherAccountClick_">
+          on-click="onOtherAccountClick_" disabled="[[accountSelected_]]">
     <div class="account-avatar">
       <iron-icon icon="profiles:account-circle" id="otherAccountIcon">
       </iron-icon>
@@ -192,7 +197,8 @@
   </button>
   <div id="buttonsContainer">
     <template is="dom-repeat" items="[[availableAccounts_]]">
-      <button class="account-button" on-click="onAccountClick_">
+      <button class="account-button" on-click="onAccountClick_"
+          disabled="[[accountSelected_]]">
         <img class="account-avatar" src="[[item.accountImageUrl]]">
         <div class="account-text">
           <div class="account-name">[[item.name]]</div>
diff --git a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.ts b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.ts
index c527e3f..a6a9678f 100644
--- a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.ts
+++ b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/account_selection_lacros.ts
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
 import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js';
 import 'chrome://resources/cr_elements/shared_vars_css.m.js';
 import './profile_creation_shared.css.js';
@@ -51,6 +50,11 @@
         type: Boolean,
         value: () => hasPreviousRoute(),
       },
+
+      accountSelected_: {
+        type: Boolean,
+        value: false,
+      },
     };
   }
 
@@ -59,6 +63,7 @@
 
   profileThemeInfo: AutogeneratedThemeColorInfo;
   private availableAccounts_: AvailableAccount[];
+  private accountSelected_: Boolean;
 
   override connectedCallback() {
     super.connectedCallback();
@@ -105,6 +110,7 @@
   }
 
   private onAccountClick_(e: DomRepeatEvent<AvailableAccount>) {
+    this.accountSelected_ = true;
     const gaiaId = e.model.item.gaiaId;
     this.manageProfilesBrowserProxy_.selectAccountLacros(
         this.profileThemeInfo.color, gaiaId);
diff --git a/chrome/browser/safe_browsing/BUILD.gn b/chrome/browser/safe_browsing/BUILD.gn
index e7637a8..9d43a724 100644
--- a/chrome/browser/safe_browsing/BUILD.gn
+++ b/chrome/browser/safe_browsing/BUILD.gn
@@ -26,6 +26,7 @@
     "//chrome/common",
     "//chrome/common:constants",
     "//components/browser_sync",
+    "//components/enterprise:enterprise",
     "//components/enterprise/common:strings",
     "//components/keyed_service/content",
     "//components/language/core/browser",
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc
index 898811c..b896d41 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc
@@ -3,16 +3,17 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.h"
+
 #include "base/base64.h"
 #include "base/command_line.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/rand_util.h"
 #include "chrome/browser/enterprise/util/affiliation.h"
-
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/advanced_protection_status_manager.h"
 #include "chrome/browser/safe_browsing/advanced_protection_status_manager_factory.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
+#include "components/enterprise/browser/controller/browser_dm_token_storage.h"
 #include "components/safe_browsing/content/browser/web_ui/safe_browsing_ui.h"
 #include "components/safe_browsing/core/common/features.h"
 #include "content/public/browser/browser_task_traits.h"
@@ -140,6 +141,22 @@
   }
 }
 
+bool CanUseAccessToken(const BinaryUploadService::Request& request,
+                       Profile* profile) {
+  DCHECK(profile);
+  // Consumer requests never need to use the access token.
+  if (IsConsumerScanRequest(request))
+    return false;
+
+    // Allow the access token to be used on unmanaged devices, but not on
+    // managed devices that aren't affiliated.
+#if !BUILDFLAG(IS_CHROMEOS)
+  if (!policy::BrowserDMTokenStorage::Get()->RetrieveDMToken().is_valid())
+    return true;
+#endif
+  return chrome::enterprise_util::IsProfileAffiliated(profile);
+}
+
 }  // namespace
 
 // static
@@ -313,7 +330,7 @@
   request->set_fcm_token(instance_id);
 
   if (base::FeatureList::IsEnabled(kConnectorsScanningAccessToken) &&
-      chrome::enterprise_util::IsProfileAffiliated(profile_)) {
+      CanUseAccessToken(*request, profile_)) {
     if (!token_fetcher_) {
       token_fetcher_ = std::make_unique<SafeBrowsingPrimaryAccountTokenFetcher>(
           IdentityManagerFactory::GetForProfile(profile_));
@@ -332,6 +349,9 @@
 void CloudBinaryUploadService::OnGetAccessToken(
     Request* request,
     const std::string& access_token) {
+  if (!IsActive(request))
+    return;
+
   request->set_access_token(access_token);
   request->GetRequestData(
       base::BindOnce(&CloudBinaryUploadService::OnGetRequestData,
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 7e5c42c..472f2659 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -4791,6 +4791,8 @@
       "views/side_panel/feed/feed_side_panel_coordinator.h",
       "views/side_panel/history_clusters/history_clusters_side_panel_coordinator.cc",
       "views/side_panel/history_clusters/history_clusters_side_panel_coordinator.h",
+      "views/side_panel/read_anything/read_anything_button_view.cc",
+      "views/side_panel/read_anything/read_anything_button_view.h",
       "views/side_panel/read_anything/read_anything_constants.h",
       "views/side_panel/read_anything/read_anything_container_view.cc",
       "views/side_panel/read_anything/read_anything_container_view.h",
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h
index ce0f1606..64eeec3 100644
--- a/chrome/browser/ui/browser.h
+++ b/chrome/browser/ui/browser.h
@@ -316,6 +316,10 @@
     // maximizable.
     bool can_maximize = true;
 
+    // Aspect ratio parameters specific to TYPE_PICTURE_IN_PICTURE.
+    float initial_aspect_ratio = 1.0f;
+    bool lock_aspect_ratio = false;
+
    private:
     friend class Browser;
     friend class WindowSizerChromeOSTest;
diff --git a/chrome/browser/ui/browser_navigator.cc b/chrome/browser/ui/browser_navigator.cc
index 50c1db5..3c01acf 100644
--- a/chrome/browser/ui/browser_navigator.cc
+++ b/chrome/browser/ui/browser_navigator.cc
@@ -165,14 +165,15 @@
 #if !BUILDFLAG(IS_CHROMEOS_LACROS)
 gfx::Rect CalculateInitialPictureInPictureWindowBounds(
     float initial_aspect_ratio) {
+  DCHECK(initial_aspect_ratio > 0);
+
   // TODO(https://crbug.com/1327797): This copies a bunch of logic from
   // OverlayWindowViews. The sizing logic should be delegated to a PiP-specific
   // controller.
   gfx::Rect work_area =
       display::Screen::GetScreen()->GetDisplayForNewWindows().work_area();
   gfx::Rect window_bounds(work_area.width() / 5, work_area.height() / 5);
-  float aspect_ratio = (initial_aspect_ratio > 0) ? initial_aspect_ratio : 1.0;
-  gfx::SizeRectToAspectRatio(gfx::ResizeEdge::kTopLeft, aspect_ratio,
+  gfx::SizeRectToAspectRatio(gfx::ResizeEdge::kTopLeft, initial_aspect_ratio,
                              gfx::Size(0, 0), work_area.size(), &window_bounds);
 
   int window_diff_width = work_area.right() - window_bounds.width();
@@ -312,6 +313,11 @@
               CalculateInitialPictureInPictureWindowBounds(
                   params.contents_to_insert
                       ->GetPictureInPictureInitialAspectRatio());
+          browser_params.initial_aspect_ratio =
+              params.contents_to_insert
+                  ->GetPictureInPictureInitialAspectRatio();
+          browser_params.lock_aspect_ratio =
+              params.contents_to_insert->GetPictureInPictureLockAspectRatio();
         }
 
         return {Browser::Create(browser_params), -1};
diff --git a/chrome/browser/ui/browser_navigator_browsertest.cc b/chrome/browser/ui/browser_navigator_browsertest.cc
index c82e29e..6324510 100644
--- a/chrome/browser/ui/browser_navigator_browsertest.cc
+++ b/chrome/browser/ui/browser_navigator_browsertest.cc
@@ -1896,6 +1896,7 @@
   // The WebContents holds the parameters from the PiP request.
   WebContents::CreateParams web_contents_params(browser()->profile());
   web_contents_params.initial_picture_in_picture_aspect_ratio = 0.5;
+  web_contents_params.lock_picture_in_picture_aspect_ratio = true;
 
   // Opening a picture in picture window should create a new browser.
   NavigateParams params(MakeNavigateParams(browser()));
diff --git a/chrome/browser/ui/tabs/tab_group_model.cc b/chrome/browser/ui/tabs/tab_group_model.cc
index 8e3712b..eaadc63 100644
--- a/chrome/browser/ui/tabs/tab_group_model.cc
+++ b/chrome/browser/ui/tabs/tab_group_model.cc
@@ -25,6 +25,11 @@
 TabGroup* TabGroupModel::AddTabGroup(
     const tab_groups::TabGroupId& id,
     absl::optional<tab_groups::TabGroupVisualData> visual_data) {
+  // The tab group must not already exist - replacing the old group without
+  // first removing it would invalidate pointers to the old group and could
+  // easily UAF.
+  CHECK(!ContainsTabGroup(id));
+
   auto tab_group = std::make_unique<TabGroup>(
       controller_, id,
       visual_data.value_or(
diff --git a/chrome/browser/ui/views/extensions/extension_dialog.cc b/chrome/browser/ui/views/extensions/extension_dialog.cc
index 2c60ad2..9a0d42623 100644
--- a/chrome/browser/ui/views/extensions/extension_dialog.cc
+++ b/chrome/browser/ui/views/extensions/extension_dialog.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/bind.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/extension_view_host.h"
@@ -86,6 +87,12 @@
     observer_->ExtensionDialogClosing(this);
 }
 
+void ExtensionDialog::HandleCloseExtensionHost(
+    extensions::ExtensionHost* host) {
+  DCHECK_EQ(host, host_.get());
+  GetWidget()->Close();
+}
+
 void ExtensionDialog::OnExtensionHostDidStopFirstLoad(
     const extensions::ExtensionHost* host) {
   DCHECK_EQ(host, host_.get());
@@ -97,12 +104,6 @@
   MaybeFocusRenderer();
 }
 
-void ExtensionDialog::OnExtensionHostShouldClose(
-    extensions::ExtensionHost* host) {
-  DCHECK_EQ(host, host_.get());
-  GetWidget()->Close();
-}
-
 void ExtensionDialog::OnExtensionProcessTerminated(
     const extensions::Extension* extension) {
   if (extension == host_->extension() && observer_)
@@ -140,6 +141,11 @@
   SetShowTitle(!init_params.title.empty());
   SetTitle(init_params.title);
 
+  // The base::Unretained() below is safe because this object owns `host_`, so
+  // the callback will never fire if `this` is deleted.
+  host_->SetCloseHandler(base::BindOnce(
+      &ExtensionDialog::HandleCloseExtensionHost, base::Unretained(this)));
+
   extension_view_ =
       SetContentsView(std::make_unique<ExtensionViewViews>(host_.get()));
 
diff --git a/chrome/browser/ui/views/extensions/extension_dialog.h b/chrome/browser/ui/views/extensions/extension_dialog.h
index 8ec3df1..e33c222 100644
--- a/chrome/browser/ui/views/extensions/extension_dialog.h
+++ b/chrome/browser/ui/views/extensions/extension_dialog.h
@@ -99,7 +99,6 @@
   // extensions::ExtensionHostObserver:
   void OnExtensionHostDidStopFirstLoad(
       const extensions::ExtensionHost* host) override;
-  void OnExtensionHostShouldClose(extensions::ExtensionHost* host) override;
 
   // extensions::ProcessManagerObserver:
   void OnExtensionProcessTerminated(
@@ -120,6 +119,9 @@
 
   void OnWindowClosing();
 
+  // Handles a signal from the `host` to close.
+  void HandleCloseExtensionHost(extensions::ExtensionHost* host);
+
   // Window Title
   std::u16string window_title_;
 
diff --git a/chrome/browser/ui/views/extensions/extension_popup.cc b/chrome/browser/ui/views/extensions/extension_popup.cc
index 4202c5e..fb85609 100644
--- a/chrome/browser/ui/views/extensions/extension_popup.cc
+++ b/chrome/browser/ui/views/extensions/extension_popup.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/views/extensions/extension_popup.h"
 
+#include "base/bind.h"
 #include "base/memory/raw_ptr.h"
 #include "chrome/browser/devtools/devtools_window.h"
 #include "chrome/browser/extensions/extension_view_host.h"
@@ -198,7 +199,6 @@
     // try to access the host during Widget closure, destroy it immediately.
     RemoveChildViewT(extension_view_.get());
 
-    extension_host_observation_.Reset();
     // Note: it's important that we unregister the devtools observation *before*
     // we destroy `host_`. Otherwise, destroying `host_` can synchronously cause
     // the associated WebContents to be destroyed, which will cause devtools to
@@ -243,12 +243,6 @@
     show_action_ = PopupShowAction::kShow;
 }
 
-void ExtensionPopup::OnExtensionHostShouldClose(
-    extensions::ExtensionHost* host) {
-  DCHECK_EQ(host, host_.get());
-  GetWidget()->Close();
-}
-
 ExtensionPopup::ExtensionPopup(
     std::unique_ptr<extensions::ExtensionViewHost> host,
     views::View* anchor_view,
@@ -284,8 +278,11 @@
       std::make_unique<ScopedDevToolsAgentHostObservation>(this);
   host_->browser()->tab_strip_model()->AddObserver(this);
 
-  // Listen for the containing view calling window.close();
-  extension_host_observation_.Observe(host_.get());
+  // Handle the containing view calling window.close();
+  // The base::Unretained() below is safe because this object owns `host_`, so
+  // the callback will never fire if `this` is deleted.
+  host_->SetCloseHandler(base::BindOnce(
+      &ExtensionPopup::HandleCloseExtensionHost, base::Unretained(this)));
 
   extension_registry_observation_.Observe(
       extensions::ExtensionRegistry::Get(host_->browser_context()));
@@ -323,5 +320,10 @@
     GetWidget()->CloseWithReason(views::Widget::ClosedReason::kLostFocus);
 }
 
+void ExtensionPopup::HandleCloseExtensionHost(extensions::ExtensionHost* host) {
+  DCHECK_EQ(host, host_.get());
+  GetWidget()->Close();
+}
+
 BEGIN_METADATA(ExtensionPopup, views::BubbleDialogDelegateView)
 END_METADATA
diff --git a/chrome/browser/ui/views/extensions/extension_popup.h b/chrome/browser/ui/views/extensions/extension_popup.h
index f0c96baf3..7944f691 100644
--- a/chrome/browser/ui/views/extensions/extension_popup.h
+++ b/chrome/browser/ui/views/extensions/extension_popup.h
@@ -15,7 +15,6 @@
 #include "content/public/browser/devtools_agent_host_observer.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "extensions/browser/extension_host.h"
-#include "extensions/browser/extension_host_observer.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_registry_observer.h"
 #include "ui/base/metadata/metadata_header_macros.h"
@@ -48,8 +47,7 @@
                        public extensions::ExtensionRegistryObserver,
                        public content::WebContentsObserver,
                        public TabStripModelObserver,
-                       public content::DevToolsAgentHostObserver,
-                       public extensions::ExtensionHostObserver {
+                       public content::DevToolsAgentHostObserver {
  public:
   METADATA_HEADER(ExtensionPopup);
 
@@ -117,9 +115,6 @@
   void DevToolsAgentHostDetached(
       content::DevToolsAgentHost* agent_host) override;
 
-  // extensions::ExtensionHostObserver:
-  void OnExtensionHostShouldClose(extensions::ExtensionHost* host) override;
-
   // Returns the most recently constructed popup. For testing only.
   static ExtensionPopup* last_popup_for_testing();
 
@@ -138,15 +133,14 @@
   // Closes the bubble if the devtools window is not attached.
   void CloseUnlessUnderInspection();
 
+  // Handles a signal from the extension host to close.
+  void HandleCloseExtensionHost(extensions::ExtensionHost* host);
+
   // The contained host for the view.
   std::unique_ptr<extensions::ExtensionViewHost> host_;
 
   raw_ptr<ExtensionViewViews> extension_view_;
 
-  base::ScopedObservation<extensions::ExtensionHost,
-                          extensions::ExtensionHostObserver>
-      extension_host_observation_{this};
-
   base::ScopedObservation<extensions::ExtensionRegistry,
                           extensions::ExtensionRegistryObserver>
       extension_registry_observation_{this};
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 21bf0585..a6f5515c 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -1168,6 +1168,14 @@
   return browser_->is_type_picture_in_picture();
 }
 
+float BrowserView::GetInitialAspectRatio() const {
+  return browser_->create_params().initial_aspect_ratio;
+}
+
+bool BrowserView::GetLockAspectRatio() const {
+  return browser_->create_params().lock_aspect_ratio;
+}
+
 bool BrowserView::GetTopControlsSlideBehaviorEnabled() const {
   return top_controls_slide_controller_ &&
          top_controls_slide_controller_->IsEnabled();
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index c768615d..0fad4aa 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -314,6 +314,14 @@
   // a Picture in Picture window.
   bool GetIsPictureInPictureType() const;
 
+  // Returns the initial_aspect_ratio parameter from |browser_|'s CreateParams.
+  // Valid only for PictureInPicture browsers.
+  float GetInitialAspectRatio() const;
+
+  // Returns the lock_aspect_ratio parameter from |browser_|'s CreateParams.
+  // Valid only for PictureInPicture browsers.
+  bool GetLockAspectRatio() const;
+
   // Returns true if the top browser controls (a.k.a. top-chrome UIs) are
   // allowed to slide up and down with the gesture scrolls on the current tab's
   // page.
diff --git a/chrome/browser/ui/views/frame/browser_window_factory.cc b/chrome/browser/ui/views/frame/browser_window_factory.cc
index 2c62b0bd..ad2b2d0 100644
--- a/chrome/browser/ui/views/frame/browser_window_factory.cc
+++ b/chrome/browser/ui/views/frame/browser_window_factory.cc
@@ -57,6 +57,11 @@
   view->GetWidget()->non_client_view()->SetAccessibleName(
       l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
 
+  if (view->GetIsPictureInPictureType() && view->GetLockAspectRatio()) {
+    gfx::SizeF aspect_ratio(view->GetInitialAspectRatio(), 1.0f);
+    view->GetWidget()->SetAspectRatio(aspect_ratio);
+  }
+
 #if defined(USE_AURA)
   // For now, all browser windows are true. This only works when USE_AURA
   // because it requires gfx::NativeWindow to be an aura::Window*.
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
index 3e20ccb1..eb19367 100644
--- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
+++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
@@ -83,7 +83,6 @@
   dialog_created_time_ = base::TimeTicks::Now();
   web_view_ =
       AddChildView(std::make_unique<views::WebView>(browser->profile()));
-  web_view_->SetID(kViewIdWebView);
   web_view_->LoadInitialURL(GURL(chrome::kChromeUIPrivacySandboxDialogURL));
 
   auto width =
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h
index 812d4c4..71dda28 100644
--- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h
+++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.h
@@ -24,8 +24,6 @@
   PrivacySandboxDialogView(Browser* browser,
                            PrivacySandboxService::PromptType dialog_type);
 
-  static constexpr int kViewIdWebView = 1;
-
   void Close();
 
  private:
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc
index 9cc716eb..cb159e2 100644
--- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc
+++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc
@@ -23,15 +23,6 @@
 constexpr int kAverageBrowserWidth = 800;
 constexpr int kAverageBrowserHeight = 700;
 
-void ExpandLearnMoreSection(content::WebContents* web_contents) {
-  content::RenderFrameHost* main_frame = web_contents->GetPrimaryMainFrame();
-  EXPECT_TRUE(
-      content::ExecJs(main_frame,
-                      "(async () => { return await "
-                      "document.querySelector('privacy-sandbox-dialog-app')."
-                      "expandLearnMoreSectionForTesting(); })()"));
-}
-
 }  // namespace
 
 class PrivacySandboxDialogViewBrowserTest : public DialogBrowserTest {
@@ -50,9 +41,6 @@
     if (name == "Consent") {
       prompt_type = PrivacySandboxService::PromptType::kConsent;
     }
-    if (name == "ConsentExpanded") {
-      prompt_type = PrivacySandboxService::PromptType::kConsent;
-    }
     if (name == "Notice") {
       prompt_type = PrivacySandboxService::PromptType::kNotice;
     }
@@ -66,13 +54,7 @@
         views::test::AnyWidgetTestPasskey{},
         PrivacySandboxDialogView::kViewClassName);
     ShowPrivacySandboxPrompt(browser(), prompt_type);
-    auto* dialog = waiter.WaitIfNeededAndGet();
-    if (name == "ConsentExpanded") {
-      auto* web_view = dialog->GetRootView()->GetViewByID(
-          PrivacySandboxDialogView::kViewIdWebView);
-      ExpandLearnMoreSection(
-          static_cast<views::WebView*>(web_view)->GetWebContents());
-    }
+    waiter.WaitIfNeededAndGet();
 
     base::RunLoop().RunUntilIdle();
   }
@@ -94,21 +76,6 @@
   ShowAndVerifyUi();
 }
 
-IN_PROC_BROWSER_TEST_F(PrivacySandboxDialogViewBrowserTest,
-                       InvokeUi_ConsentExpanded) {
-  EXPECT_CALL(
-      *mock_service(),
-      PromptActionOccurred(PrivacySandboxService::PromptAction::kConsentShown));
-  EXPECT_CALL(*mock_service(),
-              PromptActionOccurred(
-                  PrivacySandboxService::PromptAction::kConsentMoreInfoOpened));
-  EXPECT_CALL(
-      *mock_service(),
-      PromptActionOccurred(
-          PrivacySandboxService::PromptAction::kConsentClosedNoDecision));
-  ShowAndVerifyUi();
-}
-
 IN_PROC_BROWSER_TEST_F(PrivacySandboxDialogViewBrowserTest, InvokeUi_Notice) {
   EXPECT_CALL(
       *mock_service(),
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.cc
new file mode 100644
index 0000000..7b38977
--- /dev/null
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.cc
@@ -0,0 +1,37 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.h"
+
+#include "chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h"
+#include "ui/views/layout/box_layout.h"
+
+ReadAnythingButtonView::ReadAnythingButtonView(
+    views::ImageButton::PressedCallback callback,
+    const gfx::ImageSkia& icon,
+    const std::u16string& tooltip) {
+  // Create and set a BoxLayout with insets to hold the button.
+  auto button_layout_manager = std::make_unique<views::BoxLayout>(
+      views::BoxLayout::Orientation::kHorizontal);
+  button_layout_manager->set_inside_border_insets(
+      gfx::Insets().set_left(kButtonPadding).set_right(kButtonPadding));
+  button_layout_manager->set_cross_axis_alignment(
+      views::BoxLayout::CrossAxisAlignment::kCenter);
+  button_layout_manager->set_main_axis_alignment(
+      views::BoxLayout::MainAxisAlignment::kCenter);
+
+  SetLayoutManager(std::move(button_layout_manager));
+
+  // Create the image button.
+  auto button = std::make_unique<views::ImageButton>(std::move(callback));
+  button->SetImageHorizontalAlignment(views::ImageButton::ALIGN_CENTER);
+  button->SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE);
+  button->SetImage(views::Button::STATE_NORMAL, icon);
+  button->SetTooltipText(tooltip);
+
+  // Add the button to the view.
+  AddChildView(std::move(button));
+}
+
+ReadAnythingButtonView::~ReadAnythingButtonView() = default;
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.h
new file mode 100644
index 0000000..cddbaa5
--- /dev/null
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.h
@@ -0,0 +1,30 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_SIDE_PANEL_READ_ANYTHING_READ_ANYTHING_BUTTON_VIEW_H_
+#define CHROME_BROWSER_UI_VIEWS_SIDE_PANEL_READ_ANYTHING_READ_ANYTHING_BUTTON_VIEW_H_
+
+#include "base/callback_forward.h"
+#include "ui/gfx/image/image_skia.h"
+#include "ui/views/controls/button/image_button.h"
+#include "ui/views/view.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// ReadAnythingButtonView
+//
+//  A helper class for buttons in the Read Anything toolbar.
+//  This class makes image button views with padding and theming as a
+//  convenience class for the ReadAnythingToolbarView.
+//
+class ReadAnythingButtonView : public views::View {
+ public:
+  ReadAnythingButtonView(const views::ImageButton::PressedCallback callback,
+                         const gfx::ImageSkia& icon,
+                         const std::u16string& tooltip);
+  ReadAnythingButtonView(const ReadAnythingButtonView&) = delete;
+  ReadAnythingButtonView& operator=(const ReadAnythingButtonView&) = delete;
+  ~ReadAnythingButtonView() override;
+};
+
+#endif  // CHROME_BROWSER_UI_VIEWS_SIDE_PANEL_READ_ANYTHING_READ_ANYTHING_BUTTON_VIEW_H_
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h
index 7e682143..9530ab9 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h
@@ -11,9 +11,12 @@
 // Visual constants for Read Anything feature.
 // TODO(1226555): Replace these with final values provided by UI.
 const int kInternalInsets = 6;
-const int kFontSize = 16;
-const int kIconSize = 16;
-const int kIconCornerRadius = 2;
+
+const int kButtonPadding = 12;
+const int kSeparatorTopBottomPadding = 6;
+
+const int kSmallIconSize = 18;
+const int kLargeIconSize = 24;
 
 const char kReadAnythingDefaultFontName[] = "Standard font";
 
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc
index a267f9ff..cb7b963 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.cc
@@ -32,7 +32,6 @@
 }
 
 void ReadAnythingController::OnFontChoiceChanged(int new_choice) {
-  std::string new_font_name;
   model_->SetSelectedFontByIndex(new_choice);
 
   browser_->profile()->GetPrefs()->SetString(
@@ -40,6 +39,14 @@
       model_->GetFontModel()->GetFontNameAt(new_choice));
 }
 
+void ReadAnythingController::OnFontSizeChanged(bool increase) {
+  if (increase) {
+    model_->IncreaseTextSize();
+  } else {
+    model_->DecreaseTextSize();
+  }
+}
+
 void ReadAnythingController::OnUIReady() {
   DistillAXTree();
 }
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h
index c7715a59..19960ef 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h
@@ -49,6 +49,7 @@
  private:
   // ReadAnythingToolbarView::Delegate:
   void OnFontChoiceChanged(int new_choice) override;
+  void OnFontSizeChanged(bool increase) override;
 
   // ReadAnythingPageHandler::Delegate:
   void OnUIReady() override;
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc
index c0cb260..476f831 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator_unittest.cc
@@ -38,6 +38,7 @@
               (const ui::AXTreeUpdate& snapshot,
                const std::vector<ui::AXNodeID>& content_node_ids),
               (override));
+  MOCK_METHOD(void, OnFontSizeChanged, (float new_font_size), (override));
 };
 
 class ReadAnythingCoordinatorTest : public TestWithBrowserView {
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc
index 11bfdb1..75ee82b 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.cc
@@ -19,6 +19,9 @@
     font_model_->SetDefaultIndexFromPrefsFontName(prefs_font_name);
     font_name_ = prefs_font_name;
   }
+
+  // TODO(1266555): Add font size to users prefs and initialize here.
+  font_size_ = 18.0f;
 }
 
 ReadAnythingModel::~ReadAnythingModel() = default;
@@ -51,6 +54,17 @@
   NotifyAXTreeDistilled();
 }
 
+// TODO(1266555): Update with text scaling approach based on UI/UX feedback.
+void ReadAnythingModel::DecreaseTextSize() {
+  font_size_ *= 0.83333f;
+  NotifyFontSizeChanged();
+}
+
+void ReadAnythingModel::IncreaseTextSize() {
+  font_size_ *= 1.2f;
+  NotifyFontSizeChanged();
+}
+
 void ReadAnythingModel::NotifyFontNameUpdated() {
   for (Observer& obs : observers_) {
     obs.OnFontNameUpdated(font_name_);
@@ -63,6 +77,12 @@
   }
 }
 
+void ReadAnythingModel::NotifyFontSizeChanged() {
+  for (Observer& obs : observers_) {
+    obs.OnFontSizeChanged(font_size_);
+  }
+}
+
 ReadAnythingFontModel::ReadAnythingFontModel() {
   // TODO(1266555): Replace these with proper versions once finalized.
   font_choices_.emplace_back(u"Standard font");
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h
index 7e2e1f5e..ed9c4e0 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_model.h
@@ -65,6 +65,7 @@
     virtual void OnAXTreeDistilled(
         const ui::AXTreeUpdate& snapshot,
         const std::vector<ui::AXNodeID>& content_node_ids) = 0;
+    virtual void OnFontSizeChanged(const float new_font_size) = 0;
   };
 
   explicit ReadAnythingModel(std::string prefs_font_name);
@@ -77,16 +78,22 @@
 
   void SetDistilledAXTree(ui::AXTreeUpdate snapshot,
                           std::vector<ui::AXNodeID> content_node_ids);
+
   void SetSelectedFontByIndex(int new_index);
+  void DecreaseTextSize();
+  void IncreaseTextSize();
 
   ReadAnythingFontModel* GetFontModel() { return font_model_.get(); }
 
  private:
   void NotifyAXTreeDistilled();
   void NotifyFontNameUpdated();
+  void NotifyFontSizeChanged();
 
   // State:
   std::string font_name_;
+  float font_size_;
+
   // TODO(crbug.com/1266555): Use |snapshot_| and |content_node_ids_| to keep
   // scrolls in sync.
   ui::AXTreeUpdate snapshot_;
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc
index 3ec8095..cb8362d 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.cc
@@ -9,14 +9,18 @@
 
 #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_constants.h"
 #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_controller.h"
+#include "components/vector_icons/cc_macros.h"
 #include "components/vector_icons/vector_icons.h"
+#include "ui/color/color_id.h"
 #include "ui/color/color_provider.h"
 #include "ui/gfx/color_palette.h"
+#include "ui/gfx/color_utils.h"
 #include "ui/gfx/geometry/geometry_export.h"
+#include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/background.h"
-#include "ui/views/controls/button/image_button.h"
 #include "ui/views/controls/button/image_button_factory.h"
 #include "ui/views/controls/highlight_path_generator.h"
+#include "ui/views/controls/separator.h"
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/layout/layout_types.h"
 
@@ -48,8 +52,28 @@
   combobox->SetTooltipTextAndAccessibleName(u"Font Choice");
   combobox->SetModel(font_model);
 
+  // Create the decrease/increase text size buttons.
+  // TODO(1266555): These use placeholder text, update for final UI.
+  auto decrease_size_button = std::make_unique<ReadAnythingButtonView>(
+      base::BindRepeating(&ReadAnythingToolbarView::DecreaseFontSizeCallback,
+                          weak_pointer_factory_.GetWeakPtr()),
+      gfx::CreateVectorIcon(vector_icons::kTextDecreaseIcon, kSmallIconSize,
+                            gfx::kGoogleGrey700),
+      u"Decrease font size");
+
+  auto increase_size_button = std::make_unique<ReadAnythingButtonView>(
+      base::BindRepeating(&ReadAnythingToolbarView::IncreaseFontSizeCallback,
+                          weak_pointer_factory_.GetWeakPtr()),
+      gfx::CreateVectorIcon(vector_icons::kTextIncreaseIcon, kLargeIconSize,
+                            gfx::kGoogleGrey700),
+      u"Increase font size");
+
   // Add all views as children.
   font_combobox_ = AddChildView(std::move(combobox));
+  AddChildView(Separator());
+  decrease_text_size_button_ = AddChildView(std::move(decrease_size_button));
+  increase_text_size_button_ = AddChildView(std::move(increase_size_button));
+  AddChildView(Separator());
 }
 
 void ReadAnythingToolbarView::FontNameChangedCallback() {
@@ -57,6 +81,16 @@
     delegate_->OnFontChoiceChanged(font_combobox_->GetSelectedIndex());
 }
 
+void ReadAnythingToolbarView::DecreaseFontSizeCallback() {
+  if (delegate_)
+    delegate_->OnFontSizeChanged(/* increase = */ false);
+}
+
+void ReadAnythingToolbarView::IncreaseFontSizeCallback() {
+  if (delegate_)
+    delegate_->OnFontSizeChanged(/* increase = */ true);
+}
+
 void ReadAnythingToolbarView::OnCoordinatorDestroyed() {
   // When the coordinator that created |this| is destroyed, clean up pointers.
   coordinator_ = nullptr;
@@ -64,6 +98,27 @@
   font_combobox_->SetModel(nullptr);
 }
 
+std::unique_ptr<views::View> ReadAnythingToolbarView::Separator() {
+  // Create a simple separator with padding to be inserted into views.
+  auto separator_container = std::make_unique<views::View>();
+
+  auto separator_layout_manager = std::make_unique<views::BoxLayout>(
+      views::BoxLayout::Orientation::kHorizontal);
+  separator_layout_manager->set_inside_border_insets(
+      gfx::Insets(kButtonPadding)
+          .set_top(kSeparatorTopBottomPadding)
+          .set_bottom(kSeparatorTopBottomPadding));
+
+  separator_container->SetLayoutManager(std::move(separator_layout_manager));
+
+  auto separator = std::make_unique<views::Separator>();
+  separator->SetColorId(ui::kColorMenuSeparator);
+
+  separator_container->AddChildView(std::move(separator));
+
+  return separator_container;
+}
+
 ReadAnythingToolbarView::~ReadAnythingToolbarView() {
   // If |this| is being destroyed before the associated coordinator, then
   // remove |this| as an observer.
diff --git a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h
index 840e687c..d113a80 100644
--- a/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h
+++ b/chrome/browser/ui/views/side_panel/read_anything/read_anything_toolbar_view.h
@@ -7,6 +7,7 @@
 
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
+#include "chrome/browser/ui/views/side_panel/read_anything/read_anything_button_view.h"
 #include "chrome/browser/ui/views/side_panel/read_anything/read_anything_coordinator.h"
 #include "ui/base/models/combobox_model.h"
 #include "ui/views/controls/combobox/combobox.h"
@@ -25,6 +26,7 @@
   class Delegate {
    public:
     virtual void OnFontChoiceChanged(int new_choice) = 0;
+    virtual void OnFontSizeChanged(bool increase) = 0;
   };
 
   explicit ReadAnythingToolbarView(ReadAnythingCoordinator* coordinator);
@@ -37,8 +39,14 @@
 
  private:
   void FontNameChangedCallback();
+  void DecreaseFontSizeCallback();
+  void IncreaseFontSizeCallback();
+
+  std::unique_ptr<views::View> Separator();
 
   raw_ptr<views::Combobox> font_combobox_;
+  raw_ptr<ReadAnythingButtonView> decrease_text_size_button_;
+  raw_ptr<ReadAnythingButtonView> increase_text_size_button_;
   raw_ptr<ReadAnythingToolbarView::Delegate> delegate_;
   raw_ptr<ReadAnythingCoordinator> coordinator_;
 
diff --git a/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.cc b/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.cc
index 9228d5ce..11fae90 100644
--- a/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.cc
+++ b/chrome/browser/ui/views/side_panel/user_note/user_note_ui_coordinator.cc
@@ -95,6 +95,8 @@
 }
 
 void UserNoteUICoordinator::FocusNote(const base::UnguessableToken& guid) {
+  Show();
+
   auto* scroll_contents_view = scroll_view_->contents();
   for (views::View* child_view : scroll_contents_view->children()) {
     UserNoteView* user_note_view = views::AsViewClass<UserNoteView>(child_view);
@@ -108,9 +110,10 @@
 
 void UserNoteUICoordinator::StartNoteCreation(
     user_notes::UserNoteInstance* instance) {
-  scoped_view_observer_.Observe(scroll_view_);
+  Show();
 
   auto* scroll_contents_view = scroll_view_->contents();
+  scoped_view_observer_.Observe(scroll_contents_view);
   scroll_to_note_id_ = instance->model().id();
 
   int index = 0;
@@ -127,6 +130,8 @@
       std::make_unique<UserNoteView>(this, instance,
                                      UserNoteView::State::kCreating),
       index);
+
+  scroll_view_->Layout();
 }
 
 void UserNoteUICoordinator::OnViewBoundsChanged(views::View* observed_view) {
@@ -241,6 +246,12 @@
 void UserNoteUICoordinator::Show() {
   auto* side_panel_coordinator =
       BrowserView::GetBrowserViewForBrowser(browser_)->side_panel_coordinator();
+
+  if (side_panel_coordinator->GetCurrentEntryId() ==
+      SidePanelEntry::Id::kUserNote) {
+    return;
+  }
+
   side_panel_coordinator->Show(
       SidePanelEntry::Id::kUserNote,
       SidePanelUtil::SidePanelOpenTrigger::kNotesInPageContextMenu);
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller.cc b/chrome/browser/ui/views/tabs/tab_drag_controller.cc
index 440e582..caf8d576 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_controller.cc
+++ b/chrome/browser/ui/views/tabs/tab_drag_controller.cc
@@ -2436,9 +2436,6 @@
   const absl::optional<tab_groups::TabGroupId> updated_group =
       GetTabGroupForTargetIndex(selected_unpinned);
 
-  if (updated_group == attached_model->GetTabGroupForTab(selected_unpinned[0]))
-    return;
-
   attached_model->MoveTabsAndSetGroup(selected_unpinned, selected_unpinned[0],
                                       updated_group);
 }
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
index a628c17..9e9e8f4 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
+++ b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
@@ -1096,6 +1096,42 @@
   EXPECT_EQ(group_model->GetTabGroup(group3)->ListTabs(), gfx::Range(1, 4));
 }
 
+// Creates a browser with four tabs with third and fourth in a group.
+// Selecting and  dragging the second and third tabs towards left out
+// of the group will result in the tabs being ungrouped.
+IN_PROC_BROWSER_TEST_P(DetachToBrowserTabDragControllerTest,
+                       DragUngroupedTabGroupedTabOutsideGroup) {
+  ASSERT_TRUE(browser()->tab_strip_model()->SupportsTabGroups());
+
+  TabStrip* tab_strip = GetTabStripForBrowser(browser());
+  TabStripModel* model = browser()->tab_strip_model();
+  TabGroupModel* group_model = model->group_model();
+
+  AddTabsAndResetBrowser(browser(), 3);
+  tab_groups::TabGroupId group1 = model->AddToNewGroup({2, 3});
+  StopAnimating(tab_strip);
+  EnsureFocusToTabStrip(tab_strip);
+
+  // Click the second tab and select third tab so both second and third tabs
+  // are selected.
+  ASSERT_TRUE(PressInput(GetCenterInScreenCoordinates(tab_strip->tab_at(1))));
+  ASSERT_TRUE(ReleaseInput());
+  browser()->tab_strip_model()->ToggleSelectionAt(2);
+
+  // Dragging the third tab slightly to the left will result in the two
+  // selected tabs leaving the group.
+  const gfx::Point first_tab_screen_center =
+      GetCenterInScreenCoordinates(tab_strip->tab_at(0));
+
+  ASSERT_TRUE(PressInput(GetCenterInScreenCoordinates(tab_strip->tab_at(2))));
+  ASSERT_TRUE(DragInputTo(first_tab_screen_center));
+  ASSERT_TRUE(ReleaseInput());
+  StopAnimating(tab_strip);
+
+  EXPECT_EQ("1 2 0 3", IDString(model));
+  EXPECT_EQ(group_model->GetTabGroup(group1)->ListTabs(), gfx::Range(3, 4));
+}
+
 // Creates a browser with four tabs. The first two tabs are in Tab Group 1.
 // Dragging the third tab over one to the left will result in the tab joining
 // Tab Group 1. While this drag is still in session, pressing escape will revert
diff --git a/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.cc b/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.cc
index 841633a..4e399de 100644
--- a/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.cc
@@ -129,42 +129,49 @@
   // The difference between a nearby::fastpair::FastPairDevice and a
   // nearby::fastpair::StoredDiscoveryItem is that although they represent the
   // same devices saved to a user's account, the FastPairDevice contains the
-  // raw byte array with the device name and the image url, which we will
-  // parse into a StoredDiscoveryItem to access the image url as strings. We
+  // raw byte array with the device name and the image bytes, which we will
+  // parse into a StoredDiscoveryItem to access the image bytes as strings. We
   // create a flat set of these strings in the case that the
-  // user has the same device multiple times, we only decode the image url
+  // user has the same device multiple times, we only decode the image bytes
   // once.
   devices_ = devices;
-  base::flat_set<std::string> image_urls;
+  base::flat_set<std::string> image_byte_strings;
   for (const auto& device : devices) {
     nearby::fastpair::StoredDiscoveryItem item;
     if (item.ParseFromString(device.discovery_item_bytes()) &&
-        item.has_display_url()) {
-      image_urls.insert(item.display_url());
+        item.has_icon_png()) {
+      image_byte_strings.insert(item.icon_png());
     }
   }
 
+  if (image_byte_strings.empty()) {
+    QP_LOG(VERBOSE) << __func__ << ": no device images";
+    DecodingUrlsFinished();
+    return;
+  }
+
   // Image decoding occurs asynchronously in a separate process, so we use
   // a AtomicRefCounter to keep track of the pending tasks remaining, and once
   // they complete, we can continue parsing the saved device data to communicate
   // with the settings page.
   pending_decoding_tasks_count_ =
-      std::make_unique<base::AtomicRefCount>(image_urls.size());
-  for (std::string image_url : image_urls) {
-    image_decoder_->DecodeImageFromUrl(
-        GURL(image_url),
+      std::make_unique<base::AtomicRefCount>(image_byte_strings.size());
+  for (std::string image_byte_string : image_byte_strings) {
+    image_decoder_->DecodeImage(
+        std::vector<uint8_t>(image_byte_string.begin(),
+                             image_byte_string.end()),
         /*resize_to_notification_size=*/false,
         base::BindOnce(&FastPairSavedDevicesHandler::SaveImageAsBase64,
-                       weak_ptr_factory_.GetWeakPtr(), image_url));
+                       weak_ptr_factory_.GetWeakPtr(), image_byte_string));
   }
 }
 
 void FastPairSavedDevicesHandler::SaveImageAsBase64(
-    const std::string& image_url,
+    const std::string& image_byte_string,
     gfx::Image image) {
   if (!image.IsEmpty()) {
     std::string encoded_image = webui::GetBitmapDataUrl(image.AsBitmap());
-    image_url_to_encoded_url_map_[image_url] = encoded_image;
+    image_byte_string_to_encoded_url_map_[image_byte_string] = encoded_image;
   }
 
   // Even if the image is empty, we want to decrement our task counter to
@@ -185,13 +192,16 @@
   saved_devices_list.reserve(devices_.size());
 
   // |nearby::fastpair::StoredDiscoveryItem| contains information about
-  // the device name, |image_url_to_encoded_url_map_| contains the base64
-  // encoded urls for the images, and |nearby::fastpair::FastPairDevice|
+  // the device name, |image_byte_string_to_encoded_url_map_| contains the
+  // base64 encoded urls for the images, and |nearby::fastpair::FastPairDevice|
   // contains the account key. Here, we reconcile this data for each device
   // and convert it to dictionary, to be communicated to the settings page.
   for (const auto& device : devices_) {
     // If the device does not have an account key, then it was not properly
-    // saved to the user's account, and we ignore these devices.
+    // saved to the user's account, and we ignore these devices. Android
+    // has devices still in Footprints but marked as deleted by removing the
+    // account key, so it is not expected for all of these devices to have
+    // account keys.
     if (!device.has_account_key())
       continue;
 
@@ -199,13 +209,14 @@
     std::string image_url = "";
     nearby::fastpair::StoredDiscoveryItem item;
     if (item.ParseFromString(device.discovery_item_bytes()) &&
-        item.has_display_url() &&
-        base::Contains(image_url_to_encoded_url_map_, item.display_url())) {
-      image_url = image_url_to_encoded_url_map_[item.display_url()];
+        item.has_icon_png() &&
+        base::Contains(image_byte_string_to_encoded_url_map_,
+                       item.icon_png())) {
+      image_url = image_byte_string_to_encoded_url_map_[item.icon_png()];
     }
 
     saved_devices_list.Append(SavedDeviceToDictionary(
-        /*device_name=*/item.has_device_name() ? item.device_name() : "",
+        /*device_name=*/item.has_title() ? item.title() : "",
         /*image_url=*/image_url,
         /*account_key=*/account_key));
   }
@@ -217,7 +228,7 @@
   // We reset the state here for another page load that may happened while
   // chrome://os-settings is open, since our decoding tasks are completed.
   devices_.clear();
-  image_url_to_encoded_url_map_.clear();
+  image_byte_string_to_encoded_url_map_.clear();
   pending_decoding_tasks_count_.reset();
   loading_saved_device_page_ = false;
 }
diff --git a/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.h b/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.h
index b509dff..51a9ec0 100644
--- a/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.h
+++ b/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.h
@@ -39,7 +39,8 @@
   void HandleLoadSavedDevicePage(const base::Value::List& args);
   void OnGetSavedDevices(nearby::fastpair::OptInStatus status,
                          std::vector<nearby::fastpair::FastPairDevice> devices);
-  void SaveImageAsBase64(const std::string& image_url, gfx::Image image);
+  void SaveImageAsBase64(const std::string& image_byte_string,
+                         gfx::Image image);
   void DecodingUrlsFinished();
 
   void HandleRemoveSavedDevice(const base::Value::List& args);
@@ -57,7 +58,8 @@
   // for security reasons. This map is used to store the encoded urls created
   // in async calls to be used when we create our dictionary to give to
   // chrome://os-settings for display.
-  base::flat_map<std::string, std::string> image_url_to_encoded_url_map_;
+  base::flat_map<std::string, std::string>
+      image_byte_string_to_encoded_url_map_;
 
   base::WeakPtrFactory<FastPairSavedDevicesHandler> weak_ptr_factory_{this};
 };
diff --git a/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler_unittest.cc
index abdcf6d..78abec8d 100644
--- a/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/webui/settings/chromeos/fast_pair_saved_devices_handler.h"
 
+#include "ash/quick_pair/common/logging.h"
 #include "ash/quick_pair/common/mock_quick_pair_browser_delegate.h"
 #include "ash/quick_pair/proto/fastpair.pb.h"
 #include "ash/quick_pair/proto/fastpair_data.pb.h"
@@ -51,63 +52,45 @@
     "zAXrTQLGi/OgEwAAAABJRU5ErkJggg==";
 
 const char kDeviceName1[] = "I16max";
-const char kDisplayUrl1[] =
-    "https://lh3.googleusercontent.com/"
-    "k8zVfbUX1vo44utJCdVzEf9hkmijQfHLCMc2cidJfrnvH62rblJ5LH32gfQce6XnAPB1LwwTVh"
-    "vSPEw3c7OxMCw";
+const char kImageBytes1[] = "01010101001010101010101010101";
 const std::vector<uint8_t> kAccountKey1 = {0xA0, 0xBA, 0xF0, 0xBB, 0x95, 0x1F,
                                            0xF7, 0xB6, 0xCF, 0x5E, 0x3F, 0x45,
                                            0x61, 0xC3, 0x32, 0x1D};
 const char kDeviceName2[] = "JBL Flip 6";
-const char kDisplayUrl2[] =
-    "https://lh3-dz.googleusercontent.com/"
-    "Bw8fRUbTFyZhUU5wge68od-"
-    "6RXdoeuGs3uMZbFm8zvpKtI6hTxiLlNU7cbeHlB1pPL3n2jHyqcIae7B0giXGTQ";
+const char kImageBytes2[] = "111110101001010101001010101111";
 const std::vector<uint8_t> kAccountKey2 = {0xA1, 0xBA, 0xF0, 0xBB, 0x95, 0x1F,
                                            0xF7, 0xB6, 0xCD, 0x5E, 0x3F, 0x45,
                                            0x61, 0xC3, 0x32, 0x1D};
 const char kDeviceName3[] = "Pixel Buds";
-const char kDisplayUrl3[] =
-    "https://lh3.googleusercontent.com/"
-    "pCvLoM4hzVoFiqTSTUkLg7puZfpBTvBLr6PBSZYDoeIsaxwcaSkPGqOfdJ5fuaVa3PKT71qrF6"
-    "5KJrBYX-K-Xg";
+const char kImageBytes3[] = "00000010101100110101010010101001";
 const std::vector<uint8_t> kAccountKey3 = {0xA6, 0xB0, 0xF0, 0xBB, 0x95, 0x1F,
                                            0xF7, 0xB6, 0xCD, 0x5E, 0x3F, 0x45,
                                            0x68, 0xC3, 0x32, 0x1D};
 const char kDeviceName4[] = "Wyze Buds";
-const char kDisplayUrl4[] =
-    "https://lh3.googleusercontent.com/"
-    "NTEvjDWCU9v5T6D80kGMzG-"
-    "ziGKRYhEW093j5YYEoat56UODs9sk8L2kkfF0570psmClMLfDlyHD0yEhDmTIZg";
+const char kImageBytes4[] = "11111000101010010101";
 const std::vector<uint8_t> kAccountKey4 = {0xB0, 0xB6, 0xF0, 0xBB, 0x95, 0x1F,
                                            0xF7, 0xB6, 0xCF, 0x5E, 0x3F, 0x45,
                                            0x61, 0xC3, 0x32, 0x1D};
 
 const char kDeviceName5[] = "B&O Beoplay E6";
-const char kDisplayUrl5[] =
-    "https://lh3.googleusercontent.com/"
-    "Af3OOuFVJasO6MMnfA59I4_KoemT79Q7bYy-aN7pXPvSsyPHdYdQh4mtAUKUuo_zgvZsQ_"
-    "egiAmloPCpgg";
+const char kImageBytes5[] = "110000100010000100010100000001001000100001";
 const std::vector<uint8_t> kAccountKey5 = {0xC0, 0xC6, 0xD0, 0xBB, 0x95, 0x1F,
                                            0xF7, 0xB6, 0xCF, 0x5E, 0x3F, 0x45,
                                            0x61, 0xC3, 0x32, 0x1D};
 
 const char kDeviceName6[] = "LG HBS-830";
-const char kDisplayUrl6[] =
-    "https://lh3.googleusercontent.com/"
-    "40-bd0-Jt7puzW1x7gRnub2KsIx6qWP5g8Qx_vhAF4-"
-    "eJZiGVEIirRD7g3KxkmZ53X2VoMWRkg4d6uopNkc";
+const char kImageBytes6[] = "11110100011111111010100101001010100101010011";
 const std::vector<uint8_t> kAccountKey6 = {0xB5, 0xB6, 0xF0, 0xBB, 0x95, 0x1F,
                                            0xF7, 0xB8, 0xCF, 0x5E, 0x3F, 0x45,
                                            0x61, 0xC3, 0x36, 0x1D};
 
 nearby::fastpair::FastPairDevice CreateFastPairDevice(
     const std::string device_name,
-    const std::string image_url,
+    const std::string image_bytes,
     const std::vector<uint8_t>& account_key) {
   nearby::fastpair::StoredDiscoveryItem item;
-  item.set_device_name(device_name);
-  item.set_display_url(image_url);
+  item.set_title(device_name);
+  item.set_icon_png(image_bytes);
 
   nearby::fastpair::FastPairDevice device;
   device.set_account_key(std::string(account_key.begin(), account_key.end()));
@@ -171,8 +154,7 @@
         std::make_unique<ash::quick_pair::MockFastPairImageDecoder>();
     mock_decoder_ = mock_decoder.get();
     // On call to DecodeImage, run the third argument callback with test_image_.
-    ON_CALL(*mock_decoder,
-            DecodeImageFromUrl(testing::_, testing::_, testing::_))
+    ON_CALL(*mock_decoder, DecodeImage(testing::_, testing::_, testing::_))
         .WillByDefault(base::test::RunOnceCallback<2>(test_image_));
 
     handler_ = std::make_unique<TestFastPairSavedDevicesHandler>(
@@ -184,24 +166,24 @@
   content::TestWebUI* test_web_ui() { return test_web_ui_.get(); }
 
   void InitializeSavedDevicesList(const std::string& device_name1,
-                                  const std::string& device_url1,
+                                  const std::string& device_image_bytes1,
                                   const std::vector<uint8_t>& account_key1,
                                   const std::string& device_name2,
-                                  const std::string& device_url2,
+                                  const std::string& device_image_bytes2,
                                   const std::vector<uint8_t>& account_key2,
                                   const std::string& device_name3,
-                                  const std::string& device_url3,
+                                  const std::string& device_image_bytes3,
                                   const std::vector<uint8_t>& account_key3,
                                   nearby::fastpair::OptInStatus opt_in_status) {
     std::vector<nearby::fastpair::FastPairDevice> devices{
         CreateFastPairDevice(/*device_name=*/device_name1,
-                             /*image_url=*/device_url1,
+                             /*image_bytes=*/device_image_bytes1,
                              /*account_key=*/account_key1),
         CreateFastPairDevice(/*device_name=*/device_name2,
-                             /*image_url=*/device_url2,
+                             /*image_bytes=*/device_image_bytes2,
                              /*account_key=*/account_key2),
         CreateFastPairDevice(/*device_name=*/device_name3,
-                             /*image_url=*/device_url3,
+                             /*image_bytes=*/device_image_bytes3,
                              /*account_key=*/account_key3)};
     fast_pair_repository_.SetSavedDevices(
         /*status=*/opt_in_status,
@@ -230,6 +212,7 @@
     const base::Value::List* saved_devices_list =
         saved_devices_list_call_data.arg2()->GetIfList();
     ASSERT_EQ(3u, saved_devices_list->size());
+
     ASSERT_TRUE(
         VerifyDeviceInList(/*device=*/*(saved_devices_list->begin()),
                            /*expected_device_name=*/device_name1,
@@ -294,10 +277,10 @@
 
 TEST_F(FastPairSavedDevicesHandlerTest, GetSavedDevices) {
   InitializeSavedDevicesList(
-      /*device_name1=*/kDeviceName1, /*device_url1=*/kDisplayUrl1,
+      /*device_name1=*/kDeviceName1, /*device_image_bytes1=*/kImageBytes1,
       /*account_key1=*/kAccountKey1, /*device_name2=*/kDeviceName2,
-      /*device_url2=*/kDisplayUrl2, /*account_key2=*/kAccountKey2,
-      /*device_name3=*/kDeviceName3, /*device_url3=*/kDisplayUrl3,
+      /*device_image_bytes2=*/kImageBytes2, /*account_key2=*/kAccountKey2,
+      /*device_name3=*/kDeviceName3, /*device_image_bytes3=*/kImageBytes3,
       /*account_key3=*/kAccountKey3,
       /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN);
   LoadPage();
@@ -320,10 +303,10 @@
 
 TEST_F(FastPairSavedDevicesHandlerTest, ReloadBeforePageLoadsIgnored) {
   InitializeSavedDevicesList(
-      /*device_name1=*/kDeviceName1, /*device_url1=*/kDisplayUrl1,
+      /*device_name1=*/kDeviceName1, /*device_image_bytes1=*/kImageBytes1,
       /*account_key1=*/kAccountKey1, /*device_name2=*/kDeviceName2,
-      /*device_url2=*/kDisplayUrl2, /*account_key2=*/kAccountKey2,
-      /*device_name3=*/kDeviceName3, /*device_url3=*/kDisplayUrl3,
+      /*device_image_bytes2=*/kImageBytes2, /*account_key2=*/kAccountKey2,
+      /*device_name3=*/kDeviceName3, /*device_image_bytes3=*/kImageBytes3,
       /*account_key3=*/kAccountKey3,
       /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN);
 
@@ -352,10 +335,10 @@
 
 TEST_F(FastPairSavedDevicesHandlerTest, ReloadAfterPageLoads) {
   InitializeSavedDevicesList(
-      /*device_name1=*/kDeviceName1, /*device_url1=*/kDisplayUrl1,
+      /*device_name1=*/kDeviceName1, /*device_image_bytes1=*/kImageBytes1,
       /*account_key1=*/kAccountKey1, /*device_name2=*/kDeviceName2,
-      /*device_url2=*/kDisplayUrl2, /*account_key2=*/kAccountKey2,
-      /*device_name3=*/kDeviceName3, /*device_url3=*/kDisplayUrl3,
+      /*device_image_bytes2=*/kImageBytes2, /*account_key2=*/kAccountKey2,
+      /*device_name3=*/kDeviceName3, /*device_image_bytes3=*/kImageBytes3,
       /*account_key3=*/kAccountKey3,
       /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN);
   LoadPage();
@@ -415,10 +398,10 @@
 
 TEST_F(FastPairSavedDevicesHandlerTest, SavedDevicesBecomesEmpty) {
   InitializeSavedDevicesList(
-      /*device_name1=*/kDeviceName1, /*device_url1=*/kDisplayUrl1,
+      /*device_name1=*/kDeviceName1, /*device_image_bytes1=*/kImageBytes1,
       /*account_key1=*/kAccountKey1, /*device_name2=*/kDeviceName2,
-      /*device_url2=*/kDisplayUrl2, /*account_key2=*/kAccountKey2,
-      /*device_name3=*/kDeviceName3, /*device_url3=*/kDisplayUrl3,
+      /*device_image_bytes2=*/kImageBytes2, /*account_key2=*/kAccountKey2,
+      /*device_name3=*/kDeviceName3, /*device_image_bytes3=*/kImageBytes3,
       /*account_key3=*/kAccountKey3,
       /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN);
   LoadPage();
@@ -451,10 +434,10 @@
 
 TEST_F(FastPairSavedDevicesHandlerTest, SavedDevicesChanges) {
   InitializeSavedDevicesList(
-      /*device_name1=*/kDeviceName1, /*device_url1=*/kDisplayUrl1,
+      /*device_name1=*/kDeviceName1, /*device_image_bytes1=*/kImageBytes1,
       /*account_key1=*/kAccountKey1, /*device_name2=*/kDeviceName2,
-      /*device_url2=*/kDisplayUrl2, /*account_key2=*/kAccountKey2,
-      /*device_name3=*/kDeviceName3, /*device_url3=*/kDisplayUrl3,
+      /*device_image_bytes2=*/kImageBytes2, /*account_key2=*/kAccountKey2,
+      /*device_name3=*/kDeviceName3, /*device_image_bytes3=*/kImageBytes3,
       /*account_key3=*/kAccountKey3,
       /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN);
   LoadPage();
@@ -472,10 +455,10 @@
       /*account_key3=*/kAccountKey3);
 
   InitializeSavedDevicesList(
-      /*device_name1=*/kDeviceName4, /*device_url1=*/kDisplayUrl4,
+      /*device_name1=*/kDeviceName4, /*device_image_bytes1=*/kImageBytes4,
       /*account_key1=*/kAccountKey4, /*device_name2=*/kDeviceName5,
-      /*device_url2=*/kDisplayUrl5, /*account_key2=*/kAccountKey5,
-      /*device_name3=*/kDeviceName6, /*device_url3=*/kDisplayUrl6,
+      /*device_image_bytes2=*/kImageBytes5, /*account_key2=*/kAccountKey5,
+      /*device_name3=*/kDeviceName6, /*device_image_bytes3=*/kImageBytes6,
       /*account_key3=*/kAccountKey6,
       /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN);
   LoadPage();
@@ -494,14 +477,13 @@
 }
 
 TEST_F(FastPairSavedDevicesHandlerTest, EmptyImageSentToWebUi) {
-  ON_CALL(*mock_decoder_,
-          DecodeImageFromUrl(testing::_, testing::_, testing::_))
+  ON_CALL(*mock_decoder_, DecodeImage(testing::_, testing::_, testing::_))
       .WillByDefault(base::test::RunOnceCallback<2>(gfx::Image()));
   InitializeSavedDevicesList(
-      /*device_name1=*/kDeviceName1, /*device_url1=*/kDisplayUrl1,
+      /*device_name1=*/kDeviceName1, /*device_image_bytes1=*/kImageBytes1,
       /*account_key1=*/kAccountKey1, /*device_name2=*/kDeviceName2,
-      /*device_url2=*/kDisplayUrl2, /*account_key2=*/kAccountKey2,
-      /*device_name3=*/kDeviceName3, /*device_url3=*/kDisplayUrl3,
+      /*device_image_bytes2=*/kImageBytes2, /*account_key2=*/kAccountKey2,
+      /*device_name3=*/kDeviceName3, /*device_image_bytes3=*/kImageBytes3,
       /*account_key3=*/kAccountKey3,
       /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN);
   LoadPage();
@@ -522,10 +504,10 @@
 
 TEST_F(FastPairSavedDevicesHandlerTest, RemoveSavedDevice) {
   InitializeSavedDevicesList(
-      /*device_name1=*/kDeviceName1, /*device_url1=*/kDisplayUrl1,
+      /*device_name1=*/kDeviceName1, /*device_image_bytes1=*/kImageBytes1,
       /*account_key1=*/kAccountKey1, /*device_name2=*/kDeviceName2,
-      /*device_url2=*/kDisplayUrl2, /*account_key2=*/kAccountKey2,
-      /*device_name3=*/kDeviceName3, /*device_url3=*/kDisplayUrl3,
+      /*device_image_bytes2=*/kImageBytes2, /*account_key2=*/kAccountKey2,
+      /*device_name3=*/kDeviceName3, /*device_image_bytes3=*/kImageBytes3,
       /*account_key3=*/kAccountKey3,
       /*opt_in_status=*/nearby::fastpair::OptInStatus::STATUS_OPTED_IN);
   LoadPage();
diff --git a/chrome/browser/ui/webui/settings/chromeos/privacy_hub_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/privacy_hub_handler_unittest.cc
index afefe678..6143c823 100644
--- a/chrome/browser/ui/webui/settings/chromeos/privacy_hub_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/privacy_hub_handler_unittest.cc
@@ -76,9 +76,8 @@
       }
 
       // Assume that the data is stored in the last valid arg.
-      for (const base::Value* arg :
-           {data->arg4(), data->arg3(), data->arg2()}) {
-        if (arg)
+      for (const auto& arg : base::Reversed(data->args())) {
+        if (arg && arg.get() != data->arg1())
           return arg->Clone();
       }
     }
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc
index 73df7c33b..3938ee76 100644
--- a/chrome/browser/ui/webui/settings/settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -292,6 +292,11 @@
       "enableAutofillAssistant",
       password_manager::features::IsAutomatedPasswordChangeEnabled());
 
+  html_source->AddBoolean(
+      "enableAutomaticPasswordChangeInSettings",
+      base::FeatureList::IsEnabled(
+          password_manager::features::kPasswordChangeInSettings));
+
 #if !BUILDFLAG(IS_CHROMEOS)
   html_source->AddBoolean(
       "enableDesktopDetailedLanguageSettings",
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.cc b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.cc
index 9e644c7..23c446fc 100644
--- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.cc
+++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.cc
@@ -63,3 +63,7 @@
     const std::string& new_font_name) {
   page_->OnFontNameChange(std::move(new_font_name));
 }
+
+void ReadAnythingPageHandler::OnFontSizeChanged(const float new_font_size) {
+  page_->OnFontSizeChanged(new_font_size);
+}
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.h b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.h
index 699ea390..7a86c05 100644
--- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.h
+++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_page_handler.h
@@ -52,6 +52,7 @@
   void OnAXTreeDistilled(
       const ui::AXTreeUpdate& snapshot,
       const std::vector<ui::AXNodeID>& content_node_ids) override;
+  void OnFontSizeChanged(const float new_font_size) override;
 
   // ReadAnythingCoordinator::Observer:
   void OnCoordinatorDestroyed() override;
diff --git a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
index f2a355a..4c7c196 100644
--- a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
+++ b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
@@ -788,8 +788,15 @@
                                       ManifestUpdateResult::kAppUpToDate, 1);
 }
 
+// TODO(crbug.com/1342625): Test is flaky.
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS)
+#define MAYBE_CheckNameUpdatesForDefaultApps \
+  DISABLED_CheckNameUpdatesForDefaultApps
+#else
+#define MAYBE_CheckNameUpdatesForDefaultApps CheckNameUpdatesForDefaultApps
+#endif
 IN_PROC_BROWSER_TEST_F(ManifestUpdateManagerBrowserTest,
-                       CheckNameUpdatesForDefaultApps) {
+                       MAYBE_CheckNameUpdatesForDefaultApps) {
   constexpr char kManifestTemplate[] = R"(
     {
       "name": "$1",
@@ -1283,8 +1290,16 @@
             http_server_.GetURL("/"));
 }
 
+// TODO(crbug.com/1342625): Test is flaky.
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS)
+#define MAYBE_CheckDoesApplyIconURLChangeForDefaultApps \
+  DISABLED_CheckDoesApplyIconURLChangeForDefaultApps
+#else
+#define MAYBE_CheckDoesApplyIconURLChangeForDefaultApps \
+  CheckDoesApplyIconURLChangeForDefaultApps
+#endif
 IN_PROC_BROWSER_TEST_F(ManifestUpdateManagerBrowserTest,
-                       CheckDoesApplyIconURLChangeForDefaultApps) {
+                       MAYBE_CheckDoesApplyIconURLChangeForDefaultApps) {
   // This test changes the scope and also the icon list. The scope should update
   // along with the icons.
   constexpr char kManifestTemplate[] = R"(
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index ac68059..d8ae4066 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1657195044-3c86484fed2a862220df0aeccac563af5c3b0382.profdata
+chrome-linux-main-1657216488-964c1af31a57f69ad7c96efc5ae8bf09b66ba8c5.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index a2f042c..e4d2f12 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1657173309-cc6b6d1fb1c12e1b6efa16ace4cc6d27897ae21a.profdata
+chrome-mac-arm-main-1657195044-bdc21327076ea0bf11bc33a0cd128af31cd79101.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index e4c55da..cefd2ae 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1657173309-5a4a53b0cd160a5cf4e4cd15db3c9dc0b0313df4.profdata
+chrome-mac-main-1657195044-3da3f90aa1353824f081911d64c98f76df120c2d.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 70adce4..b33eb4a 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1657162680-887c20482644b3f27a8d31e9fbea7c20776fc28e.profdata
+chrome-win32-main-1657195044-193c962b3200db57362fb83e5aa3345b410bf261.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 954120c..7305c13 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1657184339-1d54fb4a6688e24248bedce2767937a3d6973927.profdata
+chrome-win64-main-1657206003-8700049f94a1e67edaf33366fef93cd62e950a67.profdata
diff --git a/chrome/common/accessibility/read_anything.mojom b/chrome/common/accessibility/read_anything.mojom
index f75f786..ec4a65d1 100644
--- a/chrome/common/accessibility/read_anything.mojom
+++ b/chrome/common/accessibility/read_anything.mojom
@@ -31,4 +31,7 @@
 
   // Send an updated font name to front end.
   OnFontNameChange(string new_font_name);
+
+  // Send an updated font size to front end.
+  OnFontSizeChanged(float new_font_size);
 };
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 41625e9..5d45112 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -790,8 +790,14 @@
                                             base::FEATURE_DISABLED_BY_DEFAULT};
 
 // Shows a confirmation dialog when updates to a PWAs name has been detected.
-const base::Feature kPwaUpdateDialogForName{"PwaUpdateDialogForName",
-                                            base::FEATURE_ENABLED_BY_DEFAULT};
+const base::Feature kPwaUpdateDialogForName {
+  "PwaUpdateDialogForName",
+#if BUILDFLAG(IS_ANDROID)
+      base::FEATURE_DISABLED_BY_DEFAULT
+#else
+      base::FEATURE_ENABLED_BY_DEFAULT
+#endif
+};
 
 // Enables using quiet prompts for notification permission requests.
 const base::Feature kQuietNotificationPrompts{"QuietNotificationPrompts",
diff --git a/chrome/common/extensions/api/passwords_private.idl b/chrome/common/extensions/api/passwords_private.idl
index 7c5e77eb..28ce5e1 100644
--- a/chrome/common/extensions/api/passwords_private.idl
+++ b/chrome/common/extensions/api/passwords_private.idl
@@ -232,7 +232,18 @@
     DOMString? note;
   };
 
+  // Object describing the IDs of credentials after a changeSavedPassword call.
+  dictionary CredentialIds {
+    // ID of the credential stored in the account store. Can be null if the
+    // credential is not stored in the account store.
+    long? accountId;
+    // ID of the credential stored in the device store. Can be null if the
+    // credential is not stored in the device store.
+    long? deviceId;
+  };
+
   callback PlaintextPasswordCallback = void(DOMString password);
+  callback ChangeSavedPasswordCallback = void(CredentialIds newIds);
   callback PasswordListCallback = void(PasswordUiEntry[] entries);
   callback ExceptionListCallback = void(ExceptionEntry[] exceptions);
   callback ExportProgressStatusCallback = void(ExportProgressStatus status);
@@ -262,7 +273,7 @@
     [supportsPromises] static void changeSavedPassword(
         long[] ids,
         ChangeSavedPasswordParams params,
-        optional VoidCallback callback);
+        optional ChangeSavedPasswordCallback callback);
 
     // Removes the saved password corresponding to |id|. If no saved password
     // for this pair exists, this function is a no-op. |id|: The id for the
@@ -401,6 +412,11 @@
         boolean isManualFlow,
         optional VoidCallback callback);
 
+    // Refreshes the cache for automatic password change scripts if it is stale.
+    // Invokes `callback` on completion.
+    [supportsPromises] static void refreshScriptsIfNecessary(
+        optional VoidCallback callback);
+
     // Starts a check for insecure passwords. Invokes |callback| on completion.
     [supportsPromises] static void startPasswordCheck(
         optional VoidCallback callback);
diff --git a/chrome/renderer/accessibility/read_anything_app_controller.cc b/chrome/renderer/accessibility/read_anything_app_controller.cc
index dfa8365..77aa378 100644
--- a/chrome/renderer/accessibility/read_anything_app_controller.cc
+++ b/chrome/renderer/accessibility/read_anything_app_controller.cc
@@ -206,12 +206,21 @@
   render_frame_->ExecuteJavaScript(base::ASCIIToUTF16(script));
 }
 
+void ReadAnythingAppController::OnFontSizeChanged(const float new_font_size) {
+  font_size_ = new_font_size;
+
+  // TODO: Use v*::Function rather than javascript.
+  std::string script = "chrome.readAnything.updateFontSize();";
+  render_frame_->ExecuteJavaScript(base::ASCIIToUTF16(script));
+}
+
 gin::ObjectTemplateBuilder ReadAnythingAppController::GetObjectTemplateBuilder(
     v8::Isolate* isolate) {
   return gin::Wrappable<ReadAnythingAppController>::GetObjectTemplateBuilder(
              isolate)
       .SetProperty("contentNodeIds", &ReadAnythingAppController::ContentNodeIds)
       .SetProperty("fontName", &ReadAnythingAppController::FontName)
+      .SetProperty("fontSize", &ReadAnythingAppController::FontSize)
       .SetMethod("getChildren", &ReadAnythingAppController::GetChildren)
       .SetMethod("getHeadingLevel", &ReadAnythingAppController::GetHeadingLevel)
       .SetMethod("getTextContent", &ReadAnythingAppController::GetTextContent)
@@ -235,6 +244,10 @@
   return font_name_;
 }
 
+float ReadAnythingAppController::FontSize() {
+  return font_size_;
+}
+
 std::vector<ui::AXNodeID> ReadAnythingAppController::GetChildren(
     ui::AXNodeID ax_node_id) {
   std::vector<ui::AXNodeID> child_ids;
diff --git a/chrome/renderer/accessibility/read_anything_app_controller.h b/chrome/renderer/accessibility/read_anything_app_controller.h
index 3eaeec51..f4010a1 100644
--- a/chrome/renderer/accessibility/read_anything_app_controller.h
+++ b/chrome/renderer/accessibility/read_anything_app_controller.h
@@ -67,10 +67,12 @@
       const ui::AXTreeUpdate& snapshot,
       const std::vector<ui::AXNodeID>& content_node_ids) override;
   void OnFontNameChange(const std::string& new_font_name) override;
+  void OnFontSizeChanged(const float new_font_size) override;
 
   // gin templates:
   std::vector<ui::AXNodeID> ContentNodeIds();
   std::string FontName();
+  float FontSize();
   std::vector<ui::AXNodeID> GetChildren(ui::AXNodeID ax_node_id);
   uint32_t GetHeadingLevel(ui::AXNodeID ax_node_id);
   std::string GetTextContent(ui::AXNodeID ax_node_id);
@@ -113,6 +115,7 @@
   std::unique_ptr<ui::AXTree> tree_;
   std::vector<ui::AXNodeID> content_node_ids_;
   std::string font_name_;
+  float font_size_;
 };
 
 #endif  // CHROME_RENDERER_ACCESSIBILITY_READ_ANYTHING_APP_CONTROLLER_H_
diff --git a/chrome/renderer/chrome_render_thread_observer.cc b/chrome/renderer/chrome_render_thread_observer.cc
index f99e226..d566a876 100644
--- a/chrome/renderer/chrome_render_thread_observer.cc
+++ b/chrome/renderer/chrome_render_thread_observer.cc
@@ -39,7 +39,6 @@
 #include "content/public/common/content_switches.h"
 #include "content/public/common/resource_usage_reporter_type_converters.h"
 #include "content/public/renderer/render_thread.h"
-#include "content/public/renderer/render_view_visitor.h"
 #include "extensions/buildflags/buildflags.h"
 #include "ipc/ipc_sync_channel.h"
 #include "media/base/localized_strings.h"
diff --git a/chrome/services/file_util/public/cpp/sandboxed_dmg_analyzer_mac.cc b/chrome/services/file_util/public/cpp/sandboxed_dmg_analyzer_mac.cc
index 18d6902e..db33e01 100644
--- a/chrome/services/file_util/public/cpp/sandboxed_dmg_analyzer_mac.cc
+++ b/chrome/services/file_util/public/cpp/sandboxed_dmg_analyzer_mac.cc
@@ -83,8 +83,6 @@
 
 void SandboxedDMGAnalyzer::AnalyzeFile(base::File file) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  base::UmaHistogramBoolean("SBClientDownload.DmgAnalysisRemoteValid",
-                            remote_analyzer_.is_bound());
   if (remote_analyzer_) {
     remote_analyzer_->AnalyzeDmgFile(
         std::move(file),
diff --git a/chrome/services/file_util/public/cpp/sandboxed_document_analyzer.cc b/chrome/services/file_util/public/cpp/sandboxed_document_analyzer.cc
index f3cc2e9..12a13c6413 100644
--- a/chrome/services/file_util/public/cpp/sandboxed_document_analyzer.cc
+++ b/chrome/services/file_util/public/cpp/sandboxed_document_analyzer.cc
@@ -68,8 +68,6 @@
     const base::FilePath& file_path) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-  base::UmaHistogramBoolean("SBClientDownload.DocumentAnalysisRemoteValid",
-                            remote_analyzer_.is_bound());
   if (remote_analyzer_) {
     remote_analyzer_->AnalyzeDocument(
         std::move(file), target_file_path_,
diff --git a/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc b/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc
index 45c47ba1..4516729f 100644
--- a/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc
+++ b/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc
@@ -49,8 +49,6 @@
 void SandboxedRarAnalyzer::AnalyzeFile(base::File file, base::File temp_file) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(!file_path_.value().empty());
-  base::UmaHistogramBoolean("SBClientDownload.RarAnalysisRemoteValid",
-                            remote_analyzer_.is_bound());
   if (remote_analyzer_) {
     remote_analyzer_->AnalyzeRarFile(
         std::move(file), std::move(temp_file),
diff --git a/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc b/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc
index c5a4a5d..7c3eb923 100644
--- a/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc
+++ b/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc
@@ -86,8 +86,6 @@
 
 void SandboxedZipAnalyzer::AnalyzeFile(base::File file, base::File temp_file) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  base::UmaHistogramBoolean("SBClientDownload.ZipAnalysisRemoteValid",
-                            remote_analyzer_.is_bound());
   if (remote_analyzer_) {
     remote_analyzer_->AnalyzeZipFile(
         std::move(file), std::move(temp_file),
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index e74c0a55..fafd92e 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -4631,6 +4631,7 @@
       "../browser/chromeos/extensions/login_screen/login_screen_storage/login_screen_storage_apitest.cc",
       "../browser/chromeos/extensions/wallpaper_apitest.cc",
       "../browser/chromeos/tablet_mode/tablet_mode_page_behavior_browsertest.cc",
+      "../browser/extensions/api/networking_private/networking_private_chromeos_apitest.cc",
       "../browser/extensions/api/preference/preference_api_lacros_browsertest.cc",
       "../browser/extensions/api/vpn_provider/vpn_provider_apitest.cc",
       "../browser/lacros/browser_service_lacros_browsertest.cc",
@@ -4697,9 +4698,11 @@
       "//components/infobars/content:content",
       "//components/metrics/structured",
       "//components/metrics/structured:structured_events",
+      "//components/onc:onc",
       "//components/proxy_config:proxy_config",
       "//components/services/app_service/public/cpp:intents",
       "//components/services/app_service/public/cpp:preferred_apps",
+      "//components/user_manager:user_manager",
       "//ui/gfx/codec",
       "//ui/platform_window",
     ]
@@ -6231,7 +6234,6 @@
       "../browser/optimization_guide/android/optimization_guide_tab_url_provider_android_unittest.cc",
       "../browser/page_load_metrics/observers/android_page_load_metrics_observer_unittest.cc",
       "../browser/password_manager/android/password_ui_view_android_unittest.cc",
-      "../browser/password_manager/password_store_backend_sync_delegate_impl_unittest.cc",
       "../browser/permissions/notification_blocked_message_delegate_android_unittest.cc",
       "../browser/permissions/permission_prompt_android_unittest.cc",
       "../browser/permissions/permission_update_message_controller_android_unittest.cc",
@@ -7656,6 +7658,7 @@
       "../browser/extensions/permission_message_combinations_unittest.cc",
       "../browser/extensions/permission_messages_unittest.cc",
       "../browser/extensions/permissions_based_management_policy_provider_unittest.cc",
+      "../browser/extensions/permissions_manager_unittest.cc",
       "../browser/extensions/permissions_updater_unittest.cc",
       "../browser/extensions/policy_handlers_unittest.cc",
       "../browser/extensions/preinstalled_apps_unittest.cc",
diff --git a/chrome/test/data/extensions/api_test/passwords_private/test.js b/chrome/test/data/extensions/api_test/passwords_private/test.js
index 6856c3a1..441f093 100644
--- a/chrome/test/data/extensions/api_test/passwords_private/test.js
+++ b/chrome/test/data/extensions/api_test/passwords_private/test.js
@@ -86,7 +86,8 @@
 
   function changeSavedPasswordSucceeds() {
     chrome.passwordsPrivate.changeSavedPassword(
-        [0], {username: 'new_user', password: 'new_pass'}, () => {
+        [0], {username: 'new_user', password: 'new_pass'}, (credentialIds) => {
+          chrome.test.assertEq({deviceId: 0}, credentialIds);
           chrome.test.assertNoLastError();
           chrome.test.succeed();
         });
@@ -94,7 +95,8 @@
 
   function changeSavedPasswordWithIncorrectIdFails() {
     chrome.passwordsPrivate.changeSavedPassword(
-        [-1], {username: 'new_user', password: 'new_pass'}, () => {
+        [-1], {username: 'new_user', password: 'new_pass'}, (credentialIds) => {
+          chrome.test.assertEq(undefined, credentialIds);
           chrome.test.assertLastError(ERROR_MESSAGE_FOR_CHANGE_PASSWORD);
           chrome.test.succeed();
         });
@@ -102,7 +104,9 @@
 
   function changeSavedPasswordWithOneIncorrectIdFromArrayFails() {
     chrome.passwordsPrivate.changeSavedPassword(
-        [0, -1], {username: 'new_user', password: 'new_pass'}, () => {
+        [0, -1], {username: 'new_user', password: 'new_pass'},
+        (credentialIds) => {
+          chrome.test.assertEq(undefined, credentialIds);
           chrome.test.assertLastError(ERROR_MESSAGE_FOR_CHANGE_PASSWORD);
           chrome.test.succeed();
         });
@@ -110,7 +114,8 @@
 
   function changeSavedPasswordWithEmptyPasswordFails() {
     chrome.passwordsPrivate.changeSavedPassword(
-        [0], {username: 'new_user', password: ''}, () => {
+        [0], {username: 'new_user', password: ''}, (credentialIds) => {
+          chrome.test.assertEq(undefined, credentialIds);
           chrome.test.assertLastError(ERROR_MESSAGE_FOR_CHANGE_PASSWORD);
           chrome.test.succeed();
         });
@@ -118,7 +123,8 @@
 
   function changeSavedPasswordWithEmptyArrayIdFails() {
     chrome.passwordsPrivate.changeSavedPassword(
-        [], {username: 'new_user', password: ''}, () => {
+        [], {username: 'new_user', password: ''}, (credentialIds) => {
+          chrome.test.assertEq(undefined, credentialIds);
           chrome.test.assertLastError(ERROR_MESSAGE_FOR_CHANGE_PASSWORD);
           chrome.test.succeed();
         });
@@ -127,7 +133,8 @@
   function changeSavedPasswordWithNoteSucceeds() {
     chrome.passwordsPrivate.changeSavedPassword(
         [0], {username: 'new_user', password: 'new_pass', note: 'some note'},
-        () => {
+        (credentialIds) => {
+          chrome.test.assertEq({deviceId: 0}, credentialIds);
           chrome.test.assertNoLastError();
           chrome.test.succeed();
         });
@@ -772,6 +779,13 @@
         });
   },
 
+  function refreshScriptsIfNecessary() {
+    chrome.passwordsPrivate.refreshScriptsIfNecessary(() => {
+      chrome.test.assertNoLastError();
+      chrome.test.succeed();
+    });
+  },
+
   function startPasswordCheck() {
     chrome.passwordsPrivate.startPasswordCheck(() => {
       chrome.test.assertNoLastError();
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js
index 991691c..ea6b63c 100644
--- a/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js
+++ b/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js
@@ -132,7 +132,8 @@
     assertTrue(!!getElement('#userEmailDropDown'));
 
     // URL elements.
-    assertEquals('share url:', getElementContent('#pageUrlLabel'));
+    assertEquals('Share URL:', getElementContent('#pageUrlLabel'));
+    assertTrue(page.i18nExists('sharePageUrlLabel'));
     assertTrue(!!getElement('#pageUrlCheckbox'));
     assertTrue(!!getElement('#pageUrlText'));
 
@@ -188,7 +189,7 @@
     await initializePage();
     page.feedbackContext = fakeFeedbackContext;
 
-    assertEquals('chrome://tab/', getElement('#pageUrlText').value);
+    assertEquals('chrome://tab/', getElementContent('#pageUrlText'));
   });
 
   /**
diff --git a/chrome/test/data/webui/privacy_sandbox/privacy_sandbox_dialog_test.ts b/chrome/test/data/webui/privacy_sandbox/privacy_sandbox_dialog_test.ts
index 1a3b099..34fbf8f 100644
--- a/chrome/test/data/webui/privacy_sandbox/privacy_sandbox_dialog_test.ts
+++ b/chrome/test/data/webui/privacy_sandbox/privacy_sandbox_dialog_test.ts
@@ -36,8 +36,6 @@
 suite('PrivacySandboxDialogConsent', function() {
   let page: PrivacySandboxDialogAppElement;
   let browserProxy: TestPrivacySandboxDialogBrowserProxy;
-  // TODO(olesiamarukhno): Add tests with more dialog sizes.
-  const defaultSize: [string, string] = ['500px', '500px'];
 
   function testClickButton(buttonSelector: string) {
     const actionButton =
@@ -56,12 +54,6 @@
     PrivacySandboxDialogBrowserProxy.setInstance(browserProxy);
 
     document.body.innerHTML = '';
-    // Set a fixed size for the body to make the content area scrollable.
-    document.body.style.position = 'fixed';
-    const [width, height]: [string, string] = defaultSize;
-    document.body.style.width = width;
-    document.body.style.height = height;
-
     page = document.createElement('privacy-sandbox-dialog-app');
     document.body.appendChild(page);
 
@@ -104,17 +96,10 @@
     const collapseElement = page.shadowRoot!.querySelector('iron-collapse');
     const contentArea: HTMLElement|null =
         page.shadowRoot!.querySelector('#contentArea');
-    const expandSection = page.shadowRoot!.querySelector('#expandSection');
     let hasScrollbar = contentArea!.offsetHeight < contentArea!.scrollHeight;
-    // Set transition duration to 0 to save time in tests.
-    collapseElement!.style.setProperty(
-        '--iron-collapse-transition-duration', '0ms');
-
     assertFalse(collapseElement!.opened);
     assertEquals(contentArea!.classList.contains('can-scroll'), hasScrollbar);
 
-    const expandSectionTop = expandSection!.getBoundingClientRect().top;
-    assertEquals(contentArea!.scrollTop, 0);
     // After clicking on the collapse section, the content area expands and
     // becomes scrollable with a separator in the bottom. The collapse section
     // is opened and the native UI is notified about the action.
@@ -126,8 +111,6 @@
         openedAction, PrivacySandboxPromptAction.CONSENT_MORE_INFO_OPENED);
     assertTrue(collapseElement!.opened);
     assertTrue(contentArea!.classList.contains('can-scroll'));
-    await page.waitForScrollToEndForTesting();
-    assertEquals(contentArea!.scrollTop, expandSectionTop);
 
     // Reset proxy in between button clicks.
     browserProxy.reset();
@@ -142,8 +125,6 @@
         closedAction, PrivacySandboxPromptAction.CONSENT_MORE_INFO_CLOSED);
     assertFalse(collapseElement!.opened);
     assertEquals(contentArea!.classList.contains('can-scroll'), hasScrollbar);
-    await page.waitForScrollToEndForTesting();
-    assertEquals(contentArea!.scrollTop, 0);
   });
 
   test('escPressed', async function() {
diff --git a/chrome/test/data/webui/settings/password_edit_dialog_test.ts b/chrome/test/data/webui/settings/password_edit_dialog_test.ts
index c92decf..b728098 100644
--- a/chrome/test/data/webui/settings/password_edit_dialog_test.ts
+++ b/chrome/test/data/webui/settings/password_edit_dialog_test.ts
@@ -168,6 +168,7 @@
   assertFalse(editDialog.$.passwordInput.invalid);
   assertFalse(editDialog.$.actionButton.disabled);
 
+  passwordManager.setChangeSavedPasswordResponse({accountId: 999});
   editDialog.$.actionButton.click();
 
   // Check that the changeSavedPassword is called with the right arguments.
@@ -642,6 +643,7 @@
 
   test('changesPasswordWithNote', async function() {
     loadTimeData.overrideValues({enablePasswordNotes: true});
+    loadTimeData.overrideValues({enablePasswordViewPage: true});
     const entry = createMultiStorePasswordEntry(
         {url: 'goo.gl', username: 'bart', accountId: 42, note: 'some note'});
     const editDialog = elementFactory.createPasswordEditDialog(entry);
@@ -660,13 +662,20 @@
     assertFalse(editDialog.$.passwordInput.invalid);
     assertFalse(editDialog.$.actionButton.disabled);
 
+    passwordManager.setChangeSavedPasswordResponse({accountId: 43});
     editDialog.$.actionButton.click();
 
     // Check that the changeSavedPassword is called with the right arguments.
+    const dispatchedEvent = eventToPromise('saved-password-edited', editDialog);
     const {params} = await passwordManager.whenCalled('changeSavedPassword');
     assertEquals(expectedParams.password, params.password);
     assertEquals(expectedParams.username, params.username);
     assertEquals(expectedParams.note, params.note);
+
+    await dispatchedEvent.then((event) => {
+      assertEquals(43, event.detail.accountId);
+      assertEquals(undefined, event.detail.deviceId);
+    });
   });
 
   test('noChangesWhenNotesIsNotEnabled', async function() {
diff --git a/chrome/test/data/webui/settings/password_view_test.ts b/chrome/test/data/webui/settings/password_view_test.ts
index c518c53..6267e80 100644
--- a/chrome/test/data/webui/settings/password_view_test.ts
+++ b/chrome/test/data/webui/settings/password_view_test.ts
@@ -76,21 +76,18 @@
     PasswordManagerImpl.setInstance(passwordManager);
   });
 
-  [{url: SITE, username: USERNAME, notesEnabled: false},
-   {url: SITE, username: '', notesEnabled: false},
-   {url: SITE, username: USERNAME, notesEnabled: true},
-   {url: SITE, username: '', notesEnabled: true}]
-      .forEach(
-          item => test(
-              `Valid site and username displays an entry ${item.notesEnabled}`,
+  [false, true].forEach(
+      notesEnabled =>
+          test(
+              `Textarea is shown when notes enabled: ${notesEnabled}`,
               async function() {
                 loadTimeData.overrideValues(
-                    {enablePasswordNotes: item.notesEnabled});
+                    {enablePasswordNotes: notesEnabled});
 
                 const passwordList = [
                   createPasswordEntry({
-                    url: item.url,
-                    username: item.username,
+                    url: SITE,
+                    username: USERNAME,
                     id: ID,
                     note: NOTE,
                   }),
@@ -99,15 +96,12 @@
                 passwordManager.data.passwords = passwordList;
                 const page = document.createElement('password-view');
                 document.body.appendChild(page);
-                const params = new URLSearchParams({
-                  username: item.username,
-                  site: item.url,
-                });
+                const params = new URLSearchParams({deviceId: ID.toString()});
                 Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params);
 
                 await flushTasks();
                 assertVisibilityOfPageElements(page, /*visibility=*/ true);
-                if (item.notesEnabled) {
+                if (notesEnabled) {
                   assertEquals(
                       NOTE,
                       page.shadowRoot!.querySelector(
@@ -118,13 +112,15 @@
                 }
               }));
 
-  [{inAccount: false, onDevice: true, username: USERNAME},
-   {inAccount: true, onDevice: false, username: USERNAME},
-   {inAccount: true, onDevice: true, username: USERNAME2},
+  [{accountId: null, deviceId: 2, username: USERNAME},
+   {accountId: 1, deviceId: null, username: USERNAME},
+   {accountId: null, deviceId: 3, username: USERNAME},
+   {accountId: 5, deviceId: 4, username: USERNAME2},
   ]
       .forEach(
           item => test(
-              'inAccount and onDevice parameters are used for finding credentials',
+              `IDs match to correct credentials for deviceId: ${
+                  item.deviceId}, accountId: ${item.accountId}`,
               async function() {
                 const passwordList = [
                   // entry in the account store
@@ -143,19 +139,28 @@
                     id: 2,
                     fromAccountStore: false
                   }),
+                  // second entry in the device store. Has conflicting site and
+                  // username
+                  createPasswordEntry({
+                    url: SITE,
+                    username: USERNAME,
+                    frontendId: 3,
+                    id: 3,
+                    fromAccountStore: false
+                  }),
                   // entry in both stores are the next two items
                   createPasswordEntry({
                     url: SITE,
                     username: USERNAME2,
-                    frontendId: 3,
-                    id: 3,
+                    frontendId: 4,
+                    id: 4,
                     fromAccountStore: false
                   }),
                   createPasswordEntry({
                     url: SITE,
                     username: USERNAME2,
-                    frontendId: 3,
-                    id: 4,
+                    frontendId: 4,
+                    id: 5,
                     fromAccountStore: true
                   }),
                 ];
@@ -163,25 +168,21 @@
                 passwordManager.data.passwords = passwordList;
                 const page = document.createElement('password-view');
                 document.body.appendChild(page);
-                const params = new URLSearchParams({
-                  username: item.username,
-                  site: SITE,
-                });
-                if (item.inAccount) {
-                  params.set('inAccount', 'true');
-                  if (item.onDevice) {
-                    params.set('onDevice', 'true');
-                  }
+                const params = new URLSearchParams();
+                if (item.deviceId !== null) {
+                  params.set('deviceId', item.deviceId.toString());
+                }
+                if (item.accountId !== null) {
+                  params.set('accountId', item.accountId.toString());
                 }
                 Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params);
 
                 await flushTasks();
                 assertVisibilityOfPageElements(page, /*visibility=*/ true);
-                assertEquals(
-                    item.inAccount, page.credential!.isPresentInAccount());
-                assertEquals(
-                    item.onDevice, page.credential!.isPresentOnDevice());
+                assertEquals(item.accountId, page.credential!.accountId);
+                assertEquals(item.deviceId, page.credential!.deviceId);
                 assertEquals(item.username, page.credential!.username);
+                assertEquals(SITE, page.credential!.urls.shown);
               }));
 
   test('Empty note shows placeholder text', async function() {
@@ -193,10 +194,7 @@
     passwordManager.data.passwords = passwordList;
     const page = document.createElement('password-view');
     document.body.appendChild(page);
-    const params = new URLSearchParams({
-      username: USERNAME,
-      site: SITE,
-    });
+    const params = new URLSearchParams({deviceId: ID.toString()});
     Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params);
 
     await flushTasks();
@@ -205,28 +203,22 @@
         page.shadowRoot!.querySelector('settings-textarea')!.value);
   });
 
-  test(
-      'Invalid site and username does not display an entry ' +
-          'and routes to passwords page',
-      async function() {
-        const passwordList = [
-          createPasswordEntry({url: SITE, username: 'user2', id: ID}),
-        ];
+  test('Invalid IDs routes to passwords page', async function() {
+    const passwordList = [
+      createPasswordEntry({url: SITE, username: USERNAME, id: ID}),
+    ];
 
-        passwordManager.data.passwords = passwordList;
-        const page = document.createElement('password-view');
-        document.body.appendChild(page);
-        const params = new URLSearchParams({
-          username: USERNAME,
-          site: SITE,
-        });
-        Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params);
+    passwordManager.data.passwords = passwordList;
+    const page = document.createElement('password-view');
+    document.body.appendChild(page);
+    const params = new URLSearchParams({deviceId: 'invalid'});
+    Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params);
 
-        await flushTasks();
-        assertVisibilityOfPageElements(page, /*visibility=*/ false);
+    await flushTasks();
+    assertVisibilityOfPageElements(page, /*visibility=*/ false);
 
-        assertEquals(routes.PASSWORDS, Router.getInstance().getCurrentRoute());
-      });
+    assertEquals(routes.PASSWORDS, Router.getInstance().getCurrentRoute());
+  });
 
   test('Federated credential layout', async function() {
     const passwordList = [
@@ -234,15 +226,13 @@
         federationText: 'with chromium.org',
         url: SITE,
         username: USERNAME,
+        id: ID,
       }),
     ];
     passwordManager.data.passwords = passwordList;
     const page = document.createElement('password-view');
     document.body.appendChild(page);
-    const params = new URLSearchParams({
-      username: USERNAME,
-      site: SITE,
-    });
+    const params = new URLSearchParams({deviceId: ID.toString()});
     Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params);
 
     await flushTasks();
@@ -257,10 +247,7 @@
     passwordManager.data.passwords = passwordList;
     const page = document.createElement('password-view');
     document.body.appendChild(page);
-    const params = new URLSearchParams({
-      username: USERNAME,
-      site: SITE,
-    });
+    const params = new URLSearchParams({deviceId: ID.toString()});
     Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params);
 
     await flushTasks();
@@ -313,10 +300,7 @@
         passwordManager.data.passwords = [passwordEntry];
         const page = document.createElement('password-view');
         document.body.appendChild(page);
-        const params = new URLSearchParams({
-          username: USERNAME,
-          site: SITE,
-        });
+        const params = new URLSearchParams({deviceId: ID.toString()});
         Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params);
         await flushTasks();
         assertTrue(!!page.credential);
@@ -332,6 +316,7 @@
         assertTrue(!!page.credential);
         assertEquals(SITE, page.credential.urls.shown);
         assertEquals(USERNAME, page.credential.username);
+        assertEquals(ID, page.credential.deviceId);
       });
 
   test(
@@ -345,10 +330,7 @@
         passwordManager.data.passwords = passwordList;
         const page = document.createElement('password-view');
         document.body.appendChild(page);
-        const params = new URLSearchParams({
-          username: USERNAME,
-          site: SITE,
-        });
+        const params = new URLSearchParams({deviceId: ID.toString()});
         Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params);
 
         await flushTasks();
@@ -365,17 +347,15 @@
           'When the username is changed, view page gets updated',
       async function() {
         const NEW_USERNAME = 'user2';
+        const NEW_ID = ID + 1;
         const entry =
-            createPasswordEntry({url: SITE, username: USERNAME, id: 0});
+            createPasswordEntry({url: SITE, username: USERNAME, id: ID});
 
         passwordManager.setPlaintextPassword(PASSWORD);
         passwordManager.data.passwords = [entry];
         const page = document.createElement('password-view');
         document.body.appendChild(page);
-        const params = new URLSearchParams({
-          username: USERNAME,
-          site: SITE,
-        });
+        const params = new URLSearchParams({deviceId: ID.toString()});
         Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params);
 
         await flushTasks();
@@ -395,21 +375,24 @@
         assertEquals(entry.username, editDialog.existingEntry.username);
         assertEquals(PASSWORD, editDialog.existingEntry.password);
 
+        passwordManager.setChangeSavedPasswordResponse({deviceId: NEW_ID});
         // user edits the username
         editDialog.$.usernameInput.value = NEW_USERNAME;
         editDialog.$.actionButton.click();
+        await flushTasks();
+
         entry.username = NEW_USERNAME;
+        entry.id = NEW_ID;
         passwordManager.lastCallback.addSavedPasswordListChangedListener!
             ([entry]);
 
-        await flushTasks();
         assertFalse(isVisible(editDialog));
 
         assertEquals(NEW_USERNAME, page.credential!.username);
 
         const urlParams = Router.getInstance().getQueryParameters();
-        assertEquals(urlParams.get('site'), SITE);
-        assertEquals(urlParams.get('username'), NEW_USERNAME);
+        assertEquals(urlParams.get('deviceId'), NEW_ID.toString());
+        assertEquals(urlParams.get('accountId'), null);
         assertEquals(
             routes.PASSWORD_VIEW, Router.getInstance().getCurrentRoute());
       });
@@ -425,10 +408,7 @@
         passwordManager.data.passwords = [entry];
         const page = document.createElement('password-view');
         document.body.appendChild(page);
-        const params = new URLSearchParams({
-          username: USERNAME,
-          site: SITE,
-        });
+        const params = new URLSearchParams({deviceId: ID.toString()});
         Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params);
 
         await flushTasks();
@@ -469,10 +449,8 @@
         const page = document.createElement('password-view');
         document.body.appendChild(page);
         const params = new URLSearchParams({
-          username: USERNAME,
-          site: SITE,
-          inAccount: 'true',
-          onDevice: 'true',
+          deviceId: '0',
+          accountId: '1',
         });
         Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params);
         await flushTasks();
@@ -509,10 +487,7 @@
     passwordManager.data.passwords = passwordList;
     const page = document.createElement('password-view');
     document.body.appendChild(page);
-    const params = new URLSearchParams({
-      username: USERNAME,
-      site: SITE,
-    });
+    const params = new URLSearchParams({deviceId: ID.toString()});
     Router.getInstance().navigateTo(routes.PASSWORD_VIEW, params);
     await flushTasks();
 
diff --git a/chrome/test/data/webui/settings/passwords_section_test.ts b/chrome/test/data/webui/settings/passwords_section_test.ts
index 5d181aa..d2ff95b 100644
--- a/chrome/test/data/webui/settings/passwords_section_test.ts
+++ b/chrome/test/data/webui/settings/passwords_section_test.ts
@@ -222,6 +222,7 @@
   // Close the dialog, verify that the list item password remains hidden.
   // Note that the password only gets hidden in the on-close handler, thus we
   // need to await this event first.
+  passwordManager.setChangeSavedPasswordResponse({deviceId: 1});
   passwordEditDialog.$.actionButton.click();
   await eventToPromise('close', passwordEditDialog);
 
@@ -273,6 +274,7 @@
     PasswordManagerImpl.setInstance(passwordManager);
     elementFactory = new PasswordSectionElementFactory(document);
     loadTimeData.overrideValues({
+      enableAutomaticPasswordChangeInSettings: false,
       enablePasswordViewPage: false,
       unifiedPasswordManagerEnabled: false,
     });
@@ -1800,6 +1802,14 @@
     assertEquals(TrustSafetyInteraction.OPENED_PASSWORD_MANAGER, interaction);
   });
 
+  test('passwordScriptsRefreshedOnOpen', async function() {
+    loadTimeData.overrideValues(
+        {enableAutomaticPasswordChangeInSettings: true});
+    elementFactory.createPasswordsSection(passwordManager, [], []);
+    Router.getInstance().navigateTo(routes.PASSWORDS);
+    await passwordManager.whenCalled('refreshScriptsIfNecessary');
+  });
+
   test(
       'addPasswordButtonShownOnlyWhenPasswordManagerNotDisabledByPolicy',
       function() {
diff --git a/chrome/test/data/webui/settings/test_password_manager_proxy.ts b/chrome/test/data/webui/settings/test_password_manager_proxy.ts
index 488f95dc..17c61509 100644
--- a/chrome/test/data/webui/settings/test_password_manager_proxy.ts
+++ b/chrome/test/data/webui/settings/test_password_manager_proxy.ts
@@ -85,6 +85,8 @@
   private isAccountStoreDefault_: boolean = false;
   private getUrlCollectionResponse_: chrome.passwordsPrivate.UrlCollection|
       null = null;
+  private changeSavedPasswordResponse_: chrome.passwordsPrivate.CredentialIds|
+      null = null;
 
   constructor() {
     super([
@@ -106,6 +108,7 @@
       'recordChangePasswordFlowStarted',
       'recordPasswordCheckInteraction',
       'recordPasswordCheckReferrer',
+      'refreshScriptsIfNecessary',
       'removeException',
       'removeExceptions',
       'removeInsecureCredential',
@@ -266,6 +269,11 @@
         actual.listening.accountStorageOptInState);
   }
 
+  refreshScriptsIfNecessary() {
+    this.methodCalled('refreshScriptsIfNecessary');
+    return Promise.resolve();
+  }
+
   startBulkPasswordCheck() {
     this.methodCalled('startBulkPasswordCheck');
     if (this.data.checkStatus.state ===
@@ -355,11 +363,18 @@
     this.methodCalled('recordPasswordCheckReferrer', referrer);
   }
 
+  setChangeSavedPasswordResponse(newIds:
+                                     chrome.passwordsPrivate.CredentialIds) {
+    this.changeSavedPasswordResponse_ = newIds;
+  }
+
   changeSavedPassword(
       ids: number[],
       params: chrome.passwordsPrivate.ChangeSavedPasswordParams) {
     this.methodCalled('changeSavedPassword', {ids, params});
-    return Promise.resolve();
+    return !this.changeSavedPasswordResponse_ ?
+        Promise.reject(new Error('Could not change password.')) :
+        Promise.resolve(this.changeSavedPasswordResponse_);
   }
 
   /**
diff --git a/chrome/test/data/webui/signin/account_selection_lacros_test.ts b/chrome/test/data/webui/signin/account_selection_lacros_test.ts
index ec13ca6e..bee71ab 100644
--- a/chrome/test/data/webui/signin/account_selection_lacros_test.ts
+++ b/chrome/test/data/webui/signin/account_selection_lacros_test.ts
@@ -91,14 +91,34 @@
           '.account-button');
       assertTrue(!!buttons);
       assertEquals(buttons.length, 3);
-      // Click account buttons.
-      buttons[1]!.click();
-      await verifySelectAccountLacrosCalled('gaia-id-0');
-      buttons[2]!.click();
-      await verifySelectAccountLacrosCalled('gaia-id-1');
       // Click "Use another account".
       buttons[0]!.click();
       await verifySelectAccountLacrosCalled('');
+      // Click account buttons.
+      buttons[1]!.click();
+      await verifySelectAccountLacrosCalled('gaia-id-0');
+    });
+
+    test('accountButtonsDisabledAfterClick', async function() {
+      flushTasks();
+      // Add some accounts.
+      webUIListenerCallback(
+          'available-accounts-changed', generateAccountsList(3));
+      flushTasks();
+      const accounts_buttons =
+          testElement.shadowRoot!.querySelectorAll<HTMLButtonElement>(
+              '#buttonsContainer > button');
+      assertTrue(!!accounts_buttons);
+      assertEquals(accounts_buttons.length, 3);
+      accounts_buttons[0]!.click();
+      accounts_buttons.forEach(button => {
+        assertTrue(button.disabled);
+      });
+      const other_account_button =
+          testElement.shadowRoot!.querySelector<HTMLButtonElement>(
+              '#other-account-button');
+      assertTrue(!!other_account_button);
+      assertTrue(other_account_button.disabled);
     });
   });
 });
diff --git a/chrome/updater/update_service_impl.cc b/chrome/updater/update_service_impl.cc
index 7a5cd652b..e7dbe1882 100644
--- a/chrome/updater/update_service_impl.cc
+++ b/chrome/updater/update_service_impl.cc
@@ -250,12 +250,6 @@
     return;
   }
   persisted_data_->RegisterApp(request);
-  update_client::CrxComponent crx_component;
-  crx_component.app_id = request.app_id;
-  crx_component.version = request.version;
-  crx_component.requires_network_encryption = false;
-  crx_component.ap = request.ap;
-  crx_component.brand = request.brand_code;
   std::move(callback).Run(RegistrationResponse(kRegistrationSuccess));
 }
 
@@ -382,10 +376,9 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   int policy = kPolicyEnabled;
-  if (IsUpdateDisabledByPolicy(app_id, priority, policy_same_version_update,
-                               policy)) {
-    HandleUpdateDisabledByPolicy(app_id, policy, policy_same_version_update,
-                                 state_update, std::move(callback));
+  if (IsUpdateDisabledByPolicy(app_id, priority, false, policy)) {
+    HandleUpdateDisabledByPolicy(app_id, policy, false, state_update,
+                                 std::move(callback));
     return;
   }
 
@@ -405,7 +398,28 @@
                                 Callback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   VLOG(1) << __func__;
-  // TODO(crbug.com/1311743): Implement.
+  int policy = kPolicyEnabled;
+  if (IsUpdateDisabledByPolicy(registration.app_id, priority, true, policy)) {
+    HandleUpdateDisabledByPolicy(registration.app_id, policy, true,
+                                 state_update, std::move(callback));
+    return;
+  }
+  if (registration.app_id != kUpdaterAppId) {
+    persisted_data_->SetHadApps();
+  }
+  if (!persisted_data_->GetProductVersion(registration.app_id).IsValid()) {
+    // Only overwrite the registration if there's no current registration.
+    persisted_data_->RegisterApp(registration);
+  }
+  // TODO(crbug.com/1290331): Retain the cancellation callback.
+  update_client_->Install(
+      install_data_index,
+      base::BindOnce(&GetComponents, config_, persisted_data_,
+                     AppInstallDataIndex({std::make_pair(registration.app_id,
+                                                         install_data_index)}),
+                     false, false, PolicySameVersionUpdate::kAllowed),
+      MakeUpdateClientCrxStateChangeCallback(config_, state_update),
+      MakeUpdateClientCallback(std::move(callback)));
 }
 
 void UpdateServiceImpl::CancelInstalls(const std::string& app_id) {
@@ -425,11 +439,9 @@
   VLOG(1) << __func__;
 
   int policy = kPolicyEnabled;
-  if (IsUpdateDisabledByPolicy(app_id, Priority::kForeground,
-                               PolicySameVersionUpdate::kAllowed, policy)) {
-    HandleUpdateDisabledByPolicy(app_id, policy,
-                                 PolicySameVersionUpdate::kAllowed,
-                                 state_update, std::move(callback));
+  if (IsUpdateDisabledByPolicy(app_id, Priority::kForeground, true, policy)) {
+    HandleUpdateDisabledByPolicy(app_id, policy, true, state_update,
+                                 std::move(callback));
     return;
   }
 
@@ -498,18 +510,15 @@
           state_update, app_info.app_id, std::move(callback)));
 }
 
-bool UpdateServiceImpl::IsUpdateDisabledByPolicy(
-    const std::string& app_id,
-    Priority priority,
-    PolicySameVersionUpdate policy_same_version_update,
-    int& policy) {
+bool UpdateServiceImpl::IsUpdateDisabledByPolicy(const std::string& app_id,
+                                                 Priority priority,
+                                                 bool is_install,
+                                                 int& policy) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   policy = kPolicyEnabled;
 
-  // The Install case is inferred by the presence of
-  // `PolicySameVersionUpdate::kAllowed`.
-  if (policy_same_version_update == PolicySameVersionUpdate::kAllowed) {
+  if (is_install) {
     return config_->GetPolicyService()->GetEffectivePolicyForAppInstalls(
                app_id, nullptr, &policy) &&
            (policy == kPolicyDisabled || (config_->IsPerUserInstall() &&
@@ -528,7 +537,7 @@
 void UpdateServiceImpl::HandleUpdateDisabledByPolicy(
     const std::string& app_id,
     int policy,
-    PolicySameVersionUpdate policy_same_version_update,
+    bool is_install,
     StateChangeCallback state_update,
     Callback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -538,11 +547,10 @@
   update_state.state = UpdateService::UpdateState::State::kUpdateError;
   update_state.error_category = UpdateService::ErrorCategory::kUpdateCheck;
   update_state.error_code =
-      policy_same_version_update == PolicySameVersionUpdate::kAllowed
-          ? GOOPDATE_E_APP_INSTALL_DISABLED_BY_POLICY
-          : policy != kPolicyAutomaticUpdatesOnly
-                ? GOOPDATE_E_APP_UPDATE_DISABLED_BY_POLICY
-                : GOOPDATE_E_APP_UPDATE_DISABLED_BY_POLICY_MANUAL;
+      is_install ? GOOPDATE_E_APP_INSTALL_DISABLED_BY_POLICY
+      : policy != kPolicyAutomaticUpdatesOnly
+          ? GOOPDATE_E_APP_UPDATE_DISABLED_BY_POLICY
+          : GOOPDATE_E_APP_UPDATE_DISABLED_BY_POLICY_MANUAL;
   update_state.extra_code1 = 0;
 
   base::BindPostTask(main_task_runner_, state_update).Run(update_state);
@@ -559,23 +567,6 @@
     bool update_blocked) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  // TODO(crbug.com/1311743): The Install case is inferred by the presence of
-  // `PolicySameVersionUpdate::kAllowed` and only having one app.
-  if (policy_same_version_update == PolicySameVersionUpdate::kAllowed &&
-      app_install_data_index.size() == 1) {
-    main_task_runner_->PostTask(
-        FROM_HERE,
-        base::BindOnce(
-            base::IgnoreResult(&update_client::UpdateClient::Install),
-            update_client_, app_install_data_index.begin()->first,
-            base::BindOnce(&GetComponents, config_, persisted_data_,
-                           app_install_data_index, false, update_blocked,
-                           policy_same_version_update),
-            MakeUpdateClientCrxStateChangeCallback(config_, state_update),
-            MakeUpdateClientCallback(std::move(callback))));
-    return;
-  }
-
   main_task_runner_->PostTask(
       FROM_HERE,
       base::BindOnce(
diff --git a/chrome/updater/update_service_impl.h b/chrome/updater/update_service_impl.h
index 952038a..b142d0d 100644
--- a/chrome/updater/update_service_impl.h
+++ b/chrome/updater/update_service_impl.h
@@ -80,17 +80,15 @@
   // Pops `tasks_`, and calls TaskStart.
   void TaskDone();
 
-  bool IsUpdateDisabledByPolicy(
-      const std::string& app_id,
-      Priority priority,
-      PolicySameVersionUpdate policy_same_version_update,
-      int& policy);
-  void HandleUpdateDisabledByPolicy(
-      const std::string& app_id,
-      int policy,
-      PolicySameVersionUpdate policy_same_version_update,
-      StateChangeCallback state_update,
-      Callback callback);
+  bool IsUpdateDisabledByPolicy(const std::string& app_id,
+                                Priority priority,
+                                bool is_install,
+                                int& policy);
+  void HandleUpdateDisabledByPolicy(const std::string& app_id,
+                                    int policy,
+                                    bool is_install,
+                                    StateChangeCallback state_update,
+                                    Callback callback);
 
   void OnShouldBlockUpdateForMeteredNetwork(
       StateChangeCallback state_update,
diff --git a/chrome/updater/win/app_install_controller.cc b/chrome/updater/win/app_install_controller.cc
index 65e3298..fcd2d9e 100644
--- a/chrome/updater/win/app_install_controller.cc
+++ b/chrome/updater/win/app_install_controller.cc
@@ -574,23 +574,11 @@
                      tag_args && tag_args->usage_stats_enable &&
                          *tag_args->usage_stats_enable),
       base::BindOnce(
-          &UpdateService::RegisterApp, update_service_, request,
-          base::BindOnce(
-              [](scoped_refptr<AppInstallControllerImpl> self,
-                 const RegistrationResponse& response) {
-                DCHECK(response.status_code == kRegistrationSuccess ||
-                       response.status_code == kRegistrationAlreadyRegistered);
-                self->update_service_->Update(
-                    self->app_id_,
-                    GetInstallDataIndexFromAppArgs(self->app_id_),
-                    UpdateService::Priority::kForeground,
-                    UpdateService::PolicySameVersionUpdate::kAllowed,
-                    base::BindRepeating(&AppInstallControllerImpl::StateChange,
-                                        self),
-                    base::BindOnce(&AppInstallControllerImpl::InstallComplete,
-                                   self));
-              },
-              base::WrapRefCounted(this))));
+          &UpdateService::Install, update_service_, request,
+          GetInstallDataIndexFromAppArgs(app_id_),
+          UpdateService::Priority::kForeground,
+          base::BindRepeating(&AppInstallControllerImpl::StateChange, this),
+          base::BindOnce(&AppInstallControllerImpl::InstallComplete, this)));
 }
 
 void AppInstallControllerImpl::InstallAppOffline(
diff --git a/chrome/updater/win/win_util.cc b/chrome/updater/win/win_util.cc
index 10bfcc6e..a66f925 100644
--- a/chrome/updater/win/win_util.cc
+++ b/chrome/updater/win/win_util.cc
@@ -510,8 +510,7 @@
   return true;
 }
 
-// TODO(crbug.com/1212187): maybe handle filtered tokens.
-HRESULT IsUserAdmin(bool& is_user_admin) {
+HRESULT IsTokenAdmin(HANDLE token, bool& is_token_admin) {
   SID_IDENTIFIER_AUTHORITY nt_authority = SECURITY_NT_AUTHORITY;
   PSID administrators_group = nullptr;
   if (!::AllocateAndInitializeSid(&nt_authority, 2, SECURITY_BUILTIN_DOMAIN_RID,
@@ -522,12 +521,17 @@
   base::ScopedClosureRunner free_sid(
       base::BindOnce([](PSID sid) { ::FreeSid(sid); }, administrators_group));
   BOOL is_member = false;
-  if (!::CheckTokenMembership(NULL, administrators_group, &is_member))
+  if (!::CheckTokenMembership(token, administrators_group, &is_member))
     return HRESULTFromLastError();
-  is_user_admin = is_member;
+  is_token_admin = is_member;
   return S_OK;
 }
 
+// TODO(crbug.com/1212187): maybe handle filtered tokens.
+HRESULT IsUserAdmin(bool& is_user_admin) {
+  return IsTokenAdmin(NULL, is_user_admin);
+}
+
 HRESULT IsUserNonElevatedAdmin(bool& is_user_non_elevated_admin) {
   HANDLE token = NULL;
   if (!::OpenProcessToken(::GetCurrentProcess(), TOKEN_READ, &token))
diff --git a/chrome/updater/win/win_util.h b/chrome/updater/win/win_util.h
index 1789f570..2108bec 100644
--- a/chrome/updater/win/win_util.h
+++ b/chrome/updater/win/win_util.h
@@ -168,6 +168,10 @@
 // Returns a logged on user token handle from the current session.
 base::win::ScopedHandle GetUserTokenFromCurrentSessionId();
 
+// Sets `is_token_admin` to `true` if the token is an elevated administrator. If
+// `token` is `NULL`, the current thread token is used.
+HRESULT IsTokenAdmin(HANDLE token, bool& is_token_admin);
+
 // Sets `is_user_admin` to true if the user is running as an elevated
 // administrator.
 HRESULT IsUserAdmin(bool& is_user_admin);
diff --git a/chromecast/crash/linux/synchronized_minidump_manager_unittest.cc b/chromecast/crash/linux/synchronized_minidump_manager_unittest.cc
index 38c8be3..65aaeac2 100644
--- a/chromecast/crash/linux/synchronized_minidump_manager_unittest.cc
+++ b/chromecast/crash/linux/synchronized_minidump_manager_unittest.cc
@@ -342,7 +342,7 @@
   MinidumpParams params;
 
   // Fork the process.
-  pid_t pid = base::ForkWithFlags(0u, nullptr, nullptr);
+  pid_t pid = base::ForkWithFlags(0, nullptr, nullptr);
   if (pid != 0) {
     // The child process should instantiate a manager which immediately grabs
     // the lock, and falls aleep for some period of time, then writes a dump,
diff --git a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc
index 2c60185..35951efe 100644
--- a/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc
+++ b/chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.cc
@@ -79,42 +79,68 @@
 // Used to track the fake instance, mirrors the instance in the base class.
 FakeUserDataAuthClient* g_instance = nullptr;
 
-// Used to construct a functor/visitor with overloaded `operator()` from a list
-// of lambdas. Useful for visiting absl::variant.
-template <class... Ts>
-struct OverloadedFunctor : Ts... {
-  using Ts::operator()...;
+// `OverloadedFunctor` and `FunctorWithReturnType` are used to implement
+// `Overload`, which constructs a visitor appropriate for use with
+// `absl::visit` from lambdas for each case.
+
+// A functor combining the `operator()` definitions of a list of functors into
+// a single functor with overloaded `operator()`.
+template <class... Functors>
+struct OverloadedFunctor : Functors... {
+  using Functors::operator()...;
 };
-template <class... Ts>
-OverloadedFunctor<Ts...> Overload(Ts&&... ts) {
-  return OverloadedFunctor<Ts...>{std::forward<Ts>(ts)...};
+
+// Used to fix the return type of a functor with overloaded `operator()`.
+// This is useful in case the `operator()` overloads have different return
+// types, but all return types are convertible into the intended fixed
+// `ReturnType`.
+template <class ReturnType, class Functor>
+struct FunctorWithReturnType {
+  template <class Arg>
+  ReturnType operator()(Arg&& arg) {
+    return functor(std::forward<Arg>(arg));
+  }
+
+  Functor functor;
+};
+
+// `Overload` constructs a visitor appropriate for use with `absl::visit` from
+// a number of lambdas for each case. The return type of each provided lambda
+// must be convertible to `ReturnType`, and the `operator()` of the combined
+// visitor will always return `ReturnType`.
+template <class ReturnType, class... Functors>
+FunctorWithReturnType<ReturnType, OverloadedFunctor<Functors...>> Overload(
+    Functors... functors) {
+  return {{std::move(functors)...}};
 }
 
 absl::optional<cryptohome::KeyData> AuthFactorToKeyData(
     std::string label,
     const FakeAuthFactor& factor) {
-  absl::optional<cryptohome::KeyData> data;
-  absl::visit(Overload(
-                  [&](const PasswordFactor& password) {
-                    data = cryptohome::KeyData();
-                    data->set_type(cryptohome::KeyData::KEY_TYPE_PASSWORD);
-                    data->set_label(std::move(label));
-                  },
-                  [&](const PinFactor& pin) {
-                    data = cryptohome::KeyData();
-                    data->set_type(cryptohome::KeyData::KEY_TYPE_PASSWORD);
-                    data->set_label(std::move(label));
-                    data->mutable_policy()->set_low_entropy_credential(true);
-                    data->mutable_policy()->set_auth_locked(pin.locked);
-                  },
-                  [&](const RecoveryFactor& recovery) { data = absl::nullopt; },
-                  [&](const KioskFactor& kiosk) {
-                    data = cryptohome::KeyData();
-                    data->set_type(cryptohome::KeyData::KEY_TYPE_KIOSK);
-                    data->set_label(std::move(label));
-                  }),
-              factor);
-  return data;
+  return absl::visit(
+      Overload<absl::optional<cryptohome::KeyData>>(
+          [&](const PasswordFactor& password) {
+            cryptohome::KeyData data;
+            data.set_type(cryptohome::KeyData::KEY_TYPE_PASSWORD);
+            data.set_label(std::move(label));
+            return data;
+          },
+          [&](const PinFactor& pin) {
+            cryptohome::KeyData data;
+            data.set_type(cryptohome::KeyData::KEY_TYPE_PASSWORD);
+            data.set_label(std::move(label));
+            data.mutable_policy()->set_low_entropy_credential(true);
+            data.mutable_policy()->set_auth_locked(pin.locked);
+            return data;
+          },
+          [&](const RecoveryFactor&) { return absl::nullopt; },
+          [&](const KioskFactor& kiosk) {
+            cryptohome::KeyData data;
+            data.set_type(cryptohome::KeyData::KEY_TYPE_KIOSK);
+            data.set_label(std::move(label));
+            return data;
+          }),
+      factor);
 }
 
 // Helper that automatically sends a reply struct to a supplied callback when
@@ -407,7 +433,7 @@
   const FakeAuthFactor& factor = factor_it->second;
 
   absl::visit(
-      Overload(
+      Overload<void>(
           [&](const PasswordFactor& password) {
             const std::string& secret = key.secret();
             if (password.password != secret) {
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index bf35fed1..fc5a0e5b 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -3437,6 +3437,9 @@
       <message name="IDS_FEEDBACK_TOOL_ANONYMOUS_EMAIL_OPTION" desc="Option in the drop down menu to let the user send the feedback report without attaching their email.">
         Don't include email address
       </message>
+      <message name="IDS_FEEDBACK_TOOL_SHARE_PAGE_URL_LABEL" desc="Label showing the share page url.">
+        Share URL:
+      </message>
       <message name="IDS_FEEDBACK_TOOL_SHARE_DIAGNOSTIC_DATA_LABEL" desc="Label showing the share diagnostic data.">
         Share diagnostic data
       </message>
diff --git a/chromeos/chromeos_strings_grd/IDS_FEEDBACK_TOOL_SHARE_PAGE_URL_LABEL.png.sha1 b/chromeos/chromeos_strings_grd/IDS_FEEDBACK_TOOL_SHARE_PAGE_URL_LABEL.png.sha1
new file mode 100644
index 0000000..caf87a3
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_FEEDBACK_TOOL_SHARE_PAGE_URL_LABEL.png.sha1
@@ -0,0 +1 @@
+5e254308593225f67778d525a4a5ec6b6d735b5b
\ No newline at end of file
diff --git a/chromeos/crosapi/mojom/test_controller.mojom b/chromeos/crosapi/mojom/test_controller.mojom
index 126acf2..fdb008c 100644
--- a/chromeos/crosapi/mojom/test_controller.mojom
+++ b/chromeos/crosapi/mojom/test_controller.mojom
@@ -4,8 +4,9 @@
 
 module crosapi.mojom;
 
-import "ui/gfx/geometry/mojom/geometry.mojom";
 import "chromeos/crosapi/mojom/app_service_types.mojom";
+import "mojo/public/mojom/base/values.mojom";
+import "ui/gfx/geometry/mojom/geometry.mojom";
 
 [Stable, Extensible]
 enum TouchEventType {
@@ -65,10 +66,58 @@
 };
 
 // This interface is implemented by Ash-Chrome.
+// It enables tests in Lacros-Chrome to access the TestInterfaces
+// of chromeos::Shill*Client classes.
+[Stable, Uuid="12d5dbb4-e974-4f41-820e-6d92c2215452"]
+interface ShillClientTestInterface {
+  // From chromeos::ShillDeviceClient::TestInterface:
+
+  // Adds a fake networking device.
+  AddDevice@0(string device_path, string type,string name) => ();
+  // Clear all fake networking devices.
+  ClearDevices@1() => ();
+  // Sets a property on the given fake device.
+  SetDeviceProperty@2(string device_path,
+      string name,
+      mojo_base.mojom.Value value,
+      bool notify_changed) => ();
+  // Sets whether the SIM in the given fake device should be locked.
+  SetSimLocked@3(string device_path, bool enabled) => ();
+
+  // From chromeos::ShillServiceClient::TestInterface:
+
+  // Adds a Service to the Manager and Service stubs.
+  AddService@4(string service_path,
+      string guid,
+      string name,
+      string type,
+      string state,
+      bool visible) => ();
+  // Clears all Services from the Manager and Service stubs.
+  ClearServices@5() => ();
+  // Sets a property of the specified service.
+  SetServiceProperty@6(string service_path, string property,
+      mojo_base.mojom.Value value) => ();
+
+  // From chromeos::ShillProfileClient::TestInterface:
+
+  // Adds a profile.
+  AddProfile@7(string profile_path, string userhash) => ();
+  // Adds a service to the profile, copying properties from the
+  // ShillServiceClient entry matching |service_path|.
+  AddServiceToProfile@8(string profile_path, string service_path) => ();
+
+  // From chromeos::ShillIPConfigClient::TestInterface:
+
+  // Adds an IPConfig entry.
+  AddIPConfig@9(string ip_config_path, mojo_base.mojom.Value properties) => ();
+};
+
+// This interface is implemented by Ash-Chrome.
 // This interface provides tests a mechanism to mutate or query ash.
 // In the future, this interface may merge with an automation or a11y interface.
-// Next version: 16
-// Next method id: 25
+// Next version: 17
+// Next method id: 27
 [Stable, Uuid="1f93f9d7-e466-466c-a675-c21b48cf30d3"]
 interface TestController {
   // Clicks the middle of the views element identified by |element_name|.
@@ -209,4 +258,14 @@
   // Creates and then cancels a print job.
   [MinVersion=15]
   CreateAndCancelPrintJob@24(string job_title) => ();
+
+  // Binds a |shill_client| that Lacros-Chrome can use to access the Shill
+  // test intefaces in Ash-Chrome.
+  [MinVersion=16]
+  BindShillClientTestInterface@25(
+      pending_receiver<ShillClientTestInterface> shill_client) => ();
+
+  // Returns the sanitized (aka "hashed") username of the active user.
+  [MinVersion=16]
+  GetSanitizedActiveUsername@26() => (string sanitized_active_username);
 };
diff --git a/chromeos/dbus/missive/fake_missive_client.cc b/chromeos/dbus/missive/fake_missive_client.cc
index c156e340..38e1a2e 100644
--- a/chromeos/dbus/missive/fake_missive_client.cc
+++ b/chromeos/dbus/missive/fake_missive_client.cc
@@ -28,6 +28,9 @@
     const reporting::Priority priority,
     reporting::Record record,
     base::OnceCallback<void(reporting::Status)> completion_callback) {
+  for (auto& observer : observer_list_) {
+    observer.OnRecordEnqueued(priority, record);
+  }
   enqueued_records_[priority].push_back(std::move(record));
   std::move(completion_callback).Run(reporting::Status::StatusOK());
 }
@@ -62,4 +65,12 @@
   return enqueued_records_[priority];
 }
 
+void FakeMissiveClient::AddObserver(Observer* observer) {
+  observer_list_.AddObserver(observer);
+}
+
+void FakeMissiveClient::RemoveObserver(Observer* observer) {
+  observer_list_.RemoveObserver(observer);
+}
+
 }  // namespace chromeos
diff --git a/chromeos/dbus/missive/fake_missive_client.h b/chromeos/dbus/missive/fake_missive_client.h
index b422faf..3125d31 100644
--- a/chromeos/dbus/missive/fake_missive_client.h
+++ b/chromeos/dbus/missive/fake_missive_client.h
@@ -10,6 +10,7 @@
 #include "base/callback.h"
 #include "base/containers/flat_map.h"
 #include "base/memory/weak_ptr.h"
+#include "base/observer_list.h"
 #include "base/task/sequenced_task_runner.h"
 #include "chromeos/dbus/missive/missive_client.h"
 #include "components/reporting/proto/synced/record.pb.h"
@@ -48,10 +49,13 @@
   // |MissiveClient::TestInterface| implementation:
   const std::vector<::reporting::Record>& GetEnqueuedRecords(
       ::reporting::Priority priority) override;
+  void AddObserver(Observer* observer) override;
+  void RemoveObserver(Observer* observer) override;
 
  private:
   base::flat_map<::reporting::Priority, std::vector<::reporting::Record>>
       enqueued_records_;
+  base::ObserverList<Observer> observer_list_;
 
   // Weak pointer factory - must be last member of the class.
   base::WeakPtrFactory<FakeMissiveClient> weak_ptr_factory_{this};
diff --git a/chromeos/dbus/missive/missive_client.h b/chromeos/dbus/missive/missive_client.h
index d83af7d..0a76366 100644
--- a/chromeos/dbus/missive/missive_client.h
+++ b/chromeos/dbus/missive/missive_client.h
@@ -10,6 +10,7 @@
 #include "base/callback.h"
 #include "base/component_export.h"
 #include "base/memory/weak_ptr.h"
+#include "base/observer_list_types.h"
 #include "base/sequence_checker.h"
 #include "base/task/sequenced_task_runner.h"
 #include "components/reporting/proto/synced/interface.pb.h"
@@ -32,9 +33,18 @@
   // only implemented in the fake implementation.
   class TestInterface {
    public:
+    class Observer : public base::CheckedObserver {
+     public:
+      virtual void OnRecordEnqueued(reporting::Priority priority,
+                                    const reporting::Record& record) = 0;
+    };
+
     virtual const std::vector<::reporting::Record>& GetEnqueuedRecords(
         ::reporting::Priority) = 0;
 
+    virtual void AddObserver(Observer* observer) = 0;
+    virtual void RemoveObserver(Observer* observer) = 0;
+
    protected:
     virtual ~TestInterface() = default;
   };
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index 7e7b37d..972101fa 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "10.28",
-  "log_list_timestamp": "2022-06-30T12:53:54Z",
+  "version": "10.35",
+  "log_list_timestamp": "2022-07-07T12:54:44Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/device_reauth/biometric_authenticator.h b/components/device_reauth/biometric_authenticator.h
index 5659fe9..c50704c 100644
--- a/components/device_reauth/biometric_authenticator.h
+++ b/components/device_reauth/biometric_authenticator.h
@@ -45,37 +45,6 @@
   kMaxValue = kIncognitoReauthPage,
 };
 
-// The result of the biometric authentication.
-//
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused.
-enum class BiometricAuthFinalResult {
-  // This value is used for when we don't know the exact auth method used. This
-  // can be the case on Android versions under 11.
-  kSuccessWithUnknownMethod = 0,
-  kSuccessWithBiometrics = 1,
-  kSuccessWithDeviceLock = 2,
-  kCanceledByUser = 3,
-  kFailed = 4,
-
-  // Deprecated in favour of kCanceledByChrome. Recorded when the auth succeeds
-  // after Chrome cancelled it.
-  // kSuccessButCanceled = 5,
-
-  // Deprecated in favour of kCanceledByChrome. Recorded when the auth fails
-  // after Chrome cancelled it.
-  // kFailedAndCanceled = 6,
-
-  // Recorded if an authentication was requested within 60s of the previous
-  // successful authentication.
-  kAuthStillValid = 7,
-
-  // Recorded when the authentication flow is cancelled by Chrome.
-  kCanceledByChrome = 8,
-
-  kMaxValue = kCanceledByChrome,
-};
-
 // This interface encapsulates operations related to biometric authentication.
 // It's intended to be used prior to sharing the user's credentials with a
 // website, either via form filling or the Credential Management API.
@@ -96,6 +65,15 @@
   virtual void Authenticate(BiometricAuthRequester requester,
                             AuthenticateCallback callback) = 0;
 
+  // Asks the user to authenticate. Invokes |callback| asynchronously when
+  // the auth flow returns with the result.
+  // |requester| is the filling surface that is asking for authentication.
+  // |message| contains text that will be displayed to the end user on
+  // authentication request
+  virtual void AuthenticateWithMessage(BiometricAuthRequester requester,
+                                       const std::u16string message,
+                                       AuthenticateCallback callback) = 0;
+
   // Cancels an in-progress authentication if the filling surface requesting
   // the cancelation corresponds to the one for which the ongoing auth was
   // triggered.
diff --git a/components/device_reauth/mock_biometric_authenticator.h b/components/device_reauth/mock_biometric_authenticator.h
index 7cdd7c9..f79b5d6 100644
--- a/components/device_reauth/mock_biometric_authenticator.h
+++ b/components/device_reauth/mock_biometric_authenticator.h
@@ -21,6 +21,12 @@
               Authenticate,
               (BiometricAuthRequester, AuthenticateCallback),
               (override));
+  MOCK_METHOD(void,
+              AuthenticateWithMessage,
+              (BiometricAuthRequester,
+               const std::u16string,
+               AuthenticateCallback),
+              (override));
   MOCK_METHOD(void, Cancel, (BiometricAuthRequester), (override));
 
  private:
diff --git a/components/exo/wayland/wayland_display_observer.cc b/components/exo/wayland/wayland_display_observer.cc
index 5d91b1b..4d2812f 100644
--- a/components/exo/wayland/wayland_display_observer.cc
+++ b/components/exo/wayland/wayland_display_observer.cc
@@ -151,6 +151,10 @@
                                    size.height());
 }
 
+void WaylandDisplayHandler::XdgOutputSendDescription(const std::string& desc) {
+  zxdg_output_v1_send_description(xdg_output_resource_, desc.c_str());
+}
+
 bool WaylandDisplayHandler::SendDisplayMetrics(const display::Display& display,
                                                uint32_t changed_metrics) {
   if (!output_resource_)
@@ -219,6 +223,7 @@
   if (xdg_output_resource_) {
     XdgOutputSendLogicalPosition(origin);
     XdgOutputSendLogicalSize(display.bounds().size());
+    XdgOutputSendDescription(display.label());
   } else {
     if (wl_resource_get_version(output_resource_) >=
         WL_OUTPUT_SCALE_SINCE_VERSION) {
diff --git a/components/exo/wayland/wayland_display_observer.h b/components/exo/wayland/wayland_display_observer.h
index 5796e4e..9645e6a 100644
--- a/components/exo/wayland/wayland_display_observer.h
+++ b/components/exo/wayland/wayland_display_observer.h
@@ -71,6 +71,7 @@
   // Overridable for testing.
   virtual void XdgOutputSendLogicalPosition(const gfx::Point& position);
   virtual void XdgOutputSendLogicalSize(const gfx::Size& size);
+  virtual void XdgOutputSendDescription(const std::string& desc);
 
  private:
   // Overridden from WaylandDisplayObserver:
diff --git a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc
index f1a03ecd..33e8bf0 100644
--- a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc
+++ b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc
@@ -15,6 +15,7 @@
 #include "base/strings/strcat.h"
 #include "base/trace_event/trace_event.h"
 #include "components/password_manager/core/browser/password_store_backend.h"
+#include "components/password_manager/core/browser/password_sync_util.h"
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "components/password_manager/core/common/password_manager_pref_names.h"
 #include "components/prefs/pref_service.h"
@@ -24,6 +25,8 @@
 
 namespace {
 
+using sync_util::IsPasswordSyncEnabled;
+
 // Threshold for the next migration attempt. This is needed in order to prevent
 // clients from spamming GMS Core API.
 constexpr base::TimeDelta kMigrationThreshold = base::Days(1);
@@ -95,12 +98,10 @@
 BuiltInBackendToAndroidBackendMigrator::BuiltInBackendToAndroidBackendMigrator(
     PasswordStoreBackend* built_in_backend,
     PasswordStoreBackend* android_backend,
-    PrefService* prefs,
-    PasswordStoreBackend::SyncDelegate* sync_delegate)
+    PrefService* prefs)
     : built_in_backend_(built_in_backend),
       android_backend_(android_backend),
-      prefs_(prefs),
-      sync_delegate_(sync_delegate) {
+      prefs_(prefs) {
   DCHECK(built_in_backend_);
   DCHECK(android_backend_);
   base::UmaHistogramBoolean(
@@ -132,9 +133,13 @@
   }
 }
 
+void BuiltInBackendToAndroidBackendMigrator::OnSyncServiceInitialized(
+    syncer::SyncService* sync_service) {
+  sync_service_ = sync_service;
+}
+
 void BuiltInBackendToAndroidBackendMigrator::UpdateMigrationVersionInPref() {
-  if (IsMigrationNeeded(prefs_) &&
-      sync_delegate_->IsSyncingPasswordsEnabled()) {
+  if (IsMigrationNeeded(prefs_) && IsPasswordSyncEnabled(sync_service_)) {
     // TODO(crbug.com/1302299): Drop metadata and only then update pref.
   }
   prefs_->SetInteger(prefs::kCurrentMigrationVersionToGoogleMobileServices,
@@ -161,7 +166,7 @@
   // identical. Update calls don't fail because they would add a password in
   // the rare case that it doesn't exist in the target backend.
   if (IsMigrationNeeded(prefs_)) {
-    if (sync_delegate_->IsSyncingPasswordsEnabled()) {
+    if (IsPasswordSyncEnabled(sync_service_)) {
       // Sync is enabled. Migrate non-syncable data from the built-in backend
       // to android backend.
       built_in_backend_->GetAllLoginsAsync(base::BindOnce(
@@ -492,7 +497,7 @@
   // non-syncable data (e.g. after enrolling into the experiment).
   return IsMigrationNeeded(prefs_) &&
          (prefs_->GetBoolean(prefs::kRequiresMigrationAfterSyncStatusChange) ||
-          sync_delegate_->IsSyncingPasswordsEnabled());
+          IsPasswordSyncEnabled(sync_service_));
 }
 
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.h b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.h
index 2e13817..243902f 100644
--- a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.h
+++ b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.h
@@ -19,11 +19,9 @@
  public:
   // |built_in_backend| and |android_backend| must not be null and must outlive
   // the migrator.
-  BuiltInBackendToAndroidBackendMigrator(
-      PasswordStoreBackend* built_in_backend,
-      PasswordStoreBackend* android_backend,
-      PrefService* prefs,
-      PasswordStoreBackend::SyncDelegate* sync_delegate);
+  BuiltInBackendToAndroidBackendMigrator(PasswordStoreBackend* built_in_backend,
+                                         PasswordStoreBackend* android_backend,
+                                         PrefService* prefs);
 
   BuiltInBackendToAndroidBackendMigrator(
       const BuiltInBackendToAndroidBackendMigrator&) = delete;
@@ -37,6 +35,8 @@
 
   void StartMigrationIfNecessary();
 
+  void OnSyncServiceInitialized(syncer::SyncService* sync_service);
+
  private:
   struct IsPasswordLess;
   struct BackendAndLoginsResults;
@@ -111,7 +111,7 @@
 
   std::unique_ptr<MigrationMetricsReporter> metrics_reporter_;
 
-  const raw_ptr<PasswordStoreBackend::SyncDelegate> sync_delegate_;
+  raw_ptr<const syncer::SyncService> sync_service_ = nullptr;
 
   bool non_syncable_data_migration_in_progress_ = false;
 
diff --git a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc
index f35ad15..45cbda25 100644
--- a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc
+++ b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc
@@ -22,6 +22,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/prefs/testing_pref_service.h"
 #include "components/signin/public/base/signin_pref_names.h"
+#include "components/sync/driver/test_sync_service.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -69,11 +70,28 @@
         prefs::kRequiresMigrationAfterSyncStatusChange, false);
     prefs_.registry()->RegisterStringPref(::prefs::kGoogleServicesLastUsername,
                                           "testaccount@gmail.com");
-    migrator_ = std::make_unique<BuiltInBackendToAndroidBackendMigrator>(
-        &built_in_backend_, &android_backend_, &prefs_, &sync_delegate_);
+    CreateMigrator(&built_in_backend_, &android_backend_, &prefs_);
   }
 
-  MockPasswordBackendSyncDelegate& sync_delegate() { return sync_delegate_; }
+  void InitSyncService(bool is_password_sync_enabled) {
+    if (is_password_sync_enabled) {
+      sync_service_.GetUserSettings()->SetSelectedTypes(
+          /*sync_everything=*/false,
+          /*types=*/{syncer::UserSelectableType::kPasswords});
+    } else {
+      sync_service_.GetUserSettings()->SetSelectedTypes(
+          /*sync_everything=*/false, /*types=*/{});
+    }
+    migrator()->OnSyncServiceInitialized(&sync_service_);
+  }
+
+  void CreateMigrator(PasswordStoreBackend* built_in_backend,
+                      PasswordStoreBackend* android_backend,
+                      PrefService* prefs) {
+    migrator_ = std::make_unique<BuiltInBackendToAndroidBackendMigrator>(
+        built_in_backend, android_backend, prefs);
+  }
+
   PasswordStoreBackend& built_in_backend() { return built_in_backend_; }
   PasswordStoreBackend& android_backend() { return android_backend_; }
 
@@ -84,14 +102,12 @@
   void RunUntilIdle() { task_env_.RunUntilIdle(); }
   void FastForwardBy(base::TimeDelta delta) { task_env_.FastForwardBy(delta); }
 
- protected:
-  testing::StrictMock<MockPasswordBackendSyncDelegate> sync_delegate_;
-
  private:
   base::test::SingleThreadTaskEnvironment task_env_{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
   base::test::ScopedFeatureList feature_list_;
   TestingPrefServiceSimple prefs_;
+  syncer::TestSyncService sync_service_;
   FakePasswordStoreBackend built_in_backend_;
   FakePasswordStoreBackend android_backend_{
       IsAccountStore(false),
@@ -105,8 +121,7 @@
       /*enabled_feature=*/features::kUnifiedPasswordManagerAndroid,
       {{"migration_version", "1"}, {"stage", "0"}});
   Init();
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(true));
+  InitSyncService(/*is_password_sync_enabled=*/true);
 
   migrator()->StartMigrationIfNecessary();
   RunUntilIdle();
@@ -125,8 +140,7 @@
       {{"migration_version", "1"}, {"stage", "0"}});
   Init();
 
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(false));
+  InitSyncService(/*is_password_sync_enabled=*/false);
 
   migrator()->StartMigrationIfNecessary();
   RunUntilIdle();
@@ -144,8 +158,7 @@
       {{"migration_version", "1"}, {"stage", "3"}});
   Init();
 
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(false));
+  InitSyncService(/*is_password_sync_enabled=*/false);
 
   migrator()->StartMigrationIfNecessary();
   RunUntilIdle();
@@ -265,10 +278,10 @@
   feature_list().InitAndEnableFeatureWithParameters(
       /*enabled_feature=*/features::kUnifiedPasswordManagerAndroid,
       {{"migration_version", "1"}, {"stage", "0"}});
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(true));
 
   Init();
+  InitSyncService(/*is_password_sync_enabled=*/true);
+
   PasswordForm form = CreateTestPasswordForm();
   android_backend().AddLoginAsync(form, base::DoNothing());
 
@@ -300,8 +313,7 @@
 
   // Simulate sync being recently disabled.
   prefs()->SetBoolean(prefs::kRequiresMigrationAfterSyncStatusChange, true);
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(false));
+  InitSyncService(/*is_password_sync_enabled=*/false);
 
   PasswordForm form = CreateTestPasswordForm();
   built_in_backend().AddLoginAsync(form, base::DoNothing());
@@ -387,8 +399,7 @@
        InitialMigrationForSyncingUsers) {
   BuiltInBackendToAndroidBackendMigratorTest::Init();
 
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(true));
+  InitSyncService(/*is_password_sync_enabled=*/true);
 
   feature_list().InitAndEnableFeatureWithParameters(
       /*enabled_feature=*/features::kUnifiedPasswordManagerAndroid,
@@ -426,8 +437,7 @@
        InitialMigration) {
   BuiltInBackendToAndroidBackendMigratorTest::Init();
 
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(false));
+  InitSyncService(/*is_password_sync_enabled=*/false);
 
   feature_list().InitAndEnableFeatureWithParameters(
       /*enabled_feature=*/features::kUnifiedPasswordManagerAndroid,
@@ -570,15 +580,13 @@
           "PasswordManager.UnifiedPasswordManager.RollingMigration.Success";
     }
 
-    migrator_ = std::make_unique<BuiltInBackendToAndroidBackendMigrator>(
-        &built_in_backend_, &android_backend_, prefs(), &sync_delegate());
+    CreateMigrator(&built_in_backend_, &android_backend_, prefs());
   }
 
   std::string latency_metric_;
   std::string success_metric_;
   ::testing::StrictMock<MockPasswordStoreBackend> built_in_backend_;
   ::testing::StrictMock<MockPasswordStoreBackend> android_backend_;
-  std::unique_ptr<BuiltInBackendToAndroidBackendMigrator> migrator_;
 };
 
 TEST_P(BuiltInBackendToAndroidBackendMigratorTestMetrics,
@@ -586,8 +594,7 @@
   base::HistogramTester histogram_tester;
 
   // Initial migration only happens with sync enabled for now.
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(GetParam().is_sync_enabled));
+  InitSyncService(/*is_password_sync_enabled=*/GetParam().is_sync_enabled);
 
   EXPECT_CALL(built_in_backend_, GetAllLoginsAsync)
       .WillOnce(WithArg<0>(Invoke([](LoginsOrErrorReply reply) -> void {
@@ -610,7 +617,7 @@
         })));
   }
 
-  migrator_->StartMigrationIfNecessary();
+  migrator()->StartMigrationIfNecessary();
   FastForwardBy(kLatencyDelta);
 
   histogram_tester.ExpectTotalCount(latency_metric_, 1);
@@ -649,14 +656,12 @@
         /*enabled_feature=*/features::kUnifiedPasswordManagerAndroid,
         {{"migration_version", "1"}, {"stage", "0"}});
 
-    migrator_ = std::make_unique<BuiltInBackendToAndroidBackendMigrator>(
-        &built_in_backend_, &android_backend_, prefs(), &sync_delegate_);
+    CreateMigrator(&built_in_backend_, &android_backend_, prefs());
   }
 
   PasswordStoreBackend& built_in_backend() { return built_in_backend_; }
 
   ::testing::NiceMock<MockPasswordStoreBackend> android_backend_;
-  std::unique_ptr<BuiltInBackendToAndroidBackendMigrator> migrator_;
 
  private:
   FakePasswordStoreBackend built_in_backend_;
@@ -664,8 +669,7 @@
 
 TEST_F(BuiltInBackendToAndroidBackendMigratorWithMockAndroidBackendTest,
        DoesNotCompleteMigrationWhenWritingToAndroidBackendFails_SyncOn) {
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(true));
+  InitSyncService(/*is_password_sync_enabled=*/true);
 
   // Add two credentials to the built-in backend.
   built_in_backend().AddLoginAsync(CreateTestPasswordForm(/*index=*/1),
@@ -687,7 +691,7 @@
   // executed. Check that exactly one UpdateLoginAsync() is called.
   EXPECT_CALL(android_backend_, UpdateLoginAsync).Times(1);
 
-  migrator_->StartMigrationIfNecessary();
+  migrator()->StartMigrationIfNecessary();
 
   // Migration version is still 0 since migration didn't complete.
   EXPECT_EQ(0, prefs()->GetInteger(
@@ -704,8 +708,7 @@
 
   // Sync state doesn't affect this test, run it arbitrarily for non-sync'ing
   // users.
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(false));
+  InitSyncService(/*is_password_sync_enabled=*/false);
 
   // Add two credentials to the built-in backend.
   built_in_backend().AddLoginAsync(CreateTestPasswordForm(/*index=*/1),
@@ -734,7 +737,7 @@
   // executed. Check that exactly one AddLoginAsync() is called.
   EXPECT_CALL(android_backend_, AddLoginAsync).Times(1);
 
-  migrator_->StartMigrationIfNecessary();
+  migrator()->StartMigrationIfNecessary();
 
   // Migration version is still 0 since migration didn't complete.
   EXPECT_EQ(0, prefs()->GetInteger(
diff --git a/components/password_manager/core/browser/mock_password_store_backend.cc b/components/password_manager/core/browser/mock_password_store_backend.cc
index 4a5abb3f..86faa6f 100644
--- a/components/password_manager/core/browser/mock_password_store_backend.cc
+++ b/components/password_manager/core/browser/mock_password_store_backend.cc
@@ -6,9 +6,6 @@
 
 namespace password_manager {
 
-MockPasswordBackendSyncDelegate::MockPasswordBackendSyncDelegate() = default;
-MockPasswordBackendSyncDelegate::~MockPasswordBackendSyncDelegate() = default;
-
 MockPasswordStoreBackend::MockPasswordStoreBackend() = default;
 
 MockPasswordStoreBackend::~MockPasswordStoreBackend() = default;
diff --git a/components/password_manager/core/browser/mock_password_store_backend.h b/components/password_manager/core/browser/mock_password_store_backend.h
index 4707ff3..c687f45 100644
--- a/components/password_manager/core/browser/mock_password_store_backend.h
+++ b/components/password_manager/core/browser/mock_password_store_backend.h
@@ -19,15 +19,6 @@
 
 namespace password_manager {
 
-class MockPasswordBackendSyncDelegate
-    : public PasswordStoreBackend::SyncDelegate {
- public:
-  MockPasswordBackendSyncDelegate();
-  ~MockPasswordBackendSyncDelegate() override;
-
-  MOCK_METHOD(bool, IsSyncingPasswordsEnabled, (), (override));
-};
-
 class MockPasswordStoreBackend : public PasswordStoreBackend {
  public:
   MockPasswordStoreBackend();
diff --git a/components/password_manager/core/browser/password_store_backend.h b/components/password_manager/core/browser/password_store_backend.h
index 727cce924..38be22eb 100644
--- a/components/password_manager/core/browser/password_store_backend.h
+++ b/components/password_manager/core/browser/password_store_backend.h
@@ -56,22 +56,6 @@
 // IO operation from possibly blocking the main thread.
 class PasswordStoreBackend {
  public:
-  // Delegate which provides information about current sync status and an
-  // account used for syncing. It can be called only after Sync service was
-  // instantiated.
-  class SyncDelegate {
-   public:
-    SyncDelegate() = default;
-    SyncDelegate(const SyncDelegate&) = delete;
-    SyncDelegate(SyncDelegate&&) = delete;
-    SyncDelegate& operator=(const SyncDelegate&) = delete;
-    SyncDelegate& operator=(SyncDelegate&&) = delete;
-    virtual ~SyncDelegate() = default;
-
-    // Tells whether sync enabled or not.
-    virtual bool IsSyncingPasswordsEnabled() = 0;
-  };
-
   using RemoteChangesReceived =
       base::RepeatingCallback<void(absl::optional<PasswordStoreChangeList>)>;
 
@@ -167,11 +151,10 @@
 
   // Factory function for creating the backend. The Local backend requires the
   // provided `login_db_path` for storage and Android backend for migration
-  // purposes. |sync_delegate| is also required for migration purposes.
+  // purposes.
   static std::unique_ptr<PasswordStoreBackend> Create(
       const base::FilePath& login_db_path,
-      PrefService* prefs,
-      std::unique_ptr<SyncDelegate> sync_delegate);
+      PrefService* prefs);
 };
 
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/password_store_backend_migration_decorator.cc b/components/password_manager/core/browser/password_store_backend_migration_decorator.cc
index 7def0d87..5945ff7 100644
--- a/components/password_manager/core/browser/password_store_backend_migration_decorator.cc
+++ b/components/password_manager/core/browser/password_store_backend_migration_decorator.cc
@@ -20,6 +20,8 @@
 
 namespace {
 
+using sync_util::IsPasswordSyncEnabled;
+
 // Time in seconds by which the passwords migration from the built-in backend to
 // the Android backend is delayed.
 constexpr int kMigrationToAndroidBackendDelay = 30;
@@ -37,12 +39,10 @@
 PasswordStoreBackendMigrationDecorator::PasswordStoreBackendMigrationDecorator(
     std::unique_ptr<PasswordStoreBackend> built_in_backend,
     std::unique_ptr<PasswordStoreBackend> android_backend,
-    PrefService* prefs,
-    std::unique_ptr<SyncDelegate> sync_delegate)
+    PrefService* prefs)
     : built_in_backend_(std::move(built_in_backend)),
       android_backend_(std::move(android_backend)),
       prefs_(prefs),
-      sync_delegate_(std::move(sync_delegate)),
       sync_settings_helper_(prefs) {
   DCHECK(built_in_backend_);
   DCHECK(android_backend_);
@@ -151,8 +151,7 @@
   // data in the remote store. For shadow traffic, this doesn't matter.
   if (ShouldAttemptMigration(prefs_)) {
     migrator_ = std::make_unique<BuiltInBackendToAndroidBackendMigrator>(
-        built_in_backend_.get(), android_backend_.get(), prefs_,
-        sync_delegate_.get());
+        built_in_backend_.get(), android_backend_.get(), prefs_);
     base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
         FROM_HERE,
         base::BindOnce(
@@ -282,12 +281,17 @@
   sync_settings_helper_.CachePasswordSyncSettingOnStartup(sync_service);
   sync_service->AddObserver(&sync_settings_helper_);
   active_backend_->OnSyncServiceInitialized(sync_service);
+  if (migrator_) {
+    // The migrator exists only if prefs allow the migration.
+    DCHECK(ShouldAttemptMigration(prefs_));
+    migrator_->OnSyncServiceInitialized(sync_service);
+  }
 }
 
 void PasswordStoreBackendMigrationDecorator::StartMigrationAfterInit() {
   DCHECK(migrator_);
   if (prefs_->GetBoolean(prefs::kRequiresMigrationAfterSyncStatusChange) &&
-      !sync_delegate_->IsSyncingPasswordsEnabled()) {
+      !IsPasswordSyncEnabled(sync_service_)) {
     // Sync was disabled at the end of the last session, but migration from
     // the android backend to the built-in backend didn't happen. It's not
     // safe to attempt to call the android backend to migrate logins. Disable
diff --git a/components/password_manager/core/browser/password_store_backend_migration_decorator.h b/components/password_manager/core/browser/password_store_backend_migration_decorator.h
index 2dcab70..0296e5a2 100644
--- a/components/password_manager/core/browser/password_store_backend_migration_decorator.h
+++ b/components/password_manager/core/browser/password_store_backend_migration_decorator.h
@@ -30,8 +30,7 @@
   PasswordStoreBackendMigrationDecorator(
       std::unique_ptr<PasswordStoreBackend> built_in_backend,
       std::unique_ptr<PasswordStoreBackend> android_backend,
-      PrefService* prefs,
-      std::unique_ptr<SyncDelegate> sync_delegate);
+      PrefService* prefs);
   PasswordStoreBackendMigrationDecorator(
       const PasswordStoreBackendMigrationDecorator&) = delete;
   PasswordStoreBackendMigrationDecorator(
@@ -151,8 +150,7 @@
 
   const raw_ptr<PrefService> prefs_ = nullptr;
 
-  // A delegate used to retrieve sync status.
-  std::unique_ptr<SyncDelegate> sync_delegate_;
+  raw_ptr<const syncer::SyncService> sync_service_ = nullptr;
 
   std::unique_ptr<BuiltInBackendToAndroidBackendMigrator> migrator_;
 
diff --git a/components/password_manager/core/browser/password_store_backend_migration_decorator_unittest.cc b/components/password_manager/core/browser/password_store_backend_migration_decorator_unittest.cc
index 03a7d30..490eded 100644
--- a/components/password_manager/core/browser/password_store_backend_migration_decorator_unittest.cc
+++ b/components/password_manager/core/browser/password_store_backend_migration_decorator_unittest.cc
@@ -51,13 +51,9 @@
         /*enabled_feature=*/features::kUnifiedPasswordManagerAndroid,
         {{"migration_version", "1"}, {"stage", "0"}});
 
-    std::unique_ptr<MockPasswordBackendSyncDelegate> sync_delegate =
-        std::make_unique<MockPasswordBackendSyncDelegate>();
-    sync_delegate_ = sync_delegate.get();
     backend_migration_decorator_ =
         std::make_unique<PasswordStoreBackendMigrationDecorator>(
-            CreateBuiltInBackend(), CreateAndroidBackend(), &prefs_,
-            std::move(sync_delegate));
+            CreateBuiltInBackend(), CreateAndroidBackend(), &prefs_);
   }
 
   ~PasswordStoreBackendMigrationDecoratorTest() override {
@@ -89,7 +85,6 @@
     RunUntilIdle();
   }
 
-  MockPasswordBackendSyncDelegate& sync_delegate() { return *sync_delegate_; }
   PasswordStoreBackend* backend_migration_decorator() {
     return backend_migration_decorator_.get();
   }
@@ -123,7 +118,6 @@
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
   base::test::ScopedFeatureList feature_list_;
   TestingPrefServiceSimple prefs_;
-  raw_ptr<MockPasswordBackendSyncDelegate> sync_delegate_;
   raw_ptr<MockPasswordStoreBackend> built_in_backend_;
   raw_ptr<MockPasswordStoreBackend> android_backend_;
   syncer::TestSyncService sync_service_;
@@ -224,10 +218,11 @@
       /*sync_enabled_or_disabled_cb=*/base::DoNothing(),
       /*completion=*/mock_completion_callback.Get());
 
-  // Invoke sync callback to simulate a change in sync status. Set expectation
-  // for sync to be turned off.
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillOnce(Return(true));
+  InitSyncService(/*is_password_sync_enabled=*/true);
+
+  // Disable password sync in settings.
+  ChangeSyncSetting(/*is_password_sync_enabled=*/false);
+  // Invoke sync callback to simulate a change in sync status.
   EXPECT_CALL(*android_backend(), ClearAllLocalPasswords);
   sync_status_changed_closure.Run();
 
@@ -267,15 +262,15 @@
 
   InitSyncService(/*is_password_sync_enabled=*/false);
 
-  // Invoke sync callback to simulate a change in sync status. Set expectation
-  // for sync to be turned on.
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(true));
+  // Enable password sync in settings.
+  ChangeSyncSetting(/*is_password_sync_enabled=*/true);
+
   // Migration of non-syncable data to the android backend will trigger
   // login retrieval from the built-in backend first.
   EXPECT_CALL(*built_in_backend(), GetAllLoginsAsync);
   EXPECT_CALL(*android_backend(), GetAllLoginsAsync).Times(0);
 
+  // Invoke sync callback to simulate a change in sync status.
   sync_status_changed_closure.Run();
   RunUntilIdle();
 
@@ -315,8 +310,6 @@
 
   // Invoke sync callback to simulate appliying new setting. Set expectation
   // for sync to be turned off.
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(false));
   // Migration of non-syncable data to the built-in backend will trigger
   // retrieval of logins for the last sync account from the android backend
   // first.
@@ -337,9 +330,6 @@
     PasswordStoreBackendMigrationDecoratorTest,
     ResetAutoSignInWhenInitBackendAfterSyncWasDisabledButSettingWasNotApplied) {
   prefs().SetBoolean(prefs::kRequiresMigrationAfterSyncStatusChange, true);
-  // Set expectation for sync to be turned off.
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(false));
 
   // Init backend.
   base::MockCallback<base::OnceCallback<void(bool)>> mock_completion_callback;
@@ -363,6 +353,9 @@
       /*sync_enabled_or_disabled_cb=*/base::DoNothing(),
       /*completion=*/mock_completion_callback.Get());
 
+  // Set expectation for sync to be turned off.
+  InitSyncService(/*is_password_sync_enabled=*/false);
+
   // Expect that autosignin will be disabled for logins in the buil-in backend.
   EXPECT_CALL(*built_in_backend(), DisableAutoSignInForOriginsAsync);
   FastForwardUntilNoTasksRemain();
@@ -400,8 +393,6 @@
   ChangeSyncSetting(/*is_password_sync_enabled=*/false);
   // Invoke sync callback to simulate appliying new setting. Set expectation
   // for sync to be turned off.
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(false));
   // Migration of non-syncable data to the built-in backend will trigger
   // retrieval of logins for the last sync account from the android backend
   // first.
@@ -431,9 +422,6 @@
   ChangeSyncSetting(/*is_password_sync_enabled=*/true);
   // Invoke sync callback to simulate appliying new setting. Set expectation
   // for sync to be turned on.
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(true));
-
   // Migration of non-syncable data should not start, as the previous
   // migration attempt is still running.
   EXPECT_CALL(*built_in_backend(), GetAllLoginsAsync).Times(0);
@@ -471,15 +459,15 @@
 
   InitSyncService(/*is_password_sync_enabled=*/false);
 
-  // Invoke sync callback to simulate a change in sync status. Set expectation
-  // for sync to be turned on.
-  EXPECT_CALL(sync_delegate(), IsSyncingPasswordsEnabled)
-      .WillRepeatedly(Return(true));
+  // Enable password sync in settings.
+  ChangeSyncSetting(/*is_password_sync_enabled=*/true);
+
   // Migration of non-syncable data to the android backend will not start and
   // therefore will not trigger any logins retrieval.
   EXPECT_CALL(*built_in_backend(), GetAllLoginsAsync).Times(0);
   EXPECT_CALL(*android_backend(), GetAllLoginsAsync).Times(0);
 
+  // Invoke sync callback to simulate a change in sync status.
   sync_status_changed_closure.Run();
   RunUntilIdle();
 
diff --git a/components/password_manager/core/browser/password_store_proxy_backend_unittest.cc b/components/password_manager/core/browser/password_store_proxy_backend_unittest.cc
index 3d80977..0d8d74f8 100644
--- a/components/password_manager/core/browser/password_store_proxy_backend_unittest.cc
+++ b/components/password_manager/core/browser/password_store_proxy_backend_unittest.cc
@@ -134,7 +134,6 @@
   base::test::ScopedFeatureList feature_list_;
   TestingPrefServiceSimple prefs_;
   std::unique_ptr<PasswordStoreProxyBackend> proxy_backend_;
-  testing::NiceMock<MockPasswordBackendSyncDelegate> sync_delegate_;
   StrictMock<MockPasswordStoreBackend> built_in_backend_;
   StrictMock<MockPasswordStoreBackend> android_backend_;
   syncer::TestSyncService sync_service_;
diff --git a/components/password_manager/core/browser/saved_passwords_capabilities_fetcher.cc b/components/password_manager/core/browser/saved_passwords_capabilities_fetcher.cc
index 5ce5177..7347dcc 100644
--- a/components/password_manager/core/browser/saved_passwords_capabilities_fetcher.cc
+++ b/components/password_manager/core/browser/saved_passwords_capabilities_fetcher.cc
@@ -15,6 +15,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/scoped_observation.h"
 #include "base/stl_util.h"
+#include "base/values.h"
 #include "components/password_manager/core/browser/password_store_interface.h"
 #include "components/password_manager/core/browser/ui/saved_passwords_presenter.h"
 #include "components/password_manager/core/common/password_manager_features.h"
@@ -324,10 +325,12 @@
 
 base::Value::List SavedPasswordsCapabilitiesFetcher::GetCacheEntries() const {
   base::Value::List cache_entries;
-  for (const auto& [origin, capabilities] : cache_) {
+  for (const auto& [origin, _] : cache_) {
     base::Value::Dict entry;
     entry.Set("url", origin.Serialize());
-    entry.Set("has_script", capabilities.has_script);
+    // Use `IsScriptAvailable` instead of reading it from the value directly
+    // to allow overriding by `kForceEnablePasswordDomainCapabilities`.
+    entry.Set("has_script", IsScriptAvailable(origin));
     cache_entries.Append(std::move(entry));
   }
 
diff --git a/components/password_manager/core/browser/saved_passwords_capabilities_fetcher_unittest.cc b/components/password_manager/core/browser/saved_passwords_capabilities_fetcher_unittest.cc
index 2d3a57c..5c9f085c 100644
--- a/components/password_manager/core/browser/saved_passwords_capabilities_fetcher_unittest.cc
+++ b/components/password_manager/core/browser/saved_passwords_capabilities_fetcher_unittest.cc
@@ -5,12 +5,14 @@
 #include "components/password_manager/core/browser/saved_passwords_capabilities_fetcher.h"
 
 #include "base/callback.h"
+#include "base/ranges/algorithm.h"
 #include "base/test/gmock_callback_support.h"
 #include "base/test/gmock_move_support.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
+#include "base/values.h"
 #include "components/password_manager/core/browser/capabilities_service.h"
 #include "components/password_manager/core/browser/password_form.h"
 #include "components/password_manager/core/browser/test_password_store.h"
@@ -28,6 +30,7 @@
 using ::testing::Pair;
 using ::testing::SaveArg;
 using ::testing::SaveArgPointee;
+using ::testing::StaticAssertTypeEq;
 using ::testing::UnorderedElementsAre;
 using testing::WithArgs;
 
@@ -608,8 +611,8 @@
 
   std::vector<std::string> urls;
   // Only `kOriginWithoutScript` is not expected to have a script.
-  for (auto it = cache_entries.begin(); it != cache_entries.end(); ++it) {
-    base::Value::Dict& entry = it->GetDict();
+  for (const auto& element : cache_entries) {
+    const base::Value::Dict& entry = element.GetDict();
     const std::string* url = entry.FindString("url");
     absl::optional<bool> has_script = entry.FindBool("has_script");
     EXPECT_TRUE(url);
@@ -622,6 +625,18 @@
   EXPECT_THAT(urls,
               UnorderedElementsAre(kOriginWithoutScript, kOriginWithScript1,
                                    kOriginWithScript2, kOriginWithScript3));
+
+  base::test::ScopedFeatureList features;
+  features.InitAndEnableFeature(
+      password_manager::features::kForceEnablePasswordDomainCapabilities);
+  // Now all domains should return available scripts.
+  cache_entries = fetcher_->GetCacheEntries();
+  EXPECT_EQ(cache_entries.size(), 4u);
+  EXPECT_TRUE(base::ranges::all_of(
+      cache_entries.cbegin(), cache_entries.cend(),
+      [](const base::Value& element) {
+        return element.GetDict().FindBool("has_script").value_or(false);
+      }));
 }
 
 }  // namespace password_manager
diff --git a/components/permissions/BUILD.gn b/components/permissions/BUILD.gn
index ca123ef39..bd71040 100644
--- a/components/permissions/BUILD.gn
+++ b/components/permissions/BUILD.gn
@@ -80,6 +80,8 @@
     "permission_request_id.h",
     "permission_request_manager.cc",
     "permission_request_manager.h",
+    "permission_request_queue.cc",
+    "permission_request_queue.h",
     "permission_result.cc",
     "permission_result.h",
     "permission_ui_selector.cc",
@@ -260,6 +262,7 @@
     "permission_decision_auto_blocker_unittest.cc",
     "permission_manager_unittest.cc",
     "permission_request_manager_unittest.cc",
+    "permission_request_queue_unittest.cc",
     "permission_uma_util_unittest.cc",
   ]
   if (!is_android) {
diff --git a/components/permissions/permission_request_manager.cc b/components/permissions/permission_request_manager.cc
index 55344b2..ca6f86a 100644
--- a/components/permissions/permission_request_manager.cc
+++ b/components/permissions/permission_request_manager.cc
@@ -10,22 +10,18 @@
 #include "base/auto_reset.h"
 #include "base/bind.h"
 #include "base/command_line.h"
-#include "base/containers/circular_deque.h"
-#include "base/feature_list.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
 #include "base/observer_list.h"
 #include "base/stl_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
-#include "build/build_config.h"
 #include "components/autofill_assistant/browser/public/runtime_manager.h"
 #include "components/back_forward_cache/back_forward_cache_disable.h"
 #include "components/permissions/features.h"
 #include "components/permissions/permission_decision_auto_blocker.h"
 #include "components/permissions/permission_prompt.h"
 #include "components/permissions/permission_request.h"
-#include "components/permissions/permission_request_id.h"
 #include "components/permissions/permissions_client.h"
 #include "components/permissions/request_type.h"
 #include "components/permissions/switches.h"
@@ -76,10 +72,10 @@
 
 namespace {
 
-// When there are multiple permissions requests in `queued_requests_`, we try to
-// reorder them based on the acceptance rates. Notifications and Geolocations
-// have one of the lowest acceptance, hence they have the lowest priority and
-// will be shown the last.
+// When there are multiple permissions requests in
+// `pending_permission_requests_`, we try to prioritize them based on the
+// acceptance rates. Notifications and Geolocations have one of the lowest
+// acceptance, hence they have the lowest priority and will be shown the last.
 bool IsLowPriorityRequest(PermissionRequest* request) {
   return request->request_type() == RequestType::kNotifications ||
          request->request_type() == RequestType::kGeolocation;
@@ -140,7 +136,7 @@
 PermissionRequestManager::~PermissionRequestManager() {
   DCHECK(!IsRequestInProgress());
   DCHECK(duplicate_requests_.empty());
-  DCHECK(queued_requests_.empty());
+  DCHECK(pending_permission_requests_.IsEmpty());
 }
 
 void PermissionRequestManager::AddRequest(
@@ -325,7 +321,7 @@
 void PermissionRequestManager::QueueRequest(
     content::RenderFrameHost* source_frame,
     PermissionRequest* request) {
-  PushQueuedRequest(request);
+  pending_permission_requests_.Push(request);
   request_sources_map_.emplace(
       request, PermissionRequestSource({source_frame->GetProcess()->GetID(),
                                         source_frame->GetRoutingID()}));
@@ -334,7 +330,7 @@
 void PermissionRequestManager::PreemptAndRequeueCurrentRequest() {
   ResetViewStateForCurrentRequest();
   for (auto* current_request : requests_) {
-    PushQueuedRequest(current_request);
+    pending_permission_requests_.Push(current_request);
   }
   requests_.clear();
 }
@@ -377,12 +373,11 @@
     return;
   }
 
-  if (!queued_requests_.empty() || IsRequestInProgress()) {
-    // |queued_requests_| and |requests_| will be deleted below, which
-    // might be a problem for back-forward cache — the page might be restored
-    // later, but the requests won't be.
-    // Disable bfcache here if we have any requests here to prevent this
-    // from happening.
+  if (!pending_permission_requests_.IsEmpty() || IsRequestInProgress()) {
+    // |pending_permission_requests_| and |requests_| will be deleted below,
+    // which might be a problem for back-forward cache — the page might be
+    // restored later, but the requests won't be. Disable bfcache here if we
+    // have any requests here to prevent this from happening.
     content::BackForwardCache::DisableForRenderFrameHost(
         navigation_handle->GetPreviousRenderFrameHostId(),
         back_forward_cache::DisabledReason(
@@ -615,8 +610,8 @@
   }
 
   // Find first valid request.
-  while (!queued_requests_.empty()) {
-    PermissionRequest* next = PopNextQueuedRequest();
+  while (!pending_permission_requests_.IsEmpty()) {
+    PermissionRequest* next = pending_permission_requests_.Pop();
     PermissionRequestSource& source = request_sources_map_.find(next)->second;
     if (!source.IsSourceFrameInactiveAndDisallowActivation()) {
       requests_.push_back(next);
@@ -632,8 +627,9 @@
   }
 
   // Find additional requests that can be grouped with the first one.
-  for (; !queued_requests_.empty(); PopNextQueuedRequest()) {
-    PermissionRequest* front = PeekNextQueuedRequest();
+  for (; !pending_permission_requests_.IsEmpty();
+       pending_permission_requests_.Pop()) {
+    PermissionRequest* front = pending_permission_requests_.Peek();
     PermissionRequestSource& source = request_sources_map_.find(front)->second;
     if (source.IsSourceFrameInactiveAndDisallowActivation()) {
       front->Cancelled();
@@ -847,12 +843,13 @@
 }
 
 void PermissionRequestManager::CleanUpRequests() {
-  for (auto* queued_request : queued_requests_) {
-    CancelledIncludingDuplicates(queued_request);
-    RequestFinishedIncludingDuplicates(queued_request);
-    request_sources_map_.erase(request_sources_map_.find(queued_request));
+  for (; !pending_permission_requests_.IsEmpty();
+       pending_permission_requests_.Pop()) {
+    auto* pending_request = pending_permission_requests_.Peek();
+    CancelledIncludingDuplicates(pending_request);
+    RequestFinishedIncludingDuplicates(pending_request);
+    request_sources_map_.erase(request_sources_map_.find(pending_request));
   }
-  queued_requests_.clear();
 
   if (IsRequestInProgress()) {
     std::vector<PermissionRequest*>::iterator requests_iter;
@@ -874,19 +871,15 @@
     if (request->IsDuplicateOf(existing_request))
       return existing_request;
   }
-  for (PermissionRequest* queued_request : queued_requests_) {
-    if (request->IsDuplicateOf(queued_request))
-      return queued_request;
-  }
-  return nullptr;
+  return pending_permission_requests_.FindDuplicate(request);
 }
 
 void PermissionRequestManager::PermissionGrantedIncludingDuplicates(
     PermissionRequest* request,
     bool is_one_time) {
-  DCHECK_EQ(1, base::STLCount(requests_, request) +
-                   base::STLCount(queued_requests_, request))
-      << "Only requests in [queued_[frame_]]requests_ can have duplicates";
+  DCHECK_EQ(1ul, base::STLCount(requests_, request) +
+                     pending_permission_requests_.Count(request))
+      << "Only requests in [pending_permission_]requests_ can have duplicates";
   request->PermissionGranted(is_one_time);
   auto range = duplicate_requests_.equal_range(request);
   for (auto it = range.first; it != range.second; ++it)
@@ -895,9 +888,9 @@
 
 void PermissionRequestManager::PermissionDeniedIncludingDuplicates(
     PermissionRequest* request) {
-  DCHECK_EQ(1, base::STLCount(requests_, request) +
-                   base::STLCount(queued_requests_, request))
-      << "Only requests in [queued_]requests_ can have duplicates";
+  DCHECK_EQ(1ul, base::STLCount(requests_, request) +
+                     pending_permission_requests_.Count(request))
+      << "Only requests in [pending_permission_]requests_ can have duplicates";
   request->PermissionDenied();
   auto range = duplicate_requests_.equal_range(request);
   for (auto it = range.first; it != range.second; ++it)
@@ -906,9 +899,9 @@
 
 void PermissionRequestManager::CancelledIncludingDuplicates(
     PermissionRequest* request) {
-  DCHECK_EQ(1, base::STLCount(requests_, request) +
-                   base::STLCount(queued_requests_, request))
-      << "Only requests in [queued_]requests_ can have duplicates";
+  DCHECK_EQ(1ul, base::STLCount(requests_, request) +
+                     pending_permission_requests_.Count(request))
+      << "Only requests in [pending_permission_]requests_ can have duplicates";
   request->Cancelled();
   auto range = duplicate_requests_.equal_range(request);
   for (auto it = range.first; it != range.second; ++it)
@@ -917,9 +910,9 @@
 
 void PermissionRequestManager::RequestFinishedIncludingDuplicates(
     PermissionRequest* request) {
-  DCHECK_EQ(1, base::STLCount(requests_, request) +
-                   base::STLCount(queued_requests_, request))
-      << "Only requests in [queued_]requests_ can have duplicates";
+  DCHECK_EQ(1ul, base::STLCount(requests_, request) +
+                     pending_permission_requests_.Count(request))
+      << "Only requests in [pending_permission_]requests_ can have duplicates";
   request->RequestFinished();
   // Beyond this point, |request| has probably been deleted.
   auto range = duplicate_requests_.equal_range(request);
@@ -1093,30 +1086,6 @@
   }
 }
 
-PermissionRequest* PermissionRequestManager::PeekNextQueuedRequest() {
-  return base::FeatureList::IsEnabled(features::kPermissionChip)
-             ? queued_requests_.back()
-             : queued_requests_.front();
-}
-
-PermissionRequest* PermissionRequestManager::PopNextQueuedRequest() {
-  PermissionRequest* next = PeekNextQueuedRequest();
-  if (base::FeatureList::IsEnabled(features::kPermissionChip))
-    queued_requests_.pop_back();
-  else
-    queued_requests_.pop_front();
-  return next;
-}
-
-void PermissionRequestManager::PushQueuedRequest(PermissionRequest* request) {
-  if (base::FeatureList::IsEnabled(features::kPermissionQuietChip) &&
-      !base::FeatureList::IsEnabled(features::kPermissionChip)) {
-    queued_requests_.push_front(request);
-  } else {
-    queued_requests_.push_back(request);
-  }
-}
-
 WEB_CONTENTS_USER_DATA_KEY_IMPL(PermissionRequestManager);
 
 }  // namespace permissions
diff --git a/components/permissions/permission_request_manager.h b/components/permissions/permission_request_manager.h
index 4dd362131..1c19d7f4 100644
--- a/components/permissions/permission_request_manager.h
+++ b/components/permissions/permission_request_manager.h
@@ -6,16 +6,14 @@
 #define COMPONENTS_PERMISSIONS_PERMISSION_REQUEST_MANAGER_H_
 
 #include <algorithm>
-#include <unordered_map>
 #include <utility>
 #include <vector>
 
-#include "base/containers/circular_deque.h"
-#include "base/gtest_prod_util.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "base/time/time.h"
 #include "components/permissions/permission_prompt.h"
+#include "components/permissions/permission_request_queue.h"
 #include "components/permissions/permission_ui_selector.h"
 #include "components/permissions/permission_uma_util.h"
 #include "content/public/browser/web_contents_observer.h"
@@ -221,14 +219,14 @@
   CurrentRequestFate GetCurrentRequestFateInFaceOfNewRequest(
       PermissionRequest* request);
 
-  // Adds `request` into `queued_requests_`, and request's `source_frame` into
-  // `request_sources_map_`.
+  // Adds `request` into `pending_permission_requests_`, and request's
+  // `source_frame` into `request_sources_map_`.
   void QueueRequest(content::RenderFrameHost* source_frame,
                     PermissionRequest* request);
 
   // Because the requests are shown in a different order for Normal and Quiet
-  // Chip, pending requests are returned back to queued_requests_ to process
-  // them after the new requests.
+  // Chip, pending requests are returned back to pending_permission_requests_ to
+  // process them after the new requests.
   void PreemptAndRequeueCurrentRequest();
 
   // Posts a task which will allow the bubble to become visible.
@@ -264,10 +262,10 @@
   // main frame.
   void CleanUpRequests();
 
-  // Searches |requests_|, |queued_requests_| and |queued_frame_requests_| - but
-  // *not* |duplicate_requests_| - for a request matching |request|, and returns
-  // the matching request, or |nullptr| if no match. Note that the matching
-  // request may or may not be the same object as |request|.
+  // Searches |requests_| and |pending_permission_requests_| - but *not*
+  // |duplicate_requests_| - for a request matching |request|, and returns the
+  // matching request, or |nullptr| if no match. Note that the matching request
+  // may or may not be the same object as |request|.
   PermissionRequest* GetExistingRequest(PermissionRequest* request);
 
   // Calls PermissionGranted on a request and all its duplicates.
@@ -324,28 +322,16 @@
     bool IsSourceFrameInactiveAndDisallowActivation() const;
   };
 
-  PermissionRequest* PeekNextQueuedRequest();
-
-  PermissionRequest* PopNextQueuedRequest();
-
-  // Encapsulate enqueuing `request` into `queued_requests_`. Based on the chip
-  // / quiet chip experiments, the `request` is added into the back or front of
-  // the queue.
-  void PushQueuedRequest(PermissionRequest* request);
-
-  // TODO(crbug.com/1221150): Create a separate entity to handle Enqueue /
-  // Dequeue with all edge cases. Expose to `PermissionRequestManager` only a
-  // clear API like `Peek()` and `Pop()`, etc.
-  base::circular_deque<PermissionRequest*> queued_requests_;
+  PermissionRequestQueue pending_permission_requests_;
 
   // Maps from the first request of a kind to subsequent requests that were
   // duped against it.
   std::unordered_multimap<PermissionRequest*, PermissionRequest*>
       duplicate_requests_;
 
-  // Maps each PermissionRequest currently in |requests_| or |queued_requests_|
-  // to which RenderFrameHost it originated from. Note that no date is stored
-  // for |duplicate_requests_|.
+  // Maps each PermissionRequest currently in |requests_| or
+  // |pending_permission_requests_| to which RenderFrameHost it originated from.
+  // Note that no date is stored for |duplicate_requests_|.
   std::map<PermissionRequest*, PermissionRequestSource> request_sources_map_;
 
   base::ObserverList<Observer>::Unchecked observer_list_;
diff --git a/components/permissions/permission_request_queue.cc b/components/permissions/permission_request_queue.cc
new file mode 100644
index 0000000..44e0950
--- /dev/null
+++ b/components/permissions/permission_request_queue.cc
@@ -0,0 +1,70 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/permissions/permission_request_queue.h"
+
+#include "base/stl_util.h"
+#include "components/permissions/features.h"
+
+namespace permissions {
+
+PermissionRequestQueue::PermissionRequestQueue() = default;
+
+PermissionRequestQueue::~PermissionRequestQueue() = default;
+
+bool PermissionRequestQueue::IsEmpty() {
+  return queued_requests_.empty();
+}
+
+size_t PermissionRequestQueue::Count() {
+  return queued_requests_.size();
+}
+
+size_t PermissionRequestQueue::Count(PermissionRequest* request) {
+  return base::STLCount(queued_requests_, request);
+}
+
+void PermissionRequestQueue::Push(permissions::PermissionRequest* request) {
+  if (base::FeatureList::IsEnabled(features::kPermissionQuietChip) &&
+      !base::FeatureList::IsEnabled(features::kPermissionChip)) {
+    queued_requests_.push_front(request);
+  } else {
+    queued_requests_.push_back(request);
+  }
+}
+
+PermissionRequest* PermissionRequestQueue::Pop() {
+  PermissionRequest* next = Peek();
+  if (base::FeatureList::IsEnabled(features::kPermissionChip))
+    queued_requests_.pop_back();
+  else
+    queued_requests_.pop_front();
+  return next;
+}
+
+PermissionRequest* PermissionRequestQueue::Peek() {
+  return base::FeatureList::IsEnabled(features::kPermissionChip)
+             ? queued_requests_.back()
+             : queued_requests_.front();
+}
+
+PermissionRequest* PermissionRequestQueue::FindDuplicate(
+    PermissionRequest* request) {
+  for (PermissionRequest* queued_request : queued_requests_) {
+    if (request->IsDuplicateOf(queued_request)) {
+      return queued_request;
+    }
+  }
+  return nullptr;
+}
+
+PermissionRequestQueue::iterator PermissionRequestQueue::begin() {
+  return queued_requests_.begin();
+}
+
+PermissionRequestQueue::iterator PermissionRequestQueue::end() {
+  return queued_requests_.end();
+}
+
+};  // namespace permissions
diff --git a/components/permissions/permission_request_queue.h b/components/permissions/permission_request_queue.h
new file mode 100644
index 0000000..8f552b9
--- /dev/null
+++ b/components/permissions/permission_request_queue.h
@@ -0,0 +1,48 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_PERMISSIONS_PERMISSION_REQUEST_QUEUE_H_
+#define COMPONENTS_PERMISSIONS_PERMISSION_REQUEST_QUEUE_H_
+
+#include <cstddef>
+
+#include "base/containers/circular_deque.h"
+#include "components/permissions/permission_request.h"
+
+namespace permissions {
+
+// Provides a container for holding pending PermissionRequest objects and
+// provides access methods respecting the currently applicable feature flag
+// configuration.
+class PermissionRequestQueue {
+ public:
+  using iterator = base::circular_deque<PermissionRequest*>::iterator;
+
+  // Not copyable or movable
+  PermissionRequestQueue(const PermissionRequestQueue&) = delete;
+  PermissionRequestQueue& operator=(const PermissionRequestQueue&) = delete;
+  PermissionRequestQueue();
+  ~PermissionRequestQueue();
+
+  bool IsEmpty();
+  size_t Count();
+  size_t Count(PermissionRequest* request);
+  void Push(permissions::PermissionRequest* request);
+  PermissionRequest* Pop();
+  PermissionRequest* Peek();
+
+  // Searches queued_requests_ and returns the first matching request, or
+  // nullptr if there is no match.
+  PermissionRequest* FindDuplicate(PermissionRequest* request);
+
+ private:
+  iterator begin();
+  iterator end();
+
+  base::circular_deque<PermissionRequest*> queued_requests_;
+};
+
+}  // namespace permissions
+
+#endif  // COMPONENTS_PERMISSIONS_PERMISSION_REQUEST_QUEUE_H_
diff --git a/components/permissions/permission_request_queue_unittest.cc b/components/permissions/permission_request_queue_unittest.cc
new file mode 100644
index 0000000..0a43ada0
--- /dev/null
+++ b/components/permissions/permission_request_queue_unittest.cc
@@ -0,0 +1,146 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <stddef.h>
+#include <memory>
+#include <string>
+
+#include "base/bind.h"
+#include "base/command_line.h"
+#include "base/test/scoped_feature_list.h"
+#include "build/build_config.h"
+#include "components/permissions/features.h"
+#include "components/permissions/permission_request.h"
+#include "components/permissions/permission_request_queue.h"
+#include "components/permissions/request_type.h"
+#include "components/permissions/test/mock_permission_prompt_factory.h"
+#include "components/permissions/test/mock_permission_request.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace permissions {
+
+enum UiFeatureConfig { NoChip, QuietChipOnly, ChipOnly, QuietChipAndChip };
+
+class PermissionRequestQueueTest
+    : public ::testing::Test,
+      public ::testing::WithParamInterface<UiFeatureConfig> {
+ public:
+  PermissionRequestQueueTest()
+      : request1_(RequestType::kGeolocation,
+                  PermissionRequestGestureType::GESTURE),
+        request2_(RequestType::kMultipleDownloads,
+                  PermissionRequestGestureType::NO_GESTURE) {
+    switch (GetParam()) {
+      case NoChip:
+        feature_list_.InitWithFeatures(
+            {}, {permissions::features::kPermissionChip,
+                 permissions::features::kPermissionQuietChip});
+        break;
+      case QuietChipOnly:
+        feature_list_.InitWithFeatures(
+            {permissions::features::kPermissionQuietChip},
+            {permissions::features::kPermissionChip});
+        break;
+      case ChipOnly:
+        feature_list_.InitWithFeatures(
+            {permissions::features::kPermissionChip},
+            {permissions::features::kPermissionQuietChip});
+        break;
+      case QuietChipAndChip:
+        feature_list_.InitWithFeatures(
+            {permissions::features::kPermissionChip,
+             permissions::features::kPermissionQuietChip},
+            {});
+        break;
+    }
+  }
+
+ protected:
+  PermissionRequestQueue permission_request_queue_;
+  MockPermissionRequest request1_;
+  MockPermissionRequest request2_;
+  base::test::ScopedFeatureList feature_list_;
+};
+
+TEST_P(PermissionRequestQueueTest, CountNumberOfRequestsInQueue) {
+  EXPECT_EQ(0ul, permission_request_queue_.Count());
+
+  permission_request_queue_.Push(&request1_);
+  permission_request_queue_.Push(&request2_);
+  EXPECT_EQ(2ul, permission_request_queue_.Count());
+
+  permission_request_queue_.Pop();
+  EXPECT_EQ(1ul, permission_request_queue_.Count());
+}
+
+TEST_P(PermissionRequestQueueTest, CountDuplicateRequests) {
+  EXPECT_EQ(0ul, permission_request_queue_.Count());
+
+  permission_request_queue_.Push(&request1_);
+  permission_request_queue_.Push(&request1_);
+  EXPECT_EQ(2ul, permission_request_queue_.Count());
+}
+
+TEST_P(PermissionRequestQueueTest, CountNumberOfRequestOccurencesInQueue) {
+  EXPECT_EQ(0ul, permission_request_queue_.Count(&request1_));
+
+  permission_request_queue_.Push(&request1_);
+  permission_request_queue_.Push(&request1_);
+  permission_request_queue_.Push(&request2_);
+
+  EXPECT_EQ(2ul, permission_request_queue_.Count(&request1_));
+}
+
+TEST_P(PermissionRequestQueueTest, OnlyEmptyWithoutRequests) {
+  EXPECT_TRUE(permission_request_queue_.IsEmpty());
+
+  permission_request_queue_.Push(&request1_);
+  EXPECT_FALSE(permission_request_queue_.IsEmpty());
+
+  permission_request_queue_.Pop();
+  EXPECT_TRUE(permission_request_queue_.IsEmpty());
+}
+
+TEST_P(PermissionRequestQueueTest, ShouldFindDuplicateRequest) {
+  permission_request_queue_.Push(&request1_);
+  permission_request_queue_.Push(&request2_);
+
+  EXPECT_EQ(&request2_, permission_request_queue_.FindDuplicate(&request2_));
+}
+
+TEST_P(PermissionRequestQueueTest, ShouldNotFindDuplicateIfNotPresent) {
+  permission_request_queue_.Push(&request1_);
+
+  EXPECT_EQ(nullptr, permission_request_queue_.FindDuplicate(&request2_));
+}
+
+TEST_P(PermissionRequestQueueTest, PeekedElementIsNextPoppedElement) {
+  permission_request_queue_.Push(&request1_);
+  permission_request_queue_.Push(&request2_);
+  PermissionRequest* peekedElement = permission_request_queue_.Peek();
+
+  EXPECT_EQ(peekedElement, permission_request_queue_.Pop());
+}
+
+TEST_P(PermissionRequestQueueTest, VerifyPushOrder) {
+  permission_request_queue_.Push(&request1_);
+  permission_request_queue_.Push(&request2_);
+  permission_request_queue_.Push(&request2_);
+
+  if (GetParam() == NoChip) {
+    EXPECT_EQ(permission_request_queue_.Pop(), &request1_);
+    EXPECT_EQ(permission_request_queue_.Pop(), &request2_);
+    EXPECT_EQ(permission_request_queue_.Pop(), &request2_);
+  } else {  // QuietChipOnly, ChipOnly, QuietChipAndChip
+    EXPECT_EQ(permission_request_queue_.Pop(), &request2_);
+    EXPECT_EQ(permission_request_queue_.Pop(), &request2_);
+    EXPECT_EQ(permission_request_queue_.Pop(), &request1_);
+  }
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    PermissionRequestQueueTest,
+    ::testing::Values(NoChip, QuietChipOnly, ChipOnly, QuietChipAndChip));
+}  // namespace permissions
diff --git a/components/policy/tools/generate_policy_source.py b/components/policy/tools/generate_policy_source.py
index 82e886f13..ae46a935 100755
--- a/components/policy/tools/generate_policy_source.py
+++ b/components/policy/tools/generate_policy_source.py
@@ -113,7 +113,8 @@
       self.enterprise_default = policy['default_for_enterprise_users']
     if self.has_enterprise_default:
       self.default_policy_level = policy.get('default_policy_level', '')
-      if self.default_policy_level == 'recommended' and not self.can_be_recommended:
+      if (self.default_policy_level == 'recommended'
+          and not self.can_be_recommended):
         raise RuntimeError('Policy ' + self.name +
                            ' has default_policy_level set to ' +
                            self.default_policy_level + ', '
@@ -503,7 +504,7 @@
 # Ensure only windows supported policies are returned when building for windows.
 # Eventually only supported policies on every platforms will be returned.
 def _GetSupportedPolicies(policies, target_platform):
-  if target_platform == 'win':
+  if target_platform in ['win', 'linux']:
     return [policy for policy in policies if policy.is_supported]
 
   return [
diff --git a/components/policy/tools/generate_policy_source_test.py b/components/policy/tools/generate_policy_source_test.py
index 5157be9a..a1ddd2c3 100755
--- a/components/policy/tools/generate_policy_source_test.py
+++ b/components/policy/tools/generate_policy_source_test.py
@@ -126,17 +126,22 @@
           "desc":
           "CloudManagementEnrollmentToken desc"
       }, {
-          "name": "DeprecatedButGenerated",
-          "type": "string",
+          "name":
+          "DeprecatedButGenerated",
+          "type":
+          "string",
           "schema": {
               "type": "string"
           },
           "supported_on": ["chrome_os:1-93", "android:1-93", "chrome.*:1-93"],
-          "id": 7,
+          "id":
+          7,
           "tags": [],
-          "caption": "DeprecatedButGenerated caption",
-          "desc": "DeprecatedButGenerated desc"
-      },  {
+          "caption":
+          "DeprecatedButGenerated caption",
+          "desc":
+          "DeprecatedButGenerated desc"
+      }, {
           "name": "DeprecatedNotGenerated",
           "type": "string",
           "schema": {
diff --git a/components/printing/test/print_render_frame_helper_browsertest.cc b/components/printing/test/print_render_frame_helper_browsertest.cc
index f58b807c..1ba2416 100644
--- a/components/printing/test/print_render_frame_helper_browsertest.cc
+++ b/components/printing/test/print_render_frame_helper_browsertest.cc
@@ -22,7 +22,6 @@
 #include "components/printing/test/mock_printer.h"
 #include "components/printing/test/print_test_content_renderer_client.h"
 #include "content/public/renderer/render_frame.h"
-#include "content/public/renderer/render_view.h"
 #include "content/public/test/mock_render_thread.h"
 #include "content/public/test/render_view_test.h"
 #include "ipc/ipc_listener.h"
@@ -838,13 +837,12 @@
 
   // Find the frame and set it as the focused one.  This should mean that that
   // the printout should only contain the contents of that frame.
-  auto* web_view = view_->GetWebView();
   WebFrame* sub1_frame =
-      web_view->MainFrame()->ToWebLocalFrame()->FindFrameByName(
+      web_view_->MainFrame()->ToWebLocalFrame()->FindFrameByName(
           WebString::FromUTF8("sub1"));
   ASSERT_TRUE(sub1_frame);
-  web_view->SetFocusedFrame(sub1_frame);
-  ASSERT_NE(web_view->FocusedFrame(), web_view->MainFrame());
+  web_view_->SetFocusedFrame(sub1_frame);
+  ASSERT_NE(web_view_->FocusedFrame(), web_view_->MainFrame());
 
   // Initiate printing.
   OnPrintPages();
diff --git a/components/remote_cocoa/app_shim/views_nswindow_delegate.mm b/components/remote_cocoa/app_shim/views_nswindow_delegate.mm
index e75bdb1..db01fcf 100644
--- a/components/remote_cocoa/app_shim/views_nswindow_delegate.mm
+++ b/components/remote_cocoa/app_shim/views_nswindow_delegate.mm
@@ -119,10 +119,16 @@
 
   gfx::Rect resizedWindowRect(gfx::Point([window frame].origin),
                               gfx::Size(size));
+
+  absl::optional<gfx::Size> maxSizeParam;
+  gfx::Size maxSize([window maxSize]);
+  if (!maxSize.IsEmpty())
+    maxSizeParam = maxSize;
+
   gfx::SizeRectToAspectRatio(*_resizingHorizontally ? gfx::ResizeEdge::kRight
                                                     : gfx::ResizeEdge::kBottom,
                              *_aspectRatio, gfx::Size([window minSize]),
-                             gfx::Size([window maxSize]), &resizedWindowRect);
+                             maxSizeParam, &resizedWindowRect);
   // Discard any updates to |resizedWindowRect| origin as Cocoa takes care of
   // that.
   return resizedWindowRect.size().ToCGSize();
diff --git a/components/vector_icons/BUILD.gn b/components/vector_icons/BUILD.gn
index 9b8e9220..11db086 100644
--- a/components/vector_icons/BUILD.gn
+++ b/components/vector_icons/BUILD.gn
@@ -110,6 +110,8 @@
     "sms.icon",
     "submenu_arrow.icon",
     "sync.icon",
+    "text_decrease.icon",
+    "text_increase.icon",
     "troubleshoot.icon",
     "usb.icon",
     "videocam.icon",
diff --git a/components/vector_icons/text_decrease.icon b/components/vector_icons/text_decrease.icon
new file mode 100644
index 0000000..72f36047
--- /dev/null
+++ b/components/vector_icons/text_decrease.icon
@@ -0,0 +1,24 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 24,
+MOVE_TO, 1, 19,
+LINE_TO, 6.25f, 5,
+H_LINE_TO, 8.75f,
+LINE_TO, 14, 19,
+H_LINE_TO, 11.6f,
+LINE_TO, 10.33f, 15.43f,
+H_LINE_TO, 4.68f,
+LINE_TO, 3.4f, 19,
+CLOSE,
+MOVE_TO, 5.4f, 13.4f,
+H_LINE_TO, 9.6f,
+LINE_TO, 7.55f, 7.6f,
+H_LINE_TO, 7.45f,
+CLOSE,
+MOVE_TO, 15, 13,
+V_LINE_TO, 11,
+H_LINE_TO, 23,
+V_LINE_TO, 13,
+CLOSE
\ No newline at end of file
diff --git a/components/vector_icons/text_increase.icon b/components/vector_icons/text_increase.icon
new file mode 100644
index 0000000..edee5e9
--- /dev/null
+++ b/components/vector_icons/text_increase.icon
@@ -0,0 +1,32 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 24,
+MOVE_TO, 1, 19,
+LINE_TO, 6.25f, 5,
+H_LINE_TO, 8.75f,
+LINE_TO, 14, 19,
+H_LINE_TO, 11.6f,
+LINE_TO, 10.33f, 15.43f,
+H_LINE_TO, 4.68f,
+LINE_TO, 3.4f, 19,
+CLOSE,
+MOVE_TO, 5.4f, 13.4f,
+H_LINE_TO, 9.6f,
+LINE_TO, 7.55f, 7.6f,
+H_LINE_TO, 7.45f,
+CLOSE,
+MOVE_TO, 18, 16,
+V_LINE_TO, 13,
+H_LINE_TO, 15,
+V_LINE_TO, 11,
+H_LINE_TO, 18,
+V_LINE_TO, 8,
+H_LINE_TO, 20,
+V_LINE_TO, 11,
+H_LINE_TO, 23,
+V_LINE_TO, 13,
+H_LINE_TO, 20,
+V_LINE_TO, 16,
+CLOSE
\ No newline at end of file
diff --git a/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc b/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc
index 6930cc4d..e1befa0 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc
+++ b/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc
@@ -9,7 +9,6 @@
 #include "base/time/time.h"
 #include "sql/database.h"
 #include "sql/meta_table.h"
-#include "sql/statement.h"
 #include "sql/transaction.h"
 
 namespace content {
@@ -52,10 +51,7 @@
       "aggregation_id,source_id,trigger_time,debug_key,external_report_id,"
       "report_time,failed_send_attempts,report_time "
       "FROM aggregatable_report_metadata";
-  sql::Statement populate_new_aggregatable_report_metadata_statement(
-      db->GetCachedStatement(SQL_FROM_HERE,
-                             kPopulateNewAggregatableReportMetadataSql));
-  if (!populate_new_aggregatable_report_metadata_statement.Run())
+  if (!db->Execute(kPopulateNewAggregatableReportMetadataSql))
     return false;
 
   static constexpr char kDropOldAggregatableReportMetadataTableSql[] =
diff --git a/content/browser/attribution_reporting/attributions_browsertest.cc b/content/browser/attribution_reporting/attributions_browsertest.cc
index 63d6ad01..2dc0b3e4 100644
--- a/content/browser/attribution_reporting/attributions_browsertest.cc
+++ b/content/browser/attribution_reporting/attributions_browsertest.cc
@@ -401,6 +401,87 @@
 }
 
 IN_PROC_BROWSER_TEST_F(AttributionsBrowserTest,
+                       AttributionEligibleNavigation_SetsEligibleHeader) {
+  auto register_response1 =
+      std::make_unique<net::test_server::ControllableHttpResponse>(
+          https_server(), "/register_source_redirect");
+  auto register_response2 =
+      std::make_unique<net::test_server::ControllableHttpResponse>(
+          https_server(), "/register_source_redirect2");
+  ASSERT_TRUE(https_server()->Start());
+
+  GURL impression_url = https_server()->GetURL(
+      "a.test", "/attribution_reporting/page_with_impression_creator.html");
+  EXPECT_TRUE(NavigateToURL(web_contents(), impression_url));
+
+  GURL register_source_url =
+      https_server()->GetURL("d.test", "/register_source_redirect");
+
+  // Don't use `CreateAndClickSource()` as we need to observe navigation
+  // redirects prior to the navigation finishing.
+  EXPECT_TRUE(ExecJs(web_contents(), JsReplace(R"(
+    createAttributionSrcAnchor({id: 'link',
+                        url: $1,
+                        attributionsrc: '',
+                        target: $2});)",
+                                               register_source_url, "_top")));
+  EXPECT_TRUE(ExecJs(web_contents(), "simulateClick('link');"));
+
+  // Verify the navigation redirects contain the eligibility header.
+  register_response1->WaitForRequest();
+  EXPECT_EQ(register_response1->http_request()->headers.at(
+                "Attribution-Reporting-Eligible"),
+            "navigation-source");
+
+  auto http_response = std::make_unique<net::test_server::BasicHttpResponse>();
+  http_response->set_code(net::HTTP_MOVED_PERMANENTLY);
+  http_response->AddCustomHeader("Location", "/register_source_redirect2");
+  register_response1->Send(http_response->ToResponseString());
+  register_response1->Done();
+
+  // Ensure that redirect requests also contain the header.
+  register_response2->WaitForRequest();
+  ASSERT_EQ(register_response2->http_request()->headers.at(
+                "Attribution-Reporting-Eligible"),
+            "navigation-source");
+}
+
+IN_PROC_BROWSER_TEST_F(AttributionsBrowserTest,
+                       NonAttributionEligibleNavigation_NoEligibleHeader) {
+  auto register_response1 =
+      std::make_unique<net::test_server::ControllableHttpResponse>(
+          https_server(), "/register_source_redirect");
+  ASSERT_TRUE(https_server()->Start());
+
+  GURL impression_url = https_server()->GetURL(
+      "a.test", "/attribution_reporting/page_with_impression_creator.html");
+  EXPECT_TRUE(NavigateToURL(web_contents(), impression_url));
+
+  GURL register_source_url =
+      https_server()->GetURL("d.test", "/register_source_redirect");
+
+  // Create a non-attribution eligible anchor and click.
+  EXPECT_TRUE(ExecJs(web_contents(), JsReplace(R"(
+    const anchor = document.createElement('a');
+    anchor.href = $1;
+    anchor.target = '_top';
+    anchor.id = 'link';
+    document.body.appendChild(anchor);)",
+                                               register_source_url)));
+  EXPECT_TRUE(ExecJs(web_contents(), "simulateClick('link');"));
+
+  // Verify the navigation request does not contain the eligibility header.
+  register_response1->WaitForRequest();
+  EXPECT_FALSE(base::Contains(register_response1->http_request()->headers,
+                              "Attribution-Reporting-Eligible"));
+
+  auto http_response = std::make_unique<net::test_server::BasicHttpResponse>();
+  http_response->set_code(net::HTTP_OK);
+  register_response1->Send(http_response->ToResponseString());
+  register_response1->Done();
+}
+
+IN_PROC_BROWSER_TEST_F(AttributionsBrowserTest,
                        WindowOpenDeprecatedAPI_NoException) {
   // Expected reports must be registered before the server starts.
   ExpectedReportWaiter expected_report(
diff --git a/content/browser/back_forward_cache_features_browsertest.cc b/content/browser/back_forward_cache_features_browsertest.cc
index 87f9b848..c3c3bae 100644
--- a/content/browser/back_forward_cache_features_browsertest.cc
+++ b/content/browser/back_forward_cache_features_browsertest.cc
@@ -33,6 +33,7 @@
 #include "services/device/public/cpp/test/scoped_geolocation_overrider.h"
 #include "services/device/public/mojom/vibration_manager.mojom.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
+#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/mojom/app_banner/app_banner.mojom.h"
 #include "ui/base/idle/idle_time_provider.h"
 #include "ui/base/test/idle_test_utils.h"
@@ -54,23 +55,59 @@
 
 using NotRestoredReason = BackForwardCacheMetrics::NotRestoredReason;
 
-IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
-                       PageWithDedicatedWorkerNotCached) {
+class BackForwardCacheDedicatedWorkerFlagBrowserTest
+    : public BackForwardCacheBrowserTest,
+      public testing::WithParamInterface<bool> {
+ public:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    EnableFeatureAndSetParams(blink::features::kBackForwardCacheDedicatedWorker,
+                              "", "");
+    if (IsDedicatedWorkerEnabled()) {
+      EnableFeatureAndSetParams(
+          blink::features::kBackForwardCacheDedicatedWorker, "", "");
+    } else {
+      DisableFeature(blink::features::kBackForwardCacheDedicatedWorker);
+    }
+    BackForwardCacheBrowserTest::SetUpCommandLine(command_line);
+  }
+
+  bool IsDedicatedWorkerEnabled() { return GetParam(); }
+};
+
+INSTANTIATE_TEST_SUITE_P(All,
+                         BackForwardCacheDedicatedWorkerFlagBrowserTest,
+                         testing::Bool());
+
+IN_PROC_BROWSER_TEST_P(BackForwardCacheDedicatedWorkerFlagBrowserTest,
+                       PageWithDedicatedWorkerCachedOrNot) {
   ASSERT_TRUE(embedded_test_server()->Start());
 
-  EXPECT_TRUE(NavigateToURL(
+  ASSERT_TRUE(NavigateToURL(
       shell(),
       embedded_test_server()->GetURL(
           "a.com", "/back_forward_cache/page_with_dedicated_worker.html")));
-  EXPECT_EQ(42, EvalJs(current_frame_host(), "window.receivedMessagePromise"));
-  RenderFrameDeletedObserver delete_observer_rfh_a(current_frame_host());
+  ASSERT_EQ(42, EvalJs(current_frame_host(), "window.receivedMessagePromise"));
+  RenderFrameHostWrapper rfh(current_frame_host());
 
   // Navigate away.
-  EXPECT_TRUE(NavigateToURL(
+  ASSERT_TRUE(NavigateToURL(
       shell(), embedded_test_server()->GetURL("b.com", "/title1.html")));
 
-  // The page with the unsupported feature should be deleted (not cached).
-  delete_observer_rfh_a.WaitUntilDeleted();
+  // Go back
+  ASSERT_TRUE(HistoryGoBack(web_contents()));
+
+  // Check the outcome.
+  if (IsDedicatedWorkerEnabled()) {
+    EXPECT_EQ(rfh.get(), current_frame_host());
+    ExpectRestored(FROM_HERE);
+  } else {
+    // The page with the dedicated worker should be deleted (not cached).
+    ASSERT_TRUE(rfh.WaitUntilRenderFrameDeleted());
+    ExpectNotRestored({NotRestoredReason::kBlocklistedFeatures},
+                      {blink::scheduler::WebSchedulerTrackedFeature::
+                           kDedicatedWorkerOrWorklet},
+                      {}, {}, {}, FROM_HERE);
+  }
 }
 
 // The bool parameter is used for switching PlzDedicatedWorker.
diff --git a/content/browser/media/media_internals.cc b/content/browser/media/media_internals.cc
index 8535682..89c07f9 100644
--- a/content/browser/media/media_internals.cc
+++ b/content/browser/media/media_internals.cc
@@ -522,6 +522,10 @@
                  ", minimize_resampling = ",
                  media::kChromeWideEchoCancellationMinimizeResampling.Get()
                      ? "true"
+                     : "false",
+                 ", allow_all_sample_rates = ",
+                 media::kChromeWideEchoCancellationAllowAllSampleRates.Get()
+                     ? "true"
                      : "false"})
           : "Disabled";
   audio_info_data.SetKey(
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index 55eba05..5a84eb6 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -396,7 +396,8 @@
     const std::string& user_agent_override,
     const absl::optional<url::Origin>& initiator_origin,
     blink::mojom::Referrer* referrer,
-    FrameTreeNode* frame_tree_node) {
+    FrameTreeNode* frame_tree_node,
+    bool has_attribution_src_token) {
   if (!url.SchemeIsHTTPOrHTTPS())
     return;
 
@@ -452,6 +453,10 @@
     headers->SetHeader("Sec-Purpose", "prefetch;prerender");
     headers->SetHeader("Purpose", "prefetch");
   }
+
+  if (has_attribution_src_token) {
+    headers->SetHeader("Attribution-Reporting-Eligible", "navigation-source");
+  }
 }
 
 bool ShouldPropagateUserActivation(const url::Origin& previous_origin,
@@ -1695,7 +1700,8 @@
         ui::PageTransitionFromInt(common_params_->transition),
         controller->GetBrowserContext(), common_params_->method,
         GetUserAgentOverride(), common_params_->initiator_origin,
-        common_params_->referrer.get(), frame_tree_node);
+        common_params_->referrer.get(), frame_tree_node,
+        begin_params_->impression.has_value());
 
     if (begin_params_->is_form_submission) {
       if (commit_params_->is_browser_initiated &&
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 9d3ef7d..f66fae5f 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -3017,7 +3017,13 @@
 
   creator_location_ = params.creator_location;
 
-  pip_initial_aspect_ratio_ = params.initial_picture_in_picture_aspect_ratio;
+  // An initial aspect ratio of 0.0 implies that the website did not set one and
+  // therefore we should use a default value. We will also use a default value
+  // if the website has given an invalid aspect ratio (i.e. a negative one).
+  pip_initial_aspect_ratio_ =
+      params.initial_picture_in_picture_aspect_ratio <= 0.0f
+          ? 1.0f
+          : params.initial_picture_in_picture_aspect_ratio;
 
   pip_lock_aspect_ratio_ = params.lock_picture_in_picture_aspect_ratio;
 
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 02fbb81..8951bb7b 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -2298,10 +2298,13 @@
   // Stores WebContents::CreateParams::creator_location_.
   base::Location creator_location_;
 
-  // Stores WebContents::CreateParams::initial_aspect_ratio.
-  float pip_initial_aspect_ratio_ = 0;
+  // The initial aspect ratio (only used for WebContents associated with a
+  // PictureInPicture window). This value is either the parameter given in
+  // WebContents::CreateParams::initial_picture_in_picture_aspect_ratio, or a
+  // default value if the given value is unset or invalid.
+  float pip_initial_aspect_ratio_ = 1.0f;
 
-  // Stores WebContents::CreateParams::lock_aspect_ratio.
+  // Stores WebContents::CreateParams::lock_picture_in_picture_aspect_ratio.
   bool pip_lock_aspect_ratio_ = false;
 
   VisibleTimeRequestTrigger visible_time_request_trigger_;
diff --git a/content/browser/webid/fedcm_metrics.cc b/content/browser/webid/fedcm_metrics.cc
index 6c33ed9..5ee29ea 100644
--- a/content/browser/webid/fedcm_metrics.cc
+++ b/content/browser/webid/fedcm_metrics.cc
@@ -8,80 +8,63 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/types/pass_key.h"
 #include "services/metrics/public/cpp/metrics_utils.h"
+#include "url/gurl.h"
 
 namespace content {
 
-// The only purpose of this class currently is to be friended by the
-// UkmRecorder. It therefore cannot be in the anonymous namespace.
-// TODO(crbug.com/1334210): Add sourceId and provider to FedCmMetrics so the
-// recording methods do not all have to pass these.
-class FedCmMetrics {
- public:
-  // Gets the ukm source id for a web identity provider.
-  static ukm::SourceId GetUkmSourceIdForWebIdentityFromScope(
-      const GURL& provider) {
-    return ukm::UkmRecorder::GetSourceIdForWebIdentityFromScope(
-        base::PassKey<FedCmMetrics>(), provider);
-  }
-};
+FedCmMetrics::FedCmMetrics(const GURL& provider, ukm::SourceId page_source_id)
+    : page_source_id_(page_source_id),
+      provider_source_id_(ukm::UkmRecorder::GetSourceIdForWebIdentityFromScope(
+          base::PassKey<FedCmMetrics>(),
+          provider)) {}
 
-void RecordShowAccountsDialogTime(base::TimeDelta duration,
-                                  ukm::SourceId source_id,
-                                  const GURL& provider) {
+void FedCmMetrics::RecordShowAccountsDialogTime(base::TimeDelta duration) {
   auto RecordUkm = [&](auto& ukm_builder) {
     ukm_builder.SetTiming_ShowAccountsDialog(
         ukm::GetExponentialBucketMinForUserTiming(duration.InMilliseconds()));
     ukm_builder.Record(ukm::UkmRecorder::Get());
   };
-  ukm::builders::Blink_FedCm fedcm_builder(source_id);
+  ukm::builders::Blink_FedCm fedcm_builder(page_source_id_);
   RecordUkm(fedcm_builder);
-  ukm::builders::Blink_FedCmIdp fedcm_idp_builder(
-      FedCmMetrics::GetUkmSourceIdForWebIdentityFromScope(provider));
+  ukm::builders::Blink_FedCmIdp fedcm_idp_builder(provider_source_id_);
   RecordUkm(fedcm_idp_builder);
 
   UMA_HISTOGRAM_MEDIUM_TIMES("Blink.FedCm.Timing.ShowAccountsDialog", duration);
 }
 
-void RecordContinueOnDialogTime(base::TimeDelta duration,
-                                ukm::SourceId source_id,
-                                const GURL& provider) {
+void FedCmMetrics::RecordContinueOnDialogTime(base::TimeDelta duration) {
   auto RecordUkm = [&](auto& ukm_builder) {
     ukm_builder.SetTiming_ContinueOnDialog(
         ukm::GetExponentialBucketMinForUserTiming(duration.InMilliseconds()));
     ukm_builder.Record(ukm::UkmRecorder::Get());
   };
-  ukm::builders::Blink_FedCm fedcm_builder(source_id);
+  ukm::builders::Blink_FedCm fedcm_builder(page_source_id_);
   RecordUkm(fedcm_builder);
 
-  ukm::builders::Blink_FedCmIdp fedcm_idp_builder(
-      FedCmMetrics::GetUkmSourceIdForWebIdentityFromScope(provider));
+  ukm::builders::Blink_FedCmIdp fedcm_idp_builder(provider_source_id_);
   RecordUkm(fedcm_idp_builder);
 
   UMA_HISTOGRAM_MEDIUM_TIMES("Blink.FedCm.Timing.ContinueOnDialog", duration);
 }
 
-void RecordCancelOnDialogTime(base::TimeDelta duration,
-                              ukm::SourceId source_id,
-                              const GURL& provider) {
+void FedCmMetrics::RecordCancelOnDialogTime(base::TimeDelta duration) {
   auto RecordUkm = [&](auto& ukm_builder) {
     ukm_builder.SetTiming_CancelOnDialog(
         ukm::GetExponentialBucketMinForUserTiming(duration.InMilliseconds()));
     ukm_builder.Record(ukm::UkmRecorder::Get());
   };
-  ukm::builders::Blink_FedCm fedcm_builder(source_id);
+  ukm::builders::Blink_FedCm fedcm_builder(page_source_id_);
   RecordUkm(fedcm_builder);
 
-  ukm::builders::Blink_FedCmIdp fedcm_idp_builder(
-      FedCmMetrics::GetUkmSourceIdForWebIdentityFromScope(provider));
+  ukm::builders::Blink_FedCmIdp fedcm_idp_builder(provider_source_id_);
   RecordUkm(fedcm_idp_builder);
 
   UMA_HISTOGRAM_MEDIUM_TIMES("Blink.FedCm.Timing.CancelOnDialog", duration);
 }
 
-void RecordTokenResponseAndTurnaroundTime(base::TimeDelta token_response_time,
-                                          base::TimeDelta turnaround_time,
-                                          ukm::SourceId source_id,
-                                          const GURL& provider) {
+void FedCmMetrics::RecordTokenResponseAndTurnaroundTime(
+    base::TimeDelta token_response_time,
+    base::TimeDelta turnaround_time) {
   auto RecordUkm = [&](auto& ukm_builder) {
     ukm_builder
         .SetTiming_IdTokenResponse(ukm::GetExponentialBucketMinForUserTiming(
@@ -90,11 +73,10 @@
             turnaround_time.InMilliseconds()));
     ukm_builder.Record(ukm::UkmRecorder::Get());
   };
-  ukm::builders::Blink_FedCm fedcm_builder(source_id);
+  ukm::builders::Blink_FedCm fedcm_builder(page_source_id_);
   RecordUkm(fedcm_builder);
 
-  ukm::builders::Blink_FedCmIdp fedcm_idp_builder(
-      FedCmMetrics::GetUkmSourceIdForWebIdentityFromScope(provider));
+  ukm::builders::Blink_FedCmIdp fedcm_idp_builder(provider_source_id_);
   RecordUkm(fedcm_idp_builder);
 
   UMA_HISTOGRAM_MEDIUM_TIMES("Blink.FedCm.Timing.IdTokenResponse",
@@ -103,18 +85,15 @@
                              turnaround_time);
 }
 
-void RecordRequestTokenStatus(FedCmRequestIdTokenStatus status,
-                              ukm::SourceId source_id,
-                              const GURL& provider) {
+void FedCmMetrics::RecordRequestTokenStatus(FedCmRequestIdTokenStatus status) {
   auto RecordUkm = [&](auto& ukm_builder) {
     ukm_builder.SetStatus_RequestIdToken(static_cast<int>(status));
     ukm_builder.Record(ukm::UkmRecorder::Get());
   };
-  ukm::builders::Blink_FedCm fedcm_builder(source_id);
+  ukm::builders::Blink_FedCm fedcm_builder(page_source_id_);
   RecordUkm(fedcm_builder);
 
-  ukm::builders::Blink_FedCmIdp fedcm_idp_builder(
-      FedCmMetrics::GetUkmSourceIdForWebIdentityFromScope(provider));
+  ukm::builders::Blink_FedCmIdp fedcm_idp_builder(provider_source_id_);
   RecordUkm(fedcm_idp_builder);
 
   UMA_HISTOGRAM_ENUMERATION("Blink.FedCm.Status.RequestIdToken", status);
diff --git a/content/browser/webid/fedcm_metrics.h b/content/browser/webid/fedcm_metrics.h
index c760b92..601bbb8 100644
--- a/content/browser/webid/fedcm_metrics.h
+++ b/content/browser/webid/fedcm_metrics.h
@@ -7,6 +7,7 @@
 
 #include "content/common/content_export.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
+#include "services/metrics/public/cpp/ukm_source_id.h"
 
 namespace base {
 class TimeDelta;
@@ -52,36 +53,43 @@
   kMaxValue = kUserInterfaceTimedOut
 };
 
-// Records the time from when a call to the API was made to when the accounts
-// dialog is shown.
-void RecordShowAccountsDialogTime(base::TimeDelta duration,
-                                  ukm::SourceId source_id,
-                                  const GURL& provider);
+class FedCmMetrics {
+ public:
+  FedCmMetrics(const GURL& provider, const ukm::SourceId page_source_id);
 
-// Records the time from when the accounts dialog is shown to when the user
-// presses the Continue button.
-void RecordContinueOnDialogTime(base::TimeDelta duration,
-                                ukm::SourceId source_id,
-                                const GURL& provider);
+  ~FedCmMetrics() = default;
 
-// Records the time from when the accounts dialog is shown to when the user
-// closes the dialog without selecting any account.
-void RecordCancelOnDialogTime(base::TimeDelta duration,
-                              ukm::SourceId source_id,
-                              const GURL& provider);
+  // Records the time from when a call to the API was made to when the accounts
+  // dialog is shown.
+  void RecordShowAccountsDialogTime(base::TimeDelta duration);
 
-// Records the time from when the user presses the Continue button to when the
-// token response is received. Also records the overall time from when the API
-// is called to when the token response is received.
-void RecordTokenResponseAndTurnaroundTime(base::TimeDelta token_response_time,
-                                          base::TimeDelta turnaround_time,
-                                          ukm::SourceId source_id,
-                                          const GURL& provider);
+  // Records the time from when the accounts dialog is shown to when the user
+  // presses the Continue button.
+  void RecordContinueOnDialogTime(base::TimeDelta duration);
 
-// Records the status of the |RequestToken| call.
-void RecordRequestTokenStatus(FedCmRequestIdTokenStatus status,
-                              ukm::SourceId source_id,
-                              const GURL& provider);
+  // Records the time from when the accounts dialog is shown to when the user
+  // closes the dialog without selecting any account.
+  void RecordCancelOnDialogTime(base::TimeDelta duration);
+
+  // Records the time from when the user presses the Continue button to when the
+  // token response is received. Also records the overall time from when the API
+  // is called to when the token response is received.
+  void RecordTokenResponseAndTurnaroundTime(base::TimeDelta token_response_time,
+                                            base::TimeDelta turnaround_time);
+
+  // Records the status of the |RequestToken| call.
+  void RecordRequestTokenStatus(FedCmRequestIdTokenStatus status);
+
+  // The page's SourceId. Used to log the UKM event Blink.FedCm.
+  ukm::SourceId page_source_id_;
+
+  // The SourceId to be used to log the UKM event Blink.FedCmIdp. Uses
+  // |provider_| as the URL.
+  ukm::SourceId provider_source_id_;
+};
+
+// The following are UMA-only recordings, hence do not need to be in the
+// FedCmMetrics class.
 
 // Records whether the user selected account is for sign-in or not.
 void RecordIsSignInUser(bool is_sign_in);
@@ -95,6 +103,7 @@
 
 // Records the size of the approved clients list if applicable.
 void RecordApprovedClientsSize(int size);
+
 }  // namespace content
 
 #endif  // CONTENT_BROWSER_WEBID_FEDCM_METRICS_H_
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc
index f8bc5df..5ee2128 100644
--- a/content/browser/webid/federated_auth_request_impl.cc
+++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -13,7 +13,6 @@
 #include "content/browser/bad_message.h"
 #include "content/browser/renderer_host/render_frame_host_impl.h"
 #include "content/browser/webid/fake_identity_request_dialog_controller.h"
-#include "content/browser/webid/fedcm_metrics.h"
 #include "content/browser/webid/flags.h"
 #include "content/browser/webid/webid_utils.h"
 #include "content/public/browser/browser_context.h"
@@ -249,9 +248,7 @@
     // either. We record `kUnhandledRequest` only when the user refreshed,
     // closed or left the page while the UI is displayed.
     if (!errors_logged_to_console_) {
-      RecordRequestTokenStatus(TokenStatus::kUnhandledRequest,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+      fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kUnhandledRequest);
     }
     CompleteRequest(FederatedAuthRequestResult::kError, "",
                     /*should_call_callback=*/true);
@@ -283,15 +280,15 @@
                                             bool prefer_auto_sign_in,
                                             RequestTokenCallback callback) {
   if (HasPendingRequest()) {
-    RecordRequestTokenStatus(TokenStatus::kTooManyRequests,
-                             render_frame_host().GetPageUkmSourceId(),
-                             provider_);
+    fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kTooManyRequests);
     std::move(callback).Run(RequestTokenStatus::kErrorTooManyRequests, "");
     return;
   }
 
   auth_request_callback_ = std::move(callback);
   provider_ = provider;
+  fedcm_metrics_ = std::make_unique<FedCmMetrics>(
+      provider_, render_frame_host().GetPageUkmSourceId());
   client_id_ = client_id;
   nonce_ = nonce;
   prefer_auto_sign_in_ = prefer_auto_sign_in && IsFedCmAutoSigninEnabled();
@@ -307,9 +304,7 @@
 
   network_manager_ = CreateNetworkManager(provider);
   if (!network_manager_) {
-    RecordRequestTokenStatus(TokenStatus::kNoNetworkManager,
-                             render_frame_host().GetPageUkmSourceId(),
-                             provider_);
+    fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kNoNetworkManager);
     // TODO(yigu): this is due to provider url being non-secure. We should
     // reject early in the renderer process.
     CompleteRequest(FederatedAuthRequestResult::kError, "",
@@ -348,9 +343,7 @@
   }
 
   if (error_token_status) {
-    RecordRequestTokenStatus(*error_token_status,
-                             render_frame_host().GetPageUkmSourceId(),
-                             provider_);
+    fedcm_metrics_->RecordRequestTokenStatus(*error_token_status);
     CompleteRequest(request_result, "", /*should_call_callback=*/false);
     return;
   }
@@ -366,8 +359,7 @@
 
   // Dialog will be hidden by the destructor for request_dialog_controller_,
   // triggered by CompleteRequest.
-  RecordRequestTokenStatus(TokenStatus::kAborted,
-                           render_frame_host().GetPageUkmSourceId(), provider_);
+  fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kAborted);
   CompleteRequest(FederatedAuthRequestResult::kErrorCanceled, "",
                   /*should_call_callback=*/true);
 }
@@ -481,9 +473,8 @@
     const std::set<GURL>& urls) {
   switch (status) {
     case IdpNetworkRequestManager::FetchStatus::kHttpNotFoundError: {
-      RecordRequestTokenStatus(TokenStatus::kManifestListHttpNotFound,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+      fedcm_metrics_->RecordRequestTokenStatus(
+          TokenStatus::kManifestListHttpNotFound);
       CompleteRequest(
           FederatedAuthRequestResult::kErrorFetchingManifestListHttpNotFound,
           "",
@@ -491,18 +482,16 @@
       return;
     }
     case IdpNetworkRequestManager::FetchStatus::kNoResponseError: {
-      RecordRequestTokenStatus(TokenStatus::kManifestListNoResponse,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+      fedcm_metrics_->RecordRequestTokenStatus(
+          TokenStatus::kManifestListNoResponse);
       CompleteRequest(
           FederatedAuthRequestResult::kErrorFetchingManifestListNoResponse, "",
           /*should_call_callback=*/false);
       return;
     }
     case IdpNetworkRequestManager::FetchStatus::kInvalidResponseError: {
-      RecordRequestTokenStatus(TokenStatus::kManifestListInvalidResponse,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+      fedcm_metrics_->RecordRequestTokenStatus(
+          TokenStatus::kManifestListInvalidResponse);
       CompleteRequest(
           FederatedAuthRequestResult::kErrorFetchingManifestListInvalidResponse,
           "",
@@ -519,9 +508,7 @@
   }
 
   if (urls.size() > kMaxProvidersInManifestList) {
-    RecordRequestTokenStatus(TokenStatus::kManifestListTooBig,
-                             render_frame_host().GetPageUkmSourceId(),
-                             provider_);
+    fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kManifestListTooBig);
     CompleteRequest(FederatedAuthRequestResult::kErrorManifestListTooBig, "",
                     /*should_call_callback=*/false);
     return;
@@ -551,9 +538,8 @@
   bool provider_url_is_valid = (urls.count(provider_url) != 0);
 
   if (!provider_url_is_valid) {
-    RecordRequestTokenStatus(TokenStatus::kManifestNotInManifestList,
-                             render_frame_host().GetPageUkmSourceId(),
-                             provider_);
+    fedcm_metrics_->RecordRequestTokenStatus(
+        TokenStatus::kManifestNotInManifestList);
     CompleteRequest(FederatedAuthRequestResult::kErrorManifestNotInManifestList,
                     "", /*should_call_callback=*/false);
     return;
@@ -570,27 +556,24 @@
     IdentityProviderMetadata idp_metadata) {
   switch (status) {
     case IdpNetworkRequestManager::FetchStatus::kHttpNotFoundError: {
-      RecordRequestTokenStatus(TokenStatus::kManifestHttpNotFound,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+      fedcm_metrics_->RecordRequestTokenStatus(
+          TokenStatus::kManifestHttpNotFound);
       CompleteRequest(
           FederatedAuthRequestResult::kErrorFetchingManifestHttpNotFound, "",
           /*should_call_callback=*/false);
       return;
     }
     case IdpNetworkRequestManager::FetchStatus::kNoResponseError: {
-      RecordRequestTokenStatus(TokenStatus::kManifestNoResponse,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+      fedcm_metrics_->RecordRequestTokenStatus(
+          TokenStatus::kManifestNoResponse);
       CompleteRequest(
           FederatedAuthRequestResult::kErrorFetchingManifestNoResponse, "",
           /*should_call_callback=*/false);
       return;
     }
     case IdpNetworkRequestManager::FetchStatus::kInvalidResponseError: {
-      RecordRequestTokenStatus(TokenStatus::kManifestInvalidResponse,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+      fedcm_metrics_->RecordRequestTokenStatus(
+          TokenStatus::kManifestInvalidResponse);
       CompleteRequest(
           FederatedAuthRequestResult::kErrorFetchingManifestInvalidResponse, "",
           /*should_call_callback=*/false);
@@ -630,9 +613,8 @@
     }
     render_frame_host().AddMessageToConsole(
         blink::mojom::ConsoleMessageLevel::kError, message);
-    RecordRequestTokenStatus(TokenStatus::kManifestInvalidResponse,
-                             render_frame_host().GetPageUkmSourceId(),
-                             provider_);
+    fedcm_metrics_->RecordRequestTokenStatus(
+        TokenStatus::kManifestInvalidResponse);
     CompleteRequest(
         FederatedAuthRequestResult::kErrorFetchingManifestInvalidResponse, "",
         /*should_call_callback=*/false);
@@ -672,27 +654,24 @@
     IdpNetworkRequestManager::AccountList accounts) {
   switch (status) {
     case IdpNetworkRequestManager::FetchStatus::kHttpNotFoundError: {
-      RecordRequestTokenStatus(TokenStatus::kAccountsHttpNotFound,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+      fedcm_metrics_->RecordRequestTokenStatus(
+          TokenStatus::kAccountsHttpNotFound);
       CompleteRequest(
           FederatedAuthRequestResult::kErrorFetchingAccountsHttpNotFound, "",
           /*should_call_callback=*/false);
       return;
     }
     case IdpNetworkRequestManager::FetchStatus::kNoResponseError: {
-      RecordRequestTokenStatus(TokenStatus::kAccountsNoResponse,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+      fedcm_metrics_->RecordRequestTokenStatus(
+          TokenStatus::kAccountsNoResponse);
       CompleteRequest(
           FederatedAuthRequestResult::kErrorFetchingAccountsNoResponse, "",
           /*should_call_callback=*/false);
       return;
     }
     case IdpNetworkRequestManager::FetchStatus::kInvalidResponseError: {
-      RecordRequestTokenStatus(TokenStatus::kAccountsInvalidResponse,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+      fedcm_metrics_->RecordRequestTokenStatus(
+          TokenStatus::kAccountsInvalidResponse);
       CompleteRequest(
           FederatedAuthRequestResult::kErrorFetchingAccountsInvalidResponse, "",
           /*should_call_callback=*/false);
@@ -744,9 +723,8 @@
       ClientIdData data{GURL(client_metadata_.terms_of_service_url),
                         GURL(client_metadata_.privacy_policy_url)};
       show_accounts_dialog_time_ = base::TimeTicks::Now();
-      RecordShowAccountsDialogTime(show_accounts_dialog_time_ - start_time_,
-                                   render_frame_host().GetPageUkmSourceId(),
-                                   provider_);
+      fedcm_metrics_->RecordShowAccountsDialogTime(show_accounts_dialog_time_ -
+                                                   start_time_);
 
       request_dialog_controller_->ShowAccountsDialog(
           rp_web_contents, provider_, accounts, idp_metadata, data,
@@ -771,9 +749,7 @@
   // have time to disable the FedCM API in other types of requests.
   if (GetApiPermissionContext()->GetApiPermissionStatus(origin()) !=
       FederatedApiPermissionStatus::GRANTED) {
-    RecordRequestTokenStatus(TokenStatus::kDisabledInSettings,
-                             render_frame_host().GetPageUkmSourceId(),
-                             provider_);
+    fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kDisabledInSettings);
 
     CompleteRequest(FederatedAuthRequestResult::kErrorDisabledInSettings, "",
                     /*should_call_callback=*/false);
@@ -783,12 +759,9 @@
   // This could happen if user didn't select any accounts.
   if (account_id.empty()) {
     base::TimeTicks dismiss_dialog_time = base::TimeTicks::Now();
-    RecordCancelOnDialogTime(dismiss_dialog_time - show_accounts_dialog_time_,
-                             render_frame_host().GetPageUkmSourceId(),
-                             provider_);
-    RecordRequestTokenStatus(TokenStatus::kNotSelectAccount,
-                             render_frame_host().GetPageUkmSourceId(),
-                             provider_);
+    fedcm_metrics_->RecordCancelOnDialogTime(dismiss_dialog_time -
+                                             show_accounts_dialog_time_);
+    fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kNotSelectAccount);
 
     if (should_embargo && GetApiPermissionContext()) {
       GetApiPermissionContext()->RecordDismissAndEmbargo(origin());
@@ -807,9 +780,8 @@
 
   account_id_ = account_id;
   select_account_time_ = base::TimeTicks::Now();
-  RecordContinueOnDialogTime(select_account_time_ - show_accounts_dialog_time_,
-                             render_frame_host().GetPageUkmSourceId(),
-                             provider_);
+  fedcm_metrics_->RecordContinueOnDialogTime(select_account_time_ -
+                                             show_accounts_dialog_time_);
 
   network_manager_->SendTokenRequest(
       endpoints_.token, account_id_,
@@ -850,36 +822,31 @@
   DCHECK(!start_time_.is_null());
   switch (status) {
     case IdpNetworkRequestManager::FetchStatus::kHttpNotFoundError: {
-      RecordRequestTokenStatus(TokenStatus::kIdTokenHttpNotFound,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+      fedcm_metrics_->RecordRequestTokenStatus(
+          TokenStatus::kIdTokenHttpNotFound);
       CompleteRequest(
           FederatedAuthRequestResult::kErrorFetchingIdTokenHttpNotFound, "",
           /*should_call_callback=*/false);
       return;
     }
     case IdpNetworkRequestManager::FetchStatus::kNoResponseError: {
-      RecordRequestTokenStatus(TokenStatus::kIdTokenNoResponse,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+      fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kIdTokenNoResponse);
       CompleteRequest(
           FederatedAuthRequestResult::kErrorFetchingIdTokenNoResponse, "",
           /*should_call_callback=*/false);
       return;
     }
     case IdpNetworkRequestManager::FetchStatus::kInvalidRequestError: {
-      RecordRequestTokenStatus(TokenStatus::kIdTokenInvalidRequest,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+      fedcm_metrics_->RecordRequestTokenStatus(
+          TokenStatus::kIdTokenInvalidRequest);
       CompleteRequest(
           FederatedAuthRequestResult::kErrorFetchingIdTokenInvalidRequest, "",
           /*should_call_callback=*/false);
       return;
     }
     case IdpNetworkRequestManager::FetchStatus::kInvalidResponseError: {
-      RecordRequestTokenStatus(TokenStatus::kIdTokenInvalidResponse,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+      fedcm_metrics_->RecordRequestTokenStatus(
+          TokenStatus::kIdTokenInvalidResponse);
       CompleteRequest(
           FederatedAuthRequestResult::kErrorFetchingIdTokenInvalidResponse, "",
           /*should_call_callback=*/false);
@@ -909,13 +876,10 @@
             origin(), url::Origin::Create(provider_), account_id_);
       }
 
-      RecordTokenResponseAndTurnaroundTime(
+      fedcm_metrics_->RecordTokenResponseAndTurnaroundTime(
           token_response_time_ - select_account_time_,
-          token_response_time_ - start_time_,
-          render_frame_host().GetPageUkmSourceId(), provider_);
-      RecordRequestTokenStatus(TokenStatus::kSuccess,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+          token_response_time_ - start_time_);
+      fedcm_metrics_->RecordRequestTokenStatus(TokenStatus::kSuccess);
       CompleteRequest(FederatedAuthRequestResult::kSuccess, token,
                       /*should_call_callback=*/true);
       return;
@@ -1149,9 +1113,8 @@
     // either. We record `kUserInterfaceTimedOut` only when the UI is displayed
     // and then time out without user interaction.
     if (!errors_logged_to_console_) {
-      RecordRequestTokenStatus(TokenStatus::kUserInterfaceTimedOut,
-                               render_frame_host().GetPageUkmSourceId(),
-                               provider_);
+      fedcm_metrics_->RecordRequestTokenStatus(
+          TokenStatus::kUserInterfaceTimedOut);
     }
     CompleteRequest(FederatedAuthRequestResult::kError, "",
                     /*should_call_callback=*/true);
diff --git a/content/browser/webid/federated_auth_request_impl.h b/content/browser/webid/federated_auth_request_impl.h
index 17f11bab..d6c63716 100644
--- a/content/browser/webid/federated_auth_request_impl.h
+++ b/content/browser/webid/federated_auth_request_impl.h
@@ -14,6 +14,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
+#include "content/browser/webid/fedcm_metrics.h"
 #include "content/browser/webid/idp_network_request_manager.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/document_service.h"
@@ -153,6 +154,10 @@
   std::unique_ptr<IdpNetworkRequestManager> mock_network_manager_;
   std::unique_ptr<IdentityRequestDialogController> mock_dialog_controller_;
 
+  // Helper that records FedCM UMA and UKM metrics. Initialized in the
+  // RequestToken() method, so all metrics must be recorded after that.
+  std::unique_ptr<FedCmMetrics> fedcm_metrics_;
+
   // Parameters of auth request.
   GURL provider_;
 
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 404e744..86ae9db 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -336,6 +336,9 @@
            blink::features::kCancelFormSubmissionInDefaultHandler},
           {"ClipboardCustomFormats", blink::features::kClipboardCustomFormats},
           {"CSSContainerQueries", blink::features::kCSSContainerQueries},
+          {"CSSOverflowForReplacedElements",
+           blink::features::kCSSOverflowForReplacedElements,
+           kSetOnlyIfOverridden},
           {"ComputePressure", blink::features::kComputePressure,
            kSetOnlyIfOverridden},
           {"DeferredShaping", blink::features::kDeferredFontShaping},
diff --git a/content/public/renderer/BUILD.gn b/content/public/renderer/BUILD.gn
index fecca011..5a9b007 100644
--- a/content/public/renderer/BUILD.gn
+++ b/content/public/renderer/BUILD.gn
@@ -40,8 +40,6 @@
     "render_thread.h",
     "render_thread_observer.cc",
     "render_thread_observer.h",
-    "render_view.h",
-    "render_view_visitor.h",
     "v8_value_converter.h",
     "video_encode_accelerator.cc",
     "video_encode_accelerator.h",
diff --git a/content/public/renderer/render_view.h b/content/public/renderer/render_view.h
deleted file mode 100644
index e1c91c87..0000000
--- a/content/public/renderer/render_view.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_PUBLIC_RENDERER_RENDER_VIEW_H_
-#define CONTENT_PUBLIC_RENDERER_RENDER_VIEW_H_
-
-#include <stddef.h>
-
-#include "build/build_config.h"
-#include "content/common/content_export.h"
-#include "ui/gfx/native_widget_types.h"
-
-namespace blink {
-class WebView;
-}  // namespace blink
-
-namespace content {
-
-class RenderFrame;
-class RenderViewVisitor;
-
-// RenderView corresponds to the content container of a renderer's subset
-// of the frame tree. A frame tree that spans multiple renderers will have a
-// RenderView in each renderer, containing the local frames that belong to
-// that renderer. The RenderView holds non-frame-related state that is
-// replicated across all renderers, and is a fairly shallow object.
-// Generally, most APIs care about state related to the document content which
-// should be accessed through RenderFrame instead.
-//
-// WARNING: Historically RenderView was the path to get to the main frame,
-// and the entire frame tree, but that is no longer the case. Usually
-// RenderFrame is a more appropriate surface for new code, unless the code is
-// agnostic of frames and document content or structure. For more context,
-// please see https://crbug.com/467770 and
-// https://www.chromium.org/developers/design-documents/site-isolation.
-class CONTENT_EXPORT RenderView {
- public:
-  // Visit all RenderViews with a live WebView (i.e., RenderViews that have
-  // been closed but not yet destroyed are excluded).
-  static void ForEach(RenderViewVisitor* visitor);
-
-  // Returns the associated WebView. May return NULL when the view is closing.
-  virtual blink::WebView* GetWebView() = 0;
-
- protected:
-  virtual ~RenderView() {}
-
- private:
-  // This interface should only be implemented inside content.
-  friend class RenderViewImpl;
-  RenderView() {}
-};
-
-}  // namespace content
-
-#endif  // CONTENT_PUBLIC_RENDERER_RENDER_VIEW_H_
diff --git a/content/public/renderer/render_view_visitor.h b/content/public/renderer/render_view_visitor.h
deleted file mode 100644
index c424af3..0000000
--- a/content/public/renderer/render_view_visitor.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_PUBLIC_RENDERER_RENDER_VIEW_VISITOR_H_
-#define CONTENT_PUBLIC_RENDERER_RENDER_VIEW_VISITOR_H_
-
-namespace content {
-
-class RenderView;
-
-class RenderViewVisitor {
- public:
-  // Return true to continue visiting RenderViews or false to stop.
-  virtual bool Visit(RenderView* render_view) = 0;
-
- protected:
-  virtual ~RenderViewVisitor() {}
-};
-
-}  // namespace content
-
-#endif  // CONTENT_PUBLIC_RENDERER_RENDER_VIEW_VISITOR_H_
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc
index 95735cf..b85a875 100644
--- a/content/public/test/render_view_test.cc
+++ b/content/public/test/render_view_test.cc
@@ -27,7 +27,6 @@
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/renderer/content_renderer_client.h"
-#include "content/public/renderer/render_view_visitor.h"
 #include "content/public/test/content_test_suite_base.h"
 #include "content/public/test/fake_render_widget_host.h"
 #include "content/public/test/frame_load_waiter.h"
@@ -98,37 +97,6 @@
 
 namespace {
 
-// This class records, and then tears down all existing RenderViews. It's
-// important to do this in two steps, since tearing down a RenderView will
-// mutate the container that RenderView::ForEach() iterates over.
-class CloseMessageSendingRenderViewVisitor : public RenderViewVisitor {
- public:
-  CloseMessageSendingRenderViewVisitor() = default;
-
-  CloseMessageSendingRenderViewVisitor(
-      const CloseMessageSendingRenderViewVisitor&) = delete;
-  CloseMessageSendingRenderViewVisitor& operator=(
-      const CloseMessageSendingRenderViewVisitor&) = delete;
-
-  ~CloseMessageSendingRenderViewVisitor() override = default;
-
-  void CloseRenderViews() {
-    for (RenderView* render_view : live_render_views) {
-      RenderViewImpl* view_impl = static_cast<RenderViewImpl*>(render_view);
-      view_impl->Destroy();
-    }
-  }
-
- protected:
-  bool Visit(RenderView* render_view) override {
-    live_render_views.push_back(render_view);
-    return true;
-  }
-
- private:
-  std::vector<RenderView*> live_render_views;
-};
-
 class FakeWebURLLoader : public blink::WebURLLoader {
  public:
   FakeWebURLLoader(
@@ -556,7 +524,6 @@
       blink::mojom::RecordContentToVisibleTimeRequestPtr());
   waiter.Wait();
 
-  view_ = view;
   web_view_ = view->GetWebView();
 }
 
@@ -569,15 +536,10 @@
       leak_detector.BindNewPipeAndPassReceiver());
   std::ignore = binders_.TryBind(&receiver);
 
-  // Close the main |view_| as well as any other windows that might have been
+  // Close the main view as well as any other windows that might have been
   // opened by the test.
-  CloseMessageSendingRenderViewVisitor closing_visitor;
-  RenderView::ForEach(&closing_visitor);
-  closing_visitor.CloseRenderViews();
+  RenderViewImpl::DestroyAllRenderViewImpls();
 
-  // |view_| is ref-counted and deletes itself during the RunUntilIdle() call
-  // below.
-  view_ = nullptr;
   web_view_ = nullptr;
   process_.reset();
 
diff --git a/content/public/test/render_view_test.h b/content/public/test/render_view_test.h
index e22d8ab3..8841db5 100644
--- a/content/public/test/render_view_test.h
+++ b/content/public/test/render_view_test.h
@@ -212,12 +212,8 @@
   base::test::TaskEnvironment task_environment_;
 
   std::unique_ptr<RenderProcess> process_;
-  // We use a naked pointer because we don't want to expose RenderViewImpl in
-  // the embedder's namespace.
-  raw_ptr<RenderView> view_ = nullptr;
-  // The WebView is owned by `view_` but provided as a raw pointer here. This
-  // will provide a transition of eventually removing RenderView and owning
-  // it directly here. See https://crbug.com/1155202.
+  // `web_view` is owned by the associated `RenderView` (which we do not store).
+  // All allocated `RenderView`s will be destroyed in the `TearDown` method.
   raw_ptr<blink::WebView> web_view_ = nullptr;
   RendererBlinkPlatformImplTestOverride blink_platform_impl_;
   std::unique_ptr<ContentClient> content_client_;
diff --git a/content/public/test/test_web_ui.cc b/content/public/test/test_web_ui.cc
index c88a2bb..0163e8c 100644
--- a/content/public/test/test_web_ui.cc
+++ b/content/public/test/test_web_ui.cc
@@ -189,19 +189,19 @@
 }
 
 void TestWebUI::CallData::TakeAsArg1(std::unique_ptr<base::Value> arg) {
-  arg1_ = std::move(arg);
+  args_[0] = std::move(arg);
 }
 
 void TestWebUI::CallData::TakeAsArg2(std::unique_ptr<base::Value> arg) {
-  arg2_ = std::move(arg);
+  args_[1] = std::move(arg);
 }
 
 void TestWebUI::CallData::TakeAsArg3(std::unique_ptr<base::Value> arg) {
-  arg3_ = std::move(arg);
+  args_[2] = std::move(arg);
 }
 
 void TestWebUI::CallData::TakeAsArg4(std::unique_ptr<base::Value> arg) {
-  arg4_ = std::move(arg);
+  args_[3] = std::move(arg);
 }
 
 }  // namespace content
diff --git a/content/public/test/test_web_ui.h b/content/public/test/test_web_ui.h
index 2f79095..8bde8d7b 100644
--- a/content/public/test/test_web_ui.h
+++ b/content/public/test/test_web_ui.h
@@ -92,17 +92,18 @@
     void TakeAsArg4(std::unique_ptr<base::Value> arg);
 
     const std::string& function_name() const { return function_name_; }
-    const base::Value* arg1() const { return arg1_.get(); }
-    const base::Value* arg2() const { return arg2_.get(); }
-    const base::Value* arg3() const { return arg3_.get(); }
-    const base::Value* arg4() const { return arg4_.get(); }
+    const base::Value* arg1() const { return args_[0].get(); }
+    const base::Value* arg2() const { return args_[1].get(); }
+    const base::Value* arg3() const { return args_[2].get(); }
+    const base::Value* arg4() const { return args_[3].get(); }
+
+    const std::array<std::unique_ptr<base::Value>, 4>& args() const {
+      return args_;
+    }
 
    private:
     std::string function_name_;
-    std::unique_ptr<base::Value> arg1_;
-    std::unique_ptr<base::Value> arg2_;
-    std::unique_ptr<base::Value> arg3_;
-    std::unique_ptr<base::Value> arg4_;
+    std::array<std::unique_ptr<base::Value>, 4> args_;
   };
 
   const std::vector<std::unique_ptr<CallData>>& call_data() const {
diff --git a/content/renderer/accessibility/render_accessibility_impl_browsertest.cc b/content/renderer/accessibility/render_accessibility_impl_browsertest.cc
index ea549c54..fecec0a 100644
--- a/content/renderer/accessibility/render_accessibility_impl_browsertest.cc
+++ b/content/renderer/accessibility/render_accessibility_impl_browsertest.cc
@@ -306,10 +306,6 @@
   }
 
  protected:
-  RenderViewImpl* view() {
-    return static_cast<RenderViewImpl*>(view_);
-  }
-
   RenderFrameImpl* frame() {
     return static_cast<RenderFrameImpl*>(RenderViewTest::GetMainRenderFrame());
   }
diff --git a/content/renderer/pepper/mock_renderer_ppapi_host.cc b/content/renderer/pepper/mock_renderer_ppapi_host.cc
index bbfc935..544ddc8 100644
--- a/content/renderer/pepper/mock_renderer_ppapi_host.cc
+++ b/content/renderer/pepper/mock_renderer_ppapi_host.cc
@@ -4,7 +4,6 @@
 
 #include "content/renderer/pepper/mock_renderer_ppapi_host.h"
 
-#include "content/public/renderer/render_view.h"
 #include "content/renderer/pepper/fake_pepper_plugin_instance.h"
 #include "ui/gfx/geometry/point.h"
 
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index 2826a2d..2f86fff 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -77,7 +77,6 @@
 #include "content/public/common/url_constants.h"
 #include "content/public/renderer/content_renderer_client.h"
 #include "content/public/renderer/render_thread_observer.h"
-#include "content/public/renderer/render_view_visitor.h"
 #include "content/renderer/agent_scheduling_group.h"
 #include "content/renderer/browser_exposed_renderer_interfaces.h"
 #include "content/renderer/categorized_worker_pool.h"
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
index dbd90c2e..9cd1089a 100644
--- a/content/renderer/render_view_browsertest.cc
+++ b/content/renderer/render_view_browsertest.cc
@@ -317,8 +317,6 @@
 
   ~RenderViewImplTest() override {}
 
-  RenderViewImpl* view() { return static_cast<RenderViewImpl*>(view_); }
-
   blink::WebFrameWidget* main_frame_widget() {
     return frame()->GetLocalRootWebFrameWidget();
   }
@@ -961,12 +959,13 @@
   popup_request.SetMode(network::mojom::RequestMode::kNavigate);
   popup_request.SetRedirectMode(network::mojom::RedirectMode::kManual);
   popup_request.SetRequestContext(blink::mojom::RequestContextType::INTERNAL);
-  blink::WebView* new_web_view = view()->CreateView(
-      GetMainFrame(), popup_request, blink::WebWindowFeatures(), "foo",
-      blink::kWebNavigationPolicyNewForegroundTab,
-      network::mojom::WebSandboxFlags::kNone,
-      blink::AllocateSessionStorageNamespaceId(), consumed_user_gesture,
-      absl::nullopt, absl::nullopt);
+  blink::WebView* new_web_view =
+      RenderViewImpl::FromWebView(web_view_)->CreateView(
+          GetMainFrame(), popup_request, blink::WebWindowFeatures(), "foo",
+          blink::kWebNavigationPolicyNewForegroundTab,
+          network::mojom::WebSandboxFlags::kNone,
+          blink::AllocateSessionStorageNamespaceId(), consumed_user_gesture,
+          absl::nullopt, absl::nullopt);
   auto popup_navigation_info = std::make_unique<blink::WebNavigationInfo>();
   popup_navigation_info->url_request = std::move(popup_request);
   popup_navigation_info->frame_type =
@@ -2558,8 +2557,6 @@
     return new TestContentRendererClient;
   }
 
-  RenderViewImpl* view() { return static_cast<RenderViewImpl*>(view_); }
-
   RenderFrameImpl* frame() {
     return static_cast<RenderFrameImpl*>(GetMainRenderFrame());
   }
diff --git a/content/renderer/render_view_browsertest_mac.mm b/content/renderer/render_view_browsertest_mac.mm
index 6ef4c60d9..07b2136 100644
--- a/content/renderer/render_view_browsertest_mac.mm
+++ b/content/renderer/render_view_browsertest_mac.mm
@@ -8,7 +8,6 @@
 #include "content/public/browser/native_web_keyboard_event.h"
 #include "content/public/test/render_view_test.h"
 #include "content/renderer/render_frame_impl.h"
-#include "content/renderer/render_view_impl.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/web_preferences/web_preferences.h"
 #include "third_party/blink/public/test/test_web_frame_content_dumper.h"
@@ -77,14 +76,10 @@
   blink::web_pref::WebPreferences prefs;
   prefs.enable_scroll_animator = false;
 
-  RenderViewImpl* view = static_cast<RenderViewImpl*>(view_);
-  blink::WebFrameWidget* blink_widget = view->GetWebView()
-                                            ->MainFrame()
-                                            ->ToWebLocalFrame()
-                                            ->LocalRoot()
-                                            ->FrameWidget();
+  blink::WebFrameWidget* blink_widget =
+      web_view_->MainFrame()->ToWebLocalFrame()->LocalRoot()->FrameWidget();
 
-  view->GetWebView()->SetWebPreferences(prefs);
+  web_view_->SetWebPreferences(prefs);
 
   const int kMaxOutputCharacters = 1024;
   std::string output;
@@ -94,8 +89,7 @@
   NSEvent* arrowUpKeyDown = CmdDeadKeyEvent(NSEventTypeKeyDown, kVK_UpArrow);
 
   // First test when javascript does not eat keypresses -- should scroll.
-  RenderFrameImpl::FromWebFrame(
-      view->GetWebView()->MainFrame()->ToWebLocalFrame())
+  RenderFrameImpl::FromWebFrame(web_view_->MainFrame()->ToWebLocalFrame())
       ->set_send_content_state_immediately(true);
   LoadHTML(kRawHtml);
   render_thread_->sink().ClearMessages();
@@ -106,7 +100,7 @@
   SendNativeKeyEvent(NativeWebKeyboardEvent(arrowDownKeyDown));
   base::RunLoop().RunUntilIdle();
   ExecuteJavaScriptForTests("scroll.textContent = window.pageYOffset");
-  output = TestWebFrameContentDumper::DumpWebViewAsText(view->GetWebView(),
+  output = TestWebFrameContentDumper::DumpWebViewAsText(web_view_,
                                                         kMaxOutputCharacters)
                .Ascii();
   EXPECT_EQ(kArrowDownScrollDown, output);
@@ -118,7 +112,7 @@
   SendNativeKeyEvent(NativeWebKeyboardEvent(arrowUpKeyDown));
   base::RunLoop().RunUntilIdle();
   ExecuteJavaScriptForTests("scroll.textContent = window.pageYOffset");
-  output = TestWebFrameContentDumper::DumpWebViewAsText(view->GetWebView(),
+  output = TestWebFrameContentDumper::DumpWebViewAsText(web_view_,
                                                         kMaxOutputCharacters)
                .Ascii();
   EXPECT_EQ(kArrowUpScrollUp, output);
@@ -134,7 +128,7 @@
   SendNativeKeyEvent(NativeWebKeyboardEvent(arrowDownKeyDown));
   base::RunLoop().RunUntilIdle();
   ExecuteJavaScriptForTests("scroll.textContent = window.pageYOffset");
-  output = TestWebFrameContentDumper::DumpWebViewAsText(view->GetWebView(),
+  output = TestWebFrameContentDumper::DumpWebViewAsText(web_view_,
                                                         kMaxOutputCharacters)
                .Ascii();
   EXPECT_EQ(kArrowDownNoScroll, output);
@@ -146,7 +140,7 @@
   SendNativeKeyEvent(NativeWebKeyboardEvent(arrowUpKeyDown));
   base::RunLoop().RunUntilIdle();
   ExecuteJavaScriptForTests("scroll.textContent = window.pageYOffset");
-  output = TestWebFrameContentDumper::DumpWebViewAsText(view->GetWebView(),
+  output = TestWebFrameContentDumper::DumpWebViewAsText(web_view_,
                                                         kMaxOutputCharacters)
                .Ascii();
   EXPECT_EQ(kArrowUpNoScroll, output);
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index a1e260f..11eaa6b 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -24,7 +24,6 @@
 #include "content/public/common/content_switches.h"
 #include "content/public/renderer/content_renderer_client.h"
 #include "content/public/renderer/render_thread.h"
-#include "content/public/renderer/render_view_visitor.h"
 #include "content/public/renderer/window_features_converter.h"
 #include "content/renderer/agent_scheduling_group.h"
 #include "content/renderer/render_frame_impl.h"
@@ -209,12 +208,10 @@
 }
 
 /*static*/
-void RenderView::ForEach(RenderViewVisitor* visitor) {
+void RenderViewImpl::DestroyAllRenderViewImpls() {
   DCHECK(RenderThread::IsMainThread());
-  ViewMap* views = g_view_map.Pointer();
-  for (auto it = views->begin(); it != views->end(); ++it) {
-    if (!visitor->Visit(it->second))
-      return;
+  while (!g_view_map.Get().empty()) {
+    g_view_map.Get().begin()->second->Destroy();
   }
 }
 
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index 792b430..2f07347 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -21,7 +21,6 @@
 #include "content/public/common/page_visibility_state.h"
 #include "content/public/common/page_zoom.h"
 #include "content/public/common/referrer.h"
-#include "content/public/renderer/render_view.h"
 #include "ipc/ipc_platform_file.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/remote_set.h"
@@ -59,8 +58,7 @@
 class CreateViewParams;
 }
 
-// RenderViewImpl (the implementation of RenderView) is the renderer process
-// object that owns the blink frame tree.
+// RenderViewImpl is the renderer process object that owns the blink frame tree.
 //
 // Each top-level web container has a frame tree, and thus a RenderViewImpl.
 // Typically such a container is a browser tab, or a tab-less window. It can
@@ -71,17 +69,16 @@
 // placeholders behind. Each such frame tree also includes a RenderViewImpl as
 // the owner of it. Thus a tab may have multiple RenderViewImpls, one for the
 // main frame, and one for each other frame tree generated.
-class CONTENT_EXPORT RenderViewImpl : public blink::WebViewClient,
-                                      public RenderView {
+class CONTENT_EXPORT RenderViewImpl : public blink::WebViewClient {
  public:
   // Creates a new RenderView. Note that if the original opener has been closed,
   // |params.window_was_created_with_opener| will be true and
   // |params.opener_frame_route_id| will be MSG_ROUTING_NONE.
   // When |params.proxy_routing_id| instead of |params.main_frame_routing_id| is
-  // specified, a RenderFrameProxy will be created for this RenderView's main
-  // RenderFrame.
-  // The opener should provide a non-null value for |show_callback| if it needs
-  // to send an additional IPC to finish making this view visible.
+  // specified, a RenderFrameProxy will be created for this RenderViewImpl's
+  // main RenderFrame. The opener should provide a non-null value for
+  // |show_callback| if it needs to send an additional IPC to finish making this
+  // view visible.
   static RenderViewImpl* Create(
       AgentSchedulingGroup& agent_scheduling_group,
       mojom::CreateViewParamsPtr params,
@@ -117,9 +114,7 @@
       const absl::optional<blink::WebPictureInPictureWindowOptions>&
           pip_options) override;
 
-  // RenderView implementation -------------------------------------------------
-
-  blink::WebView* GetWebView() override;
+  blink::WebView* GetWebView();
 
   // Please do not add your stuff randomly to the end here. If there is an
   // appropriate section, add it there. If not, there are some random functions
@@ -155,6 +150,9 @@
   static WindowOpenDisposition NavigationPolicyToDisposition(
       blink::WebNavigationPolicy policy);
 
+  // Destroy all active RenderViewImpls.
+  static void DestroyAllRenderViewImpls();
+
   // ---------------------------------------------------------------------------
   // ADDING NEW FUNCTIONS? Please keep private functions alphabetized and put
   // it in the same order in the .cc file as it was in the header.
@@ -167,7 +165,7 @@
   // RenderViewHost in the parent browser process.
   const int32_t routing_id_;
 
-  // Whether lookup of frames in the created RenderView (e.g. lookup via
+  // Whether lookup of frames in the created RenderViewImpl (e.g. lookup via
   // window.open or via <a target=...>) should be renderer-wide (i.e. going
   // beyond the usual opener-relationship-based BrowsingInstance boundaries).
   const bool renderer_wide_named_frame_lookup_;
@@ -188,7 +186,7 @@
 #if BUILDFLAG(IS_ANDROID)
   // Android Specific ----------------------------------------------------------
 
-  // Whether this was a renderer-created or browser-created RenderView.
+  // Whether this was a renderer-created or browser-created RenderViewImpl.
   bool was_created_by_renderer_ = false;
 #endif
 
@@ -196,7 +194,7 @@
   // ADDING NEW DATA? Please see if it fits appropriately in one of the above
   // sections rather than throwing it randomly at the end. If you're adding a
   // bunch of stuff, you should probably create a helper class and put your
-  // data and methods on that to avoid bloating RenderView more.  You can
+  // data and methods on that to avoid bloating RenderViewImpl more.  You can
   // use the Observer interface to filter IPC messages and receive frame change
   // notifications.
   // ---------------------------------------------------------------------------
diff --git a/content/web_test/renderer/test_runner.cc b/content/web_test/renderer/test_runner.cc
index 34a4bb1..e8878a1 100644
--- a/content/web_test/renderer/test_runner.cc
+++ b/content/web_test/renderer/test_runner.cc
@@ -23,7 +23,6 @@
 #include "cc/paint/paint_canvas.h"
 #include "content/public/common/isolated_world_ids.h"
 #include "content/public/renderer/render_frame_observer.h"
-#include "content/public/renderer/render_view_visitor.h"
 #include "content/renderer/render_thread_impl.h"
 #include "content/renderer/render_view_impl.h"
 #include "content/web_test/common/web_test_constants.h"
diff --git a/docs/dangling_ptr.md b/docs/dangling_ptr.md
index c854b56d..fabfb2dfd 100644
--- a/docs/dangling_ptr.md
+++ b/docs/dangling_ptr.md
@@ -43,8 +43,7 @@
 
 ```bash
 ./out/dangling/content_shell \
-   --enable-features=PartitionAllocBackupRefPtr \
-   --enable-features=PartitionAllocDanglingPtr
+   --enable-features=PartitionAllocBackupRefPtr,PartitionAllocDanglingPtr
 ```
 
 By default, Chrome will crash on the first dangling raw_ptr detected.
@@ -54,8 +53,7 @@
 ### Crash (default)
 
 ```bash
---enable-features=PartitionAllocBackupRefPtr \
---enable-features=PartitionAllocDanglingPtr:mode/crash
+--enable-features=PartitionAllocBackupRefPtr,PartitionAllocDanglingPtr:mode/crash
 ```
 
 ### Record a list of signatures 
@@ -63,8 +61,7 @@
 Example usage:
 ```bash
 ./out/dangling/content_shell \
-   --enable-features=PartitionAllocBackupRefPtr \
-   --enable-features=PartitionAllocDanglingPtr:mode/log_signature \
+   --enable-features=PartitionAllocBackupRefPtr,PartitionAllocDanglingPtr:mode/log_signature \
    |& tee output
 ```
 
diff --git a/docs/speed/perf_lab_platforms.md b/docs/speed/perf_lab_platforms.md
index 58795c6..0ec56edb 100644
--- a/docs/speed/perf_lab_platforms.md
+++ b/docs/speed/perf_lab_platforms.md
@@ -26,6 +26,7 @@
 ## Chromeos
 
  * [lacros-eve-perf](https://ci.chromium.org/p/chrome/builders/ci/lacros-eve-perf): .
+ * [lacros-x86-perf](https://ci.chromium.org/p/chrome/builders/ci/lacros-x86-perf): .
 
 ## Linux
 
diff --git a/extensions/browser/api/content_settings/content_settings_service.cc b/extensions/browser/api/content_settings/content_settings_service.cc
index 37b68f7..109fb0079 100644
--- a/extensions/browser/api/content_settings/content_settings_service.cc
+++ b/extensions/browser/api/content_settings/content_settings_service.cc
@@ -46,14 +46,13 @@
   if (prefs->ReadPrefAsList(
           extension_id, pref_names::kPrefContentSettings, &content_settings)) {
     content_settings_store_->SetExtensionContentSettingFromList(
-        extension_id, content_settings->GetListDeprecated(),
-        kExtensionPrefsScopeRegular);
+        extension_id, content_settings->GetList(), kExtensionPrefsScopeRegular);
   }
   if (prefs->ReadPrefAsList(extension_id,
                             pref_names::kPrefIncognitoContentSettings,
                             &content_settings)) {
     content_settings_store_->SetExtensionContentSettingFromList(
-        extension_id, content_settings->GetListDeprecated(),
+        extension_id, content_settings->GetList(),
         kExtensionPrefsScopeIncognitoPersistent);
   }
 }
diff --git a/extensions/browser/api/content_settings/content_settings_store.cc b/extensions/browser/api/content_settings/content_settings_store.cc
index bfcfff4a..0d16c3a2 100644
--- a/extensions/browser/api/content_settings/content_settings_store.cc
+++ b/extensions/browser/api/content_settings/content_settings_store.cc
@@ -266,7 +266,7 @@
     NotifyOfContentSettingChanged(ext_id, scope != kExtensionPrefsScopeRegular);
 }
 
-std::vector<base::Value> ContentSettingsStore::GetSettingsForExtension(
+base::Value::List ContentSettingsStore::GetSettingsForExtension(
     const std::string& extension_id,
     ExtensionPrefsScope scope) const {
   base::AutoLock lock(lock_);
@@ -274,7 +274,7 @@
   if (!map)
     return {};
 
-  std::vector<base::Value> settings;
+  base::Value::List settings;
   for (const auto& it : *map) {
     const auto& key = it.first;
     std::unique_ptr<RuleIterator> rule_iterator(
@@ -285,12 +285,10 @@
 
     while (rule_iterator->HasNext()) {
       const Rule& rule = rule_iterator->Next();
-      base::Value setting_dict(base::Value::Type::DICTIONARY);
-      setting_dict.SetStringKey(kPrimaryPatternKey,
-                                rule.primary_pattern.ToString());
-      setting_dict.SetStringKey(kSecondaryPatternKey,
-                                rule.secondary_pattern.ToString());
-      setting_dict.SetStringKey(
+      base::Value::Dict setting_dict;
+      setting_dict.Set(kPrimaryPatternKey, rule.primary_pattern.ToString());
+      setting_dict.Set(kSecondaryPatternKey, rule.secondary_pattern.ToString());
+      setting_dict.Set(
           kContentSettingsTypeKey,
           content_settings_helpers::ContentSettingsTypeToString(key));
       ContentSetting content_setting =
@@ -301,29 +299,30 @@
           content_settings::ContentSettingToString(content_setting);
       DCHECK(!setting_string.empty());
 
-      setting_dict.SetStringKey(kContentSettingKey, setting_string);
-      settings.push_back(std::move(setting_dict));
+      setting_dict.Set(kContentSettingKey, setting_string);
+      settings.Append(std::move(setting_dict));
     }
   }
   return settings;
 }
 
-#define LOG_INVALID_EXTENSION_PREFERENCE_DETAILS         \
-  LOG(ERROR) << "Found invalid extension pref: " << dict \
+#define LOG_INVALID_EXTENSION_PREFERENCE_DETAILS          \
+  LOG(ERROR) << "Found invalid extension pref: " << value \
              << " extension id: " << extension_id
 
 void ContentSettingsStore::SetExtensionContentSettingFromList(
     const std::string& extension_id,
-    base::Value::ConstListView list,
+    const base::Value::List& list,
     ExtensionPrefsScope scope) {
-  for (const base::Value& dict : list) {
-    if (!dict.is_dict()) {
+  for (const base::Value& value : list) {
+    if (!value.is_dict()) {
       LOG_INVALID_EXTENSION_PREFERENCE_DETAILS;
       continue;
     }
 
+    const base::Value::Dict& dict = value.GetDict();
     const std::string* primary_pattern_str =
-        dict.FindStringKey(kPrimaryPatternKey);
+        dict.FindString(kPrimaryPatternKey);
     if (!primary_pattern_str) {
       LOG_INVALID_EXTENSION_PREFERENCE_DETAILS;
       continue;
@@ -336,7 +335,7 @@
     }
 
     const std::string* secondary_pattern_str =
-        dict.FindStringKey(kSecondaryPatternKey);
+        dict.FindString(kSecondaryPatternKey);
     if (!secondary_pattern_str) {
       LOG_INVALID_EXTENSION_PREFERENCE_DETAILS;
       continue;
@@ -348,8 +347,7 @@
       continue;
     }
 
-    auto* content_settings_type_str =
-        dict.FindStringKey(kContentSettingsTypeKey);
+    auto* content_settings_type_str = dict.FindString(kContentSettingsTypeKey);
     if (!content_settings_type_str) {
       LOG_INVALID_EXTENSION_PREFERENCE_DETAILS;
       continue;
@@ -392,7 +390,7 @@
 
     ContentSetting setting;
     const std::string* content_setting_str =
-        dict.FindStringKey(kContentSettingKey);
+        dict.FindString(kContentSettingKey);
     if (!content_setting_str) {
       LOG_INVALID_EXTENSION_PREFERENCE_DETAILS;
       continue;
diff --git a/extensions/browser/api/content_settings/content_settings_store.h b/extensions/browser/api/content_settings/content_settings_store.h
index 26c8bcb9..85762ca 100644
--- a/extensions/browser/api/content_settings/content_settings_store.h
+++ b/extensions/browser/api/content_settings/content_settings_store.h
@@ -15,15 +15,12 @@
 #include "base/synchronization/lock.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
+#include "base/values.h"
 #include "components/content_settings/core/browser/content_settings_provider.h"
 #include "components/content_settings/core/common/content_settings.h"
 #include "components/content_settings/core/common/content_settings_pattern.h"
 #include "extensions/browser/extension_prefs_scope.h"
 
-namespace base {
-class Value;
-}
-
 namespace content_settings {
 class OriginIdentifierValueMap;
 class RuleIterator;
@@ -91,14 +88,13 @@
 
   // Serializes all content settings set by the extension with ID |extension_id|
   // and returns them as a list of Values.
-  std::vector<base::Value> GetSettingsForExtension(
-      const std::string& extension_id,
-      ExtensionPrefsScope scope) const;
+  base::Value::List GetSettingsForExtension(const std::string& extension_id,
+                                            ExtensionPrefsScope scope) const;
 
   // Deserializes content settings rules from |list| and applies them as set by
   // the extension with ID |extension_id|.
   void SetExtensionContentSettingFromList(const std::string& extension_id,
-                                          base::Value::ConstListView list,
+                                          const base::Value::List& list,
                                           ExtensionPrefsScope scope);
 
   // //////////////////////////////////////////////////////////////////////////
diff --git a/extensions/browser/api/content_settings/content_settings_store_unittest.cc b/extensions/browser/api/content_settings/content_settings_store_unittest.cc
index c2cec7d..15e8c580 100644
--- a/extensions/browser/api/content_settings/content_settings_store_unittest.cc
+++ b/extensions/browser/api/content_settings/content_settings_store_unittest.cc
@@ -243,41 +243,35 @@
   EXPECT_CALL(observer, OnContentSettingChanged(ext_id, false));
 
   // Build a preference list in JSON format.
-  std::vector<base::Value> pref_list;
+  base::Value::List pref_list;
   // {"primaryPattern": pattern, "secondaryPattern": pattern, "type": "cookies",
   //  "setting": "allow"}
-  base::Value dict_value(base::Value::Type::DICTIONARY);
-  dict_value.SetStringKey(ContentSettingsStore::kPrimaryPatternKey,
-                          pattern.ToString());
-  dict_value.SetStringKey(ContentSettingsStore::kSecondaryPatternKey,
-                          pattern.ToString());
-  dict_value.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey,
-                          "cookies");
-  dict_value.SetStringKey(ContentSettingsStore::kContentSettingKey, "allow");
-  pref_list.push_back(std::move(dict_value));
+  base::Value::Dict dict_value;
+  dict_value.Set(ContentSettingsStore::kPrimaryPatternKey, pattern.ToString());
+  dict_value.Set(ContentSettingsStore::kSecondaryPatternKey,
+                 pattern.ToString());
+  dict_value.Set(ContentSettingsStore::kContentSettingsTypeKey, "cookies");
+  dict_value.Set(ContentSettingsStore::kContentSettingKey, "allow");
+  pref_list.Append(std::move(dict_value));
   // Test content settings types that have been removed. Should be ignored.
   // {"primaryPattern": pattern, "secondaryPattern": pattern,
   //  "type": "fullscreen", "setting": "allow"}
-  dict_value = base::Value(base::Value::Type::DICTIONARY);
-  dict_value.SetStringKey(ContentSettingsStore::kPrimaryPatternKey,
-                          pattern.ToString());
-  dict_value.SetStringKey(ContentSettingsStore::kSecondaryPatternKey,
-                          pattern.ToString());
-  dict_value.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey,
-                          "fullscreen");
-  dict_value.SetStringKey(ContentSettingsStore::kContentSettingKey, "allow");
-  pref_list.push_back(std::move(dict_value));
+  dict_value = base::Value::Dict();
+  dict_value.Set(ContentSettingsStore::kPrimaryPatternKey, pattern.ToString());
+  dict_value.Set(ContentSettingsStore::kSecondaryPatternKey,
+                 pattern.ToString());
+  dict_value.Set(ContentSettingsStore::kContentSettingsTypeKey, "fullscreen");
+  dict_value.Set(ContentSettingsStore::kContentSettingKey, "allow");
+  pref_list.Append(std::move(dict_value));
   // {"primaryPattern": pattern, "secondaryPattern": pattern,
   //  "type": "mouselock", "setting": "allow"}
-  dict_value = base::Value(base::Value::Type::DICTIONARY);
-  dict_value.SetStringKey(ContentSettingsStore::kPrimaryPatternKey,
-                          pattern.ToString());
-  dict_value.SetStringKey(ContentSettingsStore::kSecondaryPatternKey,
-                          pattern.ToString());
-  dict_value.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey,
-                          "mouselock");
-  dict_value.SetStringKey(ContentSettingsStore::kContentSettingKey, "allow");
-  pref_list.push_back(std::move(dict_value));
+  dict_value = base::Value::Dict();
+  dict_value.Set(ContentSettingsStore::kPrimaryPatternKey, pattern.ToString());
+  dict_value.Set(ContentSettingsStore::kSecondaryPatternKey,
+                 pattern.ToString());
+  dict_value.Set(ContentSettingsStore::kContentSettingsTypeKey, "mouselock");
+  dict_value.Set(ContentSettingsStore::kContentSettingKey, "allow");
+  pref_list.Append(std::move(dict_value));
 
   store()->SetExtensionContentSettingFromList(ext_id, pref_list,
                                               kExtensionPrefsScopeRegular);
@@ -312,26 +306,24 @@
   EXPECT_CALL(observer, OnContentSettingChanged(ext_id, false)).Times(1);
 
   // Build a preference list in JSON format.
-  std::vector<base::Value> pref_list;
-  base::Value dict_value(base::Value::Type::DICTIONARY);
-  dict_value.SetStringKey(ContentSettingsStore::kPrimaryPatternKey,
-                          primary_pattern.ToString());
-  dict_value.SetStringKey(ContentSettingsStore::kSecondaryPatternKey,
-                          secondary_pattern.ToString());
-  dict_value.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey,
-                          "cookies");
-  dict_value.SetStringKey(ContentSettingsStore::kContentSettingKey, "allow");
-  pref_list.push_back(std::move(dict_value));
+  base::Value::List pref_list;
+  base::Value::Dict dict_value;
+  dict_value.Set(ContentSettingsStore::kPrimaryPatternKey,
+                 primary_pattern.ToString());
+  dict_value.Set(ContentSettingsStore::kSecondaryPatternKey,
+                 secondary_pattern.ToString());
+  dict_value.Set(ContentSettingsStore::kContentSettingsTypeKey, "cookies");
+  dict_value.Set(ContentSettingsStore::kContentSettingKey, "allow");
+  pref_list.Append(std::move(dict_value));
 
-  dict_value = base::Value(base::Value::Type::DICTIONARY);
-  dict_value.SetStringKey(ContentSettingsStore::kPrimaryPatternKey,
-                          primary_pattern.ToString());
-  dict_value.SetStringKey(ContentSettingsStore::kSecondaryPatternKey,
-                          secondary_pattern.ToString());
-  dict_value.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey,
-                          "geolocation");
-  dict_value.SetStringKey(ContentSettingsStore::kContentSettingKey, "allow");
-  pref_list.push_back(std::move(dict_value));
+  dict_value = base::Value::Dict();
+  dict_value.Set(ContentSettingsStore::kPrimaryPatternKey,
+                 primary_pattern.ToString());
+  dict_value.Set(ContentSettingsStore::kSecondaryPatternKey,
+                 secondary_pattern.ToString());
+  dict_value.Set(ContentSettingsStore::kContentSettingsTypeKey, "geolocation");
+  dict_value.Set(ContentSettingsStore::kContentSettingKey, "allow");
+  pref_list.Append(std::move(dict_value));
 
   store()->SetExtensionContentSettingFromList(ext_id, pref_list,
                                               kExtensionPrefsScopeRegular);
@@ -355,55 +347,50 @@
   std::string extension = "extension_id";
   RegisterExtension(extension);
 
-  base::Value valid_setting(base::Value::Type::DICTIONARY);
-  valid_setting.SetStringKey(ContentSettingsStore::kPrimaryPatternKey,
-                             "http://example1.com");
-  valid_setting.SetStringKey(ContentSettingsStore::kSecondaryPatternKey, "*");
-  valid_setting.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey,
-                             "javascript");
-  valid_setting.SetStringKey(ContentSettingsStore::kContentSettingKey, "allow");
+  base::Value::Dict valid_setting;
+  valid_setting.Set(ContentSettingsStore::kPrimaryPatternKey,
+                    "http://example1.com");
+  valid_setting.Set(ContentSettingsStore::kSecondaryPatternKey, "*");
+  valid_setting.Set(ContentSettingsStore::kContentSettingsTypeKey,
+                    "javascript");
+  valid_setting.Set(ContentSettingsStore::kContentSettingKey, "allow");
 
   // Missing secondary key.
-  base::Value invalid_setting1(base::Value::Type::DICTIONARY);
-  invalid_setting1.SetStringKey(ContentSettingsStore::kPrimaryPatternKey,
-                                "http://example2.com");
-  invalid_setting1.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey,
-                                "javascript");
-  invalid_setting1.SetStringKey(ContentSettingsStore::kContentSettingKey,
-                                "allow");
+  base::Value::Dict invalid_setting1;
+  invalid_setting1.Set(ContentSettingsStore::kPrimaryPatternKey,
+                       "http://example2.com");
+  invalid_setting1.Set(ContentSettingsStore::kContentSettingsTypeKey,
+                       "javascript");
+  invalid_setting1.Set(ContentSettingsStore::kContentSettingKey, "allow");
 
   // Invalid secondary pattern.
-  base::Value invalid_setting2(base::Value::Type::DICTIONARY);
-  invalid_setting2.SetStringKey(ContentSettingsStore::kPrimaryPatternKey,
-                                "http://example3.com");
-  invalid_setting2.SetStringKey(ContentSettingsStore::kSecondaryPatternKey,
-                                "[*.].");
-  invalid_setting2.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey,
-                                "javascript");
-  invalid_setting2.SetStringKey(ContentSettingsStore::kContentSettingKey,
-                                "allow");
+  base::Value::Dict invalid_setting2;
+  invalid_setting2.Set(ContentSettingsStore::kPrimaryPatternKey,
+                       "http://example3.com");
+  invalid_setting2.Set(ContentSettingsStore::kSecondaryPatternKey, "[*.].");
+  invalid_setting2.Set(ContentSettingsStore::kContentSettingsTypeKey,
+                       "javascript");
+  invalid_setting2.Set(ContentSettingsStore::kContentSettingKey, "allow");
 
   // Invalid setting.
-  base::Value invalid_setting3(base::Value::Type::DICTIONARY);
-  invalid_setting3.SetStringKey(ContentSettingsStore::kPrimaryPatternKey,
-                                "http://example4.com");
-  invalid_setting3.SetStringKey(ContentSettingsStore::kSecondaryPatternKey,
-                                "*");
-  invalid_setting3.SetStringKey(ContentSettingsStore::kContentSettingsTypeKey,
-                                "javascript");
-  invalid_setting3.SetStringKey(ContentSettingsStore::kContentSettingKey,
-                                "notasetting");
+  base::Value::Dict invalid_setting3;
+  invalid_setting3.Set(ContentSettingsStore::kPrimaryPatternKey,
+                       "http://example4.com");
+  invalid_setting3.Set(ContentSettingsStore::kSecondaryPatternKey, "*");
+  invalid_setting3.Set(ContentSettingsStore::kContentSettingsTypeKey,
+                       "javascript");
+  invalid_setting3.Set(ContentSettingsStore::kContentSettingKey, "notasetting");
 
-  std::vector<base::Value> list;
-  list.push_back(valid_setting.Clone());
-  list.push_back(invalid_setting1.Clone());
-  list.push_back(invalid_setting2.Clone());
-  list.push_back(invalid_setting3.Clone());
+  base::Value::List list;
+  list.Append(valid_setting.Clone());
+  list.Append(invalid_setting1.Clone());
+  list.Append(invalid_setting2.Clone());
+  list.Append(invalid_setting3.Clone());
   store()->SetExtensionContentSettingFromList(
       extension, list, ExtensionPrefsScope::kExtensionPrefsScopeRegular);
 
-  std::vector<base::Value> expected;
-  expected.push_back(valid_setting.Clone());
+  base::Value::List expected;
+  expected.Append(valid_setting.Clone());
   EXPECT_EQ(expected,
             store()->GetSettingsForExtension(
                 extension, ExtensionPrefsScope::kExtensionPrefsScopeRegular));
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index f99ef69c..03cc8dd 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1742,6 +1742,7 @@
   FILEMANAGERPRIVATE_OPENMANAGESYNCSETTINGS = 1679,
   PASSWORDSPRIVATE_STARTAUTOMATEDPASSWORDCHANGE = 1680,
   OFFSCREEN_CREATEDOCUMENT = 1681,
+  PASSWORDSPRIVATE_REFRESHSCRIPTSIFNECESSARY = 1682,
   // Last entry: Add new entries above, then run:
   // tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/browser/extension_host.cc b/extensions/browser/extension_host.cc
index 7c5d80c5..04b9beb 100644
--- a/extensions/browser/extension_host.cc
+++ b/extensions/browser/extension_host.cc
@@ -142,8 +142,17 @@
 }
 
 void ExtensionHost::Close() {
-  for (auto& observer : observer_list_)
-    observer.OnExtensionHostShouldClose(this);
+  // Some ways of closing the host may be asynchronous, which would allow the
+  // contents to call Close() multiple times. If we've already called the
+  // handler once, ignore subsequent calls. If we haven't called the handler
+  // once, the handler should be present.
+  DCHECK(close_handler_ || called_close_handler_);
+  if (called_close_handler_)
+    return;
+
+  called_close_handler_ = true;
+  std::move(close_handler_).Run(this);
+  // NOTE: `this` may be deleted at this point!
 }
 
 void ExtensionHost::AddObserver(ExtensionHostObserver* observer) {
@@ -172,6 +181,12 @@
     observer.OnNetworkRequestDone(this, request_id);
 }
 
+void ExtensionHost::SetCloseHandler(CloseHandler close_handler) {
+  DCHECK(!close_handler_);
+  DCHECK(!called_close_handler_);
+  close_handler_ = std::move(close_handler);
+}
+
 bool ExtensionHost::ShouldAllowNavigations() const {
   // Don't allow background pages or offscreen documents to navigate.
   return extension_host_type_ != mojom::ViewType::kExtensionBackgroundPage &&
diff --git a/extensions/browser/extension_host.h b/extensions/browser/extension_host.h
index 71599a1..35f6735 100644
--- a/extensions/browser/extension_host.h
+++ b/extensions/browser/extension_host.h
@@ -11,6 +11,7 @@
 #include <string>
 #include <unordered_map>
 
+#include "base/callback.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
@@ -49,6 +50,8 @@
                       public ExtensionFunctionDispatcher::Delegate,
                       public ExtensionRegistryObserver {
  public:
+  using CloseHandler = base::OnceCallback<void(ExtensionHost*)>;
+
   ExtensionHost(const Extension* extension,
                 content::SiteInstance* site_instance,
                 const GURL& url,
@@ -76,6 +79,14 @@
 
   mojom::ViewType extension_host_type() const { return extension_host_type_; }
 
+  // Sets the callback responsible for closing the ExtensionHost in response to
+  // a WebContents::CloseContents() call (which is triggered from e.g.
+  // calling `window.close()`). This is done separately from the constructor as
+  // some callsites create an ExtensionHost prior to the object that is
+  // responsible for later closing it, but must be done before `CloseContents()`
+  // can be called.
+  void SetCloseHandler(CloseHandler close_handler);
+
   // Returns the last committed URL of the associated WebContents.
   const GURL& GetLastCommittedURL() const;
 
@@ -237,6 +248,10 @@
   // started only once the ExtensionHost has exited the ExtensionHostQueue.
   std::unique_ptr<base::ElapsedTimer> load_start_;
 
+  CloseHandler close_handler_;
+  // Whether the close handler has been previously invoked.
+  bool called_close_handler_ = false;
+
   base::ObserverList<ExtensionHostObserver>::Unchecked observer_list_;
 
   base::WeakPtrFactory<ExtensionHost> weak_ptr_factory_{this};
diff --git a/extensions/browser/extension_host_observer.h b/extensions/browser/extension_host_observer.h
index 4fdb002a..ae17d33 100644
--- a/extensions/browser/extension_host_observer.h
+++ b/extensions/browser/extension_host_observer.h
@@ -45,9 +45,6 @@
   // Called when the network request with |request_id| is done.
   virtual void OnNetworkRequestDone(const ExtensionHost* host,
                                     uint64_t request_id) {}
-
-  // Called when ExtensionHost should be closed.
-  virtual void OnExtensionHostShouldClose(ExtensionHost* host) {}
 };
 
 }  // namespace extensions
diff --git a/extensions/browser/extension_prefs.cc b/extensions/browser/extension_prefs.cc
index 655b5b5..6cf952b 100644
--- a/extensions/browser/extension_prefs.cc
+++ b/extensions/browser/extension_prefs.cc
@@ -2116,12 +2116,12 @@
 void ExtensionPrefs::SetDNREnabledStaticRulesets(
     const ExtensionId& extension_id,
     const std::set<declarative_net_request::RulesetID>& ids) {
-  std::vector<base::Value> ids_list;
+  base::Value::List ids_list;
   for (const auto& id : ids)
-    ids_list.push_back(base::Value(id.value()));
+    ids_list.Append(id.value());
 
   UpdateExtensionPref(extension_id, kDNREnabledStaticRulesetIDs,
-                      std::make_unique<base::Value>(ids_list));
+                      std::make_unique<base::Value>(std::move(ids_list)));
 }
 
 bool ExtensionPrefs::GetDNRUseActionCountAsBadgeText(
diff --git a/extensions/browser/extensions_browser_client.cc b/extensions/browser/extensions_browser_client.cc
index 22a1098..1f7c5cf 100644
--- a/extensions/browser/extensions_browser_client.cc
+++ b/extensions/browser/extensions_browser_client.cc
@@ -13,6 +13,7 @@
 #include "extensions/browser/extension_api_frame_id_map.h"
 #include "extensions/browser/extension_error.h"
 #include "extensions/browser/updater/scoped_extension_updater_keep_alive.h"
+#include "extensions/common/permissions/permission_set.h"
 
 namespace extensions {
 
@@ -174,4 +175,11 @@
   return {browser_context};
 }
 
+std::unique_ptr<const PermissionSet>
+ExtensionsBrowserClient::AddAdditionalAllowedHosts(
+    const PermissionSet& desired_permissions,
+    const PermissionSet& granted_permissions) const {
+  return granted_permissions.Clone();
+}
+
 }  // namespace extensions
diff --git a/extensions/browser/extensions_browser_client.h b/extensions/browser/extensions_browser_client.h
index aa4e3cc..b060c13 100644
--- a/extensions/browser/extensions_browser_client.h
+++ b/extensions/browser/extensions_browser_client.h
@@ -79,6 +79,7 @@
 class ExtensionSystemProvider;
 class ExtensionWebContentsObserver;
 class KioskDelegate;
+class PermissionSet;
 class ProcessManagerDelegate;
 class ProcessMap;
 class RuntimeAPIDelegate;
@@ -443,6 +444,12 @@
       content::BrowserContext* browser_context,
       const Extension& extension) const;
 
+  // Adds any hosts that should be automatically considered "granted" if
+  // requested, returning a modified permission set.
+  virtual std::unique_ptr<const PermissionSet> AddAdditionalAllowedHosts(
+      const PermissionSet& desired_permissions,
+      const PermissionSet& granted_permissions) const;
+
  private:
   std::vector<std::unique_ptr<ExtensionsBrowserAPIProvider>> providers_;
 };
diff --git a/extensions/browser/permissions_manager.cc b/extensions/browser/permissions_manager.cc
index 44554d0..91559c13 100644
--- a/extensions/browser/permissions_manager.cc
+++ b/extensions/browser/permissions_manager.cc
@@ -443,6 +443,119 @@
       std::move(new_explicit_hosts), permissions->scriptable_hosts().Clone());
 }
 
+std::unique_ptr<const PermissionSet>
+PermissionsManager::GetExtensionDesiredPermissionsFromPrefs(
+    const Extension& extension) const {
+  // Determine the extension's "required" permissions (though even these can
+  // be withheld).
+  const PermissionSet& required_permissions =
+      PermissionsParser::GetRequiredPermissions(&extension);
+
+  // Retrieve the desired permissions from prefs. "Desired permissions" here
+  // are the permissions the extension most recently set for itself.  This
+  // might not be all granted permissions, since extensions can revoke their
+  // own permissions via chrome.permissions.remove() (which removes the
+  // permission from the active set, but not the granted set).
+  std::unique_ptr<const PermissionSet> desired_active_permissions =
+      extension_prefs_->GetActivePermissions(extension.id());
+  // The stored desired permissions may be null if the extension has never
+  // used the permissions API to modify its active permissions. In this case,
+  // the desired permissions are simply the set of required permissions.
+  if (!desired_active_permissions)
+    return required_permissions.Clone();
+
+  // Otherwise, the extension has stored a set of desired permissions. This
+  // could actually be a superset *or* a subset of requested permissions by the
+  // extension (depending on how its permissions have changed).
+  // Start by calculating the set of all current potentially-desired
+  // permissions by combining the required and optional permissions.
+  std::unique_ptr<const PermissionSet> requested_permissions =
+      PermissionSet::CreateUnion(
+          required_permissions,
+          PermissionsParser::GetOptionalPermissions(&extension));
+
+  // Now, take the intersection of the requested permissions and the stored
+  // permissions. This filters out any previously-stored permissions that are
+  // no longer used (which we continue to store in prefs in case the extension
+  // wants them back in the future).
+  std::unique_ptr<const PermissionSet> bounded_desired =
+      PermissionSet::CreateIntersection(*desired_active_permissions,
+                                        *requested_permissions);
+
+  // Additionally, we ensure that all "required" permissions are included in
+  // this desired set (to guard against any pref corruption - this ensures at
+  // least everything is in a "sane" state).
+  // TODO(https://crbug.com/1341118): Maddeningly, the order of the arguments
+  // passed to CreateUnion() here is *important*. Passing `bounded_desired` as
+  // the first param results in the valid schemes being removed.
+  bounded_desired =
+      PermissionSet::CreateUnion(required_permissions, *bounded_desired);
+
+  return bounded_desired;
+}
+
+std::unique_ptr<const PermissionSet>
+PermissionsManager::GetEffectivePermissionsToGrant(
+    const Extension& extension,
+    const PermissionSet& desired_permissions) const {
+  if (!util::CanWithholdPermissionsFromExtension(extension)) {
+    // The withhold creation flag should never have been set in cases where
+    // withholding isn't allowed.
+    DCHECK(!(extension.creation_flags() & Extension::WITHHOLD_PERMISSIONS));
+    return desired_permissions.Clone();
+  }
+
+  if (desired_permissions.effective_hosts().is_empty())
+    return desired_permissions.Clone();  // No hosts to withhold.
+
+  // Determine if we should withhold host permissions. This is different for
+  // extensions that are being newly-installed and extensions that have already
+  // been installed; this is indicated by the extension creation flags.
+  bool should_withhold = false;
+  if (extension.creation_flags() & Extension::WITHHOLD_PERMISSIONS)
+    should_withhold = true;
+  else
+    should_withhold = HasWithheldHostPermissions(extension.id());
+
+  if (!should_withhold)
+    return desired_permissions.Clone();
+
+  // Otherwise, permissions should be withheld according to the user-granted
+  // permission set.
+
+  // Determine the permissions granted by the user at runtime. If none are found
+  // in prefs, default it to an empty set.
+  std::unique_ptr<const PermissionSet> granted_permissions =
+      GetRuntimePermissionsFromPrefs(extension);
+  if (!granted_permissions)
+    granted_permissions = std::make_unique<PermissionSet>();
+
+  // Add any additional hosts that should be auto-granted.
+  granted_permissions =
+      ExtensionsBrowserClient::Get()->AddAdditionalAllowedHosts(
+          desired_permissions, *granted_permissions);
+
+  // Host permissions may be withheld. The resulting set is the intersection of
+  // the hosts the extension desires and the user has approved or should always
+  // be granted.
+  URLPatternSet new_scriptable_hosts = URLPatternSet::CreateIntersection(
+      desired_permissions.scriptable_hosts(),
+      granted_permissions->scriptable_hosts(),
+      URLPatternSet::IntersectionBehavior::kDetailed);
+  URLPatternSet new_explicit_hosts = URLPatternSet::CreateIntersection(
+      desired_permissions.explicit_hosts(),
+      granted_permissions->explicit_hosts(),
+      URLPatternSet::IntersectionBehavior::kDetailed);
+
+  // The total resulting permissions set includes the new host permissions and
+  // the originally-requested API and manifest permissions (which are never
+  // currently withheld).
+  return std::make_unique<PermissionSet>(
+      desired_permissions.apis().Clone(),
+      desired_permissions.manifest_permissions().Clone(),
+      std::move(new_explicit_hosts), std::move(new_scriptable_hosts));
+}
+
 void PermissionsManager::AddObserver(Observer* observer) {
   observers_.AddObserver(observer);
 }
diff --git a/extensions/browser/permissions_manager.h b/extensions/browser/permissions_manager.h
index e9626a7..e6150c4 100644
--- a/extensions/browser/permissions_manager.h
+++ b/extensions/browser/permissions_manager.h
@@ -148,6 +148,23 @@
   std::unique_ptr<const PermissionSet> GetRuntimePermissionsFromPrefs(
       const Extension& extension) const;
 
+  // Returns the set of permissions that the `extension` wants to have active at
+  // this time. This does *not* take into account user-granted or runtime-
+  // withheld permissions.
+  // TODO(https://crbug.com/1268198): This should be a private method once we
+  // refactor a bit more and have PermissionsManager handle more of permission
+  // initialization.
+  std::unique_ptr<const PermissionSet> GetExtensionDesiredPermissionsFromPrefs(
+      const Extension& extension) const;
+
+  // Returns the set of permissions that should be granted to the given
+  // `extension` according to the runtime-granted permissions and current
+  // preferences, omitting host permissions if the extension supports it and
+  // the user has withheld permissions.
+  std::unique_ptr<const PermissionSet> GetEffectivePermissionsToGrant(
+      const Extension& extension,
+      const PermissionSet& desired_permissions) const;
+
   // Adds or removes observers.
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
diff --git a/extensions/browser/process_manager.cc b/extensions/browser/process_manager.cc
index 9637cfe41..edf33b20 100644
--- a/extensions/browser/process_manager.cc
+++ b/extensions/browser/process_manager.cc
@@ -382,6 +382,9 @@
   ExtensionHost* host =
       new ExtensionHost(extension, GetSiteInstanceForURL(url).get(), url,
                         mojom::ViewType::kExtensionBackgroundPage);
+  host->SetCloseHandler(
+      base::BindOnce(&ProcessManager::HandleCloseExtensionHost,
+                     weak_ptr_factory_.GetWeakPtr()));
   host->CreateRendererSoon();
   OnBackgroundHostCreated(host);
   return true;
@@ -1017,11 +1020,12 @@
       std::make_unique<base::ElapsedTimer>();
 }
 
-void ProcessManager::OnExtensionHostShouldClose(ExtensionHost* host) {
+void ProcessManager::HandleCloseExtensionHost(ExtensionHost* host) {
   TRACE_EVENT0("browser,startup", "ProcessManager::OnExtensionHostShouldClose");
-  DCHECK(host->extension_host_type() ==
-         mojom::ViewType::kExtensionBackgroundPage);
+  DCHECK_EQ(mojom::ViewType::kExtensionBackgroundPage,
+            host->extension_host_type());
   CloseBackgroundHost(host);
+  // WARNING: `host` is deleted at this point!
 }
 
 void ProcessManager::UnregisterServiceWorker(const WorkerId& worker_id) {
diff --git a/extensions/browser/process_manager.h b/extensions/browser/process_manager.h
index e54bc65..355a7b1 100644
--- a/extensions/browser/process_manager.h
+++ b/extensions/browser/process_manager.h
@@ -283,7 +283,6 @@
 
   // ExtensionHostObserver:
   void OnExtensionHostDestroyed(ExtensionHost* host) override;
-  void OnExtensionHostShouldClose(ExtensionHost* host) override;
 
   // Extra information we keep for each extension's background page.
   struct BackgroundPageData;
@@ -299,6 +298,10 @@
   // Called just after |host| is created so it can be registered in our lists.
   void OnBackgroundHostCreated(ExtensionHost* host);
 
+  // Handles a request from a created extension host to close the contents.
+  // This happens in cases such as the contents calling `window.close()`.
+  void HandleCloseExtensionHost(ExtensionHost* host);
+
   // Close the given |host| iff it's a background page.
   void CloseBackgroundHost(ExtensionHost* host);
 
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index c181699d..64549dfd 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -4268,7 +4268,10 @@
   bool is_offscreen = !!offscreen_target_frame_buffer_.get();
   caps.surface_origin =
       !is_offscreen ? surface_->GetOrigin() : gfx::SurfaceOrigin::kBottomLeft;
-  caps.msaa_is_slow = workarounds().msaa_is_slow;
+  caps.msaa_is_slow =
+      base::FeatureList::IsEnabled(features::kEnableMSAAOnNewIntelGPUs)
+          ? workarounds().msaa_is_slow_2
+          : workarounds().msaa_is_slow;
   caps.avoid_stencil_buffers = workarounds().avoid_stencil_buffers;
   caps.multisample_compatibility =
       feature_info_->feature_flags().ext_multisample_compatibility;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
index 0906a535..99f67b1 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
@@ -1683,7 +1683,10 @@
   caps.surfaceless = !offscreen_ && surface_->IsSurfaceless();
   caps.surface_origin =
       !offscreen_ ? surface_->GetOrigin() : gfx::SurfaceOrigin::kBottomLeft;
-  caps.msaa_is_slow = feature_info_->workarounds().msaa_is_slow;
+  caps.msaa_is_slow =
+      base::FeatureList::IsEnabled(features::kEnableMSAAOnNewIntelGPUs)
+          ? feature_info_->workarounds().msaa_is_slow_2
+          : feature_info_->workarounds().msaa_is_slow;
   caps.avoid_stencil_buffers =
       feature_info_->workarounds().avoid_stencil_buffers;
   caps.multisample_compatibility =
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc
index 9c9de76f..aafa913 100644
--- a/gpu/command_buffer/service/raster_decoder.cc
+++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -1327,7 +1327,10 @@
                  feature_info()->workarounds().max_3d_array_texture_size);
   }
   caps.sync_query = feature_info()->feature_flags().chromium_sync_query;
-  caps.msaa_is_slow = feature_info()->workarounds().msaa_is_slow;
+  caps.msaa_is_slow =
+      base::FeatureList::IsEnabled(features::kEnableMSAAOnNewIntelGPUs)
+          ? feature_info()->workarounds().msaa_is_slow_2
+          : feature_info()->workarounds().msaa_is_slow;
   caps.avoid_stencil_buffers =
       feature_info()->workarounds().avoid_stencil_buffers;
 
diff --git a/gpu/command_buffer/service/shared_image_factory.cc b/gpu/command_buffer/service/shared_image_factory.cc
index 43987eee..1634157 100644
--- a/gpu/command_buffer/service/shared_image_factory.cc
+++ b/gpu/command_buffer/service/shared_image_factory.cc
@@ -430,7 +430,7 @@
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 #endif  // defined(USE_OZONE)
 
-#if !BUILDFLAG(IS_ANDROID)
+#if BUILDFLAG(IS_MAC)
   // TODO(hitawala): Temporary factory that will be replaced with Ozone and
   // other backings
   if (use_gl) {
diff --git a/gpu/command_buffer/service/skia_utils.cc b/gpu/command_buffer/service/skia_utils.cc
index c2dc1828..2d2529c 100644
--- a/gpu/command_buffer/service/skia_utils.cc
+++ b/gpu/command_buffer/service/skia_utils.cc
@@ -11,6 +11,7 @@
 #include "components/viz/common/resources/resource_format_utils.h"
 #include "gpu/command_buffer/service/feature_info.h"
 #include "gpu/command_buffer/service/shared_context_state.h"
+#include "gpu/config/gpu_finch_features.h"
 #include "gpu/config/gpu_switches.h"
 #include "gpu/config/skia_limits.h"
 #include "third_party/skia/include/gpu/GrBackendSurface.h"
@@ -90,6 +91,9 @@
   // in a more granular way.  For OOPR-Canvas we want 8, but for other purposes,
   // a texture atlas with sample count of 4 would be sufficient
   options.fInternalMultisampleCount = 8;
+  options.fAllowMSAAOnNewIntel =
+      base::FeatureList::IsEnabled(features::kEnableMSAAOnNewIntelGPUs);
+
   if (type == GrContextType::kMetal)
     options.fRuntimeProgramCacheSize = 1024;
 
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json
index c51c171..f5f3360 100644
--- a/gpu/config/gpu_driver_bug_list.json
+++ b/gpu/config/gpu_driver_bug_list.json
@@ -4066,6 +4066,43 @@
       "features": [
         "disable_accelerated_vp9_decode"
       ]
-    }
+    },
+    {
+      "id": 398,
+      "description": "On pre-Ice Lake Intel GPUs MSAA performance is not acceptable for GPU rasterization",
+      "cr_bugs": [527565, 1298585, 1341830],
+      "vendor_id": "0x8086",
+      "intel_gpu_generation": {
+        "op": "<",
+        "value": "11"
+      },
+      "multi_gpu_category": "active",
+      "exceptions": [
+        {
+          "os": {
+            "type": "fuchsia"
+          }
+        }
+      ],
+      "features": [
+        "msaa_is_slow_2"
+      ]
+    },
+    {
+      "id": 399,
+      "description": "On pre-Ice Lake Intel GPUs MSAA performance is not acceptable for GPU rasterization. Duplicate of 398 for Android",
+      "cr_bugs": [759471],
+      "os": {
+        "type": "android"
+      },
+      "gl_vendor": "Intel.*",
+      "intel_gpu_generation": {
+        "op": "<",
+        "value": "11"
+      },
+      "features": [
+        "msaa_is_slow_2"
+      ]
+    }    
   ]
 }
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc
index 2a9267a..a026e84 100644
--- a/gpu/config/gpu_finch_features.cc
+++ b/gpu/config/gpu_finch_features.cc
@@ -146,6 +146,10 @@
 const base::Feature kCanvasOopRasterization{"CanvasOopRasterization",
                                             base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables the use of MSAA in skia on Ice Lake and later intel architectures.
+const base::Feature kEnableMSAAOnNewIntelGPUs{
+    "EnableMSAAOnNewIntelGPUs", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables the use of ANGLE validation for non-WebGL contexts.
 const base::Feature kDefaultEnableANGLEValidation{
     "DefaultEnableANGLEValidation", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/gpu/config/gpu_finch_features.h b/gpu/config/gpu_finch_features.h
index 69f5f96..7bf6498f 100644
--- a/gpu/config/gpu_finch_features.h
+++ b/gpu/config/gpu_finch_features.h
@@ -32,6 +32,8 @@
 
 GPU_EXPORT extern const base::Feature kCanvasOopRasterization;
 
+GPU_EXPORT extern const base::Feature kEnableMSAAOnNewIntelGPUs;
+
 GPU_EXPORT extern const base::Feature kDefaultEnableANGLEValidation;
 
 GPU_EXPORT extern const base::Feature kCanvasContextLostInBackground;
diff --git a/gpu/config/gpu_workaround_list.txt b/gpu/config/gpu_workaround_list.txt
index c11de6c..82c0e2a 100644
--- a/gpu/config/gpu_workaround_list.txt
+++ b/gpu/config/gpu_workaround_list.txt
@@ -101,6 +101,7 @@
 max_msaa_sample_count_4
 max_texture_size_limit_4096
 msaa_is_slow
+msaa_is_slow_2
 multisample_renderbuffer_resize_emulation
 needs_offscreen_buffer_workaround
 no_downscaled_overlay_promotion
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 539f65a2..df4ea3c 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -2133,10 +2133,10 @@
       dimensions: "builderless:1"
       dimensions: "cores:8"
       dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
+      dimensions: "free_space:high"
       dimensions: "os:Ubuntu-18.04"
       dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
+      dimensions: "ssd:1"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
         cipd_version: "latest"
@@ -3994,7 +3994,7 @@
       dimensions: "builderless:1"
       dimensions: "cores:8"
       dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
+      dimensions: "free_space:high"
       dimensions: "os:Windows-10"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:0"
@@ -4074,7 +4074,7 @@
       dimensions: "builderless:1"
       dimensions: "cores:8"
       dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
+      dimensions: "free_space:high"
       dimensions: "os:Windows-10"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:0"
@@ -4154,7 +4154,7 @@
       dimensions: "builderless:1"
       dimensions: "cores:32"
       dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
+      dimensions: "free_space:high"
       dimensions: "os:Windows-10"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:0"
@@ -7026,10 +7026,10 @@
       dimensions: "builderless:1"
       dimensions: "cores:8"
       dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
+      dimensions: "free_space:high"
       dimensions: "os:Ubuntu-18.04"
       dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:0"
+      dimensions: "ssd:1"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/main"
@@ -19226,7 +19226,7 @@
       dimensions: "free_space:high"
       dimensions: "os:Windows"
       dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:1"
+      dimensions: "ssd:0"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
         cipd_version: "latest"
@@ -19553,7 +19553,7 @@
       dimensions: "builderless:1"
       dimensions: "cores:32"
       dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
+      dimensions: "free_space:high"
       dimensions: "os:Windows"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:0"
@@ -19636,7 +19636,7 @@
       dimensions: "builderless:1"
       dimensions: "cores:32"
       dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
+      dimensions: "free_space:high"
       dimensions: "os:Windows"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:0"
@@ -43559,7 +43559,7 @@
       dimensions: "builderless:1"
       dimensions: "cores:8"
       dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
+      dimensions: "free_space:high"
       dimensions: "os:Windows-10"
       dimensions: "pool:luci.chromium.ci"
       dimensions: "ssd:0"
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star
index d20670c6..df3551f 100644
--- a/infra/config/subprojects/chromium/ci/chromium.android.star
+++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -5,7 +5,7 @@
 
 load("//lib/args.star", "args")
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "goma", "os", "sheriff_rotations")
+load("//lib/builders.star", "builders", "goma", "os", "sheriff_rotations")
 load("//lib/branches.star", "branches")
 load("//lib/ci.star", "ci", "rbe_instance", "rbe_jobs")
 load("//lib/consoles.star", "consoles")
@@ -392,6 +392,8 @@
     ),
     cq_mirrors_console_view = "mirrors",
     execution_timeout = 6 * time.hour,
+    free_space = builders.free_space.high,
+    ssd = True,
 )
 
 ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.clang.star b/infra/config/subprojects/chromium/ci/chromium.clang.star
index d510e46..785b93f 100644
--- a/infra/config/subprojects/chromium/ci/chromium.clang.star
+++ b/infra/config/subprojects/chromium/ci/chromium.clang.star
@@ -302,7 +302,6 @@
     ),
     os = os.WINDOWS_ANY,
     free_space = builders.free_space.high,
-    ssd = True,
 )
 
 ci.builder(
@@ -340,6 +339,7 @@
         short_name = "dbg",
     ),
     os = os.WINDOWS_ANY,
+    free_space = builders.free_space.high,
 )
 
 ci.builder(
@@ -349,6 +349,7 @@
         short_name = "dll",
     ),
     os = os.WINDOWS_ANY,
+    free_space = builders.free_space.high,
 )
 
 ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star
index 3ede471..fadfd362 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -5,7 +5,7 @@
 
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "cpu", "goma", "os", "xcode")
+load("//lib/builders.star", "builders", "cpu", "goma", "os", "xcode")
 load("//lib/ci.star", "ci", "rbe_instance", "rbe_jobs")
 load("//lib/consoles.star", "consoles")
 load("//lib/structs.star", "structs")
@@ -880,6 +880,7 @@
     reclient_instance = rbe_instance.DEFAULT,
     reclient_jobs = 80,
     os = os.WINDOWS_DEFAULT,
+    free_space = builders.free_space.high,
 )
 
 ci.builder(
@@ -897,6 +898,7 @@
     reclient_instance = rbe_instance.DEFAULT,
     reclient_jobs = 250,
     os = os.WINDOWS_DEFAULT,
+    free_space = builders.free_space.high,
 )
 
 ci.builder(
@@ -994,6 +996,7 @@
     reclient_instance = rbe_instance.TEST_CQ,
     reclient_jobs = 80,
     os = os.WINDOWS_DEFAULT,
+    free_space = builders.free_space.high,
 )
 
 ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.linux.star b/infra/config/subprojects/chromium/ci/chromium.linux.star
index d1a411d85..5ade1b1 100644
--- a/infra/config/subprojects/chromium/ci/chromium.linux.star
+++ b/infra/config/subprojects/chromium/ci/chromium.linux.star
@@ -5,7 +5,7 @@
 
 load("//lib/args.star", "args")
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "os", "sheriff_rotations")
+load("//lib/builders.star", "builders", "os", "sheriff_rotations")
 load("//lib/branches.star", "branches")
 load("//lib/ci.star", "ci", "rbe_instance", "rbe_jobs")
 load("//lib/consoles.star", "consoles")
@@ -164,6 +164,8 @@
     tree_closing = False,
     notifies = ["Deterministic Linux", "close-on-any-step-failure"],
     reclient_jobs = rbe_jobs.DEFAULT,
+    free_space = builders.free_space.high,
+    ssd = True,
 )
 
 ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.updater.star b/infra/config/subprojects/chromium/ci/chromium.updater.star
index 02b1282..f29f3e0 100644
--- a/infra/config/subprojects/chromium/ci/chromium.updater.star
+++ b/infra/config/subprojects/chromium/ci/chromium.updater.star
@@ -5,7 +5,7 @@
 
 load("//lib/branches.star", "branches")
 load("//lib/builder_config.star", "builder_config")
-load("//lib/builders.star", "cpu", "goma", "os")
+load("//lib/builders.star", "builders", "cpu", "goma", "os")
 load("//lib/ci.star", "ci", "rbe_instance", "rbe_jobs")
 load("//lib/consoles.star", "consoles")
 
@@ -419,6 +419,7 @@
     goma_backend = None,
     reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI,
     reclient_instance = rbe_instance.DEFAULT,
+    free_space = builders.free_space.high,
 )
 
 ci.builder(
diff --git a/ios/chrome/browser/tabs_search/tabs_search_service.h b/ios/chrome/browser/tabs_search/tabs_search_service.h
index c533f35a1..6fcc106 100644
--- a/ios/chrome/browser/tabs_search/tabs_search_service.h
+++ b/ios/chrome/browser/tabs_search/tabs_search_service.h
@@ -120,8 +120,7 @@
   // A callback to return history search results once the current in progress
   // history search completes. Will be null if no search is in progress.
   base::OnceCallback<void(size_t result_count)> history_search_callback_;
-  // A history service instance for the current in progress history search.
-  // This service be null when no history search is in progress.
+  // A history service instance for the associated |browser_state_|.
   std::unique_ptr<history::BrowsingHistoryService> history_service_;
   // Provides dependencies and funnels callbacks from BrowsingHistoryService.
   std::unique_ptr<IOSBrowsingHistoryDriver> history_driver_;
diff --git a/ios/chrome/browser/tabs_search/tabs_search_service.mm b/ios/chrome/browser/tabs_search/tabs_search_service.mm
index 7ce6a2c..87a3d004 100644
--- a/ios/chrome/browser/tabs_search/tabs_search_service.mm
+++ b/ios/chrome/browser/tabs_search/tabs_search_service.mm
@@ -157,18 +157,20 @@
   DCHECK(!browser_state_->IsOffTheRecord());
   DCHECK(completion);
 
+  if (!history_service_.get()) {
+    history_driver_ =
+        std::make_unique<IOSBrowsingHistoryDriver>(browser_state_, this);
+
+    history_service_ = std::make_unique<history::BrowsingHistoryService>(
+        history_driver_.get(),
+        ios::HistoryServiceFactory::GetForBrowserState(
+            browser_state_, ServiceAccessType::EXPLICIT_ACCESS),
+        SyncServiceFactory::GetForBrowserState(browser_state_));
+  }
+
   ongoing_history_search_term_ = term;
   history_search_callback_ = std::move(completion);
 
-  history_driver_ =
-      std::make_unique<IOSBrowsingHistoryDriver>(browser_state_, this);
-
-  history_service_ = std::make_unique<history::BrowsingHistoryService>(
-      history_driver_.get(),
-      ios::HistoryServiceFactory::GetForBrowserState(
-          browser_state_, ServiceAccessType::EXPLICIT_ACCESS),
-      SyncServiceFactory::GetForBrowserState(browser_state_));
-
   history::QueryOptions options;
   options.duplicate_policy = history::QueryOptions::REMOVE_ALL_DUPLICATES;
   options.matching_algorithm =
@@ -229,5 +231,4 @@
   std::move(history_search_callback_).Run(results.size());
 
   ongoing_history_search_term_ = std::u16string();
-  history_service_.reset();
 }
diff --git a/ios/chrome/browser/ui/browser_view/BUILD.gn b/ios/chrome/browser/ui/browser_view/BUILD.gn
index e939697a..23cf143 100644
--- a/ios/chrome/browser/ui/browser_view/BUILD.gn
+++ b/ios/chrome/browser/ui/browser_view/BUILD.gn
@@ -250,6 +250,7 @@
     "//ios/chrome/browser/browser_state:test_support",
     "//ios/chrome/browser/download",
     "//ios/chrome/browser/favicon",
+    "//ios/chrome/browser/find_in_page",
     "//ios/chrome/browser/history",
     "//ios/chrome/browser/main:test_support",
     "//ios/chrome/browser/prerender",
@@ -274,6 +275,7 @@
     "//ios/chrome/browser/ui/fullscreen:internal",
     "//ios/chrome/browser/ui/fullscreen/test",
     "//ios/chrome/browser/ui/incognito_reauth:incognito_reauth_scene_agent",
+    "//ios/chrome/browser/ui/keyboard",
     "//ios/chrome/browser/ui/main:scene_state_header",
     "//ios/chrome/browser/ui/popup_menu",
     "//ios/chrome/browser/ui/sharing",
@@ -295,6 +297,7 @@
     "//ios/chrome/test:block_cleanup_test",
     "//ios/chrome/test:test_support",
     "//ios/net",
+    "//ios/web/find_in_page",
     "//ios/web/public",
     "//ios/web/public/test",
     "//ios/web/public/test/fakes",
diff --git a/ios/chrome/browser/ui/browser_view/DEPS b/ios/chrome/browser/ui/browser_view/DEPS
new file mode 100644
index 0000000..f92d39e
--- /dev/null
+++ b/ios/chrome/browser/ui/browser_view/DEPS
@@ -0,0 +1,9 @@
+include_rules = [
+  "+ios/chrome/browser/ui/browser_view",
+]
+
+specific_include_rules = {
+  "key_commands_provider_unittest\.mm": [
+    "+ios/web/find_in_page/find_in_page_manager_impl.h",
+  ],
+}
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
index 9b6ca2c0..045650c 100644
--- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -339,6 +339,7 @@
   std::unique_ptr<base::ScopedObservation<WebStateList, WebStateListObserver>>
       _scopedWebStateListObservation;
   BrowserViewControllerDependencies _viewControllerDependencies;
+  KeyCommandsProvider* _keyCommandsProvider;
   PrerenderService* _prerenderService;
   BubblePresenter* _bubblePresenter;
   NewTabPageCoordinator* _ntpCoordinator;
@@ -511,7 +512,6 @@
 
   BrowserViewControllerHelper* browserViewControllerHelper =
       [[BrowserViewControllerHelper alloc] init];
-  KeyCommandsProvider* keyCommandsProvider = [[KeyCommandsProvider alloc] init];
 
   _viewController = [[BrowserViewController alloc]
                      initWithBrowser:self.browser
@@ -519,7 +519,7 @@
                                          .viewController
          browserViewControllerHelper:browserViewControllerHelper
                           dispatcher:self.dispatcher
-                 keyCommandsProvider:keyCommandsProvider
+                 keyCommandsProvider:_keyCommandsProvider
                         dependencies:_viewControllerDependencies];
 
   WebNavigationBrowserAgent::FromBrowser(self.browser)
@@ -567,6 +567,15 @@
 
   ChromeBrowserState* browserState = self.browser->GetBrowserState();
 
+  _keyCommandsProvider =
+      [[KeyCommandsProvider alloc] initWithBrowser:self.browser];
+  _keyCommandsProvider.dispatcher =
+      static_cast<id<ApplicationCommands, BrowserCommands,
+                     BrowserCoordinatorCommands, FindInPageCommands>>(
+          _dispatcher);
+  _keyCommandsProvider.omniboxHandler =
+      static_cast<id<OmniboxCommands>>(_dispatcher);
+
   _prerenderService = PrerenderServiceFactory::GetForBrowserState(browserState);
   if (!browserState->IsOffTheRecord()) {
     DCHECK(_prerenderService);
@@ -684,6 +693,8 @@
 }
 
 - (void)updateViewControllerDependencies {
+  _keyCommandsProvider.baseViewController = self.viewController;
+
   _bookmarkInteractionController.parentController = self.viewController;
 
   _bubblePresenter.delegate = self.viewController;
@@ -755,6 +766,7 @@
   [_ntpCoordinator stop];
   _ntpCoordinator = nil;
 
+  _keyCommandsProvider = nil;
   _dispatcher = nil;
 }
 
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.h b/ios/chrome/browser/ui/browser_view/browser_view_controller.h
index d8b8ab12..897888d 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.h
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.h
@@ -10,6 +10,7 @@
 #import "base/ios/block_types.h"
 
 #import "ios/chrome/browser/ui/authentication/signin_presenter.h"
+#import "ios/chrome/browser/ui/browser_view/key_commands_provider.h"
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
 #import "ios/chrome/browser/ui/commands/new_tab_page_commands.h"
 #import "ios/chrome/browser/ui/find_bar/find_bar_coordinator.h"
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index cdacb4c..f483ffa 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -17,7 +17,6 @@
 #import "components/feature_engagement/public/event_constants.h"
 #import "components/feature_engagement/public/tracker.h"
 #import "components/reading_list/core/reading_list_model.h"
-#import "components/sessions/core/tab_restore_service_helper.h"
 #import "components/strings/grit/components_strings.h"
 #import "components/ukm/ios/ukm_url_recorder.h"
 #import "ios/chrome/app/application_delegate/app_state.h"
@@ -27,7 +26,6 @@
 #import "ios/chrome/browser/crash_report/crash_keys_helper.h"
 #import "ios/chrome/browser/discover_feed/feed_constants.h"
 #import "ios/chrome/browser/feature_engagement/tracker_util.h"
-#import "ios/chrome/browser/find_in_page/find_tab_helper.h"
 #import "ios/chrome/browser/infobars/infobar_manager_impl.h"
 #import "ios/chrome/browser/main/browser.h"
 #import "ios/chrome/browser/metrics/new_tab_page_uma.h"
@@ -41,7 +39,6 @@
 #import "ios/chrome/browser/prerender/prerender_service_factory.h"
 #import "ios/chrome/browser/reading_list/offline_page_tab_helper.h"
 #import "ios/chrome/browser/reading_list/reading_list_model_factory.h"
-#import "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h"
 #import "ios/chrome/browser/sessions/session_restoration_browser_agent.h"
 #import "ios/chrome/browser/signin/authentication_service.h"
 #import "ios/chrome/browser/signin/authentication_service_factory.h"
@@ -51,7 +48,6 @@
 #import "ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.h"
 #import "ios/chrome/browser/ui/browser_container/browser_container_view_controller.h"
 #import "ios/chrome/browser/ui/browser_view/browser_view_controller_helper.h"
-#import "ios/chrome/browser/ui/browser_view/key_commands_provider.h"
 #import "ios/chrome/browser/ui/bubble/bubble_presenter.h"
 #import "ios/chrome/browser/ui/bubble/bubble_presenter_delegate.h"
 #import "ios/chrome/browser/ui/commands/browser_commands.h"
@@ -122,7 +118,6 @@
 #import "ios/chrome/browser/url_loading/url_loading_notifier_browser_agent.h"
 #import "ios/chrome/browser/url_loading/url_loading_observer_bridge.h"
 #import "ios/chrome/browser/url_loading/url_loading_params.h"
-#import "ios/chrome/browser/url_loading/url_loading_util.h"
 #import "ios/chrome/browser/voice/voice_search_navigations_tab_helper.h"
 #import "ios/chrome/browser/web/page_placeholder_tab_helper.h"
 #import "ios/chrome/browser/web/sad_tab_tab_helper.h"
@@ -241,7 +236,6 @@
 @interface BrowserViewController () <CRWWebStateObserver,
                                      FindBarPresentationDelegate,
                                      FullscreenUIElement,
-                                     KeyCommandsPlumbing,
                                      MainContentUI,
                                      SideSwipeControllerDelegate,
                                      TabStripPresentation,
@@ -790,7 +784,7 @@
                      focusOmnibox:(BOOL)focusOmnibox
                     inheritOpener:(BOOL)inheritOpener {
   NSTimeInterval startTime = [NSDate timeIntervalSinceReferenceDate];
-  BOOL offTheRecord = self.isOffTheRecord;
+  BOOL offTheRecord = _isOffTheRecord;
   ProceduralBlock oldForegroundTabWasAddedCompletionBlock =
       self.foregroundTabWasAddedCompletionBlock;
   id<OmniboxCommands> omniboxCommandHandler = self.omniboxHandler;
@@ -831,7 +825,7 @@
 
   UrlLoadParams params = UrlLoadParams::InNewTab(GURL(kChromeUINewTabURL));
   params.web_params.transition_type = ui::PAGE_TRANSITION_TYPED;
-  params.in_incognito = self.isOffTheRecord;
+  params.in_incognito = _isOffTheRecord;
   params.inherit_opener = inheritOpener;
   UrlLoadingBrowserAgent::FromBrowser(self.browser)->Load(params);
 }
@@ -981,7 +975,7 @@
     BackgroundTabAnimationView* animatedView =
         [[BackgroundTabAnimationView alloc]
             initWithFrame:CGRectMake(0, 0, kAnimatedViewSize, kAnimatedViewSize)
-                incognito:self.isOffTheRecord];
+                incognito:_isOffTheRecord];
     __weak UIView* weakAnimatedView = animatedView;
     auto completionBlock = ^() {
       self.inNewTabAnimation = NO;
@@ -1051,27 +1045,18 @@
   return YES;
 }
 
-- (NSArray*)keyCommands {
+- (NSArray<UIKeyCommand*>*)keyCommands {
   if (![self shouldRegisterKeyboardCommands]) {
     return nil;
   }
 
   UIResponder* firstResponder = GetFirstResponder();
-  // TODO(crbug.com/1329100): Inject the key commands provider.
-  WebNavigationBrowserAgent* navigationAgent =
-      WebNavigationBrowserAgent::FromBrowser(self.browser);
-  return [_keyCommandsProvider
-      keyCommandsForConsumer:self
-          baseViewController:self
-                  dispatcher:self.dispatcher
-             navigationAgent:navigationAgent
-              omniboxHandler:self.omniboxHandler
-                 editingText:[firstResponder
-                                 isKindOfClass:[UITextField class]] ||
-                             [firstResponder
-                                 isKindOfClass:[UITextView class]] ||
-                             [[KeyboardObserverHelper sharedKeyboardObserver]
-                                 isKeyboardOnScreen]];
+  BOOL isEditingText =
+      [firstResponder isKindOfClass:[UITextField class]] ||
+      [firstResponder isKindOfClass:[UITextView class]] ||
+      [[KeyboardObserverHelper sharedKeyboardObserver] isKeyboardOnScreen];
+
+  return [_keyCommandsProvider keyCommandsWithEditingText:isEditingText];
 }
 
 #pragma mark - UIResponder helpers
@@ -2181,7 +2166,7 @@
   // Add toolbar margin to the frame for every scenario except compact-width
   // non-otr, as that is the only case where there isn't a primary toolbar.
   // (see crbug.com/1063173)
-  if (!IsSplitToolbarMode(self) || self.isOffTheRecord) {
+  if (!IsSplitToolbarMode(self) || _isOffTheRecord) {
     viewportInsets.top = [self expandedTopToolbarHeight];
   }
   return UIEdgeInsetsInsetRect(self.contentArea.bounds, viewportInsets);
@@ -2742,7 +2727,7 @@
     // If the NTP is active, then it's used as the base view for snapshotting.
     // When the tab strip is visible, or for the incognito NTP, the NTP is laid
     // out between the toolbars, so it should not be inset while snapshotting.
-    if ([self canShowTabStrip] || self.isOffTheRecord) {
+    if ([self canShowTabStrip] || _isOffTheRecord) {
       return UIEdgeInsetsZero;
     }
 
@@ -2931,8 +2916,7 @@
   if (isUserInitiated) {
     // Send either the "New Tab Opened" or "New Incognito Tab" opened to the
     // feature_engagement::Tracker based on `inIncognito`.
-    feature_engagement::NotifyNewTabEvent(self.browserState,
-                                          self.isOffTheRecord);
+    feature_engagement::NotifyNewTabEvent(self.browserState, _isOffTheRecord);
   }
 }
 
@@ -3044,7 +3028,7 @@
       base::RecordAction(base::UserMetricsAction("MobilePullGestureNewTab"));
       [self.dispatcher
           openURLInNewTab:[OpenNewTabCommand
-                              commandWithIncognito:self.isOffTheRecord]];
+                              commandWithIncognito:_isOffTheRecord]];
       break;
     case OverscrollAction::CLOSE_TAB:
       base::RecordAction(base::UserMetricsAction("MobilePullGestureCloseTab"));
@@ -3332,102 +3316,6 @@
       CGRectGetMaxX(view.bounds) - CGRectGetMaxX(viewportFrame));
 }
 
-#pragma mark - KeyCommandsPlumbing
-
-// TODO(crbug.com/1329100): Add isOffTheRecord as a property of the key commands
-// provider.
-- (BOOL)isOffTheRecord {
-  return _isOffTheRecord;
-}
-
-// TODO(crbug.com/1329100): Add isFindInPageAvailable as a property of the key
-// commands provider.
-- (BOOL)isFindInPageAvailable {
-  if (!self.currentWebState) {
-    return NO;
-  }
-
-  FindTabHelper* helper = FindTabHelper::FromWebState(self.currentWebState);
-  return (helper && helper->CurrentPageSupportsFindInPage());
-}
-
-// TODO(crbug.com/1329100): Add tabsCount as a property of the key commands
-// provider.
-- (NSUInteger)tabsCount {
-  if (_isShutdown)
-    return 0;
-  return self.browser->GetWebStateList()->count();
-}
-
-// TODO(crbug.com/1329100): FocusTabAtIndex can be executed by the key command
-// provider directly.
-- (void)focusTabAtIndex:(NSUInteger)index {
-  WebStateList* webStateList = self.browser->GetWebStateList();
-  if (webStateList->ContainsIndex(index)) {
-    webStateList->ActivateWebStateAt(static_cast<int>(index));
-  }
-}
-
-// TODO(crbug.com/1329100): focusNextTab can be executed by the key command
-// provider directly.
-- (void)focusNextTab {
-  WebStateList* webStateList = self.browser->GetWebStateList();
-  if (!webStateList)
-    return;
-
-  int activeIndex = webStateList->active_index();
-  if (activeIndex == WebStateList::kInvalidIndex)
-    return;
-
-  // If the active index isn't the last index, activate the next index.
-  // (the last index is always `count() - 1`).
-  // Otherwise activate the first index.
-  if (activeIndex < (webStateList->count() - 1)) {
-    webStateList->ActivateWebStateAt(activeIndex + 1);
-  } else {
-    webStateList->ActivateWebStateAt(0);
-  }
-}
-
-// TODO(crbug.com/1329100): focusPreviousTab can be executed by the key command
-// provider directly.
-- (void)focusPreviousTab {
-  WebStateList* webStateList = self.browser->GetWebStateList();
-  if (!webStateList)
-    return;
-
-  int activeIndex = webStateList->active_index();
-  if (activeIndex == WebStateList::kInvalidIndex)
-    return;
-
-  // If the active index isn't the first index, activate the prior index.
-  // Otherwise index the last index (`count() - 1`).
-  if (activeIndex > 0) {
-    webStateList->ActivateWebStateAt(activeIndex - 1);
-  } else {
-    webStateList->ActivateWebStateAt(webStateList->count() - 1);
-  }
-}
-
-// TODO(crbug.com/1329100): reopenClosedTab can be executed by the key command
-// provider directly.
-- (void)reopenClosedTab {
-  sessions::TabRestoreService* const tabRestoreService =
-      IOSChromeTabRestoreServiceFactory::GetForBrowserState(self.browserState);
-  if (!tabRestoreService || tabRestoreService->entries().empty())
-    return;
-
-  const std::unique_ptr<sessions::TabRestoreService::Entry>& entry =
-      tabRestoreService->entries().front();
-  // Only handle the TAB type.
-  // TODO(crbug.com/1056596) : Support WINDOW restoration under multi-window.
-  if (entry->type != sessions::TabRestoreService::TAB)
-    return;
-
-  [self.dispatcher openURLInNewTab:[OpenNewTabCommand command]];
-  RestoreTab(entry->id, WindowOpenDisposition::CURRENT_TAB, self.browser);
-}
-
 #pragma mark - MainContentUI
 
 - (MainContentUIState*)mainContentUIState {
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm
index f6a9359..447f66a 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm
@@ -194,7 +194,8 @@
 
     container_ = [[BrowserContainerViewController alloc] init];
     bvc_helper_ = [[BrowserViewControllerHelper alloc] init];
-    key_commands_provider_ = [[KeyCommandsProvider alloc] init];
+    key_commands_provider_ =
+        [[KeyCommandsProvider alloc] initWithBrowser:browser_.get()];
 
     fake_prerender_service_ = std::make_unique<FakePrerenderService>();
 
@@ -315,32 +316,6 @@
                          dismissOmnibox:YES];
 }
 
-// Verifies the the next/previous tab commands from the keyboard work OK.
-TEST_F(BrowserViewControllerTest, TestFocusNextPrevious) {
-  // Add more web states.
-  WebStateList* web_state_list = browser_->GetWebStateList();
-  // This test assumes there are exactly three web states in the list.
-  ASSERT_EQ(web_state_list->count(), 3);
-
-  ASSERT_TRUE([bvc_ conformsToProtocol:@protocol(KeyCommandsPlumbing)]);
-
-  id<KeyCommandsPlumbing> keyHandler =
-      static_cast<id<KeyCommandsPlumbing>>(bvc_);
-
-  [keyHandler focusNextTab];
-  EXPECT_EQ(web_state_list->active_index(), 1);
-  [keyHandler focusNextTab];
-  EXPECT_EQ(web_state_list->active_index(), 2);
-  [keyHandler focusNextTab];
-  EXPECT_EQ(web_state_list->active_index(), 0);
-  [keyHandler focusPreviousTab];
-  EXPECT_EQ(web_state_list->active_index(), 2);
-  [keyHandler focusPreviousTab];
-  EXPECT_EQ(web_state_list->active_index(), 1);
-  [keyHandler focusPreviousTab];
-  EXPECT_EQ(web_state_list->active_index(), 0);
-}
-
 // Tests that WebState::WasShown() and WebState::WasHidden() is properly called
 // for WebState activations in the BrowserViewController's WebStateList.
 TEST_F(BrowserViewControllerTest, UpdateWebStateVisibility) {
diff --git a/ios/chrome/browser/ui/browser_view/key_commands_provider.h b/ios/chrome/browser/ui/browser_view/key_commands_provider.h
index 4084258..c7972ea 100644
--- a/ios/chrome/browser/ui/browser_view/key_commands_provider.h
+++ b/ios/chrome/browser/ui/browser_view/key_commands_provider.h
@@ -13,56 +13,30 @@
 #import "ios/chrome/browser/ui/commands/find_in_page_commands.h"
 #import "ios/chrome/browser/ui/commands/omnibox_commands.h"
 
-class WebNavigationBrowserAgent;
-
-@protocol KeyCommandsPlumbing <NSObject>
-
-#pragma mark Query information
-
-// Whether the current profile is off-the-record.
-- (BOOL)isOffTheRecord;
-
-// Whether the Find in Page is available on current page. For example it's not
-// supported on NTP and other native content pages.
-- (BOOL)isFindInPageAvailable;
-
-// Returns the current number of tabs.
-- (NSUInteger)tabsCount;
-
-#pragma mark Call for action
-
-// Called to put the tab at index in focus.
-- (void)focusTabAtIndex:(NSUInteger)index;
-
-// Called to focus the next tab.
-- (void)focusNextTab;
-
-// Called to focus the previous tab.
-- (void)focusPreviousTab;
-
-// Called to reopen the last closed tab.
-- (void)reopenClosedTab;
-
-@end
+class Browser;
 
 // Handles the keyboard commands registration and handling for the
 // BrowserViewController.
 @interface KeyCommandsProvider : NSObject
 
-- (NSArray*)keyCommandsForConsumer:(id<KeyCommandsPlumbing>)consumer
-                baseViewController:(UIViewController*)baseViewController
-                        dispatcher:(id<ApplicationCommands,
-                                       BrowserCommands,
-                                       BrowserCoordinatorCommands,
-                                       FindInPageCommands>)dispatcher
-                   navigationAgent:(WebNavigationBrowserAgent*)navigationAgent
-                    omniboxHandler:(id<OmniboxCommands>)omniboxHandler
-                       editingText:(BOOL)editingText;
+@property(nonatomic, weak) UIViewController* baseViewController;
+@property(nonatomic, weak) id<ApplicationCommands,
+                              BrowserCommands,
+                              BrowserCoordinatorCommands,
+                              FindInPageCommands>
+    dispatcher;
+@property(nonatomic, weak) id<OmniboxCommands> omniboxHandler;
 
 // Set this flag to YES when the key shortcut bound to Escape key that dismisses
 // modals should be enabled.
 @property(nonatomic, assign) BOOL canDismissModals;
 
+- (instancetype)initWithBrowser:(Browser*)browser NS_DESIGNATED_INITIALIZER;
+
+- (instancetype)init NS_UNAVAILABLE;
+
+- (NSArray*)keyCommandsWithEditingText:(BOOL)editingText;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_BROWSER_VIEW_KEY_COMMANDS_PROVIDER_H_
diff --git a/ios/chrome/browser/ui/browser_view/key_commands_provider.mm b/ios/chrome/browser/ui/browser_view/key_commands_provider.mm
index b51cfe7..a5c20965 100644
--- a/ios/chrome/browser/ui/browser_view/key_commands_provider.mm
+++ b/ios/chrome/browser/ui/browser_view/key_commands_provider.mm
@@ -4,46 +4,56 @@
 
 #import "ios/chrome/browser/ui/browser_view/key_commands_provider.h"
 
-#include "components/strings/grit/components_strings.h"
+#import "components/sessions/core/tab_restore_service_helper.h"
+#import "components/strings/grit/components_strings.h"
+#import "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/find_in_page/find_tab_helper.h"
+#import "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h"
 #import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
 #import "ios/chrome/browser/ui/keyboard/UIKeyCommand+Chrome.h"
 #import "ios/chrome/browser/ui/util/keyboard_observer_helper.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
-#include "ios/chrome/browser/ui/util/rtl_geometry.h"
+#import "ios/chrome/browser/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
+#import "ios/chrome/browser/url_loading/url_loading_util.h"
 #import "ios/chrome/browser/web/web_navigation_browser_agent.h"
-#include "ios/chrome/grit/ios_strings.h"
-#include "ui/base/l10n/l10n_util_mac.h"
+#import "ios/chrome/browser/web_state_list/web_state_list.h"
+#import "ios/chrome/grit/ios_strings.h"
+#import "ios/web/public/web_state.h"
+#import "ui/base/l10n/l10n_util_mac.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
+@interface KeyCommandsProvider ()
+
+@property(nonatomic, assign) Browser* browser;
+@property(nonatomic, assign, readonly)
+    WebNavigationBrowserAgent* navigationAgent;
+
+@end
+
 @implementation KeyCommandsProvider
 
-- (NSArray*)keyCommandsForConsumer:(id<KeyCommandsPlumbing>)consumer
-                baseViewController:(UIViewController*)baseViewController
-                        dispatcher:(id<ApplicationCommands,
-                                       BrowserCommands,
-                                       BrowserCoordinatorCommands,
-                                       FindInPageCommands,
-                                       OmniboxCommands>)dispatcher
-                   navigationAgent:(WebNavigationBrowserAgent*)navigationAgent
-                    omniboxHandler:(id<OmniboxCommands>)omniboxHandler
-                       editingText:(BOOL)editingText {
-  __weak id<KeyCommandsPlumbing> weakConsumer = consumer;
-  __weak UIViewController* weakBaseViewController = baseViewController;
-  __weak id<ApplicationCommands, BrowserCommands, BrowserCoordinatorCommands,
-            FindInPageCommands>
-      weakDispatcher = dispatcher;
-  __weak id<OmniboxCommands> weakOmniboxHandler = omniboxHandler;
+- (instancetype)initWithBrowser:(Browser*)browser {
+  DCHECK(browser);
+  self = [super init];
+  if (self) {
+    _browser = browser;
+  }
+  return self;
+}
+
+- (NSArray<UIKeyCommand*>*)keyCommandsWithEditingText:(BOOL)editingText {
+  __weak __typeof(self) weakSelf = self;
 
   // Block to have the tab model open the tab at `index`, if there is one.
   void (^focusTab)(NSUInteger) = ^(NSUInteger index) {
-    [weakConsumer focusTabAtIndex:index];
+    [weakSelf focusTabAtIndex:index];
   };
 
-  const BOOL hasTabs = [consumer tabsCount] > 0;
+  const BOOL hasTabs = [self tabsCount] > 0;
 
   const BOOL useRTLLayout = UseRTLLayout();
 
@@ -52,21 +62,25 @@
   void (^browseRight)();
   if (useRTLLayout) {
     browseLeft = ^{
-      if (navigationAgent->CanGoForward())
-        navigationAgent->GoForward();
+      __typeof(self) strongSelf = weakSelf;
+      if (strongSelf.navigationAgent->CanGoForward())
+        strongSelf.navigationAgent->GoForward();
     };
     browseRight = ^{
-      if (navigationAgent->CanGoBack())
-        navigationAgent->GoBack();
+      __typeof(self) strongSelf = weakSelf;
+      if (strongSelf.navigationAgent->CanGoBack())
+        strongSelf.navigationAgent->GoBack();
     };
   } else {
     browseLeft = ^{
-      if (navigationAgent->CanGoBack())
-        navigationAgent->GoBack();
+      __typeof(self) strongSelf = weakSelf;
+      if (strongSelf.navigationAgent->CanGoBack())
+        strongSelf.navigationAgent->GoBack();
     };
     browseRight = ^{
-      if (navigationAgent->CanGoForward())
-        navigationAgent->GoForward();
+      __typeof(self) strongSelf = weakSelf;
+      if (strongSelf.navigationAgent->CanGoForward())
+        strongSelf.navigationAgent->GoForward();
     };
   }
 
@@ -75,17 +89,17 @@
   void (^focusTabRight)();
   if (useRTLLayout) {
     focusTabLeft = ^{
-      [weakConsumer focusNextTab];
+      [weakSelf focusNextTab];
     };
     focusTabRight = ^{
-      [weakConsumer focusPreviousTab];
+      [weakSelf focusPreviousTab];
     };
   } else {
     focusTabLeft = ^{
-      [weakConsumer focusPreviousTab];
+      [weakSelf focusPreviousTab];
     };
     focusTabRight = ^{
-      [weakConsumer focusNextTab];
+      [weakSelf focusNextTab];
     };
   }
 
@@ -93,14 +107,14 @@
   void (^newTab)() = ^{
     OpenNewTabCommand* newTabCommand = [OpenNewTabCommand command];
     newTabCommand.shouldFocusOmnibox = YES;
-    [weakDispatcher openURLInNewTab:newTabCommand];
+    [weakSelf.dispatcher openURLInNewTab:newTabCommand];
   };
 
   void (^newIncognitoTab)() = ^{
     OpenNewTabCommand* newIncognitoTabCommand =
         [OpenNewTabCommand incognitoTabCommand];
     newIncognitoTabCommand.shouldFocusOmnibox = YES;
-    [weakDispatcher openURLInNewTab:newIncognitoTabCommand];
+    [weakSelf.dispatcher openURLInNewTab:newIncognitoTabCommand];
   };
 
   const int browseLeftDescriptionID = useRTLLayout
@@ -111,7 +125,8 @@
                                            : IDS_IOS_KEYBOARD_HISTORY_FORWARD;
 
   // Initialize the array of commands with an estimated capacity.
-  NSMutableArray* keyCommands = [NSMutableArray arrayWithCapacity:32];
+  NSMutableArray<UIKeyCommand*>* keyCommands =
+      [NSMutableArray arrayWithCapacity:32];
 
   // List the commands that always appear in the HUD. They appear in the HUD
   // since they have titles.
@@ -133,14 +148,14 @@
                          title:l10n_util::GetNSStringWithFixup(
                                    IDS_IOS_KEYBOARD_REOPEN_CLOSED_TAB)
                         action:^{
-                          [weakConsumer reopenClosedTab];
+                          [weakSelf reopenClosedTab];
                         }],
   ]];
 
   // List the commands that only appear when there is at least a tab. When they
   // appear, they are in the HUD since they have titles.
   if (hasTabs) {
-    if ([consumer isFindInPageAvailable]) {
+    if ([self isFindInPageAvailable]) {
       [keyCommands addObjectsFromArray:@[
 
         [UIKeyCommand
@@ -149,20 +164,21 @@
                              title:l10n_util::GetNSStringWithFixup(
                                        IDS_IOS_TOOLS_MENU_FIND_IN_PAGE)
                             action:^{
-                              [weakDispatcher openFindInPage];
+                              [weakSelf.dispatcher openFindInPage];
                             }],
-        [UIKeyCommand cr_keyCommandWithInput:@"g"
-                               modifierFlags:UIKeyModifierCommand
-                                       title:nil
-                                      action:^{
-                                        [weakDispatcher findNextStringInPage];
-                                      }],
+        [UIKeyCommand
+            cr_keyCommandWithInput:@"g"
+                     modifierFlags:UIKeyModifierCommand
+                             title:nil
+                            action:^{
+                              [weakSelf.dispatcher findNextStringInPage];
+                            }],
         [UIKeyCommand
             cr_keyCommandWithInput:@"g"
                      modifierFlags:UIKeyModifierCommand | UIKeyModifierShift
                              title:nil
                             action:^{
-                              [weakDispatcher findPreviousStringInPage];
+                              [weakSelf.dispatcher findPreviousStringInPage];
                             }]
       ]];
     }
@@ -173,7 +189,7 @@
                                      title:l10n_util::GetNSStringWithFixup(
                                                IDS_IOS_KEYBOARD_OPEN_LOCATION)
                                     action:^{
-                                      [weakOmniboxHandler focusOmnibox];
+                                      [weakSelf.omniboxHandler focusOmnibox];
                                     }],
       [UIKeyCommand cr_keyCommandWithInput:@"w"
                              modifierFlags:UIKeyModifierCommand
@@ -186,10 +202,10 @@
                                       // registered with the dispatcher anymore.
                                       // Check if it's still available. See
                                       // crbug.com/967637 for context.
-                                      if ([weakDispatcher
+                                      if ([weakSelf.dispatcher
                                               respondsToSelector:@selector
                                               (closeCurrentTab)]) {
-                                        [weakDispatcher closeCurrentTab];
+                                        [weakSelf.dispatcher closeCurrentTab];
                                       }
                                     }],
     ]];
@@ -236,14 +252,14 @@
                            title:l10n_util::GetNSStringWithFixup(
                                      IDS_IOS_KEYBOARD_BOOKMARK_THIS_PAGE)
                           action:^{
-                            [weakDispatcher bookmarkCurrentPage];
+                            [weakSelf.dispatcher bookmarkCurrentPage];
                           }],
       [UIKeyCommand cr_keyCommandWithInput:@"r"
                              modifierFlags:UIKeyModifierCommand
                                      title:l10n_util::GetNSStringWithFixup(
                                                IDS_IOS_ACCNAME_RELOAD)
                                     action:^{
-                                      navigationAgent->Reload();
+                                      weakSelf.navigationAgent->Reload();
                                     }],
     ]];
 
@@ -272,31 +288,31 @@
                                      title:l10n_util::GetNSStringWithFixup(
                                                IDS_HISTORY_SHOW_HISTORY)
                                     action:^{
-                                      [weakDispatcher showHistory];
+                                      [weakSelf.dispatcher showHistory];
                                     }],
       [UIKeyCommand
           cr_keyCommandWithInput:@"."
                    modifierFlags:UIKeyModifierCommand | UIKeyModifierShift
                            title:voiceSearchTitle
                           action:^{
-                            UIView* baseView = baseViewController.view;
+                            UIView* baseView = weakSelf.baseViewController.view;
                             [[NamedGuide guideWithName:kVoiceSearchButtonGuide
                                                   view:baseView]
                                 resetConstraints];
-                            [weakDispatcher startVoiceSearch];
+                            [weakSelf.dispatcher startVoiceSearch];
                           }],
     ]];
   }
 
   if (self.canDismissModals) {
     [keyCommands
-        addObject:[UIKeyCommand
-                      cr_keyCommandWithInput:UIKeyInputEscape
-                               modifierFlags:Cr_UIKeyModifierNone
-                                       title:nil
-                                      action:^{
-                                        [weakDispatcher dismissModalDialogs];
-                                      }]];
+        addObject:[UIKeyCommand cr_keyCommandWithInput:UIKeyInputEscape
+                                         modifierFlags:Cr_UIKeyModifierNone
+                                                 title:nil
+                                                action:^{
+                                                  [weakSelf.dispatcher
+                                                          dismissModalDialogs];
+                                                }]];
   }
 
   // List the commands that don't appear in the HUD but are always present.
@@ -309,9 +325,9 @@
                            modifierFlags:UIKeyModifierCommand
                                    title:nil
                                   action:^{
-                                    [weakDispatcher
+                                    [weakSelf.dispatcher
                                         showSettingsFromViewController:
-                                            weakBaseViewController];
+                                            weakSelf.baseViewController];
                                   }],
   ]];
 
@@ -331,20 +347,20 @@
                              modifierFlags:UIKeyModifierCommand
                                      title:nil
                                     action:^{
-                                      navigationAgent->StopLoading();
+                                      weakSelf.navigationAgent->StopLoading();
                                     }],
       [UIKeyCommand cr_keyCommandWithInput:@"?"
                              modifierFlags:UIKeyModifierCommand
                                      title:nil
                                     action:^{
-                                      [weakDispatcher showHelpPage];
+                                      [weakSelf.dispatcher showHelpPage];
                                     }],
       [UIKeyCommand
           cr_keyCommandWithInput:@"l"
                    modifierFlags:UIKeyModifierCommand | UIKeyModifierAlternate
                            title:nil
                           action:^{
-                            [weakDispatcher showDownloadsFolder];
+                            [weakSelf.dispatcher showDownloadsFolder];
                           }],
       [UIKeyCommand cr_keyCommandWithInput:@"1"
                              modifierFlags:UIKeyModifierCommand
@@ -398,25 +414,108 @@
                              modifierFlags:UIKeyModifierCommand
                                      title:nil
                                     action:^{
-                                      focusTab([weakConsumer tabsCount] - 1);
+                                      focusTab([weakSelf tabsCount] - 1);
                                     }],
       [UIKeyCommand
           cr_keyCommandWithInput:@"\t"
                    modifierFlags:UIKeyModifierControl | UIKeyModifierShift
                            title:nil
                           action:^{
-                            [weakConsumer focusPreviousTab];
+                            [weakSelf focusPreviousTab];
                           }],
       [UIKeyCommand cr_keyCommandWithInput:@"\t"
                              modifierFlags:UIKeyModifierControl
                                      title:nil
                                     action:^{
-                                      [weakConsumer focusNextTab];
+                                      [weakSelf focusNextTab];
                                     }],
     ]];
   }
 
-  return keyCommands;
+  return [keyCommands copy];
+}
+
+#pragma mark - Private
+
+- (WebNavigationBrowserAgent*)navigationAgent {
+  return WebNavigationBrowserAgent::FromBrowser(self.browser);
+}
+
+- (BOOL)isFindInPageAvailable {
+  web::WebState* currentWebState =
+      self.browser->GetWebStateList()->GetActiveWebState();
+  if (!currentWebState) {
+    return NO;
+  }
+
+  FindTabHelper* helper = FindTabHelper::FromWebState(currentWebState);
+  return (helper && helper->CurrentPageSupportsFindInPage());
+}
+
+- (NSUInteger)tabsCount {
+  return self.browser->GetWebStateList()->count();
+}
+
+- (void)focusTabAtIndex:(NSUInteger)index {
+  WebStateList* webStateList = self.browser->GetWebStateList();
+  if (webStateList->ContainsIndex(index)) {
+    webStateList->ActivateWebStateAt(static_cast<int>(index));
+  }
+}
+
+- (void)focusNextTab {
+  WebStateList* webStateList = self.browser->GetWebStateList();
+  if (!webStateList)
+    return;
+
+  int activeIndex = webStateList->active_index();
+  if (activeIndex == WebStateList::kInvalidIndex)
+    return;
+
+  // If the active index isn't the last index, activate the next index.
+  // (the last index is always `count() - 1`).
+  // Otherwise activate the first index.
+  if (activeIndex < (webStateList->count() - 1)) {
+    webStateList->ActivateWebStateAt(activeIndex + 1);
+  } else {
+    webStateList->ActivateWebStateAt(0);
+  }
+}
+
+- (void)focusPreviousTab {
+  WebStateList* webStateList = self.browser->GetWebStateList();
+  if (!webStateList)
+    return;
+
+  int activeIndex = webStateList->active_index();
+  if (activeIndex == WebStateList::kInvalidIndex)
+    return;
+
+  // If the active index isn't the first index, activate the prior index.
+  // Otherwise index the last index (`count() - 1`).
+  if (activeIndex > 0) {
+    webStateList->ActivateWebStateAt(activeIndex - 1);
+  } else {
+    webStateList->ActivateWebStateAt(webStateList->count() - 1);
+  }
+}
+
+- (void)reopenClosedTab {
+  ChromeBrowserState* browserState = self.browser->GetBrowserState();
+  sessions::TabRestoreService* const tabRestoreService =
+      IOSChromeTabRestoreServiceFactory::GetForBrowserState(browserState);
+  if (!tabRestoreService || tabRestoreService->entries().empty())
+    return;
+
+  const std::unique_ptr<sessions::TabRestoreService::Entry>& entry =
+      tabRestoreService->entries().front();
+  // Only handle the TAB type.
+  // TODO(crbug.com/1056596) : Support WINDOW restoration under multi-window.
+  if (entry->type != sessions::TabRestoreService::TAB)
+    return;
+
+  [self.dispatcher openURLInNewTab:[OpenNewTabCommand command]];
+  RestoreTab(entry->id, WindowOpenDisposition::CURRENT_TAB, self.browser);
 }
 
 @end
diff --git a/ios/chrome/browser/ui/browser_view/key_commands_provider_unittest.mm b/ios/chrome/browser/ui/browser_view/key_commands_provider_unittest.mm
index 6e99ca1..52d33590 100644
--- a/ios/chrome/browser/ui/browser_view/key_commands_provider_unittest.mm
+++ b/ios/chrome/browser/ui/browser_view/key_commands_provider_unittest.mm
@@ -4,10 +4,19 @@
 
 #import "ios/chrome/browser/ui/browser_view/key_commands_provider.h"
 
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-#include "third_party/ocmock/OCMock/OCMock.h"
-#include "third_party/ocmock/gtest_support.h"
+#import "base/test/task_environment.h"
+#import "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
+#import "ios/chrome/browser/find_in_page/find_tab_helper.h"
+#import "ios/chrome/browser/main/test_browser.h"
+#import "ios/chrome/browser/ui/keyboard/UIKeyCommand+Chrome.h"
+#import "ios/chrome/browser/web_state_list/web_state_list.h"
+#import "ios/chrome/browser/web_state_list/web_state_opener.h"
+#import "ios/web/find_in_page/find_in_page_manager_impl.h"
+#import "ios/web/public/test/fakes/fake_web_state.h"
+#import "testing/gtest/include/gtest/gtest.h"
+#import "testing/platform_test.h"
+#import "third_party/ocmock/OCMock/OCMock.h"
+#import "third_party/ocmock/gtest_support.h"
 #import "third_party/ocmock/ocmock_extensions.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -16,144 +25,190 @@
 
 namespace {
 
-typedef PlatformTest KeyCommandsProviderTest;
+class KeyCommandsProviderTest : public PlatformTest {
+ protected:
+  KeyCommandsProviderTest() {
+    browser_state_ = TestChromeBrowserState::Builder().Build();
+    browser_ = std::make_unique<TestBrowser>(browser_state_.get());
+    web_state_list_ = browser_->GetWebStateList();
+  }
+  ~KeyCommandsProviderTest() override {}
 
-using KeyCommandsProviderTest = PlatformTest;
+  web::FakeWebState* InsertNewWebState(int index) {
+    auto web_state = std::make_unique<web::FakeWebState>();
+    web_state->SetBrowserState(browser_state_.get());
+    int insertedIndex = web_state_list_->InsertWebState(
+        index, std::move(web_state), WebStateList::INSERT_ACTIVATE,
+        WebStateOpener());
+    return static_cast<web::FakeWebState*>(
+        web_state_list_->GetWebStateAt(insertedIndex));
+  }
+
+  base::test::TaskEnvironment task_environment_;
+  std::unique_ptr<TestChromeBrowserState> browser_state_;
+  std::unique_ptr<TestBrowser> browser_;
+  WebStateList* web_state_list_;
+};
 
 TEST_F(KeyCommandsProviderTest, NoTabs_EditingText_ReturnsObjects) {
-  KeyCommandsProvider* provider = [[KeyCommandsProvider alloc] init];
-  id mockConsumer =
-      [OCMockObject mockForProtocol:@protocol(KeyCommandsPlumbing)];
   id<ApplicationCommands, BrowserCommands, BrowserCoordinatorCommands,
      FindInPageCommands>
       dispatcher = nil;
-  [[[mockConsumer expect] andReturnUnsignedInteger:0] tabsCount];
 
-  EXPECT_NE(nil, [provider keyCommandsForConsumer:mockConsumer
-                               baseViewController:nil
-                                       dispatcher:dispatcher
-                                  navigationAgent:nullptr
-                                   omniboxHandler:nil
-                                      editingText:YES]);
+  KeyCommandsProvider* provider =
+      [[KeyCommandsProvider alloc] initWithBrowser:browser_.get()];
+  provider.dispatcher = dispatcher;
+
+  // No tabs.
+  EXPECT_EQ(web_state_list_->count(), 0);
+
+  EXPECT_NE(nil, [provider keyCommandsWithEditingText:YES]);
 }
 
 TEST_F(KeyCommandsProviderTest, ReturnsKeyCommandsObjects) {
-  KeyCommandsProvider* provider = [[KeyCommandsProvider alloc] init];
-  id mockConsumer =
-      [OCMockObject mockForProtocol:@protocol(KeyCommandsPlumbing)];
   id<ApplicationCommands, BrowserCommands, BrowserCoordinatorCommands,
      FindInPageCommands>
       dispatcher = nil;
 
-  [[[mockConsumer expect] andReturnUnsignedInteger:0] tabsCount];
+  KeyCommandsProvider* provider =
+      [[KeyCommandsProvider alloc] initWithBrowser:browser_.get()];
+  provider.dispatcher = dispatcher;
 
-  for (id element in [provider keyCommandsForConsumer:mockConsumer
-                                   baseViewController:nil
-                                           dispatcher:dispatcher
-                                      navigationAgent:nullptr
-                                       omniboxHandler:nil
-                                          editingText:YES]) {
+  // No tabs.
+  EXPECT_EQ(web_state_list_->count(), 0);
+
+  for (id element in [provider keyCommandsWithEditingText:YES]) {
     EXPECT_TRUE([element isKindOfClass:[UIKeyCommand class]]);
   }
 }
 
 TEST_F(KeyCommandsProviderTest, MoreKeyboardCommandsWhenTabs) {
-  KeyCommandsProvider* provider = [[KeyCommandsProvider alloc] init];
-  id mockConsumer =
-      [OCMockObject mockForProtocol:@protocol(KeyCommandsPlumbing)];
   id<ApplicationCommands, BrowserCommands, BrowserCoordinatorCommands,
      FindInPageCommands>
       dispatcher = nil;
 
+  KeyCommandsProvider* provider =
+      [[KeyCommandsProvider alloc] initWithBrowser:browser_.get()];
+  provider.dispatcher = dispatcher;
+
   // No tabs.
-  [[[mockConsumer expect] andReturnUnsignedInteger:0] tabsCount];
+  EXPECT_EQ(web_state_list_->count(), 0);
+
   NSUInteger numberOfKeyCommandsWithoutTabs =
-      [[provider keyCommandsForConsumer:mockConsumer
-                     baseViewController:nil
-                             dispatcher:dispatcher
-                        navigationAgent:nullptr
-                         omniboxHandler:nil
-                            editingText:NO] count];
+      [[provider keyCommandsWithEditingText:NO] count];
+
+  InsertNewWebState(0);
 
   // Tabs.
-  [[[mockConsumer expect] andReturnUnsignedInteger:1] tabsCount];
-  [[[mockConsumer expect] andReturnBool:YES] isFindInPageAvailable];
+  EXPECT_EQ(web_state_list_->count(), 1);
   NSUInteger numberOfKeyCommandsWithTabs =
-      [[provider keyCommandsForConsumer:mockConsumer
-                     baseViewController:nil
-                             dispatcher:dispatcher
-                        navigationAgent:nullptr
-                         omniboxHandler:nil
-                            editingText:NO] count];
+      [[provider keyCommandsWithEditingText:NO] count];
 
   EXPECT_GT(numberOfKeyCommandsWithTabs, numberOfKeyCommandsWithoutTabs);
 }
 
 TEST_F(KeyCommandsProviderTest, LessKeyCommandsWhenTabsAndEditingText) {
-  KeyCommandsProvider* provider = [[KeyCommandsProvider alloc] init];
-  id mockConsumer =
-      [OCMockObject mockForProtocol:@protocol(KeyCommandsPlumbing)];
   id<ApplicationCommands, BrowserCommands, BrowserCoordinatorCommands,
      FindInPageCommands>
       dispatcher = nil;
 
+  KeyCommandsProvider* provider =
+      [[KeyCommandsProvider alloc] initWithBrowser:browser_.get()];
+  provider.dispatcher = dispatcher;
+
+  // No tabs.
+  EXPECT_EQ(web_state_list_->count(), 0);
+
+  InsertNewWebState(0);
+
+  // Tabs.
+  EXPECT_EQ(web_state_list_->count(), 1);
+
   // Not editing text.
-  [[[mockConsumer expect] andReturnUnsignedInteger:1] tabsCount];
-  [[[mockConsumer expect] andReturnBool:YES] isFindInPageAvailable];
   NSUInteger numberOfKeyCommandsWhenNotEditingText =
-      [[provider keyCommandsForConsumer:mockConsumer
-                     baseViewController:nil
-                             dispatcher:dispatcher
-                        navigationAgent:nullptr
-                         omniboxHandler:nil
-                            editingText:NO] count];
+      [[provider keyCommandsWithEditingText:NO] count];
 
   // Editing text.
-  [[[mockConsumer expect] andReturnUnsignedInteger:1] tabsCount];
-  [[[mockConsumer expect] andReturnBool:YES] isFindInPageAvailable];
   NSUInteger numberOfKeyCommandsWhenEditingText =
-      [[provider keyCommandsForConsumer:mockConsumer
-                     baseViewController:nil
-                             dispatcher:dispatcher
-                        navigationAgent:nullptr
-                         omniboxHandler:nil
-                            editingText:YES] count];
+      [[provider keyCommandsWithEditingText:YES] count];
 
   EXPECT_LT(numberOfKeyCommandsWhenEditingText,
             numberOfKeyCommandsWhenNotEditingText);
 }
 
 TEST_F(KeyCommandsProviderTest, MoreKeyboardCommandsWhenFindInPageAvailable) {
-  KeyCommandsProvider* provider = [[KeyCommandsProvider alloc] init];
-  id mockConsumer =
-      [OCMockObject mockForProtocol:@protocol(KeyCommandsPlumbing)];
   id<ApplicationCommands, BrowserCommands, BrowserCoordinatorCommands,
      FindInPageCommands>
       dispatcher = nil;
 
-  // No Find in Page.
-  [[[mockConsumer expect] andReturnUnsignedInteger:1] tabsCount];
-  [[[mockConsumer expect] andReturnBool:NO] isFindInPageAvailable];
-  NSUInteger numberOfKeyCommandsWithoutFIP =
-      [[provider keyCommandsForConsumer:mockConsumer
-                     baseViewController:nil
-                             dispatcher:dispatcher
-                        navigationAgent:nullptr
-                         omniboxHandler:nil
-                            editingText:NO] count];
+  KeyCommandsProvider* provider =
+      [[KeyCommandsProvider alloc] initWithBrowser:browser_.get()];
+  provider.dispatcher = dispatcher;
+
+  // No tabs.
+  EXPECT_EQ(web_state_list_->count(), 0);
+
+  web::FakeWebState* web_state = InsertNewWebState(0);
+  web::FindInPageManagerImpl::CreateForWebState(web_state);
+  FindTabHelper::CreateForWebState(web_state);
 
   // Tabs.
-  [[[mockConsumer expect] andReturnUnsignedInteger:1] tabsCount];
-  [[[mockConsumer expect] andReturnBool:YES] isFindInPageAvailable];
+  EXPECT_EQ(web_state_list_->count(), 1);
+
+  // No Find in Page.
+  web_state->SetContentIsHTML(false);
+  NSUInteger numberOfKeyCommandsWithoutFIP =
+      [[provider keyCommandsWithEditingText:NO] count];
+
+  // Can Find in Page.
+  web_state->SetContentIsHTML(true);
   NSUInteger numberOfKeyCommandsWithFIP =
-      [[provider keyCommandsForConsumer:mockConsumer
-                     baseViewController:nil
-                             dispatcher:dispatcher
-                        navigationAgent:nullptr
-                         omniboxHandler:nil
-                            editingText:NO] count];
+      [[provider keyCommandsWithEditingText:NO] count];
 
   EXPECT_GT(numberOfKeyCommandsWithFIP, numberOfKeyCommandsWithoutFIP);
 }
 
+//// Verifies the the next/previous tab commands from the keyboard work OK.
+TEST_F(KeyCommandsProviderTest, TestFocusNextPrevious) {
+  // Add more web states.
+  InsertNewWebState(0);
+  InsertNewWebState(1);
+  InsertNewWebState(2);
+
+  // This test assumes there are exactly three web states in the list.
+  ASSERT_EQ(web_state_list_->count(), 3);
+
+  KeyCommandsProvider* provider =
+      [[KeyCommandsProvider alloc] initWithBrowser:browser_.get()];
+
+  UIKeyCommandAction focusNextTabAction;
+  UIKeyCommandAction focusPreviousTabAction;
+
+  NSArray<UIKeyCommand*>* commands = [provider keyCommandsWithEditingText:NO];
+  for (UIKeyCommand* command in commands) {
+    if (([command.input isEqualToString:@"\t"]) &&
+        (command.modifierFlags & UIKeyModifierControl)) {
+      if (command.modifierFlags & UIKeyModifierShift) {
+        focusPreviousTabAction = command.cr_action;
+      } else {
+        focusNextTabAction = command.cr_action;
+      }
+    }
+  }
+  focusNextTabAction();
+  EXPECT_EQ(web_state_list_->active_index(), 0);
+  focusNextTabAction();
+  EXPECT_EQ(web_state_list_->active_index(), 1);
+  focusNextTabAction();
+  EXPECT_EQ(web_state_list_->active_index(), 2);
+  focusNextTabAction();
+  EXPECT_EQ(web_state_list_->active_index(), 0);
+  focusPreviousTabAction();
+  EXPECT_EQ(web_state_list_->active_index(), 2);
+  focusPreviousTabAction();
+  EXPECT_EQ(web_state_list_->active_index(), 1);
+  focusPreviousTabAction();
+  EXPECT_EQ(web_state_list_->active_index(), 0);
+}
+
 }  // namespace
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index 5eb016f..715a404 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -385,6 +385,13 @@
 const base::FeatureParam<double>
     kChromeWideEchoCancellationDynamicMixingTimeout{
         &kChromeWideEchoCancellation, "mixing_buffer_duration_percent", -1.0};
+
+// Allows all sample rates to be used for audio processing. If disabled, only
+// sample rates divisible by 100 are allowed; a request for a media stream with
+// enabled audio processing will fail otherwise. For context see
+// https://crbug.com/1332484.
+const base::FeatureParam<bool> kChromeWideEchoCancellationAllowAllSampleRates{
+    &kChromeWideEchoCancellation, "allow_all_sample_rates", true};
 #endif
 
 // Make MSE garbage collection algorithm more aggressive when we are under
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index 0f87c18d..8947112 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -131,6 +131,8 @@
     kChromeWideEchoCancellationMinimizeResampling;
 MEDIA_EXPORT extern const base::FeatureParam<double>
     kChromeWideEchoCancellationDynamicMixingTimeout;
+MEDIA_EXPORT extern const base::FeatureParam<bool>
+    kChromeWideEchoCancellationAllowAllSampleRates;
 #endif
 MEDIA_EXPORT extern const base::Feature kD3D11VideoDecoderUseSharedHandle;
 MEDIA_EXPORT extern const base::Feature kEnableTabMuting;
diff --git a/media/gpu/android/codec_wrapper.cc b/media/gpu/android/codec_wrapper.cc
index 62744a4c..85ffc4c 100644
--- a/media/gpu/android/codec_wrapper.cc
+++ b/media/gpu/android/codec_wrapper.cc
@@ -11,6 +11,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/debug/crash_logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "media/base/android/media_codec_util.h"
@@ -441,6 +442,14 @@
   }
 
   base::AutoLock l(lock_);
+
+  // Adding a scoped crash key here to detect the cause of gpu hang.
+  // crbug.com/1292936.
+  static auto* kCrashKey_1 = base::debug::AllocateCrashKeyString(
+      "acquired_lock_inside_codecwrapperimpl_releasecodecoutputbuffer",
+      base::debug::CrashKeySize::Size256);
+  base::debug::ScopedCrashKeyString scoped_crash_key_1(kCrashKey_1, "1");
+
   if (!codec_ || state_ == State::kError)
     return false;
 
@@ -452,7 +461,17 @@
     return false;
 
   int index = buffer_it->second;
-  codec_->ReleaseOutputBuffer(index, render);
+
+  {
+    // Adding another scoped crash key here to detect the cause of gpu hang.
+    // crbug.com/1292936.
+    static auto* kCrashKey_2 = base::debug::AllocateCrashKeyString(
+        "executing_mediacodec_releaseoutputbuffer",
+        base::debug::CrashKeySize::Size256);
+    base::debug::ScopedCrashKeyString scoped_crash_key_2(kCrashKey_2, "1");
+    codec_->ReleaseOutputBuffer(index, render);
+  }
+
   buffer_ids_.erase(buffer_it);
   if (output_buffer_release_cb_) {
     output_buffer_release_cb_.Run(state_ == State::kDrained ||
diff --git a/media/gpu/test/video_player/video_decoder_client.cc b/media/gpu/test/video_player/video_decoder_client.cc
index cc442ad..5a051ee9 100644
--- a/media/gpu/test/video_player/video_decoder_client.cc
+++ b/media/gpu/test/video_player/video_decoder_client.cc
@@ -380,12 +380,25 @@
   num_outstanding_decode_requests_--;
 
   // Queue the next fragment to be decoded.
-  decoder_client_thread_.task_runner()->PostTask(
+  // TODO(mcasas): Introduce a minor delay here to avoid overrunning the driver;
+  // this is a provision for Mediatek devices and for the erroneous behaviour
+  // of feeding more encoded chunk here (the driver has likely not seen any
+  // encoded chunk enqueued at this point) and not in FrameReadyTask as it
+  // should (naively moving this task there doesn't work because it prevents the
+  // V4L2VideoDecoder backend from polling the device driver).
+  decoder_client_thread_.task_runner()->PostDelayedTask(
       FROM_HERE,
-      base::BindOnce(&VideoDecoderClient::DecodeNextFragmentTask, weak_this_));
+      base::BindOnce(&VideoDecoderClient::DecodeNextFragmentTask, weak_this_),
+#if BUILDFLAG(USE_V4L2_CODEC)
+      base::Milliseconds(1)
+#else
+      base::Milliseconds(0)
+#endif
+  );
 }
 
 void VideoDecoderClient::FrameReadyTask(scoped_refptr<VideoFrame> video_frame) {
+  DVLOGF(4) << current_frame_index_;
   DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_);
   DCHECK(video_frame->metadata().power_efficient);
 
diff --git a/media/gpu/test/video_player/video_decoder_client.h b/media/gpu/test/video_player/video_decoder_client.h
index f3d8eee..16b6246 100644
--- a/media/gpu/test/video_player/video_decoder_client.h
+++ b/media/gpu/test/video_player/video_decoder_client.h
@@ -164,9 +164,10 @@
   // Decoder client state, should only be accessed on the decoder client thread.
   VideoDecoderClientState decoder_client_state_;
 
-  // Index of the frame that's currently being decoded.
+  // Decoded video frame index.
   size_t current_frame_index_ = 0;
-  // The current number of outgoing bitstream buffers decode requests.
+  // The current number of decode requests in |decoder_|, for DCHECK purposes.
+  // Increased in DecodeNextFragmentTask() and decreased in DecodeDoneTask().
   size_t num_outstanding_decode_requests_ = 0;
 
   // TODO(dstaessens@) Replace with StreamParser.
diff --git a/media/gpu/test/video_player/video_player.cc b/media/gpu/test/video_player/video_player.cc
index 044456864..f7fd9dc0 100644
--- a/media/gpu/test/video_player/video_player.cc
+++ b/media/gpu/test/video_player/video_player.cc
@@ -102,7 +102,6 @@
   if (!WaitForEvent(VideoPlayerEvent::kInitialized))
     return false;
 
-  video_ = video;
   video_player_state_ = VideoPlayerState::kIdle;
   return true;
 }
@@ -119,7 +118,6 @@
 void VideoPlayer::PlayUntil(VideoPlayerEvent event, size_t event_count) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK_EQ(video_player_state_, VideoPlayerState::kIdle);
-  DCHECK(video_);
   DVLOGF(4);
 
   // Start decoding the video.
@@ -142,23 +140,6 @@
   decoder_client_->Flush();
 }
 
-base::TimeDelta VideoPlayer::GetCurrentTime() const {
-  NOTIMPLEMENTED();
-  return base::TimeDelta();
-}
-
-size_t VideoPlayer::GetCurrentFrame() const {
-  NOTIMPLEMENTED();
-  return 0;
-}
-
-VideoPlayerState VideoPlayer::GetState() const {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  base::AutoLock auto_lock(event_lock_);
-  return video_player_state_;
-}
-
 bool VideoPlayer::WaitForEvent(VideoPlayerEvent event, size_t times) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK_GE(times, 1u);
diff --git a/media/gpu/test/video_player/video_player.h b/media/gpu/test/video_player/video_player.h
index d16b05ee..0703eff 100644
--- a/media/gpu/test/video_player/video_player.h
+++ b/media/gpu/test/video_player/video_player.h
@@ -92,13 +92,6 @@
   // Flush the decoder.
   void Flush();
 
-  // Get current media time.
-  base::TimeDelta GetCurrentTime() const;
-  // Get the current frame number.
-  size_t GetCurrentFrame() const;
-  // Get the current state of the video player.
-  VideoPlayerState GetState() const;
-
   // Wait for an event to occur the specified number of times. All events that
   // occurred since last calling this function will be taken into account. All
   // events with different types will be consumed. Will return false if the
@@ -132,7 +125,6 @@
   // whether the decoder client should continue decoding frames.
   bool NotifyEvent(VideoPlayerEvent event);
 
-  raw_ptr<const Video> video_ = nullptr;
   VideoPlayerState video_player_state_ = VideoPlayerState::kUninitialized;
   std::unique_ptr<VideoDecoderClient> decoder_client_;
 
diff --git a/media/mojo/mojom/remoting_common.mojom b/media/mojo/mojom/remoting_common.mojom
index 6031ebc0..8be37e8 100644
--- a/media/mojo/mojom/remoting_common.mojom
+++ b/media/mojo/mojom/remoting_common.mojom
@@ -15,11 +15,13 @@
   USER_DISABLED,  // Media Remoting was disabled by user.
 };
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
 enum RemotingStartFailReason {
-  CANNOT_START_MULTIPLE,  // Remoting was already active.
-  ROUTE_TERMINATED,  // User-initated disconnect while starting remoting.
-  INVALID_ANSWER_MESSAGE,  // Invalid ANSWER message.
-  REMOTING_NOT_PERMITTED,  // Remoter does not have dialog permission.
+  CANNOT_START_MULTIPLE = 0,  // Remoting was already active.
+  ROUTE_TERMINATED = 1,  // User-initated disconnect while starting remoting.
+  INVALID_ANSWER_MESSAGE = 2,  // Invalid ANSWER message.
+  REMOTING_NOT_PERMITTED = 3,  // Remoter does not have dialog permission.
 };
 
 enum RemotingSinkFeature {
diff --git a/media/remoting/metrics.cc b/media/remoting/metrics.cc
index 164674c1..784da9fb 100644
--- a/media/remoting/metrics.cc
+++ b/media/remoting/metrics.cc
@@ -64,6 +64,11 @@
   RecordTrackConfiguration();
 }
 
+void SessionMetricsRecorder::StartSessionFailed(
+    mojom::RemotingStartFailReason reason) {
+  UMA_HISTOGRAM_ENUMERATION("Media.Remoting.SessionStartFailReason", reason);
+}
+
 void SessionMetricsRecorder::WillStopSession(StopTrigger trigger) {
   if (!start_trigger_)
     return;
diff --git a/media/remoting/metrics.h b/media/remoting/metrics.h
index fbeaf82..343904a 100644
--- a/media/remoting/metrics.h
+++ b/media/remoting/metrics.h
@@ -7,6 +7,7 @@
 
 #include "base/time/time.h"
 #include "media/base/pipeline_metadata.h"
+#include "media/mojo/mojom/remoting_common.mojom.h"
 #include "media/remoting/triggers.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/size.h"
@@ -62,6 +63,7 @@
   // session ends.
   void WillStartSession(StartTrigger trigger);
   void DidStartSession();
+  void StartSessionFailed(mojom::RemotingStartFailReason reason);
   void WillStopSession(StopTrigger trigger);
 
   // These may be called before, during, or after a remoting session.
diff --git a/media/remoting/renderer_controller.cc b/media/remoting/renderer_controller.cc
index 002f8aa..2f72a512 100644
--- a/media/remoting/renderer_controller.cc
+++ b/media/remoting/renderer_controller.cc
@@ -164,6 +164,7 @@
   VLOG(1) << "Failed to start remoting:" << reason;
   if (remote_rendering_started_) {
     metrics_recorder_.WillStopSession(START_RACE);
+    metrics_recorder_.StartSessionFailed(reason);
     remote_rendering_started_ = false;
   }
 }
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins
index 5a0f852..d1dcaab4 100644
--- a/net/http/transport_security_state_static.pins
+++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@
 #   hash function for preloaded entries again (we have already done so once).
 #
 
-# Last updated: 2022-06-30 12:53 UTC
+# Last updated: 2022-07-07 12:54 UTC
 PinsListTimestamp
-1656593634
+1657198484
 
 TestSPKI
 sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/remoting/base/service_urls.cc b/remoting/base/service_urls.cc
index b4af901..2462b2e 100644
--- a/remoting/base/service_urls.cc
+++ b/remoting/base/service_urls.cc
@@ -6,7 +6,7 @@
 
 #include "base/check.h"
 #include "base/command_line.h"
-#include "google_apis/google_api_keys.h"
+#include "base/logging.h"
 
 // Configurable service data.
 // Debug builds should default to the autopush environment (can be configured
@@ -41,10 +41,14 @@
     if (command_line->HasSwitch(kFtlServerEndpointSwitch)) {
       ftl_server_endpoint_ =
           command_line->GetSwitchValueASCII(kFtlServerEndpointSwitch);
+    } else {
+      LOG(WARNING) << "CRD: Using autopush (non prod) FTL server";
     }
     if (command_line->HasSwitch(kRemotingServerEndpointSwitch)) {
       remoting_server_endpoint_ =
           command_line->GetSwitchValueASCII(kRemotingServerEndpointSwitch);
+    } else {
+      LOG(WARNING) << "CRD: Using autopush (non prod) remoting server";
     }
   }
 #endif  // !defined(NDEBUG)
diff --git a/remoting/host/policy_watcher_unittest.cc b/remoting/host/policy_watcher_unittest.cc
index 10d3a342..968da96 100644
--- a/remoting/host/policy_watcher_unittest.cc
+++ b/remoting/host/policy_watcher_unittest.cc
@@ -177,10 +177,13 @@
     third_party_auth_cert_empty_.MergeDictionary(&third_party_auth_partial_);
     third_party_auth_cert_empty_.SetStringKey(
         key::kRemoteAccessHostTokenValidationCertificateIssuer, "");
+
+#if BUILDFLAG(IS_WIN)
     remote_assistance_uiaccess_true_.SetBoolKey(
         key::kRemoteAccessHostAllowUiAccessForRemoteAssistance, true);
     remote_assistance_uiaccess_false_.SetBoolKey(
         key::kRemoteAccessHostAllowUiAccessForRemoteAssistance, false);
+#endif
 
     deprecated_policies_.SetStringKey(key::kRemoteAccessHostDomain,
                                       kHostDomain);
@@ -727,10 +730,6 @@
   expected_schema.erase(key::kRemoteAccessHostTokenUrl);
   expected_schema.erase(key::kRemoteAccessHostTokenValidationUrl);
   expected_schema.erase(key::kRemoteAccessHostTokenValidationCertificateIssuer);
-  expected_schema.erase(key::kRemoteAccessHostAllowUiAccessForRemoteAssistance);
-#elif !BUILDFLAG(IS_WIN)
-  // RemoteAssistanceHostAllowUiAccess does not exist on non-Windows platforms.
-  expected_schema.erase(key::kRemoteAccessHostAllowUiAccessForRemoteAssistance);
 #endif
 
   std::map<std::string, base::Value::Type> actual_schema;
diff --git a/remoting/proto/video_stats.proto b/remoting/proto/video_stats.proto
index 185afef8..125e8f3 100644
--- a/remoting/proto/video_stats.proto
+++ b/remoting/proto/video_stats.proto
@@ -11,7 +11,7 @@
 
 package remoting;
 
-// Next Id: 14
+// Next Id: 15
 message FrameStatsMessage {
   // Frame ID.
   optional uint32 frame_id = 1;
@@ -53,4 +53,8 @@
   // A simple indication of the quality of the frame, scored between 0 and 100,
   // with 100 representing a lossless encoded frame.
   optional uint32 frame_quality = 13;
+
+  // The screen ID of the desktop-capturer that captured this frame. The value
+  // matches the corresponding field of the VideoTrackLayout for the stream.
+  optional int64 screen_id = 14;
 }
diff --git a/remoting/protocol/frame_stats.cc b/remoting/protocol/frame_stats.cc
index 06b80e62..df995e3a 100644
--- a/remoting/protocol/frame_stats.cc
+++ b/remoting/protocol/frame_stats.cc
@@ -96,6 +96,9 @@
   if (message.has_frame_quality()) {
     result.frame_quality = message.frame_quality();
   }
+  if (message.has_screen_id()) {
+    result.screen_id = message.screen_id();
+  }
 
   return result;
 }
@@ -140,6 +143,9 @@
   if (frame_quality != -1) {
     message_out->set_frame_quality(frame_quality);
   }
+  if (screen_id != webrtc::kInvalidScreenId) {
+    message_out->set_screen_id(screen_id);
+  }
 }
 
 FrameStats::FrameStats() = default;
diff --git a/remoting/protocol/frame_stats.h b/remoting/protocol/frame_stats.h
index fbd83ea..6e33cfa 100644
--- a/remoting/protocol/frame_stats.h
+++ b/remoting/protocol/frame_stats.h
@@ -44,6 +44,7 @@
   int bandwidth_estimate_kbps = -1;
   uint32_t capturer_id = webrtc::DesktopCapturerId::kUnknown;
   int frame_quality = -1;
+  webrtc::ScreenId screen_id = webrtc::kInvalidScreenId;
 };
 
 struct ClientFrameStats {
diff --git a/remoting/protocol/webrtc_video_stream.cc b/remoting/protocol/webrtc_video_stream.cc
index e7ae6df..b960107 100644
--- a/remoting/protocol/webrtc_video_stream.cc
+++ b/remoting/protocol/webrtc_video_stream.cc
@@ -38,6 +38,7 @@
   base::TimeDelta capture_delay;
 
   uint32_t capturer_id = 0;
+  webrtc::ScreenId screen_id = webrtc::kInvalidScreenId;
 };
 
 WebrtcVideoStream::WebrtcVideoStream(const std::string& stream_name,
@@ -96,6 +97,7 @@
 }
 
 void WebrtcVideoStream::SelectSource(webrtc::ScreenId id) {
+  screen_id_ = id;
   capturer_->SelectSource(id);
 }
 
@@ -176,6 +178,7 @@
   current_frame_stats_->capture_started_time = base::TimeTicks::Now();
   current_frame_stats_->input_event_timestamps =
       event_timestamps_source_->TakeLastEventTimestamps();
+  current_frame_stats_->screen_id = screen_id_;
 
   capturer_->CaptureFrame();
 }
@@ -252,6 +255,8 @@
     // interface, and move this logic to the encoders.
     stats.frame_quality = (63 - frame.quantizer) * 100 / 63;
 
+    stats.screen_id = current_frame_stats->screen_id;
+
     video_stats_dispatcher_->OnVideoFrameStats(result.frame_id, stats);
   }
 }
diff --git a/remoting/protocol/webrtc_video_stream.h b/remoting/protocol/webrtc_video_stream.h
index bfb31d04..e8b99131 100644
--- a/remoting/protocol/webrtc_video_stream.h
+++ b/remoting/protocol/webrtc_video_stream.h
@@ -87,6 +87,9 @@
   // Called by |video_track_source_|.
   void OnSinkAddedOrUpdated(const rtc::VideoSinkWants& wants);
 
+  // Screen ID of the monitor being captured, from SelectSource().
+  webrtc::ScreenId screen_id_ = webrtc::kInvalidScreenId;
+
   // Label of the associated WebRTC video-stream.
   std::string stream_name_;
 
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 0913cf3..2996d506 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -5688,21 +5688,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5165.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "dimension_sets": [
@@ -5715,7 +5715,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       },
       {
         "isolate_profile_data": true,
@@ -5853,21 +5853,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5165.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "dimension_sets": [
@@ -5879,7 +5879,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       },
       {
         "args": [
@@ -5999,21 +5999,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5165.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "dimension_sets": [
@@ -6025,7 +6025,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       },
       {
         "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.dev.json b/testing/buildbot/chromium.dev.json
index 4aa7be59..3998d52 100644
--- a/testing/buildbot/chromium.dev.json
+++ b/testing/buildbot/chromium.dev.json
@@ -302,7 +302,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com"
@@ -320,7 +320,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com"
@@ -338,7 +338,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com"
@@ -356,7 +356,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com"
@@ -374,7 +374,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com"
@@ -392,7 +392,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index dcc5234c..9ea56908 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -25744,7 +25744,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -25798,7 +25798,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -25852,7 +25852,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -25907,7 +25907,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -25962,7 +25962,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26017,7 +26017,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26072,7 +26072,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26127,7 +26127,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26182,7 +26182,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26236,7 +26236,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26290,7 +26290,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26345,7 +26345,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26400,7 +26400,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26454,7 +26454,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26508,7 +26508,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26562,7 +26562,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26616,7 +26616,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26670,7 +26670,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26729,7 +26729,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26781,7 +26781,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26833,7 +26833,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26885,7 +26885,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26937,7 +26937,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -26989,7 +26989,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27041,7 +27041,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27093,7 +27093,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27145,7 +27145,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27197,7 +27197,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27249,7 +27249,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27301,7 +27301,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27353,7 +27353,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27405,7 +27405,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27457,7 +27457,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27509,7 +27509,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27561,7 +27561,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27613,7 +27613,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27666,7 +27666,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27719,7 +27719,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27772,7 +27772,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27825,7 +27825,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27879,7 +27879,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27933,7 +27933,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -27987,7 +27987,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28041,7 +28041,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28095,7 +28095,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28149,7 +28149,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28203,7 +28203,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28257,7 +28257,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28311,7 +28311,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28364,7 +28364,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28417,7 +28417,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28470,7 +28470,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28524,7 +28524,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28578,7 +28578,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28631,7 +28631,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28683,7 +28683,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28735,7 +28735,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28787,7 +28787,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28840,7 +28840,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28893,7 +28893,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28946,7 +28946,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -28998,7 +28998,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29050,7 +29050,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29103,7 +29103,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29156,7 +29156,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29209,7 +29209,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29262,7 +29262,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29314,7 +29314,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29366,7 +29366,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29418,7 +29418,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29470,7 +29470,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29522,7 +29522,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29575,7 +29575,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29628,7 +29628,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29681,7 +29681,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29733,7 +29733,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29785,7 +29785,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29837,7 +29837,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29889,7 +29889,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29941,7 +29941,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -29993,7 +29993,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30045,7 +30045,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30097,7 +30097,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30149,7 +30149,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30201,7 +30201,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30253,7 +30253,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30305,7 +30305,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30357,7 +30357,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30409,7 +30409,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30461,7 +30461,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30513,7 +30513,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30565,7 +30565,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30617,7 +30617,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30669,7 +30669,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30721,7 +30721,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30773,7 +30773,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30825,7 +30825,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30877,7 +30877,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30929,7 +30929,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -30985,7 +30985,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31044,7 +31044,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31096,7 +31096,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31148,7 +31148,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31200,7 +31200,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31252,7 +31252,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31304,7 +31304,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31356,7 +31356,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31408,7 +31408,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31460,7 +31460,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31512,7 +31512,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31564,7 +31564,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31616,7 +31616,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31668,7 +31668,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31720,7 +31720,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31772,7 +31772,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31824,7 +31824,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31876,7 +31876,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31928,7 +31928,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -31980,7 +31980,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32032,7 +32032,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32084,7 +32084,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32136,7 +32136,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32188,7 +32188,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32240,7 +32240,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32292,7 +32292,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32344,7 +32344,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32396,7 +32396,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32448,7 +32448,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32500,7 +32500,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32552,7 +32552,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32604,7 +32604,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32656,7 +32656,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32708,7 +32708,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32760,7 +32760,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32813,7 +32813,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32866,7 +32866,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32919,7 +32919,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -32972,7 +32972,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33025,7 +33025,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33078,7 +33078,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33131,7 +33131,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33185,7 +33185,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33239,7 +33239,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33293,7 +33293,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33347,7 +33347,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33401,7 +33401,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33455,7 +33455,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33509,7 +33509,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33563,7 +33563,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33617,7 +33617,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33671,7 +33671,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33725,7 +33725,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33779,7 +33779,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33833,7 +33833,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33887,7 +33887,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33941,7 +33941,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -33995,7 +33995,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34049,7 +34049,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34103,7 +34103,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34156,7 +34156,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34209,7 +34209,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34262,7 +34262,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34315,7 +34315,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34368,7 +34368,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34421,7 +34421,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34475,7 +34475,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34529,7 +34529,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34583,7 +34583,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34637,7 +34637,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34691,7 +34691,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34744,7 +34744,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34796,7 +34796,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34848,7 +34848,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34900,7 +34900,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -34952,7 +34952,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35004,7 +35004,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35056,7 +35056,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35108,7 +35108,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35161,7 +35161,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35214,7 +35214,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35267,7 +35267,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35320,7 +35320,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35373,7 +35373,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35426,7 +35426,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35478,7 +35478,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35530,7 +35530,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35582,7 +35582,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35635,7 +35635,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35688,7 +35688,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35740,7 +35740,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35793,7 +35793,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35846,7 +35846,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35899,7 +35899,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -35952,7 +35952,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36005,7 +36005,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36058,7 +36058,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36110,7 +36110,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36162,7 +36162,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36214,7 +36214,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36266,7 +36266,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36318,7 +36318,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36370,7 +36370,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36422,7 +36422,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36474,7 +36474,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36526,7 +36526,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36578,7 +36578,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36631,7 +36631,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36684,7 +36684,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36737,7 +36737,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36790,7 +36790,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36843,7 +36843,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36896,7 +36896,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -36948,7 +36948,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37000,7 +37000,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37052,7 +37052,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37104,7 +37104,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37156,7 +37156,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37208,7 +37208,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37260,7 +37260,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37312,7 +37312,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37364,7 +37364,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37416,7 +37416,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37468,7 +37468,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37520,7 +37520,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37572,7 +37572,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37624,7 +37624,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37676,7 +37676,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37728,7 +37728,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37780,7 +37780,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37832,7 +37832,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37884,7 +37884,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37936,7 +37936,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -37988,7 +37988,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38040,7 +38040,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38092,7 +38092,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38144,7 +38144,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38196,7 +38196,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38248,7 +38248,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38300,7 +38300,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38352,7 +38352,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38404,7 +38404,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38456,7 +38456,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38508,7 +38508,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38560,7 +38560,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38612,7 +38612,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38664,7 +38664,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38716,7 +38716,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38768,7 +38768,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38820,7 +38820,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38872,7 +38872,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38924,7 +38924,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -38976,7 +38976,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39028,7 +39028,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39080,7 +39080,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39132,7 +39132,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39184,7 +39184,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39236,7 +39236,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39288,7 +39288,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39340,7 +39340,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39392,7 +39392,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39451,7 +39451,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39506,7 +39506,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39561,7 +39561,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39616,7 +39616,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39671,7 +39671,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39726,7 +39726,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39781,7 +39781,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39836,7 +39836,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39891,7 +39891,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -39946,7 +39946,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40001,7 +40001,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40056,7 +40056,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40111,7 +40111,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40166,7 +40166,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40221,7 +40221,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40276,7 +40276,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40331,7 +40331,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40386,7 +40386,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40441,7 +40441,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40496,7 +40496,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40551,7 +40551,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40606,7 +40606,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40661,7 +40661,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40716,7 +40716,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40771,7 +40771,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40826,7 +40826,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40881,7 +40881,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40936,7 +40936,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -40991,7 +40991,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41046,7 +41046,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41101,7 +41101,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41156,7 +41156,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41211,7 +41211,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41266,7 +41266,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41322,7 +41322,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41378,7 +41378,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41434,7 +41434,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41490,7 +41490,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41546,7 +41546,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41602,7 +41602,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41658,7 +41658,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41715,7 +41715,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41772,7 +41772,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41829,7 +41829,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41886,7 +41886,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -41943,7 +41943,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42000,7 +42000,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42057,7 +42057,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42114,7 +42114,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42171,7 +42171,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42228,7 +42228,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42285,7 +42285,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42342,7 +42342,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42399,7 +42399,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42456,7 +42456,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42513,7 +42513,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42570,7 +42570,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42627,7 +42627,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42684,7 +42684,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42740,7 +42740,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42796,7 +42796,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42852,7 +42852,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42908,7 +42908,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -42964,7 +42964,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43020,7 +43020,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43077,7 +43077,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43134,7 +43134,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43191,7 +43191,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43248,7 +43248,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43305,7 +43305,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43361,7 +43361,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43416,7 +43416,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43471,7 +43471,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43526,7 +43526,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43581,7 +43581,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43636,7 +43636,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43691,7 +43691,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43746,7 +43746,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43802,7 +43802,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43858,7 +43858,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43914,7 +43914,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -43970,7 +43970,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44026,7 +44026,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44082,7 +44082,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44137,7 +44137,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44192,7 +44192,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44247,7 +44247,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44303,7 +44303,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44359,7 +44359,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44414,7 +44414,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44470,7 +44470,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44526,7 +44526,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44582,7 +44582,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44638,7 +44638,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44694,7 +44694,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44750,7 +44750,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44805,7 +44805,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44860,7 +44860,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44915,7 +44915,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -44970,7 +44970,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45025,7 +45025,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45080,7 +45080,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45135,7 +45135,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45190,7 +45190,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45245,7 +45245,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45300,7 +45300,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45356,7 +45356,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45412,7 +45412,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45468,7 +45468,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45524,7 +45524,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45580,7 +45580,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45636,7 +45636,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45691,7 +45691,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45746,7 +45746,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45801,7 +45801,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45856,7 +45856,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45911,7 +45911,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -45966,7 +45966,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46021,7 +46021,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46076,7 +46076,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46131,7 +46131,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46186,7 +46186,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46241,7 +46241,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46296,7 +46296,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46351,7 +46351,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46406,7 +46406,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46461,7 +46461,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46516,7 +46516,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46571,7 +46571,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46626,7 +46626,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46681,7 +46681,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46736,7 +46736,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46791,7 +46791,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46846,7 +46846,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46901,7 +46901,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -46956,7 +46956,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47011,7 +47011,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47066,7 +47066,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47121,7 +47121,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47176,7 +47176,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47231,7 +47231,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47286,7 +47286,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47341,7 +47341,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47396,7 +47396,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47451,7 +47451,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47506,7 +47506,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47561,7 +47561,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47616,7 +47616,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47671,7 +47671,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47726,7 +47726,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47781,7 +47781,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47836,7 +47836,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47891,7 +47891,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -47946,7 +47946,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48001,7 +48001,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48056,7 +48056,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48111,7 +48111,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48166,7 +48166,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48221,7 +48221,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48276,7 +48276,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48332,7 +48332,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48388,7 +48388,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48440,7 +48440,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48492,7 +48492,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48544,7 +48544,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48596,7 +48596,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48648,7 +48648,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48700,7 +48700,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48752,7 +48752,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48805,7 +48805,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48858,7 +48858,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48912,7 +48912,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -48966,7 +48966,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49020,7 +49020,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49073,7 +49073,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49126,7 +49126,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49179,7 +49179,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49231,7 +49231,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49283,7 +49283,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49336,7 +49336,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49389,7 +49389,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49441,7 +49441,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49493,7 +49493,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49546,7 +49546,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49598,7 +49598,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49650,7 +49650,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49702,7 +49702,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49754,7 +49754,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49806,7 +49806,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49858,7 +49858,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49910,7 +49910,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -49962,7 +49962,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50014,7 +50014,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50072,7 +50072,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50126,7 +50126,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50180,7 +50180,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50234,7 +50234,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50288,7 +50288,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50342,7 +50342,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50396,7 +50396,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50450,7 +50450,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50504,7 +50504,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50558,7 +50558,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50612,7 +50612,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50666,7 +50666,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50720,7 +50720,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50774,7 +50774,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50828,7 +50828,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50882,7 +50882,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50937,7 +50937,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -50992,7 +50992,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51047,7 +51047,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51103,7 +51103,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51159,7 +51159,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51215,7 +51215,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51271,7 +51271,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51327,7 +51327,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51383,7 +51383,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51438,7 +51438,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51493,7 +51493,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51549,7 +51549,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51604,7 +51604,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51658,7 +51658,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51713,7 +51713,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51768,7 +51768,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51822,7 +51822,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51876,7 +51876,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51930,7 +51930,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -51985,7 +51985,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52040,7 +52040,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52094,7 +52094,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52149,7 +52149,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52204,7 +52204,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52258,7 +52258,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52312,7 +52312,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52366,7 +52366,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52420,7 +52420,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52475,7 +52475,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52530,7 +52530,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52584,7 +52584,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52638,7 +52638,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52692,7 +52692,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52746,7 +52746,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52800,7 +52800,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52854,7 +52854,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52908,7 +52908,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -52962,7 +52962,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -53016,7 +53016,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -53070,7 +53070,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -53124,7 +53124,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -53178,7 +53178,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -53232,7 +53232,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -53286,7 +53286,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -53340,7 +53340,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -53394,7 +53394,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -53448,7 +53448,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -53502,7 +53502,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -92905,21 +92905,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5165.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -92927,7 +92927,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       },
       {
         "isolate_profile_data": true,
@@ -93040,28 +93040,28 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5165.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       },
       {
         "args": [
@@ -93161,28 +93161,28 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5165.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       },
       {
         "isolate_profile_data": true,
@@ -94520,20 +94520,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5165.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "dimension_sets": [
@@ -94547,7 +94547,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       },
       {
         "merge": {
@@ -94685,20 +94685,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5165.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "dimension_sets": [
@@ -94711,7 +94711,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       },
       {
         "args": [
@@ -94831,20 +94831,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5165.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "dimension_sets": [
@@ -94857,7 +94857,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       },
       {
         "merge": {
@@ -96353,20 +96353,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5165.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "dimension_sets": [
@@ -96380,7 +96380,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       },
       {
         "merge": {
@@ -96518,20 +96518,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5165.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "dimension_sets": [
@@ -96544,7 +96544,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       },
       {
         "args": [
@@ -96664,20 +96664,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5165.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "dimension_sets": [
@@ -96690,7 +96690,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       },
       {
         "merge": {
@@ -97425,20 +97425,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5165.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "dimension_sets": [
@@ -97451,7 +97451,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       }
     ]
   },
@@ -97664,7 +97664,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97683,7 +97683,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97705,7 +97705,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97725,7 +97725,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97744,7 +97744,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97763,7 +97763,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97782,7 +97782,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97801,7 +97801,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97820,7 +97820,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97840,7 +97840,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97859,7 +97859,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97878,7 +97878,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97900,7 +97900,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97919,7 +97919,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97938,7 +97938,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97957,7 +97957,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97976,7 +97976,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97995,7 +97995,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98014,7 +98014,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98033,7 +98033,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98055,7 +98055,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -98075,7 +98075,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98094,7 +98094,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98113,7 +98113,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98132,7 +98132,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98151,7 +98151,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98170,7 +98170,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98189,7 +98189,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98208,7 +98208,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98227,7 +98227,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98246,7 +98246,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98265,7 +98265,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98284,7 +98284,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98303,7 +98303,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98322,7 +98322,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98341,7 +98341,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98360,7 +98360,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98379,7 +98379,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98398,7 +98398,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98417,7 +98417,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98436,7 +98436,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98458,7 +98458,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -98478,7 +98478,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98497,7 +98497,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98516,7 +98516,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98535,7 +98535,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98554,7 +98554,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98573,7 +98573,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98592,7 +98592,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98611,7 +98611,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98630,7 +98630,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98649,7 +98649,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98668,7 +98668,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98687,7 +98687,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98706,7 +98706,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98725,7 +98725,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98744,7 +98744,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98763,7 +98763,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98782,7 +98782,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98801,7 +98801,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98820,7 +98820,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98839,7 +98839,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98858,7 +98858,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98877,7 +98877,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98896,7 +98896,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98915,7 +98915,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98934,7 +98934,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98953,7 +98953,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98975,7 +98975,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98994,7 +98994,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -99013,7 +99013,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -99032,7 +99032,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -99056,7 +99056,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -99075,7 +99075,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -99094,7 +99094,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -99113,7 +99113,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -99132,7 +99132,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -99152,7 +99152,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -99171,7 +99171,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -99197,7 +99197,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -99220,7 +99220,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -99242,7 +99242,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -99264,7 +99264,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -99286,7 +99286,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -99308,7 +99308,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -99338,7 +99338,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "idempotent": false,
@@ -99366,7 +99366,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "idempotent": false,
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index 476e7e99..59614a0 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -5409,7 +5409,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5428,7 +5428,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5450,7 +5450,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5470,7 +5470,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5489,7 +5489,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5508,7 +5508,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5527,7 +5527,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5546,7 +5546,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5565,7 +5565,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5585,7 +5585,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5604,7 +5604,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5623,7 +5623,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5643,7 +5643,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -5666,7 +5666,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5685,7 +5685,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5704,7 +5704,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5723,7 +5723,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5742,7 +5742,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5761,7 +5761,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5780,7 +5780,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5799,7 +5799,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5818,7 +5818,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "quickrun_shards": 10,
@@ -5839,7 +5839,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5858,7 +5858,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5877,7 +5877,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5896,7 +5896,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5915,7 +5915,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5934,7 +5934,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5953,7 +5953,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5972,7 +5972,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5991,7 +5991,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6010,7 +6010,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6029,7 +6029,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6048,7 +6048,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6067,7 +6067,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6086,7 +6086,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6105,7 +6105,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6124,7 +6124,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6143,7 +6143,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6162,7 +6162,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6181,7 +6181,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6200,7 +6200,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6219,7 +6219,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "quickrun_shards": 6,
@@ -6240,7 +6240,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6259,7 +6259,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6278,7 +6278,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6297,7 +6297,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6316,7 +6316,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6335,7 +6335,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6354,7 +6354,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6373,7 +6373,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6392,7 +6392,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6411,7 +6411,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6430,7 +6430,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6449,7 +6449,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6468,7 +6468,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6487,7 +6487,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6506,7 +6506,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6525,7 +6525,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6544,7 +6544,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6563,7 +6563,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6582,7 +6582,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6601,7 +6601,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6620,7 +6620,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6639,7 +6639,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6658,7 +6658,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6677,7 +6677,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6696,7 +6696,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6715,7 +6715,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -6735,7 +6735,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6754,7 +6754,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6773,7 +6773,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6797,7 +6797,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6816,7 +6816,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6835,7 +6835,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6854,7 +6854,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6873,7 +6873,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6893,7 +6893,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6912,7 +6912,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6938,7 +6938,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6974,7 +6974,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "quickrun_shards": 10,
@@ -7012,7 +7012,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "quickrun_shards": 16,
@@ -7041,7 +7041,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7061,7 +7061,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7086,7 +7086,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7110,7 +7110,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7134,7 +7134,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7157,7 +7157,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7177,7 +7177,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7200,7 +7200,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -7223,7 +7223,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "idempotent": false,
@@ -7251,7 +7251,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "idempotent": false,
@@ -7280,7 +7280,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "idempotent": false,
@@ -7307,7 +7307,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-11|Mac-10.16"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -11010,7 +11010,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11063,7 +11063,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11116,7 +11116,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11169,7 +11169,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11222,7 +11222,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11275,7 +11275,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11328,7 +11328,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11381,7 +11381,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11434,7 +11434,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11487,7 +11487,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11540,7 +11540,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11593,7 +11593,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11646,7 +11646,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11699,7 +11699,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11752,7 +11752,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11805,7 +11805,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11858,7 +11858,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11911,7 +11911,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -11964,7 +11964,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12017,7 +12017,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12070,7 +12070,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12123,7 +12123,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12176,7 +12176,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12229,7 +12229,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12282,7 +12282,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12335,7 +12335,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12388,7 +12388,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12441,7 +12441,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12494,7 +12494,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12547,7 +12547,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12600,7 +12600,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12653,7 +12653,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12706,7 +12706,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12759,7 +12759,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12813,7 +12813,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12868,7 +12868,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12923,7 +12923,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -12978,7 +12978,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13033,7 +13033,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13088,7 +13088,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13142,7 +13142,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13195,7 +13195,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13248,7 +13248,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13301,7 +13301,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13354,7 +13354,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13407,7 +13407,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13460,7 +13460,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13513,7 +13513,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13566,7 +13566,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13619,7 +13619,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13672,7 +13672,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13726,7 +13726,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13780,7 +13780,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13833,7 +13833,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13886,7 +13886,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13939,7 +13939,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -13992,7 +13992,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14045,7 +14045,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14098,7 +14098,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14151,7 +14151,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14204,7 +14204,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14257,7 +14257,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14310,7 +14310,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14363,7 +14363,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14417,7 +14417,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14471,7 +14471,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14524,7 +14524,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14577,7 +14577,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14630,7 +14630,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14683,7 +14683,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14736,7 +14736,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14789,7 +14789,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14842,7 +14842,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14895,7 +14895,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -14948,7 +14948,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15001,7 +15001,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15054,7 +15054,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15107,7 +15107,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15160,7 +15160,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15213,7 +15213,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15266,7 +15266,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15319,7 +15319,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15372,7 +15372,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15425,7 +15425,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15478,7 +15478,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15531,7 +15531,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15584,7 +15584,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15637,7 +15637,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15690,7 +15690,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15743,7 +15743,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15796,7 +15796,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15849,7 +15849,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15902,7 +15902,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -15955,7 +15955,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16008,7 +16008,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16061,7 +16061,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16114,7 +16114,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16167,7 +16167,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16220,7 +16220,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16273,7 +16273,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16326,7 +16326,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16379,7 +16379,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16432,7 +16432,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16485,7 +16485,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16538,7 +16538,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16591,7 +16591,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16644,7 +16644,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16697,7 +16697,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16750,7 +16750,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16803,7 +16803,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16856,7 +16856,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16909,7 +16909,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -16962,7 +16962,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17015,7 +17015,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17076,7 +17076,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17130,7 +17130,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17184,7 +17184,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17238,7 +17238,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17292,7 +17292,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17346,7 +17346,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17400,7 +17400,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17455,7 +17455,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17510,7 +17510,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17565,7 +17565,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17620,7 +17620,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17675,7 +17675,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17730,7 +17730,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17785,7 +17785,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17840,7 +17840,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17895,7 +17895,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17950,7 +17950,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18005,7 +18005,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18060,7 +18060,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18115,7 +18115,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18170,7 +18170,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18224,7 +18224,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18278,7 +18278,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18332,7 +18332,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18386,7 +18386,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18440,7 +18440,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18494,7 +18494,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18549,7 +18549,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18604,7 +18604,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18659,7 +18659,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18714,7 +18714,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18768,7 +18768,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18822,7 +18822,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18876,7 +18876,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18930,7 +18930,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18984,7 +18984,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19038,7 +19038,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19092,7 +19092,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19146,7 +19146,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19200,7 +19200,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19254,7 +19254,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19308,7 +19308,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19362,7 +19362,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19416,7 +19416,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19470,7 +19470,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19524,7 +19524,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19583,7 +19583,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19635,7 +19635,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19687,7 +19687,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19739,7 +19739,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19791,7 +19791,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19844,7 +19844,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19897,7 +19897,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19951,7 +19951,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20005,7 +20005,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20059,7 +20059,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20113,7 +20113,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20167,7 +20167,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20221,7 +20221,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20275,7 +20275,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20329,7 +20329,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20383,7 +20383,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20436,7 +20436,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20490,7 +20490,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20544,7 +20544,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20598,7 +20598,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20652,7 +20652,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20704,7 +20704,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20757,7 +20757,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20810,7 +20810,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20862,7 +20862,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20915,7 +20915,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20968,7 +20968,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -21020,7 +21020,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -21073,7 +21073,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -21126,7 +21126,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -21179,7 +21179,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -21232,7 +21232,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -21284,7 +21284,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -21336,7 +21336,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -21388,7 +21388,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -21440,7 +21440,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -21478,7 +21478,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21497,7 +21497,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21519,7 +21519,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21539,7 +21539,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21558,7 +21558,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21577,7 +21577,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21596,7 +21596,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21615,7 +21615,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21634,7 +21634,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21654,7 +21654,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21673,7 +21673,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21692,7 +21692,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21714,7 +21714,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -21737,7 +21737,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21756,7 +21756,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21775,7 +21775,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21794,7 +21794,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21813,7 +21813,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21832,7 +21832,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21851,7 +21851,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21870,7 +21870,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21889,7 +21889,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -21909,7 +21909,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21928,7 +21928,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21947,7 +21947,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21966,7 +21966,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -21985,7 +21985,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22004,7 +22004,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22023,7 +22023,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22042,7 +22042,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22061,7 +22061,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22080,7 +22080,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22099,7 +22099,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22118,7 +22118,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22137,7 +22137,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22156,7 +22156,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22175,7 +22175,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22194,7 +22194,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22213,7 +22213,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22232,7 +22232,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22251,7 +22251,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22270,7 +22270,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -22290,7 +22290,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22309,7 +22309,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22328,7 +22328,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22347,7 +22347,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22366,7 +22366,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22385,7 +22385,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22404,7 +22404,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22423,7 +22423,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22442,7 +22442,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22461,7 +22461,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22480,7 +22480,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22499,7 +22499,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22518,7 +22518,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22537,7 +22537,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22556,7 +22556,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22575,7 +22575,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22594,7 +22594,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22613,7 +22613,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22632,7 +22632,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22651,7 +22651,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22670,7 +22670,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22689,7 +22689,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22708,7 +22708,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22727,7 +22727,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22746,7 +22746,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22765,7 +22765,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22784,7 +22784,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22803,7 +22803,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22827,7 +22827,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22846,7 +22846,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22865,7 +22865,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22884,7 +22884,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22903,7 +22903,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22923,7 +22923,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22942,7 +22942,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -22968,7 +22968,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -23004,7 +23004,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -23041,7 +23041,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -23069,7 +23069,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -23089,7 +23089,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -23114,7 +23114,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -23138,7 +23138,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -23162,7 +23162,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -23182,7 +23182,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -23205,7 +23205,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -23228,7 +23228,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "idempotent": false,
@@ -23255,7 +23255,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "idempotent": false,
@@ -23282,7 +23282,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12"
+              "os": "Mac-11"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 4675c992..597bf201 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -17558,7 +17558,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17610,7 +17610,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17662,7 +17662,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17714,7 +17714,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17766,7 +17766,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17818,7 +17818,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17870,7 +17870,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17922,7 +17922,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -17974,7 +17974,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18026,7 +18026,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18078,7 +18078,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18130,7 +18130,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18182,7 +18182,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18234,7 +18234,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18286,7 +18286,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18338,7 +18338,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18390,7 +18390,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18442,7 +18442,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18494,7 +18494,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18546,7 +18546,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18598,7 +18598,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18650,7 +18650,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18702,7 +18702,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18755,7 +18755,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18808,7 +18808,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18860,7 +18860,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18912,7 +18912,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -18964,7 +18964,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19016,7 +19016,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19068,7 +19068,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19120,7 +19120,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19172,7 +19172,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19224,7 +19224,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19276,7 +19276,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19328,7 +19328,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19380,7 +19380,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19432,7 +19432,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19484,7 +19484,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19536,7 +19536,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19588,7 +19588,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19640,7 +19640,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19692,7 +19692,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19744,7 +19744,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19796,7 +19796,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19848,7 +19848,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19900,7 +19900,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -19952,7 +19952,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20004,7 +20004,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -20874,21 +20874,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5165.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "dimension_sets": [
@@ -20901,7 +20901,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       },
       {
         "isolate_profile_data": true,
@@ -21039,21 +21039,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5165.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "dimension_sets": [
@@ -21065,7 +21065,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       },
       {
         "args": [
@@ -21185,21 +21185,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5165.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 105.0.5166.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v105.0.5165.0",
-              "revision": "version:105.0.5165.0"
+              "location": "lacros_version_skew_tests_v105.0.5166.0",
+              "revision": "version:105.0.5166.0"
             }
           ],
           "dimension_sets": [
@@ -21211,7 +21211,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 105.0.5165.0"
+        "variant_id": "Lacros version skew testing ash 105.0.5166.0"
       },
       {
         "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json
index 6b436bc..3c5a77b 100644
--- a/testing/buildbot/chromium.perf.json
+++ b/testing/buildbot/chromium.perf.json
@@ -1438,6 +1438,56 @@
       }
     ]
   },
+  "lacros-x86-perf": {
+    "isolated_scripts": [
+      {
+        "args": [
+          "-v",
+          "--browser=lacros-chrome",
+          "--upload-results",
+          "--test-shard-map-filename=lacros-x86-perf_map.json",
+          "--remote=variable_chromeos_device_hostname"
+        ],
+        "isolate_name": "performance_test_suite_octopus",
+        "merge": {
+          "script": "//tools/perf/process_perf_results.py"
+        },
+        "name": "performance_test_suite_octopus",
+        "override_compile_targets": [
+          "performance_test_suite_octopus"
+        ],
+        "resultdb": {
+          "enable": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "device_status": "available",
+              "device_type": "grabbiter",
+              "gpu": null,
+              "os": "ChromeOS",
+              "pool": "chrome.tests.perf"
+            }
+          ],
+          "expiration": 7200,
+          "hard_timeout": 21600,
+          "ignore_task_failure": false,
+          "io_timeout": 21600,
+          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 12
+        },
+        "trigger_script": {
+          "args": [
+            "--multiple-dimension-script-verbose",
+            "True"
+          ],
+          "requires_simultaneous_shard_dispatch": true,
+          "script": "//testing/trigger_scripts/perf_device_trigger.py"
+        }
+      }
+    ]
+  },
   "linux-builder-perf": {
     "additional_compile_targets": [
       "chromedriver",
diff --git a/testing/buildbot/chromium.webrtc.fyi.json b/testing/buildbot/chromium.webrtc.fyi.json
index c054f96..f4ca913 100644
--- a/testing/buildbot/chromium.webrtc.fyi.json
+++ b/testing/buildbot/chromium.webrtc.fyi.json
@@ -290,7 +290,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -313,7 +313,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -334,7 +334,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -359,7 +359,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -380,7 +380,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -401,7 +401,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -596,7 +596,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
@@ -648,7 +648,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "named_caches": [
diff --git a/testing/buildbot/chromium.webrtc.json b/testing/buildbot/chromium.webrtc.json
index 9713739..4385864 100644
--- a/testing/buildbot/chromium.webrtc.json
+++ b/testing/buildbot/chromium.webrtc.json
@@ -360,7 +360,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -385,7 +385,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -409,7 +409,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -434,7 +434,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12",
+              "os": "Mac-12",
               "pool": "WebRTC-chromium"
             }
           ],
@@ -457,7 +457,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -482,7 +482,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -508,7 +508,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -530,7 +530,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -552,7 +552,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Mac-11|Mac-10.16|Mac-12"
+              "os": "Mac-12"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index ba5a158f..31b08fc 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -1488,6 +1488,10 @@
     "label": "//chrome/test:performance_test_suite_eve",
     "type": "generated_script",
   },
+  "performance_test_suite_octopus": {
+    "label": "//chrome/test:performance_test_suite_octopus",
+    "type": "generated_script",
+  },
   "performance_web_engine_test_suite": {
     "args": [
       "../../content/test/gpu/run_telemetry_benchmark_fuchsia.py",
diff --git a/testing/buildbot/internal.chrome.fyi.json b/testing/buildbot/internal.chrome.fyi.json
index 3598dce..f60d4dd 100644
--- a/testing/buildbot/internal.chrome.fyi.json
+++ b/testing/buildbot/internal.chrome.fyi.json
@@ -62,7 +62,7 @@
           "dimension_sets": [
             {
               "cpu": "arm64",
-              "os": "Mac-11|Mac-12",
+              "os": "Mac-12",
               "pool": "chrome.tests.finch"
             }
           ],
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl
index 3672e3b..f0841ef 100644
--- a/testing/buildbot/mixins.pyl
+++ b/testing/buildbot/mixins.pyl
@@ -799,23 +799,6 @@
       },
     },
   },
-  # TODO(crbug.com/1325185) Remove Mac11 once testers have been upgraded to Mac12
-  'mac_11_or_12_arm64': {
-    'swarming': {
-      'dimensions': {
-        'cpu': 'arm64',
-        'os': 'Mac-11|Mac-12',
-      },
-    },
-  },
-  'mac_11_or_12_x64': {
-    'swarming': {
-      'dimensions': {
-        'cpu': 'x86-64',
-        'os': 'Mac-11|Mac-10.16|Mac-12',
-      },
-    },
-  },
   'mac_11_x64': {
     'swarming': {
       'dimensions': {
@@ -824,7 +807,7 @@
       },
     },
   },
-  'mac_12_beta_arm64': {
+  'mac_12_arm64': {
     'swarming': {
       'dimensions': {
         'cpu': 'arm64',
@@ -832,14 +815,6 @@
       },
     },
   },
-  'mac_12_beta_x64': {
-    'swarming': {
-      'dimensions': {
-        'cpu': 'x86-64',
-        'os': 'Mac-12',
-      },
-    },
-  },
   'mac_12_x64': {
     'swarming': {
       'dimensions': {
@@ -870,6 +845,22 @@
       },
     },
   },
+  'mac_beta_arm64': {
+    'swarming': {
+      'dimensions': {
+        'cpu': 'arm64',
+        'os': 'Mac-12',
+      },
+    },
+  },
+  'mac_beta_x64': {
+    'swarming': {
+      'dimensions': {
+        'cpu': 'x86-64',
+        'os': 'Mac-12',
+      },
+    },
+  },
   'mac_mini_intel_gpu_experimental': {
     'swarming': {
       'dimensions': {
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 0f9d633..49ab912 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -22,15 +22,15 @@
   },
   'LACROS_VERSION_SKEW_CANARY': {
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5165.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v105.0.5166.0/test_ash_chrome',
     ],
-    'identifier': 'Lacros version skew testing ash 105.0.5165.0',
+    'identifier': 'Lacros version skew testing ash 105.0.5166.0',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v105.0.5165.0',
-          'revision': 'version:105.0.5165.0',
+          'location': 'lacros_version_skew_tests_v105.0.5166.0',
+          'revision': 'version:105.0.5166.0',
         },
       ],
     },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 0eedd574..42ace420 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -2454,7 +2454,7 @@
       },
       'mac-arm-rel-swarming': {
         'mixins': [
-          'mac_11_or_12_arm64',
+          'mac_12_arm64',
         ],
         'test_suites': {
            'gtest_tests': 'chromium_swarm_desktop_gtests',
@@ -2762,7 +2762,7 @@
         'mixins': [
           'has_native_resultdb_integration',
           'isolate_profile_data',
-          'mac_11_or_12_x64',
+          'mac_12_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -2860,7 +2860,7 @@
       },
       'Mac Builder Next': {
         'mixins': [
-          'mac_12_beta_arm64',
+          'mac_beta_arm64',
         ],
         'additional_compile_targets': [
           'all',
@@ -3218,7 +3218,7 @@
       'ios-fieldtrial-rel': {
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_11_or_12_arm64',
+          'mac_12_arm64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -3236,7 +3236,7 @@
         ],
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_11_or_12_arm64',
+          'mac_12_arm64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -3249,7 +3249,7 @@
       'ios-m1-simulator-cronet': {
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_11_or_12_arm64',
+          'mac_12_arm64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -3266,7 +3266,7 @@
         ],
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_11_or_12_x64',
+          'mac_12_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -3281,7 +3281,7 @@
           'has_native_resultdb_integration',
           'ios_output_disabled_tests',
           'isolate_profile_data',
-          'mac_11_or_12_x64',
+          'mac_12_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -3294,7 +3294,7 @@
       'ios-simulator-cronet': {
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_11_or_12_x64',
+          'mac_12_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -3307,7 +3307,7 @@
       'ios-simulator-multi-window': {
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_11_or_12_x64',
+          'mac_12_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -3321,7 +3321,7 @@
         'mixins': [
           'has_native_resultdb_integration',
           'ios_custom_webkit',
-          'mac_11_or_12_x64',
+          'mac_12_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -3671,7 +3671,7 @@
       'mac-code-coverage': {
         'mixins': [
           'isolate_profile_data',
-          'mac_11_or_12_x64',
+          'mac_12_x64',
         ],
         'test_suites': {
           'gtest_tests': 'chromium_mac_gtests',
@@ -3679,7 +3679,7 @@
       },
       'mac-fieldtrial-rel': {
         'mixins': [
-          'mac_11_or_12_arm64',
+          'mac_12_arm64',
         ],
         'test_suites': {
           'gtest_tests': 'fieldtrial_browser_tests',
@@ -3694,7 +3694,7 @@
       'mac-osxbeta-rel': {
         'mixins': [
           'limited_capacity_bot',
-          'mac_12_beta_x64',
+          'mac_beta_x64',
         ],
         'test_suites': {
           'gtest_tests': 'chromium_mac_gtests_no_nacl',
@@ -5043,7 +5043,7 @@
       },
       'Mac11 Tests': {
         'mixins': [
-            'mac_11_or_12_x64',
+            'mac_11_x64',
             'isolate_profile_data',
         ],
         'test_suites': {
@@ -5093,7 +5093,7 @@
         'mixins': [
           'has_native_resultdb_integration',
           'isolate_profile_data',
-          'mac_11_or_12_x64',
+          'mac_12_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -5110,7 +5110,7 @@
         'mixins': [
           'has_native_resultdb_integration',
           'isolate_profile_data',
-          'mac_11_or_12_x64',
+          'mac_12_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -5126,7 +5126,7 @@
         ],
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_11_or_12_x64',
+          'mac_12_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -5145,7 +5145,7 @@
         'mixins': [
             # Only run selected test suites on CQ. https://crbug.com/1234525.
             'ci_only',
-            'mac_11_or_12_arm64',
+            'mac_11_arm64',
         ],
         'test_suites': {
           'gtest_tests': 'chromium_mac_gtests_no_nacl_no_nocompile',
@@ -5156,7 +5156,7 @@
         'mixins': [
             # Only run selected test suites on CQ. https://crbug.com/1234525.
             'ci_only',
-            'mac_12_beta_arm64',
+            'mac_12_arm64',
         ],
         'test_suites': {
           'gtest_tests': 'chromium_mac_gtests_no_nacl_no_nocompile',
@@ -5313,7 +5313,7 @@
         ],
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_11_or_12_x64',
+          'mac_12_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -5425,7 +5425,7 @@
         'mixins': [
           'has_native_resultdb_integration',
           'isolate_profile_data',
-          'mac_11_or_12_x64',
+          'mac_12_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -5439,7 +5439,7 @@
         'mixins': [
           'has_native_resultdb_integration',
           'isolate_profile_data',
-          'mac_11_or_12_x64',
+          'mac_12_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -5910,7 +5910,7 @@
       'WebRTC Chromium Mac Tester': {
         'mixins': [
           'chromium-webrtc-rel-mac',
-          'mac_11_or_12_x64',
+          'mac_12_x64',
         ],
         'test_suites': {
           'gtest_tests': 'webrtc_chromium_tests_with_baremetal_tests',
@@ -6003,7 +6003,7 @@
       },
       'WebRTC Chromium FYI Mac Tester': {
         'mixins': [
-          'mac_11_or_12_x64',
+          'mac_12_x64',
         ],
         'test_suites': {
           'gtest_tests': 'webrtc_chromium_gtests',
@@ -6031,7 +6031,7 @@
       'WebRTC Chromium FYI ios-simulator': {
         'mixins': [
           'has_native_resultdb_integration',
-          'mac_11_or_12_x64',
+          'mac_12_x64',
           'mac_toolchain',
           'out_dir_arg',
           'xcode_13_main',
@@ -6432,7 +6432,7 @@
       'mac-arm64-finch-smoke-chrome': {
         'mixins': [
           'chrome-finch-swarming-pool',
-          'mac_11_or_12_arm64',
+          'mac_12_arm64',
         ],
         'test_suites': {
           'isolated_scripts': 'chrome_finch_smoke_tests',
@@ -6526,7 +6526,7 @@
       },
       'mac12.0.arm64-blink-rel': {
         'mixins': [
-          'mac_12_beta_arm64',
+          'mac_12_arm64',
         ],
         'test_suites': {
           'isolated_scripts': 'chromium_webkit_isolated_scripts',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 5f14e4e..4cf3376 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -1884,26 +1884,6 @@
             ]
         }
     ],
-    "BlinkAhoCorasickForAttributeSelectors": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "chromeos_lacros",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "SubstringSetTreeForAttributeBuckets"
-                    ]
-                }
-            ]
-        }
-    ],
     "BlinkSchedulerPrioritizeRenderingAfterInput": [
         {
             "platforms": [
@@ -6070,7 +6050,8 @@
                         "PrefixSuggestIgnoreDuplicateVisits": "true",
                         "ShortBookmarkSuggestionsByTotalInputLengthThreshold": "3",
                         "UIMaxAutocompleteMatches": "8",
-                        "ZeroSuggestCacheDurationSec": "0"
+                        "ZeroSuggestCacheDurationSec": "0",
+                        "ZeroSuggestIgnoreDuplicateVisits": "false"
                     },
                     "enable_features": [
                         "LocalHistorySuggestRevamp",
@@ -8164,6 +8145,26 @@
             ]
         }
     ],
+    "SubstringSetTreeForAttributeBuckets": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "SubstringSetTreeForAttributeBuckets"
+                    ]
+                }
+            ]
+        }
+    ],
     "SuggestionAnswerColorReverse": [
         {
             "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index 46db811..cd5b469 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -35,7 +35,7 @@
 // Allows pages with DedicatedWorker to stay eligible for the back/forward
 // cache.
 const base::Feature kBackForwardCacheDedicatedWorker{
-    "BackForwardCacheDedicatedWorker", base::FEATURE_DISABLED_BY_DEFAULT};
+    "BackForwardCacheDedicatedWorker", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Enable intervention for download that was initiated from or occurred in an ad
 // frame without user activation.
@@ -1533,5 +1533,8 @@
 const base::Feature kTimedHTMLParserBudget{"TimedHTMLParserBudget",
                                            base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kCSSOverflowForReplacedElements{
+    "CSSOverflowForReplacedElements", base::FEATURE_ENABLED_BY_DEFAULT};
+
 }  // namespace features
 }  // namespace blink
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index 0d252408..79cbf9aa 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -791,6 +791,10 @@
 // rather than token count.
 BLINK_COMMON_EXPORT extern const base::Feature kTimedHTMLParserBudget;
 
+// This flag is meant to be a temporary kill switch to disable
+// CSSOverflowForReplacedElements, if necessary, due to compat issues.
+BLINK_COMMON_EXPORT extern const base::Feature kCSSOverflowForReplacedElements;
+
 }  // namespace features
 }  // namespace blink
 
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.cc b/third_party/blink/renderer/core/animation/compositor_animations.cc
index ad6aa74..8827e869 100644
--- a/third_party/blink/renderer/core/animation/compositor_animations.cc
+++ b/third_party/blink/renderer/core/animation/compositor_animations.cc
@@ -339,7 +339,8 @@
           // like regular filters do, so they can still be composited.
           break;
         case CSSPropertyID::kBackgroundColor:
-        case CSSPropertyID::kBoxShadow: {
+        case CSSPropertyID::kBoxShadow:
+        case CSSPropertyID::kClipPath: {
           NativePaintImageGenerator* generator = nullptr;
           // Not having a layout object is a reason for not compositing marked
           // in CompositorAnimations::CheckCanStartElementOnCompositor.
@@ -359,6 +360,13 @@
             generator = target_element.GetDocument()
                             .GetFrame()
                             ->GetBoxShadowPaintImageGenerator();
+          } else if (property.GetCSSProperty().PropertyID() ==
+                         CSSPropertyID::kClipPath &&
+                     RuntimeEnabledFeatures::
+                         CompositeClipPathAnimationEnabled()) {
+            generator = target_element.GetDocument()
+                            .GetFrame()
+                            ->GetClipPathPaintImageGenerator();
           }
           Animation* compositable_animation = nullptr;
 
@@ -374,27 +382,6 @@
           }
           break;
         }
-        case CSSPropertyID::kClipPath: {
-          Animation* compositable_animation = nullptr;
-          if (RuntimeEnabledFeatures::CompositeClipPathAnimationEnabled()) {
-            ClipPathPaintImageGenerator* generator =
-                target_element.GetDocument()
-                    .GetFrame()
-                    ->GetClipPathPaintImageGenerator();
-            // TODO(crbug.com/686074): The generator may be null in tests.
-            // Fix and remove this test-only branch.
-            if (generator) {
-              compositable_animation =
-                  generator->GetAnimationIfCompositable(&target_element);
-            }
-          }
-          if (!RuntimeEnabledFeatures::CompositeClipPathAnimationEnabled() ||
-              !compositable_animation) {
-            DefaultToUnsupportedProperty(unsupported_properties, property,
-                                         &reasons);
-          }
-          break;
-        }
         case CSSPropertyID::kVariable: {
           // Custom properties are supported only in the case of
           // OffMainThreadCSSPaintEnabled, and even then only for some specific
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.cc
index f1ee97a..3cacbe4 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.cc
@@ -98,7 +98,9 @@
     : start_offset_(start),
       end_offset_(end),
       shape_result_(shape_result),
-      layout_object_(other.layout_object_),
+      // Use atomic construction to allow for concurrently marking NGInlineItem.
+      layout_object_(other.layout_object_,
+                     Member<LayoutObject>::AtomicInitializerTag{}),
       type_(other.type_),
       text_type_(other.text_type_),
       style_variant_(other.style_variant_),
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio.cc b/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio.cc
index ace1cff..e402c063 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio.cc
@@ -62,6 +62,18 @@
   return media::SampleFormatToBitsPerChannel(media::kSampleFormatS16);
 }
 
+bool IsProcessingAllowedForSampleRatesNotDivisibleBy100(
+    mojom::blink::MediaStreamType stream_type) {
+#if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION)
+  if (media::IsChromeWideEchoCancellationEnabled() &&
+      stream_type == mojom::blink::MediaStreamType::DEVICE_AUDIO_CAPTURE) {
+    // When audio processing is performed in the audio process, an experiment
+    // parameter determines which sample rates are supported.
+    return media::kChromeWideEchoCancellationAllowAllSampleRates.Get();
+  }
+#endif
+  return true;
+}
 // This class encapsulates two values that together build up the score of each
 // processed candidate.
 // - Fitness, similarly defined by the W3C specification
@@ -1151,11 +1163,11 @@
             is_reconfiguration_allowed));
     // TODO(https://crbug.com/1332484): Sample rates not divisible by 100 are
     // not reliably supported due to the common assumption that sample_rate/100
-    // corresponds to 10 ms of audio. This needs to be addressed in order to
-    // support these rates for WebRTC audio processing in the audio process.
+    // corresponds to 10 ms of audio. When that is addressed, this
+    // ApmProcessedContainer can be added to |processing_based_containers_|
+    // unconditionally.
     if ((device_parameters_.sample_rate() % 100 == 0) ||
-        !(media::IsChromeWideEchoCancellationEnabled() &&
-          stream_type == mojom::blink::MediaStreamType::DEVICE_AUDIO_CAPTURE)) {
+        IsProcessingAllowedForSampleRatesNotDivisibleBy100(stream_type)) {
       processing_based_containers_.push_back(
           ProcessingBasedContainer::CreateApmProcessedContainer(
               source_info, stream_type, is_device_capture, device_parameters_,
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc b/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc
index 7e54112..f25c5b84 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_constraints_util_audio_test.cc
@@ -2122,30 +2122,53 @@
     EXPECT_TRUE(result.HasValue());
 }
 
-// TODO(https://crbug.com/1332484): Support sample rates not divisible by 100 in
-// the audio service.
-TEST_P(MediaStreamConstraintsRemoteAPMTest,
-       NonDivisibleSampleRatesAreNotSupportedInAudioService) {
-  SCOPED_TRACE(GetMessageForScopedTrace());
+#if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION)
+class MediaStreamConstraintsRemoteAPMSampleRateRestrictionTest
+    : public MediaStreamConstraintsUtilAudioTestBase,
+      public testing::WithParamInterface<bool> {
+ protected:
+  bool AllowAllSampleRates() { return GetParam(); }
 
-  const std::string k22050HzDeviceId = "22050hz_device";
-  capabilities_.emplace_back(
-      k22050HzDeviceId.c_str(), "22050hz_fake_group",
-      media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                             media::CHANNEL_LAYOUT_STEREO, 22050, 1000));
+ private:
+  void SetUp() override {
+    MediaStreamConstraintsUtilAudioTestBase::SetUp();
 
-  ResetFactory();
-  constraint_factory_.basic().device_id.SetExact(k22050HzDeviceId.c_str());
+    scoped_feature_list_.InitAndEnableFeatureWithParameters(
+        media::kChromeWideEchoCancellation,
+        {{"allow_all_sample_rates", AllowAllSampleRates() ? "true" : "false"}});
+
+    // Setup the capabilities with a prohibited sample rate.
+    ResetFactory();
+    constexpr int kNondivisibleSampleRateHz = 22050;
+    const std::string k22050HzDeviceId = "22050hz_device";
+    capabilities_.emplace_back(
+        k22050HzDeviceId.c_str(), "22050hz_fake_group",
+        media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
+                               media::CHANNEL_LAYOUT_STEREO,
+                               kNondivisibleSampleRateHz, 1000));
+    default_device_ = &capabilities_[0];
+  }
+
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+TEST_P(MediaStreamConstraintsRemoteAPMSampleRateRestrictionTest,
+       ToggleNondivisibleSampleRatesParameter) {
+  SCOPED_TRACE(testing::Message()
+               << "allow_all_sample_rates=" << AllowAllSampleRates());
+
   constraint_factory_.basic().echo_cancellation.SetExact(true);
   AudioCaptureSettings result = SelectSettings();
 
-  // Audio processing is only supported when APM runs in the renderer.
-  if (GetApmLocation() == ApmLocation::kProcessedLocalAudioSource)
-    EXPECT_TRUE(result.HasValue());
-  else
-    EXPECT_FALSE(result.HasValue());
+  EXPECT_EQ(result.HasValue(), AllowAllSampleRates());
 }
 
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    MediaStreamConstraintsRemoteAPMSampleRateRestrictionTest,
+    testing::Bool());
+#endif
+
 TEST_P(MediaStreamConstraintsUtilAudioTest, LatencyConstraint) {
   if (!IsDeviceCapture())
     return;
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.idl b/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.idl
index d2806645..862a031 100644
--- a/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.idl
+++ b/third_party/blink/renderer/modules/shared_storage/shared_storage_worklet.idl
@@ -3,7 +3,8 @@
 // found in the LICENSE file.
 
 [
-    Exposed=SharedStorage
+  RuntimeEnabled=SharedStorageAPI,
+  Exposed=(Window)
 ] interface SharedStorageWorklet {
     [
       CallWith=ScriptState,
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_core.cc b/third_party/blink/renderer/modules/webcodecs/image_decoder_core.cc
index 012d410..9dc6930 100644
--- a/third_party/blink/renderer/modules/webcodecs/image_decoder_core.cc
+++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_core.cc
@@ -395,6 +395,9 @@
     }
   }
 
+  yuv_frame_->metadata().transformation = ImageOrientationToVideoTransformation(
+      decoder_->Orientation().Orientation());
+
   if (gfx_cs.IsValid()) {
     yuv_frame_->set_color_space(YUVColorSpaceToGfxColorSpace(
         skyuv_cs, gfx_cs.GetPrimaryID(), gfx_cs.GetTransferID()));
diff --git a/third_party/blink/renderer/platform/RuntimeEnabledFeatures.md b/third_party/blink/renderer/platform/RuntimeEnabledFeatures.md
index 7a12c94..814ff42 100644
--- a/third_party/blink/renderer/platform/RuntimeEnabledFeatures.md
+++ b/third_party/blink/renderer/platform/RuntimeEnabledFeatures.md
@@ -3,7 +3,7 @@
 Runtime flags enable Blink developers the ability to control access Chromium users have to new features they implement. Features that are hidden behind a runtime flag are known as Runtime Enabled Features. It is a requirement of the Blink Launch Process to implement new web exposed features behind a runtime flag until an Intent To Ship has been approved.
 
 ## Adding A Runtime Enabled Feature
-Runtime Enabled Features are defined in runtime_enabled_features.json5 in alphabetical order. Add your feature's flag to this file and the rest will be generated for you automatically.
+Runtime Enabled Features are defined in runtime_enabled_features.json5 in alphabetical order. Add your feature's flag to [runtime_enabled_features.json5] and the rest will be generated for you automatically.
 
 Example:
 ```js
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc
index 8ebe83af..e2d29c3 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc
@@ -85,8 +85,6 @@
       size_(size),
       snapshot_state_(kInitialSnapshotState),
       resource_host_(nullptr),
-      random_generator_((uint32_t)base::RandUint64()),
-      bernoulli_distribution_(kRasterMetricProbability),
       last_recording_(nullptr) {
   // Used by browser tests to detect the use of a Canvas2DLayerBridge.
   TRACE_EVENT_INSTANT0("test_gpu", "Canvas2DLayerBridgeCreation",
@@ -553,8 +551,9 @@
 
   // We are using @dont_use_idle_scheduling_for_testing_ temporarily to always
   // measure while testing.
-  const bool will_measure = dont_use_idle_scheduling_for_testing_ ||
-                            bernoulli_distribution_(random_generator_);
+  const bool will_measure =
+      dont_use_idle_scheduling_for_testing_ ||
+      metrics_subsampler_.ShouldSample(kRasterMetricProbability);
   const bool measure_raster_metric =
       (raster_interface || !IsAccelerated()) && will_measure;
 
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h
index 1edd389..2494d64f 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h
+++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.h
@@ -27,12 +27,12 @@
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_CANVAS_2D_LAYER_BRIDGE_H_
 
 #include <memory>
-#include <random>
 #include <utility>
 
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/numerics/checked_math.h"
+#include "base/rand_util.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "cc/layers/texture_layer_client.h"
@@ -223,9 +223,7 @@
   // For measuring a sample of frames for end-to-end raster time
   // Every frame has a 1% chance of being sampled
   static constexpr float kRasterMetricProbability = 0.01;
-
-  std::mt19937 random_generator_;
-  std::bernoulli_distribution bernoulli_distribution_;
+  base::MetricsSubSampler metrics_subsampler_;
   Deque<RasterTimer> pending_raster_timers_;
 
   sk_sp<cc::PaintRecord> last_recording_;
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 1816e49..cd83e2f8 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1470,7 +1470,7 @@
 crbug.com/1240236 external/wpt/css/css-fonts/system-ui-ja.html [ Failure ]
 crbug.com/1240236 external/wpt/css/css-fonts/system-ui-ur-vs-ar.html [ Failure ]
 crbug.com/1240236 external/wpt/css/css-fonts/system-ui-zh.html [ Failure ]
-crbug.com/1269537 fast/css-generated-content/quotes-lang.html [ Failure Pass ]
+crbug.com/1269537 [ Mac ] fast/css-generated-content/quotes-lang.html [ Failure Pass ]
 
 crbug.com/1317062 external/wpt/html/rendering/non-replaced-elements/phrasing-content-0/br-wbr-content/content-property.tentative.html [ Failure ]
 
@@ -6277,8 +6277,6 @@
 crbug.com/1249176 [ Mac12-arm64 ] external/wpt/resource-timing/nested-context-navigations-embed.html [ Failure Pass ]
 crbug.com/1249176 [ Mac11-arm64 ] http/tests/intersection-observer/cross-origin-iframe-with-nesting.html [ Failure Pass Timeout ]
 crbug.com/1249176 [ Mac12-arm64 ] http/tests/intersection-observer/cross-origin-iframe-with-nesting.html [ Failure Pass Timeout ]
-crbug.com/1249176 [ Mac11-arm64 ] media/controls/overflow-menu-always-visible.html [ Failure Pass ]
-crbug.com/1249176 [ Mac12-arm64 ] media/controls/overflow-menu-always-visible.html [ Failure Pass ]
 crbug.com/1249176 [ Mac11-arm64 ] paint/markers/document-markers-font-8px.html [ Failure Pass ]
 crbug.com/1249176 [ Mac12-arm64 ] paint/markers/document-markers-font-8px.html [ Failure Pass ]
 crbug.com/1249176 [ Mac11-arm64 ] paint/markers/document-markers-zoom-2000.html [ Failure Pass ]
@@ -7078,9 +7076,6 @@
 crbug.com/1229084 [ Linux ] external/wpt/storage-access-api/requestStorageAccess.sub.window.html [ Failure Pass ]
 crbug.com/1229084 [ Win ] external/wpt/storage-access-api/requestStorageAccess.sub.window.html [ Failure Pass ]
 
-# Sheriff 2022-06-09
-crbug.com/1335002 [ Linux ] external/wpt/event-timing/first-input-interactionid-tap.html [ Skip ]
-
 # Flaky on multiple platforms
 crbug.com/1277696 fast/loader/reload-zero-byte-plugin.html [ Failure Pass ]
 
@@ -7167,4 +7162,5 @@
 
 # Sheriff 2022-07-07
 crbug.com/1339538 [ Mac ] fast/frames/002.html [ Failure Pass ]
-crbug.com/1339538 [ Linux ] fast/frames/002.html [ Failure Pass ]
\ No newline at end of file
+crbug.com/1339538 [ Linux ] fast/frames/002.html [ Failure Pass ]
+crbug.com/1097040 media/controls/overflow-menu-always-visible.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/first-input-interactionid-tap.html b/third_party/blink/web_tests/external/wpt/event-timing/first-input-interactionid-click.html
similarity index 81%
rename from third_party/blink/web_tests/external/wpt/event-timing/first-input-interactionid-tap.html
rename to third_party/blink/web_tests/external/wpt/event-timing/first-input-interactionid-click.html
index c5c6f51..7295e35b 100644
--- a/third_party/blink/web_tests/external/wpt/event-timing/first-input-interactionid-tap.html
+++ b/third_party/blink/web_tests/external/wpt/event-timing/first-input-interactionid-click.html
@@ -1,13 +1,11 @@
 <!DOCTYPE html>
 <html>
 <meta charset=utf-8 />
-<meta name="timeout" content="long">
-<title>Event Timing: first-input-interactionId-tap.</title>
-<button id='test'>Tap</button>
+<title>First Input: interactionId-click.</title>
+<button id='testButtonId'>Click me</button>
 <script src=/resources/testharness.js></script>
 <script src=/resources/testharnessreport.js></script>
 <script src=/resources/testdriver.js></script>
-<script src=/resources/testdriver-actions.js></script>
 <script src=/resources/testdriver-vendor.js></script>
 <script src=resources/event-timing-test-utils.js></script>
 
@@ -49,8 +47,8 @@
       }
     })).observe({ entryTypes: ["event", "first-input"] });
 
-    addListenersAndTap(document.getElementById('test'), ['pointerdown', 'pointerup']);
-  }, "Event Timing: The interactionId of first input should match the event timing pointerdown entry when tap.");
+    addListenersAndClick(document.getElementById('testButtonId'));
+  }, "The interactionId of the first input entry should match the same pointerdown entry of event timing when click.");
 </script>
 
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/interactionid-click.html b/third_party/blink/web_tests/external/wpt/event-timing/interactionid-click.html
index a43f9a2..f0d32e6 100644
--- a/third_party/blink/web_tests/external/wpt/event-timing/interactionid-click.html
+++ b/third_party/blink/web_tests/external/wpt/event-timing/interactionid-click.html
@@ -11,18 +11,7 @@
 <script>
   let observedEntries = [];
   let map = new Map();
-  async function clickOnElement(id) {
-  const element = document.getElementById(id);
-  const clickHandler = () => {
-    mainThreadBusy(200);
-  };
-  element.addEventListener("mousedown", clickHandler);
-  element.addEventListener("mouseup", clickHandler);
-  element.addEventListener("pointerdown", clickHandler);
-  element.addEventListener("pointerup", clickHandler);
-  element.addEventListener("click", clickHandler);
-  await test_driver.click(element);
-  }
+
   function eventsForCheck(entry) {
       if (entry.name === 'pointerdown' || entry.name === 'pointerup' || entry.name === 'click'
       || entry.name === 'mousedown' || entry.name === 'mouseup') {
@@ -44,7 +33,7 @@
       assert_equals(map.get('pointerdown'), map.get('click'), 'Pointerdown and click should have the same interactionId');
       t.done();
     })).observe({type: 'event'});
-    clickOnElement('button');
+    addListenersAndClick(document.getElementById('button'));
   }, "Event Timing: compare event timing interactionId.");
 </script>
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js b/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js
index c549e7e..f60bfb21 100644
--- a/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js
+++ b/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js
@@ -314,6 +314,13 @@
   pressKey(element, key);
 }
 
+// The testdriver.js, testdriver-vendor.js need to be included to use this
+// function.
+async function addListenersAndClick(element) {
+  addListeners(element, ['mousedown', 'mouseup', 'pointerdown', 'pointerup', 'click']);
+  await test_driver.click(element);
+}
+
 function filterAndAddToMap(events, map) {
   return function (entry) {
     if (events.includes(entry.name)) {
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/README.md b/third_party/blink/web_tests/external/wpt/webcodecs/README.md
index 8d8d0012..637169a3 100644
--- a/third_party/blink/web_tests/external/wpt/webcodecs/README.md
+++ b/third_party/blink/web_tests/external/wpt/webcodecs/README.md
@@ -79,7 +79,10 @@
 
 ### four-colors-limited-range-420-8bpc.jpg
 Used [Sqoosh.app](https://squoosh.app/) with MozJPEG compression and YUV
-channels.
+channels. exiftool was then used to add an orientation marker.
+```
+exiftool -Orientation=1 -n four-colors-limited-range-420-8bpc.jpg
+```
 
 ### four-colors.mp4
 Used a [custom tool](https://storage.googleapis.com/dalecurtis/avif2mp4.html) to convert four-colors.avif into a .mp4 file.
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/four-colors-limited-range-420-8bpc.jpg b/third_party/blink/web_tests/external/wpt/webcodecs/four-colors-limited-range-420-8bpc.jpg
index d3893b06..9ce1f1a 100644
--- a/third_party/blink/web_tests/external/wpt/webcodecs/four-colors-limited-range-420-8bpc.jpg
+++ b/third_party/blink/web_tests/external/wpt/webcodecs/four-colors-limited-range-420-8bpc.jpg
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-image-orientation-none.https.html b/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-image-orientation-none.https.html
index 9c4e91bb..2e555dbe 100644
--- a/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-image-orientation-none.https.html
+++ b/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-image-orientation-none.https.html
@@ -1,3 +1,4 @@
+<!DOCTYPE html>
 <title>Test ImageDecoder outputs to a image-orientation: none canvas.</title>
 <canvas style="image-orientation: none"></canvas>
 <script src="/resources/testharness.js"></script>
@@ -43,4 +44,45 @@
   return testFourColorDecodeWithExifOrientation(
       8, document.querySelector('canvas'));
 }, 'Test JPEG w/ EXIF orientation left-bottom on canvas w/o orientation.');
+
+// YUV tests
+promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(
+      1, document.querySelector('canvas'), /*useYuv=*/true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation top-left on canvas w/o orientation');
+
+promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(
+      2, document.querySelector('canvas'), /*useYuv=*/true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation top-right on canvas w/o orientation.');
+
+promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(
+      3, document.querySelector('canvas'), /*useYuv=*/true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation bottom-right on canvas w/o orientation.');
+
+promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(
+      4, document.querySelector('canvas'), /*useYuv=*/true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation bottom-left on canvas w/o orientation.');
+
+promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(
+      5, document.querySelector('canvas'), /*useYuv=*/true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation left-top on canvas w/o orientation.');
+
+promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(
+      6, document.querySelector('canvas'), /*useYuv=*/true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation right-top on canvas w/o orientation.');
+
+promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(
+      7, document.querySelector('canvas'), /*useYuv=*/true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation right-bottom on canvas w/o orientation.');
+
+promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(
+      8, document.querySelector('canvas'), /*useYuv=*/true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation left-bottom on canvas w/o orientation.');
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-utils.js b/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-utils.js
index 548ace0..eccab9b 100644
--- a/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-utils.js
+++ b/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder-utils.js
@@ -3,7 +3,7 @@
 const kBlue = 0x0000FFFF;
 const kGreen = 0x00FF00FF;
 
-function getColorName (color) {
+function getColorName(color) {
   switch (color) {
     case kYellow:
       return "Yellow";
@@ -17,8 +17,20 @@
   return "#" + color.toString(16);
 }
 
-function toUInt32(pixelArray) {
+function toUInt32(pixelArray, roundForYuv) {
   let p = pixelArray.data;
+
+  // YUV to RGB conversion introduces some loss, so provide some leeway.
+  if (roundForYuv) {
+    const tolerance = 3;
+    for (var i = 0; i < p.length; ++i) {
+      if (p[i] >= 0xFF - tolerance)
+        p[i] = 0xFF;
+      if (p[i] <= 0x00 + tolerance)
+        p[i] = 0x00;
+    }
+  }
+
   return ((p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3]) >>> 0;
 }
 
@@ -74,17 +86,20 @@
   });
 }
 
-function testFourColorDecodeWithExifOrientation(orientation, canvas) {
+function testFourColorDecodeWithExifOrientation(orientation, canvas, useYuv) {
   return ImageDecoder.isTypeSupported('image/jpeg').then(support => {
     assert_implements_optional(
         support, 'Optional codec image/jpeg not supported.');
-    return fetch('four-colors.jpg')
+    const testFile =
+        useYuv ? 'four-colors-limited-range-420-8bpc.jpg' : 'four-colors.jpg';
+    return fetch(testFile)
         .then(response => {
           return response.arrayBuffer();
         })
         .then(buffer => {
           let u8buffer = new Uint8Array(buffer);
-          u8buffer[0x1F] = orientation;  // Location derived via diff.
+          u8buffer[useYuv ? 0x31 : 0x1F] =
+              orientation;  // Location derived via diff.
           let decoder = new ImageDecoder({data: u8buffer, type: 'image/jpeg'});
           return decoder.decode();
         })
@@ -155,12 +170,13 @@
             };
           }
 
-          verifyFourColorsImage(expectedWidth, expectedHeight, ctx, matrix);
+          verifyFourColorsImage(
+              expectedWidth, expectedHeight, ctx, matrix, useYuv);
         });
   });
 }
 
-function verifyFourColorsImage(width, height, ctx, matrix) {
+function verifyFourColorsImage(width, height, ctx, matrix, isYuv) {
   if (!matrix) {
     matrix = [
       [kYellow, kRed],
@@ -173,10 +189,11 @@
   let expectedBottomLeft = matrix[1][0];
   let expectedBottomRight = matrix[1][1];
 
-  let topLeft = toUInt32(ctx.getImageData(0, 0, 1, 1));
-  let topRight = toUInt32(ctx.getImageData(width - 1, 0, 1, 1));
-  let bottomLeft = toUInt32(ctx.getImageData(0, height - 1, 1, 1));
-  let bottomRight = toUInt32(ctx.getImageData(width - 1, height - 1, 1, 1));
+  let topLeft = toUInt32(ctx.getImageData(0, 0, 1, 1), isYuv);
+  let topRight = toUInt32(ctx.getImageData(width - 1, 0, 1, 1), isYuv);
+  let bottomLeft = toUInt32(ctx.getImageData(0, height - 1, 1, 1), isYuv);
+  let bottomRight =
+      toUInt32(ctx.getImageData(width - 1, height - 1, 1, 1), isYuv);
 
   assert_equals(getColorName(topLeft), getColorName(expectedTopLeft),
                             'top left corner');
diff --git a/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder.https.any.js b/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder.https.any.js
index 876a591d..3ae50a5 100644
--- a/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/webcodecs/image-decoder.https.any.js
@@ -64,6 +64,39 @@
 }, 'Test JPEG w/ EXIF orientation left-bottom.');
 
 promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(1, null, /*useYuv=*/ true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation top-left.');
+
+promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(2, null, /*useYuv=*/ true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation top-right.');
+
+promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(3, null, /*useYuv=*/ true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation bottom-right.');
+
+promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(4, null, /*useYuv=*/ true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation bottom-left.');
+
+promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(5, null, /*useYuv=*/ true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation left-top.');
+
+promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(6, null, /*useYuv=*/ true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation right-top.');
+
+promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(7, null, /*useYuv=*/ true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation right-bottom.');
+
+promise_test(t => {
+  return testFourColorDecodeWithExifOrientation(8, null, /*useYuv=*/ true);
+}, 'Test 4:2:0 JPEG w/ EXIF orientation left-bottom.');
+
+
+promise_test(t => {
   return testFourColorsDecode('four-colors.png', 'image/png');
 }, 'Test PNG image decoding.');
 
diff --git a/third_party/blink/web_tests/fast/css-generated-content/quotes-lang-expected.html b/third_party/blink/web_tests/fast/css-generated-content/quotes-lang-expected.html
index 3417d15..1917237 100644
--- a/third_party/blink/web_tests/fast/css-generated-content/quotes-lang-expected.html
+++ b/third_party/blink/web_tests/fast/css-generated-content/quotes-lang-expected.html
@@ -1,156 +1,66 @@
 <!DOCTYPE html>
 <meta charset="utf-8">
 <style>
-    /* This css is from http://www.whatwg.org/specs/web-apps/current-work/multipage/rendering.html#quotes */
+    /*
+    This css is built using the International Components for Unicode (ICU)
+    See here for list of languages supported by Chrome: https://docs.google.com/document/d/1iOMXwI4MriHgHEtGm3n2c7s8_XfBUkmwtQ9uDIk2Bww/edit
+    */
 
-    :root:lang(af),       :not(:lang(af)) > :lang(af)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(agq),      :not(:lang(agq)) > :lang(agq)           { quotes: '\201e' '\201d' '\201a' '\2019' } /* „ ” ‚ ’ */
-    :root:lang(ak),       :not(:lang(ak)) > :lang(ak)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(am),       :not(:lang(am)) > :lang(am)             { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */
     :root:lang(ar),       :not(:lang(ar)) > :lang(ar)             { quotes: '\201d' '\201c' '\2019' '\2018' } /* ” “ ’ ‘ */
-    :root:lang(asa),      :not(:lang(asa)) > :lang(asa)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(az-Cyrl),  :not(:lang(az-Cyrl)) > :lang(az-Cyrl)   { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */
-    :root:lang(bas),      :not(:lang(bas)) > :lang(bas)           { quotes: '\00ab' '\00bb' '\201e' '\201c' } /* « » „ “ */
-    :root:lang(bem),      :not(:lang(bem)) > :lang(bem)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(bez),      :not(:lang(bez)) > :lang(bez)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(bg),       :not(:lang(bg)) > :lang(bg)             { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */
-    :root:lang(bm),       :not(:lang(bm)) > :lang(bm)             { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */
+    :root:lang(bg),       :not(:lang(bg)) > :lang(bg)             { quotes: '\201e' '\201c' '\201e' '\201c' } /* „ “ „ “ */
     :root:lang(bn),       :not(:lang(bn)) > :lang(bn)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(br),       :not(:lang(br)) > :lang(br)             { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */
-    :root:lang(brx),      :not(:lang(brx)) > :lang(brx)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(bs-Cyrl),  :not(:lang(bs-Cyrl)) > :lang(bs-Cyrl)   { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */
-    :root:lang(ca),       :not(:lang(ca)) > :lang(ca)             { quotes: '\201c' '\201d' '\00ab' '\00bb' } /* “ ” « » */
-    :root:lang(cgg),      :not(:lang(cgg)) > :lang(cgg)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(chr),      :not(:lang(chr)) > :lang(chr)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
+    :root:lang(ca),       :not(:lang(ca)) > :lang(ca)             { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */
     :root:lang(cs),       :not(:lang(cs)) > :lang(cs)             { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */
     :root:lang(da),       :not(:lang(da)) > :lang(da)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(dav),      :not(:lang(dav)) > :lang(dav)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(de),       :not(:lang(de)) > :lang(de)             { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */
-    :root:lang(de-CH),    :not(:lang(de-CH)) > :lang(de-CH)       { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */
-    :root:lang(dje),      :not(:lang(dje)) > :lang(dje)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(dua),      :not(:lang(dua)) > :lang(dua)           { quotes: '\00ab' '\00bb' '\2018' '\2019' } /* « » ‘ ’ */
-    :root:lang(dyo),      :not(:lang(dyo)) > :lang(dyo)           { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */
-    :root:lang(dz),       :not(:lang(dz)) > :lang(dz)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(ebu),      :not(:lang(ebu)) > :lang(ebu)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(ee),       :not(:lang(ee)) > :lang(ee)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
+    :root:lang(de-CH),    :not(:lang(de-CH)) > :lang(de-CH)       { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */
     :root:lang(el),       :not(:lang(el)) > :lang(el)             { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */
     :root:lang(en),       :not(:lang(en)) > :lang(en)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(en-GB),    :not(:lang(en-GB)) > :lang(en-GB)       { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(es),       :not(:lang(es)) > :lang(es)             { quotes: '\201c' '\201d' '\00ab' '\00bb' } /* “ ” « » */
+    :root:lang(es),       :not(:lang(es)) > :lang(es)             { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* “ ” « » */
     :root:lang(et),       :not(:lang(et)) > :lang(et)             { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */
-    :root:lang(eu),       :not(:lang(eu)) > :lang(eu)             { quotes: '\201c' '\201d' '\00ab' '\00bb' } /* “ ” « » */
-    :root:lang(ewo),      :not(:lang(ewo)) > :lang(ewo)           { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */
     :root:lang(fa),       :not(:lang(fa)) > :lang(fa)             { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */
-    :root:lang(ff),       :not(:lang(ff)) > :lang(ff)             { quotes: '\201e' '\201d' '\201a' '\2019' } /* „ ” ‚ ’ */
+    :root:lang(fil),      :not(:lang(fil)) > :lang(fil)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(fi),       :not(:lang(fi)) > :lang(fi)             { quotes: '\201d' '\201d' '\2019' '\2019' } /* ” ” ’ ’ */
     :root:lang(fr),       :not(:lang(fr)) > :lang(fr)             { quotes: '\00ab' '\00bb' '\00ab' '\00bb' } /* « » « » */
-    :root:lang(fr-CA),    :not(:lang(fr-CA)) > :lang(fr-CA)       { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */
+    :root:lang(fr-CA),    :not(:lang(fr-CA)) > :lang(fr-CA)       { quotes: '\00ab' '\00bb' '\201d' '\201c' } /* « » ” “ */
     :root:lang(fr-CH),    :not(:lang(fr-CH)) > :lang(fr-CH)       { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */
-    :root:lang(gsw),      :not(:lang(gsw)) > :lang(gsw)           { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */
     :root:lang(gu),       :not(:lang(gu)) > :lang(gu)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(guz),      :not(:lang(guz)) > :lang(guz)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(ha),       :not(:lang(ha)) > :lang(ha)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(he),       :not(:lang(he)) > :lang(he)             { quotes: '\0022' '\0022' '\0027' '\0027' } /* " " ' ' */
     :root:lang(hi),       :not(:lang(hi)) > :lang(hi)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(hr),       :not(:lang(hr)) > :lang(hr)             { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */
     :root:lang(hu),       :not(:lang(hu)) > :lang(hu)             { quotes: '\201e' '\201d' '\00bb' '\00ab' } /* „ ” » « */
     :root:lang(id),       :not(:lang(id)) > :lang(id)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(ig),       :not(:lang(ig)) > :lang(ig)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(it),       :not(:lang(it)) > :lang(it)             { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */
     :root:lang(ja),       :not(:lang(ja)) > :lang(ja)             { quotes: '\300c' '\300d' '\300e' '\300f' } /* 「 」 『 』 */
-    :root:lang(jgo),      :not(:lang(jgo)) > :lang(jgo)           { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */
-    :root:lang(jmc),      :not(:lang(jmc)) > :lang(jmc)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(kab),      :not(:lang(kab)) > :lang(kab)           { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */
-    :root:lang(kam),      :not(:lang(kam)) > :lang(kam)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(kde),      :not(:lang(kde)) > :lang(kde)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(kea),      :not(:lang(kea)) > :lang(kea)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(khq),      :not(:lang(khq)) > :lang(khq)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(ki),       :not(:lang(ki)) > :lang(ki)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(kkj),      :not(:lang(kkj)) > :lang(kkj)           { quotes: '\00ab' '\00bb' '\2039' '\203a' } /* « » ‹ › */
-    :root:lang(kln),      :not(:lang(kln)) > :lang(kln)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(km),       :not(:lang(km)) > :lang(km)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(kn),       :not(:lang(kn)) > :lang(kn)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(ko),       :not(:lang(ko)) > :lang(ko)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(ksb),      :not(:lang(ksb)) > :lang(ksb)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(ksf),      :not(:lang(ksf)) > :lang(ksf)           { quotes: '\00ab' '\00bb' '\2018' '\2019' } /* « » ‘ ’ */
-    :root:lang(lag),      :not(:lang(lag)) > :lang(lag)           { quotes: '\201d' '\201d' '\2019' '\2019' } /* ” ” ’ ’ */
-    :root:lang(lg),       :not(:lang(lg)) > :lang(lg)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(ln),       :not(:lang(ln)) > :lang(ln)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(lo),       :not(:lang(lo)) > :lang(lo)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(lt),       :not(:lang(lt)) > :lang(lt)             { quotes: '\201e' '\201c' '\201e' '\201c' } /* „ “ „ “ */
-    :root:lang(lu),       :not(:lang(lu)) > :lang(lu)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(luo),      :not(:lang(luo)) > :lang(luo)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(luy),      :not(:lang(luy)) > :lang(luy)           { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */
     :root:lang(lv),       :not(:lang(lv)) > :lang(lv)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(mas),      :not(:lang(mas)) > :lang(mas)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(mer),      :not(:lang(mer)) > :lang(mer)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(mfe),      :not(:lang(mfe)) > :lang(mfe)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(mg),       :not(:lang(mg)) > :lang(mg)             { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */
-    :root:lang(mgo),      :not(:lang(mgo)) > :lang(mgo)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(mk),       :not(:lang(mk)) > :lang(mk)             { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */
     :root:lang(ml),       :not(:lang(ml)) > :lang(ml)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(mr),       :not(:lang(mr)) > :lang(mr)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(ms),       :not(:lang(ms)) > :lang(ms)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(mua),      :not(:lang(mua)) > :lang(mua)           { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */
-    :root:lang(my),       :not(:lang(my)) > :lang(my)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(naq),      :not(:lang(naq)) > :lang(naq)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(nb),       :not(:lang(nb)) > :lang(nb)             { quotes: '\00ab' '\00bb' '\2018' '\2019' } /* « » ‘ ’ */
-    :root:lang(nd),       :not(:lang(nd)) > :lang(nd)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(nl),       :not(:lang(nl)) > :lang(nl)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(nmg),      :not(:lang(nmg)) > :lang(nmg)           { quotes: '\201e' '\201d' '\00ab' '\00bb' } /* „ ” « » */
-    :root:lang(nn),       :not(:lang(nn)) > :lang(nn)             { quotes: '\00ab' '\00bb' '\2018' '\2019' } /* « » ‘ ’ */
-    :root:lang(nnh),      :not(:lang(nnh)) > :lang(nnh)           { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */
-    :root:lang(nus),      :not(:lang(nus)) > :lang(nus)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(nyn),      :not(:lang(nyn)) > :lang(nyn)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
+    :root:lang(nl),       :not(:lang(nl)) > :lang(nl)             { quotes: '\2018' '\2019' '\2018' '\2019' } /* ‘ ’ ‘ ’ */
+    :root:lang(no),       :not(:lang(no)) > :lang(no)             { quotes: '\00ab' '\00bb' '\2018' '\2019' } /* « » ‘ ’ */
     :root:lang(pl),       :not(:lang(pl)) > :lang(pl)             { quotes: '\201e' '\201d' '\00ab' '\00bb' } /* „ ” « » */
     :root:lang(pt),       :not(:lang(pt)) > :lang(pt)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(pt-PT),    :not(:lang(pt-PT)) > :lang(pt-PT)       { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */
-    :root:lang(rn),       :not(:lang(rn)) > :lang(rn)             { quotes: '\201d' '\201d' '\2019' '\2019' } /* ” ” ’ ’ */
     :root:lang(ro),       :not(:lang(ro)) > :lang(ro)             { quotes: '\201e' '\201d' '\00ab' '\00bb' } /* „ ” « » */
-    :root:lang(rof),      :not(:lang(rof)) > :lang(rof)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(ru),       :not(:lang(ru)) > :lang(ru)             { quotes: '\00ab' '\00bb' '\201e' '\201c' } /* « » „ “ */
-    :root:lang(rw),       :not(:lang(rw)) > :lang(rw)             { quotes: '\00ab' '\00bb' '\2018' '\2019' } /* « » ‘ ’ */
-    :root:lang(rwk),      :not(:lang(rwk)) > :lang(rwk)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(saq),      :not(:lang(saq)) > :lang(saq)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(sbp),      :not(:lang(sbp)) > :lang(sbp)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(seh),      :not(:lang(seh)) > :lang(seh)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(ses),      :not(:lang(ses)) > :lang(ses)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(sg),       :not(:lang(sg)) > :lang(sg)             { quotes: '\00ab' '\00bb' '\201c' '\201d' } /* « » “ ” */
-    :root:lang(shi),      :not(:lang(shi)) > :lang(shi)           { quotes: '\00ab' '\00bb' '\201e' '\201d' } /* « » „ ” */
-    :root:lang(shi-Tfng), :not(:lang(shi-Tfng)) > :lang(shi-Tfng) { quotes: '\00ab' '\00bb' '\201e' '\201d' } /* « » „ ” */
-    :root:lang(si),       :not(:lang(si)) > :lang(si)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(sk),       :not(:lang(sk)) > :lang(sk)             { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */
     :root:lang(sl),       :not(:lang(sl)) > :lang(sl)             { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */
-    :root:lang(sn),       :not(:lang(sn)) > :lang(sn)             { quotes: '\201d' '\201d' '\2019' '\2019' } /* ” ” ’ ’ */
-    :root:lang(so),       :not(:lang(so)) > :lang(so)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(sq),       :not(:lang(sq)) > :lang(sq)             { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */
-    :root:lang(sr),       :not(:lang(sr)) > :lang(sr)             { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */
-    :root:lang(sr-Latn),  :not(:lang(sr-Latn)) > :lang(sr-Latn)   { quotes: '\201e' '\201c' '\201a' '\2018' } /* „ “ ‚ ‘ */
+    :root:lang(sr),       :not(:lang(sr)) > :lang(sr)             { quotes: '\201e' '\201c' '\2018' '\2018' } /* „ “ ‘ ‘ */
+    :root:lang(sr-Latn),  :not(:lang(sr-Latn)) > :lang(sr-Latn)   { quotes: '\201e' '\201c' '\2018' '\2018' } /* „ “ ‘ ‘ */
     :root:lang(sv),       :not(:lang(sv)) > :lang(sv)             { quotes: '\201d' '\201d' '\2019' '\2019' } /* ” ” ’ ’ */
     :root:lang(sw),       :not(:lang(sw)) > :lang(sw)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(swc),      :not(:lang(swc)) > :lang(swc)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(ta),       :not(:lang(ta)) > :lang(ta)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(te),       :not(:lang(te)) > :lang(te)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(teo),      :not(:lang(teo)) > :lang(teo)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(th),       :not(:lang(th)) > :lang(th)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(ti-ER),    :not(:lang(ti-ER)) > :lang(ti-ER)       { quotes: '\2018' '\2019' '\201c' '\201d' } /* ‘ ’ “ ” */
-    :root:lang(to),       :not(:lang(to)) > :lang(to)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(tr),       :not(:lang(tr)) > :lang(tr)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(twq),      :not(:lang(twq)) > :lang(twq)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(tzm),      :not(:lang(tzm)) > :lang(tzm)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(uk),       :not(:lang(uk)) > :lang(uk)             { quotes: '\00ab' '\00bb' '\201e' '\201c' } /* « » „ “ */
-    :root:lang(ur),       :not(:lang(ur)) > :lang(ur)             { quotes: '\201d' '\201c' '\2019' '\2018' } /* ” “ ’ ‘ */
-    :root:lang(vai),      :not(:lang(vai)) > :lang(vai)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(vai-Latn), :not(:lang(vai-Latn)) > :lang(vai-Latn) { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(vi),       :not(:lang(vi)) > :lang(vi)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(vun),      :not(:lang(vun)) > :lang(vun)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(xh),       :not(:lang(xh)) > :lang(xh)             { quotes: '\2018' '\2019' '\201c' '\201d' } /* ‘ ’ “ ” */
-    :root:lang(xog),      :not(:lang(xog)) > :lang(xog)           { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
-    :root:lang(yav),      :not(:lang(yav)) > :lang(yav)           { quotes: '\00ab' '\00bb' '\00ab' '\00bb' } /* « » « » */
-    :root:lang(yo),       :not(:lang(yo)) > :lang(yo)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(zh),       :not(:lang(zh)) > :lang(zh)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
     :root:lang(zh-Hant),  :not(:lang(zh-Hant)) > :lang(zh-Hant)   { quotes: '\300c' '\300d' '\300e' '\300f' } /* 「 」 『 』 */
-    :root:lang(zu),       :not(:lang(zu)) > :lang(zu)             { quotes: '\201c' '\201d' '\2018' '\2019' } /* “ ” ‘ ’ */
 </style>
 
 <p>
@@ -159,153 +69,60 @@
 </p>
 
 <!-- Custom quotes are inlined to make this test fail if you don't implement CSS quotes. -->
-<div lang="custom">ACcustomDB</div>
-<q><q>default</q></q>
-<q lang="af"><q>af</q></q>
-<q lang="agq"><q>agq</q></q>
-<q lang="ak"><q>ak</q></q>
-<q lang="am"><q>am</q></q>
-<q lang="ar"><q>ar</q></q>
-<q lang="asa"><q>asa</q></q>
-<q lang="az-Cyrl"><q>az-Cyrl</q></q>
-<q lang="bas"><q>bas</q></q>
-<q lang="bem"><q>bem</q></q>
-<q lang="bez"><q>bez</q></q>
-<q lang="bg"><q>bg</q></q>
-<q lang="bm"><q>bm</q></q>
-<q lang="bn"><q>bn</q></q>
-<q lang="br"><q>br</q></q>
-<q lang="brx"><q>brx</q></q>
-<q lang="bs-Cyrl"><q>bs-Cyrl</q></q>
-<q lang="ca"><q>ca</q></q>
-<q lang="cgg"><q>cgg</q></q>
-<q lang="chr"><q>chr</q></q>
-<q lang="cs"><q>cs</q></q>
-<q lang="da"><q>da</q></q>
-<q lang="dav"><q>dav</q></q>
-<q lang="de"><q>de</q></q>
-<q lang="de-CH"><q>de-CH</q></q>
-<q lang="dje"><q>dje</q></q>
-<q lang="dua"><q>dua</q></q>
-<q lang="dyo"><q>dyo</q></q>
-<q lang="dz"><q>dz</q></q>
-<q lang="ebu"><q>ebu</q></q>
-<q lang="ee"><q>ee</q></q>
-<q lang="el"><q>el</q></q>
-<q lang="en"><q>en</q></q>
-<q lang="en-GB"><q>en-GB</q></q>
-<q lang="es"><q>es</q></q>
-<q lang="et"><q>et</q></q>
-<q lang="eu"><q>eu</q></q>
-<q lang="ewo"><q>ewo</q></q>
-<q lang="fa"><q>fa</q></q>
-<q lang="ff"><q>ff</q></q>
-<q lang="fi"><q>fi</q></q>
-<q lang="fr"><q>fr</q></q>
-<q lang="fr-CA"><q>fr-CA</q></q>
-<q lang="fr-CH"><q>fr-CH</q></q>
-<q lang="gsw"><q>gsw</q></q>
-<q lang="gu"><q>gu</q></q>
-<q lang="guz"><q>guz</q></q>
-<q lang="ha"><q>ha</q></q>
-<q lang="he"><q>he</q></q>
-<q lang="hi"><q>hi</q></q>
-<q lang="hr"><q>hr</q></q>
-<q lang="hu"><q>hu</q></q>
-<q lang="id"><q>id</q></q>
-<q lang="ig"><q>ig</q></q>
-<q lang="it"><q>it</q></q>
-<q lang="ja"><q>ja</q></q>
-<q lang="jgo"><q>jgo</q></q>
-<q lang="jmc"><q>jmc</q></q>
-<q lang="kab"><q>kab</q></q>
-<q lang="kam"><q>kam</q></q>
-<q lang="kde"><q>kde</q></q>
-<q lang="kea"><q>kea</q></q>
-<q lang="khq"><q>khq</q></q>
-<q lang="ki"><q>ki</q></q>
-<q lang="kkj"><q>kkj</q></q>
-<q lang="kln"><q>kln</q></q>
-<q lang="km"><q>km</q></q>
-<q lang="kn"><q>kn</q></q>
-<q lang="ko"><q>ko</q></q>
-<q lang="ksb"><q>ksb</q></q>
-<q lang="ksf"><q>ksf</q></q>
-<q lang="lag"><q>lag</q></q>
-<q lang="lg"><q>lg</q></q>
-<q lang="ln"><q>ln</q></q>
-<q lang="lo"><q>lo</q></q>
-<q lang="lt"><q>lt</q></q>
-<q lang="lu"><q>lu</q></q>
-<q lang="luo"><q>luo</q></q>
-<q lang="luy"><q>luy</q></q>
-<q lang="lv"><q>lv</q></q>
-<q lang="mas"><q>mas</q></q>
-<q lang="mer"><q>mer</q></q>
-<q lang="mfe"><q>mfe</q></q>
-<q lang="mg"><q>mg</q></q>
-<q lang="mgo"><q>mgo</q></q>
-<q lang="mk"><q>mk</q></q>
-<q lang="ml"><q>ml</q></q>
-<q lang="mr"><q>mr</q></q>
-<q lang="ms"><q>ms</q></q>
-<q lang="mua"><q>mua</q></q>
-<q lang="my"><q>my</q></q>
-<q lang="naq"><q>naq</q></q>
-<q lang="nb"><q>nb</q></q>
-<q lang="nd"><q>nd</q></q>
-<q lang="nl"><q>nl</q></q>
-<q lang="nmg"><q>nmg</q></q>
-<q lang="nn"><q>nn</q></q>
-<q lang="nnh"><q>nnh</q></q>
-<q lang="nus"><q>nus</q></q>
-<q lang="nyn"><q>nyn</q></q>
-<q lang="pl"><q>pl</q></q>
-<q lang="pt"><q>pt</q></q>
-<q lang="pt-PT"><q>pt-PT</q></q>
-<q lang="rn"><q>rn</q></q>
-<q lang="ro"><q>ro</q></q>
-<q lang="rof"><q>rof</q></q>
-<q lang="ru"><q>ru</q></q>
-<q lang="rw"><q>rw</q></q>
-<q lang="rwk"><q>rwk</q></q>
-<q lang="saq"><q>saq</q></q>
-<q lang="sbp"><q>sbp</q></q>
-<q lang="seh"><q>seh</q></q>
-<q lang="ses"><q>ses</q></q>
-<q lang="sg"><q>sg</q></q>
-<q lang="shi"><q>shi</q></q>
-<q lang="shi-Tfng"><q>shi-Tfng</q></q>
-<q lang="si"><q>si</q></q>
-<q lang="sk"><q>sk</q></q>
-<q lang="sl"><q>sl</q></q>
-<q lang="sn"><q>sn</q></q>
-<q lang="so"><q>so</q></q>
-<q lang="sq"><q>sq</q></q>
-<q lang="sr"><q>sr</q></q>
-<q lang="sr-Latn"><q>sr-Latn</q></q>
-<q lang="sv"><q>sv</q></q>
-<q lang="sw"><q>sw</q></q>
-<q lang="swc"><q>swc</q></q>
-<q lang="ta"><q>ta</q></q>
-<q lang="te"><q>te</q></q>
-<q lang="teo"><q>teo</q></q>
-<q lang="th"><q>th</q></q>
-<q lang="ti-ER"><q>ti-ER</q></q>
-<q lang="to"><q>to</q></q>
-<q lang="tr"><q>tr</q></q>
-<q lang="twq"><q>twq</q></q>
-<q lang="tzm"><q>tzm</q></q>
-<q lang="uk"><q>uk</q></q>
-<q lang="ur"><q>ur</q></q>
-<q lang="vai"><q>vai</q></q>
-<q lang="vai-Latn"><q>vai-Latn</q></q>
-<q lang="vi"><q>vi</q></q>
-<q lang="vun"><q>vun</q></q>
-<q lang="xh"><q>xh</q></q>
-<q lang="xog"><q>xog</q></q>
-<q lang="yav"><q>yav</q></q>
-<q lang="yo"><q>yo</q></q>
-<q lang="zh"><q>zh</q></q>
-<q lang="zh-Hant"><q>zh-Hant</q></q>
-<q lang="zu"><q>zu</q></q>
+<span lang="custom">ACcustomDB</span>
+<span><q><q>default</q></q></span>
+<span lang="am"><q><q>am</q></q></span>
+<span lang="ar"><q><q>ar</q></q></span>
+<span lang="bg"><q><q>bg</q></q></span>
+<span lang="bn"><q><q>bn</q></q></span>
+<span lang="ca"><q><q>ca</q></q></span>
+<span lang="cs"><q><q>cs</q></q></span>
+<span lang="da"><q><q>da</q></q></span>
+<span lang="de"><q><q>de</q></q></span>
+<span lang="de-CH"><q><q>de-CH</q></q></span>
+<span lang="el"><q><q>el</q></q></span>
+<span lang="en"><q><q>en</q></q></span>
+<span lang="en-GB"><q><q>en-GB</q></q></span>
+<span lang="es"><q><q>es</q></q></span>
+<span lang="et"><q><q>et</q></q></span>
+<span lang="fa"><q><q>fa</q></q></span>
+<span lang="fil"><q><q>fil</q></q></span>
+<span lang="fi"><q><q>fi</q></q></span>
+<span lang="fr"><q><q>fr</q></q></span>
+<span lang="fr-CA"><q><q>fr-CA</q></q></span>
+<span lang="fr-CH"><q><q>fr-CH</q></q></span>
+<span lang="gu"><q><q>gu</q></q></span>
+<span lang="hi"><q><q>hi</q></q></span>
+<span lang="hu"><q><q>hu</q></q></span>
+<span lang="hr"><q><q>hr</q></q></span>
+<span lang="id"><q><q>id</q></q></span>
+<span lang="it"><q><q>it</q></q></span>
+<span lang="ja"><q><q>ja</q></q></span>
+<span lang="kn"><q><q>kn</q></q></span>
+<span lang="ko"><q><q>ko</q></q></span>
+<span lang="lt"><q><q>lt</q></q></span>
+<span lang="lv"><q><q>lv</q></q></span>
+<span lang="ml"><q><q>ml</q></q></span>
+<span lang="mr"><q><q>mr</q></q></span>
+<span lang="ms"><q><q>ms</q></q></span>
+<span lang="nl"><q><q>nl</q></q></span>
+<span lang="no"><q><q>no</q></q></span>
+<span lang="pl"><q><q>pl</q></q></span>
+<span lang="pt"><q><q>pt</q></q></span>
+<span lang="pt-PT"><q><q>pt-PT</q></q></span>
+<span lang="ro"><q><q>ro</q></q></span>
+<span lang="ru"><q><q>ru</q></q></span>
+<span lang="sk"><q><q>sk</q></q></span>
+<span lang="sl"><q><q>sl</q></q></span>
+<span lang="sr"><q><q>sr</q></q></span>
+<span lang="sr-Latn"><q><q>sr-Latn</q></q></span>
+<span lang="sv"><q><q>sv</q></q></span>
+<span lang="sw"><q><q>sw</q></q></span>
+<span lang="ta"><q><q>ta</q></q></span>
+<span lang="te"><q><q>te</q></q></span>
+<span lang="th"><q><q>th</q></q></span>
+<span lang="tr"><q><q>tr</q></q></span>
+<span lang="uk"><q><q>uk</q></q></span>
+<span lang="vi"><q><q>vi</q></q></span>
+<span lang="zh"><q><q>zh</q></q></span>
+<span lang="zh-Hant"><q><q>zh-Hant</q></q></span>
diff --git a/third_party/blink/web_tests/fast/css-generated-content/quotes-lang.html b/third_party/blink/web_tests/fast/css-generated-content/quotes-lang.html
index 4806c8e9..5a9961a 100644
--- a/third_party/blink/web_tests/fast/css-generated-content/quotes-lang.html
+++ b/third_party/blink/web_tests/fast/css-generated-content/quotes-lang.html
@@ -11,153 +11,60 @@
     and not just basic " and ' characters unless no language is specified.
 </p>
 
-<div lang="custom"><q><q>custom</q></q></div>
-<q><q>default</q></q>
-<q lang="af"><q>af</q></q>
-<q lang="agq"><q>agq</q></q>
-<q lang="ak"><q>ak</q></q>
-<q lang="am"><q>am</q></q>
-<q lang="ar"><q>ar</q></q>
-<q lang="asa"><q>asa</q></q>
-<q lang="az-Cyrl"><q>az-Cyrl</q></q>
-<q lang="bas"><q>bas</q></q>
-<q lang="bem"><q>bem</q></q>
-<q lang="bez"><q>bez</q></q>
-<q lang="bg"><q>bg</q></q>
-<q lang="bm"><q>bm</q></q>
-<q lang="bn"><q>bn</q></q>
-<q lang="br"><q>br</q></q>
-<q lang="brx"><q>brx</q></q>
-<q lang="bs-Cyrl"><q>bs-Cyrl</q></q>
-<q lang="ca"><q>ca</q></q>
-<q lang="cgg"><q>cgg</q></q>
-<q lang="chr"><q>chr</q></q>
-<q lang="cs"><q>cs</q></q>
-<q lang="da"><q>da</q></q>
-<q lang="dav"><q>dav</q></q>
-<q lang="de"><q>de</q></q>
-<q lang="de-CH"><q>de-CH</q></q>
-<q lang="dje"><q>dje</q></q>
-<q lang="dua"><q>dua</q></q>
-<q lang="dyo"><q>dyo</q></q>
-<q lang="dz"><q>dz</q></q>
-<q lang="ebu"><q>ebu</q></q>
-<q lang="ee"><q>ee</q></q>
-<q lang="el"><q>el</q></q>
-<q lang="en"><q>en</q></q>
-<q lang="en-GB"><q>en-GB</q></q>
-<q lang="es"><q>es</q></q>
-<q lang="et"><q>et</q></q>
-<q lang="eu"><q>eu</q></q>
-<q lang="ewo"><q>ewo</q></q>
-<q lang="fa"><q>fa</q></q>
-<q lang="ff"><q>ff</q></q>
-<q lang="fi"><q>fi</q></q>
-<q lang="fr"><q>fr</q></q>
-<q lang="fr-CA"><q>fr-CA</q></q>
-<q lang="fr-CH"><q>fr-CH</q></q>
-<q lang="gsw"><q>gsw</q></q>
-<q lang="gu"><q>gu</q></q>
-<q lang="guz"><q>guz</q></q>
-<q lang="ha"><q>ha</q></q>
-<q lang="he"><q>he</q></q>
-<q lang="hi"><q>hi</q></q>
-<q lang="hr"><q>hr</q></q>
-<q lang="hu"><q>hu</q></q>
-<q lang="id"><q>id</q></q>
-<q lang="ig"><q>ig</q></q>
-<q lang="it"><q>it</q></q>
-<q lang="ja"><q>ja</q></q>
-<q lang="jgo"><q>jgo</q></q>
-<q lang="jmc"><q>jmc</q></q>
-<q lang="kab"><q>kab</q></q>
-<q lang="kam"><q>kam</q></q>
-<q lang="kde"><q>kde</q></q>
-<q lang="kea"><q>kea</q></q>
-<q lang="khq"><q>khq</q></q>
-<q lang="ki"><q>ki</q></q>
-<q lang="kkj"><q>kkj</q></q>
-<q lang="kln"><q>kln</q></q>
-<q lang="km"><q>km</q></q>
-<q lang="kn"><q>kn</q></q>
-<q lang="ko"><q>ko</q></q>
-<q lang="ksb"><q>ksb</q></q>
-<q lang="ksf"><q>ksf</q></q>
-<q lang="lag"><q>lag</q></q>
-<q lang="lg"><q>lg</q></q>
-<q lang="ln"><q>ln</q></q>
-<q lang="lo"><q>lo</q></q>
-<q lang="lt"><q>lt</q></q>
-<q lang="lu"><q>lu</q></q>
-<q lang="luo"><q>luo</q></q>
-<q lang="luy"><q>luy</q></q>
-<q lang="lv"><q>lv</q></q>
-<q lang="mas"><q>mas</q></q>
-<q lang="mer"><q>mer</q></q>
-<q lang="mfe"><q>mfe</q></q>
-<q lang="mg"><q>mg</q></q>
-<q lang="mgo"><q>mgo</q></q>
-<q lang="mk"><q>mk</q></q>
-<q lang="ml"><q>ml</q></q>
-<q lang="mr"><q>mr</q></q>
-<q lang="ms"><q>ms</q></q>
-<q lang="mua"><q>mua</q></q>
-<q lang="my"><q>my</q></q>
-<q lang="naq"><q>naq</q></q>
-<q lang="nb"><q>nb</q></q>
-<q lang="nd"><q>nd</q></q>
-<q lang="nl"><q>nl</q></q>
-<q lang="nmg"><q>nmg</q></q>
-<q lang="nn"><q>nn</q></q>
-<q lang="nnh"><q>nnh</q></q>
-<q lang="nus"><q>nus</q></q>
-<q lang="nyn"><q>nyn</q></q>
-<q lang="pl"><q>pl</q></q>
-<q lang="pt"><q>pt</q></q>
-<q lang="pt-PT"><q>pt-PT</q></q>
-<q lang="rn"><q>rn</q></q>
-<q lang="ro"><q>ro</q></q>
-<q lang="rof"><q>rof</q></q>
-<q lang="ru"><q>ru</q></q>
-<q lang="rw"><q>rw</q></q>
-<q lang="rwk"><q>rwk</q></q>
-<q lang="saq"><q>saq</q></q>
-<q lang="sbp"><q>sbp</q></q>
-<q lang="seh"><q>seh</q></q>
-<q lang="ses"><q>ses</q></q>
-<q lang="sg"><q>sg</q></q>
-<q lang="shi"><q>shi</q></q>
-<q lang="shi-Tfng"><q>shi-Tfng</q></q>
-<q lang="si"><q>si</q></q>
-<q lang="sk"><q>sk</q></q>
-<q lang="sl"><q>sl</q></q>
-<q lang="sn"><q>sn</q></q>
-<q lang="so"><q>so</q></q>
-<q lang="sq"><q>sq</q></q>
-<q lang="sr"><q>sr</q></q>
-<q lang="sr-Latn"><q>sr-Latn</q></q>
-<q lang="sv"><q>sv</q></q>
-<q lang="sw"><q>sw</q></q>
-<q lang="swc"><q>swc</q></q>
-<q lang="ta"><q>ta</q></q>
-<q lang="te"><q>te</q></q>
-<q lang="teo"><q>teo</q></q>
-<q lang="th"><q>th</q></q>
-<q lang="ti-ER"><q>ti-ER</q></q>
-<q lang="to"><q>to</q></q>
-<q lang="tr"><q>tr</q></q>
-<q lang="twq"><q>twq</q></q>
-<q lang="tzm"><q>tzm</q></q>
-<q lang="uk"><q>uk</q></q>
-<q lang="ur"><q>ur</q></q>
-<q lang="vai"><q>vai</q></q>
-<q lang="vai-Latn"><q>vai-Latn</q></q>
-<q lang="vi"><q>vi</q></q>
-<q lang="vun"><q>vun</q></q>
-<q lang="xh"><q>xh</q></q>
-<q lang="xog"><q>xog</q></q>
-<q lang="yav"><q>yav</q></q>
-<q lang="yo"><q>yo</q></q>
-<q lang="zh"><q>zh</q></q>
-<q lang="zh-Hant"><q>zh-Hant</q></q>
-<q lang="zu"><q>zu</q></q>
+<span lang="custom"><q><q>custom</q></q></span>
+<span><q><q>default</q></q></span>
+<span lang="am"><q><q>am</q></q></span>
+<span lang="ar"><q><q>ar</q></q></span>
+<span lang="bg"><q><q>bg</q></q></span>
+<span lang="bn"><q><q>bn</q></q></span>
+<span lang="ca"><q><q>ca</q></q></span>
+<span lang="cs"><q><q>cs</q></q></span>
+<span lang="da"><q><q>da</q></q></span>
+<span lang="de"><q><q>de</q></q></span>
+<span lang="de-CH"><q><q>de-CH</q></q></span>
+<span lang="el"><q><q>el</q></q></span>
+<span lang="en"><q><q>en</q></q></span>
+<span lang="en-GB"><q><q>en-GB</q></q></span>
+<span lang="es"><q><q>es</q></q></span>
+<span lang="et"><q><q>et</q></q></span>
+<span lang="fa"><q><q>fa</q></q></span>
+<span lang="fil"><q><q>fil</q></q></span>
+<span lang="fi"><q><q>fi</q></q></span>
+<span lang="fr"><q><q>fr</q></q></span>
+<span lang="fr-CA"><q><q>fr-CA</q></q></span>
+<span lang="fr-CH"><q><q>fr-CH</q></q></span>
+<span lang="gu"><q><q>gu</q></q></span>
+<span lang="hi"><q><q>hi</q></q></span>
+<span lang="hu"><q><q>hu</q></q></span>
+<span lang="hr"><q><q>hr</q></q></span>
+<span lang="id"><q><q>id</q></q></span>
+<span lang="it"><q><q>it</q></q></span>
+<span lang="ja"><q><q>ja</q></q></span>
+<span lang="kn"><q><q>kn</q></q></span>
+<span lang="ko"><q><q>ko</q></q></span>
+<span lang="lt"><q><q>lt</q></q></span>
+<span lang="lv"><q><q>lv</q></q></span>
+<span lang="ml"><q><q>ml</q></q></span>
+<span lang="mr"><q><q>mr</q></q></span>
+<span lang="ms"><q><q>ms</q></q></span>
+<span lang="nl"><q><q>nl</q></q></span>
+<span lang="no"><q><q>no</q></q></span>
+<span lang="pl"><q><q>pl</q></q></span>
+<span lang="pt"><q><q>pt</q></q></span>
+<span lang="pt-PT"><q><q>pt-PT</q></q></span>
+<span lang="ro"><q><q>ro</q></q></span>
+<span lang="ru"><q><q>ru</q></q></span>
+<span lang="sk"><q><q>sk</q></q></span>
+<span lang="sl"><q><q>sl</q></q></span>
+<span lang="sr"><q><q>sr</q></q></span>
+<span lang="sr-Latn"><q><q>sr-Latn</q></q></span>
+<span lang="sv"><q><q>sv</q></q></span>
+<span lang="sw"><q><q>sw</q></q></span>
+<span lang="ta"><q><q>ta</q></q></span>
+<span lang="te"><q><q>te</q></q></span>
+<span lang="th"><q><q>th</q></q></span>
+<span lang="tr"><q><q>tr</q></q></span>
+<span lang="uk"><q><q>uk</q></q></span>
+<span lang="vi"><q><q>vi</q></q></span>
+<span lang="zh"><q><q>zh</q></q></span>
+<span lang="zh-Hant"><q><q>zh-Hant</q></q></span>
diff --git a/third_party/closure_compiler/externs/passwords_private.js b/third_party/closure_compiler/externs/passwords_private.js
index fb84329d..92285c9 100644
--- a/third_party/closure_compiler/externs/passwords_private.js
+++ b/third_party/closure_compiler/externs/passwords_private.js
@@ -154,6 +154,14 @@
 chrome.passwordsPrivate.ChangeSavedPasswordParams;
 
 /**
+ * @typedef {{
+ *   accountId: (number|undefined),
+ *   deviceId: (number|undefined)
+ * }}
+ */
+chrome.passwordsPrivate.CredentialIds;
+
+/**
  * Function that logs that the Passwords page was accessed from the Chrome
  * Settings WebUI.
  */
@@ -167,8 +175,8 @@
  * @param {!Array<number>} ids The ids for the password entry being updated.
  * @param {!chrome.passwordsPrivate.ChangeSavedPasswordParams} params The
  *     dictionary which holds the changed parameters.
- * @param {function(): void=} callback The callback that gets invoked in the
- *     end.
+ * @param {function(!chrome.passwordsPrivate.CredentialIds): void=} callback The
+ *     callback that gets invoked in the end.
  */
 chrome.passwordsPrivate.changeSavedPassword = function(ids, params, callback) {};
 
@@ -359,6 +367,13 @@
 chrome.passwordsPrivate.recordChangePasswordFlowStarted = function(credential, isManualFlow, callback) {};
 
 /**
+ * Refreshes the cache for automatic password change scripts if it is stale.
+ * Invokes `callback` on completion.
+ * @param {function(): void=} callback
+ */
+chrome.passwordsPrivate.refreshScriptsIfNecessary = function(callback) {};
+
+/**
  * Starts a check for insecure passwords. Invokes |callback| on completion.
  * @param {function(): void=} callback
  */
diff --git a/third_party/metrics_proto/README.chromium b/third_party/metrics_proto/README.chromium
index 581638cd..07222f0f 100644
--- a/third_party/metrics_proto/README.chromium
+++ b/third_party/metrics_proto/README.chromium
@@ -1,8 +1,8 @@
 Name: Metrics Protos
 Short Name: metrics_proto
 URL: This is the canonical public repository
-Version: 458008660
-Date: 2022/06/29 UTC
+Version: 459259529
+Date: 2022/07/06 UTC
 License: BSD
 Security Critical: Yes
 
diff --git a/third_party/metrics_proto/system_profile.proto b/third_party/metrics_proto/system_profile.proto
index dfcb42ca..89aac0bb 100644
--- a/third_party/metrics_proto/system_profile.proto
+++ b/third_party/metrics_proto/system_profile.proto
@@ -634,10 +634,6 @@
     // Logged on Android only as of Q1 2022. Used by only Android WebView. Other
     // platforms should use Stability.Counts2.
     optional int32 launch_count = 15;
-    // The number of times that it didn't exit cleanly (which we assume to be
-    // mostly crashes). On Android M71+ this does not include times when the Gms
-    // Core version has changed, which is recorded separately below.
-    optional int32 crash_count = 16;
     // Android only. The number of times Chrome didn't exit cleanly and the GMS
     // Core version has changed from the last session. This is in addition to
     // |crash_count| in which we exclude unclean exits that are likely caused by
diff --git a/third_party/updater/.gitignore b/third_party/updater/.gitignore
index 30de5d24..76c051a 100644
--- a/third_party/updater/.gitignore
+++ b/third_party/updater/.gitignore
@@ -2,8 +2,8 @@
 /chrome_mac_universal_prod/UpdaterSetup
 /chrome_win_x86/UpdaterSetup_test.exe
 /chrome_win_x86_64/UpdaterSetup_test.exe
-/chromium_mac_amd64/GoogleUpdater_test.app/
-/chromium_mac_arm64/GoogleUpdater_test.app/
+/chromium_mac_amd64/ChromiumUpdater_test.app/
+/chromium_mac_arm64/ChromiumUpdater_test.app/
 /chromium_win_x86/UpdaterSetup_test.exe
 /chromium_win_x86_64/UpdaterSetup_test.exe
 
diff --git a/tools/ipc_fuzzer/fuzzer/fuzzer.cc b/tools/ipc_fuzzer/fuzzer/fuzzer.cc
index d9ace88..105fc91 100644
--- a/tools/ipc_fuzzer/fuzzer/fuzzer.cc
+++ b/tools/ipc_fuzzer/fuzzer/fuzzer.cc
@@ -1366,7 +1366,7 @@
   }
 };
 
-#if BUILDFLAG(ENABLE_PLUGINS)
+#if BUILDFLAG(ENABLE_PPAPI)
 // PP_ traits.
 template <>
 struct FuzzTraits<PP_Bool> {
@@ -1528,7 +1528,7 @@
     return true;
   }
 };
-#endif  // BUILDFLAG(ENABLE_PLUGINS)
+#endif  // BUILDFLAG(ENABLE_PPAPI)
 
 template <>
 struct FuzzTraits<printing::mojom::MarginType> {
diff --git a/tools/ipc_fuzzer/message_lib/BUILD.gn b/tools/ipc_fuzzer/message_lib/BUILD.gn
index 71cb3f87..2b39551 100644
--- a/tools/ipc_fuzzer/message_lib/BUILD.gn
+++ b/tools/ipc_fuzzer/message_lib/BUILD.gn
@@ -32,7 +32,7 @@
   if (is_win) {
     public_deps += [ "//chrome/chrome_elf:test_stubs" ]
   }
-  if (enable_plugins) {
+  if (enable_ppapi) {
     public_deps += [ "//ppapi/proxy:ipc" ]
   }
   deps = [ "//remoting/host/base" ]
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index e4b0ec65..4ab5a7b3 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -35013,6 +35013,7 @@
   <int value="1679" label="FILEMANAGERPRIVATE_OPENMANAGESYNCSETTINGS"/>
   <int value="1680" label="PASSWORDSPRIVATE_STARTAUTOMATEDPASSWORDCHANGE"/>
   <int value="1681" label="OFFSCREEN_CREATEDOCUMENT"/>
+  <int value="1682" label="PASSWORDSPRIVATE_REFRESHSCRIPTSIFNECESSARY"/>
 </enum>
 
 <enum name="ExtensionIconState">
@@ -56900,6 +56901,7 @@
   <int value="-1068278508" label="InfoCardAcknowledgementTracking:disabled"/>
   <int value="-1068197506" label="EnhancedNetworkVoices:enabled"/>
   <int value="-1067635248" label="SpeculativeResourcePrefetching:disabled"/>
+  <int value="-1065887406" label="PictureInPictureV2:disabled"/>
   <int value="-1065227777" label="CrOSAutoSelect:disabled"/>
   <int value="-1064733740" label="ui-show-composited-layer-borders"/>
   <int value="-1064302126"
@@ -57732,6 +57734,7 @@
   <int value="-536003711"
       label="OmniboxClobberTriggersContextualWebZeroSuggest:enabled"/>
   <int value="-535662704" label="BundledConnectionHelp:enabled"/>
+  <int value="-535226444" label="PictureInPictureV2:enabled"/>
   <int value="-535208779" label="enable-native-cups"/>
   <int value="-534722229" label="LauncherNudgeShortInterval:enabled"/>
   <int value="-534525820" label="MediaAppPhotosIntegrationImage:enabled"/>
@@ -82207,6 +82210,13 @@
   <int value="7" label="Incompatible, duration below threshold"/>
 </enum>
 
+<enum name="RemotingStartFailReason">
+  <int value="0" label="Cannot start multiple sessions"/>
+  <int value="1" label="Route terminated"/>
+  <int value="2" label="Invalid ANSWER message"/>
+  <int value="3" label="Remoting not permitted from the dialog"/>
+</enum>
+
 <enum name="RemotingStartTrigger">
   <int value="0" label="Unknown start trigger"/>
   <int value="1" label="Entered fullscreen"/>
@@ -101151,6 +101161,7 @@
   <int value="1975618905" label="chrome://app-list/"/>
   <int value="2040878656" label="chrome://bluetooth-internals/"/>
   <int value="2052019697" label="chrome://userimage/"/>
+  <int value="2111953935" label="chrome://topics-internals/"/>
   <int value="2114840772" label="chrome://drive-internals/"/>
   <int value="2120829362" label="chrome://account-manager-welcome/"/>
 </enum>
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml
index dca0fea..20103e9a 100644
--- a/tools/metrics/histograms/metadata/accessibility/histograms.xml
+++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -401,13 +401,14 @@
 </histogram>
 
 <histogram name="Accessibility.CrosAutoclick" enum="BooleanEnabled"
-    expires_after="2021-12-31">
+    expires_after="2023-07-01">
   <owner>kenjibaheux@google.com</owner>
   <owner>dtseng@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
     Whether the Chrome OS Autoclick feature is on (logged once 45 secs after
-    startup).
+    startup). Warning: this histogram was expired 2021-12-31 to 2022-07-07, data
+    might be missing.
   </summary>
 </histogram>
 
@@ -1989,7 +1990,7 @@
 </histogram>
 
 <histogram name="TextToSpeech.Event" enum="TextToSpeechEvent"
-    expires_after="2022-07-11">
+    expires_after="2023-07-01">
   <owner>dtseng@chromium.org</owner>
   <owner>katie@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
@@ -1999,9 +2000,10 @@
 </histogram>
 
 <histogram name="TextToSpeech.Utterance.FromExtensionAPI"
-    enum="TextToSpeechFromExtensionAPI" expires_after="2022-12-04">
+    enum="TextToSpeechFromExtensionAPI" expires_after="2023-07-01">
   <owner>dtseng@chromium.org</owner>
   <owner>katie@chromium.org</owner>
+  <owner>chrome-a11y-core@google.com</owner>
   <summary>
     Indicates if an utterance spoken via synthesized text-to-speech was
     triggered by the Chrome TTS extension API or the web speech API.
@@ -2009,8 +2011,9 @@
 </histogram>
 
 <histogram name="TextToSpeech.Utterance.HasVoiceName"
-    enum="TextToSpeechHasVoiceName" expires_after="2022-10-23">
+    enum="TextToSpeechHasVoiceName" expires_after="2023-07-01">
   <owner>katie@chromium.org</owner>
+  <owner>chrome-a11y-core@google.com</owner>
   <summary>
     True if an utterance spoken via synthesized text-to-speech requested a
     specific voice by name.
@@ -2018,8 +2021,9 @@
 </histogram>
 
 <histogram name="TextToSpeech.Utterance.Native" enum="TextToSpeechNative"
-    expires_after="2022-06-26">
+    expires_after="2023-07-01">
   <owner>katie@chromium.org</owner>
+  <owner>chrome-a11y-core@google.com</owner>
   <summary>
     True if an utterance is spoken with native speech provided by the operating
     system, otherwise it's spoken via a Chrome extension that implements
@@ -2028,9 +2032,10 @@
 </histogram>
 
 <histogram name="TextToSpeech.Utterance.Source" enum="TextToSpeechSource"
-    expires_after="M103">
+    expires_after="2023-07-01">
   <owner>joelriley@google.com</owner>
   <owner>katie@chromium.org</owner>
+  <owner>chrome-a11y-core@google.com</owner>
   <summary>
     ChromeOS source that triggered text-to-speech utterance via extension API,
     from a few known accessibility clients (Select-to-speak, ChromeVox).
@@ -2038,8 +2043,9 @@
 </histogram>
 
 <histogram name="TextToSpeech.Utterance.TextLength" units="bytes"
-    expires_after="2022-06-26">
+    expires_after="2023-07-01">
   <owner>katie@chromium.org</owner>
+  <owner>chrome-a11y-core@google.com</owner>
   <summary>
     The length of an utterance to be spoken via synthesized text-to-speech.
   </summary>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index 27cc82c..9829f839 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -3996,6 +3996,13 @@
   <summary>Measures the duration of each remoting session.</summary>
 </histogram>
 
+<histogram name="Media.Remoting.SessionStartFailedReason"
+    enum="RemotingStartFailReason" expires_after="2022-12-26">
+  <owner>muyaoxu@google.com</owner>
+  <owner>openscreen-eng@google.com</owner>
+  <summary>Tracks the reason that a session failed to start.</summary>
+</histogram>
+
 <histogram name="Media.Remoting.SessionStartTrigger"
     enum="RemotingStartTrigger" expires_after="2022-12-25">
   <owner>jophba@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/sb_client/histograms.xml b/tools/metrics/histograms/metadata/sb_client/histograms.xml
index c39f348c..775a2bea 100644
--- a/tools/metrics/histograms/metadata/sb_client/histograms.xml
+++ b/tools/metrics/histograms/metadata/sb_client/histograms.xml
@@ -458,22 +458,6 @@
   <token key="Action" variants="DownloadWarningAction"/>
 </histogram>
 
-<histogram name="SBClientDownload.{Analyzer}AnalysisRemoteValid"
-    enum="BooleanValid" expires_after="2022-08-08">
-  <owner>drubery@chromium.org</owner>
-  <owner>chrome-counter-abuse-alerts@google.com</owner>
-  <summary>
-    Records whether the analyzer for {Analyzer} is valid at the time of
-    analysis. Recorded once for each download with the appropriate file type.
-  </summary>
-  <token key="Analyzer">
-    <variant name="Dmg" summary=".dmg files"/>
-    <variant name="Document" summary="office documents"/>
-    <variant name="Rar" summary=".rar files"/>
-    <variant name="Zip" summary=".zip files"/>
-  </token>
-</histogram>
-
 <histogram name="SBClientDownload.{ArchiveType}ArchiveAnalysisResult"
     enum="ArchiveAnalysisResult" expires_after="2022-10-26">
   <owner>drubery@chromium.org</owner>
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py
index a771755f..b51b47f1 100644
--- a/tools/perf/core/bot_platforms.py
+++ b/tools/perf/core/bot_platforms.py
@@ -470,7 +470,7 @@
 ])
 _CHROMEOS_KEVIN_FYI_BENCHMARK_CONFIGS = PerfSuite([
     _GetBenchmarkConfig('rendering.desktop')])
-_LACROS_EVE_BENCHMARK_CONFIGS = PerfSuite(OFFICIAL_BENCHMARK_CONFIGS).Remove([
+_LACROS_BENCHMARK_CONFIGS = PerfSuite(OFFICIAL_BENCHMARK_CONFIGS).Remove([
     'blink_perf.display_locking',
     'v8.runtime_stats.top_25',
 ])
@@ -682,8 +682,10 @@
     _ANDROID_PIXEL4A_POWER_BENCHMARK_CONFIGS, 12, 'android')
 
 # Cros/Lacros
-LACROS_EVE_PERF = PerfPlatform('lacros-eve-perf', '',
-                               _LACROS_EVE_BENCHMARK_CONFIGS, 8, 'chromeos')
+LACROS_EVE_PERF = PerfPlatform('lacros-eve-perf', '', _LACROS_BENCHMARK_CONFIGS,
+                               8, 'chromeos')
+LACROS_X86_PERF = PerfPlatform('lacros-x86-perf', '', _LACROS_BENCHMARK_CONFIGS,
+                               12, 'chromeos')
 
 # FYI bots
 WIN_10_LOW_END_HP_CANDIDATE = PerfPlatform(
diff --git a/tools/perf/core/perf_benchmark_with_profiling_unittest.py b/tools/perf/core/perf_benchmark_with_profiling_unittest.py
index 8ff2eec..ac763ad 100644
--- a/tools/perf/core/perf_benchmark_with_profiling_unittest.py
+++ b/tools/perf/core/perf_benchmark_with_profiling_unittest.py
@@ -111,7 +111,7 @@
           fill_policy: DISCARD
         }
         buffers {
-          size_kb: 2048
+          size_kb: 190464
         }
 
         buffers {
@@ -122,6 +122,8 @@
             name: "linux.process_stats"
             target_buffer: 1
             process_stats_config {
+                scan_all_processes_on_start: true
+                record_thread_names: true
                 proc_stats_poll_ms: 100
             }
           }
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py
index f394b7d..10b0af42 100755
--- a/tools/perf/core/perf_data_generator.py
+++ b/tools/perf/core/perf_data_generator.py
@@ -1347,6 +1347,31 @@
             'device_type': 'eve',
         },
     },
+    'lacros-x86-perf': {
+        'tests': [
+            {
+                'isolate':
+                'performance_test_suite_octopus',
+                'extra_args': [
+                    # The magic hostname that resolves to a CrOS device in the test lab
+                    '--remote=variable_chromeos_device_hostname',
+                ],
+            },
+        ],
+        'platform':
+        'lacros',
+        'target_bits':
+        64,
+        'dimension': {
+            'pool': 'chrome.tests.perf',
+            # TODO(crbug.com/971204): Explicitly set the gpu to None to make
+            # chromium_swarming recipe_module ignore this dimension.
+            'gpu': None,
+            'os': 'ChromeOS',
+            'device_status': 'available',
+            'device_type': 'grabbiter',
+        },
+    },
 }
 
 # pylint: enable=line-too-long
@@ -1531,6 +1556,7 @@
 PERFORMANCE_TEST_SUITES = [
     'performance_test_suite',
     'performance_test_suite_eve',
+    'performance_test_suite_octopus',
     'performance_webview_test_suite',
     'performance_weblayer_test_suite',
 ]
diff --git a/tools/perf/core/perf_json_config_validator.py b/tools/perf/core/perf_json_config_validator.py
index 4c921cd..96e5d19e 100644
--- a/tools/perf/core/perf_json_config_validator.py
+++ b/tools/perf/core/perf_json_config_validator.py
@@ -48,6 +48,7 @@
 _PERFORMANCE_TEST_SUITES = {
     'performance_test_suite',
     'performance_test_suite_eve',
+    'performance_test_suite_octopus',
     'performance_webview_test_suite',
 }
 for suffix in android_browser_types.TELEMETRY_ANDROID_BROWSER_TARGET_SUFFIXES:
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index cc3cf47..e1e1bab 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@
             "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
         },
         "win": {
-            "hash": "f9217c1f466ed74c5e6010c84150e3f8b6ec9634",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/4440655d1a4a407c4ae59157a588aaedbcfe685e/trace_processor_shell.exe"
+            "hash": "c2034168e4a9eef267eaeff968d7098bf272c7cf",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/3c4bdd0f331990d7fae52ae52f56f5762614cc33/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893",
@@ -21,8 +21,8 @@
             "full_remote_path": "perfetto-luci-artifacts/v25.0/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "43056dc26144aa0c94240be9fb96e8112598ffd6",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/e535a96ea0270d6b5922b552b40e69d534d401e0/trace_processor_shell"
+            "hash": "fe1ec6d9316a0b6b959acfcdc11cfbfb70267e7f",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/acc008eff9c38f106b21ee30f6fac8741cb77878/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/perf/core/shard_maps/lacros-x86-perf_map.json b/tools/perf/core/shard_maps/lacros-x86-perf_map.json
new file mode 100644
index 0000000..6dc91ea
--- /dev/null
+++ b/tools/perf/core/shard_maps/lacros-x86-perf_map.json
@@ -0,0 +1,256 @@
+{
+    "0": {
+        "benchmarks": {
+            "blink_perf.accessibility": {
+                "abridged": false
+            },
+            "blink_perf.bindings": {
+                "abridged": false
+            },
+            "blink_perf.css": {
+                "end": 29,
+                "abridged": false
+            }
+        }
+    },
+    "1": {
+        "benchmarks": {
+            "blink_perf.css": {
+                "begin": 29,
+                "abridged": false
+            },
+            "blink_perf.dom": {
+                "abridged": false
+            },
+            "blink_perf.events": {
+                "abridged": false
+            },
+            "blink_perf.image_decoder": {
+                "abridged": false
+            },
+            "blink_perf.layout": {
+                "end": 48,
+                "abridged": false
+            }
+        }
+    },
+    "2": {
+        "benchmarks": {
+            "blink_perf.layout": {
+                "begin": 48,
+                "abridged": false
+            },
+            "blink_perf.owp_storage": {
+                "abridged": false
+            },
+            "blink_perf.paint": {
+                "abridged": false
+            },
+            "blink_perf.parser": {
+                "end": 20,
+                "abridged": false
+            }
+        }
+    },
+    "3": {
+        "benchmarks": {
+            "blink_perf.parser": {
+                "begin": 20,
+                "abridged": false
+            },
+            "blink_perf.shadow_dom": {
+                "abridged": false
+            },
+            "blink_perf.svg": {
+                "abridged": false
+            },
+            "blink_perf.webaudio": {
+                "abridged": false
+            },
+            "blink_perf.webcodecs": {
+                "abridged": false
+            },
+            "blink_perf.webgl": {
+                "abridged": false
+            },
+            "blink_perf.webgl_fast_call": {
+                "end": 3,
+                "abridged": false
+            }
+        }
+    },
+    "4": {
+        "benchmarks": {
+            "blink_perf.webgl_fast_call": {
+                "begin": 3,
+                "abridged": false
+            },
+            "desktop_ui": {
+                "abridged": false
+            },
+            "dummy_benchmark.noisy_benchmark_1": {
+                "abridged": false
+            },
+            "dummy_benchmark.stable_benchmark_1": {
+                "abridged": false
+            },
+            "jetstream": {
+                "abridged": false
+            },
+            "jetstream2": {
+                "abridged": false
+            },
+            "kraken": {
+                "abridged": false
+            },
+            "loading.desktop": {
+                "end": 66,
+                "abridged": false
+            }
+        }
+    },
+    "5": {
+        "benchmarks": {
+            "loading.desktop": {
+                "begin": 66,
+                "abridged": false
+            },
+            "media.desktop": {
+                "abridged": false
+            },
+            "memory.desktop": {
+                "abridged": false
+            },
+            "octane": {
+                "abridged": false
+            },
+            "power.desktop": {
+                "abridged": false
+            },
+            "rasterize_and_record_micro.top_25": {
+                "end": 11,
+                "abridged": false
+            }
+        }
+    },
+    "6": {
+        "benchmarks": {
+            "rasterize_and_record_micro.top_25": {
+                "begin": 11,
+                "abridged": false
+            },
+            "rendering.desktop": {
+                "end": 86,
+                "abridged": false
+            }
+        }
+    },
+    "7": {
+        "benchmarks": {
+            "rendering.desktop": {
+                "begin": 86,
+                "end": 185,
+                "abridged": false
+            }
+        }
+    },
+    "8": {
+        "benchmarks": {
+            "rendering.desktop": {
+                "begin": 185,
+                "end": 285,
+                "abridged": false
+            }
+        }
+    },
+    "9": {
+        "benchmarks": {
+            "rendering.desktop": {
+                "begin": 285,
+                "abridged": false
+            },
+            "rendering.desktop.notracing": {
+                "abridged": false
+            },
+            "speedometer": {
+                "abridged": false
+            },
+            "speedometer-future": {
+                "abridged": false
+            },
+            "speedometer2": {
+                "abridged": false
+            },
+            "speedometer2-future": {
+                "abridged": false
+            },
+            "speedometer2-pcscan": {
+                "abridged": false
+            },
+            "system_health.common_desktop": {
+                "end": 49,
+                "abridged": false
+            }
+        }
+    },
+    "10": {
+        "benchmarks": {
+            "system_health.common_desktop": {
+                "begin": 49,
+                "abridged": false
+            },
+            "system_health.memory_desktop": {
+                "end": 68,
+                "abridged": false
+            }
+        }
+    },
+    "11": {
+        "benchmarks": {
+            "system_health.memory_desktop": {
+                "begin": 68,
+                "abridged": false
+            },
+            "system_health.pcscan": {
+                "abridged": false
+            },
+            "tab_switching.typical_25": {
+                "abridged": false
+            },
+            "tracing.tracing_with_background_memory_infra": {
+                "abridged": false
+            },
+            "v8.browsing_desktop": {
+                "abridged": false
+            },
+            "v8.browsing_desktop-future": {
+                "abridged": false
+            },
+            "wasmpspdfkit": {
+                "abridged": false
+            },
+            "webrtc": {
+                "abridged": false
+            }
+        }
+    },
+    "extra_infos": {
+        "num_stories": 1191,
+        "predicted_min_shard_time": 990,
+        "predicted_min_shard_index": 0,
+        "predicted_max_shard_time": 1000,
+        "predicted_max_shard_index": 6,
+        "shard #0": 990,
+        "shard #1": 990,
+        "shard #2": 990,
+        "shard #3": 990,
+        "shard #4": 990,
+        "shard #5": 990,
+        "shard #6": 1000,
+        "shard #7": 990,
+        "shard #8": 1000,
+        "shard #9": 990,
+        "shard #10": 1000,
+        "shard #11": 990
+    }
+}
\ No newline at end of file
diff --git a/tools/perf/core/shard_maps/timing_data/lacros-x86-perf_timing.json b/tools/perf/core/shard_maps/timing_data/lacros-x86-perf_timing.json
new file mode 100644
index 0000000..0637a08
--- /dev/null
+++ b/tools/perf/core/shard_maps/timing_data/lacros-x86-perf_timing.json
@@ -0,0 +1 @@
+[]
\ No newline at end of file
diff --git a/tools/typescript/definitions/passwords_private.d.ts b/tools/typescript/definitions/passwords_private.d.ts
index 7baaeb4d..17b51b8 100644
--- a/tools/typescript/definitions/passwords_private.d.ts
+++ b/tools/typescript/definitions/passwords_private.d.ts
@@ -110,10 +110,15 @@
         note?: string;
       }
 
+      export interface CredentialIds {
+        accountId?: number;
+        deviceId?: number;
+      }
+
       export function recordPasswordsPageAccessInSettings(): void;
       export function changeSavedPassword(
           ids: Array<number>, params: ChangeSavedPasswordParams,
-          callback?: () => void): void;
+          callback?: (newIds: CredentialIds) => void): void;
       export function removeSavedPassword(id: number): void;
       export function removeSavedPasswords(ids: Array<number>): void;
       export function removePasswordException(id: number): void;
@@ -153,6 +158,8 @@
           credential: InsecureCredential, callback?: () => void): void;
       export function recordChangePasswordFlowStarted(
           credential: InsecureCredential, isManualFlow: boolean): void;
+      export function refreshScriptsIfNecessary(
+          callback?: () => void): void;
       export function startPasswordCheck(callback?: () => void): void;
       export function stopPasswordCheck(callback?: () => void): void;
       export function getPasswordCheckStatus(
diff --git a/ui/display/display_list.cc b/ui/display/display_list.cc
index dcf81a4..c0ff86ea 100644
--- a/ui/display/display_list.cc
+++ b/ui/display/display_list.cc
@@ -92,6 +92,10 @@
     local_display->set_color_depth(display.color_depth());
     changed_values |= DisplayObserver::DISPLAY_METRIC_COLOR_SPACE;
   }
+  if (local_display->label() != display.label()) {
+    local_display->set_label(display.label());
+    changed_values |= DisplayObserver::DISPLAY_METRIC_LABEL;
+  }
   if (local_display->GetSizeInPixel() != display.GetSizeInPixel()) {
     local_display->set_size_in_pixels(display.GetSizeInPixel());
   }
diff --git a/ui/display/display_list_unittest.cc b/ui/display/display_list_unittest.cc
index c84b12b..6840e06 100644
--- a/ui/display/display_list_unittest.cc
+++ b/ui/display/display_list_unittest.cc
@@ -65,6 +65,7 @@
                   "scale_factor", &parts);
     AddPartChange(changed_metrics, DISPLAY_METRIC_ROTATION, "rotation", &parts);
     AddPartChange(changed_metrics, DISPLAY_METRIC_PRIMARY, "primary", &parts);
+    AddPartChange(changed_metrics, DISPLAY_METRIC_LABEL, "label", &parts);
 
     AddChange("Changed id=" + base::NumberToString(display.id()) + parts);
   }
@@ -88,6 +89,15 @@
     EXPECT_EQ("Changed id=2 bounds", observer.GetAndClearChanges());
   }
 
+  // Update the label.
+  {
+    Display updated_display = *(display_list.displays().begin());
+    updated_display.set_label("new_label");
+    display_list.UpdateDisplay(updated_display, DisplayList::Type::PRIMARY);
+    EXPECT_EQ("Changed id=2 label", observer.GetAndClearChanges());
+    EXPECT_EQ("new_label", display_list.FindDisplayById(2)->label());
+  }
+
   // Add another.
   display_list.AddDisplay(Display(3, gfx::Rect(0, 0, 809, 802)),
                           DisplayList::Type::NOT_PRIMARY);
diff --git a/ui/display/display_observer.h b/ui/display/display_observer.h
index 57db4c4b..e63102c 100644
--- a/ui/display/display_observer.h
+++ b/ui/display/display_observer.h
@@ -28,6 +28,7 @@
     DISPLAY_METRIC_COLOR_SPACE = 1 << 6,
     DISPLAY_METRIC_REFRESH_RATE = 1 << 7,
     DISPLAY_METRIC_INTERLACED = 1 << 8,
+    DISPLAY_METRIC_LABEL = 1 << 9,
   };
 
   // This may be called before other methods to signal changes are about to
diff --git a/ui/display/manager/display_manager.cc b/ui/display/manager/display_manager.cc
index 121b279..1b3dc00f 100644
--- a/ui/display/manager/display_manager.cc
+++ b/ui/display/manager/display_manager.cc
@@ -989,6 +989,9 @@
         metrics |= DisplayObserver::DISPLAY_METRIC_INTERLACED;
       }
 
+      if (current_display.label() != new_display.label())
+        metrics |= DisplayObserver::DISPLAY_METRIC_LABEL;
+
       if (metrics != DisplayObserver::DISPLAY_METRIC_NONE) {
         display_changes.insert(
             std::pair<size_t, uint32_t>(new_displays.size(), metrics));
@@ -2085,6 +2088,9 @@
   new_display.set_touch_support(display_info.touch_support());
   new_display.set_maximum_cursor_size(display_info.maximum_cursor_size());
   new_display.set_color_spaces(display_info.display_color_spaces());
+  new_display.set_display_frequency(display_info.refresh_rate());
+  new_display.set_label(display_info.name());
+
   constexpr uint32_t kNormalBitDepthNumBitsPerChannel = 8u;
   if (display_info.bits_per_channel() > kNormalBitDepthNumBitsPerChannel) {
     new_display.set_depth_per_component(display_info.bits_per_channel());
@@ -2092,8 +2098,6 @@
     new_display.set_color_depth(display_info.bits_per_channel() *
                                 kRGBNumChannels);
   }
-  new_display.set_display_frequency(display_info.refresh_rate());
-
   if (internal_display_has_accelerometer_ && IsInternalDisplayId(id)) {
     new_display.set_accelerometer_support(
         Display::AccelerometerSupport::AVAILABLE);
@@ -2119,6 +2123,7 @@
   new_display.set_maximum_cursor_size(display_info.maximum_cursor_size());
   new_display.set_rotation(display_info.GetActiveRotation());
   new_display.set_panel_rotation(display_info.GetLogicalActiveRotation());
+  new_display.set_label(display_info.name());
   return new_display;
 }
 
diff --git a/ui/events/blink/web_input_event_unittest.cc b/ui/events/blink/web_input_event_unittest.cc
index 046e317..59788b2 100644
--- a/ui/events/blink/web_input_event_unittest.cc
+++ b/ui/events/blink/web_input_event_unittest.cc
@@ -427,6 +427,8 @@
 }
 
 TEST(WebInputEventTest, WheelEvent) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndDisableFeature(features::kPercentBasedScrolling);
   const int kDeltaX = 14;
   const int kDeltaY = -3;
   ui::MouseWheelEvent ui_event(
diff --git a/ui/gfx/geometry/resize_utils.cc b/ui/gfx/geometry/resize_utils.cc
index e3a70eb..e6a2aba 100644
--- a/ui/gfx/geometry/resize_utils.cc
+++ b/ui/gfx/geometry/resize_utils.cc
@@ -35,34 +35,47 @@
 void SizeRectToAspectRatio(ResizeEdge resize_edge,
                            float aspect_ratio,
                            const Size& min_window_size,
-                           const Size& max_window_size,
+                           absl::optional<Size> max_window_size,
                            Rect* rect) {
   DCHECK_GT(aspect_ratio, 0.0f);
-  DCHECK_GE(max_window_size.width(), min_window_size.width());
-  DCHECK_GE(max_window_size.height(), min_window_size.height());
+  if (max_window_size.has_value()) {
+    DCHECK_GE(max_window_size->width(), min_window_size.width());
+    DCHECK_GE(max_window_size->height(), min_window_size.height());
+    DCHECK(Rect(rect->origin(), *max_window_size).Contains(*rect))
+        << rect->ToString() << " is larger than the maximum size "
+        << max_window_size->ToString();
+  }
   DCHECK(rect->Contains(Rect(rect->origin(), min_window_size)))
       << rect->ToString() << " is smaller than the minimum size "
       << min_window_size.ToString();
-  DCHECK(Rect(rect->origin(), max_window_size).Contains(*rect))
-      << rect->ToString() << " is larger than the maximum size "
-      << max_window_size.ToString();
 
   Size new_size = rect->size();
   if (IsResizingHorizontally(resize_edge)) {
     new_size.set_height(base::ClampRound(new_size.width() / aspect_ratio));
     if (min_window_size.height() > new_size.height() ||
-        new_size.height() > max_window_size.height()) {
-      new_size.set_height(base::clamp(new_size.height(),
-                                      min_window_size.height(),
-                                      max_window_size.height()));
+        (max_window_size.has_value() &&
+         new_size.height() > max_window_size->height())) {
+      if (max_window_size.has_value()) {
+        new_size.set_height(base::clamp(new_size.height(),
+                                        min_window_size.height(),
+                                        max_window_size->height()));
+      } else {
+        new_size.set_height(min_window_size.height());
+      }
       new_size.set_width(base::ClampRound(new_size.height() * aspect_ratio));
     }
   } else {
     new_size.set_width(base::ClampRound(new_size.height() * aspect_ratio));
     if (min_window_size.width() > new_size.width() ||
-        new_size.width() > max_window_size.width()) {
-      new_size.set_width(base::clamp(new_size.width(), min_window_size.width(),
-                                     max_window_size.width()));
+        (max_window_size.has_value() &&
+         new_size.width() > max_window_size->width())) {
+      if (max_window_size.has_value()) {
+        new_size.set_width(base::clamp(new_size.width(),
+                                       min_window_size.width(),
+                                       max_window_size->width()));
+      } else {
+        new_size.set_width(min_window_size.width());
+      }
       new_size.set_height(base::ClampRound(new_size.width() / aspect_ratio));
     }
   }
@@ -70,7 +83,9 @@
   // The dimensions might still be outside of the allowed ranges at this point.
   // This happens when the aspect ratio makes it impossible to fit |rect|
   // within the size limits without letter-/pillarboxing.
-  new_size.SetToMin(max_window_size);
+  if (max_window_size.has_value())
+    new_size.SetToMin(*max_window_size);
+
   new_size.SetToMax(min_window_size);
 
   // |rect| bounds before sizing to aspect ratio.
diff --git a/ui/gfx/geometry/resize_utils.h b/ui/gfx/geometry/resize_utils.h
index 318a31b..ddb0da43 100644
--- a/ui/gfx/geometry/resize_utils.h
+++ b/ui/gfx/geometry/resize_utils.h
@@ -5,6 +5,7 @@
 #ifndef UI_GFX_GEOMETRY_RESIZE_UTILS_H_
 #define UI_GFX_GEOMETRY_RESIZE_UTILS_H_
 
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/geometry_export.h"
 
 namespace gfx {
@@ -28,12 +29,10 @@
 // |min_window_size| and |max_window_size| are expected to adhere to the
 // given aspect ratio.
 // |aspect_ratio| must be valid and is found using width / height.
-// TODO(apacible): |max_window_size| is expected to be non-empty. Handle
-// unconstrained max sizes and sizing when windows are maximized.
 void GEOMETRY_EXPORT SizeRectToAspectRatio(ResizeEdge resize_edge,
                                            float aspect_ratio,
                                            const Size& min_window_size,
-                                           const Size& max_window_size,
+                                           absl::optional<Size> max_window_size,
                                            Rect* rect);
 
 }  // namespace gfx
diff --git a/ui/gfx/geometry/resize_utils_unittest.cc b/ui/gfx/geometry/resize_utils_unittest.cc
index bf1e90b..d7db548 100644
--- a/ui/gfx/geometry/resize_utils_unittest.cc
+++ b/ui/gfx/geometry/resize_utils_unittest.cc
@@ -53,16 +53,16 @@
   ResizeEdge resize_edge{};
   float aspect_ratio = 0.0f;
   Size min_size;
-  Size max_size;
+  absl::optional<Size> max_size;
   Rect input_rect;
   Rect expected_output_rect;
 
   std::string ToString() const {
-    return base::StrCat({HitTestToString(resize_edge),
-                         " ratio=", base::NumberToString(aspect_ratio), " [",
-                         min_size.ToString(), "..", max_size.ToString(), "] ",
-                         input_rect.ToString(), " -> ",
-                         expected_output_rect.ToString()});
+    return base::StrCat(
+        {HitTestToString(resize_edge), " ratio=",
+         base::NumberToString(aspect_ratio), " [", min_size.ToString(), "..",
+         max_size.has_value() ? max_size->ToString() : "nullopt", "] ",
+         input_rect.ToString(), " -> ", expected_output_rect.ToString()});
   }
 };
 
@@ -121,6 +121,11 @@
      kMaxSizeHorizontal,
      Rect(100, 100, kMaxSizeHorizontal.height(), kMaxSizeHorizontal.height()),
      Rect(100, 100, kMaxSizeHorizontal.height(), kMaxSizeHorizontal.height())},
+
+    // Dragging the top-left resizer left.
+    // No max size specified.
+    {ResizeEdge::kTopLeft, kAspectRatioSquare, kMinSizeHorizontal,
+     absl::nullopt, Rect(102, 100, 22, 24), Rect(102, 102, 22, 22)},
 };
 
 const SizingParams kSizeRectToHorizontalAspectRatioTestCases[] = {
@@ -143,6 +148,11 @@
      kMaxSizeHorizontal,
      Rect(100, 100, kMaxSizeHorizontal.width(), kMaxSizeHorizontal.height()),
      Rect(100, 100, kMaxSizeHorizontal.width(), kMaxSizeHorizontal.height())},
+
+    // Dragging the left resizer left.
+    // No max size specified.
+    {ResizeEdge::kLeft, kAspectRatioHorizontal, kMinSizeHorizontal,
+     absl::nullopt, Rect(96, 100, 48, 22), Rect(96, 98, 48, 24)},
 };
 
 const SizingParams kSizeRectToVerticalAspectRatioTestCases[] = {
@@ -163,6 +173,11 @@
     {ResizeEdge::kTop, kAspectRatioVertical, kMinSizeVertical, kMaxSizeVertical,
      Rect(100, 100, kMaxSizeVertical.width(), kMaxSizeVertical.height()),
      Rect(100, 100, kMaxSizeVertical.width(), kMaxSizeVertical.height())},
+
+    // Dragging the right resizer right.
+    // No max size specified.
+    {ResizeEdge::kRight, kAspectRatioVertical, kMinSizeVertical, absl::nullopt,
+     Rect(100, 100, 24, 44), Rect(100, 100, 24, 48)},
 };
 
 INSTANTIATE_TEST_SUITE_P(
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc
index 6250efd..827f6fc 100644
--- a/ui/views/win/hwnd_message_handler.cc
+++ b/ui/views/win/hwnd_message_handler.cc
@@ -3671,8 +3671,13 @@
   delegate_->GetMinMaxSize(&min_window_size, &max_window_size);
   min_window_size = delegate_->DIPToScreenSize(min_window_size);
   max_window_size = delegate_->DIPToScreenSize(max_window_size);
+
+  absl::optional<gfx::Size> max_size_param;
+  if (!max_window_size.IsEmpty())
+    max_size_param = max_window_size;
+
   gfx::SizeRectToAspectRatio(GetWindowResizeEdge(param), aspect_ratio_.value(),
-                             min_window_size, max_window_size, window_rect);
+                             min_window_size, max_size_param, window_rect);
 }
 
 POINT HWNDMessageHandler::GetCursorPos() const {