diff --git a/DEPS b/DEPS
index 2e36605..6854b64 100644
--- a/DEPS
+++ b/DEPS
@@ -253,7 +253,7 @@
   # 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': 'a43115cb25208593e54821dd47947d436232eb84',
+  'skia_revision': '597877ab4a62fb4b7035f50bdbc1313f6f53c7c8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -261,15 +261,15 @@
   # 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': '74eac5e5a506e096f6d94d1531ea643093d566be',
+  'angle_revision': '83d3a98cde77ad8e5b86f8dd93d134f286eb15cf',
   # 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': 'a7e5b3eb5745434414466e0e8dc898fa285cc6a4',
+  'swiftshader_revision': 'da0c7acda5cc22d29f884f1cfe1cb76b11f61440',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '96f11830ebcb757ae919d286438a074e94c15508',
+  'pdfium_revision': 'a1820b26d7868568fca85296099cccff8f9aa242',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -328,7 +328,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': '0a2413e991fb5a6dbe2ac49367ffcdfb06dc9123',
+  'devtools_frontend_revision': '430ef0b9dd1ab8ae648785161a3c48a120a2cd54',
   # 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.
@@ -1515,7 +1515,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '8933edf7ded6d06c0b0b57c5ce9aa47a8ac9e09b',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '361bf1871e2aef2569778faa1e3c6131d52910ed',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1697,7 +1697,7 @@
   'src/third_party/usrsctp/usrsctplib':
     Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + '62d7d0c928c9a040dce96aa2f16c00e7e67d59cb',
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@73ae3e82193269de470fdd37a3390e643f8fe03a',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@93a09934a266285637526b22d72cfd968f02927d',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907',
@@ -1736,7 +1736,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '7afd2efc27572eda0e9b3a8c0831b47f5e6c3353',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '429c1bd74d5b821a360be6a215bcbe7c422bedeb',
+    Var('webrtc_git') + '/src.git' + '@' + '5c8993cba099368b6c02a5fe6d3c2cc603168209',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1806,7 +1806,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@e7c5a50b735eeea0a0fc83ef43c8478d31e7f82a',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@02bbd6ec264bd2f59e15164aae205c94a22f036a',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
index e7a4117..dd83e61 100644
--- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
+++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -162,8 +162,6 @@
                             + "interact with a payment form."),
             Flag.baseFeature(AutofillFeatures.AUTOFILL_ENABLE_AUGMENTED_PHONE_COUNTRY_CODE,
                     "Enables support for phone code number fields with additional text."),
-            Flag.baseFeature(AutofillFeatures.AUTOFILL_DISPLACE_REMOVED_FORMS,
-                    "Fixes memory leaks in the renderer- and browser-form caches."),
             Flag.baseFeature(AutofillFeatures.AUTOFILL_USE_UNASSOCIATED_LISTED_ELEMENTS,
                     "Caches unowned listed elements in the document."),
             Flag.baseFeature(AutofillFeatures.AUTOFILL_PARSING_PATTERN_PROVIDER,
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java
index 5e1e7b8..a4890dc 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientShouldInterceptRequestTest.java
@@ -29,7 +29,6 @@
 import org.chromium.android_webview.test.util.JSUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.test.util.CallbackHelper;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.TestFileUtil;
 import org.chromium.components.embedder_support.util.WebResourceResponseInfo;
@@ -269,7 +268,6 @@
     @Test
     @SmallTest
     @Feature({"AndroidWebView"})
-    @DisabledTest(message = "https://crbug.com/1312394")
     public void testDoesNotCrashOnInvalidData_NullInputStream() throws Throwable {
         final String aboutPageUrl = addAboutPageToTestServer(mWebServer);
 
@@ -278,10 +276,6 @@
         int callCount = mShouldInterceptRequestHelper.getCallCount();
         mActivityTestRule.loadUrlAsync(mAwContents, aboutPageUrl);
         mShouldInterceptRequestHelper.waitForCallback(callCount);
-        Assert.assertEquals(1,
-                RecordHistogram.getHistogramValueCountForTesting(
-                        "Android.WebView.ShouldInterceptRequest.InterceptionType2",
-                        InterceptionType.HTTP));
     }
 
     @Test
@@ -617,6 +611,10 @@
 
         Assert.assertEquals(expectedTitle, mActivityTestRule.getTitleOnUiThread(mAwContents));
         Assert.assertEquals(0, mWebServer.getRequestCount("/" + CommonResources.ABOUT_FILENAME));
+        Assert.assertEquals(1,
+                RecordHistogram.getHistogramValueCountForTesting(
+                        "Android.WebView.ShouldInterceptRequest.InterceptionType2",
+                        InterceptionType.HTTP));
     }
 
     @Test
diff --git a/apps/launcher.cc b/apps/launcher.cc
index f5d5072..53bbf55d 100644
--- a/apps/launcher.cc
+++ b/apps/launcher.cc
@@ -15,6 +15,7 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/ref_counted.h"
+#include "base/notreached.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/task_traits.h"
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 42a6b8de..054ea8fe 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -1081,6 +1081,8 @@
     "system/cast/unified_cast_detailed_view_controller.h",
     "system/dark_mode/dark_mode_feature_pod_controller.cc",
     "system/dark_mode/dark_mode_feature_pod_controller.h",
+    "system/diagnostics/diagnostics_browser_delegate.cc",
+    "system/diagnostics/diagnostics_browser_delegate.h",
     "system/diagnostics/diagnostics_log_controller.cc",
     "system/diagnostics/diagnostics_log_controller.h",
     "system/eche/eche_icon_loading_indicator_view.cc",
@@ -1289,6 +1291,8 @@
     "system/network/network_info.h",
     "system/network/network_info_bubble.cc",
     "system/network/network_info_bubble.h",
+    "system/network/network_list_header_view.cc",
+    "system/network/network_list_header_view.h",
     "system/network/network_list_view.cc",
     "system/network/network_list_view.h",
     "system/network/network_list_view_controller.cc",
diff --git a/ash/ash_prefs.cc b/ash/ash_prefs.cc
index 3d59d18..44c318a 100644
--- a/ash/ash_prefs.cc
+++ b/ash/ash_prefs.cc
@@ -122,6 +122,8 @@
                                  speech::kUsEnglishLocale);
     registry->RegisterStringPref(language::prefs::kApplicationLocale,
                                  std::string());
+    registry->RegisterStringPref(language::prefs::kPreferredLanguages,
+                                 std::string());
   }
 }
 
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index bb23b28..5bacff9 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -475,10 +475,6 @@
 const base::Feature kEcheSWADebugMode{"EcheSWADebugMode",
                                       base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Enables the Eche SWA to run in the background.
-const base::Feature kEcheSWAInBackground{"EcheSWAInBackground",
-                                         base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Enables background blur for the app list, shelf, unified system tray,
 // autoclick menu, etc. Also enables the AppsGridView mask layer, slower devices
 // may have choppier app list animations while in this mode. crbug.com/765292.
@@ -839,11 +835,6 @@
 const base::Feature kInstantTethering{"InstantTethering",
                                       base::FEATURE_ENABLED_BY_DEFAULT};
 
-// Enables using arrow keys for display arrangement in display settings page.
-const base::Feature kKeyboardBasedDisplayArrangementInSettings{
-    "KeyboardBasedDisplayArrangementInSettings",
-    base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Enables to use lacros-chrome as the only web browser on Chrome OS.
 // This works only when both LacrosSupport and LacrosPrimary below are enabled.
 // NOTE: Use crosapi::browser_util::IsAshWebBrowserEnabled() instead of checking
@@ -1624,10 +1615,6 @@
   return base::FeatureList::IsEnabled(kEcheSWADebugMode);
 }
 
-bool IsEcheSWAInBackgroundEnabled() {
-  return base::FeatureList::IsEnabled(kEcheSWAInBackground);
-}
-
 bool IsESimPolicyEnabled() {
   return base::FeatureList::IsEnabled(kESimPolicy);
 }
@@ -1752,11 +1739,6 @@
   return base::FeatureList::IsEnabled(kEnableKeyboardBacklightToggle);
 }
 
-bool IsKeyboardBasedDisplayArrangementInSettingsEnabled() {
-  return base::FeatureList::IsEnabled(
-      kKeyboardBasedDisplayArrangementInSettings);
-}
-
 bool IsLanguagePacksEnabled() {
   return base::FeatureList::IsEnabled(kHandwritingLegacyRecognition) ||
          base::FeatureList::IsEnabled(kHandwritingLegacyRecognitionAllLang);
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 2bd4b663..243f97c0 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -194,7 +194,6 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kEcheSWA;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kEcheCustomWidget;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kEcheSWADebugMode;
-COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kEcheSWAInBackground;
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kEnableBackgroundBlur;
 COMPONENT_EXPORT(ASH_CONSTANTS)
@@ -329,8 +328,6 @@
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kImprovedDesksKeyboardShortcuts;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kInstantTethering;
-COMPONENT_EXPORT(ASH_CONSTANTS)
-extern const base::Feature kKeyboardBasedDisplayArrangementInSettings;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLacrosOnly;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLacrosPrimary;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLacrosSupport;
@@ -596,7 +593,6 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsEcheSWAEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsEcheCustomWidgetEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsEcheSWADebugModeEnabled();
-COMPONENT_EXPORT(ASH_CONSTANTS) bool IsEcheSWAInBackgroundEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsESimPolicyEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsExtendedOpenVpnSettingsEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsFamilyLinkOnSchoolDeviceEnabled();
@@ -630,8 +626,6 @@
 bool IsInstantTetheringBackgroundAdvertisingSupported();
 COMPONENT_EXPORT(ASH_CONSTANTS)
 bool IsKeyboardBacklightToggleEnabled();
-COMPONENT_EXPORT(ASH_CONSTANTS)
-bool IsKeyboardBasedDisplayArrangementInSettingsEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsLanguagePacksEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsLauncherAppSortEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS)
diff --git a/ash/public/cpp/desk_template.cc b/ash/public/cpp/desk_template.cc
index fe2d23f..f5ef2b7e 100644
--- a/ash/public/cpp/desk_template.cc
+++ b/ash/public/cpp/desk_template.cc
@@ -55,6 +55,7 @@
   if (desk_restore_data_)
     desk_template->set_desk_restore_data(desk_restore_data_->Clone());
   desk_template->set_launch_id(launch_id_);
+  desk_template->set_type(type_);
   return desk_template;
 }
 
@@ -83,8 +84,8 @@
     case DeskTemplateType::kTemplate:
       result += "template\n";
       break;
-    case DeskTemplateType::kSavedDesk:
-      result += "saved desk\n";
+    case DeskTemplateType::kSaveAndRecall:
+      result += "save and recall\n";
       break;
   }
 
diff --git a/ash/public/cpp/desk_template.h b/ash/public/cpp/desk_template.h
index 3755491..671a4b1 100644
--- a/ash/public/cpp/desk_template.h
+++ b/ash/public/cpp/desk_template.h
@@ -34,8 +34,8 @@
   // Regular desk template.
   kTemplate = 0,
 
-  // Saved desk (Save & Recall).
-  kSavedDesk,
+  // Desk saved for Save & Recall.
+  kSaveAndRecall,
 };
 
 // Class to represent a desk template. It can be used to create a desk with
diff --git a/ash/public/cpp/style/color_provider.h b/ash/public/cpp/style/color_provider.h
index 3b8eb79..4b9c764 100644
--- a/ash/public/cpp/style/color_provider.h
+++ b/ash/public/cpp/style/color_provider.h
@@ -133,7 +133,13 @@
     kProgressBarColorBackground,
 
     // Color used to highlight a hovered view.
-    kHighlightColorHover
+    kHighlightColorHover,
+
+    // Color for the background of battery system info view.
+    kBatterySystemInfoBackgroundColor,
+
+    // Color for the battery icon in the system info view.
+    kBatterySystemInfoIconColor
   };
 
   static ColorProvider* Get();
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
index b669ddf..e5e4b7b 100644
--- a/ash/root_window_controller.cc
+++ b/ash/root_window_controller.cc
@@ -803,18 +803,22 @@
         REORDER_BY_NAME_ALPHABETICAL,
         l10n_util::GetStringUTF16(
             IDS_ASH_LAUNCHER_APPS_GRID_CONTEXT_MENU_REORDER_BY_NAME),
-        ui::ImageModel::FromVectorIcon(kSortAlphabeticalIcon));
+        ui::ImageModel::FromVectorIcon(kSortAlphabeticalIcon,
+                                       ui::kColorAshSystemUIMenuIcon));
     sort_apps_submenu_->AddItemWithIcon(
         REORDER_BY_COLOR,
         l10n_util::GetStringUTF16(
             IDS_ASH_LAUNCHER_APPS_GRID_CONTEXT_MENU_REORDER_BY_COLOR),
-        ui::ImageModel::FromVectorIcon(kSortColorIcon));
+        ui::ImageModel::FromVectorIcon(kSortColorIcon,
+                                       ui::kColorAshSystemUIMenuIcon));
     menu_model->AddSeparator(ui::NORMAL_SEPARATOR);
     menu_model->AddSubMenuWithIcon(
         REORDER_SUBMENU,
         l10n_util::GetStringUTF16(
             IDS_ASH_LAUNCHER_APPS_GRID_CONTEXT_MENU_REORDER_TITLE),
-        sort_apps_submenu_.get(), ui::ImageModel::FromVectorIcon(kReorderIcon));
+        sort_apps_submenu_.get(),
+        ui::ImageModel::FromVectorIcon(kReorderIcon,
+                                       ui::kColorAshSystemUIMenuIcon));
   }
 
   root_window_menu_model_adapter_->Run(
diff --git a/ash/shell.cc b/ash/shell.cc
index 9ab15920..bbf2cf1 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -713,6 +713,9 @@
   // before destroying |session_controller_|.
   accelerator_controller_->Shutdown();
 
+  // Must be destructed before hps_orientation_controller_.
+  power_prefs_.reset();
+
   // Must be destructed before the tablet mode and message center controllers,
   // both of which these rely on.
   hps_notify_controller_.reset();
@@ -787,7 +790,6 @@
   event_client_.reset();
   toplevel_window_event_handler_.reset();
   visibility_controller_.reset();
-  power_prefs_.reset();
 
   tray_action_.reset();
 
@@ -1009,10 +1011,15 @@
     rgb_keyboard_manager_ = std::make_unique<RgbKeyboardManager>();
   }
 
-  // Observes the tablet mode controller and adds a notification to the message
-  // center, so must be constructed after both.
-  if (features::IsSnoopingProtectionEnabled()) {
+  // Observes the tablet mode controller if any hps feature is enabled.
+  if (features::IsSnoopingProtectionEnabled() ||
+      features::IsQuickDimEnabled()) {
     hps_orientation_controller_ = std::make_unique<HpsOrientationController>();
+  }
+
+  // Construct HpsNotifyController, must be constructed after
+  // HpsOrientationController.
+  if (features::IsSnoopingProtectionEnabled()) {
     hps_notify_controller_ = std::make_unique<HpsNotifyController>();
   }
 
diff --git a/ash/shell.h b/ash/shell.h
index abf52791..1ee5f94f 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -781,6 +781,7 @@
   std::unique_ptr<FloatController> float_controller_;
   std::unique_ptr<GeolocationController> geolocation_controller_;
   std::unique_ptr<HoldingSpaceController> holding_space_controller_;
+  std::unique_ptr<PowerPrefs> power_prefs_;
   std::unique_ptr<HpsNotifyController> hps_notify_controller_;
   std::unique_ptr<HpsOrientationController> hps_orientation_controller_;
   std::unique_ptr<ImeControllerImpl> ime_controller_;
@@ -892,7 +893,6 @@
   std::unique_ptr<PeripheralBatteryListener> peripheral_battery_listener_;
   std::unique_ptr<PeripheralBatteryNotifier> peripheral_battery_notifier_;
   std::unique_ptr<PowerEventObserver> power_event_observer_;
-  std::unique_ptr<PowerPrefs> power_prefs_;
   std::unique_ptr<ui::UserActivityPowerManagerNotifier> user_activity_notifier_;
   std::unique_ptr<VideoActivityNotifier> video_activity_notifier_;
   std::unique_ptr<StickyKeysController> sticky_keys_controller_;
diff --git a/ash/style/ash_color_provider.cc b/ash/style/ash_color_provider.cc
index cb18404..54e1db8 100644
--- a/ash/style/ash_color_provider.cc
+++ b/ash/style/ash_color_provider.cc
@@ -430,6 +430,10 @@
     case ContentLayerType::kButtonIconColor:
     case ContentLayerType::kButtonLabelColor:
       return use_dark_color ? gfx::kGoogleGrey200 : gfx::kGoogleGrey900;
+    case ContentLayerType::kBatterySystemInfoBackgroundColor:
+      return use_dark_color ? gfx::kGoogleGreen300 : gfx::kGoogleGreen600;
+    case ContentLayerType::kBatterySystemInfoIconColor:
+      return use_dark_color ? gfx::kGoogleGrey900 : gfx::kGoogleGrey200;
     default:
       return ResolveColor(type, use_dark_color);
   }
diff --git a/ash/system/OWNERS b/ash/system/OWNERS
index e3bc634..3885bf6a 100644
--- a/ash/system/OWNERS
+++ b/ash/system/OWNERS
@@ -1,3 +1,4 @@
 amehfooz@chromium.org
+leandre@chromium.org
 newcomer@chromium.org
 tbarzic@chromium.org
diff --git a/ash/system/accessibility/switch_access/switch_access_menu_view.cc b/ash/system/accessibility/switch_access/switch_access_menu_view.cc
index 5c053180..2b000bf 100644
--- a/ash/system/accessibility/switch_access/switch_access_menu_view.cc
+++ b/ash/system/accessibility/switch_access/switch_access_menu_view.cc
@@ -17,7 +17,7 @@
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/accessibility/mojom/ax_node_data.mojom-shared.h"
 #include "ui/events/event.h"
-#include "ui/views/layout/grid_layout.h"
+#include "ui/views/layout/table_layout.h"
 
 namespace ash {
 
@@ -113,16 +113,16 @@
 void SwitchAccessMenuView::SetActions(std::vector<std::string> actions) {
   RemoveAllChildViews();
 
-  views::GridLayout* layout =
-      SetLayoutManager(std::make_unique<views::GridLayout>());
-  views::ColumnSet* columns = layout->AddColumnSet(0);
-  columns->AddPaddingColumn(0 /* resize_percent */, kBubbleMenuPadding);
+  views::TableLayout* layout =
+      SetLayoutManager(std::make_unique<views::TableLayout>());
+  layout->AddPaddingColumn(views::TableLayout::kFixedSize, kBubbleMenuPadding);
   for (int i = 0; i < kMaxColumns; i++) {
-    columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER,
-                       0, /* resize_percent */
-                       views::GridLayout::ColumnSize::kFixed,
-                       SwitchAccessMenuButton::kWidthDip, 0);
-    columns->AddPaddingColumn(0 /* resize_percent */, kBubbleMenuPadding);
+    layout->AddColumn(
+        views::LayoutAlignment::kCenter, views::LayoutAlignment::kCenter,
+        views::TableLayout::kFixedSize, views::TableLayout::ColumnSize::kFixed,
+        SwitchAccessMenuButton::kWidthDip, 0);
+    layout->AddPaddingColumn(views::TableLayout::kFixedSize,
+                             kBubbleMenuPadding);
   }
 
   int button_count = 0;
@@ -133,14 +133,15 @@
     ButtonInfo info = it->second;
     // If this is the first button of a new row, tell the layout to start a
     // new row.
-    if (button_count % kMaxColumns == 0)
-      layout->StartRowWithPadding(0, 0, 0, kBubbleMenuPadding);
-    layout->AddView(std::make_unique<SwitchAccessMenuButton>(action, *info.icon,
-                                                             info.label_id));
-    button_count++;
+    if (button_count % kMaxColumns == 0) {
+      layout->AddPaddingRow(views::TableLayout::kFixedSize, kBubbleMenuPadding);
+      layout->AddRows(1, views::TableLayout::kFixedSize);
+    }
+    AddChildView(std::make_unique<SwitchAccessMenuButton>(action, *info.icon,
+                                                          info.label_id));
+    ++button_count;
   }
-  layout->AddPaddingRow(0, kBubbleMenuPadding);
-  InvalidateLayout();
+  layout->AddPaddingRow(views::TableLayout::kFixedSize, kBubbleMenuPadding);
 }
 
 int SwitchAccessMenuView::GetBubbleWidthDip() const {
diff --git a/ash/system/diagnostics/diagnostics_browser_delegate.cc b/ash/system/diagnostics/diagnostics_browser_delegate.cc
new file mode 100644
index 0000000..fa4be2d
--- /dev/null
+++ b/ash/system/diagnostics/diagnostics_browser_delegate.cc
@@ -0,0 +1,14 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/system/diagnostics/diagnostics_browser_delegate.h"
+
+namespace ash {
+namespace diagnostics {
+
+DiagnosticsBrowserDelegate::DiagnosticsBrowserDelegate() = default;
+DiagnosticsBrowserDelegate::~DiagnosticsBrowserDelegate() = default;
+
+}  // namespace diagnostics
+}  // namespace ash
diff --git a/ash/system/diagnostics/diagnostics_browser_delegate.h b/ash/system/diagnostics/diagnostics_browser_delegate.h
new file mode 100644
index 0000000..016be34
--- /dev/null
+++ b/ash/system/diagnostics/diagnostics_browser_delegate.h
@@ -0,0 +1,33 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_SYSTEM_DIAGNOSTICS_DIAGNOSTICS_BROWSER_DELEGATE_H_
+#define ASH_SYSTEM_DIAGNOSTICS_DIAGNOSTICS_BROWSER_DELEGATE_H_
+
+#include "ash/ash_export.h"
+#include "base/files/file_path.h"
+
+namespace ash {
+namespace diagnostics {
+
+// Interface for retrieving state information from browser to be used by
+// DiagnosticsLogController.
+class ASH_EXPORT DiagnosticsBrowserDelegate {
+ public:
+  DiagnosticsBrowserDelegate();
+  DiagnosticsBrowserDelegate(const DiagnosticsBrowserDelegate&) = delete;
+  DiagnosticsBrowserDelegate& operator=(const DiagnosticsBrowserDelegate&) =
+      delete;
+  virtual ~DiagnosticsBrowserDelegate();
+
+  // Override to retrieve full path to active user's profile directory or an
+  // empty path if there is no active user or the user's profile has not been
+  // loaded yet.
+  virtual base::FilePath GetActiveUserProfileDir() = 0;
+};
+
+}  // namespace diagnostics
+}  // namespace ash
+
+#endif  // ASH_SYSTEM_DIAGNOSTICS_DIAGNOSTICS_BROWSER_DELEGATE_H_
diff --git a/ash/system/diagnostics/diagnostics_log_controller.cc b/ash/system/diagnostics/diagnostics_log_controller.cc
index 5ee99cd..c7db2ecf 100644
--- a/ash/system/diagnostics/diagnostics_log_controller.cc
+++ b/ash/system/diagnostics/diagnostics_log_controller.cc
@@ -4,7 +4,9 @@
 
 #include "ash/system/diagnostics/diagnostics_log_controller.h"
 
+#include "ash/system/diagnostics/diagnostics_browser_delegate.h"
 #include "base/check_op.h"
+#include "base/notreached.h"
 
 namespace ash {
 namespace diagnostics {
@@ -30,5 +32,17 @@
   return g_instance;
 }
 
+// static
+bool DiagnosticsLogController::IsInitialized() {
+  return g_instance && g_instance->delegate_;
+}
+
+// static
+void DiagnosticsLogController::Initialize(
+    std::unique_ptr<DiagnosticsBrowserDelegate> delegate) {
+  DCHECK(g_instance);
+  g_instance->delegate_ = std::move(delegate);
+}
+
 }  // namespace diagnostics
 }  // namespace ash
diff --git a/ash/system/diagnostics/diagnostics_log_controller.h b/ash/system/diagnostics/diagnostics_log_controller.h
index 8c3c13e..2073926b 100644
--- a/ash/system/diagnostics/diagnostics_log_controller.h
+++ b/ash/system/diagnostics/diagnostics_log_controller.h
@@ -6,6 +6,7 @@
 #define ASH_SYSTEM_DIAGNOSTICS_DIAGNOSTICS_LOG_CONTROLLER_H_
 
 #include "ash/ash_export.h"
+#include "ash/system/diagnostics/diagnostics_browser_delegate.h"
 
 namespace ash {
 namespace diagnostics {
@@ -25,6 +26,13 @@
   // outside the expected lifetime or when the
   // `ash::features::kEnableLogControllerForDiagnosticsApp` is false.
   static DiagnosticsLogController* Get();
+
+  // Check if DiagnosticsLogController is ready for use.
+  static bool IsInitialized();
+  static void Initialize(std::unique_ptr<DiagnosticsBrowserDelegate> delegate);
+
+ private:
+  std::unique_ptr<DiagnosticsBrowserDelegate> delegate_;
 };
 
 }  // namespace diagnostics
diff --git a/ash/system/diagnostics/diagnostics_log_controller_unittest.cc b/ash/system/diagnostics/diagnostics_log_controller_unittest.cc
index 9e905d0..02e0575 100644
--- a/ash/system/diagnostics/diagnostics_log_controller_unittest.cc
+++ b/ash/system/diagnostics/diagnostics_log_controller_unittest.cc
@@ -9,12 +9,27 @@
 #include "ash/constants/ash_features.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
+#include "base/files/file_path.h"
+#include "base/memory/ptr_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace ash {
 namespace diagnostics {
 
+namespace {
+
+// Fake delegate used to set the expected user directory path.
+class FakeDiagnosticsBrowserDelegate : public DiagnosticsBrowserDelegate {
+ public:
+  FakeDiagnosticsBrowserDelegate() = default;
+  ~FakeDiagnosticsBrowserDelegate() override = default;
+
+  base::FilePath GetActiveUserProfileDir() override { return base::FilePath(); }
+};
+
+}  // namespace
+
 class DiagnosticsLogControllerTest : public NoSessionAshTestBase {
  public:
   DiagnosticsLogControllerTest() = default;
@@ -40,5 +55,13 @@
   EXPECT_NE(nullptr, DiagnosticsLogController::Get());
 }
 
+TEST_F(DiagnosticsLogControllerTest, IsInitializedAfterDelegateProvided) {
+  EXPECT_NE(nullptr, DiagnosticsLogController::Get());
+  EXPECT_FALSE(DiagnosticsLogController::IsInitialized());
+  DiagnosticsLogController::Initialize(
+      std::make_unique<FakeDiagnosticsBrowserDelegate>());
+  EXPECT_TRUE(DiagnosticsLogController::IsInitialized());
+}
+
 }  // namespace diagnostics
 }  // namespace ash
diff --git a/ash/system/eche/eche_tray.cc b/ash/system/eche/eche_tray.cc
index 2757aed0..1c72e431 100644
--- a/ash/system/eche/eche_tray.cc
+++ b/ash/system/eche/eche_tray.cc
@@ -101,14 +101,18 @@
     : TrayBackgroundView(shelf),
       icon_(tray_container()->AddChildView(
           std::make_unique<views::ImageView>())) {
-  observed_session_.Observe(Shell::Get()->session_controller());
-
   const int icon_padding = (kTrayItemSize - kIconSize) / 2;
 
   icon_->SetBorder(
       views::CreateEmptyBorder(gfx::Insets::VH(icon_padding, icon_padding)));
 
+  // Observers setup
+  // Note: `ScreenLayoutObserver` starts observing at its constructor.
+  observed_session_.Observe(Shell::Get()->session_controller());
   icon_->SetTooltipText(GetAccessibleNameForTray());
+  shelf_observation_.Observe(shelf);
+  tablet_mode_observation_.Observe(Shell::Get()->tablet_mode_controller());
+  shell_observer_.Observe(Shell::Get());
 }
 
 EcheTray::~EcheTray() {
@@ -324,7 +328,7 @@
       tray_container()->GetWidget()->GetNativeWindow()->GetRootWindow(),
       kShellWindowId_AlwaysOnTopContainer);
   init_params.anchor_mode = TrayBubbleView::AnchorMode::kRect;
-  init_params.anchor_rect = shelf()->GetSystemTrayAnchorRect();
+  init_params.anchor_rect = GetAnchor();
   init_params.insets = GetTrayBubbleInsets();
   init_params.shelf_alignment = shelf()->alignment();
   const gfx::Size eche_size = CalculateSizeForEche();
@@ -469,6 +473,40 @@
   return phone_hub_tray->eche_loading_indicator();
 }
 
+void EcheTray::UpdateBubbleBounds() {
+  if (!bubble_)
+    return;
+  bubble_->GetBubbleView()->ChangeAnchorRect(GetAnchor());
+}
+
+void EcheTray::OnDisplayConfigurationChanged() {
+  UpdateBubbleBounds();
+}
+
+void EcheTray::OnAutoHideStateChanged(ShelfAutoHideState state) {
+  UpdateBubbleBounds();
+}
+
+void EcheTray::OnShelfIconPositionsChanged() {
+  UpdateBubbleBounds();
+}
+
+void EcheTray::OnTabletModeStarted() {
+  UpdateBubbleBounds();
+}
+
+void EcheTray::OnTabletModeEnded() {
+  UpdateBubbleBounds();
+}
+void EcheTray::OnShelfAlignmentChanged(aura::Window* root_window,
+                                       ShelfAlignment old_alignment) {
+  UpdateBubbleBounds();
+}
+
+gfx::Rect EcheTray::GetAnchor() {
+  return shelf()->GetSystemTrayAnchorRect();
+}
+
 BEGIN_METADATA(EcheTray, TrayBackgroundView)
 END_METADATA
 
diff --git a/ash/system/eche/eche_tray.h b/ash/system/eche/eche_tray.h
index bace5d7..de2b0cc7 100644
--- a/ash/system/eche/eche_tray.h
+++ b/ash/system/eche/eche_tray.h
@@ -9,13 +9,21 @@
 
 #include "ash/ash_export.h"
 #include "ash/public/cpp/session/session_observer.h"
+#include "ash/public/cpp/tablet_mode_observer.h"
 #include "ash/session/session_controller_impl.h"
+#include "ash/shelf/shelf.h"
+#include "ash/shelf/shelf_observer.h"
+#include "ash/shell.h"
+#include "ash/shell_observer.h"
 #include "ash/system/eche/eche_icon_loading_indicator_view.h"
+#include "ash/system/screen_layout_observer.h"
 #include "ash/system/tray/tray_background_view.h"
 #include "ash/webui/eche_app_ui/mojom/eche_app.mojom.h"
+#include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "base/gtest_prod_util.h"
 #include "base/timer/timer.h"
 #include "components/session_manager/session_manager_types.h"
+#include "ui/gfx/geometry/rect.h"
 #include "ui/views/controls/button/button.h"
 #include "url/gurl.h"
 
@@ -47,7 +55,12 @@
 
 // This class represents the Eche tray button in the status area and
 // controls the bubble that is shown when the tray button is clicked.
-class ASH_EXPORT EcheTray : public TrayBackgroundView, public SessionObserver {
+class ASH_EXPORT EcheTray : public TrayBackgroundView,
+                            public SessionObserver,
+                            public ScreenLayoutObserver,
+                            public ShelfObserver,
+                            public TabletModeObserver,
+                            ShellObserver {
  public:
   METADATA_HEADER(EcheTray);
 
@@ -155,6 +168,27 @@
   PhoneHubTray* GetPhoneHubTray();
   EcheIconLoadingIndicatorView* GetLoadingIndicator();
 
+  // Updates the bubble's position based on the movements of the shelf.
+  void UpdateBubbleBounds();
+
+  // ScreenLayoutObserver:
+  void OnDisplayConfigurationChanged() override;
+
+  // ShelfObserver:
+  void OnAutoHideStateChanged(ShelfAutoHideState new_state) override;
+  void OnShelfIconPositionsChanged() override;
+
+  // TabletModeObserver:
+  void OnTabletModeStarted() override;
+  void OnTabletModeEnded() override;
+
+  // ShellObserver:
+  void OnShelfAlignmentChanged(aura::Window* root_window,
+                               ShelfAlignment old_alignment) override;
+
+  // returns the position of the anchor that bubble needs to be anchored to.
+  gfx::Rect GetAnchor();
+
   // The url that is transferred to the web view.
   // In the current implementation, this is supposed to be
   // Eche window URL. However, the bubble does not interpret,
@@ -171,9 +205,6 @@
   // owned by `bubble_`
   AshWebView* web_view_ = nullptr;
 
-  base::ScopedObservation<SessionControllerImpl, SessionObserver>
-      observed_session_{this};
-
   GracefulCloseCallback graceful_close_callback_;
 
   // The unload timer to force close EcheTray in case unload error.
@@ -182,6 +213,18 @@
   views::Button* close_button_ = nullptr;
   views::Button* minimize_button_ = nullptr;
 
+  // Observers
+  base::ScopedObservation<SessionControllerImpl, SessionObserver>
+      observed_session_{this};
+  base::ScopedObservation<Shelf, ShelfObserver> shelf_observation_{this};
+  base::ScopedObservation<TabletModeController, TabletModeObserver>
+      tablet_mode_observation_{this};
+  base::ScopedObservation<Shell,
+                          ShellObserver,
+                          &Shell::AddShellObserver,
+                          &Shell::RemoveShellObserver>
+      shell_observer_{this};
+
   base::WeakPtrFactory<EcheTray> weak_factory_{this};
 };
 
diff --git a/ash/system/message_center/unified_message_center_view.cc b/ash/system/message_center/unified_message_center_view.cc
index 70fca81f..7556e49 100644
--- a/ash/system/message_center/unified_message_center_view.cc
+++ b/ash/system/message_center/unified_message_center_view.cc
@@ -103,6 +103,8 @@
 void UnifiedMessageCenterView::Init() {
   message_list_view_->Init();
 
+  AddChildView(notification_bar_);
+
   // Need to set the transparent background explicitly, since ScrollView has
   // set the default opaque background color.
   // TODO(crbug.com/1247455): Be able to do
@@ -119,11 +121,6 @@
   }
   AddChildView(scroller_);
 
-  // The `notification_bar_` needs to be placed after the `scroller_` since it
-  // should be the last element that the user focuses on before focusing out of
-  // the `UnifiedMessageCenterView`.
-  AddChildView(notification_bar_);
-
   notification_bar_->Update(
       message_list_view_->GetTotalNotificationCount(),
       message_list_view_->GetTotalPinnedNotificationCount(),
@@ -435,8 +432,10 @@
 
     // Transfer focus to quick settings when going invisible.
     auto* widget = GetWidget();
-    if (widget && widget->IsActive())
+    if (widget && widget->IsActive()) {
+      widget->GetFocusManager()->ClearFocus();
       message_center_bubble_->ActivateQuickSettingsBubble();
+    }
   }
 }
 
diff --git a/ash/system/message_center/unified_message_center_view_unittest.cc b/ash/system/message_center/unified_message_center_view_unittest.cc
index 2b881f6..4b29e79 100644
--- a/ash/system/message_center/unified_message_center_view_unittest.cc
+++ b/ash/system/message_center/unified_message_center_view_unittest.cc
@@ -747,13 +747,6 @@
   EXPECT_TRUE(GetNotificationBarClearAllButton()->GetVisible());
 }
 
-TEST_P(UnifiedMessageCenterViewTest, InitializesWithCorrectFocusOrder) {
-  CreateMessageCenterView();
-  std::vector<views::View*> expected_focus_list = {GetScroller(),
-                                                   GetNotificationBar()};
-  EXPECT_EQ(message_center_view()->GetChildrenFocusList(), expected_focus_list);
-}
-
 INSTANTIATE_TEST_SUITE_P(All,
                          UnifiedMessageCenterViewInWidgetTest,
                          testing::Bool() /* IsNotificationsRefreshEnabled()
diff --git a/ash/system/message_center/unified_message_list_view.cc b/ash/system/message_center/unified_message_list_view.cc
index 3132ad6..db3ccb9 100644
--- a/ash/system/message_center/unified_message_list_view.cc
+++ b/ash/system/message_center/unified_message_list_view.cc
@@ -433,8 +433,6 @@
         notification->id(), message_center::DISPLAY_SOURCE_MESSAGE_CENTER);
     is_latest = false;
   }
-
-  ReverseChildrenFocusOrder();
   UpdateBorders(/*force_update=*/true);
   UpdateBounds();
 }
@@ -708,7 +706,6 @@
   auto* view = CreateMessageView(*notification);
   view->SetExpanded(view->IsAutoExpandingAllowed());
   AddChildViewAt(new MessageViewContainer(view, this), index_to_insert);
-  ReverseChildrenFocusOrder();
   UpdateBorders(/*force_update=*/false);
   ResetBounds();
 }
@@ -979,20 +976,6 @@
   UpdateBorders(/*force_update=*/false);
 }
 
-void UnifiedMessageListView::ReverseChildrenFocusOrder() {
-  auto children_views = children();
-  if (children_views.size() > 1) {
-    views::View* first_child = children_views.front();
-    // Insert elements in reverse order since the last element should be the
-    // first focusable.
-    // Note that we are excluding the first element from the iteration.
-    for (int i = children_views.size() - 1; i > 0; i--) {
-      views::View* child = children_views[i];
-      child->InsertBeforeInFocusList(first_child);
-    }
-  }
-}
-
 void UnifiedMessageListView::StartAnimation() {
   DCHECK_NE(state_, State::IDLE);
 
diff --git a/ash/system/message_center/unified_message_list_view.h b/ash/system/message_center/unified_message_list_view.h
index cb1d161..f92fc8e 100644
--- a/ash/system/message_center/unified_message_list_view.h
+++ b/ash/system/message_center/unified_message_list_view.h
@@ -233,11 +233,6 @@
   // Deletes all the MessageViewContainer marked as |is_removed|.
   void DeleteRemovedNotifications();
 
-  // Reverses the focus order of all the children `MessageViewContainer`. The
-  // focus order needs to be reversed since the newest notifications are
-  // displayed last.
-  void ReverseChildrenFocusOrder();
-
   // Starts the animation for current |state_|.
   void StartAnimation();
 
diff --git a/ash/system/message_center/unified_message_list_view_unittest.cc b/ash/system/message_center/unified_message_list_view_unittest.cc
index e5bfc70..9c64bd27 100644
--- a/ash/system/message_center/unified_message_list_view_unittest.cc
+++ b/ash/system/message_center/unified_message_list_view_unittest.cc
@@ -740,54 +740,6 @@
   EXPECT_EQ(id3, GetMessageViewAt(4)->notification_id());
 }
 
-TEST_P(ParameterizedUnifiedMessageListViewTest,
-       InitializesWithReverseFocusOrder) {
-  AddNotification();
-  AddNotification();
-  AddNotification();
-  CreateMessageListView();
-
-  std::vector<views::View*> focus_list =
-      message_list_view()->GetChildrenFocusList();
-  std::vector<views::View*> children = message_list_view()->children();
-
-  EXPECT_EQ(3u, focus_list.size());
-  EXPECT_EQ(3u, children.size());
-
-  std::vector<views::View*> expected_focus_order = {children[2], children[1],
-                                                    children[0]};
-  EXPECT_EQ(focus_list, expected_focus_order);
-}
-
-TEST_P(ParameterizedUnifiedMessageListViewTest,
-       NewNotificationsAreAddedInTheRightFocusOrder) {
-  AddNotification();
-  AddNotification();
-  AddNotification();
-  CreateMessageListView();
-
-  std::vector<views::View*> focus_list_before =
-      message_list_view()->GetChildrenFocusList();
-  std::vector<views::View*> children_before = message_list_view()->children();
-
-  EXPECT_EQ(3u, focus_list_before.size());
-  EXPECT_EQ(3u, children_before.size());
-
-  AddNotification();
-
-  std::vector<views::View*> focus_list_after =
-      message_list_view()->GetChildrenFocusList();
-  std::vector<views::View*> children_after = message_list_view()->children();
-
-  EXPECT_EQ(4u, focus_list_after.size());
-  EXPECT_EQ(4u, children_after.size());
-
-  std::vector<views::View*> expected_focus_order = {
-      children_after[3], children_after[2], children_after[1],
-      children_after[0]};
-  EXPECT_EQ(focus_list_after, expected_focus_order);
-}
-
 // Tests only with NotificationsRefresh enabled.
 class RefreshedUnifiedMessageListView : public UnifiedMessageListViewTest {
  public:
diff --git a/ash/system/network/network_list_header_view.cc b/ash/system/network/network_list_header_view.cc
new file mode 100644
index 0000000..f78ccde7
--- /dev/null
+++ b/ash/system/network/network_list_header_view.cc
@@ -0,0 +1,55 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/system/network/network_list_header_view.h"
+
+#include <string>
+
+#include "ash/ash_export.h"
+#include "ash/constants/ash_features.h"
+#include "ash/style/ash_color_provider.h"
+#include "ash/system/tray/tray_popup_utils.h"
+#include "ash/system/tray/tri_view.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/font.h"
+#include "ui/gfx/font_list.h"
+#include "ui/views/controls/image_view.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/layout/fill_layout.h"
+#include "ui/views/view.h"
+
+namespace ash {
+
+namespace {
+const int kLineHeight = 20;
+}  // namespace
+
+NetworkListHeaderView::NetworkListHeaderView(int label_id) {
+  DCHECK(ash::features::IsQuickSettingsNetworkRevampEnabled());
+
+  TrayPopupUtils::ConfigureAsStickyHeader(this);
+  SetLayoutManager(std::make_unique<views::FillLayout>());
+  container_ = TrayPopupUtils::CreateSubHeaderRowView(/*start_visible=*/true);
+  container_->AddView(TriView::Container::START,
+                      TrayPopupUtils::CreateMainImageView());
+  AddChildView(container_);
+  AddTitleView(label_id);
+}
+
+void NetworkListHeaderView::AddTitleView(int label_id) {
+  DCHECK(container_);
+  views::Label* const titleLabelView = TrayPopupUtils::CreateDefaultLabel();
+  titleLabelView->SetEnabledColor(
+      ash::AshColorProvider::Get()->GetContentLayerColor(
+          ash::AshColorProvider::ContentLayerType::kTextColorPrimary));
+  TrayPopupUtils::SetLabelFontList(titleLabelView,
+                                   TrayPopupUtils::FontStyle::kSubHeader);
+  titleLabelView->SetLineHeight(kLineHeight);
+  titleLabelView->SetText(l10n_util::GetStringUTF16(label_id));
+  titleLabelView->SetID(kTitleLabelViewId);
+
+  container_->AddView(TriView::Container::CENTER, titleLabelView);
+}
+
+}  // namespace ash
diff --git a/ash/system/network/network_list_header_view.h b/ash/system/network/network_list_header_view.h
new file mode 100644
index 0000000..27412ed
--- /dev/null
+++ b/ash/system/network/network_list_header_view.h
@@ -0,0 +1,38 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_SYSTEM_NETWORK_NETWORK_LIST_HEADER_VIEW_H_
+#define ASH_SYSTEM_NETWORK_NETWORK_LIST_HEADER_VIEW_H_
+
+#include "ash/ash_export.h"
+#include "ash/system/tray/tri_view.h"
+#include "ui/views/view.h"
+
+namespace ash {
+
+// This class is used for the headers of both networks and VPNs, and will be
+// responsible for initializing the core views for a header.
+class ASH_EXPORT NetworkListHeaderView : public views::View {
+ public:
+  NetworkListHeaderView(const NetworkListHeaderView&) = delete;
+  NetworkListHeaderView& operator=(const NetworkListHeaderView&) = delete;
+  ~NetworkListHeaderView() override = default;
+
+ protected:
+  explicit NetworkListHeaderView(int label_id);
+
+  TriView* container() const { return container_; }
+
+ private:
+  // Used for testing. This is 1 because view IDs should not be 0.
+  static constexpr int kTitleLabelViewId = 1;
+
+  void AddTitleView(int label_id);
+
+  TriView* container_ = nullptr;
+};
+
+}  // namespace ash
+
+#endif  // ASH_SYSTEM_NETWORK_NETWORK_LIST_HEADER_VIEW_H_
diff --git a/ash/system/power/battery_image_source.cc b/ash/system/power/battery_image_source.cc
index ef3e267..f907012 100644
--- a/ash/system/power/battery_image_source.cc
+++ b/ash/system/power/battery_image_source.cc
@@ -24,6 +24,16 @@
 // that is "filled" to show battery charge percentage.
 constexpr gfx::RectF kDefaultFillRect = gfx::RectF(7, 6, 6, 10);
 
+inline SkColor GetBatteryBadgeColor() {
+  return ash::AshColorProvider::Get()->GetContentLayerColor(
+      ash::AshColorProvider::ContentLayerType::kBatteryBadgeColor);
+}
+
+inline SkColor GetAlertColor() {
+  return ash::AshColorProvider::Get()->GetContentLayerColor(
+      ash::AshColorProvider::ContentLayerType::kIconColorAlert);
+}
+
 }  // namespace
 
 namespace ash {
@@ -32,11 +42,14 @@
     const PowerStatus::BatteryImageInfo& info,
     int height,
     SkColor bg_color,
-    SkColor fg_color)
+    SkColor fg_color,
+    absl::optional<SkColor> badge_color)
     : gfx::CanvasImageSource(gfx::Size(height, height)),
       info_(info),
       bg_color_(bg_color),
-      fg_color_(fg_color) {}
+      fg_color_(fg_color),
+      badge_color_(badge_color.value_or(
+          info.charge_percent > 50 ? GetBatteryBadgeColor() : fg_color)) {}
 
 BatteryImageSource::~BatteryImageSource() = default;
 
@@ -77,9 +90,7 @@
                        size().height() * dsf);
   canvas->ClipRect(clip_rect);
 
-  auto* color_provider = AshColorProvider::Get();
-  const SkColor alert_color = color_provider->GetContentLayerColor(
-      AshColorProvider::ContentLayerType::kIconColorAlert);
+  const SkColor alert_color = GetAlertColor();
   const bool use_alert_color =
       charge_level == min_charge_level && info_.alert_if_low;
   flags.setColor(use_alert_color ? alert_color : fg_color_);
@@ -96,14 +107,7 @@
 
   // Paint the badge over top of the battery, if applicable.
   if (info_.icon_badge) {
-    const SkColor badge_color =
-        use_alert_color
-            ? alert_color
-            : info_.charge_percent > 50
-                  ? color_provider->GetContentLayerColor(
-                        AshColorProvider::ContentLayerType::kBatteryBadgeColor)
-                  : fg_color_;
-
+    const SkColor badge_color = use_alert_color ? alert_color : badge_color_;
     PaintVectorIcon(canvas, *info_.icon_badge, size().height(), badge_color);
   }
 }
diff --git a/ash/system/power/battery_image_source.h b/ash/system/power/battery_image_source.h
index 96e58b257..897ce378 100644
--- a/ash/system/power/battery_image_source.h
+++ b/ash/system/power/battery_image_source.h
@@ -17,10 +17,12 @@
   BatteryImageSource(const PowerStatus::BatteryImageInfo& info,
                      int height,
                      SkColor bg_color,
-                     SkColor fg_color);
-  ~BatteryImageSource() override;
+                     SkColor fg_color,
+                     absl::optional<SkColor> badge_color);
+
   BatteryImageSource(BatteryImageSource&) = delete;
   BatteryImageSource operator=(BatteryImageSource&) = delete;
+  ~BatteryImageSource() override;
 
   // gfx::ImageSkiaSource implementation.
   void Draw(gfx::Canvas* canvas) override;
@@ -31,6 +33,7 @@
   PowerStatus::BatteryImageInfo info_;
   const SkColor bg_color_;
   const SkColor fg_color_;
+  const SkColor badge_color_;
 };
 
 }  // namespace ash
diff --git a/ash/system/power/hps_sense_controller.cc b/ash/system/power/hps_sense_controller.cc
index cb4fad3..e93cc0a 100644
--- a/ash/system/power/hps_sense_controller.cc
+++ b/ash/system/power/hps_sense_controller.cc
@@ -4,6 +4,7 @@
 
 #include "ash/system/power/hps_sense_controller.h"
 
+#include "ash/shell.h"
 #include "base/bind.h"
 #include "chromeos/components/hps/hps_configuration.h"
 #include "chromeos/dbus/hps/hps_dbus_client.h"
@@ -29,37 +30,37 @@
 
 HpsSenseController::HpsSenseController() {
   hps_observation_.Observe(chromeos::HpsDBusClient::Get());
+
   chromeos::HpsDBusClient::Get()->WaitForServiceToBeAvailable(
       base::BindOnce(&HpsSenseController::OnHpsServiceAvailable,
                      weak_ptr_factory_.GetWeakPtr()));
+
+  // Orientation controller is instantiated before us in the shell.
+  HpsOrientationController* orientation_controller =
+      Shell::Get()->hps_orientation_controller();
+  suitable_for_hps_ = orientation_controller->IsOrientationSuitable();
+  orientation_observation_.Observe(orientation_controller);
 }
 
 HpsSenseController::~HpsSenseController() {
   hps_observation_.Reset();
+  orientation_observation_.Reset();
 }
 
 void HpsSenseController::EnableHpsSense() {
-  // Only enable if HpsSense is not enabled yet.
-  if (want_hps_sense_)
-    return;
   want_hps_sense_ = true;
-
-  // If hps_service is available then EnableHpsSense; otherwise, it will be
-  // enabled when the service becomes available.
-  if (service_available_)
-    EnableHpsSenseViaDBus();
+  ReconfigViaDbus();
 }
 
 void HpsSenseController::DisableHpsSense() {
-  // Only disable if HpsSense is enabled currently.
-  if (!want_hps_sense_)
-    return;
   want_hps_sense_ = false;
+  ReconfigViaDbus();
+}
 
-  // If hps_service is available then DisableHpsSense; otherwise, it will be
-  // disabled when the service becomes available.
-  if (service_available_)
-    DisableHpsSenseViaDBus();
+// HpsOrientationObserver:
+void HpsSenseController::OnOrientationChanged(bool suitable_for_hps) {
+  suitable_for_hps_ = suitable_for_hps;
+  ReconfigViaDbus();
 }
 
 void HpsSenseController::OnHpsSenseChanged(hps::HpsResult state) {}
@@ -68,29 +69,46 @@
 
 void HpsSenseController::OnRestart() {
   service_available_ = true;
-
-  // HpsDBusService just restarted, only need to send enabling signal.
-  if (want_hps_sense_)
-    EnableHpsSenseViaDBus();
+  ReconfigViaDbus();
 }
 
 void HpsSenseController::OnShutdown() {
   // HpsDBusService just stopped.
   service_available_ = false;
+  configured_state_ = ConfiguredHpsSenseState::kDisabled;
 }
 
-void HpsSenseController::OnHpsServiceAvailable(
-    const bool service_is_available) {
-  if (!service_is_available)
+void HpsSenseController::OnHpsServiceAvailable(const bool service_available) {
+  service_available_ = service_available;
+  ReconfigViaDbus();
+}
+
+void HpsSenseController::ReconfigViaDbus() {
+  if (!service_available_)
     return;
-  service_available_ = true;
 
-  // Always disable first, just in case the service was left enabled from
-  // previous chrome session.
-  DisableHpsSenseViaDBus();
+  // When chrome starts, it does not know the current configured_state_, because
+  // it could be left enabled from previous chrome session, disable it so that
+  // the new configuration can apply.
+  if (configured_state_ == ConfiguredHpsSenseState::kUnknown) {
+    DisableHpsSenseViaDBus();
+    configured_state_ = ConfiguredHpsSenseState::kDisabled;
+  }
 
-  if (want_hps_sense_)
+  // Wanted state should be either kEnabled or kDisabled.
+  const ConfiguredHpsSenseState wanted_state =
+      want_hps_sense_ && suitable_for_hps_ ? ConfiguredHpsSenseState::kEnabled
+                                           : ConfiguredHpsSenseState::kDisabled;
+
+  // Return if already configured to the wanted state.
+  if (wanted_state == configured_state_)
+    return;
+
+  if (wanted_state == ConfiguredHpsSenseState::kEnabled) {
     EnableHpsSenseViaDBus();
+  } else {
+    DisableHpsSenseViaDBus();
+  }
+  configured_state_ = wanted_state;
 }
-
 }  // namespace ash
diff --git a/ash/system/power/hps_sense_controller.h b/ash/system/power/hps_sense_controller.h
index 1d8a099..d69586173 100644
--- a/ash/system/power/hps_sense_controller.h
+++ b/ash/system/power/hps_sense_controller.h
@@ -6,6 +6,7 @@
 #define ASH_SYSTEM_POWER_HPS_SENSE_CONTROLLER_H_
 
 #include "ash/ash_export.h"
+#include "ash/system/hps/hps_orientation_controller.h"
 #include "base/memory/weak_ptr.h"
 #include "base/scoped_observation.h"
 #include "chromeos/dbus/hps/hps_dbus_client.h"
@@ -14,9 +15,20 @@
 namespace ash {
 
 // Helper class for chromeos::HpsDBusClient, responsible for enabling/disabling
-// HPS via the client and is responsible for maintaining state between restarts.
-class ASH_EXPORT HpsSenseController : public chromeos::HpsDBusClient::Observer {
+// the DBus service via the client and is responsible for maintaining state
+// between restarts.
+class ASH_EXPORT HpsSenseController : public HpsOrientationController::Observer,
+                                      chromeos::HpsDBusClient::Observer {
  public:
+  // The state of HpsSense inside HpsDbusService that is configured. It is set
+  // as kUnknown in this class on initialization. And is set to either kEnable
+  // or kDisable when EnableHpsSense() or DisableHpsSense() is called.
+  enum class ConfiguredHpsSenseState {
+    kUnknown,
+    kEnabled,
+    kDisabled,
+  };
+
   HpsSenseController();
   HpsSenseController(const HpsSenseController&) = delete;
   HpsSenseController& operator=(const HpsSenseController&) = delete;
@@ -30,6 +42,9 @@
   // enabled.
   void DisableHpsSense();
 
+  // HpsOrientationObserver:
+  void OnOrientationChanged(bool suitable_for_hps) override;
+
   // chromeos::HpsDBusClient::Observer:
   void OnHpsSenseChanged(hps::HpsResult state) override;
   void OnHpsNotifyChanged(hps::HpsResult state) override;
@@ -39,7 +54,10 @@
 
  private:
   // Called when the Hps Service is available.
-  void OnHpsServiceAvailable(bool service_is_available);
+  void OnHpsServiceAvailable(bool service_available);
+
+  // May disable/enable hps_sense based on current state.
+  void ReconfigViaDbus();
 
   // Indicates whether the hps service is available; it is set inside
   // OnHpsServiceAvailable and set to false OnShutdown.
@@ -48,9 +66,19 @@
   // Records requested hps sense enable state from client.
   bool want_hps_sense_ = false;
 
+  // Whether the device is in physical orientation where our models are
+  // accurate.
+  bool suitable_for_hps_ = false;
+
+  // Current configured state of HpsSense.
+  ConfiguredHpsSenseState configured_state_ = ConfiguredHpsSenseState::kUnknown;
+
   base::ScopedObservation<chromeos::HpsDBusClient,
                           chromeos::HpsDBusClient::Observer>
       hps_observation_{this};
+  base::ScopedObservation<HpsOrientationController,
+                          HpsOrientationController::Observer>
+      orientation_observation_{this};
   base::WeakPtrFactory<HpsSenseController> weak_ptr_factory_{this};
 };
 
diff --git a/ash/system/power/hps_sense_controller_unittest.cc b/ash/system/power/hps_sense_controller_unittest.cc
index ec709b5..5206fa0 100644
--- a/ash/system/power/hps_sense_controller_unittest.cc
+++ b/ash/system/power/hps_sense_controller_unittest.cc
@@ -6,25 +6,39 @@
 
 #include <memory>
 
+#include "ash/constants/ash_features.h"
+#include "ash/constants/ash_switches.h"
+#include "ash/test/ash_test_base.h"
 #include "base/run_loop.h"
-#include "base/test/task_environment.h"
+#include "base/test/scoped_command_line.h"
+#include "base/test/scoped_feature_list.h"
 #include "chromeos/dbus/hps/fake_hps_dbus_client.h"
 #include "chromeos/dbus/hps/hps_dbus_client.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace ash {
 
-class HpsSenseControllerTest : public testing::Test {
+class HpsSenseControllerTest : public AshTestBase {
  public:
   void SetUp() override {
+    // We need to enable kQuickDim to construct HpsOrientationController.
+    scoped_feature_list_.InitAndEnableFeature(features::kQuickDim);
+    base::CommandLine::ForCurrentProcess()->AppendSwitch(switches::kHasHps);
+
+    // Initialize FakeHpsDBusClient.
     chromeos::HpsDBusClient::InitializeFake();
     hps_client_ = chromeos::FakeHpsDBusClient::Get();
     hps_client_->Reset();
+
+    AshTestBase::SetUp();
   }
 
  protected:
   chromeos::FakeHpsDBusClient* hps_client_ = nullptr;
-  base::test::SingleThreadTaskEnvironment task_environment_;
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+  base::test::ScopedCommandLine scoped_command_line_;
 };
 
 // EnableHpsSense should be skipped if HpsService is not available.
@@ -122,7 +136,7 @@
   EXPECT_EQ(hps_client_->enable_hps_sense_count(), 0);
 }
 
-// EnableHpsSense should be called on restart if HpsSense is enabled currently.
+// No dbus call should be sent on restart if HpsSense is currently disabled.
 TEST_F(HpsSenseControllerTest, NoDbusCallsOnRestartIfHpsSenseDisabled) {
   hps_client_->set_hps_service_is_available(true);
   auto hps_sense_controller = std::make_unique<HpsSenseController>();
@@ -131,6 +145,7 @@
   EXPECT_EQ(hps_client_->enable_hps_sense_count(), 0);
 
   // HpsSense is disabled; Restart will not send dbus calls.
+  hps_client_->Shutdown();
   hps_client_->Restart();
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(hps_client_->disable_hps_sense_count(), 1);
@@ -148,6 +163,7 @@
   EXPECT_EQ(hps_client_->enable_hps_sense_count(), 1);
 
   // HpsSense is enabled; Restart will call EnableHpsSense.
+  hps_client_->Shutdown();
   hps_client_->Restart();
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(hps_client_->disable_hps_sense_count(), 1);
@@ -170,4 +186,40 @@
   EXPECT_EQ(hps_client_->enable_hps_sense_count(), 1);
 }
 
+// Confirm that enable_hps_sense is only called when both EnableHpsSense and
+// OnOrientationChanged(true) is set.
+TEST_F(HpsSenseControllerTest, OreientationChanging) {
+  hps_client_->set_hps_service_is_available(true);
+  auto hps_sense_controller = std::make_unique<HpsSenseController>();
+  hps_sense_controller->EnableHpsSense();
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 1);
+  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 1);
+  hps_client_->Reset();
+
+  // Orientation changed, HpsSense should be disabled.
+  hps_sense_controller->OnOrientationChanged(false);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 1);
+  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 0);
+  hps_client_->Reset();
+
+  // Calling enable/disable will not sent any dbus call while OrientationChanged
+  // to be false.
+  hps_sense_controller->DisableHpsSense();
+  base::RunLoop().RunUntilIdle();
+  hps_sense_controller->OnOrientationChanged(false);
+  base::RunLoop().RunUntilIdle();
+  hps_sense_controller->EnableHpsSense();
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 0);
+  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 0);
+
+  // Changing oritiantation will trigger enabling if EnableHpsSense was set.
+  hps_sense_controller->OnOrientationChanged(true);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(hps_client_->disable_hps_sense_count(), 0);
+  EXPECT_EQ(hps_client_->enable_hps_sense_count(), 1);
+}
+
 }  // namespace ash
diff --git a/ash/system/power/power_status.cc b/ash/system/power/power_status.cc
index ebe8b3b..bffdad8 100644
--- a/ash/system/power/power_status.cc
+++ b/ash/system/power/power_status.cc
@@ -275,11 +275,14 @@
 }
 
 // static
-gfx::ImageSkia PowerStatus::GetBatteryImage(const BatteryImageInfo& info,
-                                            int height,
-                                            SkColor bg_color,
-                                            SkColor fg_color) {
-  auto* source = new BatteryImageSource(info, height, bg_color, fg_color);
+gfx::ImageSkia PowerStatus::GetBatteryImage(
+    const BatteryImageInfo& info,
+    int height,
+    SkColor bg_color,
+    SkColor fg_color,
+    absl::optional<SkColor> badge_color) {
+  auto* source = new BatteryImageSource(info, height, bg_color, fg_color,
+                                        std::move(badge_color));
   return gfx::ImageSkia(base::WrapUnique(source), source->size());
 }
 
diff --git a/ash/system/power/power_status.h b/ash/system/power/power_status.h
index 1a20cf1..74fb817 100644
--- a/ash/system/power/power_status.h
+++ b/ash/system/power/power_status.h
@@ -197,10 +197,12 @@
   void CalculateBatteryImageInfo(BatteryImageInfo* info) const;
 
   // Creates a new image that should be shown for the battery's current state.
-  static gfx::ImageSkia GetBatteryImage(const BatteryImageInfo& info,
-                                        int height,
-                                        SkColor bg_color,
-                                        SkColor fg_color);
+  static gfx::ImageSkia GetBatteryImage(
+      const BatteryImageInfo& info,
+      int height,
+      SkColor bg_color,
+      SkColor fg_color,
+      absl::optional<SkColor> badge_color = absl::nullopt);
 
   // Returns a string describing the current state for accessibility.
   std::u16string GetAccessibleNameString(bool full_description) const;
diff --git a/ash/system/tray/tray_constants.h b/ash/system/tray/tray_constants.h
index 5fc149a..55c7d9c 100644
--- a/ash/system/tray/tray_constants.h
+++ b/ash/system/tray/tray_constants.h
@@ -144,6 +144,8 @@
 constexpr auto kUnifiedNotificationHiddenPadding = gfx::Insets::VH(6, 16);
 constexpr gfx::Insets kUnifiedCircularButtonFocusPadding(4);
 constexpr gfx::Insets kTrayBackgroundFocusPadding(1);
+constexpr gfx::Insets kUnifiedSystemInfoBatteryIconPadding =
+    gfx::Insets::TLBR(2, 2, 2, 6);
 
 // Size of an icon drawn inside top shortcut buttons.
 // A dark disc with |kTrayItemSize| diameter is drawn in the background.
diff --git a/ash/system/unified/unified_system_info_view.cc b/ash/system/unified/unified_system_info_view.cc
index a796778..3955150c 100644
--- a/ash/system/unified/unified_system_info_view.cc
+++ b/ash/system/unified/unified_system_info_view.cc
@@ -29,10 +29,13 @@
 #include "chromeos/strings/grit/chromeos_strings.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/metadata/metadata_header_macros.h"
+#include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/chromeos/devicetype_utils.h"
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/accessibility/view_accessibility.h"
 #include "ui/views/animation/ink_drop.h"
+#include "ui/views/background.h"
 #include "ui/views/controls/button/button.h"
 #include "ui/views/controls/focus_ring.h"
 #include "ui/views/controls/image_view.h"
@@ -58,6 +61,24 @@
   return base::TimeFormatWithPattern(time, "EEE");
 }
 
+// Helper function for getting ContentLayerColor.
+inline SkColor GetContentLayerColor(ContentLayerType type) {
+  return ash::AshColorProvider::Get()->GetContentLayerColor(type);
+}
+
+// Helper function for configuring label in BatteryInfoView.
+void ConfigureLabel(views::Label* label, SkColor color) {
+  label->SetAutoColorReadabilityEnabled(false);
+  label->SetSubpixelRenderingEnabled(false);
+  label->SetEnabledColor(color);
+  label->GetViewAccessibility().OverrideIsIgnored(true);
+}
+
+// Returns whether SmartChargingUI should be used.
+bool UseSmartChargingUI() {
+  return ash::features::IsAdaptiveChargingEnabled();
+}
+
 // A view that shows current date in short format e.g. "Mon, Mar 12". It updates
 // by observing ClockObserver.
 class DateView : public views::Button, public ClockObserver {
@@ -167,114 +188,186 @@
   Update();
 }
 
-// A view that shows battery status. It updates by observing PowerStatus.
-class BatteryView : public views::Button, public PowerStatus::Observer {
+// A base class for both BatteryLabelView and BatteryIconView. It updates by
+// observing PowerStatus.
+class BatteryInfoViewBase : public views::Button, public PowerStatus::Observer {
  public:
-  explicit BatteryView(UnifiedSystemTrayController* controller);
+  METADATA_HEADER(BatteryInfoViewBase);
+  explicit BatteryInfoViewBase(UnifiedSystemTrayController* controller)
+      : Button(base::BindRepeating(&BatteryInfoViewBase::OnButtonPressed,
+                                   base::Unretained(this))),
+        controller_(controller) {
+    power_status_observation_.Observe(PowerStatus::Get());
+  }
 
-  BatteryView(const BatteryView&) = delete;
-  BatteryView& operator=(const BatteryView&) = delete;
+  BatteryInfoViewBase(const BatteryInfoViewBase&) = delete;
+  BatteryInfoViewBase& operator=(const BatteryInfoViewBase&) = delete;
 
-  ~BatteryView() override;
+  ~BatteryInfoViewBase() override = default;
 
   // views::View:
-  void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
-  void ChildPreferredSizeChanged(views::View* child) override;
-  void ChildVisibilityChanged(views::View* child) override;
-  const char* GetClassName() const override { return "BatteryView"; }
-  void OnThemeChanged() override;
+  void GetAccessibleNodeData(ui::AXNodeData* node_data) override {
+    node_data->role = ax::mojom::Role::kLabelText;
+    node_data->SetName(PowerStatus::Get()->GetAccessibleNameString(true));
+  }
+
+  void ChildPreferredSizeChanged(views::View* child) override {
+    PreferredSizeChanged();
+  }
+
+  void ChildVisibilityChanged(views::View* child) override {
+    PreferredSizeChanged();
+  }
 
   // PowerStatus::Observer:
-  void OnPowerStatusChanged() override;
+  void OnPowerStatusChanged() override { Update(); }
+
+  // Should be override by subclass.
+  virtual void Update() = 0;
 
  private:
-  void Update();
-
-  void ConfigureLabel(views::Label* label);
-
   // Callback called when this is pressed.
-  void OnButtonPressed(const ui::Event& event);
-
-  views::Label* percentage_;
-  views::Label* separator_;
-  views::Label* status_;
+  void OnButtonPressed(const ui::Event& event) {
+    controller_->HandleOpenPowerSettingsAction();
+  }
 
   // Unowned.
   ash::UnifiedSystemTrayController* const controller_;
+
+  base::ScopedObservation<PowerStatus, PowerStatus::Observer>
+      power_status_observation_{this};
 };
+BEGIN_METADATA(BatteryInfoViewBase, views::Button)
+END_METADATA
 
-BatteryView::BatteryView(UnifiedSystemTrayController* controller)
-    : Button(base::BindRepeating(&BatteryView::OnButtonPressed,
-                                 base::Unretained(this))),
-      controller_(controller) {
-  PowerStatus::Get()->AddObserver(this);
-  SetLayoutManager(std::make_unique<views::BoxLayout>(
-      views::BoxLayout::Orientation::kHorizontal));
+// A view that shows battery status.
+class BatteryLabelView : public BatteryInfoViewBase {
+ public:
+  METADATA_HEADER(BatteryLabelView);
+  explicit BatteryLabelView(UnifiedSystemTrayController* controller)
+      : BatteryInfoViewBase(controller) {
+    SetLayoutManager(std::make_unique<views::BoxLayout>(
+        views::BoxLayout::Orientation::kHorizontal));
 
-  percentage_ = AddChildView(std::make_unique<views::Label>());
-  separator_ = AddChildView(std::make_unique<views::Label>());
-  status_ = AddChildView(std::make_unique<views::Label>());
-  separator_->SetText(
-      l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_BATTERY_STATUS_SEPARATOR));
-  Update();
-}
+    percentage_ = AddChildView(std::make_unique<views::Label>());
+    auto seperator = std::make_unique<views::Label>();
+    seperator->SetText(l10n_util::GetStringUTF16(
+        IDS_ASH_STATUS_TRAY_BATTERY_STATUS_SEPARATOR));
+    separator_ = AddChildView(std::move(seperator));
+    status_ = AddChildView(std::make_unique<views::Label>());
+    Update();
+  }
 
-BatteryView::~BatteryView() {
-  PowerStatus::Get()->RemoveObserver(this);
-}
+  BatteryLabelView(const BatteryLabelView&) = delete;
+  BatteryLabelView& operator=(const BatteryLabelView&) = delete;
+  ~BatteryLabelView() override = default;
 
-void BatteryView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
-  node_data->role = ax::mojom::Role::kLabelText;
-  node_data->SetName(PowerStatus::Get()->GetAccessibleNameString(true));
-}
+  // views::View:
+  void OnThemeChanged() override {
+    views::View::OnThemeChanged();
+    const auto color =
+        GetContentLayerColor(ContentLayerType::kTextColorSecondary);
+    ConfigureLabel(percentage_, color);
+    ConfigureLabel(separator_, color);
+    ConfigureLabel(status_, color);
+  }
 
-void BatteryView::ChildPreferredSizeChanged(views::View* child) {
-  PreferredSizeChanged();
-}
+ private:
+  void Update() override {
+    std::u16string percentage_text;
+    std::u16string status_text;
+    std::tie(percentage_text, status_text) =
+        PowerStatus::Get()->GetStatusStrings();
 
-void BatteryView::ChildVisibilityChanged(views::View* child) {
-  PreferredSizeChanged();
-}
+    percentage_->SetText(percentage_text);
+    status_->SetText(status_text);
 
-void BatteryView::OnThemeChanged() {
-  views::View::OnThemeChanged();
-  ConfigureLabel(percentage_);
-  ConfigureLabel(separator_);
-  ConfigureLabel(status_);
-}
+    percentage_->SetVisible(!percentage_text.empty() && !UseSmartChargingUI());
+    separator_->SetVisible(!percentage_text.empty() && !UseSmartChargingUI() &&
+                           !status_text.empty());
+    status_->SetVisible(!status_text.empty());
 
-void BatteryView::OnPowerStatusChanged() {
-  Update();
-}
+    percentage_->NotifyAccessibilityEvent(ax::mojom::Event::kTextChanged, true);
+    status_->NotifyAccessibilityEvent(ax::mojom::Event::kTextChanged, true);
+  }
 
-void BatteryView::Update() {
-  std::u16string percentage_text;
-  std::u16string status_text;
-  std::tie(percentage_text, status_text) =
-      PowerStatus::Get()->GetStatusStrings();
+  views::Label* percentage_ = nullptr;
+  views::Label* separator_ = nullptr;
+  views::Label* status_ = nullptr;
+};
+BEGIN_METADATA(BatteryLabelView, BatteryInfoViewBase)
+END_METADATA
 
-  percentage_->SetText(percentage_text);
-  status_->SetText(status_text);
+// A view that shows battery icon and charging state when smart charging is
+// enabled.
+class BatteryIconView : public BatteryInfoViewBase {
+ public:
+  METADATA_HEADER(BatteryIconView);
+  explicit BatteryIconView(UnifiedSystemTrayController* controller)
+      : BatteryInfoViewBase(controller) {
+    auto layout = std::make_unique<views::BoxLayout>(
+        views::BoxLayout::Orientation::kHorizontal);
+    layout->set_inside_border_insets(kUnifiedSystemInfoBatteryIconPadding);
+    SetLayoutManager(std::move(layout));
 
-  percentage_->SetVisible(!percentage_text.empty());
-  separator_->SetVisible(!percentage_text.empty() && !status_text.empty());
-  status_->SetVisible(!status_text.empty());
+    battery_image_ = AddChildView(std::make_unique<views::ImageView>());
+    ConfigureIcon();
 
-  percentage_->NotifyAccessibilityEvent(ax::mojom::Event::kTextChanged, true);
-  status_->NotifyAccessibilityEvent(ax::mojom::Event::kTextChanged, true);
-}
+    percentage_ = AddChildView(std::make_unique<views::Label>());
 
-void BatteryView::ConfigureLabel(views::Label* label) {
-  label->SetAutoColorReadabilityEnabled(false);
-  label->SetSubpixelRenderingEnabled(false);
-  label->SetEnabledColor(AshColorProvider::Get()->GetContentLayerColor(
-      ContentLayerType::kTextColorSecondary));
-  label->GetViewAccessibility().OverrideIsIgnored(true);
-}
+    SetBackground(views::CreateRoundedRectBackground(
+        GetContentLayerColor(AshColorProvider::ContentLayerType::
+                                 kBatterySystemInfoBackgroundColor),
+        GetPreferredSize().height() / 2));
 
-void BatteryView::OnButtonPressed(const ui::Event& event) {
-  controller_->HandleOpenPowerSettingsAction();
-}
+    Update();
+  }
+
+  BatteryIconView(const BatteryIconView&) = delete;
+  BatteryIconView& operator=(const BatteryIconView&) = delete;
+  ~BatteryIconView() override = default;
+
+  // views::View:
+  void OnThemeChanged() override {
+    views::View::OnThemeChanged();
+    const auto color =
+        GetContentLayerColor(ContentLayerType::kButtonLabelColorPrimary);
+    ConfigureLabel(percentage_, color);
+    ConfigureIcon();
+  }
+
+ private:
+  void Update() override {
+    const std::u16string percentage_text =
+        PowerStatus::Get()->GetStatusStrings().first;
+
+    percentage_->SetText(percentage_text);
+    percentage_->SetVisible(!percentage_text.empty());
+    percentage_->NotifyAccessibilityEvent(ax::mojom::Event::kTextChanged, true);
+
+    ConfigureIcon();
+  }
+
+  void ConfigureIcon() {
+    const SkColor battery_icon_color = GetContentLayerColor(
+        AshColorProvider::ContentLayerType::kBatterySystemInfoIconColor);
+
+    const SkColor badge_color = GetContentLayerColor(
+        AshColorProvider::ContentLayerType::kBatterySystemInfoBackgroundColor);
+
+    PowerStatus::BatteryImageInfo info =
+        PowerStatus::Get()->GetBatteryImageInfo();
+    info.alert_if_low = false;
+    battery_image_->SetImage(PowerStatus::GetBatteryImage(
+        info, kUnifiedTrayBatteryIconSize, battery_icon_color,
+        battery_icon_color, badge_color));
+  }
+
+  views::Label* percentage_ = nullptr;
+  views::ImageView* battery_image_ = nullptr;
+};
+BEGIN_METADATA(BatteryIconView, BatteryInfoViewBase)
+END_METADATA
 
 // A base class of the views showing device management state.
 class ManagedStateView : public views::Button {
@@ -490,7 +583,10 @@
   if (PowerStatus::Get()->IsBatteryPresent()) {
     separator_ = AddChildView(std::make_unique<views::Separator>());
     separator_->SetPreferredHeight(kUnifiedSystemInfoHeight);
-    AddChildView(std::make_unique<BatteryView>(controller));
+    if (UseSmartChargingUI()) {
+      AddChildView(std::make_unique<BatteryIconView>(controller));
+    }
+    AddChildView(std::make_unique<BatteryLabelView>(controller));
   }
 
   auto* spacing = AddChildView(std::make_unique<views::View>());
@@ -518,8 +614,8 @@
 void UnifiedSystemInfoView::OnThemeChanged() {
   views::View::OnThemeChanged();
   if (separator_) {
-    separator_->SetColor(AshColorProvider::Get()->GetContentLayerColor(
-        ContentLayerType::kSeparatorColor));
+    separator_->SetColor(
+        GetContentLayerColor(ContentLayerType::kSeparatorColor));
   }
 }
 
diff --git a/ash/webui/eche_app_ui/eche_tray_stream_status_observer_unittest.cc b/ash/webui/eche_app_ui/eche_tray_stream_status_observer_unittest.cc
index 38fec7e..524d4d5 100644
--- a/ash/webui/eche_app_ui/eche_tray_stream_status_observer_unittest.cc
+++ b/ash/webui/eche_app_ui/eche_tray_stream_status_observer_unittest.cc
@@ -35,7 +35,7 @@
   void SetUp() override {
     scoped_feature_list_.InitWithFeatures(
         /*enabled_features=*/{},
-        /*disabled_features=*/{features::kEcheSWAInBackground});
+        /*disabled_features=*/{});
     DCHECK(test_web_view_factory_.get());
     ui::ResourceBundle::CleanupSharedInstance();
     AshTestSuite::LoadTestResources();
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/topic_source_item_element.ts b/ash/webui/personalization_app/resources/trusted/ambient/topic_source_item_element.ts
index 7c2449f..b72afe3 100644
--- a/ash/webui/personalization_app/resources/trusted/ambient/topic_source_item_element.ts
+++ b/ash/webui/personalization_app/resources/trusted/ambient/topic_source_item_element.ts
@@ -104,6 +104,10 @@
   }
 
   private computeAriaLabel_(): string {
+    // topicSource may be undefined when aria label is computed the first time.
+    if (this.topicSource === undefined) {
+      return '';
+    }
     if (this.checked) {
       return this.i18n(
           'ambientModeTopicSourceSelectedRow', this.getItemName_(),
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc
index a721a6d..183ac501 100644
--- a/ash/wm/desks/desks_controller.cc
+++ b/ash/wm/desks/desks_controller.cc
@@ -904,12 +904,13 @@
 
 void DesksController::CaptureActiveDeskAsTemplate(
     GetDeskTemplateCallback callback,
+    DeskTemplateType template_type,
     aura::Window* root_window_to_show) const {
   DCHECK(current_account_id_.is_valid());
 
   restore_data_collector_.CaptureActiveDeskAsTemplate(
-      std::move(callback), base::UTF16ToUTF8(active_desk_->name()),
-      root_window_to_show);
+      std::move(callback), template_type,
+      base::UTF16ToUTF8(active_desk_->name()), root_window_to_show);
 }
 
 void DesksController::CreateNewDeskForTemplate(
diff --git a/ash/wm/desks/desks_controller.h b/ash/wm/desks/desks_controller.h
index 459b380..5c539de5 100644
--- a/ash/wm/desks/desks_controller.h
+++ b/ash/wm/desks/desks_controller.h
@@ -258,13 +258,13 @@
   int GetNumberOfDesks() const override;
   void SendToDeskAtIndex(aura::Window* window, int desk_index) override;
 
-  // Captures the active desk and returns it as a desk template containing
-  // necessary information that can be used to create a same desk via provided
-  // `callback`, `root_window_to_show` is used to determine which monitor to
-  // show template related dialog.
-  void CaptureActiveDeskAsTemplate(
-      GetDeskTemplateCallback callback,
-      aura::Window* root_window_to_show = nullptr) const;
+  // Captures the active desk and returns it as a desk template (of type
+  // `template_type`) containing necessary information that can be used to
+  // create a same desk via provided `callback`, `root_window_to_show` is used
+  // to determine which monitor to show template related dialog.
+  void CaptureActiveDeskAsTemplate(GetDeskTemplateCallback callback,
+                                   DeskTemplateType template_type,
+                                   aura::Window* root_window_to_show) const;
 
   // Creates (and optionally activates) a new desk for a template with name
   // `template_name` or `template_name ({counter})` to resolve naming
diff --git a/ash/wm/desks/templates/desks_templates_presenter.cc b/ash/wm/desks/templates/desks_templates_presenter.cc
index fb02235..e4368d9 100644
--- a/ash/wm/desks/templates/desks_templates_presenter.cc
+++ b/ash/wm/desks/templates/desks_templates_presenter.cc
@@ -177,12 +177,13 @@
 }
 
 void DesksTemplatesPresenter::MaybeSaveActiveDeskAsTemplate(
+    DeskTemplateType template_type,
     aura::Window* root_window_to_show) {
   DesksController::Get()->CaptureActiveDeskAsTemplate(
       base::BindOnce(&DesksTemplatesPresenter::SaveOrUpdateDeskTemplate,
                      weak_ptr_factory_.GetWeakPtr(),
                      /*is_update=*/false, root_window_to_show),
-      root_window_to_show);
+      template_type, root_window_to_show);
 }
 
 void DesksTemplatesPresenter::SaveOrUpdateDeskTemplate(
diff --git a/ash/wm/desks/templates/desks_templates_presenter.h b/ash/wm/desks/templates/desks_templates_presenter.h
index d13bc0bd..a4eafac 100644
--- a/ash/wm/desks/templates/desks_templates_presenter.h
+++ b/ash/wm/desks/templates/desks_templates_presenter.h
@@ -19,6 +19,7 @@
 
 class DeskTemplate;
 class OverviewSession;
+enum class DeskTemplateType;
 
 // DesksTemplatesPresenter is the presenter for the desks templates UI. It
 // handles all calls to the model, and lets the UI know what to show or update.
@@ -61,11 +62,12 @@
                           base::TimeDelta delay,
                           aura::Window* root_window);
 
-  // Calls the DeskModel to capture the active desk as a template entry, with a
+  // Calls the DeskModel to capture the active desk as a `template_type`, with a
   // callback to `OnAddOrUpdateEntry`. If there are unsupported apps on the
   // active desk, a dialog will open up and we may or may not save the desk
   // asynchronously based on the user's decision.
-  void MaybeSaveActiveDeskAsTemplate(aura::Window* root_window_to_show);
+  void MaybeSaveActiveDeskAsTemplate(DeskTemplateType template_type,
+                                     aura::Window* root_window_to_show);
 
   // Saves or updates the `desk_template` to the model.
   void SaveOrUpdateDeskTemplate(bool is_update,
diff --git a/ash/wm/desks/templates/restore_data_collector.cc b/ash/wm/desks/templates/restore_data_collector.cc
index 2378133a..d00e4279 100644
--- a/ash/wm/desks/templates/restore_data_collector.cc
+++ b/ash/wm/desks/templates/restore_data_collector.cc
@@ -32,6 +32,7 @@
 
 void RestoreDataCollector::CaptureActiveDeskAsTemplate(
     GetDeskTemplateCallback callback,
+    DeskTemplateType template_type,
     const std::string& template_name,
     aura::Window* root_window_to_show) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -44,6 +45,7 @@
   if (root_window_to_show)
     window_tracker_.Add(root_window_to_show);
   call.root_window_to_show = root_window_to_show;
+  call.template_type = template_type;
   call.template_name = template_name;
 
   auto* const shell = Shell::Get();
@@ -126,6 +128,7 @@
       base::GUID::GenerateRandomV4().AsLowercaseString(),
       DeskTemplateSource::kUser, call.template_name, base::Time::Now());
   desk_template->set_desk_restore_data(std::move(call.data));
+  desk_template->set_type(call.template_type);
 
   if (!call.unsupported_apps.empty() &&
       Shell::Get()->overview_controller()->InOverviewSession()) {
diff --git a/ash/wm/desks/templates/restore_data_collector.h b/ash/wm/desks/templates/restore_data_collector.h
index de0f49b..ac1af37 100644
--- a/ash/wm/desks/templates/restore_data_collector.h
+++ b/ash/wm/desks/templates/restore_data_collector.h
@@ -27,6 +27,7 @@
 namespace ash {
 
 class DeskTemplate;
+enum class DeskTemplateType;
 
 // Collects `AppLaunchData` from all applications that are currently active, and
 // returns it in form of `DeskTemplate` record.
@@ -43,6 +44,7 @@
   // Captures the active desk and returns it as a `DeskTemplate` object via the
   // `callback`.
   void CaptureActiveDeskAsTemplate(GetDeskTemplateCallback callback,
+                                   DeskTemplateType template_type,
                                    const std::string& template_name,
                                    aura::Window* root_window_to_show);
 
@@ -54,6 +56,7 @@
     Call& operator=(Call&&);
     ~Call();
 
+    DeskTemplateType template_type;
     std::string template_name;
     aura::Window* root_window_to_show;
     std::vector<aura::Window*> unsupported_apps;
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc
index 21fd082..da5bf13c 100644
--- a/ash/wm/overview/overview_grid.cc
+++ b/ash/wm/overview/overview_grid.cc
@@ -2428,6 +2428,7 @@
 
 void OverviewGrid::OnSaveDeskAsTemplateButtonPressed() {
   DesksTemplatesPresenter::Get()->MaybeSaveActiveDeskAsTemplate(
+      DeskTemplateType::kTemplate,
       save_desk_as_template_widget_->GetNativeWindow()->GetRootWindow());
 }
 
diff --git a/base/android/java/src/org/chromium/base/ContextUtils.java b/base/android/java/src/org/chromium/base/ContextUtils.java
index 51aaedd..8c4c733 100644
--- a/base/android/java/src/org/chromium/base/ContextUtils.java
+++ b/base/android/java/src/org/chromium/base/ContextUtils.java
@@ -123,6 +123,16 @@
         Holder.sSharedPreferences = fetchAppSharedPreferences();
     }
 
+    /**
+     * Tests that use the applicationContext may unintentionally use the Context
+     * set by a previously run test.
+     */
+    @VisibleForTesting
+    public static void clearApplicationContextForTests() {
+        sApplicationContext = null;
+        Holder.sSharedPreferences = null;
+    }
+
     private static void initJavaSideApplicationContext(Context appContext) {
         assert appContext != null;
         // Guard against anyone trying to downcast.
diff --git a/base/debug/activity_tracker.cc b/base/debug/activity_tracker.cc
index d47b405..4cae652 100644
--- a/base/debug/activity_tracker.cc
+++ b/base/debug/activity_tracker.cc
@@ -19,6 +19,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
 #include "base/pending_task.h"
 #include "base/pickle.h"
 #include "base/process/process.h"
diff --git a/base/files/file_util.cc b/base/files/file_util.cc
index 2b72860..dbc12d4 100644
--- a/base/files/file_util.cc
+++ b/base/files/file_util.cc
@@ -19,6 +19,7 @@
 #include "base/check_op.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
+#include "base/notreached.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
diff --git a/base/files/file_util_posix.cc b/base/files/file_util_posix.cc
index 7577b45..c148a50 100644
--- a/base/files/file_util_posix.cc
+++ b/base/files/file_util_posix.cc
@@ -32,6 +32,7 @@
 #include "base/files/scoped_file.h"
 #include "base/logging.h"
 #include "base/memory/singleton.h"
+#include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/path_service.h"
 #include "base/posix/eintr_wrapper.h"
diff --git a/base/files/important_file_writer.cc b/base/files/important_file_writer.cc
index 69cc4d2..0344539 100644
--- a/base/files/important_file_writer.cc
+++ b/base/files/important_file_writer.cc
@@ -23,6 +23,7 @@
 #include "base/files/important_file_writer_cleaner.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
diff --git a/base/memory/discardable_memory.cc b/base/memory/discardable_memory.cc
index 77b0b29..7092f6a 100644
--- a/base/memory/discardable_memory.cc
+++ b/base/memory/discardable_memory.cc
@@ -8,6 +8,7 @@
 #include "base/memory/discardable_memory_internal.h"
 #include "base/memory/madv_free_discardable_memory_posix.h"
 #include "base/metrics/field_trial_params.h"
+#include "base/notreached.h"
 #include "build/build_config.h"
 
 #if BUILDFLAG(IS_ANDROID)
diff --git a/base/memory/madv_free_discardable_memory_posix.cc b/base/memory/madv_free_discardable_memory_posix.cc
index 45f1c8f1..22d20211 100644
--- a/base/memory/madv_free_discardable_memory_posix.cc
+++ b/base/memory/madv_free_discardable_memory_posix.cc
@@ -18,6 +18,7 @@
 #include "base/logging.h"
 #include "base/memory/madv_free_discardable_memory_allocator_posix.h"
 #include "base/memory/page_size.h"
+#include "base/notreached.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/tracing_buildflags.h"
diff --git a/base/metrics/field_trial.cc b/base/metrics/field_trial.cc
index 3b4e2da..6354623 100644
--- a/base/metrics/field_trial.cc
+++ b/base/metrics/field_trial.cc
@@ -14,6 +14,7 @@
 #include "base/logging.h"
 #include "base/metrics/field_trial_param_associator.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
 #include "base/process/memory.h"
 #include "base/process/process_handle.h"
 #include "base/process/process_info.h"
diff --git a/base/metrics/field_trial_params.cc b/base/metrics/field_trial_params.cc
index 051d3c5..54234725 100644
--- a/base/metrics/field_trial_params.cc
+++ b/base/metrics/field_trial_params.cc
@@ -11,6 +11,7 @@
 #include "base/feature_list.h"
 #include "base/metrics/field_trial.h"
 #include "base/metrics/field_trial_param_associator.h"
+#include "base/notreached.h"
 #include "base/strings/escape.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
diff --git a/base/metrics/histogram.cc b/base/metrics/histogram.cc
index 38b70144..d95d2b44 100644
--- a/base/metrics/histogram.cc
+++ b/base/metrics/histogram.cc
@@ -29,6 +29,7 @@
 #include "base/metrics/persistent_memory_allocator.h"
 #include "base/metrics/sample_vector.h"
 #include "base/metrics/statistics_recorder.h"
+#include "base/notreached.h"
 #include "base/pickle.h"
 #include "base/ranges/algorithm.h"
 #include "base/strings/string_util.h"
diff --git a/base/metrics/persistent_histogram_allocator.cc b/base/metrics/persistent_histogram_allocator.cc
index b5e20a3..492d96e 100644
--- a/base/metrics/persistent_histogram_allocator.cc
+++ b/base/metrics/persistent_histogram_allocator.cc
@@ -24,6 +24,7 @@
 #include "base/metrics/persistent_sample_map.h"
 #include "base/metrics/sparse_histogram.h"
 #include "base/metrics/statistics_recorder.h"
+#include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/pickle.h"
 #include "base/process/process_handle.h"
diff --git a/base/metrics/persistent_memory_allocator.cc b/base/metrics/persistent_memory_allocator.cc
index 1d1fd03..4f8d17a 100644
--- a/base/metrics/persistent_memory_allocator.cc
+++ b/base/metrics/persistent_memory_allocator.cc
@@ -14,6 +14,7 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/sparse_histogram.h"
+#include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_piece.h"
 #include "base/system/sys_info.h"
diff --git a/base/metrics/sparse_histogram.cc b/base/metrics/sparse_histogram.cc
index 249b3c4..b30192c 100644
--- a/base/metrics/sparse_histogram.cc
+++ b/base/metrics/sparse_histogram.cc
@@ -14,6 +14,7 @@
 #include "base/metrics/persistent_sample_map.h"
 #include "base/metrics/sample_map.h"
 #include "base/metrics/statistics_recorder.h"
+#include "base/notreached.h"
 #include "base/pickle.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock.h"
diff --git a/base/native_library_posix.cc b/base/native_library_posix.cc
index 0a96b25ab..4f9bf6f 100644
--- a/base/native_library_posix.cc
+++ b/base/native_library_posix.cc
@@ -8,6 +8,7 @@
 
 #include "base/files/file_path.h"
 #include "base/logging.h"
+#include "base/notreached.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
diff --git a/base/power_monitor/power_monitor_source.cc b/base/power_monitor/power_monitor_source.cc
index 1fe7cab..7cc18ef 100644
--- a/base/power_monitor/power_monitor_source.cc
+++ b/base/power_monitor/power_monitor_source.cc
@@ -4,6 +4,7 @@
 
 #include "base/power_monitor/power_monitor_source.h"
 
+#include "base/notreached.h"
 #include "base/power_monitor/power_monitor.h"
 #include "base/power_monitor/power_observer.h"
 #include "build/build_config.h"
diff --git a/base/process/process_posix.cc b/base/process/process_posix.cc
index f91d829..bc49d4d 100644
--- a/base/process/process_posix.cc
+++ b/base/process/process_posix.cc
@@ -16,6 +16,7 @@
 #include "base/debug/activity_tracker.h"
 #include "base/files/scoped_file.h"
 #include "base/logging.h"
+#include "base/notreached.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/process/kill.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/base/task/sequence_manager/sequence_manager_impl.cc b/base/task/sequence_manager/sequence_manager_impl.cc
index 1423534a..7b138cd7 100644
--- a/base/task/sequence_manager/sequence_manager_impl.cc
+++ b/base/task/sequence_manager/sequence_manager_impl.cc
@@ -18,6 +18,7 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/no_destructor.h"
+#include "base/notreached.h"
 #include "base/observer_list.h"
 #include "base/rand_util.h"
 #include "base/ranges/algorithm.h"
diff --git a/base/task/sequence_manager/task_queue_impl.cc b/base/task/sequence_manager/task_queue_impl.cc
index 9daa259..54a73d1 100644
--- a/base/task/sequence_manager/task_queue_impl.cc
+++ b/base/task/sequence_manager/task_queue_impl.cc
@@ -15,6 +15,7 @@
 #include "base/feature_list.h"
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
+#include "base/notreached.h"
 #include "base/observer_list.h"
 #include "base/ranges/algorithm.h"
 #include "base/strings/stringprintf.h"
diff --git a/base/task/sequence_manager/thread_controller_impl.cc b/base/task/sequence_manager/thread_controller_impl.cc
index 16e6f6fe..32915d18 100644
--- a/base/task/sequence_manager/thread_controller_impl.cc
+++ b/base/task/sequence_manager/thread_controller_impl.cc
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_pump.h"
+#include "base/notreached.h"
 #include "base/run_loop.h"
 #include "base/task/sequence_manager/lazy_now.h"
 #include "base/task/sequence_manager/sequence_manager_impl.h"
diff --git a/base/task/simple_task_executor.cc b/base/task/simple_task_executor.cc
index 09b5921..7b1163d 100644
--- a/base/task/simple_task_executor.cc
+++ b/base/task/simple_task_executor.cc
@@ -4,6 +4,7 @@
 
 #include "base/task/simple_task_executor.h"
 
+#include "base/notreached.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 
diff --git a/base/task/thread_pool/task_tracker.cc b/base/task/thread_pool/task_tracker.cc
index 9afd26c..683169f 100644
--- a/base/task/thread_pool/task_tracker.cc
+++ b/base/task/thread_pool/task_tracker.cc
@@ -17,6 +17,7 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
 #include "base/sequence_token.h"
 #include "base/strings/string_util.h"
 #include "base/synchronization/condition_variable.h"
diff --git a/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java b/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java
index 6c02abe9..950de172 100644
--- a/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java
+++ b/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java
@@ -46,6 +46,7 @@
                 LifetimeAssert.assertAllInstancesDestroyedForTesting();
             } finally {
                 ApplicationStatus.destroyForJUnitTests();
+                ContextUtils.clearApplicationContextForTests();
                 PathUtils.resetForTesting();
                 super.afterTest(method);
             }
diff --git a/base/test/trace_event_analyzer.cc b/base/test/trace_event_analyzer.cc
index 9da67a3..656e1d4 100644
--- a/base/test/trace_event_analyzer.cc
+++ b/base/test/trace_event_analyzer.cc
@@ -174,6 +174,7 @@
   }
 
   // For each argument, copy the type and create a trace_analyzer::TraceValue.
+  // TODO(crbug.com/1303874): Add BINARY and LIST arg types if needed.
   if (maybe_args) {
     for (auto pair : maybe_args->DictItems()) {
       switch (pair.second.type()) {
@@ -193,12 +194,13 @@
           arg_numbers[pair.first] = pair.second.GetDouble();
           break;
 
+        case base::Value::Type::DICT:
+          arg_dicts[pair.first] = pair.second.GetDict().Clone();
+          break;
+
         default:
           break;
       }
-
-      // Record all arguments as values.
-      arg_values[pair.first] = pair.second.Clone();
     }
   }
 
@@ -231,18 +233,8 @@
 
 bool TraceEvent::GetArgAsDict(const std::string& arg_name,
                               base::Value::Dict* arg) const {
-  const auto it = arg_values.find(arg_name);
-  if (it != arg_values.end() && it->second.is_dict()) {
-    *arg = it->second.GetDict().Clone();
-    return true;
-  }
-  return false;
-}
-
-bool TraceEvent::GetArgAsValue(const std::string& arg_name,
-                               base::Value* arg) const {
-  const auto it = arg_values.find(arg_name);
-  if (it != arg_values.end()) {
+  const auto it = arg_dicts.find(arg_name);
+  if (it != arg_dicts.end()) {
     *arg = it->second.Clone();
     return true;
   }
@@ -258,12 +250,7 @@
 }
 
 bool TraceEvent::HasDictArg(const std::string& arg_name) const {
-  const auto it = arg_values.find(arg_name);
-  return (it != arg_values.end() && it->second.is_dict());
-}
-
-bool TraceEvent::HasArg(const std::string& arg_name) const {
-  return (arg_values.find(arg_name) != arg_values.end());
+  return (arg_dicts.find(arg_name) != arg_dicts.end());
 }
 
 std::string TraceEvent::GetKnownArgAsString(const std::string& arg_name) const {
@@ -302,13 +289,6 @@
   return arg_dict;
 }
 
-base::Value TraceEvent::GetKnownArgAsValue(const std::string& arg_name) const {
-  base::Value arg_value;
-  bool result = GetArgAsValue(arg_name, &arg_value);
-  DCHECK(result);
-  return arg_value;
-}
-
 // QueryNode
 
 QueryNode::QueryNode(const Query& query) : query_(query) {
diff --git a/base/test/trace_event_analyzer.h b/base/test/trace_event_analyzer.h
index cb68df06..04b0845 100644
--- a/base/test/trace_event_analyzer.h
+++ b/base/test/trace_event_analyzer.h
@@ -152,8 +152,6 @@
   bool GetArgAsNumber(const std::string& arg_name, double* arg) const;
   // Return the argument value if it exists and is a dictionary.
   bool GetArgAsDict(const std::string& arg_name, base::Value::Dict* arg) const;
-  // Return the argument value if it exists.
-  bool GetArgAsValue(const std::string& arg_name, base::Value* arg) const;
 
   // Check if argument exists and is string.
   bool HasStringArg(const std::string& arg_name) const;
@@ -161,8 +159,6 @@
   bool HasNumberArg(const std::string& arg_name) const;
   // Check if argument exists and is a dictionary.
   bool HasDictArg(const std::string& arg_name) const;
-  // Check if argument exists.
-  bool HasArg(const std::string& arg_name) const;
 
   // Get known existing arguments as specific types.
   // Useful when you have already queried the argument with
@@ -172,7 +168,6 @@
   int GetKnownArgAsInt(const std::string& arg_name) const;
   bool GetKnownArgAsBool(const std::string& arg_name) const;
   base::Value::Dict GetKnownArgAsDict(const std::string& arg_name) const;
-  base::Value GetKnownArgAsValue(const std::string& arg_name) const;
 
   // Process ID and Thread ID.
   ProcessThreadID thread;
@@ -198,7 +193,7 @@
   // bool becomes 1.0 (true) or 0.0 (false).
   std::map<std::string, double> arg_numbers;
   std::map<std::string, std::string> arg_strings;
-  std::map<std::string, base::Value> arg_values;
+  std::map<std::string, base::Value::Dict> arg_dicts;
 
   // The other event associated with this event (or NULL).
   raw_ptr<const TraceEvent> other_event = nullptr;
diff --git a/base/test/trace_event_analyzer_unittest.cc b/base/test/trace_event_analyzer_unittest.cc
index 68cb1f2..75cc29cf 100644
--- a/base/test/trace_event_analyzer_unittest.cc
+++ b/base/test/trace_event_analyzer_unittest.cc
@@ -105,7 +105,7 @@
   event.arg_numbers["int"] = static_cast<double>(int_num);
   event.arg_numbers["double"] = double_num;
   event.arg_strings["string"] = str;
-  event.arg_values["dict"] = base::Value(dict.Clone());
+  event.arg_dicts["dict"] = dict.Clone();
 
   ASSERT_TRUE(event.HasNumberArg("false"));
   ASSERT_TRUE(event.HasNumberArg("true"));
@@ -115,7 +115,6 @@
   ASSERT_FALSE(event.HasNumberArg("notfound"));
   ASSERT_FALSE(event.HasStringArg("notfound"));
   ASSERT_TRUE(event.HasDictArg("dict"));
-  ASSERT_FALSE(event.HasArg("notfound"));
 
   EXPECT_FALSE(event.GetKnownArgAsBool("false"));
   EXPECT_TRUE(event.GetKnownArgAsBool("true"));
@@ -125,59 +124,6 @@
   EXPECT_EQ(dict, event.GetKnownArgAsDict("dict"));
 }
 
-TEST_F(TraceEventAnalyzerTest, TraceEventArgsAsValues) {
-  ManualSetUp();
-
-  int int_num = 2;
-  double double_num = 3.5;
-  const char str[] = "the string";
-
-  base::Value::Dict dict;
-  dict.Set("the key", "the value");
-
-  BeginTracing();
-  {
-    TRACE_EVENT_INSTANT1("cat", "name", TRACE_EVENT_SCOPE_THREAD, "int",
-                         int_num);
-    TRACE_EVENT_INSTANT1("cat", "name", TRACE_EVENT_SCOPE_THREAD, "double",
-                         double_num);
-    TRACE_EVENT_INSTANT1("cat", "name", TRACE_EVENT_SCOPE_THREAD, "true", true);
-    TRACE_EVENT_INSTANT1("cat", "name", TRACE_EVENT_SCOPE_THREAD, "string",
-                         str);
-
-    std::unique_ptr<base::trace_event::TracedValue> value(
-        new base::trace_event::TracedValue);
-    value->SetString("the key", "the value");
-    TRACE_EVENT_INSTANT1("cat", "name", TRACE_EVENT_SCOPE_THREAD, "dict",
-                         std::move(value));
-  }
-  EndTracing();
-
-  std::unique_ptr<TraceAnalyzer> analyzer(
-      TraceAnalyzer::Create(output_.json_output));
-  ASSERT_TRUE(analyzer.get());
-
-  TraceEventVector events;
-  analyzer->FindEvents(Query::EventName() == Query::String("name"), &events);
-
-  ASSERT_EQ(5u, events.size());
-  ASSERT_TRUE(events[0]->HasArg("int"));
-  EXPECT_EQ(base::Value(int_num), events[0]->GetKnownArgAsValue("int"));
-
-  ASSERT_TRUE(events[1]->HasArg("double"));
-  EXPECT_EQ(base::Value(double_num), events[1]->GetKnownArgAsValue("double"));
-
-  ASSERT_TRUE(events[2]->HasArg("true"));
-  EXPECT_EQ(base::Value(true), events[2]->GetKnownArgAsValue("true"));
-
-  ASSERT_TRUE(events[3]->HasArg("string"));
-  EXPECT_EQ(base::Value(str), events[3]->GetKnownArgAsValue("string"));
-
-  ASSERT_TRUE(events[4]->HasArg("dict"));
-  EXPECT_EQ(base::Value(std::move(dict)),
-            events[4]->GetKnownArgAsValue("dict"));
-}
-
 TEST_F(TraceEventAnalyzerTest, QueryEventMember) {
   ManualSetUp();
 
diff --git a/base/threading/platform_thread_linux.cc b/base/threading/platform_thread_linux.cc
index 9d7bf3a..033e8de 100644
--- a/base/threading/platform_thread_linux.cc
+++ b/base/threading/platform_thread_linux.cc
@@ -18,6 +18,7 @@
 #include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/metrics/field_trial_params.h"
+#include "base/notreached.h"
 #include "base/process/internal_linux.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
diff --git a/base/threading/platform_thread_posix.cc b/base/threading/platform_thread_posix.cc
index d1b7167..d51b37c 100644
--- a/base/threading/platform_thread_posix.cc
+++ b/base/threading/platform_thread_posix.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "base/notreached.h"
 #include "base/threading/platform_thread.h"
 
 #include <errno.h>
diff --git a/base/time/time_win.cc b/base/time/time_win.cc
index 285e4ec2..77ab430 100644
--- a/base/time/time_win.cc
+++ b/base/time/time_win.cc
@@ -686,8 +686,14 @@
 
 // static
 bool ThreadTicks::IsSupportedWin() {
+#if defined(ARCH_CPU_ARM64)
+  // The Arm implementation does not use QueryThreadCycleTime and therefore does
+  // not care about the time stamp counter.
+  return true;
+#else
   static bool is_supported = CPU().has_non_stop_time_stamp_counter();
   return is_supported;
+#endif
 }
 
 // static
diff --git a/base/trace_event/blame_context_unittest.cc b/base/trace_event/blame_context_unittest.cc
index c41a9cc8..5b1372f 100644
--- a/base/trace_event/blame_context_unittest.cc
+++ b/base/trace_event/blame_context_unittest.cc
@@ -144,17 +144,17 @@
   EXPECT_EQ(kTestBlameContextCategory, events[0]->category);
   EXPECT_EQ(kTestBlameContextType, events[0]->name);
   EXPECT_EQ("0x5678", events[0]->id);
-  EXPECT_TRUE(events[0]->HasArg("snapshot"));
+  EXPECT_TRUE(events[0]->HasDictArg("snapshot"));
 
   EXPECT_EQ(kTestBlameContextCategory, events[1]->category);
   EXPECT_EQ(kTestBlameContextType, events[1]->name);
   EXPECT_EQ("0x1234", events[1]->id);
-  EXPECT_TRUE(events[0]->HasArg("snapshot"));
+  EXPECT_TRUE(events[0]->HasDictArg("snapshot"));
 
   EXPECT_EQ(kTestBlameContextCategory, events[2]->category);
   EXPECT_EQ(kTestBlameContextType, events[2]->name);
   EXPECT_EQ("0x1234", events[2]->id);
-  EXPECT_TRUE(events[0]->HasArg("snapshot"));
+  EXPECT_TRUE(events[0]->HasDictArg("snapshot"));
 
   const char kExpectedSnapshotJson[] =
       "{"
@@ -166,7 +166,7 @@
       "}";
 
   std::string snapshot_json;
-  JSONWriter::Write(events[2]->GetKnownArgAsValue("snapshot"), &snapshot_json);
+  JSONWriter::Write(events[2]->GetKnownArgAsDict("snapshot"), &snapshot_json);
   EXPECT_EQ(kExpectedSnapshotJson, snapshot_json);
 }
 
diff --git a/base/trace_event/log_message.cc b/base/trace_event/log_message.cc
index de8ee71..e9ce56f 100644
--- a/base/trace_event/log_message.cc
+++ b/base/trace_event/log_message.cc
@@ -9,6 +9,7 @@
 #include <string>
 
 #include "base/json/string_escape.h"
+#include "base/notreached.h"
 #include "base/strings/stringprintf.h"
 
 namespace base {
diff --git a/base/trace_event/memory_allocator_dump.cc b/base/trace_event/memory_allocator_dump.cc
index 4a6f5d7..ee5c2c5 100644
--- a/base/trace_event/memory_allocator_dump.cc
+++ b/base/trace_event/memory_allocator_dump.cc
@@ -8,6 +8,7 @@
 
 #include "base/format_macros.h"
 #include "base/memory/ptr_util.h"
+#include "base/notreached.h"
 #include "base/strings/stringprintf.h"
 #include "base/trace_event/memory_dump_manager.h"
 #include "base/trace_event/memory_dump_provider.h"
diff --git a/base/trace_event/trace_config.cc b/base/trace_event/trace_config.cc
index aa91b84..7882ab23 100644
--- a/base/trace_event/trace_config.cc
+++ b/base/trace_event/trace_config.cc
@@ -13,6 +13,7 @@
 #include "base/json/json_writer.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "base/notreached.h"
 #include "base/strings/string_split.h"
 #include "base/trace_event/memory_dump_manager.h"
 #include "base/trace_event/memory_dump_request_args.h"
diff --git a/base/trace_event/trace_event_impl.cc b/base/trace_event/trace_event_impl.cc
index 2136e78f..d65d6794 100644
--- a/base/trace_event/trace_event_impl.cc
+++ b/base/trace_event/trace_event_impl.cc
@@ -11,6 +11,7 @@
 #include "base/format_macros.h"
 #include "base/json/string_escape.h"
 #include "base/memory/ptr_util.h"
+#include "base/notreached.h"
 #include "base/process/process_handle.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
diff --git a/base/trace_event/trace_event_memory_overhead.cc b/base/trace_event/trace_event_memory_overhead.cc
index e8a65af..ab25522 100644
--- a/base/trace_event/trace_event_memory_overhead.cc
+++ b/base/trace_event/trace_event_memory_overhead.cc
@@ -8,6 +8,7 @@
 
 #include "base/bits.h"
 #include "base/memory/ref_counted_memory.h"
+#include "base/notreached.h"
 #include "base/strings/stringprintf.h"
 #include "base/trace_event/memory_allocator_dump.h"
 #include "base/trace_event/memory_usage_estimator.h"
diff --git a/base/trace_event/trace_log.cc b/base/trace_event/trace_log.cc
index 204a8ba..7cb3b46 100644
--- a/base/trace_event/trace_log.cc
+++ b/base/trace_event/trace_log.cc
@@ -21,6 +21,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/no_destructor.h"
+#include "base/notreached.h"
 #include "base/process/process.h"
 #include "base/process/process_metrics.h"
 #include "base/ranges/algorithm.h"
diff --git a/base/trace_event/traced_value.cc b/base/trace_event/traced_value.cc
index abe32b41..ef495654 100644
--- a/base/trace_event/traced_value.cc
+++ b/base/trace_event/traced_value.cc
@@ -15,6 +15,7 @@
 #include "base/json/json_writer.h"
 #include "base/json/string_escape.h"
 #include "base/memory/ptr_util.h"
+#include "base/notreached.h"
 #include "base/pickle.h"
 #include "base/strings/stringprintf.h"
 #include "base/trace_event/trace_event.h"
diff --git a/base/trace_event/typed_macros_internal.cc b/base/trace_event/typed_macros_internal.cc
index 5baa21ff..4e1fdaf0 100644
--- a/base/trace_event/typed_macros_internal.cc
+++ b/base/trace_event/typed_macros_internal.cc
@@ -4,6 +4,7 @@
 
 #include "base/trace_event/typed_macros_internal.h"
 
+#include "base/notreached.h"
 #include "base/time/time.h"
 #include "base/trace_event/thread_instruction_count.h"
 #include "base/trace_event/trace_event.h"
diff --git a/base/tracing/perfetto_task_runner.cc b/base/tracing/perfetto_task_runner.cc
index d932fc8..55fb6a5 100644
--- a/base/tracing/perfetto_task_runner.cc
+++ b/base/tracing/perfetto_task_runner.cc
@@ -9,6 +9,7 @@
 
 #include "base/bind.h"
 #include "base/containers/contains.h"
+#include "base/notreached.h"
 #include "base/task/common/checked_lock_impl.h"
 #include "base/task/common/scoped_defer_task_posting.h"
 #include "base/task/thread_pool.h"
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 427296f3..a58b27f 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -1552,7 +1552,7 @@
         cflags += [ "-Wmax-tokens" ]
       }
 
-      if (llvm_force_head_revision) {
+      if (is_mac) {
         # TODO(https://crbug.com/1309955) Clean up and enable.
         cflags += [ "-Wno-unused-but-set-variable" ]
       }
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index 02b2a8e3..54778413 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-7.20220404.1.1
+7.20220404.3.1
diff --git a/build/install-build-deps.sh b/build/install-build-deps.sh
index cc79cd5..47aa31d 100755
--- a/build/install-build-deps.sh
+++ b/build/install-build-deps.sh
@@ -296,7 +296,22 @@
 lib32_list="linux-libc-dev:i386 libpci3:i386"
 
 # 32-bit libraries needed for a 32-bit build
-lib32_list="$lib32_list libx11-xcb1:i386"
+lib32_list="$lib32_list
+  libasound2:i386
+  libatk-bridge2.0-0:i386
+  libatk1.0-0:i386
+  libatspi2.0-0:i386
+  libdbus-1-3:i386
+  libglib2.0-0:i386
+  libnss3:i386
+  libpango-1.0-0:i386
+  libx11-xcb1:i386
+  libxcomposite1:i386
+  libxdamage1:i386
+  libxkbcommon0:i386
+  libxrandr2:i386
+  libxtst6:i386
+"
 
 # Packages that have been removed from this script.  Regardless of configuration
 # or options passed to this script, whenever a package is removed, it should be
diff --git a/build/linux/sysroot_scripts/reversion_glibc.py b/build/linux/sysroot_scripts/reversion_glibc.py
index 77ce1b3..d2947f6 100755
--- a/build/linux/sysroot_scripts/reversion_glibc.py
+++ b/build/linux/sysroot_scripts/reversion_glibc.py
@@ -16,6 +16,15 @@
 VERSION_PATTERN = re.compile('GLIBC_([0-9\.]+)')
 SECTION_PATTERN = re.compile(r'^ *\[ *[0-9]+\] +(\S+) +\S+ + ([0-9a-f]+) .*$')
 
+# Some otherwise disallowed symbols are referenced in the linux-chromeos build.
+# To continue supporting it, allow these symbols to remain enabled.
+SYMBOL_ALLOWLIST = {
+    'fts64_close',
+    'fts64_open',
+    'fts64_read',
+    'memfd_create',
+}
+
 # The two dictionaries below map from symbol name to
 # (symbol version, symbol index).
 #
@@ -30,72 +39,79 @@
 # Populate |default_version| and |supported_version| with data from readelf.
 stdout = subprocess.check_output(['readelf', '--dyn-syms', '--wide', BIN_FILE])
 for line in stdout.decode("utf-8").split('\n'):
-    cols = re.split('\s+', line)
-    # Skip the preamble.
-    if len(cols) < 9:
-        continue
+  cols = re.split('\s+', line)
+  # Skip the preamble.
+  if len(cols) < 9:
+    continue
 
-    index = cols[1].rstrip(':')
-    # Skip the header.
-    if not index.isdigit():
-        continue
+  index = cols[1].rstrip(':')
+  # Skip the header.
+  if not index.isdigit():
+    continue
 
-    index = int(index)
-    name = cols[8].split('@')
-    # Ignore unversioned symbols.
-    if len(name) < 2:
-        continue
+  index = int(index)
+  name = cols[8].split('@')
+  # Ignore unversioned symbols.
+  if len(name) < 2:
+    continue
 
-    base_name = name[0]
-    version = name[-1]
-    # The default version will have '@@' in the name.
-    is_default = len(name) > 2
+  base_name = name[0]
+  version = name[-1]
+  # The default version will have '@@' in the name.
+  is_default = len(name) > 2
 
-    match = re.match(VERSION_PATTERN, version)
-    # Ignore symbols versioned with GLIBC_PRIVATE.
-    if not match:
-        continue
+  match = re.match(VERSION_PATTERN, version)
+  # Ignore symbols versioned with GLIBC_PRIVATE.
+  if not match:
+    continue
 
-    version = [int(part) for part in match.group(1).split('.')]
-    if version < MAX_ALLOWED_GLIBC_VERSION:
-        old_supported_version = supported_version.get(base_name, ([-1], -1))
-        supported_version[base_name] = max((version, index),
-                                           old_supported_version)
-    if is_default:
-        default_version[base_name] = (version, index)
+  version = [int(part) for part in match.group(1).split('.')]
+  if version < MAX_ALLOWED_GLIBC_VERSION:
+    old_supported_version = supported_version.get(base_name, ([-1], -1))
+    supported_version[base_name] = max((version, index), old_supported_version)
+  if is_default:
+    default_version[base_name] = (version, index)
 
 # Get the offset into the binary of the .gnu.version section from readelf.
 stdout = subprocess.check_output(['readelf', '--sections', '--wide', BIN_FILE])
 for line in stdout.decode("utf-8").split('\n'):
-    if match := SECTION_PATTERN.match(line):
-        section_name, address = match.groups()
-        if section_name == '.gnu.version':
-            gnu_version_addr = int(address, base=16)
-            break
+  if match := SECTION_PATTERN.match(line):
+    section_name, address = match.groups()
+    if section_name == '.gnu.version':
+      gnu_version_addr = int(address, base=16)
+      break
 else:
-    print('No .gnu.version section found', file=sys.stderr)
-    sys.exit(1)
+  print('No .gnu.version section found', file=sys.stderr)
+  sys.exit(1)
 
 # Rewrite the binary.
 bin_data = bytearray(open(BIN_FILE, 'rb').read())
 for name, (version, index) in default_version.items():
-    # No need to rewrite the default if it's already an allowed version.
-    if version <= MAX_ALLOWED_GLIBC_VERSION:
-        continue
+  # No need to rewrite the default if it's already an allowed version.
+  if version <= MAX_ALLOWED_GLIBC_VERSION:
+    continue
 
-    # If there's no replacement for this symbol, then skip it.
-    if name not in supported_version:
-        continue
-
+  if name in SYMBOL_ALLOWLIST:
+    continue
+  elif name in supported_version:
     _, supported_index = supported_version[name]
-    # The .gnu.version section is divided into 16-bit chunks that give the
-    # symbol versions.  The 16th bit is a flag that's false for the default
-    # version.  The data is stored in little-endian so we need to add 1 to
-    # get the address of the byte we want to flip.
-    old_default = gnu_version_addr + 2 * index + 1
+  else:
+    supported_index = -1
+
+  # The .gnu.version section is divided into 16-bit chunks that give the
+  # symbol versions.  The 16th bit is a flag that's false for the default
+  # version.  The data is stored in little-endian so we need to add 1 to
+  # get the address of the byte we want to flip.
+  #
+  # Disable the unsupported symbol.
+  old_default = gnu_version_addr + 2 * index + 1
+  assert (bin_data[old_default] & 0x80) == 0
+  bin_data[old_default] ^= 0x80
+
+  # If we found a supported version, enable that as default.
+  if supported_index != -1:
     new_default = gnu_version_addr + 2 * supported_index + 1
-    assert (bin_data[old_default] & 0x80) == 0
     assert (bin_data[new_default] & 0x80) == 0x80
-    bin_data[old_default] ^= 0x80
     bin_data[new_default] ^= 0x80
+
 open(BIN_FILE, 'wb').write(bin_data)
diff --git a/build/linux/sysroot_scripts/sysroot-creator.sh b/build/linux/sysroot_scripts/sysroot-creator.sh
index a192c642..e3703763 100644
--- a/build/linux/sysroot_scripts/sysroot-creator.sh
+++ b/build/linux/sysroot_scripts/sysroot-creator.sh
@@ -362,12 +362,6 @@
   done
   set -e
 
-  # Avoid requiring unsupported glibc versions.
-  "${SCRIPT_DIR}/reversion_glibc.py" \
-    "${INSTALL_ROOT}/lib/${arch}-${os}/libc.so.6"
-  "${SCRIPT_DIR}/reversion_glibc.py" \
-    "${INSTALL_ROOT}/lib/${arch}-${os}/libm.so.6"
-
   # fcntl64() was introduced in glibc 2.28.  Make sure to use fcntl() instead.
   local fcntl_h="${INSTALL_ROOT}/usr/include/fcntl.h"
   sed -i '{N; s/#ifndef __USE_FILE_OFFSET64\(\nextern int fcntl\)/#if 1\1/}' \
@@ -387,37 +381,58 @@
 }
 
 
+ReversionGlibc() {
+  local arch=$1
+  local os=$2
+
+  # Avoid requiring unsupported glibc versions.
+  "${SCRIPT_DIR}/reversion_glibc.py" \
+    "${INSTALL_ROOT}/lib/${arch}-${os}/libc.so.6"
+  "${SCRIPT_DIR}/reversion_glibc.py" \
+    "${INSTALL_ROOT}/lib/${arch}-${os}/libm.so.6"
+}
+
+
 HacksAndPatchesAmd64() {
   HacksAndPatchesCommon x86_64 linux-gnu strip
+  ReversionGlibc x86_64 linux-gnu
 }
 
 
 HacksAndPatchesI386() {
   HacksAndPatchesCommon i386 linux-gnu strip
+  ReversionGlibc i386 linux-gnu
 }
 
 
 HacksAndPatchesARM() {
   HacksAndPatchesCommon arm linux-gnueabihf arm-linux-gnueabihf-strip
+  ReversionGlibc arm linux-gnueabihf
 }
 
 HacksAndPatchesARM64() {
   # Use the unstripped libdbus for arm64 to prevent linker errors.
   # https://bugs.chromium.org/p/webrtc/issues/detail?id=8535
   HacksAndPatchesCommon aarch64 linux-gnu true
+  # Skip reversion_glibc.py. Glibc is compiled in a way where many libm math
+  # functions do not have compatibility symbols for versions <= 2.17.
+  # ReversionGlibc aarch64 linux-gnu
 }
 
 HacksAndPatchesARMEL() {
   HacksAndPatchesCommon arm linux-gnueabi arm-linux-gnueabi-strip
+  ReversionGlibc arm linux-gnueabi
 }
 
 HacksAndPatchesMips() {
   HacksAndPatchesCommon mipsel linux-gnu mipsel-linux-gnu-strip
+  ReversionGlibc mipsel linux-gnu
 }
 
 
 HacksAndPatchesMips64el() {
   HacksAndPatchesCommon mips64el linux-gnuabi64 mips64el-linux-gnuabi64-strip
+  ReversionGlibc mips64el linux-gnuabi64
 }
 
 
diff --git a/cc/animation/element_animations.cc b/cc/animation/element_animations.cc
index 57d2a9f6..753e500 100644
--- a/cc/animation/element_animations.cc
+++ b/cc/animation/element_animations.cc
@@ -11,6 +11,7 @@
 #include <vector>
 
 #include "base/cxx17_backports.h"
+#include "base/notreached.h"
 #include "base/observer_list.h"
 #include "cc/animation/animation_delegate.h"
 #include "cc/animation/animation_events.h"
diff --git a/cc/animation/keyframe_effect.cc b/cc/animation/keyframe_effect.cc
index 3c58c2a..e9a10909 100644
--- a/cc/animation/keyframe_effect.cc
+++ b/cc/animation/keyframe_effect.cc
@@ -10,6 +10,7 @@
 #include <utility>
 
 #include "base/containers/cxx20_erase.h"
+#include "base/notreached.h"
 #include "base/time/time.h"
 #include "cc/animation/animation.h"
 #include "cc/animation/animation_host.h"
diff --git a/cc/input/threaded_input_handler.cc b/cc/input/threaded_input_handler.cc
index 448d8f9..008fd64 100644
--- a/cc/input/threaded_input_handler.cc
+++ b/cc/input/threaded_input_handler.cc
@@ -7,6 +7,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/notreached.h"
 #include "build/build_config.h"
 #include "cc/base/features.h"
 #include "cc/input/scroll_elasticity_helper.h"
diff --git a/cc/layers/effect_tree_layer_list_iterator.cc b/cc/layers/effect_tree_layer_list_iterator.cc
index b87279c..75a6dd4 100644
--- a/cc/layers/effect_tree_layer_list_iterator.cc
+++ b/cc/layers/effect_tree_layer_list_iterator.cc
@@ -4,6 +4,8 @@
 
 #include "cc/layers/effect_tree_layer_list_iterator.h"
 
+#include "base/notreached.h"
+
 namespace cc {
 
 EffectTreeLayerListIterator::EffectTreeLayerListIterator(
diff --git a/cc/layers/heads_up_display_layer_impl.cc b/cc/layers/heads_up_display_layer_impl.cc
index 409995de..ad9561e 100644
--- a/cc/layers/heads_up_display_layer_impl.cc
+++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -15,6 +15,7 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/shared_memory_mapping.h"
+#include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/single_thread_task_runner.h"
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
index 198c0d9..5000df2 100644
--- a/cc/layers/layer.cc
+++ b/cc/layers/layer.cc
@@ -15,6 +15,7 @@
 #include "base/location.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram.h"
+#include "base/notreached.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc
index 12ebe35..f657d64 100644
--- a/cc/layers/layer_impl.cc
+++ b/cc/layers/layer_impl.cc
@@ -12,6 +12,7 @@
 
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
+#include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/traced_value.h"
diff --git a/cc/layers/scrollbar_layer_base.cc b/cc/layers/scrollbar_layer_base.cc
index 3bbf474..f2aec9f4 100644
--- a/cc/layers/scrollbar_layer_base.cc
+++ b/cc/layers/scrollbar_layer_base.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/notreached.h"
 #include "cc/layers/painted_overlay_scrollbar_layer.h"
 #include "cc/layers/painted_scrollbar_layer.h"
 #include "cc/layers/scrollbar_layer_impl_base.h"
diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
index d14ff1a..d3ecb6b 100644
--- a/cc/metrics/compositor_frame_reporter.cc
+++ b/cc/metrics/compositor_frame_reporter.cc
@@ -11,6 +11,7 @@
 
 #include "base/cpu_reduction_experiment.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
 #include "base/strings/strcat.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
diff --git a/cc/metrics/compositor_timing_history.cc b/cc/metrics/compositor_timing_history.cc
index 479fd3b..1eb6fe1 100644
--- a/cc/metrics/compositor_timing_history.cc
+++ b/cc/metrics/compositor_timing_history.cc
@@ -14,6 +14,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
 #include "base/trace_event/trace_event.h"
 #include "cc/base/features.h"
 #include "cc/debug/rendering_stats_instrumentation.h"
diff --git a/cc/metrics/event_latency_tracing_recorder.cc b/cc/metrics/event_latency_tracing_recorder.cc
index 0630374..96586cf 100644
--- a/cc/metrics/event_latency_tracing_recorder.cc
+++ b/cc/metrics/event_latency_tracing_recorder.cc
@@ -4,6 +4,7 @@
 
 #include "cc/metrics/event_latency_tracing_recorder.h"
 
+#include "base/notreached.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_id_helper.h"
 #include "base/trace_event/typed_macros.h"
diff --git a/cc/metrics/frame_sequence_metrics.cc b/cc/metrics/frame_sequence_metrics.cc
index e9fe034..1f4c2a5 100644
--- a/cc/metrics/frame_sequence_metrics.cc
+++ b/cc/metrics/frame_sequence_metrics.cc
@@ -10,6 +10,7 @@
 
 #include "base/metrics/histogram.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
 #include "base/strings/strcat.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/traced_value.h"
diff --git a/cc/metrics/frame_sequence_tracker.cc b/cc/metrics/frame_sequence_tracker.cc
index ca00bb0..baf282b8 100644
--- a/cc/metrics/frame_sequence_tracker.cc
+++ b/cc/metrics/frame_sequence_tracker.cc
@@ -15,6 +15,7 @@
 #include "base/logging.h"
 #include "base/metrics/histogram.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/traced_value.h"
 #include "components/viz/common/frame_sinks/begin_frame_args.h"
diff --git a/cc/metrics/jank_metrics.cc b/cc/metrics/jank_metrics.cc
index 499f2d66..f0cc626 100644
--- a/cc/metrics/jank_metrics.cc
+++ b/cc/metrics/jank_metrics.cc
@@ -11,6 +11,7 @@
 
 #include "base/metrics/histogram.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
 #include "base/strings/strcat.h"
 #include "base/trace_event/trace_event.h"
 #include "cc/metrics/frame_sequence_tracker.h"
diff --git a/cc/paint/image_transfer_cache_entry.cc b/cc/paint/image_transfer_cache_entry.cc
index 1baee0b..9c64c1f 100644
--- a/cc/paint/image_transfer_cache_entry.cc
+++ b/cc/paint/image_transfer_cache_entry.cc
@@ -10,6 +10,7 @@
 
 #include "base/callback_helpers.h"
 #include "base/logging.h"
+#include "base/notreached.h"
 #include "base/numerics/checked_math.h"
 #include "base/numerics/safe_conversions.h"
 #include "cc/paint/paint_op_reader.h"
diff --git a/cc/paint/paint_filter.cc b/cc/paint/paint_filter.cc
index 301e7e8..76e7ae0 100644
--- a/cc/paint/paint_filter.cc
+++ b/cc/paint/paint_filter.cc
@@ -10,6 +10,7 @@
 
 #include "base/memory/values_equivalent.h"
 #include "base/no_destructor.h"
+#include "base/notreached.h"
 #include "base/stl_util.h"
 #include "build/build_config.h"
 #include "cc/paint/draw_image.h"
diff --git a/cc/paint/paint_flags.cc b/cc/paint/paint_flags.cc
index 58b5119..29918c7 100644
--- a/cc/paint/paint_flags.cc
+++ b/cc/paint/paint_flags.cc
@@ -6,6 +6,7 @@
 
 #include "cc/paint/paint_flags.h"
 
+#include "base/notreached.h"
 #include "cc/paint/paint_filter.h"
 #include "cc/paint/paint_op_buffer.h"
 #include "cc/paint/paint_op_writer.h"
diff --git a/cc/paint/paint_op_buffer.cc b/cc/paint/paint_op_buffer.cc
index 797f118..f332c99 100644
--- a/cc/paint/paint_op_buffer.cc
+++ b/cc/paint/paint_op_buffer.cc
@@ -11,6 +11,7 @@
 
 #include "base/bind.h"
 #include "base/memory/raw_ptr.h"
+#include "base/notreached.h"
 #include "base/stl_util.h"
 #include "cc/paint/decoded_draw_image.h"
 #include "cc/paint/display_item_list.h"
diff --git a/cc/paint/paint_op_reader.cc b/cc/paint/paint_op_reader.cc
index f7ea17c..eff2ba2 100644
--- a/cc/paint/paint_op_reader.cc
+++ b/cc/paint/paint_op_reader.cc
@@ -16,6 +16,7 @@
 #include "base/debug/dump_without_crashing.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/notreached.h"
 #include "base/rand_util.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
diff --git a/cc/paint/paint_op_writer.cc b/cc/paint/paint_op_writer.cc
index 2920ff0b..8e9e62a 100644
--- a/cc/paint/paint_op_writer.cc
+++ b/cc/paint/paint_op_writer.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/bits.h"
+#include "base/notreached.h"
 #include "cc/paint/draw_image.h"
 #include "cc/paint/image_provider.h"
 #include "cc/paint/image_transfer_cache_entry.h"
diff --git a/cc/paint/paint_shader.cc b/cc/paint/paint_shader.cc
index 3039c0c..313c35a 100644
--- a/cc/paint/paint_shader.cc
+++ b/cc/paint/paint_shader.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/atomic_sequence_num.h"
+#include "base/notreached.h"
 #include "base/stl_util.h"
 #include "cc/paint/image_provider.h"
 #include "cc/paint/paint_image_builder.h"
diff --git a/cc/raster/raster_buffer_provider.cc b/cc/raster/raster_buffer_provider.cc
index 465315f..874df9d9 100644
--- a/cc/raster/raster_buffer_provider.cc
+++ b/cc/raster/raster_buffer_provider.cc
@@ -6,6 +6,7 @@
 
 #include <stddef.h>
 
+#include "base/notreached.h"
 #include "base/trace_event/trace_event.h"
 #include "cc/raster/raster_source.h"
 #include "components/viz/common/resources/platform_color.h"
diff --git a/cc/tiles/checker_image_tracker.cc b/cc/tiles/checker_image_tracker.cc
index 413d71d..1491f088 100644
--- a/cc/tiles/checker_image_tracker.cc
+++ b/cc/tiles/checker_image_tracker.cc
@@ -12,6 +12,7 @@
 
 #include "base/bind.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
 #include "base/trace_event/trace_event.h"
 
 namespace cc {
diff --git a/cc/tiles/gpu_image_decode_cache.cc b/cc/tiles/gpu_image_decode_cache.cc
index a0271286..3507754 100644
--- a/cc/tiles/gpu_image_decode_cache.cc
+++ b/cc/tiles/gpu_image_decode_cache.cc
@@ -21,6 +21,7 @@
 #include "base/memory/discardable_memory_allocator.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
 #include "base/numerics/safe_math.h"
 #include "base/strings/stringprintf.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/cc/tiles/raster_tile_priority_queue.cc b/cc/tiles/raster_tile_priority_queue.cc
index 2c010df..a3374d4 100644
--- a/cc/tiles/raster_tile_priority_queue.cc
+++ b/cc/tiles/raster_tile_priority_queue.cc
@@ -4,6 +4,7 @@
 
 #include "cc/tiles/raster_tile_priority_queue.h"
 
+#include "base/notreached.h"
 #include "cc/tiles/raster_tile_priority_queue_all.h"
 #include "cc/tiles/raster_tile_priority_queue_required.h"
 
diff --git a/cc/tiles/raster_tile_priority_queue_all.cc b/cc/tiles/raster_tile_priority_queue_all.cc
index 564ddfe..809eca787 100644
--- a/cc/tiles/raster_tile_priority_queue_all.cc
+++ b/cc/tiles/raster_tile_priority_queue_all.cc
@@ -4,6 +4,7 @@
 
 #include "cc/tiles/raster_tile_priority_queue_all.h"
 
+#include "base/notreached.h"
 #include "cc/tiles/tiling_set_raster_queue_all.h"
 
 namespace cc {
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
index 6e4d991..caf59ca 100644
--- a/cc/tiles/tile_manager.cc
+++ b/cc/tiles/tile_manager.cc
@@ -16,6 +16,7 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram.h"
+#include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/thread_checker.h"
diff --git a/cc/tiles/tiling_set_eviction_queue.cc b/cc/tiles/tiling_set_eviction_queue.cc
index dd62c86..bea0ec1 100644
--- a/cc/tiles/tiling_set_eviction_queue.cc
+++ b/cc/tiles/tiling_set_eviction_queue.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "base/notreached.h"
 #include "cc/tiles/tiling_set_eviction_queue.h"
 
 namespace cc {
diff --git a/cc/tiles/tiling_set_raster_queue_all.cc b/cc/tiles/tiling_set_raster_queue_all.cc
index 5ff4d05a..f65141a 100644
--- a/cc/tiles/tiling_set_raster_queue_all.cc
+++ b/cc/tiles/tiling_set_raster_queue_all.cc
@@ -8,6 +8,7 @@
 
 #include <utility>
 
+#include "base/notreached.h"
 #include "cc/tiles/picture_layer_tiling_set.h"
 #include "cc/tiles/tile.h"
 #include "cc/tiles/tile_priority.h"
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc
index 6b64d9a..02a889c 100644
--- a/cc/trees/draw_property_utils.cc
+++ b/cc/trees/draw_property_utils.cc
@@ -13,6 +13,7 @@
 #include "base/containers/flat_map.h"
 #include "base/containers/stack.h"
 #include "base/logging.h"
+#include "base/notreached.h"
 #include "build/build_config.h"
 #include "cc/base/math_util.h"
 #include "cc/layers/draw_properties.h"
diff --git a/cc/trees/effect_node.cc b/cc/trees/effect_node.cc
index cf21813..b08f9cf 100644
--- a/cc/trees/effect_node.cc
+++ b/cc/trees/effect_node.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "cc/trees/effect_node.h"
+#include "base/notreached.h"
 #include "base/trace_event/traced_value.h"
 #include "cc/layers/layer.h"
 #include "cc/trees/property_tree.h"
diff --git a/cc/trees/image_animation_controller.cc b/cc/trees/image_animation_controller.cc
index 193a7ca..9f7bc67 100644
--- a/cc/trees/image_animation_controller.cc
+++ b/cc/trees/image_animation_controller.cc
@@ -9,6 +9,7 @@
 
 #include "base/bind.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
 #include "base/trace_event/trace_event.h"
 #include "cc/base/features.h"
 #include "cc/paint/image_animation_count.h"
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index ecc5d25..14e1316 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -29,6 +29,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/read_only_shared_memory_region.h"
 #include "base/metrics/histogram.h"
+#include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/system/sys_info.h"
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index ca71933..bb4c9a0 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -23,6 +23,7 @@
 #include "base/json/json_writer.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
 #include "base/strings/stringprintf.h"
 #include "base/timer/elapsed_timer.h"
 #include "base/trace_event/trace_event.h"
diff --git a/cc/trees/proxy_impl.cc b/cc/trees/proxy_impl.cc
index 294824f..dd71aba 100644
--- a/cc/trees/proxy_impl.cc
+++ b/cc/trees/proxy_impl.cc
@@ -15,6 +15,7 @@
 #include "base/auto_reset.h"
 #include "base/bind.h"
 #include "base/memory/raw_ptr.h"
+#include "base/notreached.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/traced_value.h"
 #include "cc/base/devtools_instrumentation.h"
diff --git a/cc/trees/proxy_main.cc b/cc/trees/proxy_main.cc
index 19ec2db..0f363615 100644
--- a/cc/trees/proxy_main.cc
+++ b/cc/trees/proxy_main.cc
@@ -11,6 +11,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/notreached.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/traced_value.h"
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc
index 30a5708d..70413f01 100644
--- a/cc/trees/single_thread_proxy.cc
+++ b/cc/trees/single_thread_proxy.cc
@@ -11,6 +11,7 @@
 #include "base/auto_reset.h"
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
+#include "base/notreached.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/trace_event/trace_event.h"
 #include "build/chromeos_buildflags.h"
diff --git a/cc/trees/ukm_manager.cc b/cc/trees/ukm_manager.cc
index 7547024c..2685122 100644
--- a/cc/trees/ukm_manager.cc
+++ b/cc/trees/ukm_manager.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 #include <utility>
 
+#include "base/notreached.h"
 #include "base/time/time.h"
 #include "cc/metrics/compositor_frame_reporter.h"
 #include "cc/metrics/throughput_ukm_reporter.h"
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
index 644b9a0..a5eb3bc 100644
--- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
+++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
@@ -286,9 +286,14 @@
                 public void onControlsOffsetChanged(int topOffset, int topControlsMinHeightOffset,
                         int bottomOffset, int bottomControlsMinHeightOffset, boolean needsAnimate) {
                     if (mStartSurfaceState == StartSurfaceState.SHOWN_HOMEPAGE) {
-                        setTopMargin(topControlsMinHeightOffset);
+                        // Set the top margin to the top controls min height (indicator height if
+                        // it's shown) since the toolbar height as extra margin is handled by top
+                        // toolbar placeholder.
+                        setTopMargin(mBrowserControlsStateProvider.getTopControlsMinHeightOffset());
                     } else if (mStartSurfaceState == StartSurfaceState.SHOWN_TABSWITCHER) {
-                        setTopMargin(topOffset);
+                        // Set the top margin to the top controls offset (toolbar height + indicator
+                        // height).
+                        setTopMargin(mBrowserControlsStateProvider.getContentOffset());
                     } else {
                         setTopMargin(0);
                     }
@@ -542,7 +547,7 @@
                     /* isVisible= */ true, /* skipUpdateController = */ false);
             setExploreSurfaceVisibility(false);
             setTopToolbarPlaceholderHeight(0);
-            // Set the top margin to the top controls height.
+            // Set the top margin to the top controls height (toolbar height + indicator height).
             setTopMargin(mBrowserControlsStateProvider.getTopControlsHeight());
             setBottomMargin(0);
         } else if (mStartSurfaceState == StartSurfaceState.NOT_SHOWN) {
diff --git a/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java b/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
index edb4c6d..c8acc20 100644
--- a/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
+++ b/chrome/android/features/start_surface/internal/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
@@ -1084,6 +1084,10 @@
                 .addObserver(mBrowserControlsStateProviderCaptor.capture());
         StartSurfaceMediator mediator =
                 createStartSurfaceMediator(/* isStartSurfaceEnabled= */ true, false);
+
+        // The top margin of homepage should be consistent with top controls min height/offset
+        // (indicator height).
+        doReturn(10).when(mBrowserControlsStateProvider).getTopControlsMinHeight();
         // Sets the current StartSurfaceState to SHOWING_START before calling the
         // {@link StartSurfaceMediator#showOverview()}. This is because if the current
         // StartSurfaceState is NOT_SHOWN, the state will be set default to SHOWING_TABSWITCHER in
@@ -1092,33 +1096,28 @@
         mediator.showOverview(false);
 
         verify(mBrowserControlsStateProvider).addObserver(ArgumentMatchers.any());
+        assertEquals("Wrong top content offset on homepage.", 10, mPropertyModel.get(TOP_MARGIN));
 
-        doReturn(100).when(mBrowserControlsStateProvider).getTopControlsHeight();
-        doReturn(20).when(mBrowserControlsStateProvider).getTopControlsMinHeight();
-        mBrowserControlsStateProviderCaptor.getValue().onControlsOffsetChanged(
-                100, 20, 0, 0, false);
+        onControlsOffsetChanged(/*topOffset=*/100, /*topControlsMinHeightOffset=*/20);
         assertEquals("Wrong top content offset on homepage.", 20, mPropertyModel.get(TOP_MARGIN));
 
-        doReturn(130).when(mBrowserControlsStateProvider).getTopControlsHeight();
-        doReturn(50).when(mBrowserControlsStateProvider).getTopControlsMinHeight();
-        mBrowserControlsStateProviderCaptor.getValue().onControlsOffsetChanged(
-                130, 50, 0, 0, false);
+        onControlsOffsetChanged(/*topOffset=*/130, /*topControlsMinHeightOffset=*/50);
         assertEquals("Wrong top content offset on homepage.", 50, mPropertyModel.get(TOP_MARGIN));
 
+        // The top margin of tab switcher surface should be consistent with top controls
+        // height/offset.
+        doReturn(15).when(mBrowserControlsStateProvider).getTopControlsHeight();
         mediator.setOverviewState(StartSurfaceState.SHOWING_TABSWITCHER);
         mediator.showOverview(false);
 
-        doReturn(100).when(mBrowserControlsStateProvider).getTopControlsHeight();
-        doReturn(20).when(mBrowserControlsStateProvider).getTopControlsMinHeight();
-        mBrowserControlsStateProviderCaptor.getValue().onControlsOffsetChanged(
-                100, 20, 0, 0, false);
+        assertEquals("Wrong top content offset on tab switcher surface.", 15,
+                mPropertyModel.get(TOP_MARGIN));
+
+        onControlsOffsetChanged(/*topOffset=*/100, /*topControlsMinHeightOffset=*/20);
         assertEquals("Wrong top content offset on tab switcher surface.", 100,
                 mPropertyModel.get(TOP_MARGIN));
 
-        doReturn(130).when(mBrowserControlsStateProvider).getTopControlsHeight();
-        doReturn(50).when(mBrowserControlsStateProvider).getTopControlsMinHeight();
-        mBrowserControlsStateProviderCaptor.getValue().onControlsOffsetChanged(
-                130, 50, 0, 0, false);
+        onControlsOffsetChanged(/*topOffset=*/130, /*topControlsMinHeightOffset=*/50);
         assertEquals("Wrong top content offset on tab switcher surface.", 130,
                 mPropertyModel.get(TOP_MARGIN));
     }
@@ -1308,4 +1307,13 @@
                         new DummyJankTracker(), mInitializeMVTilesRunnable);
         return mediator;
     }
+
+    private void onControlsOffsetChanged(int topOffset, int topControlsMinHeightOffset) {
+        doReturn(topOffset).when(mBrowserControlsStateProvider).getContentOffset();
+        doReturn(topControlsMinHeightOffset)
+                .when(mBrowserControlsStateProvider)
+                .getTopControlsMinHeightOffset();
+        mBrowserControlsStateProviderCaptor.getValue().onControlsOffsetChanged(
+                topOffset, topControlsMinHeightOffset, 0, 0, false);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java
index c9daa4d1..82f8fef 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java
@@ -22,7 +22,6 @@
 
 import org.chromium.base.Callback;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.performance_hints.PerformanceHintsObserver;
 import org.chromium.chrome.browser.performance_hints.PerformanceHintsObserver.PerformanceClass;
 import org.chromium.chrome.browser.profiles.Profile;
@@ -66,9 +65,6 @@
 
     private static final int INVALID_ITEM_ID = -1;
 
-    /** Experiment params for {@link ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE}. */
-    static final String HIDE_HEADER_IMAGE_PARAM = "hide_header_image";
-
     private WebContents mWebContents;
     private WebContentsObserver mWebContentsObserver;
     private ContextMenuChipController mChipController;
@@ -114,9 +110,8 @@
         mOnMenuClosed = onMenuClosed;
         final boolean isDragDropEnabled =
                 ContentFeatureList.isEnabled(ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU);
-        final boolean isPopup =
-                ChromeFeatureList.isEnabled(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE)
-                || isDragDropEnabled || params.getSourceType() == MenuSourceType.MENU_SOURCE_MOUSE
+        final boolean isPopup = ContextMenuUtils.forcePopupStyleEnabled()
+                || params.getSourceType() == MenuSourceType.MENU_SOURCE_MOUSE
                 || params.getOpenedFromHighlight();
         Activity activity = window.getActivity().get();
         final float density = activity.getResources().getDisplayMetrics().density;
@@ -306,8 +301,7 @@
             boolean isPopup, int topMarginPx, int bottomMarginPx, @Nullable Integer popupMargin,
             @Nullable Integer desiredPopupContentWidth, @Nullable View webContentView, Rect rect) {
         // TODO(sinansahin): Refactor ContextMenuDialog as well.
-        boolean shouldRemoveScrim =
-                isPopup && ChromeFeatureList.isEnabled(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE);
+        boolean shouldRemoveScrim = isPopup && ContextMenuUtils.forcePopupStyleEnabled();
         final ContextMenuDialog dialog = new ContextMenuDialog(activity,
                 R.style.ThemeOverlay_BrowserUI_AlertDialog, topMarginPx, bottomMarginPx, layout,
                 view, isPopup, shouldRemoveScrim, popupMargin, desiredPopupContentWidth,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderCoordinator.java
index 42800ffc..52e3913 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderCoordinator.java
@@ -12,7 +12,6 @@
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.omnibox.ChromeAutocompleteSchemeClassifier;
 import org.chromium.chrome.browser.performance_hints.PerformanceHintsObserver.PerformanceClass;
 import org.chromium.chrome.browser.profiles.Profile;
@@ -36,11 +35,8 @@
 
     @VisibleForTesting
     static PropertyModel buildModel(Context context, String title, CharSequence url) {
-        boolean usePopupContextMenu =
-                ChromeFeatureList.isEnabled(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE);
-        boolean hideHeaderImage = ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean(
-                ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE,
-                ContextMenuCoordinator.HIDE_HEADER_IMAGE_PARAM, false);
+        boolean usePopupContextMenu = ContextMenuUtils.forcePopupStyleEnabled();
+        boolean hideHeaderImage = ContextMenuUtils.hideContextMenuHeaderImage();
 
         int monogramSizeDimen = usePopupContextMenu
                 ? R.dimen.context_menu_popup_header_monogram_size
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuUtils.java
index 90029ec..8a14826f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuUtils.java
@@ -7,12 +7,21 @@
 import android.text.TextUtils;
 import android.webkit.URLUtil;
 
+import androidx.annotation.VisibleForTesting;
+
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.components.embedder_support.contextmenu.ContextMenuParams;
+import org.chromium.content_public.browser.ContentFeatureList;
+import org.chromium.content_public.common.ContentFeatures;
 
 /**
  * Provides utility methods for generating context menus.
  */
 public final class ContextMenuUtils {
+    /** Experiment params to hide the context menu header image. */
+    @VisibleForTesting
+    public static final String HIDE_HEADER_IMAGE_PARAM = "hide_header_image";
+
     private ContextMenuUtils() {}
 
     /**
@@ -48,4 +57,26 @@
         assert params.isAnchor();
         return "Link";
     }
+
+    /** Whether to force using popup style for context menu. */
+    static boolean forcePopupStyleEnabled() {
+        return ChromeFeatureList.isEnabled(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE)
+                || ContentFeatureList.isEnabled(ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU);
+    }
+
+    /**
+     * Whether hide the context menu header image by field trial params. The value is read from 
+     * either {@link ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU} or
+     * {@link ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE}.
+     */
+    static boolean hideContextMenuHeaderImage() {
+        int valueHideHeaderFromDragAndDrop = ContentFeatureList.getFieldTrialParamByFeatureAsInt(
+                ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU, HIDE_HEADER_IMAGE_PARAM, -1);
+        if (valueHideHeaderFromDragAndDrop != -1) {
+            return valueHideHeaderFromDragAndDrop != 0;
+        }
+
+        return ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean(
+                ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE, HIDE_HEADER_IMAGE_PARAM, false);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageAutodismissDurationProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageAutodismissDurationProvider.java
index e46e6b3a..2f9b077 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageAutodismissDurationProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageAutodismissDurationProvider.java
@@ -58,8 +58,10 @@
         }
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
                 && ChromeAccessibilityUtil.get().isAccessibilityEnabled()) {
-            return ChromeAccessibilityUtil.get().getRecommendedTimeoutMillis((int) nonA11yDuration,
-                    FLAG_CONTENT_ICONS | FLAG_CONTENT_CONTROLS | FLAG_CONTENT_TEXT);
+            // crbug.com/1312548: To have a minimum duration even if the system has a default value.
+            return Math.max(mAutodismissDurationWithA11yMs,
+                    ChromeAccessibilityUtil.get().getRecommendedTimeoutMillis((int) nonA11yDuration,
+                            FLAG_CONTENT_ICONS | FLAG_CONTENT_CONTROLS | FLAG_CONTENT_TEXT));
         }
         return ChromeAccessibilityUtil.get().isAccessibilityEnabled()
                 ? Math.max(mAutodismissDurationWithA11yMs, nonA11yDuration)
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java
index 6ce5fd7..43661f5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java
@@ -29,6 +29,7 @@
 import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
 import org.chromium.chrome.test.util.ChromeRenderTestRule;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
+import org.chromium.content_public.common.ContentFeatures;
 import org.chromium.ui.modelutil.LayoutViewBuilder;
 import org.chromium.ui.modelutil.MVCListAdapter.ListItem;
 import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
@@ -74,6 +75,7 @@
 
         mTestValues = new TestValues();
         mTestValues.addFeatureFlagOverride(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE, false);
+        mTestValues.addFeatureFlagOverride(ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU, false);
         FeatureList.setTestValues(mTestValues);
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
@@ -140,7 +142,7 @@
     public void testContextMenuViewWithLink_HideHeaderImage() throws IOException {
         mTestValues.addFeatureFlagOverride(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE, true);
         mTestValues.addFieldTrialParamOverride(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE,
-                ContextMenuCoordinator.HIDE_HEADER_IMAGE_PARAM, "true");
+                ContextMenuUtils.HIDE_HEADER_IMAGE_PARAM, "true");
         doTestContextMenuViewWithLink("context_menu_with_link_no_header");
     }
 
@@ -165,7 +167,7 @@
     public void testContextMenuViewWithImageLink_HideHeaderImage() throws IOException {
         mTestValues.addFeatureFlagOverride(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE, true);
         mTestValues.addFieldTrialParamOverride(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE,
-                ContextMenuCoordinator.HIDE_HEADER_IMAGE_PARAM, "true");
+                ContextMenuUtils.HIDE_HEADER_IMAGE_PARAM, "true");
         doTestContextMenuViewWithImageLink("context_menu_with_image_link_no_header");
     }
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java
index b540836..851ff32 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinatorTest.java
@@ -69,7 +69,8 @@
  * Unit tests for the context menu. Use density=mdpi so the screen density is 1.
  */
 @RunWith(BaseRobolectricTestRunner.class)
-@Features.DisableFeatures(ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE)
+@Features.DisableFeatures(
+        {ChromeFeatureList.CONTEXT_MENU_POPUP_STYLE, ContentFeatures.TOUCH_DRAG_AND_CONTEXT_MENU})
 public class ContextMenuCoordinatorTest {
     private static final int TOP_CONTENT_OFFSET_PX = 17;
     /**
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc
index 3d09f9d8..36dc3a0 100644
--- a/chrome/app/chrome_main_delegate.cc
+++ b/chrome/app/chrome_main_delegate.cc
@@ -17,6 +17,7 @@
 #include "base/files/file_path.h"
 #include "base/i18n/rtl.h"
 #include "base/lazy_instance.h"
+#include "base/notreached.h"
 #include "base/path_service.h"
 #include "base/process/memory.h"
 #include "base/process/process.h"
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp
index 048a37e..466de7a 100644
--- a/chrome/app/os_settings_strings.grdp
+++ b/chrome/app/os_settings_strings.grdp
@@ -3672,9 +3672,6 @@
   <message name="IDS_SETTINGS_DISPLAY_TITLE" desc="In Device Settings, the title for display settings.">
     Displays
   </message>
-  <message name="IDS_SETTINGS_DISPLAY_ARRANGEMENT_TEXT" desc="In Device Settings > Displays, text describing to use a mouse to drag the displays and change the arrangement.">
-    Drag to move a display
-  </message>
   <message name="IDS_SETTINGS_DISPLAY_ARRANGEMENT_WITH_KEYBOARD_TEXT" desc="In Device Settings > Displays, text describing how to use a mouse or keyboard to change arrangement of displays.">
     Drag or use arrow keys to move a display
   </message>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 22a7dd4..5745028 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -305,8 +305,8 @@
     "command_updater_impl.h",
     "complex_tasks/task_tab_helper.cc",
     "complex_tasks/task_tab_helper.h",
-    "component_updater/autofill_regex_component_installer.cc",
-    "component_updater/autofill_regex_component_installer.h",
+    "component_updater/autofill_regex_remover.cc",
+    "component_updater/autofill_regex_remover.h",
     "component_updater/chrome_client_side_phishing_component_installer.cc",
     "component_updater/chrome_client_side_phishing_component_installer.h",
     "component_updater/chrome_component_updater_configurator.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 0b36d2533..b14661e 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3814,12 +3814,6 @@
      flag_descriptions::kExtensionContentVerificationDescription, kOsDesktop,
      MULTI_VALUE_TYPE(kExtensionContentVerificationChoices)},
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-    {"keyboard-based-display-arrangement-in-settings",
-     flag_descriptions::kKeyboardBasedDisplayArrangementInSettingsName,
-     flag_descriptions::kKeyboardBasedDisplayArrangementInSettingsDescription,
-     kOsCrOS,
-     FEATURE_VALUE_TYPE(
-         ash::features::kKeyboardBasedDisplayArrangementInSettings)},
     {"enable-lock-screen-notification",
      flag_descriptions::kLockScreenNotificationName,
      flag_descriptions::kLockScreenNotificationDescription, kOsCrOS,
@@ -4723,9 +4717,6 @@
     {"eche-swa-debug-mode", flag_descriptions::kEcheSWADebugModeName,
      flag_descriptions::kEcheSWADebugModeDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::features::kEcheSWADebugMode)},
-    {"eche-swa-in-background", flag_descriptions::kEcheSWAInBackgroundName,
-     flag_descriptions::kEcheSWAInBackgroundDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(chromeos::features::kEcheSWAInBackground)},
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if BUILDFLAG(IS_MAC)
diff --git a/chrome/browser/accessibility/accessibility_ui.cc b/chrome/browser/accessibility/accessibility_ui.cc
index b9fd875..ee30fdd 100644
--- a/chrome/browser/accessibility/accessibility_ui.cc
+++ b/chrome/browser/accessibility/accessibility_ui.cc
@@ -13,6 +13,7 @@
 #include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/json/json_writer.h"
+#include "base/notreached.h"
 #include "base/strings/pattern.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/chrome/browser/apps/app_service/app_icon/app_icon_loader.cc b/chrome/browser/apps/app_service/app_icon/app_icon_loader.cc
index 689be02..a2957bd 100644
--- a/chrome/browser/apps/app_service/app_icon/app_icon_loader.cc
+++ b/chrome/browser/apps/app_service/app_icon/app_icon_loader.cc
@@ -14,6 +14,7 @@
 #include "base/files/file_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/no_destructor.h"
+#include "base/notreached.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "base/threading/scoped_blocking_call.h"
diff --git a/chrome/browser/apps/app_service/app_service_proxy_ash.cc b/chrome/browser/apps/app_service/app_service_proxy_ash.cc
index b2d65c6..3666a7fa 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_ash.cc
+++ b/chrome/browser/apps/app_service/app_service_proxy_ash.cc
@@ -387,14 +387,16 @@
 
 void AppServiceProxyAsh::OnLaunched(LaunchCallback callback,
                                     LaunchResult&& launch_result) {
-  bool exists = false;
-  InstanceRegistry().ForOneInstance(
-      launch_result.instance_id,
-      [&exists](const apps::InstanceUpdate& update) { exists = true; });
-  if (exists) {
-    std::move(callback).Run(std::move(launch_result));
+  base::RepeatingCallback<bool(void)> ready_to_run_callback =
+      base::BindRepeating(&AppServiceProxyAsh::CanRunLaunchCallback,
+                          base::Unretained(this), launch_result.instance_ids);
+  base::OnceClosure launch_callback =
+      base::BindOnce(std::move(callback), std::move(launch_result));
+  if (ready_to_run_callback.Run()) {
+    std::move(launch_callback).Run();
   } else {
-    callback_list_[launch_result.instance_id].push_back(std::move(callback));
+    callback_list_.emplace_back(
+        std::make_pair(ready_to_run_callback, std::move(launch_callback)));
   }
 }
 
@@ -547,12 +549,14 @@
     return;
   }
 
-  for (auto& callback : callback_list_[update.InstanceId()]) {
-    auto launch_result = LaunchResult();
-    launch_result.instance_id = update.InstanceId();
-    std::move(callback).Run(std::move(launch_result));
-  }
-  callback_list_.erase(update.InstanceId());
+  callback_list_.remove_if([](std::pair<base::RepeatingCallback<bool(void)>,
+                                        base::OnceClosure>& callbacks) {
+    if (callbacks.first.Run()) {
+      std::move(callbacks.second).Run();
+      return true;
+    }
+    return false;
+  });
 }
 
 void AppServiceProxyAsh::OnInstanceRegistryWillBeDestroyed(
@@ -560,4 +564,18 @@
   instance_registry_observer_.Reset();
 }
 
+bool AppServiceProxyAsh::CanRunLaunchCallback(
+    const std::vector<base::UnguessableToken>& instance_ids) {
+  for (const base::UnguessableToken& instance_id : instance_ids) {
+    bool exists = false;
+    InstanceRegistry().ForOneInstance(
+        instance_id,
+        [&exists](const apps::InstanceUpdate& update) { exists = true; });
+    if (!exists)
+      return false;
+  }
+
+  return true;
+}
+
 }  // namespace apps
diff --git a/chrome/browser/apps/app_service/app_service_proxy_ash.h b/chrome/browser/apps/app_service/app_service_proxy_ash.h
index 91c646e..6a5ced8 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_ash.h
+++ b/chrome/browser/apps/app_service/app_service_proxy_ash.h
@@ -206,6 +206,10 @@
   void OnInstanceRegistryWillBeDestroyed(
       apps::InstanceRegistry* cache) override;
 
+  // Checks if all instance IDs correspond to existing windows.
+  bool CanRunLaunchCallback(
+      const std::vector<base::UnguessableToken>& instance_ids);
+
   SubscriberCrosapi* crosapi_subscriber_ = nullptr;
 
   std::unique_ptr<PublisherHost> publisher_host_;
@@ -241,10 +245,12 @@
                           apps::InstanceRegistry::Observer>
       instance_registry_observer_{this};
 
-  // A map to record the launch callbacks for an app instance. Note it is
-  // possible to have multiple launches to launch the same app instance for
-  // web apps, so we record a list of launch callbacks for each instance.
-  std::map<base::UnguessableToken, std::vector<LaunchCallback>> callback_list_;
+  // A list to record outstanding launch callbacks. When the first member
+  // returns true, the second member should be run and the pair can be removed
+  // from the outstanding callback queue.
+  std::list<std::pair<base::RepeatingCallback<bool(void)>, base::OnceClosure>>
+      callback_list_;
+
   base::WeakPtrFactory<AppServiceProxyAsh> weak_ptr_factory_{this};
 };
 
diff --git a/chrome/browser/apps/app_service/app_service_proxy_unittest.cc b/chrome/browser/apps/app_service/app_service_proxy_unittest.cc
index 47cecf4..c7891e2 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_unittest.cc
+++ b/chrome/browser/apps/app_service/app_service_proxy_unittest.cc
@@ -515,10 +515,10 @@
   bool called_2 = false;
   auto instance_id_1 = base::UnguessableToken::Create();
   LaunchResult result_1;
-  result_1.instance_id = instance_id_1;
+  result_1.instance_ids.push_back(instance_id_1);
   auto instance_id_2 = base::UnguessableToken::Create();
   LaunchResult result_2;
-  result_2.instance_id = instance_id_2;
+  result_2.instance_ids.push_back(instance_id_2);
 
   // If the instance is not created yet, the callback will be stored.
   proxy.OnLaunched(
@@ -554,6 +554,28 @@
   EXPECT_EQ(proxy.callback_list_.size(), 1U);
   EXPECT_TRUE(called_1);
   EXPECT_FALSE(called_2);
+
+  // A launch that results in multiple instances.
+  LaunchResult result_multi;
+  auto instance_id_3 = base::UnguessableToken::Create();
+  auto instance_id_4 = base::UnguessableToken::Create();
+  result_multi.instance_ids.push_back(instance_id_3);
+  result_multi.instance_ids.push_back(instance_id_4);
+  bool called_multi = false;
+  proxy.OnLaunched(
+      base::BindOnce([](bool* called,
+                        apps::LaunchResult&& launch_result) { *called = true; },
+                     &called_multi),
+      std::move(result_multi));
+  EXPECT_EQ(proxy.callback_list_.size(), 2U);
+  EXPECT_FALSE(called_multi);
+  proxy.InstanceRegistry().OnInstance(
+      std::make_unique<apps::Instance>("foo", instance_id_3, nullptr));
+  proxy.InstanceRegistry().OnInstance(
+      std::make_unique<apps::Instance>("bar", instance_id_4, nullptr));
+  EXPECT_EQ(proxy.callback_list_.size(), 1U);
+
+  EXPECT_TRUE(called_multi);
 }
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 }  // namespace apps
diff --git a/chrome/browser/apps/app_service/launch_result_type.cc b/chrome/browser/apps/app_service/launch_result_type.cc
index 6165864..70daddb 100644
--- a/chrome/browser/apps/app_service/launch_result_type.cc
+++ b/chrome/browser/apps/app_service/launch_result_type.cc
@@ -12,11 +12,22 @@
 
 namespace apps {
 
+LaunchResult::LaunchResult() = default;
+LaunchResult::~LaunchResult() = default;
+
+LaunchResult::LaunchResult(LaunchResult&& other) = default;
+
 #if BUILDFLAG(IS_CHROMEOS)
 LaunchResult ConvertMojomLaunchResultToLaunchResult(
     crosapi::mojom::LaunchResultPtr mojom_launch_result) {
   auto launch_result = LaunchResult();
-  launch_result.instance_id = std::move(mojom_launch_result->instance_id);
+  if (mojom_launch_result->instance_ids) {
+    for (auto token : *mojom_launch_result->instance_ids)
+      launch_result.instance_ids.push_back(std::move(token));
+  } else {
+    launch_result.instance_ids.push_back(
+        std::move(mojom_launch_result->instance_id));
+  }
   return launch_result;
 }
 
diff --git a/chrome/browser/apps/app_service/launch_result_type.h b/chrome/browser/apps/app_service/launch_result_type.h
index acd30aac..3f2925b6 100644
--- a/chrome/browser/apps/app_service/launch_result_type.h
+++ b/chrome/browser/apps/app_service/launch_result_type.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_APPS_APP_SERVICE_LAUNCH_RESULT_TYPE_H_
 #define CHROME_BROWSER_APPS_APP_SERVICE_LAUNCH_RESULT_TYPE_H_
 
+#include <vector>
+
 #include "base/callback_forward.h"
 #include "base/unguessable_token.h"
 #include "build/build_config.h"
@@ -18,7 +20,15 @@
 // desktop platforms. So this struct can't be moved to AppPublisher.
 
 struct LaunchResult {
-  base::UnguessableToken instance_id;
+  LaunchResult();
+  ~LaunchResult();
+
+  LaunchResult(LaunchResult&& launch_result);
+  LaunchResult& operator=(const LaunchResult& launch_result) = delete;
+  LaunchResult(const LaunchResult& launch_result) = delete;
+
+  // A single launch event may result in multiple app instances being created.
+  std::vector<base::UnguessableToken> instance_ids;
 };
 
 using LaunchCallback = base::OnceCallback<void(LaunchResult&&)>;
diff --git a/chrome/browser/apps/app_service/launch_utils.cc b/chrome/browser/apps/app_service/launch_utils.cc
index c3b91ef..3baa64b 100644
--- a/chrome/browser/apps/app_service/launch_utils.cc
+++ b/chrome/browser/apps/app_service/launch_utils.cc
@@ -6,6 +6,7 @@
 
 #include "base/command_line.h"
 #include "base/files/file_path.h"
+#include "base/notreached.h"
 #include "build/build_config.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
diff --git a/chrome/browser/apps/app_service/metrics/app_service_metrics.cc b/chrome/browser/apps/app_service/metrics/app_service_metrics.cc
index 537f61c..c7a60d6 100644
--- a/chrome/browser/apps/app_service/metrics/app_service_metrics.cc
+++ b/chrome/browser/apps/app_service/metrics/app_service_metrics.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/apps/app_service/metrics/app_service_metrics.h"
 
 #include "base/metrics/histogram_functions.h"
+#include "base/notreached.h"
 #include "base/time/time.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/web_applications/web_app_id_constants.h"
diff --git a/chrome/browser/apps/app_service/publishers/app_publisher.cc b/chrome/browser/apps/app_service/publishers/app_publisher.cc
index 94af1de..f77454f6 100644
--- a/chrome/browser/apps/app_service/publishers/app_publisher.cc
+++ b/chrome/browser/apps/app_service/publishers/app_publisher.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/apps/app_service/publishers/app_publisher.h"
 
+#include "base/notreached.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 
 namespace apps {
diff --git a/chrome/browser/apps/intent_helper/intent_picker_helpers.cc b/chrome/browser/apps/intent_helper/intent_picker_helpers.cc
index 2e0fd3d0..dc2e9d2 100644
--- a/chrome/browser/apps/intent_helper/intent_picker_helpers.cc
+++ b/chrome/browser/apps/intent_helper/intent_picker_helpers.cc
@@ -7,6 +7,7 @@
 #include <string>
 #include <utility>
 
+#include "base/notreached.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
diff --git a/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc b/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc
index 27bb2cb..510fe42 100644
--- a/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc
+++ b/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc
@@ -19,6 +19,7 @@
 #include "base/lazy_instance.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
+#include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
diff --git a/chrome/browser/apps/platform_apps/app_load_service.cc b/chrome/browser/apps/platform_apps/app_load_service.cc
index b4259d9..b07620b 100644
--- a/chrome/browser/apps/platform_apps/app_load_service.cc
+++ b/chrome/browser/apps/platform_apps/app_load_service.cc
@@ -6,6 +6,7 @@
 
 #include "apps/app_restore_service.h"
 #include "apps/launcher.h"
+#include "base/notreached.h"
 #include "chrome/browser/apps/platform_apps/app_load_service_factory.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/unpacked_installer.h"
diff --git a/chrome/browser/ash/app_restore/app_launch_handler.cc b/chrome/browser/ash/app_restore/app_launch_handler.cc
index 89be1a2..587829d 100644
--- a/chrome/browser/ash/app_restore/app_launch_handler.cc
+++ b/chrome/browser/ash/app_restore/app_launch_handler.cc
@@ -191,12 +191,15 @@
       if (ShouldLaunchSystemWebAppOrChromeApp(app_id, it->second))
         LaunchSystemWebAppOrChromeApp(app_type, app_id, it->second);
       break;
+    case apps::AppType::kStandaloneBrowser:
+      // For Lacros, we can't use the AppService launch interface to restore,
+      // but call Lacros interface to restore with session restore.
+      return;
     case apps::AppType::kBuiltIn:
     case apps::AppType::kCrostini:
     case apps::AppType::kPluginVm:
     case apps::AppType::kUnknown:
     case apps::AppType::kMacOs:
-    case apps::AppType::kStandaloneBrowser:
     case apps::AppType::kRemote:
     case apps::AppType::kBorealis:
     case apps::AppType::kExtension:
diff --git a/chrome/browser/ash/app_restore/full_restore_app_launch_handler.cc b/chrome/browser/ash/app_restore/full_restore_app_launch_handler.cc
index 03491c0..230b4fac 100644
--- a/chrome/browser/ash/app_restore/full_restore_app_launch_handler.cc
+++ b/chrome/browser/ash/app_restore/full_restore_app_launch_handler.cc
@@ -171,6 +171,7 @@
 void FullRestoreAppLaunchHandler::OnStateChanged() {
   if (crosapi::BrowserManager::Get()->IsRunning()) {
     observation_.Reset();
+    VLOG(1) << "Full restore opens Lacros";
     crosapi::BrowserManager::Get()->OpenForFullRestore();
   }
 }
@@ -343,6 +344,7 @@
   restore_data()->RemoveApp(app_constants::kLacrosAppId);
 
   if (crosapi::BrowserManager::Get()->IsRunning()) {
+    VLOG(1) << "Full restore opens Lacros";
     crosapi::BrowserManager::Get()->OpenForFullRestore();
     return;
   }
diff --git a/chrome/browser/ash/arc/input_overlay/actions/action.cc b/chrome/browser/ash/arc/input_overlay/actions/action.cc
index b850c33..4e08517 100644
--- a/chrome/browser/ash/arc/input_overlay/actions/action.cc
+++ b/chrome/browser/ash/arc/input_overlay/actions/action.cc
@@ -235,11 +235,12 @@
 
 void Action::RestoreToDefault(const gfx::RectF& content_bounds) {
   DCHECK(action_view_);
-  if (!action_view_)
+  if (!action_view_ || GetCurrentDisplayedBinding() == *original_binding_)
     return;
   pending_binding_.reset();
   pending_binding_ = std::make_unique<InputElement>(*original_binding_);
   action_view_->SetViewContent(BindingOption::kPending, content_bounds);
+  action_view_->SetDisplayMode(DisplayMode::kEdited);
 }
 
 const InputElement& Action::GetCurrentDisplayedBinding() {
diff --git a/chrome/browser/ash/arc/input_overlay/actions/action.h b/chrome/browser/ash/arc/input_overlay/actions/action.h
index 6b8c6ca..cae00341 100644
--- a/chrome/browser/ash/arc/input_overlay/actions/action.h
+++ b/chrome/browser/ash/arc/input_overlay/actions/action.h
@@ -103,12 +103,17 @@
   InputElement* current_binding() const { return current_binding_.get(); }
   InputElement* original_binding() const { return original_binding_.get(); }
   InputElement* pending_binding() const { return pending_binding_.get(); }
+  void set_pending_binding(std::unique_ptr<InputElement> binding) {
+    if (pending_binding_)
+      pending_binding_.reset();
+    pending_binding_ = std::move(binding);
+  }
   const std::string& name() { return name_; }
   const std::vector<std::unique_ptr<Position>>& locations() const {
     return locations_;
   }
   bool require_mouse_locked() const { return require_mouse_locked_; }
-  const aura::Window* target_window() const { return target_window_; }
+  aura::Window* target_window() const { return target_window_; }
   int current_position_index() const { return current_position_index_; }
   const absl::optional<int> touch_id() const { return touch_id_; }
   bool on_left_or_middle_side() const { return on_left_or_middle_side_; }
diff --git a/chrome/browser/ash/arc/input_overlay/actions/action_move.cc b/chrome/browser/ash/arc/input_overlay/actions/action_move.cc
index a6f8543..9dad80b3 100644
--- a/chrome/browser/ash/arc/input_overlay/actions/action_move.cc
+++ b/chrome/browser/ash/arc/input_overlay/actions/action_move.cc
@@ -76,7 +76,11 @@
   }
 
   // TODO(cuicuiruan): rewrite for post MVP once design is ready.
-  void OnKeyBindingChange(ActionTag* action_tag, ui::DomCode code) override {}
+  void OnKeyBindingChange(ActionTag* action_tag, ui::DomCode code) override {
+    NOTIMPLEMENTED();
+  }
+  void OnBindingToKeyboard() override { NOTIMPLEMENTED(); }
+  void OnBindingToMouse(std::string mouse_action) override { NOTIMPLEMENTED(); }
 };
 
 class ActionMove::ActionMoveKeyView : public ActionView {
@@ -144,6 +148,10 @@
     // TODO(cuicuiruan): Implement the key binding change for key-bound
     // |ActionMove|.
   }
+
+  // TODO(cuicuiruan): implement for post MVP once the design is ready.
+  void OnBindingToKeyboard() override { NOTIMPLEMENTED(); }
+  void OnBindingToMouse(std::string mouse_action) override { NOTIMPLEMENTED(); }
 };
 
 ActionMove::ActionMove(aura::Window* window) : Action(window) {}
diff --git a/chrome/browser/ash/arc/input_overlay/actions/action_tap.cc b/chrome/browser/ash/arc/input_overlay/actions/action_tap.cc
index 03bbf00..1e309568 100644
--- a/chrome/browser/ash/arc/input_overlay/actions/action_tap.cc
+++ b/chrome/browser/ash/arc/input_overlay/actions/action_tap.cc
@@ -128,8 +128,34 @@
       return;
 
     auto input_element = InputElement::CreateActionTapKeyElement(code);
-    display_overlay_controller_->OnKeyBindingChange(action_,
-                                                    std::move(input_element));
+    display_overlay_controller_->OnBindingChange(action_,
+                                                 std::move(input_element));
+  }
+
+  void OnBindingToKeyboard() override {
+    const auto& binding = action_->GetCurrentDisplayedBinding();
+    if (!IsMouseBound(binding))
+      return;
+
+    auto input_element = std::make_unique<InputElement>();
+    action_->set_pending_binding(std::move(input_element));
+    auto bounds = CalculateWindowContentBounds(action_->target_window());
+    SetViewContent(BindingOption::kPending, bounds);
+    SetDisplayMode(DisplayMode::kEdited);
+  }
+
+  void OnBindingToMouse(std::string mouse_action) override {
+    DCHECK(mouse_action == kPrimaryClick || mouse_action == kSecondaryClick);
+    if (mouse_action != kPrimaryClick && mouse_action != kSecondaryClick)
+      return;
+    const auto& binding = action_->GetCurrentDisplayedBinding();
+    if (IsMouseBound(binding) && binding.mouse_action() == mouse_action)
+      return;
+
+    auto input_element =
+        InputElement::CreateActionTapMouseElement(mouse_action);
+    display_overlay_controller_->OnBindingChange(action_,
+                                                 std::move(input_element));
   }
 };
 
diff --git a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc
index 2ee6f32..a21348b 100644
--- a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc
+++ b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc
@@ -325,7 +325,7 @@
   error_ = nullptr;
 }
 
-void DisplayOverlayController::OnKeyBindingChange(
+void DisplayOverlayController::OnBindingChange(
     Action* action,
     std::unique_ptr<InputElement> input_element) {
   touch_injector_->OnBindingChange(action, std::move(input_element));
diff --git a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h
index 1f5f0e95..2701f8d5 100644
--- a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h
+++ b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h
@@ -52,8 +52,8 @@
   void AddEditErrorMsg(ActionView* action_view, base::StringPiece error_msg);
   void RemoveEditErrorMsg();
 
-  void OnKeyBindingChange(Action* action,
-                          std::unique_ptr<InputElement> input_element);
+  void OnBindingChange(Action* action,
+                       std::unique_ptr<InputElement> input_element);
 
   // Save the changes when users press the save button after editing.
   void OnCustomizeSave();
diff --git a/chrome/browser/ash/arc/input_overlay/touch_injector.cc b/chrome/browser/ash/arc/input_overlay/touch_injector.cc
index 7916d6f..d4fab61 100644
--- a/chrome/browser/ash/arc/input_overlay/touch_injector.cc
+++ b/chrome/browser/ash/arc/input_overlay/touch_injector.cc
@@ -27,8 +27,10 @@
 constexpr char kMoveAction[] = "move";
 constexpr char kMouseLock[] = "mouse_lock";
 // Mask for interesting modifiers.
-const int kInterestingFlagsMask =
+constexpr int kInterestingFlagsMask =
     ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN;
+// Default mouse lock key.
+constexpr ui::DomCode kDefaultMouseLockCode = ui::DomCode::ESCAPE;
 
 // UI strings.
 // TODO(cuicuiruan): move the strings to chrome/app/generated_resources.grd
@@ -275,11 +277,17 @@
 
 void TouchInjector::ParseMouseLock(const base::Value& value) {
   auto* mouse_lock = value.FindKey(kMouseLock);
-  if (!mouse_lock)
+  if (!mouse_lock) {
+    mouse_lock_ = std::make_unique<KeyCommand>(
+        kDefaultMouseLockCode, /*modifier=*/0,
+        base::BindRepeating(&TouchInjector::FlipMouseLockFlag,
+                            weak_ptr_factory_.GetWeakPtr()));
     return;
+  }
   auto key = ParseKeyboardKey(*mouse_lock, kMouseLock);
   if (!key)
     return;
+  // Customized mouse lock overrides the default mouse lock.
   mouse_lock_ = std::make_unique<KeyCommand>(
       key->first, key->second,
       base::BindRepeating(&TouchInjector::FlipMouseLockFlag,
diff --git a/chrome/browser/ash/arc/input_overlay/ui/action_edit_menu.cc b/chrome/browser/ash/arc/input_overlay/ui/action_edit_menu.cc
index a528a89..c325c7e 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/action_edit_menu.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/action_edit_menu.cc
@@ -81,7 +81,7 @@
     DisplayOverlayController* display_overlay_controller,
     ActionView* anchor)
     : display_overlay_controller_(display_overlay_controller),
-      anchor_(anchor) {}
+      anchor_view_(anchor) {}
 
 ActionEditMenu::~ActionEditMenu() = default;
 
@@ -118,12 +118,13 @@
                           base::Unretained(this)),
       IDS_INPUT_OVERLAY_EDIT_MENU_KEYBOARD_KEY));
   mouse_left_ = AddChildView(std::make_unique<BindingButton>(
-      base::BindRepeating(&ActionEditMenu::OnMouseLeftBindingButtonPressed,
+      base::BindRepeating(&ActionEditMenu::OnMouseLeftClickBindingButtonPressed,
                           base::Unretained(this)),
       IDS_INPUT_OVERLAY_EDIT_MENU_LEFT_MOUSE_CLICK));
   mouse_right_ = AddChildView(std::make_unique<BindingButton>(
-      base::BindRepeating(&ActionEditMenu::OnMouseRightBindingButtonPressed,
-                          base::Unretained(this)),
+      base::BindRepeating(
+          &ActionEditMenu::OnMouseRightClickBindingButtonPressed,
+          base::Unretained(this)),
       IDS_INPUT_OVERLAY_EDIT_MENU_RIGHT_MOUSE_CLICK));
   reset_ = AddChildView(std::make_unique<BindingButton>(
       base::BindRepeating(&ActionEditMenu::OnResetButtonPressed,
@@ -135,8 +136,8 @@
                                    mouse_right_->GetMinSize().width()});
   SetBorder(views::CreateEmptyBorder(gfx::Insets::TLBR(8, 0, 8, 0)));
   SetSize(gfx::Size(kMenuWidth + additional_width, kMenuHeight));
-  SetPosition(anchor_->GetEditMenuPosition(size()));
-  auto* action = anchor_->action();
+  SetPosition(anchor_view_->GetEditMenuPosition(size()));
+  auto* action = anchor_view_->action();
   // It is possible that the action has no binding after customizing, such as
   // users bind the key to another action.
   auto& binding = action->GetCurrentDisplayedBinding();
@@ -154,22 +155,38 @@
 }
 
 void ActionEditMenu::OnKeyBoardKeyBindingButtonPressed() {
-  // TODO(cuicuiruan): Implement feature here.
+  DCHECK(anchor_view_);
+  if (!anchor_view_)
+    return;
+
+  anchor_view_->OnBindingToKeyboard();
   display_overlay_controller_->RemoveActionEditMenu();
 }
 
-void ActionEditMenu::OnMouseLeftBindingButtonPressed() {
-  // TODO(cuicuiruan): Implement feature here.
+void ActionEditMenu::OnMouseLeftClickBindingButtonPressed() {
+  DCHECK(anchor_view_);
+  if (!anchor_view_)
+    return;
+
+  anchor_view_->OnBindingToMouse(kPrimaryClick);
   display_overlay_controller_->RemoveActionEditMenu();
 }
 
-void ActionEditMenu::OnMouseRightBindingButtonPressed() {
-  // TODO(cuicuiruan): Implement feature here.
+void ActionEditMenu::OnMouseRightClickBindingButtonPressed() {
+  DCHECK(anchor_view_);
+  if (!anchor_view_)
+    return;
+
+  anchor_view_->OnBindingToMouse(kSecondaryClick);
   display_overlay_controller_->RemoveActionEditMenu();
 }
 
 void ActionEditMenu::OnResetButtonPressed() {
-  // TODO(cuicuiruan): Implement feature here.
+  DCHECK(anchor_view_);
+  if (!anchor_view_)
+    return;
+
+  anchor_view_->OnResetBinding();
   display_overlay_controller_->RemoveActionEditMenu();
 }
 
diff --git a/chrome/browser/ash/arc/input_overlay/ui/action_edit_menu.h b/chrome/browser/ash/arc/input_overlay/ui/action_edit_menu.h
index c8563a60..513ff08 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/action_edit_menu.h
+++ b/chrome/browser/ash/arc/input_overlay/ui/action_edit_menu.h
@@ -38,14 +38,14 @@
 
   void InitActionTapEditMenu();
   void OnKeyBoardKeyBindingButtonPressed();
-  void OnMouseLeftBindingButtonPressed();
-  void OnMouseRightBindingButtonPressed();
+  void OnMouseLeftClickBindingButtonPressed();
+  void OnMouseRightClickBindingButtonPressed();
   void OnResetButtonPressed();
 
   // Reference to owner class.
   const raw_ptr<DisplayOverlayController> display_overlay_controller_ = nullptr;
   // Reference to position.
-  raw_ptr<ActionView> anchor_ = nullptr;
+  raw_ptr<ActionView> anchor_view_ = nullptr;
   // Reference to the menu items.
   raw_ptr<BindingButton> keyboard_key_ = nullptr;
   raw_ptr<BindingButton> mouse_left_ = nullptr;
diff --git a/chrome/browser/ash/arc/input_overlay/ui/action_label.cc b/chrome/browser/ash/arc/input_overlay/ui/action_label.cc
index 8175860..fe74476 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/action_label.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/action_label.cc
@@ -130,6 +130,8 @@
   SetBackground(views::CreateRoundedRectBackground(kEditedUnboundBgColor,
                                                    kCornerRadiusView));
   SetSize(GetPreferredSize());
+  SetSelectable(true);
+  SetEnabled(true);
 }
 
 void ActionLabel::SetToEditFocus() {
diff --git a/chrome/browser/ash/arc/input_overlay/ui/action_view.cc b/chrome/browser/ash/arc/input_overlay/ui/action_view.cc
index 8b08a4a0..bdcf5efd 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/action_view.cc
+++ b/chrome/browser/ash/arc/input_overlay/ui/action_view.cc
@@ -81,6 +81,17 @@
   SetDisplayMode(DisplayMode::kEdited);
 }
 
+void ActionView::OnResetBinding() {
+  const auto& binding = action_->GetCurrentDisplayedBinding();
+  if (!IsBound(binding) || binding == *action_->current_binding())
+    return;
+
+  auto input_element =
+      std::make_unique<InputElement>(*(action_->current_binding()));
+  display_overlay_controller_->OnBindingChange(action_,
+                                               std::move(input_element));
+}
+
 void ActionView::AddEditButton() {
   if (!editable_ || menu_entry_)
     return;
diff --git a/chrome/browser/ash/arc/input_overlay/ui/action_view.h b/chrome/browser/ash/arc/input_overlay/ui/action_view.h
index e94af4d..8309fc6 100644
--- a/chrome/browser/ash/arc/input_overlay/ui/action_view.h
+++ b/chrome/browser/ash/arc/input_overlay/ui/action_view.h
@@ -38,6 +38,8 @@
                               const gfx::RectF& content_bounds) = 0;
   // Each type of the actions acts differently on key binding change.
   virtual void OnKeyBindingChange(ActionTag* action_tag, ui::DomCode code) = 0;
+  virtual void OnBindingToKeyboard() = 0;
+  virtual void OnBindingToMouse(std::string mouse_action) = 0;
 
   // Set position from its center position.
   void SetPositionFromCenterPosition(gfx::PointF& center_position);
@@ -46,8 +48,10 @@
   // Get edit menu position in parent's bounds.
   gfx::Point GetEditMenuPosition(gfx::Size menu_size);
   void RemoveEditMenu();
-
+  // Show error message for action.
   void ShowErrorMsg(base::StringPiece error_msg);
+  // Reset binding to its previous binding before entering to the edit mode.
+  void OnResetBinding();
 
   Action* action() { return action_; }
   void set_editable(bool editable) { editable_ = editable; }
diff --git a/chrome/browser/ash/eche_app/eche_app_manager_factory_unittest.cc b/chrome/browser/ash/eche_app/eche_app_manager_factory_unittest.cc
index 96b6b478..3fcbf3a 100644
--- a/chrome/browser/ash/eche_app/eche_app_manager_factory_unittest.cc
+++ b/chrome/browser/ash/eche_app/eche_app_manager_factory_unittest.cc
@@ -24,7 +24,7 @@
   EcheAppManagerFactoryTest() {
     scoped_feature_list_.InitWithFeatures(
         /*enabled_features=*/{features::kEcheSWA, features::kEcheCustomWidget},
-        /*disabled_features=*/{features::kEcheSWAInBackground});
+        /*disabled_features=*/{});
     profile_manager_ = std::make_unique<TestingProfileManager>(
         TestingBrowserProcess::GetGlobal());
     if (profile_manager_->SetUp()) {
@@ -67,8 +67,7 @@
  protected:
   EcheAppManagerFactoryWithBackgroundTest() {
     scoped_feature_list_.InitWithFeatures(
-        /*enabled_features=*/{features::kEcheSWA, features::kEcheCustomWidget,
-                              features::kEcheSWAInBackground},
+        /*enabled_features=*/{features::kEcheSWA, features::kEcheCustomWidget},
         /*disabled_features=*/{});
     profile_manager_ = std::make_unique<TestingProfileManager>(
         TestingBrowserProcess::GetGlobal());
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc b/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
index 6a498ef..d250343 100644
--- a/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
+++ b/chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h"
 
+#include "base/notreached.h"
 #include "base/strings/string_util.h"
 #include "build/build_config.h"
 #include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h"
diff --git a/chrome/browser/autofill/autofill_browsertest.cc b/chrome/browser/autofill/autofill_browsertest.cc
index d868e8f3..d131937 100644
--- a/chrome/browser/autofill/autofill_browsertest.cc
+++ b/chrome/browser/autofill/autofill_browsertest.cc
@@ -36,7 +36,6 @@
 #include "components/autofill/core/browser/autofill_test_utils.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
 #include "components/autofill/core/browser/data_model/credit_card.h"
-#include "components/autofill/core/browser/pattern_provider/pattern_configuration_parser.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/personal_data_manager_observer.h"
 #include "components/autofill/core/browser/validation.h"
diff --git a/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc b/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc
index 9da88508..0da5059e 100644
--- a/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc
+++ b/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc
@@ -254,7 +254,6 @@
     // elements in a form to determine if the form is ready for interaction.
     feature_list_.InitWithFeatures(
         /*enabled_features=*/{features::kAutofillAcrossIframes,
-                              features::kAutofillDisplaceRemovedForms,
                               features::kAutofillShowTypePredictions,
                               features::kAutofillUseUnassociatedListedElements},
         /*disabled_features=*/{});
diff --git a/chrome/browser/autofill/autofill_interactive_uitest.cc b/chrome/browser/autofill/autofill_interactive_uitest.cc
index bb1c537..cce0d29 100644
--- a/chrome/browser/autofill/autofill_interactive_uitest.cc
+++ b/chrome/browser/autofill/autofill_interactive_uitest.cc
@@ -52,7 +52,6 @@
 #include "components/autofill/core/browser/browser_autofill_manager.h"
 #include "components/autofill/core/browser/browser_autofill_manager_test_delegate.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
-#include "components/autofill/core/browser/pattern_provider/pattern_configuration_parser.h"
 #include "components/autofill/core/browser/test_autofill_clock.h"
 #include "components/autofill/core/browser/test_autofill_tick_clock.h"
 #include "components/autofill/core/browser/validation.h"
diff --git a/chrome/browser/autofill/form_structure_browsertest.cc b/chrome/browser/autofill/form_structure_browsertest.cc
index 8a17f54f..143ad18 100644
--- a/chrome/browser/autofill/form_structure_browsertest.cc
+++ b/chrome/browser/autofill/form_structure_browsertest.cc
@@ -28,7 +28,6 @@
 #include "components/autofill/core/browser/autofill_experiments.h"
 #include "components/autofill/core/browser/browser_autofill_manager.h"
 #include "components/autofill/core/browser/form_structure.h"
-#include "components/autofill/core/browser/pattern_provider/pattern_configuration_parser.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/autofill/core/common/unique_ids.h"
diff --git a/chrome/browser/component_updater/autofill_regex_component_installer.cc b/chrome/browser/component_updater/autofill_regex_component_installer.cc
deleted file mode 100644
index bce43a418..0000000
--- a/chrome/browser/component_updater/autofill_regex_component_installer.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/component_updater/autofill_regex_component_installer.h"
-
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/path_service.h"
-#include "base/task/thread_pool.h"
-#include "base/version.h"
-#include "components/autofill/core/browser/pattern_provider/pattern_configuration_parser.h"
-#include "components/component_updater/component_updater_paths.h"
-#include "content/public/browser/browser_task_traits.h"
-#include "content/public/browser/browser_thread.h"
-
-using component_updater::ComponentUpdateService;
-
-namespace {
-
-constexpr base::FilePath::CharType kAutofillRegexJsonFileName[] =
-    FILE_PATH_LITERAL("data.json");
-
-// The SHA256 of the SubjectPublicKeyInfo used to sign the extension.
-// The extension id is: PDAFIOLLNGONHOADBMDOEMAGNFPDPHBE
-constexpr uint8_t kAutofillRegexPublicKeySHA256[32] = {
-    0xf3, 0x05, 0x8e, 0xbb, 0xd6, 0xed, 0x7e, 0x03, 0x1c, 0x3e, 0x4c,
-    0x06, 0xd5, 0xf3, 0xf7, 0x14, 0x93, 0x75, 0xf4, 0x24, 0x67, 0x4e,
-    0x61, 0x1e, 0xba, 0x5f, 0xf4, 0x29, 0x27, 0x0e, 0x1c, 0x1e};
-
-constexpr char kAutofillRegexManifestName[] = "Autofill Regex Data";
-
-void LoadRegexConfigurationFromDisk(const base::FilePath& json_path) {
-  if (json_path.empty())
-    return;
-
-  VLOG(1) << "Reading Download File Types from file: " << json_path.value();
-  std::string json_string;
-  if (!base::ReadFileToString(json_path, &json_string)) {
-    // The file won't exist on new installations, so this is not always an
-    // error.
-    VLOG(1) << "Failed reading from " << json_path.value();
-    return;
-  }
-
-  content::GetUIThreadTaskRunner(
-      {base::MayBlock(), base::TaskPriority::BEST_EFFORT})
-      ->PostTask(
-          FROM_HERE,
-          base::BindOnce(&autofill::field_type_parsing::PopulateFromJsonString,
-                         std::move(json_string)));
-}
-
-}  // namespace
-
-namespace component_updater {
-
-bool AutofillRegexComponentInstallerPolicy::
-    SupportsGroupPolicyEnabledComponentUpdates() const {
-  return true;
-}
-
-bool AutofillRegexComponentInstallerPolicy::RequiresNetworkEncryption() const {
-  return false;
-}
-
-update_client::CrxInstaller::Result
-AutofillRegexComponentInstallerPolicy::OnCustomInstall(
-    const base::Value& manifest,
-    const base::FilePath& install_dir) {
-  return update_client::CrxInstaller::Result(0);  // Nothing custom here.
-}
-
-void AutofillRegexComponentInstallerPolicy::OnCustomUninstall() {}
-
-base::FilePath AutofillRegexComponentInstallerPolicy::GetInstalledPath(
-    const base::FilePath& base) {
-  return base.Append(kAutofillRegexJsonFileName);
-}
-
-void AutofillRegexComponentInstallerPolicy::ComponentReady(
-    const base::Version& version,
-    const base::FilePath& install_dir,
-    base::Value manifest) {
-  VLOG(1) << "Component ready, version " << version.GetString() << " in "
-          << install_dir.value();
-
-  base::ThreadPool::PostTask(
-      FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
-      base::BindOnce(&LoadRegexConfigurationFromDisk,
-                     GetInstalledPath(install_dir)));
-}
-
-// Called during startup and installation before ComponentReady().
-bool AutofillRegexComponentInstallerPolicy::VerifyInstallation(
-    const base::Value& manifest,
-    const base::FilePath& install_dir) const {
-  // Not doing any validation, it will be done during parsing.
-  return base::PathExists(GetInstalledPath(install_dir));
-}
-
-base::FilePath AutofillRegexComponentInstallerPolicy::GetRelativeInstallDir()
-    const {
-  return base::FilePath(FILE_PATH_LITERAL("AutofillRegex"));
-}
-
-void AutofillRegexComponentInstallerPolicy::GetHash(
-    std::vector<uint8_t>* hash) const {
-  hash->assign(std::begin(kAutofillRegexPublicKeySHA256),
-               std::end(kAutofillRegexPublicKeySHA256));
-}
-
-std::string AutofillRegexComponentInstallerPolicy::GetName() const {
-  return kAutofillRegexManifestName;
-}
-
-update_client::InstallerAttributes
-AutofillRegexComponentInstallerPolicy::GetInstallerAttributes() const {
-  return update_client::InstallerAttributes();
-}
-
-void RegisterAutofillRegexComponent(ComponentUpdateService* cus) {
-  VLOG(1) << "Registering Autofill Regex component.";
-  auto installer = base::MakeRefCounted<ComponentInstaller>(
-      std::make_unique<AutofillRegexComponentInstallerPolicy>());
-  installer->Register(cus, base::OnceClosure());
-}
-
-}  // namespace component_updater
diff --git a/chrome/browser/component_updater/autofill_regex_component_installer.h b/chrome/browser/component_updater/autofill_regex_component_installer.h
deleted file mode 100644
index 51e6ac2..0000000
--- a/chrome/browser/component_updater/autofill_regex_component_installer.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_COMPONENT_UPDATER_AUTOFILL_REGEX_COMPONENT_INSTALLER_H_
-#define CHROME_BROWSER_COMPONENT_UPDATER_AUTOFILL_REGEX_COMPONENT_INSTALLER_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/values.h"
-#include "components/component_updater/component_installer.h"
-
-namespace base {
-class FilePath;
-}  // namespace base
-
-namespace component_updater {
-
-class ComponentUpdateService;
-
-class AutofillRegexComponentInstallerPolicy : public ComponentInstallerPolicy {
- public:
-  AutofillRegexComponentInstallerPolicy() = default;
-  ~AutofillRegexComponentInstallerPolicy() override = default;
-  AutofillRegexComponentInstallerPolicy(
-      const AutofillRegexComponentInstallerPolicy&) = delete;
-  AutofillRegexComponentInstallerPolicy& operator=(
-      const AutofillRegexComponentInstallerPolicy&) = delete;
-
- private:
-  // The following methods override ComponentInstallerPolicy.
-  bool SupportsGroupPolicyEnabledComponentUpdates() const override;
-  bool RequiresNetworkEncryption() const override;
-  update_client::CrxInstaller::Result OnCustomInstall(
-      const base::Value& manifest,
-      const base::FilePath& install_dir) override;
-  void OnCustomUninstall() override;
-  bool VerifyInstallation(const base::Value& manifest,
-                          const base::FilePath& install_dir) const override;
-  void ComponentReady(const base::Version& version,
-                      const base::FilePath& install_dir,
-                      base::Value manifest) override;
-  base::FilePath GetRelativeInstallDir() const override;
-  void GetHash(std::vector<uint8_t>* hash) const override;
-  std::string GetName() const override;
-  update_client::InstallerAttributes GetInstallerAttributes() const override;
-
-  static base::FilePath GetInstalledPath(const base::FilePath& base);
-};
-
-// Call once during startup to make the component update service aware of
-// the File Type Policies component.
-void RegisterAutofillRegexComponent(ComponentUpdateService* cus);
-
-}  // namespace component_updater
-
-#endif  // CHROME_BROWSER_COMPONENT_UPDATER_AUTOFILL_REGEX_COMPONENT_INSTALLER_H_
diff --git a/chrome/browser/component_updater/autofill_regex_remover.cc b/chrome/browser/component_updater/autofill_regex_remover.cc
new file mode 100644
index 0000000..0ef7912
--- /dev/null
+++ b/chrome/browser/component_updater/autofill_regex_remover.cc
@@ -0,0 +1,21 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/component_updater/autofill_regex_remover.h"
+
+#include "base/bind.h"
+#include "base/files/file_path.h"
+#include "base/task/thread_pool.h"
+#include "chrome/browser/component_updater/component_updater_utils.h"
+
+namespace component_updater {
+
+void DeleteAutofillRegex(const base::FilePath& user_data_dir) {
+  base::ThreadPool::PostTask(
+      FROM_HERE, {base::TaskPriority::BEST_EFFORT, base::MayBlock()},
+      base::BindOnce(&DeleteFilesAndParentDirectory,
+                     user_data_dir.Append(FILE_PATH_LITERAL("AutofillRegex"))));
+}
+
+}  // namespace component_updater
diff --git a/chrome/browser/component_updater/autofill_regex_remover.h b/chrome/browser/component_updater/autofill_regex_remover.h
new file mode 100644
index 0000000..095f95ca
--- /dev/null
+++ b/chrome/browser/component_updater/autofill_regex_remover.h
@@ -0,0 +1,18 @@
+// 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_COMPONENT_UPDATER_AUTOFILL_REGEX_REMOVER_H_
+#define CHROME_BROWSER_COMPONENT_UPDATER_AUTOFILL_REGEX_REMOVER_H_
+
+namespace base {
+class FilePath;
+}  // namespace base
+
+namespace component_updater {
+
+void DeleteAutofillRegex(const base::FilePath& user_data_dir);
+
+}  // namespace component_updater
+
+#endif  // CHROME_BROWSER_COMPONENT_UPDATER_AUTOFILL_REGEX_REMOVER_H_
diff --git a/chrome/browser/component_updater/registration.cc b/chrome/browser/component_updater/registration.cc
index 50b2e19..c76dfc9 100644
--- a/chrome/browser/component_updater/registration.cc
+++ b/chrome/browser/component_updater/registration.cc
@@ -15,7 +15,7 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/buildflags.h"
 #include "chrome/browser/component_updater/app_provisioning_component_installer.h"
-#include "chrome/browser/component_updater/autofill_regex_component_installer.h"
+#include "chrome/browser/component_updater/autofill_regex_remover.h"
 #include "chrome/browser/component_updater/chrome_client_side_phishing_component_installer.h"
 #include "chrome/browser/component_updater/chrome_origin_trials_component_installer.h"
 #include "chrome/browser/component_updater/crl_set_component_installer.h"
@@ -145,6 +145,8 @@
     // the old file.
     component_updater::DeleteLegacyCRLSet(path);
 
+    component_updater::DeleteAutofillRegex(path);
+
 #if BUILDFLAG(IS_ANDROID)
     // Clean up any desktop sharing hubs that were installed on Android.
     component_updater::DeleteDesktopSharingHub(path);
@@ -209,8 +211,6 @@
 
   RegisterAutofillStatesComponent(cus, g_browser_process->local_state());
 
-  RegisterAutofillRegexComponent(cus);
-
   RegisterClientSidePhishingComponent(cus);
 
 #if BUILDFLAG(IS_LINUX)
diff --git a/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc b/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc
index 7a5ebfa..d364d36 100644
--- a/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc
+++ b/chrome/browser/custom_handlers/protocol_handler_registry_browsertest.cc
@@ -61,14 +61,19 @@
 
 }  // namespace
 
-class RegisterProtocolHandlerBrowserTest : public InProcessBrowserTest {
+class ChromeRegisterProtocolHandlerBrowserTest : public InProcessBrowserTest {
  public:
-  RegisterProtocolHandlerBrowserTest() { }
+  ChromeRegisterProtocolHandlerBrowserTest() = default;
 
   void SetUpOnMainThread() override {
 #if BUILDFLAG(IS_MAC)
     ASSERT_TRUE(test::RegisterAppWithLaunchServices());
 #endif
+
+    // We might define browser tests for other embedders, so the test's data
+    // files will be shared via //componennts
+    embedded_test_server()->ServeFilesFromSourceDirectory(
+        "components/test/data/");
   }
 
   TestRenderViewContextMenu* CreateContextMenu(GURL url) {
@@ -127,8 +132,8 @@
   content::test::FencedFrameTestHelper fenced_frame_helper_;
 };
 
-IN_PROC_BROWSER_TEST_F(RegisterProtocolHandlerBrowserTest,
-    ContextMenuEntryAppearsForHandledUrls) {
+IN_PROC_BROWSER_TEST_F(ChromeRegisterProtocolHandlerBrowserTest,
+                       ContextMenuEntryAppearsForHandledUrls) {
   std::unique_ptr<TestRenderViewContextMenu> menu(
       CreateContextMenu(GURL("https://www.google.com/")));
   ASSERT_FALSE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENLINKWITH));
@@ -144,8 +149,8 @@
   ASSERT_TRUE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENLINKWITH));
 }
 
-IN_PROC_BROWSER_TEST_F(RegisterProtocolHandlerBrowserTest,
-    UnregisterProtocolHandler) {
+IN_PROC_BROWSER_TEST_F(ChromeRegisterProtocolHandlerBrowserTest,
+                       UnregisterProtocolHandler) {
   std::unique_ptr<TestRenderViewContextMenu> menu(
       CreateContextMenu(GURL("https://www.google.com/")));
   ASSERT_FALSE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENLINKWITH));
@@ -166,7 +171,8 @@
   ASSERT_FALSE(menu->IsItemPresent(IDC_CONTENT_CONTEXT_OPENLINKWITH));
 }
 
-IN_PROC_BROWSER_TEST_F(RegisterProtocolHandlerBrowserTest, CustomHandler) {
+IN_PROC_BROWSER_TEST_F(ChromeRegisterProtocolHandlerBrowserTest,
+                       CustomHandler) {
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL handler_url = embedded_test_server()->GetURL("/custom_handler.html");
   AddProtocolHandler("news", handler_url);
@@ -190,7 +196,7 @@
 }
 
 // FencedFrames can not register to handle any protocols.
-IN_PROC_BROWSER_TEST_F(RegisterProtocolHandlerBrowserTest, FencedFrame) {
+IN_PROC_BROWSER_TEST_F(ChromeRegisterProtocolHandlerBrowserTest, FencedFrame) {
   ASSERT_TRUE(embedded_test_server()->Start());
   ASSERT_TRUE(ui_test_utils::NavigateToURL(
       browser(), embedded_test_server()->GetURL("/title1.html")));
@@ -260,10 +266,15 @@
                                                    ->GetLastCommittedURL());
 }
 
-class RegisterProtocolHandlerAndServiceWorkerInterceptor
+class ChromeRegisterProtocolHandlerAndServiceWorkerInterceptor
     : public InProcessBrowserTest {
  public:
   void SetUpOnMainThread() override {
+    // We might define browser tests for other embedders, so the test's data
+    // files will be shared via //componennts
+    embedded_test_server()->ServeFilesFromSourceDirectory(
+        "components/test/data/");
+
     ASSERT_TRUE(embedded_test_server()->Start());
 
     // Navigate to the test page.
@@ -281,7 +292,7 @@
 };
 
 // TODO(crbug.com/1204127): Fix flakiness.
-IN_PROC_BROWSER_TEST_F(RegisterProtocolHandlerAndServiceWorkerInterceptor,
+IN_PROC_BROWSER_TEST_F(ChromeRegisterProtocolHandlerAndServiceWorkerInterceptor,
                        DISABLED_RegisterFetchListenerForHTMLHandler) {
   WebContents* web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 05151540..9236ed3 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -121,7 +121,7 @@
   {
     "name": "allow-touchpad-haptic-click-settings",
     "owners": [ "gavinwill", "cros-peripherals@google.com" ],
-    "expiry_milestone": 101
+    "expiry_milestone": 105
   },
   {
     "name": "always-enable-hdcp",
@@ -273,7 +273,7 @@
   {
     "name": "arc-use-limit-cache-balloon-policy",
     "owners": [ "cwd" ],
-    "expiry_milestone": 97
+    "expiry_milestone": 110
   },
   {
     "name": "arc-window-predictor",
@@ -1436,11 +1436,6 @@
     "expiry_milestone": 106
   },
   {
-    "name": "eche-swa-in-background",
-    "owners": [ "dhnishi" ],
-    "expiry_milestone": 106
-  },
-  {
     "name": "edit-context",
     "owners": [ "shihken@microsoft.com", "snianu@microsoft.com", "yosin" ],
     "expiry_milestone": 104
@@ -1855,7 +1850,7 @@
   {
     "name": "enable-desks-trackpad-swipe-improvements",
     "owners": [ "fanafan", "sammiequon", "tclaiborne" ],
-    "expiry_milestone": 101
+    "expiry_milestone": 110
   },
   {
     "name": "enable-desktop-capture-lacros-v2",
@@ -4606,22 +4601,22 @@
   {
     "name": "override-language-prefs-for-href-translate",
     "owners": [ "sclittle", "chrome-language@google.com" ],
-    "expiry_milestone": 100
+    "expiry_milestone": 106
   },
   {
     "name": "override-similar-languages-for-href-translate",
     "owners": [ "sclittle", "chrome-language@google.com" ],
-    "expiry_milestone": 100
+    "expiry_milestone": 106
   },
   {
     "name": "override-site-prefs-for-href-translate",
     "owners": [ "sclittle", "chrome-language@google.com" ],
-    "expiry_milestone": 100
+    "expiry_milestone": 106
   },
   {
     "name": "override-unsupported-page-language-for-href-translate",
     "owners": [ "sclittle", "chrome-language@google.com" ],
-    "expiry_milestone": 100
+    "expiry_milestone": 106
   },
   {
     // This flag is used by ChromeOS for some accessibility users.
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index ddc4d36..b98cc974 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -4660,11 +4660,6 @@
 const char kEcheSWADebugModeName[] = "Enable Eche Debug Mode";
 const char kEcheSWADebugModeDescription[] = "Enable the Debug Mode of the Eche";
 
-const char kEcheSWAInBackgroundName[] = "Enable Eche Background Mode";
-const char kEcheSWAInBackgroundDescription[] =
-    "Enable the Eche SWA to run in the background before connection "
-    "established";
-
 const char kEnableIdleInhibitName[] = "Enable Idle Inhibit Protocol";
 const char kEnableIdleInhibitDescription[] =
     "Enables the Wayland idle-inhibit-unstable-v1 protocol";
@@ -4954,12 +4949,6 @@
 const char kCrosLanguageSettingsImeOptionsInSettingsDescription[] =
     "Adds IME settings to the settings menu";
 
-const char kKeyboardBasedDisplayArrangementInSettingsName[] =
-    "Keyboard-based Display Arrangement in Settings";
-const char kKeyboardBasedDisplayArrangementInSettingsDescription[] =
-    "Enables using arrow keys to rearrange displays on Settings > Device > "
-    "Displays page.";
-
 const char kLacrosAvailabilityIgnoreName[] =
     "Ignore lacros-availability policy";
 const char kLacrosAvailabilityIgnoreDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 6fee753..d5ecef3 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -2670,9 +2670,6 @@
 extern const char kEcheSWADebugModeName[];
 extern const char kEcheSWADebugModeDescription[];
 
-extern const char kEcheSWAInBackgroundName[];
-extern const char kEcheSWAInBackgroundDescription[];
-
 extern const char kEnableIdleInhibitName[];
 extern const char kEnableIdleInhibitDescription[];
 
@@ -2854,9 +2851,6 @@
 extern const char kImeStylusHandwritingName[];
 extern const char kImeStylusHandwritingDescription[];
 
-extern const char kKeyboardBasedDisplayArrangementInSettingsName[];
-extern const char kKeyboardBasedDisplayArrangementInSettingsDescription[];
-
 extern const char kLacrosAvailabilityIgnoreName[];
 extern const char kLacrosAvailabilityIgnoreDescription[];
 
diff --git a/chrome/browser/media/router/BUILD.gn b/chrome/browser/media/router/BUILD.gn
index 40300d4..56a3e31a 100644
--- a/chrome/browser/media/router/BUILD.gn
+++ b/chrome/browser/media/router/BUILD.gn
@@ -259,6 +259,7 @@
       # In-browser discovery is not used by Android for now.
       "discovery/access_code/access_code_cast_discovery_interface_unittest.cc",
       "discovery/access_code/access_code_cast_feature_unittest.cc",
+      "discovery/access_code/access_code_cast_pref_updater_unittest.cc",
       "discovery/access_code/access_code_cast_sink_service_unittest.cc",
       "discovery/access_code/access_code_media_sink_util_unittest.cc",
       "discovery/dial/device_description_fetcher_unittest.cc",
@@ -312,6 +313,7 @@
       "//chrome/test:test_support",
       "//components/sync_preferences:test_support",
       "//content/test:test_support",
+      "//services/preferences/public/cpp:cpp",
       "//third_party/openscreen/src/cast/common:public",
     ]
   }
diff --git a/chrome/browser/media/router/discovery/access_code/BUILD.gn b/chrome/browser/media/router/discovery/access_code/BUILD.gn
index e4d014b5..f0ba82177 100644
--- a/chrome/browser/media/router/discovery/access_code/BUILD.gn
+++ b/chrome/browser/media/router/discovery/access_code/BUILD.gn
@@ -28,6 +28,8 @@
     sources = [
       "access_code_cast_discovery_interface.cc",
       "access_code_cast_discovery_interface.h",
+      "access_code_cast_pref_updater.cc",
+      "access_code_cast_pref_updater.h",
       "access_code_cast_sink_service.cc",
       "access_code_cast_sink_service.h",
       "access_code_cast_sink_service_factory.cc",
@@ -55,10 +57,12 @@
       "//components/cast_channel:cast_channel",
       "//components/keyed_service/content:content",
       "//components/leveldb_proto:leveldb_proto",
+      "//components/prefs:prefs",
       "//components/signin/public/base:base",
       "//components/signin/public/identity_manager:identity_manager",
       "//components/user_manager:user_manager",
       "//components/version_info:channel",
+      "//services/preferences/public/cpp:cpp",
     ]
   }
 }
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.cc b/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.cc
index 84f33017..c634b4d9 100644
--- a/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.cc
+++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.cc
@@ -23,6 +23,9 @@
                                 PrefRegistry::PUBLIC);
   registry->RegisterIntegerPref(prefs::kAccessCodeCastDeviceDuration, 0,
                                 PrefRegistry::PUBLIC);
+  registry->RegisterDictionaryPref(prefs::kAccessCodeCastDevices);
+  registry->RegisterDictionaryPref(prefs::kAccessCodeCastDiscoveredNetworks);
+  registry->RegisterDictionaryPref(prefs::kAccessCodeCastDeviceAdditionTime);
 }
 
 bool GetAccessCodeCastEnabledPref(PrefService* pref_service) {
@@ -36,6 +39,7 @@
   return base::Seconds(
       pref_service->GetInteger(prefs::kAccessCodeCastDeviceDuration));
 }
+
 #endif  // !BUILDFLAG(IS_ANDROID)
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.h b/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.h
index 1d4688c..d713a28 100644
--- a/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.h
+++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_feature.h
@@ -24,10 +24,34 @@
 // shown.
 constexpr char kAccessCodeCastEnabled[] =
     "media_router.access_code_cast.enabled";
+
 // Pref name for the pref that determines how long a scanned receiver remains in
 // the receiver list. Duration is measured in seconds.
 constexpr char kAccessCodeCastDeviceDuration[] =
     "media_router.access_code_cast.device_duration";
+
+// Pref that keeps track of cast devices added on a user's profile. It is
+// registered as a dictionary pref with each key being a
+// MediaSink::Id(std::string) and value being a MediaSinkInternal object stores
+// as a base::Value::Dict.
+// Whenever a cast device is discovered via access code, a new entry will be
+// added to this dictionary (or updated if the MediaSink::Id already exists).
+constexpr char kAccessCodeCastDevices[] =
+    "media_router.access_code_cast.devices";
+
+// Pref that keeps track of which cast devices were discovered on which
+// networks. It is registered as a dictionary pref with each key being a
+// std::string network_id and value being a list of MediaSink::Id. Whenever a
+// device is added or updated, this dictionary will be updated with that device.
+// If the device expires it will be removed from that network list.
+constexpr char kAccessCodeCastDiscoveredNetworks[] =
+    "media_router.access_code_cast.discovered_networks";
+
+// Pref that keeps track of when a cast device is added. It is be registered
+// as a dictionary pref with each key being a MediaSink::Id and value being a
+// base::Time.
+constexpr char kAccessCodeCastDeviceAdditionTime[] =
+    "media_router.access_code_cast.addition_time";
 }  // namespace prefs
 
 // Registers Access Code Cast related preferences with per-profile pref
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_pref_updater.cc b/chrome/browser/media/router/discovery/access_code/access_code_cast_pref_updater.cc
new file mode 100644
index 0000000..a2b1912
--- /dev/null
+++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_pref_updater.cc
@@ -0,0 +1,119 @@
+// 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/media/router/discovery/access_code/access_code_cast_pref_updater.h"
+
+#include "base/json/values_util.h"
+#include "base/values.h"
+#include "chrome/browser/media/router/discovery/access_code/access_code_media_sink_util.h"
+#include "services/preferences/public/cpp/dictionary_value_update.h"
+#include "services/preferences/public/cpp/scoped_pref_update.h"
+
+namespace media_router {
+
+using ::prefs::DictionaryValueUpdate;
+using ::prefs::ScopedDictionaryPrefUpdate;
+
+AccessCodeCastPrefUpdater::AccessCodeCastPrefUpdater(PrefService* service)
+    : pref_service_(service) {
+  DCHECK(pref_service_) << "The pref service does not exist!";
+}
+
+AccessCodeCastPrefUpdater::~AccessCodeCastPrefUpdater() = default;
+
+// This stored preference looks like:
+//   "prefs::kAccessCodeCastDevices": {
+//     "<cast1>:1234234": {
+//       "sink": {
+//         "sink_id": "<cast1>:1234234",
+//         "display_name": "Karls Cast Device",
+//       },
+//       "extra_data": {
+//         "capabilities": 4,
+//         "port": 666,
+//         "ip_address": ""192.0.2.146"",
+//       },
+//     },
+//   }
+
+void AccessCodeCastPrefUpdater::UpdateDevicesDict(
+    const MediaSinkInternal& sink) {
+  ScopedDictionaryPrefUpdate update(pref_service_,
+                                    prefs::kAccessCodeCastDevices);
+  std::unique_ptr<DictionaryValueUpdate> devices_pref = update.Get();
+  DCHECK(devices_pref) << "The " << prefs::kAccessCodeCastDevices
+                       << " pref does not exist.";
+
+  devices_pref->SetDictionary(
+      sink.id(), base::DictionaryValue::From(base::Value::ToUniquePtrValue(
+                     CreateValueDictFromMediaSinkInternal(sink))));
+}
+
+// This stored preference looks like:
+//   "prefs::kAccessCodeCastDiscoveredNetworks": {
+//     "<network_id_1>": [<sink_id_1>, <sink_id_2>],
+//     "<network_id_2>": [<sink_id_4>, <sink_id_6>],
+//   }
+void AccessCodeCastPrefUpdater::UpdateDiscoveredNetworksDict(
+    const MediaSink::Id sink_id,
+    const std::string& network_id) {
+  ScopedDictionaryPrefUpdate update(pref_service_,
+                                    prefs::kAccessCodeCastDiscoveredNetworks);
+  std::unique_ptr<DictionaryValueUpdate> discovered_networks_pref =
+      update.Get();
+  DCHECK(discovered_networks_pref)
+      << "The " << prefs::kAccessCodeCastDiscoveredNetworks
+      << " pref does not exist.";
+
+  base::ListValue* current_network_list = nullptr;
+  bool network_id_exists =
+      discovered_networks_pref->GetList(network_id, &current_network_list);
+
+  // There already exists a list with remembered devices on the current
+  // network_id. Simply append the sink_id to this network_id.
+  if (network_id_exists) {
+    // Make sure the sink_id doesn't already exist so we don't duplicate the
+    // the entry.
+    for (const base::Value& current_sink_id :
+         current_network_list->GetListDeprecated()) {
+      if (*current_sink_id.GetIfString() == sink_id)
+        return;
+    }
+    current_network_list->Append(sink_id);
+  } else {
+    // There does not exist any remembered devices on this network yet. Create a
+    // new list with the current sink_id and set that list in the dictionary.
+    auto sink_ids = std::make_unique<base::Value>(base::Value::Type::LIST);
+    sink_ids->Append(sink_id);
+    discovered_networks_pref->Set(network_id, std::move(sink_ids));
+  }
+}
+
+// This stored preference looks like:
+//   "prefs::kAccessCodeCastDeviceAdditionTime": {
+//     A string-flavored base::value representing the int64_t number of
+//     microseconds since the Windows epoch, using base::TimeToValue().
+//     "<sink_id_1>": "1237234734723747234",
+//     "<sink_id_2>": "12372347312312347234",
+//   }
+void AccessCodeCastPrefUpdater::UpdateDeviceAdditionTimeDict(
+    const MediaSink::Id sink_id) {
+  ScopedDictionaryPrefUpdate update(pref_service_,
+                                    prefs::kAccessCodeCastDeviceAdditionTime);
+
+  std::unique_ptr<DictionaryValueUpdate> device_time_pref = update.Get();
+  DCHECK(device_time_pref) << "The " << prefs::kAccessCodeCastDeviceAdditionTime
+                           << " pref does not exist.";
+
+  // If the key doesn't exist, or exists but isn't a DictionaryValue, a new
+  // DictionaryValue will be created and attached to the path in that location.
+  device_time_pref->SetKey(sink_id, base::TimeToValue(base::Time::Now()));
+}
+
+base::WeakPtr<AccessCodeCastPrefUpdater>
+AccessCodeCastPrefUpdater::GetWeakPtr() {
+  return weak_ptr_factory_.GetWeakPtr();
+}
+
+}  // namespace media_router
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_pref_updater.h b/chrome/browser/media/router/discovery/access_code/access_code_cast_pref_updater.h
new file mode 100644
index 0000000..ee379cec
--- /dev/null
+++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_pref_updater.h
@@ -0,0 +1,54 @@
+// 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/media/router/discovery/access_code/access_code_cast_feature.h"
+#include "components/media_router/common/discovery/media_sink_internal.h"
+#include "components/media_router/common/media_sink.h"
+#include "components/prefs/pref_service.h"
+#include "components/prefs/scoped_user_pref_update.h"
+
+class PrefService;
+
+#ifndef CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_ACCESS_CODE_ACCESS_CODE_CAST_PREF_UPDATER_H_
+#define CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_ACCESS_CODE_ACCESS_CODE_CAST_PREF_UPDATER_H_
+
+namespace media_router {
+
+// Pref updater for AccessCodeCasting.
+class AccessCodeCastPrefUpdater {
+ public:
+  explicit AccessCodeCastPrefUpdater(PrefService* service);
+
+  AccessCodeCastPrefUpdater(const AccessCodeCastPrefUpdater&) = delete;
+  AccessCodeCastPrefUpdater& operator=(const AccessCodeCastPrefUpdater&) =
+      delete;
+
+  virtual ~AccessCodeCastPrefUpdater();
+
+  // Sets the key for the given |sink| id with the actual |sink| itself. This
+  // function will overwrite a sink id if it already exists.
+  void UpdateDevicesDict(const MediaSinkInternal& sink);
+
+  // Tries to find an existing |network_id| within the dict pref. If a list is
+  // found then append the |sink_id| to that list, otherwise create new list
+  // with the |sink_id| as the sole value.
+  void UpdateDiscoveredNetworksDict(const MediaSink::Id sink_id,
+                                    const std::string& network_id);
+
+  // Sets the key for the |sink_id| with the time it is added. This is
+  // calculated at the time of the functions calling. If the |sink_id| already
+  // exist, then update the value of that |sink_id| with a new time.
+  void UpdateDeviceAdditionTimeDict(const MediaSink::Id sink_id);
+
+  base::WeakPtr<AccessCodeCastPrefUpdater> GetWeakPtr();
+
+ private:
+  PrefService* pref_service_;
+
+  base::WeakPtrFactory<AccessCodeCastPrefUpdater> weak_ptr_factory_{this};
+};
+
+}  // namespace media_router
+
+#endif  // CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_ACCESS_CODE_ACCESS_CODE_CAST_PREF_UPDATER_H_
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_pref_updater_unittest.cc b/chrome/browser/media/router/discovery/access_code/access_code_cast_pref_updater_unittest.cc
new file mode 100644
index 0000000..efd9356
--- /dev/null
+++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_pref_updater_unittest.cc
@@ -0,0 +1,198 @@
+// 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/media/router/discovery/access_code/access_code_cast_pref_updater.h"
+
+#include "base/json/json_reader.h"
+#include "base/json/values_util.h"
+#include "base/run_loop.h"
+#include "base/test/bind.h"
+#include "base/test/task_environment.h"
+#include "base/time/time.h"
+#include "base/values.h"
+#include "chrome/browser/media/router/discovery/access_code/access_code_cast_feature.h"
+#include "chrome/browser/media/router/discovery/access_code/access_code_media_sink_util.h"
+#include "chrome/browser/media/router/test/provider_test_helpers.h"
+#include "chrome/browser/web_applications/web_app_constants.h"
+#include "chrome/browser/web_applications/web_app_id.h"
+#include "chrome/common/pref_names.h"
+#include "components/sync_preferences/testing_pref_service_syncable.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/test/browser_task_environment.h"
+#include "services/preferences/public/cpp/dictionary_value_update.h"
+#include "services/preferences/public/cpp/scoped_pref_update.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace media_router {
+namespace {
+const std::string& network1 = "foo_network";
+const std::string& network2 = "bar_network";
+}  // namespace
+
+class AccessCodeCastPrefUpdaterTest : public testing::Test {
+ public:
+  AccessCodeCastPrefUpdaterTest()
+      : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
+    RegisterAccessCodeProfilePrefs(prefs_.registry());
+  }
+
+  void SetUp() override {
+    pref_updater_ = std::make_unique<AccessCodeCastPrefUpdater>(prefs());
+  }
+
+  sync_preferences::TestingPrefServiceSyncable* prefs() { return &prefs_; }
+
+  AccessCodeCastPrefUpdater* pref_updater() { return pref_updater_.get(); }
+
+  content::BrowserTaskEnvironment& task_env() { return task_environment_; }
+
+ protected:
+  content::BrowserTaskEnvironment task_environment_;
+
+ private:
+  sync_preferences::TestingPrefServiceSyncable prefs_;
+  std::unique_ptr<AccessCodeCastPrefUpdater> pref_updater_;
+};
+
+TEST_F(AccessCodeCastPrefUpdaterTest, TestUpdateDevicesDictRecorded) {
+  MediaSinkInternal cast_sink = CreateCastSink(1);
+  pref_updater()->UpdateDevicesDict(cast_sink);
+  auto* dict = prefs()->GetDictionary(prefs::kAccessCodeCastDevices);
+  auto* sink_id_dict = dict->FindKey(cast_sink.id());
+  EXPECT_EQ(*sink_id_dict, CreateValueDictFromMediaSinkInternal(cast_sink));
+}
+
+TEST_F(AccessCodeCastPrefUpdaterTest, TestUpdateDevicesDictOverwrite) {
+  MediaSinkInternal cast_sink = CreateCastSink(1);
+
+  // Store cast_sink.
+  pref_updater()->UpdateDevicesDict(cast_sink);
+
+  // Make new cast_sink with same id, but change display name.
+  MediaSinkInternal cast_sink1 = CreateCastSink(1);
+  auto sink1 = cast_sink1.sink();
+  sink1.set_name("new_name");
+  cast_sink1.set_sink(sink1);
+
+  // Store new cast_sink1 with same id as cast_sink, it should overwrite the
+  // existing pref.
+  pref_updater()->UpdateDevicesDict(cast_sink1);
+
+  auto* dict = prefs()->GetDictionary(prefs::kAccessCodeCastDevices);
+  auto* sink_id_dict = dict->FindKey(cast_sink.id());
+  EXPECT_NE(*sink_id_dict, CreateValueDictFromMediaSinkInternal(cast_sink));
+  EXPECT_EQ(*sink_id_dict, CreateValueDictFromMediaSinkInternal(cast_sink1));
+}
+
+TEST_F(AccessCodeCastPrefUpdaterTest, UpdateDiscoveredNetworksDictRecorded) {
+  MediaSinkInternal cast_sink = CreateCastSink(1);
+
+  pref_updater()->UpdateDiscoveredNetworksDict(cast_sink.id(), network1);
+
+  auto expected_network_list =
+      std::make_unique<base::Value>(base::Value::Type::LIST);
+  expected_network_list->Append(cast_sink.id());
+
+  auto* dict = prefs()->GetDictionary(prefs::kAccessCodeCastDiscoveredNetworks);
+  auto* network_list = dict->FindKey(network1);
+
+  EXPECT_EQ(*network_list, *expected_network_list.get());
+}
+
+TEST_F(AccessCodeCastPrefUpdaterTest,
+       UpdateDiscoveredNetworksDictMultipleSinks) {
+  MediaSinkInternal cast_sink = CreateCastSink(1);
+  MediaSinkInternal cast_sink2 = CreateCastSink(2);
+
+  pref_updater()->UpdateDiscoveredNetworksDict(cast_sink.id(), network1);
+  pref_updater()->UpdateDiscoveredNetworksDict(cast_sink2.id(), network1);
+
+  auto expected_network_list =
+      std::make_unique<base::Value>(base::Value::Type::LIST);
+  expected_network_list->Append(cast_sink.id());
+  expected_network_list->Append(cast_sink2.id());
+
+  auto* dict = prefs()->GetDictionary(prefs::kAccessCodeCastDiscoveredNetworks);
+  auto* network_list = dict->FindKey(network1);
+
+  EXPECT_EQ(*network_list, *expected_network_list.get());
+}
+
+TEST_F(AccessCodeCastPrefUpdaterTest,
+       UpdateDiscoveredNetworksDictMultipleNetworks) {
+  MediaSinkInternal cast_sink = CreateCastSink(1);
+  MediaSinkInternal cast_sink2 = CreateCastSink(2);
+  MediaSinkInternal cast_sink3 = CreateCastSink(3);
+  MediaSinkInternal cast_sink4 = CreateCastSink(4);
+
+  pref_updater()->UpdateDiscoveredNetworksDict(cast_sink.id(), network1);
+  pref_updater()->UpdateDiscoveredNetworksDict(cast_sink2.id(), network1);
+  pref_updater()->UpdateDiscoveredNetworksDict(cast_sink3.id(), network2);
+  pref_updater()->UpdateDiscoveredNetworksDict(cast_sink4.id(), network2);
+
+  auto expected_network1_list =
+      std::make_unique<base::Value>(base::Value::Type::LIST);
+  expected_network1_list->Append(cast_sink.id());
+  expected_network1_list->Append(cast_sink2.id());
+
+  auto expected_network2_list =
+      std::make_unique<base::Value>(base::Value::Type::LIST);
+  expected_network2_list->Append(cast_sink3.id());
+  expected_network2_list->Append(cast_sink4.id());
+
+  auto* dict = prefs()->GetDictionary(prefs::kAccessCodeCastDiscoveredNetworks);
+
+  auto* network_list1 = dict->FindKey(network1);
+  EXPECT_EQ(*network_list1, *expected_network1_list.get());
+
+  auto* network_list2 = dict->FindKey(network2);
+  EXPECT_EQ(*network_list2, *expected_network2_list.get());
+}
+
+TEST_F(AccessCodeCastPrefUpdaterTest, EnsureNoDuplicatesInSameNetworkList) {
+  MediaSinkInternal cast_sink = CreateCastSink(1);
+
+  pref_updater()->UpdateDiscoveredNetworksDict(cast_sink.id(), network1);
+  pref_updater()->UpdateDiscoveredNetworksDict(cast_sink.id(), network1);
+
+  auto expected_network_list =
+      std::make_unique<base::Value>(base::Value::Type::LIST);
+  expected_network_list->Append(cast_sink.id());
+
+  auto* dict = prefs()->GetDictionary(prefs::kAccessCodeCastDiscoveredNetworks);
+  auto* network_list = dict->FindKey(network1);
+
+  EXPECT_EQ(*network_list, *expected_network_list.get());
+}
+
+TEST_F(AccessCodeCastPrefUpdaterTest, TestUpdateDeviceAdditionTimeDict) {
+  MediaSinkInternal cast_sink = CreateCastSink(1);
+
+  pref_updater()->UpdateDeviceAdditionTimeDict(cast_sink.id());
+  auto* dict = prefs()->GetDictionary(prefs::kAccessCodeCastDeviceAdditionTime);
+  auto* time_of_addition = dict->FindKey(cast_sink.id());
+  EXPECT_TRUE(time_of_addition);
+}
+
+TEST_F(AccessCodeCastPrefUpdaterTest,
+       TestUpdateDeviceAdditionTimeDictOverwrite) {
+  MediaSinkInternal cast_sink = CreateCastSink(1);
+
+  pref_updater()->UpdateDeviceAdditionTimeDict(cast_sink.id());
+  auto* dict = prefs()->GetDictionary(prefs::kAccessCodeCastDeviceAdditionTime);
+  auto initial_time_of_addition =
+      base::ValueToTime(dict->FindKey(cast_sink.id())).value();
+
+  task_env().AdvanceClock(base::Seconds(10));
+  pref_updater()->UpdateDeviceAdditionTimeDict(cast_sink.id());
+  auto final_time_of_addition =
+      base::ValueToTime(dict->FindKey(cast_sink.id())).value();
+
+  // Expect the two times of addition to be different, and the second time to be
+  // greater.
+  EXPECT_GE(final_time_of_addition, initial_time_of_addition);
+}
+
+}  // namespace media_router
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service.cc b/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service.cc
index 44435da..e8baaa5 100644
--- a/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service.cc
+++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service.cc
@@ -13,8 +13,9 @@
 #include "base/task/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
-#include "chrome/browser/media/router/discovery/access_code/access_code_cast_feature.h"
+#include "chrome/browser/media/router/discovery/access_code/access_code_cast_pref_updater.h"
 #include "chrome/browser/media/router/discovery/access_code/access_code_media_sink_util.h"
+#include "chrome/browser/media/router/discovery/discovery_network_monitor.h"
 #include "chrome/browser/media/router/discovery/mdns/media_sink_util.h"
 #include "chrome/browser/media/router/discovery/media_sink_discovery_metrics.h"
 #include "chrome/browser/media/router/providers/cast/dual_media_sink_service.h"
@@ -66,8 +67,11 @@
       media_routes_observer_(
           std::make_unique<AccessCodeMediaRoutesObserver>(media_router, this)),
       cast_media_sink_service_impl_(cast_media_sink_service_impl),
-      task_runner_(base::SequencedTaskRunnerHandle::Get()) {
+      task_runner_(base::SequencedTaskRunnerHandle::Get()),
+      network_monitor_(DiscoveryNetworkMonitor::GetInstance()) {
   DCHECK(profile_);
+  pref_updater_ =
+      std::make_unique<AccessCodeCastPrefUpdater>(profile_->GetPrefs());
   backoff_policy_ = {
       // Number of initial errors (in sequence) to ignore before going into
       // exponential backoff.
@@ -305,9 +309,6 @@
     }
     return;
   }
-  // Task runner for the current thread.
-  scoped_refptr<base::SequencedTaskRunner> current_task_runner =
-      base::SequencedTaskRunnerHandle::Get();
 
   // The OnChannelOpenedResult() callback needs to be be bound with
   // BindPostTask() to ensure that the callback is invoked on this specific task
@@ -317,7 +318,7 @@
       weak_ptr_factory_.GetWeakPtr(), std::move(add_sink_callback), sink.id());
 
   auto returned_channel_cb =
-      base::BindPostTask(current_task_runner, std::move(channel_cb));
+      base::BindPostTask(task_runner_, std::move(channel_cb));
 
   auto backoff_entry = std::make_unique<net::BackoffEntry>(&backoff_policy_);
   media_router_->GetLogger()->LogInfo(
@@ -360,6 +361,49 @@
   std::move(add_sink_callback).Run(AddSinkResultCode::OK, sink_id);
 }
 
+void AccessCodeCastSinkService::StoreSinkInPrefsById(
+    const MediaSink::Id sink_id) {
+  base::PostTaskAndReplyWithResult(
+      cast_media_sink_service_impl_->task_runner().get(), FROM_HERE,
+      base::BindOnce(&CastMediaSinkServiceImpl::GetSinkById,
+                     base::Unretained(cast_media_sink_service_impl_), sink_id),
+      base::BindOnce(&AccessCodeCastSinkService::StoreSinkInPrefs,
+                     weak_ptr_factory_.GetWeakPtr()));
+}
+
+void AccessCodeCastSinkService::StoreSinkInPrefs(
+    const MediaSinkInternal* sink) {
+  // For some reason the sink_id isn't in the media router. We can't update
+  // prefs.
+  if (!sink) {
+    media_router_->GetLogger()->LogError(
+        mojom::LogCategory::kDiscovery, kLoggerComponent,
+        "Unable to remember the cast sink since it was not present in the "
+        "media router.",
+        "", "", "");
+    return;
+  }
+  // The UpdateDiscoveredNetworksDict() callback needs to be be
+  // bound with BindPostTask() to ensure that the callback is invoked on this
+  // specific task runner.
+  auto network_cb =
+      base::BindOnce(&AccessCodeCastPrefUpdater::UpdateDiscoveredNetworksDict,
+                     pref_updater_->GetWeakPtr(), sink->id());
+
+  auto returned_network_cb =
+      base::BindPostTask(task_runner_, std::move(network_cb));
+
+  // We need to run this task on the IO thread since the DiscoveryNetworkMonitor
+  // runs on the IO thread.
+  cast_media_sink_service_impl_->task_runner()->PostTask(
+      FROM_HERE, base::BindOnce(&DiscoveryNetworkMonitor::GetNetworkId,
+                                base::Unretained(network_monitor_),
+                                std::move(returned_network_cb)));
+
+  pref_updater_->UpdateDevicesDict(*sink);
+  pref_updater_->UpdateDeviceAdditionTimeDict(sink->id());
+}
+
 void AccessCodeCastSinkService::Shutdown() {
   // There's no guarantee that MediaRouter is still in the
   // MediaRoutesObserver. |media_routes_observer_| accesses MediaRouter in its
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service.h b/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service.h
index f1c9c225..26b3f781 100644
--- a/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service.h
+++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service.h
@@ -10,6 +10,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/media/router/discovery/access_code/access_code_cast_discovery_interface.h"
+#include "chrome/browser/media/router/discovery/access_code/access_code_cast_pref_updater.h"
 #include "chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/access_code_cast/access_code_cast.mojom.h"
@@ -57,6 +58,9 @@
   virtual void AddSinkToMediaRouter(const MediaSinkInternal& sink,
                                     AddSinkResultCallback add_sink_callback);
 
+  void StoreSinkInPrefs(const MediaSinkInternal* sink);
+  void StoreSinkInPrefsById(const MediaSink::Id sink_id);
+
  private:
   class AccessCodeMediaRoutesObserver : public MediaRoutesObserver {
    public:
@@ -109,6 +113,8 @@
                            OnChannelOpenedSuccess);
   FRIEND_TEST_ALL_PREFIXES(AccessCodeCastSinkServiceTest,
                            OnChannelOpenedFailure);
+  FRIEND_TEST_ALL_PREFIXES(AccessCodeCastSinkServiceTest,
+                           SinkDoesntExistForPrefs);
 
   // Constructor used for testing.
   AccessCodeCastSinkService(
@@ -171,6 +177,12 @@
 
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
+  // Raw pointer to DiscoveryNetworkMonitor, which is a global leaky singleton
+  // and manages network change notifications.
+  const raw_ptr<DiscoveryNetworkMonitor> network_monitor_;
+
+  std::unique_ptr<AccessCodeCastPrefUpdater> pref_updater_;
+
   base::WeakPtrFactory<AccessCodeCastSinkService> weak_ptr_factory_{this};
 };
 
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service_unittest.cc b/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service_unittest.cc
index cfecede..bccf164f 100644
--- a/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service_unittest.cc
+++ b/chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service_unittest.cc
@@ -351,4 +351,12 @@
                                                         "123456", false);
 }
 
+TEST_F(AccessCodeCastSinkServiceTest, SinkDoesntExistForPrefs) {
+  // Ensure that the StoreSinkInPrefs() function returns if no sink exists in
+  // the media router and no tasks are posted.
+  mock_time_task_runner()->FastForwardUntilNoTasksRemain();
+  access_code_cast_sink_service_->StoreSinkInPrefs(nullptr);
+  EXPECT_FALSE(mock_time_task_runner()->GetPendingTaskCount());
+}
+
 }  // namespace media_router
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_media_sink_util.cc b/chrome/browser/media/router/discovery/access_code/access_code_media_sink_util.cc
index 3affdb9..fed9f022 100644
--- a/chrome/browser/media/router/discovery/access_code/access_code_media_sink_util.cc
+++ b/chrome/browser/media/router/discovery/access_code/access_code_media_sink_util.cc
@@ -11,6 +11,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
+#include "base/values.h"
 #include "components/cast_channel/cast_socket.h"
 #include "components/media_router/common/discovery/media_sink_internal.h"
 #include "components/media_router/common/mojom/media_router.mojom.h"
@@ -23,6 +24,14 @@
 
 namespace {
 
+constexpr char kSinkDictKey[] = "sink";
+constexpr char kSinkIdKey[] = "sink_id";
+constexpr char kDisplayNameKey[] = "display_name";
+constexpr char kExtraDataDictKey[] = "extra_data";
+constexpr char kCapabilitiesKey[] = "capabilities";
+constexpr char kPortKey[] = "port";
+constexpr char kIpAddressKey[] = "ip_address";
+
 uint8_t ConvertDeviceCapabilitiesToInt(
     chrome_browser_media::proto::DeviceCapabilities proto) {
   // Meaning of capacity value for each bit:
@@ -122,4 +131,86 @@
 
   return std::make_pair(cast_sink, CreateCastMediaSinkResult::kOk);
 }
+
+base::Value CreateValueDictFromMediaSinkInternal(
+    const MediaSinkInternal& sink) {
+  const CastSinkExtraData& extra_data = sink.cast_data();
+
+  base::Value::Dict extra_data_dict;
+  extra_data_dict.Set(kCapabilitiesKey, extra_data.capabilities);
+  extra_data_dict.Set(kPortKey, extra_data.ip_endpoint.port());
+  extra_data_dict.Set(kIpAddressKey,
+                      extra_data.ip_endpoint.address().ToString());
+
+  base::Value::Dict sink_dict;
+  sink_dict.Set(kSinkIdKey, sink.id());
+  sink_dict.Set(kDisplayNameKey, sink.sink().name());
+
+  base::Value::Dict value_dict;
+  value_dict.Set(kSinkDictKey, std::move(sink_dict));
+  value_dict.Set(kExtraDataDictKey, std::move(extra_data_dict));
+
+  return base::Value(std::move(value_dict));
+}
+
+// This stored dict looks like:
+//   "<cast1>:1234234": {
+//     "sink": {
+//       "sink_id": "<cast1>:1234234",
+//       "display_name": "Karls Cast Device",
+//     },
+//     "extra_data": {
+//       "capabilities": 4,
+//       "port": 666,
+//       "ip_address": ""192.0.2.146"",
+//     },
+//   }
+absl::optional<MediaSinkInternal> ParseValueDictIntoMediaSinkInternal(
+    const base::Value::Dict& value_dict) {
+  const auto* extra_data_dict = value_dict.FindDict(kExtraDataDictKey);
+  if (!extra_data_dict)
+    return absl::nullopt;
+
+  net::IPAddress ip_address;
+  const std::string* ip_address_string =
+      extra_data_dict->FindString(kIpAddressKey);
+  if (!ip_address_string)
+    return absl::nullopt;
+  if (!ip_address.AssignFromIPLiteral(*ip_address_string))
+    return absl::nullopt;
+
+  absl::optional<int> port = extra_data_dict->FindInt(kPortKey);
+  if (!port.has_value())
+    return absl::nullopt;
+
+  absl::optional<int> capabilities = extra_data_dict->FindInt(kCapabilitiesKey);
+  if (!capabilities.has_value())
+    return absl::nullopt;
+
+  CastSinkExtraData extra_data;
+  extra_data.ip_endpoint = net::IPEndPoint(ip_address, port.value());
+  extra_data.capabilities = capabilities.value();
+  extra_data.discovered_by_access_code = true;
+
+  const auto* sink_dict = value_dict.FindDict(kSinkDictKey);
+  if (!sink_dict)
+    return absl::nullopt;
+  const std::string* sink_id = sink_dict->FindString(kSinkIdKey);
+  if (!sink_id)
+    return absl::nullopt;
+  const std::string* display_name = sink_dict->FindString(kDisplayNameKey);
+  if (!display_name)
+    return absl::nullopt;
+
+  MediaSink sink(*sink_id, *display_name,
+                 GetCastSinkIconType(extra_data.capabilities),
+                 mojom::MediaRouteProviderId::CAST);
+
+  MediaSinkInternal cast_sink;
+  cast_sink.set_sink(sink);
+  cast_sink.set_cast_data(extra_data);
+
+  return cast_sink;
+}
+
 }  // namespace media_router
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_media_sink_util.h b/chrome/browser/media/router/discovery/access_code/access_code_media_sink_util.h
index ae155f3..9903588 100644
--- a/chrome/browser/media/router/discovery/access_code/access_code_media_sink_util.h
+++ b/chrome/browser/media/router/discovery/access_code/access_code_media_sink_util.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_ACCESS_CODE_ACCESS_CODE_MEDIA_SINK_UTIL_H_
 #define CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_ACCESS_CODE_ACCESS_CODE_MEDIA_SINK_UTIL_H_
 
+#include "base/values.h"
 #include "chrome/browser/media/router/discovery/access_code/discovery_resources.pb.h"
 #include "chrome/browser/media/router/discovery/mdns/media_sink_util.h"
 #include "components/media_router/common/discovery/media_sink_internal.h"
@@ -19,6 +20,10 @@
 std::pair<absl::optional<MediaSinkInternal>, CreateCastMediaSinkResult>
 CreateAccessCodeMediaSink(const DiscoveryDevice& discovery_device);
 
+base::Value CreateValueDictFromMediaSinkInternal(const MediaSinkInternal& sink);
+absl::optional<MediaSinkInternal> ParseValueDictIntoMediaSinkInternal(
+    const base::Value::Dict& value_dict);
+
 }  // namespace media_router
 
 #endif  // CHROME_BROWSER_MEDIA_ROUTER_DISCOVERY_ACCESS_CODE_ACCESS_CODE_MEDIA_SINK_UTIL_H_
diff --git a/chrome/browser/media/router/discovery/access_code/access_code_media_sink_util_unittest.cc b/chrome/browser/media/router/discovery/access_code/access_code_media_sink_util_unittest.cc
index f9c5126..5c1500c 100644
--- a/chrome/browser/media/router/discovery/access_code/access_code_media_sink_util_unittest.cc
+++ b/chrome/browser/media/router/discovery/access_code/access_code_media_sink_util_unittest.cc
@@ -184,4 +184,14 @@
   EXPECT_EQ(constructed_pair.first.value(), expected_sink_internal);
 }
 
+TEST_F(AccessCodeMediaSinkUtilTest, ParsedMediaSinkInternalEqualToOriginal) {
+  DiscoveryDevice discovery_device_proto = BuildDiscoveryDeviceProto();
+  auto cast_sink =
+      CreateAccessCodeMediaSink(discovery_device_proto).first.value();
+
+  auto value_dict =
+      std::move(*CreateValueDictFromMediaSinkInternal(cast_sink).GetIfDict());
+  EXPECT_EQ(ParseValueDictIntoMediaSinkInternal(value_dict).value(), cast_sink);
+}
+
 }  // namespace media_router
diff --git a/chrome/browser/page_load_metrics/integration_tests/event_counts_browsertest.cc b/chrome/browser/page_load_metrics/integration_tests/event_counts_browsertest.cc
index 3807287c..bbbb55e9 100644
--- a/chrome/browser/page_load_metrics/integration_tests/event_counts_browsertest.cc
+++ b/chrome/browser/page_load_metrics/integration_tests/event_counts_browsertest.cc
@@ -9,13 +9,7 @@
 #include "content/public/test/browser_test_utils.h"
 
 #if defined(USE_AURA)
-// TODO(crbug.com/1311383) Fix flakiness and reenable the test.
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS)
-#define MAYBE_EventCounts DISABLED_EventCounts
-#else
-#define MAYBE_EventCounts EventCounts
-#endif
-IN_PROC_BROWSER_TEST_F(MetricIntegrationTest, MAYBE_EventCounts) {
+IN_PROC_BROWSER_TEST_F(MetricIntegrationTest, EventCountsForTapOnScreen) {
   LoadHTML(R"HTML(
     <p>Sample website</p>
     <script type="text/javascript">
@@ -38,15 +32,12 @@
   content::SimulateTouchEventAt(web_contents(), ui::ET_TOUCH_RELEASED,
                                 gfx::Point(30, 60));
 
-  // Simulate clicks.
-  content::SimulateMouseClick(web_contents(), 0,
-                              blink::WebMouseEvent::Button::kLeft);
-  content::SimulateMouseClick(web_contents(), 0,
-                              blink::WebMouseEvent::Button::kLeft);
-
-  while (EvalJs(web_contents(), "window.eventCounts.click").ExtractInt() < 3 &&
-         EvalJs(web_contents(), "window.eventCounts.pointerup").ExtractInt() <
-             3) {
+  // Wait until we receive the simulated events in the event handlers to check
+  // the PerformanceObserver.
+  while (
+      EvalJs(web_contents(), "window.eventCounts.click").ExtractInt() < 1 ||
+      EvalJs(web_contents(), "window.eventCounts.pointerup").ExtractInt() < 1 ||
+      EvalJs(web_contents(), "window.eventCounts.touchend").ExtractInt() < 1) {
     base::RunLoop run_loop;
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
         FROM_HERE, run_loop.QuitClosure(), base::Milliseconds(100));
@@ -77,11 +68,11 @@
       EvalJs(web_contents(), "window.performance.eventCounts.get('touchend')")
           .ExtractInt();
 
-  EXPECT_EQ(expected_pointerdown, 3);
-  EXPECT_EQ(expected_pointerup, 3);
-  EXPECT_EQ(expected_mousedown, 3);
-  EXPECT_EQ(expected_mouseup, 3);
-  EXPECT_EQ(expected_click, 3);
+  EXPECT_EQ(expected_pointerdown, 1);
+  EXPECT_EQ(expected_pointerup, 1);
+  EXPECT_EQ(expected_mousedown, 1);
+  EXPECT_EQ(expected_mouseup, 1);
+  EXPECT_EQ(expected_click, 1);
   EXPECT_EQ(expected_touchstart, 1);
   EXPECT_EQ(expected_touchend, 1);
 }
diff --git a/chrome/browser/password_manager/password_manager_captured_sites_interactive_uitest.cc b/chrome/browser/password_manager/password_manager_captured_sites_interactive_uitest.cc
index 099ebd7..1ab22e1 100644
--- a/chrome/browser/password_manager/password_manager_captured_sites_interactive_uitest.cc
+++ b/chrome/browser/password_manager/password_manager_captured_sites_interactive_uitest.cc
@@ -215,8 +215,7 @@
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
     feature_list_.InitWithFeatures(
-        /*enabled_features=*/{autofill::features::kAutofillDisplaceRemovedForms,
-                              autofill::features::kAutofillShowTypePredictions,
+        /*enabled_features=*/{autofill::features::kAutofillShowTypePredictions,
                               features::kUsernameFirstFlow,
                               autofill::features::
                                   kAutofillUseUnassociatedListedElements},
diff --git a/chrome/browser/policy/messaging_layer/upload/record_upload_request_builder_unittest.cc b/chrome/browser/policy/messaging_layer/upload/record_upload_request_builder_unittest.cc
index bb5c1ff..1bc9d94 100644
--- a/chrome/browser/policy/messaging_layer/upload/record_upload_request_builder_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/upload/record_upload_request_builder_unittest.cc
@@ -136,8 +136,7 @@
   ASSERT_FALSE(request_payload.has_value()) << request_payload.value();
 }
 
-TEST_P(RecordUploadRequestBuilderTest,
-       DISABLED_DenyPoorlyFormedEncryptedRecords) {
+TEST_P(RecordUploadRequestBuilderTest, DenyPoorlyFormedEncryptedRecords) {
   // Reject empty record.
   EncryptedRecord record;
 
@@ -203,7 +202,7 @@
 }
 
 TEST_P(RecordUploadRequestBuilderTest,
-       DISABLED_DontBuildCompressionRequestIfNoInformation) {
+       DontBuildCompressionRequestIfNoInformation) {
   EncryptedRecord compressionless_record = GenerateEncryptedRecord("TEST_INFO");
   ASSERT_FALSE(compressionless_record.has_compression_information());
 
diff --git a/chrome/browser/renderer_context_menu/quick_answers_menu_observer.cc b/chrome/browser/renderer_context_menu/quick_answers_menu_observer.cc
index 8708930..02f06cd 100644
--- a/chrome/browser/renderer_context_menu/quick_answers_menu_observer.cc
+++ b/chrome/browser/renderer_context_menu/quick_answers_menu_observer.cc
@@ -130,14 +130,9 @@
     uint32_t start_offset,
     uint32_t end_offset) {
   Profile* profile = Profile::FromBrowserContext(proxy_->GetBrowserContext());
-  PrefService* prefs = profile->GetPrefs();
 
   Context context;
   context.surrounding_text = base::UTF16ToUTF8(surrounding_text);
-  context.device_properties.language =
-      l10n_util::GetLanguage(g_browser_process->GetApplicationLocale());
-  context.device_properties.preferred_languages =
-      prefs->GetString(language::prefs::kPreferredLanguages);
   context.device_properties.is_internal = IsInternalUser(profile);
   QuickAnswersController::Get()->MaybeShowQuickAnswers(bounds_in_screen_,
                                                        selected_text, context);
diff --git a/chrome/browser/resources/chromeos/arc_support/controlled_indicator.css b/chrome/browser/resources/chromeos/arc_support/controlled_indicator.css
index 75edc9ff2..35b6028 100644
--- a/chrome/browser/resources/chromeos/arc_support/controlled_indicator.css
+++ b/chrome/browser/resources/chromeos/arc_support/controlled_indicator.css
@@ -35,7 +35,7 @@
   background-image: url(../../../../../ui/webui/resources/images/extension.svg);
 }
 
-<if expr="chromeos">
+<if expr="chromeos_ash">
 .controlled-setting-indicator[controlled-by='shared'] > div {
   background-image: url(../../../../../ui/webui/resources/images/group.svg);
 }
diff --git a/chrome/browser/resources/discards/graph_doc.ts b/chrome/browser/resources/discards/graph_doc.ts
index 18eb6dc7..d7d69ba 100644
--- a/chrome/browser/resources/discards/graph_doc.ts
+++ b/chrome/browser/resources/discards/graph_doc.ts
@@ -53,7 +53,7 @@
   y: number;
   node: GraphNode;
   private div_: d3.Selection<HTMLDivElement, unknown, null, undefined>;
-  private description_json_: string = '';
+  private descriptionJson_: string = '';
 
   constructor(div: Element, node: GraphNode) {
     this.x = node.x;
@@ -105,8 +105,8 @@
   /**
    * Updates the description displayed.
    */
-  onDescription(description_json: string) {
-    if (this.description_json_ === description_json) {
+  onDescription(descriptionJson: string) {
+    if (this.descriptionJson_ === descriptionJson) {
       return;
     }
 
@@ -180,8 +180,8 @@
     // flattened to an array. Each top-level dictionary entry is flattened to a
     // 'heading' with [`the describer's name`, null], followed by some number of
     // entries with a two-element list, each representing a key/value pair.
-    this.description_json_ = description_json;
-    const description = JSON.parse(description_json);
+    this.descriptionJson_ = descriptionJson;
+    const description = JSON.parse(descriptionJson);
     const flattenedDescription = [];
     for (const [title, value] of Object.entries(description)) {
       flattenedDescription.push([title, null]);
diff --git a/chrome/browser/resources/discards/graph_tab_template.ts b/chrome/browser/resources/discards/graph_tab_template.ts
index 17bb350..a6e901ce 100644
--- a/chrome/browser/resources/discards/graph_tab_template.ts
+++ b/chrome/browser/resources/discards/graph_tab_template.ts
@@ -49,8 +49,8 @@
     this.postMessage_('workerChanged', worker);
   }
 
-  favIconDataAvailable(icon_info: FavIconInfo) {
-    this.postMessage_('favIconDataAvailable', icon_info);
+  favIconDataAvailable(iconInfo: FavIconInfo) {
+    this.postMessage_('favIconDataAvailable', iconInfo);
   }
 
   nodeDeleted(nodeId: bigint) {
diff --git a/chrome/browser/resources/extensions/service.ts b/chrome/browser/resources/extensions/service.ts
index a5a758a..64dcfff 100644
--- a/chrome/browser/resources/extensions/service.ts
+++ b/chrome/browser/resources/extensions/service.ts
@@ -158,7 +158,7 @@
   /**
    * @return A signal that loading finished, rejected if any error occurred.
    */
-  private loadUnpackedHelper_(opt_options?:
+  private loadUnpackedHelper_(extraOptions?:
                                   chrome.developerPrivate.LoadUnpackedOptions):
       Promise<boolean> {
     return new Promise(function(resolve, reject) {
@@ -167,7 +167,7 @@
             failQuietly: true,
             populateError: true,
           },
-          opt_options);
+          extraOptions);
 
       chrome.developerPrivate.loadUnpacked(options, (loadError) => {
         if (chrome.runtime.lastError &&
diff --git a/chrome/browser/resources/history/app.html b/chrome/browser/resources/history/app.html
index c575402..013cda6 100644
--- a/chrome/browser/resources/history/app.html
+++ b/chrome/browser/resources/history/app.html
@@ -45,7 +45,7 @@
       }
 
       :host([show-history-clusters_]) #tabs-content {
-        height: calc(100% - var(--cr-tabs-height) - var(--tabs-margin-top));
+        height: calc(100% - var(--cr-tabs-height));
       }
 
       :host([toolbar-shadow_]) #drop-shadow {
diff --git a/chrome/browser/resources/history/history_clusters/clusters.ts b/chrome/browser/resources/history/history_clusters/clusters.ts
index 9dbcec5..55a022be 100644
--- a/chrome/browser/resources/history/history_clusters/clusters.ts
+++ b/chrome/browser/resources/history/history_clusters/clusters.ts
@@ -268,8 +268,8 @@
    * loaded before the user ever gets a chance to see this button.
    */
   private getLoadMoreButtonHidden_(
-      _result: QueryResult, _result_clusters: Array<Cluster>,
-      _result_can_load_more: Time): boolean {
+      _result: QueryResult, _resultClusters: Array<Cluster>,
+      _resultCanLoadMore: Time): boolean {
     return !this.result_ || this.result_.clusters.length === 0 ||
         !this.result_.canLoadMore;
   }
diff --git a/chrome/browser/resources/history/history_clusters/url_visit.html b/chrome/browser/resources/history/history_clusters/url_visit.html
index 87aa384..d963eb8 100644
--- a/chrome/browser/resources/history/history_clusters/url_visit.html
+++ b/chrome/browser/resources/history/history_clusters/url_visit.html
@@ -51,7 +51,11 @@
   #title-and-annotations {
     align-items: center;
     display: flex;
-    line-height: 2;  /* 28px */
+    line-height: 2;  /* 32px */
+  }
+
+  :host([is-top-visit]) #title-and-annotations {
+    line-height: 1.75; /* 28px */
   }
 
   .annotation {
@@ -83,7 +87,11 @@
 
   #url {
     color: var(--url-color);
-    line-height: 1.5;  /* 21px */
+    line-height: 1.5;  /* 24px */
+  }
+
+  :host([is-top-visit]) #url {
+    line-height: 1.25;  /* 20px */
   }
 
   #debug-info {
diff --git a/chrome/browser/resources/new_tab_page/realbox/realbox.html b/chrome/browser/resources/new_tab_page/realbox/realbox.html
index b8bfab4..4f411aa 100644
--- a/chrome/browser/resources/new_tab_page/realbox/realbox.html
+++ b/chrome/browser/resources/new_tab_page/realbox/realbox.html
@@ -33,7 +33,7 @@
   }
 
   :host([match-searchbox]:not([is-dark]):not([matches-are-visible]):not(:hover)) {
-    border: 1px solid var(--google-grey-300);
+    border: 1px solid var(--search-box-border-color, var(--google-grey-300));
     height: calc(var(--ntp-realbox-height) - 2px);
   }
 
diff --git a/chrome/browser/resources/new_tab_page/realbox/realbox.ts b/chrome/browser/resources/new_tab_page/realbox/realbox.ts
index fc395908..ce191bc 100644
--- a/chrome/browser/resources/new_tab_page/realbox/realbox.ts
+++ b/chrome/browser/resources/new_tab_page/realbox/realbox.ts
@@ -335,6 +335,8 @@
     }
 
     this.updateStyles({
+      '--search-box-border-color':
+          skColorToRgba(assert(this.theme.borderColor)),
       '--search-box-placeholder': skColorToRgba(assert(this.theme.placeholder)),
       '--search-box-results-bg': skColorToRgba(assert(this.theme.resultsBg)),
       '--search-box-text': skColorToRgba(assert(this.theme.text)),
diff --git a/chrome/browser/resources/new_tab_page/realbox/realbox_dropdown.html b/chrome/browser/resources/new_tab_page/realbox/realbox_dropdown.html
index 65f2b4e..eb59689 100644
--- a/chrome/browser/resources/new_tab_page/realbox/realbox_dropdown.html
+++ b/chrome/browser/resources/new_tab_page/realbox/realbox_dropdown.html
@@ -16,7 +16,7 @@
 
   :host([round-corners]) #selector {
     border-radius: calc(0.5 * var(--ntp-realbox-height));
-    padding-bottom: 16px;
+    padding-bottom: 18px;
   }
 
   @media (forced-colors: active) {
diff --git a/chrome/browser/resources/print_preview/data/destination.ts b/chrome/browser/resources/print_preview/data/destination.ts
index 3e98fcb..8326a6e 100644
--- a/chrome/browser/resources/print_preview/data/destination.ts
+++ b/chrome/browser/resources/print_preview/data/destination.ts
@@ -308,27 +308,25 @@
   constructor(
       id: string, type: DestinationType, origin: DestinationOrigin,
       displayName: string, connectionStatus: DestinationConnectionStatus,
-      opt_params?: DestinationOptionalParams) {
+      params?: DestinationOptionalParams) {
     this.id_ = id;
     this.type_ = type;
     this.origin_ = origin;
     this.displayName_ = displayName || '';
-    this.tags_ = (opt_params && opt_params.tags) || [];
-    this.isOwned_ = (opt_params && opt_params.isOwned) || false;
-    this.isEnterprisePrinter_ =
-        (opt_params && opt_params.isEnterprisePrinter) || false;
-    this.account_ = (opt_params && opt_params.account) || '';
-    this.description_ = (opt_params && opt_params.description) || '';
+    this.tags_ = (params && params.tags) || [];
+    this.isOwned_ = (params && params.isOwned) || false;
+    this.isEnterprisePrinter_ = (params && params.isEnterprisePrinter) || false;
+    this.account_ = (params && params.account) || '';
+    this.description_ = (params && params.description) || '';
     this.connectionStatus_ = connectionStatus;
-    this.lastAccessTime_ =
-        (opt_params && opt_params.lastAccessTime) || Date.now();
-    this.cloudID_ = (opt_params && opt_params.cloudID) || '';
-    this.extensionId_ = (opt_params && opt_params.extensionId) || '';
-    this.extensionName_ = (opt_params && opt_params.extensionName) || '';
-    this.provisionalType_ = (opt_params && opt_params.provisionalType) ||
-        DestinationProvisionalType.NONE;
-    this.certificateStatus_ = opt_params && opt_params.certificateStatus ||
-        DestinationCertificateStatus.NONE;
+    this.lastAccessTime_ = (params && params.lastAccessTime) || Date.now();
+    this.cloudID_ = (params && params.cloudID) || '';
+    this.extensionId_ = (params && params.extensionId) || '';
+    this.extensionName_ = (params && params.extensionName) || '';
+    this.provisionalType_ =
+        (params && params.provisionalType) || DestinationProvisionalType.NONE;
+    this.certificateStatus_ =
+        params && params.certificateStatus || DestinationCertificateStatus.NONE;
 
     assert(
         this.provisionalType_ !==
diff --git a/chrome/browser/resources/print_preview/data/destination_store.ts b/chrome/browser/resources/print_preview/data/destination_store.ts
index 39f9002..e8744963 100644
--- a/chrome/browser/resources/print_preview/data/destination_store.ts
+++ b/chrome/browser/resources/print_preview/data/destination_store.ts
@@ -296,14 +296,14 @@
   }
 
   /**
-   * @param opt_account Account to filter destinations by. When
+   * @param account Account to filter destinations by. When
    *     null or omitted, all destinations are returned.
    * @return List of destinations accessible by the {@code account}.
    */
-  destinations(opt_account?: string|null): Destination[] {
+  destinations(account?: string|null): Destination[] {
     return this.destinations_.filter(function(destination) {
       return !destination.account ||
-          (!!opt_account && destination.account === opt_account);
+          (!!account && destination.account === account);
     });
   }
 
@@ -843,16 +843,16 @@
 
   /**
    * Initiates loading of cloud destinations.
-   * @param opt_origin Search destinations for the specified origin only.
+   * @param origin Search destinations for the specified origin only.
    */
-  startLoadCloudDestinations(opt_origin?: DestinationOrigin) {
+  startLoadCloudDestinations(origin?: DestinationOrigin) {
     if (this.cloudPrintInterface_ === null) {
       return;
     }
 
     const origins = this.loadedCloudOrigins_.get(this.activeUser_) || [];
-    if (origins.length === 0 || (opt_origin && origins.includes(opt_origin))) {
-      this.cloudPrintInterface_.search(this.activeUser_, opt_origin);
+    if (origins.length === 0 || (origin && origins.includes(origin))) {
+      this.cloudPrintInterface_.search(this.activeUser_, origin);
     }
   }
 
diff --git a/chrome/browser/resources/read_later/side_panel/read_anything/app.ts b/chrome/browser/resources/read_later/side_panel/read_anything/app.ts
index ca876e81..c0ab919 100644
--- a/chrome/browser/resources/read_later/side_panel/read_anything/app.ts
+++ b/chrome/browser/resources/read_later/side_panel/read_anything/app.ts
@@ -38,8 +38,8 @@
 
     const callbackRouter = this.apiProxy_.getCallbackRouter();
     this.listenerIds_ = [callbackRouter.onEssentialContent.addListener(
-        (essential_content: string[]) =>
-            this.showEssentialContent_(essential_content))];
+        (essentialContent: string[]) =>
+            this.showEssentialContent_(essentialContent))];
 
     this.apiProxy_.showUI();
   }
@@ -51,8 +51,8 @@
         id => this.apiProxy_.getCallbackRouter().removeListener(id));
   }
 
-  showEssentialContent_(essential_content: string[]) {
-    this.paragraphs_ = essential_content;
+  showEssentialContent_(essentialContent: string[]) {
+    this.paragraphs_ = essentialContent;
   }
 }
 customElements.define(ReadAnythingElement.is, ReadAnythingElement);
diff --git a/chrome/browser/resources/settings/a11y_page/live_caption_section.html b/chrome/browser/resources/settings/a11y_page/live_caption_section.html
index a00d2e6..e905f24 100644
--- a/chrome/browser/resources/settings/a11y_page/live_caption_section.html
+++ b/chrome/browser/resources/settings/a11y_page/live_caption_section.html
@@ -52,7 +52,7 @@
                       as="language">
               <controlled-radio-button
                   class="cr-row continuation live-caption-language-radio-button"
-                  label="[[language.display_name]]"
+                  label="[[language.displayName]]"
                   name="[[language.code]]"
                   pref="[[prefs.accessibility.captions.live_caption_language]]">
                 <span class="cr-secondary-text cr-row-gap">
diff --git a/chrome/browser/resources/settings/a11y_page/live_caption_section.ts b/chrome/browser/resources/settings/a11y_page/live_caption_section.ts
index 11e8625..213e82b 100644
--- a/chrome/browser/resources/settings/a11y_page/live_caption_section.ts
+++ b/chrome/browser/resources/settings/a11y_page/live_caption_section.ts
@@ -31,7 +31,7 @@
  *     model is being downloaded.
  */
 type LiveCaptionLanguage = {
-  display_name: string,
+  displayName: string,
   code: string,
   downloadProgress: string,
 };
@@ -82,37 +82,37 @@
         value() {
           return [
             {
-              display_name:
+              displayName:
                   loadTimeData.getString('sodaLanguageDisplayNameEnglish'),
               code: loadTimeData.getString('sodaLanguageCodeEnglish'),
               downloadProgress: '',
             },
             {
-              display_name:
+              displayName:
                   loadTimeData.getString('sodaLanguageDisplayNameFrench'),
               code: loadTimeData.getString('sodaLanguageCodeFrench'),
               downloadProgress: '',
             },
             {
-              display_name:
+              displayName:
                   loadTimeData.getString('sodaLanguageDisplayNameGerman'),
               code: loadTimeData.getString('sodaLanguageCodeGerman'),
               downloadProgress: '',
             },
             {
-              display_name:
+              displayName:
                   loadTimeData.getString('sodaLanguageDisplayNameItalian'),
               code: loadTimeData.getString('sodaLanguageCodeItalian'),
               downloadProgress: '',
             },
             {
-              display_name:
+              displayName:
                   loadTimeData.getString('sodaLanguageDisplayNameJapanese'),
               code: loadTimeData.getString('sodaLanguageCodeJapanese'),
               downloadProgress: '',
             },
             {
-              display_name:
+              displayName:
                   loadTimeData.getString('sodaLanguageDisplayNameSpanish'),
               code: loadTimeData.getString('sodaLanguageCodeSpanish'),
               downloadProgress: '',
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 2b441e7..eff6475e 100644
--- a/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts
+++ b/chrome/browser/resources/settings/autofill_page/password_edit_dialog.ts
@@ -86,18 +86,18 @@
  */
 export enum AddCredentialFromSettingsUserInteractions {
   // Used when the add credential dialog is opened from the settings.
-  Add_Dialog_Opened = 0,
+  ADD_DIALOG_OPENED = 0,
   // Used when the add credential dialog is closed from the settings.
-  Add_Dialog_Closed = 1,
+  ADD_DIALOG_CLOSED = 1,
   // Used when a new credential is added from the settings .
-  Credential_Added = 2,
+  CREDENTIAL_ADDED = 2,
   // Used when a new credential is being added from the add credential dialog in
   // settings and another credential exists with the same username/website
   // combination.
-  Duplicated_Credential_Entered = 3,
+  DUPLICATED_CREDENTIAL_ENTERED = 3,
   // Used when an existing credential is viewed while adding a new credential
   // from the settings.
-  Duplicate_Credential_Viewed = 4,
+  DUPLICATE_CREDENTIAL_VIEWED = 4,
   // Must be last.
   COUNT = 5,
 }
@@ -715,7 +715,7 @@
   private onViewExistingPasswordClick_() {
     chrome.metricsPrivate.recordEnumerationValue(
         'PasswordManager.AddCredentialFromSettings.UserAction',
-        AddCredentialFromSettingsUserInteractions.Duplicate_Credential_Viewed,
+        AddCredentialFromSettingsUserInteractions.DUPLICATE_CREDENTIAL_VIEWED,
         AddCredentialFromSettingsUserInteractions.COUNT);
     const existingEntry = this.savedPasswords.find(entry => {
       return entry.urls.origin === this.websiteUrls_!.origin &&
@@ -758,7 +758,7 @@
       chrome.metricsPrivate.recordEnumerationValue(
           'PasswordManager.AddCredentialFromSettings.UserAction',
           AddCredentialFromSettingsUserInteractions
-              .Duplicated_Credential_Entered,
+              .DUPLICATED_CREDENTIAL_ENTERED,
           AddCredentialFromSettingsUserInteractions.COUNT);
     }
 
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_section.ts b/chrome/browser/resources/settings/autofill_page/passwords_section.ts
index b4a6d7d..bb3c03eb 100644
--- a/chrome/browser/resources/settings/autofill_page/passwords_section.ts
+++ b/chrome/browser/resources/settings/autofill_page/passwords_section.ts
@@ -662,7 +662,7 @@
   private onAddPasswordTap_() {
     chrome.metricsPrivate.recordEnumerationValue(
         'PasswordManager.AddCredentialFromSettings.UserAction',
-        AddCredentialFromSettingsUserInteractions.Add_Dialog_Opened,
+        AddCredentialFromSettingsUserInteractions.ADD_DIALOG_OPENED,
         AddCredentialFromSettingsUserInteractions.COUNT);
     this.showAddPasswordDialog_ = true;
     this.activeDialogAnchorStack_.push(
@@ -672,7 +672,7 @@
   private onAddPasswordDialogClosed_() {
     chrome.metricsPrivate.recordEnumerationValue(
         'PasswordManager.AddCredentialFromSettings.UserAction',
-        AddCredentialFromSettingsUserInteractions.Add_Dialog_Closed,
+        AddCredentialFromSettingsUserInteractions.ADD_DIALOG_CLOSED,
         AddCredentialFromSettingsUserInteractions.COUNT);
     this.showAddPasswordDialog_ = false;
     focusWithoutInk(assert(this.activeDialogAnchorStack_.pop()!));
diff --git a/chrome/browser/resources/settings/chromeos/device_page/display_layout.js b/chrome/browser/resources/settings/chromeos/device_page/display_layout.js
index 746600e5..7b4f666 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/display_layout.js
+++ b/chrome/browser/resources/settings/chromeos/device_page/display_layout.js
@@ -89,10 +89,6 @@
   allowDisplayAlignmentApi_:
       loadTimeData.getBoolean('allowDisplayAlignmentApi'),
 
-  /** @private {boolean} */
-  allowKeyboardDrag_:
-      loadTimeData.getBoolean('allowKeyboardBasedDisplayArrangementInSettings'),
-
   /** @private {string} */
   invalidDisplayId_: loadTimeData.getString('invalidDisplayId'),
 
@@ -129,8 +125,8 @@
     }
     tryCalcVisualScale();
 
-    // Pass keyboard dragging flag to drag behavior before initializing.
-    this.keyboardDragEnabled = this.allowKeyboardDrag_;
+    // Enable keyboard dragging before initialization.
+    this.keyboardDragEnabled = true;
     this.initializeDrag(
         !this.mirroring, this.$.displayArea,
         (id, amount) => this.onDrag_(id, amount));
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_search_box/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_settings_search_box/BUILD.gn
index 46e8e02..1fb1c97e 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_search_box/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_settings_search_box/BUILD.gn
@@ -44,11 +44,13 @@
     "//third_party/polymer/v3_0/components-chromium/iron-dropdown:iron-dropdown",
     "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar_search_field",
     "//ui/webui/resources/js:assert.m",
     "//ui/webui/resources/js:i18n_behavior.m",
   ]
-  externs_list = [ "$externs_path/metrics_private.js" ]
+  externs_list = [
+    "$externs_path/metrics_private.js",
+    "//ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field_externs.js",
+  ]
 }
 
 html_to_js("web_components") {
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.js b/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.js
index 2fcfc88c..db7e9bb 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.js
+++ b/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.js
@@ -2,6 +2,28 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+/**
+ * @fileoverview 'os-settings-search-box' is the container for the search input
+ * and settings search results.
+ */
+import '//resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js';
+import '//resources/js/cr/ui/focus_row.m.js';
+import '//resources/polymer/v3_0/iron-dropdown/iron-dropdown.js';
+import '//resources/polymer/v3_0/iron-list/iron-list.js';
+import './os_search_result_row.js';
+import '../../settings_shared_css.js';
+
+import {assert, assertNotReached} from '//resources/js/assert.m.js';
+import {I18nBehavior} from '//resources/js/i18n_behavior.m.js';
+import {IronA11yAnnouncer} from '//resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js';
+import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {Route, Router} from '../../router.js';
+import {recordSearch} from '../metrics_recorder.js';
+import {routes} from '../os_route.js';
+import {RouteObserverBehavior} from '../route_observer_behavior.js';
+import {getSearchHandler, setSearchHandlerForTesting} from '../search_handler.js';
+
 const MAX_NUM_SEARCH_RESULTS = 5;
 
 const SEARCH_REQUEST_METRIC_NAME = 'ChromeOS.Settings.SearchRequests';
@@ -30,26 +52,6 @@
   CLICKED_OUT_OF_SEARCH_BOX: 1,
 };
 
-/**
- * @fileoverview 'os-settings-search-box' is the container for the search input
- * and settings search results.
- */
-import {afterNextRender, Polymer, html, flush, Templatizer, TemplateInstanceBase} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-
-import {CrToolbarSearchFieldElement} from '//resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js';
-import {assert, assertNotReached} from '//resources/js/assert.m.js';
-import '//resources/js/cr/ui/focus_row.m.js';
-import {I18nBehavior} from '//resources/js/i18n_behavior.m.js';
-import {IronA11yAnnouncer} from '//resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js';
-import '//resources/polymer/v3_0/iron-dropdown/iron-dropdown.js';
-import '//resources/polymer/v3_0/iron-list/iron-list.js';
-import './os_search_result_row.js';
-import {recordSearch} from '../metrics_recorder.js';
-import {getSearchHandler, setSearchHandlerForTesting} from '../search_handler.js';
-import '../../settings_shared_css.js';
-import {Router, Route} from '../../router.js';
-import {RouteObserverBehavior} from '../route_observer_behavior.js';
-import {routes} from '../os_route.js';
 
 Polymer({
   _template: html`{__html_template__}`,
diff --git a/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn
index fa63d79..c6dd67c46 100644
--- a/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_toolbar/BUILD.gn
@@ -17,9 +17,9 @@
     "../os_settings_search_box:os_settings_search_box",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
     "//ui/webui/resources/cr_elements/cr_icon_button:cr_icon_button.m",
-    "//ui/webui/resources/cr_elements/cr_toolbar:cr_toolbar_search_field",
     "//ui/webui/resources/js:load_time_data.m",
   ]
+  externs_list = [ "//ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field_externs.js" ]
 }
 
 html_to_js("web_components") {
diff --git a/chrome/browser/resources/settings/chromeos/os_toolbar/os_toolbar.js b/chrome/browser/resources/settings/chromeos/os_toolbar/os_toolbar.js
index 58cc0f8..310deba 100644
--- a/chrome/browser/resources/settings/chromeos/os_toolbar/os_toolbar.js
+++ b/chrome/browser/resources/settings/chromeos/os_toolbar/os_toolbar.js
@@ -9,8 +9,8 @@
 import '//resources/cr_elements/shared_vars_css.m.js';
 import '//resources/polymer/v3_0/iron-media-query/iron-media-query.js';
 import '../os_settings_search_box/os_settings_search_box.js';
+import '//resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js';
 
-import {CrToolbarSearchFieldElement} from '//resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js';
 import {assert, assertNotReached} from '//resources/js/assert.m.js';
 import {loadTimeData} from '//resources/js/load_time_data.m.js';
 import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/people_page/signout_dialog.html b/chrome/browser/resources/settings/people_page/signout_dialog.html
index 0c793d57..f1601ea 100644
--- a/chrome/browser/resources/settings/people_page/signout_dialog.html
+++ b/chrome/browser/resources/settings/people_page/signout_dialog.html
@@ -40,7 +40,7 @@
           $i18n{syncDisconnectConfirm}
         </cr-button>
       </div>
-<if expr="(not chromeos and is_posix) or is_win or is_macosx">
+<if expr="(not chromeos_ash and is_posix) or is_win or is_macosx">
       <template is="dom-if" if="[[!syncStatus.domain]]">
         <div id="wideFooter" slot="footer">
           <div class="cr-row first">
diff --git a/chrome/browser/resources/settings/prefs/prefs.ts b/chrome/browser/resources/settings/prefs/prefs.ts
index 25825c61..adfb0849 100644
--- a/chrome/browser/resources/settings/prefs/prefs.ts
+++ b/chrome/browser/resources/settings/prefs/prefs.ts
@@ -176,18 +176,18 @@
   }
 
   /**
-   * @param opt_settingsApi SettingsPrivate implementation to use
+   * @param settingsApi SettingsPrivate implementation to use
    *     (chrome.settingsPrivate by default).
    */
-  initialize(opt_settingsApi?: typeof chrome.settingsPrivate) {
+  initialize(settingsApi?: typeof chrome.settingsPrivate) {
     // Only initialize once (or after resetForTesting() is called).
     if (this.initialized_) {
       return;
     }
     this.initialized_ = true;
 
-    if (opt_settingsApi) {
-      this.settingsApi_ = opt_settingsApi;
+    if (settingsApi) {
+      this.settingsApi_ = settingsApi;
     }
 
     this.boundPrefsChanged_ = this.onSettingsPrivatePrefsChanged_.bind(this);
diff --git a/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.html b/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.html
index 60188824..ee383570c 100644
--- a/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.html
+++ b/chrome/browser/resources/settings/privacy_page/security_keys_bio_enroll_dialog.html
@@ -28,6 +28,18 @@
       #container {
         padding-inline-start: var(--cr-section-padding);
       }
+
+      @media (prefers-color-scheme: dark) {
+        #lightIcon {
+          display: none;
+        }
+      }
+
+      @media (prefers-color-scheme: light) {
+        #darkIcon {
+          display: none;
+        }
+      }
     </style>
 
     <cr-dialog id="dialog" close-text="$i18n{cancel}" ignore-popstate
@@ -64,7 +76,11 @@
                   class="cr-separators">
                 <template>
                   <div class="list-item" first$="[[!index]]">
-                    <iron-icon icon="cr-fingerprint-icon:enrollment-done">
+                    <iron-icon id="darkIcon"
+                        icon="cr-fingerprint-icon:fingerprint-scanned-dark">
+                    </iron-icon>
+                    <iron-icon id="lightIcon"
+                        icon="cr-fingerprint-icon:fingerprint-scanned-light">
                     </iron-icon>
                     <div class="name" aria-label="[[item.name]]">
                       [[item.name]]
diff --git a/chrome/browser/resources/settings/router.js b/chrome/browser/resources/settings/router.js
index e05d3d62..d2ae700 100644
--- a/chrome/browser/resources/settings/router.js
+++ b/chrome/browser/resources/settings/router.js
@@ -272,20 +272,19 @@
     /**
      * Navigates to a canonical route and pushes a new history entry.
      * @param {!Route} route
-     * @param {URLSearchParams=} opt_dynamicParameters Navigations to the same
+     * @param {URLSearchParams=} dynamicParameters Navigations to the same
      *     URL parameters in a different order will still push to history.
-     * @param {boolean=} opt_removeSearch Whether to strip the 'search' URL
+     * @param {boolean=} removeSearch Whether to strip the 'search' URL
      *     parameter during navigation. Defaults to false.
      */
-    navigateTo(route, opt_dynamicParameters, opt_removeSearch) {
+    navigateTo(route, dynamicParameters, removeSearch = false) {
       // The ADVANCED route only serves as a parent of subpages, and should not
       // be possible to navigate to it directly.
       if (route === this.routes_.ADVANCED) {
         route = this.routes_.BASIC;
       }
 
-      const params = opt_dynamicParameters || new URLSearchParams();
-      const removeSearch = !!opt_removeSearch;
+      const params = dynamicParameters || new URLSearchParams();
 
       const oldSearchParam = this.getQueryParameters().get('search') || '';
       const newSearchParam = params.get('search') || '';
@@ -401,9 +400,9 @@
 
       /**
        * @param {!Route} newRoute
-       * @param {!Route=} opt_oldRoute
+       * @param {!Route=} oldRoute
        */
-      currentRouteChanged(newRoute, opt_oldRoute) {
+      currentRouteChanged(newRoute, oldRoute) {
         assertNotReached();
       }
     }
@@ -415,7 +414,7 @@
   export class RouteObserverMixinInterface {
     /**
      * @param {!Route} newRoute
-     * @param {!Route=} opt_oldRoute
+     * @param {!Route=} oldRoute
      */
-    currentRouteChanged(newRoute, opt_oldRoute) {}
+    currentRouteChanged(newRoute, oldRoute) {}
   }
diff --git a/chrome/browser/resources/settings/settings_shared_css.html b/chrome/browser/resources/settings/settings_shared_css.html
index 6af7fea..de04f3672 100644
--- a/chrome/browser/resources/settings/settings_shared_css.html
+++ b/chrome/browser/resources/settings/settings_shared_css.html
@@ -1,7 +1,7 @@
   <!-- Common styles for Material Design settings. -->
   <template>
     <style include="cr-shared-style search-highlight-style
-<if expr='chromeos'>
+<if expr='chromeos_ash'>
           cros-color-overrides
 </if>
     ">
diff --git a/chrome/browser/resources/settings/site_settings/README.md b/chrome/browser/resources/settings/site_settings/README.md
index 57341c4..9101e02 100644
--- a/chrome/browser/resources/settings/site_settings/README.md
+++ b/chrome/browser/resources/settings/site_settings/README.md
@@ -145,13 +145,13 @@
 Examples:
 
 ```
-<if expr="chromeos">
+<if expr="chromeos_ash">
   <link rel="import" href="android_info_browser_proxy.html">
 </if>
 ```
 
 ```
-<if expr="chromeos">
+<if expr="chromeos_ash">
   <template is="dom-if" if="[[settingsAppAvailable_]]">
     <cr-link-row on-click="onManageAndroidAppsClick_"
         label="$i18n{androidAppsManageAppLinks}" external></cr-link-row>
diff --git a/chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.ts b/chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.ts
index 282077c..78ff5464 100644
--- a/chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.ts
+++ b/chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.ts
@@ -384,9 +384,9 @@
    * Deletes a protocol handler by url from the app approved list.
    * @param protocol The protocol to delete the url from.
    * @param url The url to delete.
-   * @param app_id The web app's ID to delete.
+   * @param appId The web app's ID to delete.
    */
-  removeAppDisallowedHandler(protocol: string, url: string, app_id: string):
+  removeAppDisallowedHandler(protocol: string, url: string, appId: string):
       void;
 
   /**
@@ -557,8 +557,8 @@
     chrome.send('removeAppAllowedHandler', [protocol, url, appId]);
   }
 
-  removeAppDisallowedHandler(protocol: string, url: string, app_id: string) {
-    chrome.send('removeAppDisallowedHandler', [protocol, url, app_id]);
+  removeAppDisallowedHandler(protocol: string, url: string, appId: string) {
+    chrome.send('removeAppDisallowedHandler', [protocol, url, appId]);
   }
 
   updateIncognitoStatus() {
diff --git a/chrome/browser/themes/theme_service.cc b/chrome/browser/themes/theme_service.cc
index dbc4dfd..a61c192 100644
--- a/chrome/browser/themes/theme_service.cc
+++ b/chrome/browser/themes/theme_service.cc
@@ -513,10 +513,8 @@
         native_theme = ui::NativeTheme::GetInstanceForNativeUi();
 #if BUILDFLAG(IS_LINUX)
         if (const auto* linux_ui = views::LinuxUI::instance()) {
-          // TODO(crbug.com/1304441): Naively passing nullptr might be
-          // problematic. If this is not an issue, remove this parameter from
-          // GetNativeTheme().
-          native_theme = linux_ui->GetNativeTheme(nullptr);
+          native_theme =
+              linux_ui->GetNativeTheme(delegate_->ShouldUseSystemTheme());
         }
 #endif
       }
@@ -632,6 +630,14 @@
   return theme_supplier_.get();
 }
 
+bool ThemeService::ShouldUseSystemTheme() const {
+#if BUILDFLAG(IS_LINUX)
+  return profile_->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme);
+#else
+  return false;
+#endif
+}
+
 bool ThemeService::ShouldUseCustomFrame() const {
 #if BUILDFLAG(IS_LINUX)
   return profile_->GetPrefs()->GetBoolean(prefs::kUseCustomChromeFrame);
diff --git a/chrome/browser/themes/theme_service.h b/chrome/browser/themes/theme_service.h
index 97c8c1a..d8619448 100644
--- a/chrome/browser/themes/theme_service.h
+++ b/chrome/browser/themes/theme_service.h
@@ -41,6 +41,7 @@
 class BrowserThemeProviderDelegate {
  public:
   virtual CustomThemeSupplier* GetThemeSupplier() const = 0;
+  virtual bool ShouldUseSystemTheme() const = 0;
   virtual bool ShouldUseCustomFrame() const = 0;
 };
 
@@ -88,6 +89,7 @@
 
   // Overridden from BrowserThemeProviderDelegate:
   CustomThemeSupplier* GetThemeSupplier() const override;
+  bool ShouldUseSystemTheme() const override;
   bool ShouldUseCustomFrame() const override;
 
   // Set the current theme to the theme defined in |extension|.
diff --git a/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc b/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc
index 781096ae..83fdb9c 100644
--- a/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc
+++ b/chrome/browser/ui/ash/desks_templates/desks_templates_client.cc
@@ -212,7 +212,9 @@
 
   desks_controller_->CaptureActiveDeskAsTemplate(
       base::BindOnce(&DesksTemplatesClient::OnCapturedDeskTemplate,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)),
+      ash::DeskTemplateType::kTemplate,
+      /*root_window_to_show=*/nullptr);
 }
 
 void DesksTemplatesClient::UpdateDeskTemplate(
diff --git a/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc b/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc
index ff40c8e0..383c950 100644
--- a/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc
+++ b/chrome/browser/ui/views/download/bubble/download_bubble_row_view.cc
@@ -8,6 +8,7 @@
 #include "base/files/file_path.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/download/bubble/download_bubble_controller.h"
+#include "chrome/browser/download/download_stats.h"
 #include "chrome/browser/download/download_ui_model.h"
 #include "chrome/browser/icon_manager.h"
 #include "chrome/browser/ui/layout_constants.h"
@@ -63,6 +64,12 @@
   return label_wrapper;
 }
 
+// Whether we are warning about a dangerous/malicious download.
+bool is_download_warning(download::DownloadItemMode mode) {
+  return (mode == download::DownloadItemMode::kDangerous) ||
+         (mode == download::DownloadItemMode::kMalicious);
+}
+
 constexpr int kDownloadButtonHeight = 24;
 constexpr int kDownloadSubpageIconMargin = 8;
 
@@ -71,13 +78,27 @@
 bool DownloadBubbleRowView::UpdateBubbleUIInfo() {
   auto mode = download::GetDesiredDownloadItemMode(model_.get());
   auto state = model_->GetState();
-  bool state_changed = (mode_ != mode || state_ != state);
-  if (state_changed) {
-    ui_info_ = model_->GetBubbleUIInfo();
-  }
+  bool mode_unchanged = (mode_ == mode);
+  if (mode_unchanged && (state_ == state))
+    return false;
+
   mode_ = mode;
   state_ = state;
-  return state_changed;
+
+  // If either of mode or state changes, we might need to change UI.
+  ui_info_ = model_->GetBubbleUIInfo();
+
+  // This should only be logged once per download, so only for change in modes
+  // to warning.
+  if (!mode_unchanged && is_download_warning(mode)) {
+    const auto danger_type = model_->GetDangerType();
+    const auto file_path = model_->GetTargetFilePath();
+    bool is_https = model_->GetURL().SchemeIs(url::kHttpsScheme);
+    bool has_user_gesture = model_->HasUserGesture();
+    RecordDangerousDownloadWarningShown(danger_type, file_path, is_https,
+                                        has_user_gesture);
+  }
+  return true;
 }
 
 void DownloadBubbleRowView::AddedToWidget() {
diff --git a/chrome/browser/ui/web_applications/app_browser_controller.cc b/chrome/browser/ui/web_applications/app_browser_controller.cc
index 2f440c3..d3ce15c 100644
--- a/chrome/browser/ui/web_applications/app_browser_controller.cc
+++ b/chrome/browser/ui/web_applications/app_browser_controller.cc
@@ -384,6 +384,14 @@
   return theme_pack_.get();
 }
 
+bool AppBrowserController::ShouldUseSystemTheme() const {
+#if BUILDFLAG(IS_LINUX)
+  return browser_->profile()->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme);
+#else
+  return false;
+#endif
+}
+
 bool AppBrowserController::ShouldUseCustomFrame() const {
 #if BUILDFLAG(IS_LINUX)
   return browser_->profile()->GetPrefs()->GetBoolean(
diff --git a/chrome/browser/ui/web_applications/app_browser_controller.h b/chrome/browser/ui/web_applications/app_browser_controller.h
index f6470fc7..9a592c9 100644
--- a/chrome/browser/ui/web_applications/app_browser_controller.h
+++ b/chrome/browser/ui/web_applications/app_browser_controller.h
@@ -203,6 +203,7 @@
 
   // BrowserThemeProviderDelegate:
   CustomThemeSupplier* GetThemeSupplier() const override;
+  bool ShouldUseSystemTheme() const override;
   bool ShouldUseCustomFrame() const override;
 
   // ui::ColorProviderManager::InitializerSupplier
diff --git a/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc b/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc
index 6bcd801..4bf1c64 100644
--- a/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc
+++ b/chrome/browser/ui/webui/access_code_cast/access_code_cast_handler.cc
@@ -259,6 +259,7 @@
   }
 
   // Sink has been completely added so caller can be alerted.
+  access_code_sink_service_->StoreSinkInPrefsById(sink_id_.value());
   std::move(add_sink_callback_).Run(AddSinkResultCode::OK);
 }
 
diff --git a/chrome/browser/ui/webui/certificates_handler.cc b/chrome/browser/ui/webui/certificates_handler.cc
index 814821a..954fd22 100644
--- a/chrome/browser/ui/webui/certificates_handler.cc
+++ b/chrome/browser/ui/webui/certificates_handler.cc
@@ -415,17 +415,22 @@
       std::move(certs), web_ui()->GetWebContents(), GetParentWindow());
 }
 
-void CertificatesHandler::AssignWebUICallbackId(const base::Value::List& args) {
+bool CertificatesHandler::AssignWebUICallbackId(const base::Value::List& args) {
   CHECK_LE(1U, args.size());
-  CHECK(webui_callback_id_.empty());
+  if (!webui_callback_id_.empty())
+    return false;
   webui_callback_id_ = args[0].GetString();
+  return true;
 }
 
 void CertificatesHandler::HandleGetCATrust(const base::Value::List& args) {
   AllowJavascript();
 
   CHECK_EQ(2U, args.size());
-  AssignWebUICallbackId(args);
+  if (!AssignWebUICallbackId(args)) {
+    RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value());
+    return;
+  }
 
   CertificateManagerModel::CertInfo* cert_info =
       GetCertInfoFromCallbackArgs(args, 1 /* arg_index */);
@@ -451,7 +456,10 @@
 
 void CertificatesHandler::HandleEditCATrust(const base::Value::List& args) {
   CHECK_EQ(5U, args.size());
-  AssignWebUICallbackId(args);
+  if (!AssignWebUICallbackId(args)) {
+    RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value());
+    return;
+  }
 
   CertificateManagerModel::CertInfo* cert_info =
       GetCertInfoFromCallbackArgs(args, 1 /* arg_index */);
@@ -490,7 +498,10 @@
 
 void CertificatesHandler::HandleExportPersonal(const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
-  AssignWebUICallbackId(args);
+  if (!AssignWebUICallbackId(args)) {
+    RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value());
+    return;
+  }
 
   CertificateManagerModel::CertInfo* cert_info =
       GetCertInfoFromCallbackArgs(args, 1 /* arg_index */);
@@ -525,7 +536,10 @@
 void CertificatesHandler::HandleExportPersonalPasswordSelected(
     const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
-  AssignWebUICallbackId(args);
+  if (!AssignWebUICallbackId(args)) {
+    RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value());
+    return;
+  }
   password_ = UTF8ToUTF16(args[1].GetString());  // CHECKs if non-string.
 
   // Currently, we don't support exporting more than one at a time.  If we do,
@@ -586,7 +600,10 @@
   }
 
   CHECK_EQ(2U, args.size());
-  AssignWebUICallbackId(args);
+  if (!AssignWebUICallbackId(args)) {
+    RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value());
+    return;
+  }
   use_hardware_backed_ = args[1].GetBool();
 
   ui::SelectFileDialog::FileTypeInfo file_type_info;
@@ -667,7 +684,10 @@
 void CertificatesHandler::HandleImportPersonalPasswordSelected(
     const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
-  AssignWebUICallbackId(args);
+  if (!AssignWebUICallbackId(args)) {
+    RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value());
+    return;
+  }
   password_ = UTF8ToUTF16(args[1].GetString());  // CHECKs if non-string.
 
   if (use_hardware_backed_) {
@@ -747,7 +767,10 @@
 
 void CertificatesHandler::HandleImportServer(const base::Value::List& args) {
   CHECK_EQ(1U, args.size());
-  AssignWebUICallbackId(args);
+  if (!AssignWebUICallbackId(args)) {
+    RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value());
+    return;
+  }
 
   select_file_dialog_ = ui::SelectFileDialog::Create(
       this,
@@ -821,7 +844,10 @@
   }
 
   CHECK_EQ(1U, args.size());
-  AssignWebUICallbackId(args);
+  if (!AssignWebUICallbackId(args)) {
+    RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value());
+    return;
+  }
 
   select_file_dialog_ = ui::SelectFileDialog::Create(
       this,
@@ -879,7 +905,10 @@
 void CertificatesHandler::HandleImportCATrustSelected(
     const base::Value::List& args) {
   CHECK_EQ(4U, args.size());
-  AssignWebUICallbackId(args);
+  if (!AssignWebUICallbackId(args)) {
+    RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value());
+    return;
+  }
 
   const bool trust_ssl = args[1].GetBool();
   const bool trust_email = args[2].GetBool();
@@ -927,7 +956,10 @@
 void CertificatesHandler::HandleDeleteCertificate(
     const base::Value::List& args) {
   CHECK_EQ(2U, args.size());
-  AssignWebUICallbackId(args);
+  if (!AssignWebUICallbackId(args)) {
+    RejectJavascriptCallback(base::Value(args[0].GetString()), base::Value());
+    return;
+  }
 
   CertificateManagerModel::CertInfo* cert_info =
       GetCertInfoFromCallbackArgs(args, 1 /* arg_index */);
diff --git a/chrome/browser/ui/webui/certificates_handler.h b/chrome/browser/ui/webui/certificates_handler.h
index 624c1b0..cfe6018 100644
--- a/chrome/browser/ui/webui/certificates_handler.h
+++ b/chrome/browser/ui/webui/certificates_handler.h
@@ -190,9 +190,10 @@
       const std::string& title,
       const net::NSSCertDatabase::ImportCertFailureList& not_imported);
 
-  // Assigns a new |webui_callback_id_|. Ensures that previous in-flight request
-  // has been fulfilled.
-  void AssignWebUICallbackId(const base::Value::List& args);
+  // Assigns a new |webui_callback_id_|. Returns false if a previous request
+  // is still in-flight, in which case the new request should be rejected and
+  // ignored.
+  [[nodiscard]] bool AssignWebUICallbackId(const base::Value::List& args);
 
   gfx::NativeWindow GetParentWindow();
 
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
index 4126faf..76172e2 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
@@ -59,6 +59,7 @@
 #include "services/network/public/cpp/resource_request.h"
 #include "services/network/public/cpp/simple_url_loader.h"
 #include "services/network/public/mojom/url_response_head.mojom.h"
+#include "third_party/skia/include/core/SkColor.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/theme_provider.h"
 #include "ui/color/color_provider.h"
@@ -74,7 +75,8 @@
     const ui::ColorProvider& color_provider,
     const ui::ThemeProvider* theme_provider,
     ThemeService* theme_service,
-    NtpCustomBackgroundService* ntp_custom_background_service) {
+    NtpCustomBackgroundService* ntp_custom_background_service,
+    content::WebContents* web_contents) {
   if (ntp_custom_background_service) {
     ntp_custom_background_service->RefreshBackgroundIfNeeded();
   }
@@ -181,6 +183,10 @@
   search_box->bg_hovered =
       GetOmniboxColor(theme_provider, OmniboxPart::LOCATION_BAR_BACKGROUND,
                       OmniboxPartState::HOVERED);
+  search_box->border_color =
+      webui::GetNativeTheme(web_contents)->UserHasContrastPreference()
+          ? theme_provider->GetColor(ThemeProperties::COLOR_LOCATION_BAR_BORDER)
+          : SkColorSetRGB(218, 220, 224);  // google-grey-300
   search_box->icon = GetOmniboxColor(theme_provider, OmniboxPart::RESULTS_ICON);
   search_box->icon_selected = GetOmniboxColor(
       theme_provider, OmniboxPart::RESULTS_ICON, OmniboxPartState::SELECTED);
@@ -910,7 +916,8 @@
 
 void NewTabPageHandler::OnThemeChanged() {
   page_->SetTheme(MakeTheme(web_contents_->GetColorProvider(), theme_provider_,
-                            theme_service_, ntp_custom_background_service_));
+                            theme_service_, ntp_custom_background_service_,
+                            web_contents_));
 }
 
 void NewTabPageHandler::OnCustomBackgroundImageUpdated() {
diff --git a/chrome/browser/ui/webui/realbox/realbox.mojom b/chrome/browser/ui/webui/realbox/realbox.mojom
index 9546943..9b53c1a 100644
--- a/chrome/browser/ui/webui/realbox/realbox.mojom
+++ b/chrome/browser/ui/webui/realbox/realbox.mojom
@@ -94,6 +94,7 @@
 struct SearchBoxTheme {
   skia.mojom.SkColor bg;
   skia.mojom.SkColor bg_hovered;
+  skia.mojom.SkColor border_color;
   skia.mojom.SkColor icon;
   skia.mojom.SkColor icon_selected;
   // True if the theme is dark (i.e. NTP background color is dark).
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_section.cc b/chrome/browser/ui/webui/settings/chromeos/device_section.cc
index 48f58c4..96f0b8d 100644
--- a/chrome/browser/ui/webui/settings/chromeos/device_section.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/device_section.cc
@@ -677,10 +677,7 @@
 
   html_source->AddLocalizedString(
       "displayArrangementText",
-      base::FeatureList::IsEnabled(
-          ash::features::kKeyboardBasedDisplayArrangementInSettings)
-          ? IDS_SETTINGS_DISPLAY_ARRANGEMENT_WITH_KEYBOARD_TEXT
-          : IDS_SETTINGS_DISPLAY_ARRANGEMENT_TEXT);
+      IDS_SETTINGS_DISPLAY_ARRANGEMENT_WITH_KEYBOARD_TEXT);
 
   html_source->AddBoolean("unifiedDesktopAvailable",
                           IsUnifiedDesktopAvailable());
@@ -700,11 +697,6 @@
   html_source->AddBoolean(
       "allowDisplayAlignmentApi",
       base::FeatureList::IsEnabled(ash::features::kDisplayAlignAssist));
-
-  html_source->AddBoolean(
-      "allowKeyboardBasedDisplayArrangementInSettings",
-      base::FeatureList::IsEnabled(
-          ash::features::kKeyboardBasedDisplayArrangementInSettings));
 }
 
 void AddDeviceStorageStrings(content::WebUIDataSource* html_source,
diff --git a/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.cc b/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.cc
index 5a4fd13..64bb56a1 100644
--- a/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.cc
+++ b/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.cc
@@ -23,7 +23,7 @@
   web_ui()->RegisterMessageCallback(
       "getDatabaseDump",
       base::BindRepeating(&DumpDatabaseHandler::HandleGetDatabaseDump,
-                          base::Unretained(this)));
+                          weak_factory_.GetWeakPtr()));
 }
 
 void DumpDatabaseHandler::HandleGetDatabaseDump(const base::Value::List& args) {
@@ -32,7 +32,7 @@
       SyncFileSystemServiceFactory::GetForProfile(profile_);
   if (sync_service) {
     sync_service->DumpDatabase(base::BindOnce(
-        &DumpDatabaseHandler::DidGetDatabaseDump, base::Unretained(this),
+        &DumpDatabaseHandler::DidGetDatabaseDump, weak_factory_.GetWeakPtr(),
         args[0].GetString() /* callback_id */));
   }
 }
diff --git a/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.h b/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.h
index 4e12005..af22f48 100644
--- a/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.h
+++ b/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_UI_WEBUI_SYNC_FILE_SYSTEM_INTERNALS_DUMP_DATABASE_HANDLER_H_
 
 #include "base/memory/raw_ptr.h"
+#include "base/memory/weak_ptr.h"
 #include "content/public/browser/web_ui_message_handler.h"
 
 class Profile;
@@ -29,6 +30,8 @@
   void DidGetDatabaseDump(std::string callback_id, const base::ListValue& list);
 
   raw_ptr<Profile> profile_;
+
+  base::WeakPtrFactory<DumpDatabaseHandler> weak_factory_{this};
 };
 
 }  // namespace syncfs_internals
diff --git a/chrome/browser/web_applications/app_service/lacros_web_apps_controller.cc b/chrome/browser/web_applications/app_service/lacros_web_apps_controller.cc
index 0308d528..5570efb 100644
--- a/chrome/browser/web_applications/app_service/lacros_web_apps_controller.cc
+++ b/chrome/browser/web_applications/app_service/lacros_web_apps_controller.cc
@@ -185,7 +185,7 @@
   auto* web_contents = publisher_helper().ExecuteContextMenuCommand(
       app_id, id, display::kDefaultDisplayId);
 
-  ReturnLaunchResult(std::move(callback), web_contents);
+  ReturnLaunchResults(std::move(callback), {web_contents});
 }
 
 void LacrosWebAppsController::StopApp(const std::string& app_id) {
@@ -206,14 +206,14 @@
   content::WebContents* web_contents = nullptr;
   if (launch_params->intent) {
     if (!profile_) {
-      ReturnLaunchResult(std::move(callback), nullptr);
+      ReturnLaunchResults(std::move(callback), {});
       return;
     }
 
     web_contents = publisher_helper().MaybeNavigateExistingWindow(
         launch_params->app_id, launch_params->intent->url);
     if (web_contents) {
-      ReturnLaunchResult(std::move(callback), web_contents);
+      ReturnLaunchResults(std::move(callback), {web_contents});
       return;
     }
   }
@@ -232,38 +232,31 @@
 
   web_contents = publisher_helper().LaunchAppWithParams(std::move(params));
 
-  ReturnLaunchResult(std::move(callback), web_contents);
-}
-
-void LacrosWebAppsController::ReturnLaunchResult(
-    LaunchCallback callback,
-    content::WebContents* web_contents) {
-  // TODO(crbug.com/1144877): Run callback when the window is ready.
-  auto* app_instance_tracker =
-      apps::AppServiceProxyFactory::GetForProfile(profile_)
-          ->BrowserAppInstanceTracker();
-  auto launch_result = crosapi::mojom::LaunchResult::New();
-  if (app_instance_tracker) {
-    const apps::BrowserAppInstance* app_instance =
-        app_instance_tracker->GetAppInstance(web_contents);
-    launch_result->instance_id =
-        app_instance ? app_instance->id : base::UnguessableToken::Create();
-  } else {
-    // TODO(crbug.com/1144877): This part of code should not be reached
-    // after the instance tracker flag is turn on. Replaced with DCHECK when
-    // the app instance tracker flag is turned on.
-    launch_result->instance_id = base::UnguessableToken::Create();
-  }
-  std::move(callback).Run(std::move(launch_result));
+  ReturnLaunchResults(std::move(callback), {web_contents});
 }
 
 void LacrosWebAppsController::ReturnLaunchResults(
     LaunchCallback callback,
     const std::vector<content::WebContents*>& web_contentses) {
-  // TODO(crbug/1304003): update Lacros to support multilaunch.
-  DCHECK_LE(web_contentses.size(), 1U);
-  ReturnLaunchResult(std::move(callback),
-                     web_contentses.empty() ? nullptr : web_contentses[0]);
+  auto* app_instance_tracker =
+      apps::AppServiceProxyFactory::GetForProfile(profile_)
+          ->BrowserAppInstanceTracker();
+  auto launch_result = crosapi::mojom::LaunchResult::New();
+  launch_result->instance_id = base::UnguessableToken::Create();
+  launch_result->instance_ids = std::vector<base::UnguessableToken>();
+
+  // TODO(crbug.com/1144877): Replaced with DCHECK when the app instance tracker
+  // flag is turned on.
+  if (app_instance_tracker) {
+    for (content::WebContents* web_contents : web_contentses) {
+      const apps::BrowserAppInstance* app_instance =
+          app_instance_tracker->GetAppInstance(web_contents);
+      if (app_instance) {
+        launch_result->instance_ids->push_back(app_instance->id);
+      }
+    }
+  }
+  std::move(callback).Run(std::move(launch_result));
 }
 
 void LacrosWebAppsController::OnShortcutsMenuIconsRead(
diff --git a/chrome/browser/web_applications/app_service/lacros_web_apps_controller.h b/chrome/browser/web_applications/app_service/lacros_web_apps_controller.h
index 98c14bd7..33d22938b 100644
--- a/chrome/browser/web_applications/app_service/lacros_web_apps_controller.h
+++ b/chrome/browser/web_applications/app_service/lacros_web_apps_controller.h
@@ -106,11 +106,9 @@
       absl::optional<bool> accessing_camera,
       absl::optional<bool> accessing_microphone) override;
 
-  void ReturnLaunchResult(LaunchCallback callback,
-                          content::WebContents* web_contents);
   void ReturnLaunchResults(
       LaunchCallback callback,
-      const std::vector<content::WebContents*>& web_contentses);
+      const std::vector<content::WebContents*>& web_contents);
 
   const WebApp* GetWebApp(const AppId& app_id) const;
 
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
index d69e8098..f20b3849 100644
--- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
+++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
@@ -1821,11 +1821,6 @@
   // system apps.
   const WebApp* web_app = GetWebApp(params.app_id);
   bool can_multilaunch = !(web_app && web_app->IsSystemApp());
-#if BUILDFLAG(IS_CHROMEOS_LACROS)
-  // Lacros also sticks to old behavior for now. TODO(crbug/1304003): update
-  // Lacros to support multilaunch.
-  can_multilaunch = false;
-#endif
   std::vector<content::WebContents*> web_contentses;
   if (can_multilaunch) {
     WebAppFileHandlerManager::LaunchInfos file_launch_infos =
@@ -1844,8 +1839,10 @@
     apps::AppLaunchParams params_for_file_launch(
         app_id, params.container, params.disposition, params.launch_source,
         params.display_id, params.launch_files, params.intent);
-    // For now, with Lacros, the URL is calculated by the file browser and
-    // passed in the intent.
+    // For system web apps, the URL is calculated by the file browser and passed
+    // in the intent.
+    // TODO(crbug.com/1264164): remove this check. It's only here to support
+    // tests that haven't been updated.
     if (params.intent) {
       params_for_file_launch.override_url = GURL(*params.intent->activity_name);
     }
diff --git a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/SurfaceActionsHandler.java b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/SurfaceActionsHandler.java
index 7725541f..8b8555d7 100644
--- a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/SurfaceActionsHandler.java
+++ b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/SurfaceActionsHandler.java
@@ -60,8 +60,13 @@
      * @param url The URL that the user clicked on
      * @param entityMids Sorted list (most relevant to least) of entity MIDs that correspond to the
      *         clicked URL
+     * @param contentCategoryMediaType MediaType expresses the primary media format of the content
+     * @param cardCategory Expresses the category of the clicked card
+     * TODO(tbansal): Remove the first method once the callers have been updated.
      */
     default void updateUserProfileOnLinkClick(String url, List<Long> entityMids) {}
+    default void updateUserProfileOnLinkClick(
+            String url, List<Long> entityMids, long contentCategoryMediaType, long cardCategory) {}
 
     /** A request to follow or unfollow a WebFeed. */
     interface WebFeedFollowUpdate {
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 15c14cb..406b7cfb 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1649073454-e5bb226b88583e8fc6bf486c6b8470b842752de9.profdata
+chrome-mac-main-1649094461-e8a8a25da2a0e235e686020719b3274ef6948c83.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index a3ac352..455627d 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1649084190-39f7b7cca93d35064469bb64b515b4a3da1c68d8.profdata
+chrome-win64-main-1649105977-ecb633743c36a53e3606c8f17ab2352579116975.profdata
diff --git a/chrome/renderer/autofill/form_autofill_browsertest.cc b/chrome/renderer/autofill/form_autofill_browsertest.cc
index 9b63c15eab..582f853 100644
--- a/chrome/renderer/autofill/form_autofill_browsertest.cc
+++ b/chrome/renderer/autofill/form_autofill_browsertest.cc
@@ -329,7 +329,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     const FormData& form = forms[0];
@@ -417,7 +417,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     // Get the input element we want to find.
@@ -670,7 +670,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     // Get the input element we want to find.
@@ -728,7 +728,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     // Get the textarea element we want to find.
@@ -795,7 +795,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     // Get the input element we want to find.
@@ -889,7 +889,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     // Get the input element we want to find.
@@ -967,7 +967,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     // Get the input element we want to find.
@@ -1048,7 +1048,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     const size_t expected_size = unowned ? 1 : 2;
     ASSERT_EQ(expected_size, forms.size());
 
@@ -1143,7 +1143,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     // Get the input element we want to find.
@@ -1298,7 +1298,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     // Get the input element we want to find.
@@ -1476,7 +1476,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     // Get the input element we want to find.
@@ -1592,7 +1592,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     // Get the input element we want to find.
@@ -1707,7 +1707,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     // Get the input element we want to find.
@@ -1823,7 +1823,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     // Set the auto-filled attribute.
@@ -1932,7 +1932,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     // Set the autofilled attribute and specify the section attribute.
@@ -2042,7 +2042,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     // Set the auto-filled attribute.
@@ -2112,7 +2112,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     std::vector<WebFormControlElement> elements;
@@ -2163,7 +2163,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     std::vector<WebFormControlElement> elements;
@@ -2213,7 +2213,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     std::vector<WebFormControlElement> elements;
@@ -2264,7 +2264,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     ASSERT_EQ(1U, forms.size());
 
     // Set the autofilled attribute.
@@ -3227,7 +3227,7 @@
 
   FormCache form_cache(web_frame);
   std::vector<FormData> forms =
-      form_cache.ExtractNewForms(nullptr).updated_forms;
+      form_cache.UpdateFormCache(nullptr).updated_forms;
   ASSERT_EQ(2U, forms.size());
 
   // First form.
@@ -3301,11 +3301,11 @@
 
   FormCache form_cache(web_frame);
   std::vector<FormData> forms =
-      form_cache.ExtractNewForms(nullptr).updated_forms;
+      form_cache.UpdateFormCache(nullptr).updated_forms;
   ASSERT_EQ(1U, forms.size());
 
   // Second call should give nothing as there are no new forms.
-  forms = form_cache.ExtractNewForms(nullptr).updated_forms;
+  forms = form_cache.UpdateFormCache(nullptr).updated_forms;
   ASSERT_TRUE(forms.empty());
 
   // Append to the current form will re-extract.
@@ -3317,7 +3317,7 @@
       "document.getElementById('testform').appendChild(newInput);");
   base::RunLoop().RunUntilIdle();
 
-  forms = form_cache.ExtractNewForms(nullptr).updated_forms;
+  forms = form_cache.UpdateFormCache(nullptr).updated_forms;
   ASSERT_EQ(1U, forms.size());
 
   const std::vector<FormFieldData>& fields = forms[0].fields;
@@ -3378,7 +3378,7 @@
   base::RunLoop().RunUntilIdle();
 
   web_frame = GetMainFrame();
-  forms = form_cache.ExtractNewForms(nullptr).updated_forms;
+  forms = form_cache.UpdateFormCache(nullptr).updated_forms;
   ASSERT_EQ(1U, forms.size());
 
   const std::vector<FormFieldData>& fields2 = forms[0].fields;
@@ -3413,7 +3413,7 @@
 
   FormCache form_cache(web_frame);
   std::vector<FormData> forms =
-      form_cache.ExtractNewForms(nullptr).updated_forms;
+      form_cache.UpdateFormCache(nullptr).updated_forms;
   ASSERT_TRUE(forms.empty());
 }
 
@@ -5534,7 +5534,7 @@
 
     FormCache form_cache(web_frame);
     std::vector<FormData> forms =
-        form_cache.ExtractNewForms(nullptr).updated_forms;
+        form_cache.UpdateFormCache(nullptr).updated_forms;
     EXPECT_EQ(test_case.number_of_extracted_forms, forms.size());
     if (!forms.empty())
       EXPECT_EQ(test_case.is_form_tag, forms.back().is_form_tag);
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index eb5972c..acde677 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1499,6 +1499,7 @@
       "//ash/components/arc/test/data/icons",
       "//chrome/browser/page_load_metrics/integration_tests/data/",
       "//chrome/test/data/cart/",
+      "//components/test/data/",
       "//components/test/data/ad_tagging/",
       "//components/test/data/ads_observer/",
       "//components/test/data/autofill/",
@@ -5510,11 +5511,17 @@
       "../browser/webauthn/authenticator_request_scheduler_unittest.cc",
       "../browser/webauthn/cablev2_devices_unittest.cc",
       "../browser/webauthn/chrome_authenticator_request_delegate_unittest.cc",
-      "../common/net/x509_certificate_model_unittest.cc",
       "../renderer/cart/commerce_hint_agent_unittest.cc",
     ]
   }
 
+  # TODO(crbug.com/1265746): Enable x509_certificate_model_unittest on windows
+  # once the cert viewer on windows is changed to use the internal one.
+  # Currently disabled on win due to crbug.com/1311991.
+  if (!is_android && !is_win) {
+    sources += [ "../common/net/x509_certificate_model_unittest.cc" ]
+  }
+
   if (is_chromeos) {
     sources += [ "../browser/media/platform_verification_chromeos_unittest.cc" ]
   }
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index 53eee732..f49fafbe 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -272,11 +272,6 @@
         "$root_gen_dir/chrome/test/data/webui/nearby_share/shared/nearby_onboarding_page_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/nearby_share/shared/nearby_page_template_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/nearby_share/shared/nearby_visibility_page_test.m.js",
-        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/cups_printer_page_tests.m.js",
-        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/cups_printer_test_utils.m.js",
-        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/cups_printer_landing_page_tests.m.js",
-        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/cups_printer_entry_tests.m.js",
-        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/device_page_tests.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/fake_receive_manager.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/fake_quick_unlock_private.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/fake_quick_unlock_uma.m.js",
@@ -295,7 +290,6 @@
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_settings_menu_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_sync_controls_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/lock_screen_tests.m.js",
-        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_printing_page_tests.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_search_page_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_settings_search_box_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_settings_page_test.m.js",
@@ -304,7 +298,6 @@
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/smb_shares_page_tests.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/search_subpage_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/search_engine_test.m.js",
-        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/test_cups_printers_browser_proxy.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/test_kerberos_accounts_browser_proxy.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/test_os_lifetime_browser_proxy.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/test_os_reset_browser_proxy.m.js",
diff --git a/chrome/test/data/webui/cr_elements/cr_fingerprint_progress_arc_tests.ts b/chrome/test/data/webui/cr_elements/cr_fingerprint_progress_arc_tests.ts
index 1c833af..0157e6a 100644
--- a/chrome/test/data/webui/cr_elements/cr_fingerprint_progress_arc_tests.ts
+++ b/chrome/test/data/webui/cr_elements/cr_fingerprint_progress_arc_tests.ts
@@ -4,7 +4,7 @@
 
 import 'chrome://resources/cr_elements/cr_lottie/cr_lottie.m.js';
 
-import {CrFingerprintProgressArcElement, FINGERPRINT_TICK_DARK_URL, FINGERPRINT_TICK_LIGHT_URL, PROGRESS_CIRCLE_BACKGROUND_COLOR_DARK, PROGRESS_CIRCLE_BACKGROUND_COLOR_LIGHT, PROGRESS_CIRCLE_FILL_COLOR_DARK, PROGRESS_CIRCLE_FILL_COLOR_LIGHT} from 'chrome://resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.m.js';
+import {CrFingerprintProgressArcElement, FINGERPRINT_SCANNED_ICON_DARK, FINGERPRINT_SCANNED_ICON_LIGHT, FINGERPRINT_TICK_DARK_URL, FINGERPRINT_TICK_LIGHT_URL, PROGRESS_CIRCLE_BACKGROUND_COLOR_DARK, PROGRESS_CIRCLE_BACKGROUND_COLOR_LIGHT, PROGRESS_CIRCLE_FILL_COLOR_DARK, PROGRESS_CIRCLE_FILL_COLOR_LIGHT} from 'chrome://resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertEquals} from 'chrome://webui-test/chai_assert.js';
 import {MockController} from 'chrome://webui-test/mock_controller.js';
@@ -249,11 +249,15 @@
   });
 
   test('TestSwitchToDarkMode', function() {
+    const fingerprintScanned = progressArc.$.fingerprintScanned;
     const scanningAnimation = progressArc.$.scanningAnimation;
+
     progressArc.setProgress(0, 1, true);
+    assertEquals(FINGERPRINT_SCANNED_ICON_LIGHT, fingerprintScanned.icon);
     assertEquals(FINGERPRINT_TICK_LIGHT_URL, scanningAnimation.animationUrl);
 
     fakeMediaQueryList.matches = true;
+    assertEquals(FINGERPRINT_SCANNED_ICON_DARK, fingerprintScanned.icon);
     assertEquals(FINGERPRINT_TICK_DARK_URL, scanningAnimation.animationUrl);
   });
 });
diff --git a/chrome/test/data/webui/new_tab_page/test_support.ts b/chrome/test/data/webui/new_tab_page/test_support.ts
index d981e2d..76f2323 100644
--- a/chrome/test/data/webui/new_tab_page/test_support.ts
+++ b/chrome/test/data/webui/new_tab_page/test_support.ts
@@ -96,6 +96,7 @@
   const searchBox = {
     bg: {value: 0xff000000},
     bgHovered: {value: 0xff00000e},
+    borderColor: {value: 0xff00000e},
     icon: {value: 0xff000001},
     iconSelected: {value: 0xff000002},
     isDark: false,
diff --git a/chrome/test/data/webui/settings/chromeos/BUILD.gn b/chrome/test/data/webui/settings/chromeos/BUILD.gn
index cd684dd..b8557bd 100644
--- a/chrome/test/data/webui/settings/chromeos/BUILD.gn
+++ b/chrome/test/data/webui/settings/chromeos/BUILD.gn
@@ -32,11 +32,6 @@
 
 js_modulizer("modulize") {
   input_files = [
-    "cups_printer_entry_tests.js",
-    "cups_printer_landing_page_tests.js",
-    "cups_printer_page_tests.js",
-    "cups_printer_test_utils.js",
-    "device_page_tests.js",
     "fake_quick_unlock_private.js",
     "fake_quick_unlock_uma.js",
     "fake_receive_manager.js",
@@ -48,7 +43,6 @@
     "onc_mojo_test.js",
     "os_files_page_test.js",
     "os_reset_page_test.js",
-    "os_printing_page_tests.js",
     "os_privacy_page_test.js",
     "os_search_page_test.js",
     "os_settings_main_test.js",
@@ -66,8 +60,6 @@
     "settings_traffic_counters_test.js",
     "smart_privacy_subpage_tests.js",
     "smb_shares_page_tests.js",
-    "test_cups_printers_browser_proxy.js",
-    "test_device_name_browser_proxy.js",
     "test_kerberos_accounts_browser_proxy.js",
     "test_os_lifetime_browser_proxy.js",
     "test_os_reset_browser_proxy.js",
diff --git a/chrome/test/data/webui/settings/chromeos/cups_printer_entry_tests.js b/chrome/test/data/webui/settings/chromeos/cups_printer_entry_tests.js
index 041ae6b..a0044c0e 100644
--- a/chrome/test/data/webui/settings/chromeos/cups_printer_entry_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/cups_printer_entry_tests.js
@@ -2,12 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// clang-format off
-// #import 'chrome://os-settings/chromeos/lazy_load.js';
+import 'chrome://os-settings/chromeos/lazy_load.js';
 
-// #import {PrinterType} from 'chrome://os-settings/chromeos/lazy_load.js';
-// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-// clang-format on
+import {PrinterType} from 'chrome://os-settings/chromeos/lazy_load.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
  * Helper function to verify that printers in |printerListEntries| that contain
@@ -68,7 +66,7 @@
     printerEntryListTestElement, expectedVisiblePrinters, searchTerm) {
   printerEntryListTestElement.searchTerm = searchTerm;
 
-  Polymer.dom.flush();
+  flush();
 
   verifyVisiblePrinters(printerEntryListTestElement, expectedVisiblePrinters);
   verifyFilteredPrinters(printerEntryListTestElement, searchTerm);
@@ -160,7 +158,7 @@
     // Assert that three dot menu is not shown before the dom is updated.
     assertFalse(!!printerEntryTestElement.$$('.icon-more-vert'));
 
-    Polymer.dom.flush();
+    flush();
 
     // Three dot menu should be visible when |printerType| is set to
     // PrinterType.SAVED.
@@ -177,7 +175,7 @@
     for (let i = 0; i < printerTypes.length; i++) {
       printerEntryTestElement.printerEntry =
           createPrinterEntry(printerTypes[i]);
-      Polymer.dom.flush();
+      flush();
       const actionButton = printerEntryTestElement.$$(printerIds[i]);
       printerEntryTestElement.savingPrinter = true;
       printerEntryTestElement.userPrintersAllowed = true;
diff --git a/chrome/test/data/webui/settings/chromeos/cups_printer_landing_page_tests.js b/chrome/test/data/webui/settings/chromeos/cups_printer_landing_page_tests.js
index 9734134..08eafb8 100644
--- a/chrome/test/data/webui/settings/chromeos/cups_printer_landing_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/cups_printer_landing_page_tests.js
@@ -2,21 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// clang-format off
-// #import 'chrome://os-settings/chromeos/lazy_load.js';
+import {CupsPrintersBrowserProxyImpl, PrinterType} from 'chrome://os-settings/chromeos/lazy_load.js';
+import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
+import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.m.js';
+import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {waitAfterNextRender} from 'chrome://test/test_util.js';
 
-// #import {CupsPrintersBrowserProxyImpl,PrinterSetupResult,CupsPrintersEntryManager,PrintServerResult,PrinterType} from 'chrome://os-settings/chromeos/lazy_load.js';
-// #import {MojoInterfaceProviderImpl, MojoInterfaceProvider} from '//resources/cr_components/chromeos/network/mojo_interface_provider.m.js';
-// #import {TestCupsPrintersBrowserProxy } from './test_cups_printers_browser_proxy.m.js';
-// #import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.m.js';
-// #import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
-// #import {createCupsPrinterInfo,createPrinterListEntry} from './cups_printer_test_utils.m.js';
-// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-// #import {flushTasks} from '../../test_util.js';
-// #import {getPrinterEntries} from './cups_printer_test_utils.m.js';
-// #import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-// #import {waitAfterNextRender} from 'chrome://test/test_util.js';
-// clang-format on
+import {flushTasks} from '../../test_util.js';
+
+import {createCupsPrinterInfo, createPrinterListEntry, getPrinterEntries} from './cups_printer_test_utils.js';
+import {TestCupsPrintersBrowserProxy} from './test_cups_printers_browser_proxy.js';
 
 const arrowUpEvent = new KeyboardEvent(
     'keydown', {cancelable: true, key: 'ArrowUp', keyCode: 38});
@@ -39,7 +35,7 @@
   assertTrue(!button.disabled);
 
   button.click();
-  Polymer.dom.flush();
+  flush();
 }
 
 /**
@@ -170,8 +166,7 @@
  */
 function removePrinter(cupsPrintersBrowserProxy, savedPrintersElement, index) {
   const printerList = cupsPrintersBrowserProxy.printerList.printerList;
-  const savedPrinterEntries =
-      cups_printer_test_util.getPrinterEntries(savedPrintersElement);
+  const savedPrinterEntries = getPrinterEntries(savedPrintersElement);
 
   clickButton(savedPrinterEntries[index].$$('.icon-more-vert'));
   clickButton(savedPrintersElement.$$('#removeButton'));
@@ -184,7 +179,7 @@
         // Simuluate saved printer changes.
         cr.webUIListenerCallback(
             'on-saved-printers-changed', cupsPrintersBrowserProxy.printerList);
-        Polymer.dom.flush();
+        flush();
       });
 }
 
@@ -196,8 +191,7 @@
  */
 function removeAllPrinters(cupsPrintersBrowserProxy, savedPrintersElement) {
   const printerList = cupsPrintersBrowserProxy.printerList.printerList;
-  const savedPrinterEntries =
-      cups_printer_test_util.getPrinterEntries(savedPrintersElement);
+  const savedPrinterEntries = getPrinterEntries(savedPrintersElement);
 
   if (!printerList.length) {
     return Promise.resolve();
@@ -205,7 +199,7 @@
 
   return removePrinter(
              cupsPrintersBrowserProxy, savedPrintersElement, 0 /* index */)
-      .then(test_util.flushTasks)
+      .then(flushTasks)
       .then(removeAllPrinters.bind(
           this, cupsPrintersBrowserProxy, savedPrintersElement));
 }
@@ -221,11 +215,10 @@
   let printerList = null;
 
   setup(function() {
-    cupsPrintersBrowserProxy =
-        new printerBrowserProxy.TestCupsPrintersBrowserProxy();
+    cupsPrintersBrowserProxy = new TestCupsPrintersBrowserProxy();
 
     PolymerTest.clearBody();
-    settings.Router.getInstance().navigateTo(settings.routes.CUPS_PRINTERS);
+    Router.getInstance().navigateTo(routes.CUPS_PRINTERS);
   });
 
   teardown(function() {
@@ -242,13 +235,13 @@
     // |cupsPrinterBrowserProxy| needs to have a list of saved printers before
     // initializing the landing page.
     cupsPrintersBrowserProxy.printerList = {printerList: printerList};
-    settings.CupsPrintersBrowserProxyImpl.instance_ = cupsPrintersBrowserProxy;
+    CupsPrintersBrowserProxyImpl.instance_ = cupsPrintersBrowserProxy;
 
     page = document.createElement('settings-cups-printers');
     document.body.appendChild(page);
     assertTrue(!!page);
 
-    Polymer.dom.flush();
+    flush();
   }
 
   /** @param {!CupsPrinterInfo} printer*/
@@ -268,19 +261,19 @@
     cupsPrintersBrowserProxy.printerList = {printerList: printerList};
     cr.webUIListenerCallback(
         'on-saved-printers-changed', cupsPrintersBrowserProxy.printerList);
-    Polymer.dom.flush();
+    flush();
   }
 
   test('SavedPrintersSuccessfullyPopulates', function() {
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('google', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('google', '4', 'id4'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           savedPrintersElement = page.$$('settings-cups-saved-printers');
           assertTrue(!!savedPrintersElement);
@@ -289,8 +282,7 @@
           const savedPrintersList =
               savedPrintersElement.$$('settings-cups-printers-entry-list');
 
-          const printerListEntries =
-              cups_printer_test_util.getPrinterEntries(savedPrintersElement);
+          const printerListEntries = getPrinterEntries(savedPrintersElement);
 
           verifyPrintersList(printerListEntries, printerList);
         });
@@ -300,14 +292,14 @@
     const savedPrinterEntries = [];
 
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('google', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('google', '4', 'id4'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           savedPrintersElement = page.$$('settings-cups-saved-printers');
           assertTrue(!!savedPrintersElement);
@@ -316,8 +308,7 @@
               cupsPrintersBrowserProxy, savedPrintersElement);
         })
         .then(() => {
-          const entryList =
-              cups_printer_test_util.getPrinterEntries(savedPrintersElement);
+          const entryList = getPrinterEntries(savedPrintersElement);
           verifyPrintersList(entryList, printerList);
         });
   });
@@ -328,22 +319,21 @@
     let savedPrinterEntries = [];
 
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('google', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('google', '4', 'id4'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           savedPrintersElement = page.$$('settings-cups-saved-printers');
           assertTrue(!!savedPrintersElement);
 
           savedPrintersList =
               savedPrintersElement.$$('settings-cups-printers-entry-list');
-          savedPrinterEntries =
-              cups_printer_test_util.getPrinterEntries(savedPrintersElement);
+          savedPrinterEntries = getPrinterEntries(savedPrintersElement);
 
           verifyPrintersList(savedPrinterEntries, printerList);
 
@@ -364,26 +354,25 @@
     let savedPrinterEntries = null;
 
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('google', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('google', '4', 'id4'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           savedPrintersElement = page.$$('settings-cups-saved-printers');
           assertTrue(!!savedPrintersElement);
 
-          savedPrinterEntries =
-              cups_printer_test_util.getPrinterEntries(savedPrintersElement);
+          savedPrinterEntries = getPrinterEntries(savedPrintersElement);
 
           // Update the printer name of the first entry.
           clickButton(savedPrinterEntries[0].$$('.icon-more-vert'));
           clickButton(savedPrintersElement.$$('#editButton'));
 
-          Polymer.dom.flush();
+          flush();
 
           editDialog = initializeEditDialog(page);
 
@@ -393,7 +382,7 @@
           nameField.value = expectedName;
           nameField.fire('input');
 
-          Polymer.dom.flush();
+          flush();
 
           clickButton(editDialog.$$('.action-button'));
 
@@ -417,26 +406,25 @@
     let editDialog = null;
 
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('google', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('google', '4', 'id4'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           savedPrintersElement = page.$$('settings-cups-saved-printers');
           assertTrue(!!savedPrintersElement);
 
-          savedPrinterEntries =
-              cups_printer_test_util.getPrinterEntries(savedPrintersElement);
+          savedPrinterEntries = getPrinterEntries(savedPrintersElement);
 
           // Edit the first entry.
           clickButton(savedPrinterEntries[0].$$('.icon-more-vert'));
           clickButton(savedPrintersElement.$$('#editButton'));
 
-          Polymer.dom.flush();
+          flush();
 
           editDialog = initializeEditDialog(page);
 
@@ -453,7 +441,7 @@
           expectFalse(editDialog.$$('.cancel-button').hidden);
           expectFalse(editDialog.$$('.action-button').hidden);
 
-          Polymer.dom.flush();
+          flush();
 
           clickButton(editDialog.$$('.action-button'));
 
@@ -474,32 +462,30 @@
 
   test('SavedPrintersSearchTermFiltersCorrectPrinters', function() {
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('google', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('google', '4', 'id4'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           savedPrintersElement = page.$$('settings-cups-saved-printers');
           assertTrue(!!savedPrintersElement);
 
-          const printerListEntries =
-              cups_printer_test_util.getPrinterEntries(savedPrintersElement);
+          const printerListEntries = getPrinterEntries(savedPrintersElement);
           verifyPrintersList(printerListEntries, printerList);
 
           let searchTerm = 'google';
           savedPrintersElement.searchTerm = searchTerm;
-          Polymer.dom.flush();
+          flush();
 
           // Filtering "google" should result in one visible entry and two
           // hidden entries.
           verifySearchQueryResults(
               savedPrintersElement,
-              [cups_printer_test_util.createPrinterListEntry(
-                  'google', '4', 'id4', PrinterType.SAVED)],
+              [createPrinterListEntry('google', '4', 'id4', PrinterType.SAVED)],
               searchTerm);
 
           // Change the search term and assert that entries are filtered
@@ -507,34 +493,27 @@
           // and one hidden entry.
           searchTerm = 'test';
           savedPrintersElement.searchTerm = searchTerm;
-          Polymer.dom.flush();
+          flush();
 
           verifySearchQueryResults(
               savedPrintersElement,
               [
-                cups_printer_test_util.createPrinterListEntry(
-                    'test1', '1', 'id1', PrinterType.SAVED),
-                cups_printer_test_util.createPrinterListEntry(
-                    'test2', '2', 'id2', PrinterType.SAVED),
+                createPrinterListEntry('test1', '1', 'id1', PrinterType.SAVED),
+                createPrinterListEntry('test2', '2', 'id2', PrinterType.SAVED),
               ],
               searchTerm);
 
           // Add more printers and assert that they are correctly filtered.
-          addNewSavedPrinter(cups_printer_test_util.createCupsPrinterInfo(
-              'test3', '3', 'id3'));
-          addNewSavedPrinter(cups_printer_test_util.createCupsPrinterInfo(
-              'google2', '6', 'id6'));
-          Polymer.dom.flush();
+          addNewSavedPrinter(createCupsPrinterInfo('test3', '3', 'id3'));
+          addNewSavedPrinter(createCupsPrinterInfo('google2', '6', 'id6'));
+          flush();
 
           verifySearchQueryResults(
               savedPrintersElement,
               [
-                cups_printer_test_util.createPrinterListEntry(
-                    'test3', '3', 'id3', PrinterType.SAVED),
-                cups_printer_test_util.createPrinterListEntry(
-                    'test1', '1', 'id1', PrinterType.SAVED),
-                cups_printer_test_util.createPrinterListEntry(
-                    'test2', '2', 'id2', PrinterType.SAVED)
+                createPrinterListEntry('test3', '3', 'id3', PrinterType.SAVED),
+                createPrinterListEntry('test1', '1', 'id1', PrinterType.SAVED),
+                createPrinterListEntry('test2', '2', 'id2', PrinterType.SAVED)
               ],
               searchTerm);
         });
@@ -542,38 +521,36 @@
 
   test('SavedPrintersNoSearchFound', function() {
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('google', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('google', '4', 'id4'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           savedPrintersElement = page.$$('settings-cups-saved-printers');
           assertTrue(!!savedPrintersElement);
 
-          const printerListEntries =
-              cups_printer_test_util.getPrinterEntries(savedPrintersElement);
+          const printerListEntries = getPrinterEntries(savedPrintersElement);
           verifyPrintersList(printerListEntries, printerList);
 
           let searchTerm = 'google';
           savedPrintersElement.searchTerm = searchTerm;
-          Polymer.dom.flush();
+          flush();
 
           // Filtering "google" should result in one visible entry and three
           // hidden entries.
           verifySearchQueryResults(
               savedPrintersElement,
-              [cups_printer_test_util.createPrinterListEntry(
-                  'google', '4', 'id4', PrinterType.SAVED)],
+              [createPrinterListEntry('google', '4', 'id4', PrinterType.SAVED)],
               searchTerm);
 
           // Change search term to something that has no matches.
           searchTerm = 'noSearchFound';
           savedPrintersElement.searchTerm = searchTerm;
-          Polymer.dom.flush();
+          flush();
 
           verifySearchQueryResults(savedPrintersElement, [], searchTerm);
 
@@ -581,69 +558,66 @@
           // found message is no longer there.
           searchTerm = 'google';
           savedPrintersElement.searchTerm = searchTerm;
-          Polymer.dom.flush();
+          flush();
 
           verifySearchQueryResults(
               savedPrintersElement,
-              [cups_printer_test_util.createPrinterListEntry(
-                  'google', '4', 'id4', PrinterType.SAVED)],
+              [createPrinterListEntry('google', '4', 'id4', PrinterType.SAVED)],
               searchTerm);
         });
   });
 
   test('NavigateSavedPrintersList', function() {
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('google', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('google', '4', 'id4'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(async () => {
           // Wait for saved printers to populate.
-          Polymer.dom.flush();
+          flush();
           savedPrintersElement = page.$$('settings-cups-saved-printers');
           assertTrue(!!savedPrintersElement);
           const printerEntryList = savedPrintersElement.$$('#printerEntryList');
-          const printerListEntries =
-              cups_printer_test_util.getPrinterEntries(savedPrintersElement);
+          const printerListEntries = getPrinterEntries(savedPrintersElement);
           printerEntryList.focus();
           printerEntryList.dispatchEvent(arrowDownEvent);
-          Polymer.dom.flush();
+          flush();
           assertEquals(printerListEntries[1], getDeepActiveElement());
           printerEntryList.dispatchEvent(arrowDownEvent);
-          Polymer.dom.flush();
+          flush();
           assertEquals(printerListEntries[2], getDeepActiveElement());
           printerEntryList.dispatchEvent(arrowUpEvent);
-          Polymer.dom.flush();
+          flush();
           assertEquals(printerListEntries[1], getDeepActiveElement());
           printerEntryList.dispatchEvent(arrowUpEvent);
-          Polymer.dom.flush();
+          flush();
           assertEquals(printerListEntries[0], getDeepActiveElement());
         });
   });
 
   test('Deep link to saved printers', async () => {
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('google', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
-      cups_printer_test_util.createCupsPrinterInfo('test3', '3', 'id3'),
+      createCupsPrinterInfo('google', '4', 'id4'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('test3', '3', 'id3'),
     ]);
 
     await cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList');
 
     const params = new URLSearchParams();
     params.append('settingId', '1401');
-    settings.Router.getInstance().navigateTo(
-        settings.routes.CUPS_PRINTERS, params);
+    Router.getInstance().navigateTo(routes.CUPS_PRINTERS, params);
 
-    Polymer.dom.flush();
+    flush();
 
     const savedPrinters = page.$$('settings-cups-saved-printers');
     const printerEntry =
         savedPrinters && savedPrinters.$$('settings-cups-printers-entry');
     const deepLinkElement = printerEntry && printerEntry.$$('#moreActions');
-    await test_util.waitAfterNextRender(deepLinkElement);
+    await waitAfterNextRender(deepLinkElement);
     assertEquals(
         deepLinkElement, getDeepActiveElement(),
         'First saved printer menu button should be focused for settingId=1401.');
@@ -651,14 +625,14 @@
 
   test('ShowMoreButtonIsInitiallyHiddenAndANewPrinterIsAdded', function() {
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('google', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('google', '4', 'id4'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           savedPrintersElement = page.$$('settings-cups-saved-printers');
           assertTrue(!!savedPrintersElement);
@@ -667,12 +641,9 @@
               savedPrintersElement.$$('#printerEntryList');
 
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'google', '4', 'id4', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test1', '1', 'id1', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test2', '2', 'id2', PrinterType.SAVED)
+            createPrinterListEntry('google', '4', 'id4', PrinterType.SAVED),
+            createPrinterListEntry('test1', '1', 'id1', PrinterType.SAVED),
+            createPrinterListEntry('test2', '2', 'id2', PrinterType.SAVED)
           ]);
           // Assert that the Show more button is hidden because printer list
           // length is <= 3.
@@ -680,17 +651,12 @@
 
           // Newly added printers will always be visible and inserted to the
           // top of the list.
-          addNewSavedPrinter(cups_printer_test_util.createCupsPrinterInfo(
-              'test3', '3', 'id3'));
+          addNewSavedPrinter(createCupsPrinterInfo('test3', '3', 'id3'));
           const expectedVisiblePrinters = [
-            cups_printer_test_util.createPrinterListEntry(
-                'test3', '3', 'id3', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'google', '4', 'id4', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test1', '1', 'id1', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test2', '2', 'id2', PrinterType.SAVED)
+            createPrinterListEntry('test3', '3', 'id3', PrinterType.SAVED),
+            createPrinterListEntry('google', '4', 'id4', PrinterType.SAVED),
+            createPrinterListEntry('test1', '1', 'id1', PrinterType.SAVED),
+            createPrinterListEntry('test2', '2', 'id2', PrinterType.SAVED)
           ];
           verifyVisiblePrinters(
               printerEntryListTestElement, expectedVisiblePrinters);
@@ -702,15 +668,15 @@
 
   test('PressShowMoreButton', function() {
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('google', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
-      cups_printer_test_util.createCupsPrinterInfo('test3', '3', 'id3'),
+      createCupsPrinterInfo('google', '4', 'id4'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('test3', '3', 'id3'),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           savedPrintersElement = page.$$('settings-cups-saved-printers');
           assertTrue(!!savedPrintersElement);
@@ -721,12 +687,9 @@
           // There are 4 total printers but only 3 printers are visible and 1 is
           // hidden underneath the Show more section.
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'google', '4', 'id4', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test1', '1', 'id1', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test2', '2', 'id2', PrinterType.SAVED),
+            createPrinterListEntry('google', '4', 'id4', PrinterType.SAVED),
+            createPrinterListEntry('test1', '1', 'id1', PrinterType.SAVED),
+            createPrinterListEntry('test2', '2', 'id2', PrinterType.SAVED),
           ]);
           // Assert that the Show more button is shown since printer list length
           // is > 3.
@@ -737,29 +700,25 @@
           assertFalse(!!savedPrintersElement.$$('#show-more-container'));
           // Clicking on the Show more button reveals all hidden printers.
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'google', '4', 'id4', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test1', '1', 'id1', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test2', '2', 'id2', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test3', '3', 'id3', PrinterType.SAVED)
+            createPrinterListEntry('google', '4', 'id4', PrinterType.SAVED),
+            createPrinterListEntry('test1', '1', 'id1', PrinterType.SAVED),
+            createPrinterListEntry('test2', '2', 'id2', PrinterType.SAVED),
+            createPrinterListEntry('test3', '3', 'id3', PrinterType.SAVED)
           ]);
         });
   });
 
   test('ShowMoreButtonIsInitiallyShownAndWithANewPrinterAdded', function() {
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('google', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
-      cups_printer_test_util.createCupsPrinterInfo('test3', '3', 'id3'),
+      createCupsPrinterInfo('google', '4', 'id4'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('test3', '3', 'id3'),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           savedPrintersElement = page.$$('settings-cups-saved-printers');
           assertTrue(!!savedPrintersElement);
@@ -770,29 +729,21 @@
           // There are 4 total printers but only 3 printers are visible and 1 is
           // hidden underneath the Show more section.
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'google', '4', 'id4', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test1', '1', 'id1', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test2', '2', 'id2', PrinterType.SAVED),
+            createPrinterListEntry('google', '4', 'id4', PrinterType.SAVED),
+            createPrinterListEntry('test1', '1', 'id1', PrinterType.SAVED),
+            createPrinterListEntry('test2', '2', 'id2', PrinterType.SAVED),
           ]);
           // Assert that the Show more button is shown since printer list length
           // is > 3.
           assertTrue(!!savedPrintersElement.$$('#show-more-container'));
 
           // Newly added printers will always be visible.
-          addNewSavedPrinter(cups_printer_test_util.createCupsPrinterInfo(
-              'test5', '5', 'id5'));
+          addNewSavedPrinter(createCupsPrinterInfo('test5', '5', 'id5'));
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'test5', '5', 'id5', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'google', '4', 'id4', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test1', '1', 'id1', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test2', '2', 'id2', PrinterType.SAVED)
+            createPrinterListEntry('test5', '5', 'id5', PrinterType.SAVED),
+            createPrinterListEntry('google', '4', 'id4', PrinterType.SAVED),
+            createPrinterListEntry('test1', '1', 'id1', PrinterType.SAVED),
+            createPrinterListEntry('test2', '2', 'id2', PrinterType.SAVED)
           ]);
           // Assert that the Show more button is still shown.
           assertTrue(!!savedPrintersElement.$$('#show-more-container'));
@@ -801,16 +752,16 @@
 
   test('ShowMoreButtonIsShownAndRemovePrinters', function() {
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('google', '3', 'id3'),
-      cups_printer_test_util.createCupsPrinterInfo('google2', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('google3', '5', 'id5'),
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('google', '3', 'id3'),
+      createCupsPrinterInfo('google2', '4', 'id4'),
+      createCupsPrinterInfo('google3', '5', 'id5'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           savedPrintersElement = page.$$('settings-cups-saved-printers');
           assertTrue(!!savedPrintersElement);
@@ -821,12 +772,9 @@
           // There are 5 total printers but only 3 printers are visible and 2
           // are hidden underneath the Show more section.
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'google', '3', 'id3', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'google2', '4', 'id4', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'google3', '5', 'id5', PrinterType.SAVED)
+            createPrinterListEntry('google', '3', 'id3', PrinterType.SAVED),
+            createPrinterListEntry('google2', '4', 'id4', PrinterType.SAVED),
+            createPrinterListEntry('google3', '5', 'id5', PrinterType.SAVED)
           ]);
           // Assert that the Show more button is shown since printer list length
           // is > 3.
@@ -839,12 +787,9 @@
           // Since printers were initially alphabetically sorted, we should
           // expect 'test1' to be the next visible printer.
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'google2', '4', 'id4', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'google3', '5', 'id5', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test1', '1', 'id1', PrinterType.SAVED)
+            createPrinterListEntry('google2', '4', 'id4', PrinterType.SAVED),
+            createPrinterListEntry('google3', '5', 'id5', PrinterType.SAVED),
+            createPrinterListEntry('test1', '1', 'id1', PrinterType.SAVED)
           ]);
           assertTrue(!!savedPrintersElement.$$('#show-more-container'));
 
@@ -853,12 +798,9 @@
           // Printer list has 3 elements now, the Show more button should be
           // hidden.
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'google3', '5', 'id5', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test1', '1', 'id1', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test2', '2', 'id2', PrinterType.SAVED)
+            createPrinterListEntry('google3', '5', 'id5', PrinterType.SAVED),
+            createPrinterListEntry('test1', '1', 'id1', PrinterType.SAVED),
+            createPrinterListEntry('test2', '2', 'id2', PrinterType.SAVED)
           ]);
           assertFalse(!!savedPrintersElement.$$('#show-more-container'));
         });
@@ -866,17 +808,17 @@
 
   test('ShowMoreButtonIsShownAndSearchQueryFiltersCorrectly', function() {
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('google', '3', 'id3'),
-      cups_printer_test_util.createCupsPrinterInfo('google2', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('google3', '5', 'id5'),
-      cups_printer_test_util.createCupsPrinterInfo('google4', '6', 'id6'),
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('google', '3', 'id3'),
+      createCupsPrinterInfo('google2', '4', 'id4'),
+      createCupsPrinterInfo('google3', '5', 'id5'),
+      createCupsPrinterInfo('google4', '6', 'id6'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           savedPrintersElement = page.$$('settings-cups-saved-printers');
           assertTrue(!!savedPrintersElement);
@@ -887,12 +829,9 @@
           // There are 6 total printers but only 3 printers are visible and 3
           // are hidden underneath the Show more section.
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'google', '3', 'id3', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'google2', '4', 'id4', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'google3', '5', 'id5', PrinterType.SAVED)
+            createPrinterListEntry('google', '3', 'id3', PrinterType.SAVED),
+            createPrinterListEntry('google2', '4', 'id4', PrinterType.SAVED),
+            createPrinterListEntry('google3', '5', 'id5', PrinterType.SAVED)
           ]);
           // Assert that the Show more button is shown since printer list length
           // is > 3.
@@ -901,18 +840,16 @@
           // Set search term to 'google' and expect 4 visible printers.
           let searchTerm = 'google';
           savedPrintersElement.searchTerm = searchTerm;
-          Polymer.dom.flush();
+          flush();
           verifySearchQueryResults(
               savedPrintersElement,
               [
-                cups_printer_test_util.createPrinterListEntry(
-                    'google', '3', 'id3', PrinterType.SAVED),
-                cups_printer_test_util.createPrinterListEntry(
+                createPrinterListEntry('google', '3', 'id3', PrinterType.SAVED),
+                createPrinterListEntry(
                     'google2', '4', 'id4', PrinterType.SAVED),
-                cups_printer_test_util.createPrinterListEntry(
+                createPrinterListEntry(
                     'google3', '5', 'id5', PrinterType.SAVED),
-                cups_printer_test_util.createPrinterListEntry(
-                    'google4', '6', 'id6', PrinterType.SAVED)
+                createPrinterListEntry('google4', '6', 'id6', PrinterType.SAVED)
               ],
               searchTerm);
           // Having a search term should hide the Show more button.
@@ -922,7 +859,7 @@
           // button to still be hidden.
           searchTerm = 'noSearchFound';
           savedPrintersElement.searchTerm = searchTerm;
-          Polymer.dom.flush();
+          flush();
           verifySearchQueryResults(savedPrintersElement, [], searchTerm);
 
           assertFalse(!!savedPrintersElement.$$('#show-more-container'));
@@ -930,14 +867,12 @@
           // Change search term and expect new set of visible printers.
           searchTerm = 'test';
           savedPrintersElement.searchTerm = searchTerm;
-          Polymer.dom.flush();
+          flush();
           verifySearchQueryResults(
               savedPrintersElement,
               [
-                cups_printer_test_util.createPrinterListEntry(
-                    'test1', '1', 'id1', PrinterType.SAVED),
-                cups_printer_test_util.createPrinterListEntry(
-                    'test2', '2', 'id2', PrinterType.SAVED)
+                createPrinterListEntry('test1', '1', 'id1', PrinterType.SAVED),
+                createPrinterListEntry('test2', '2', 'id2', PrinterType.SAVED)
               ],
               searchTerm);
           assertFalse(!!savedPrintersElement.$$('#show-more-container'));
@@ -946,14 +881,11 @@
           // again.
           searchTerm = '';
           savedPrintersElement.searchTerm = searchTerm;
-          Polymer.dom.flush();
+          flush();
           const expectedVisiblePrinters = [
-            cups_printer_test_util.createPrinterListEntry(
-                'google', '3', 'id3', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'google2', '4', 'id4', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'google3', '5', 'id5', PrinterType.SAVED)
+            createPrinterListEntry('google', '3', 'id3', PrinterType.SAVED),
+            createPrinterListEntry('google2', '4', 'id4', PrinterType.SAVED),
+            createPrinterListEntry('google3', '5', 'id5', PrinterType.SAVED)
           ];
           verifySearchQueryResults(
               savedPrintersElement, expectedVisiblePrinters, searchTerm);
@@ -965,15 +897,15 @@
 
   test('ShowMoreButtonAddAndRemovePrinters', function() {
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('google', '3', 'id3'),
-      cups_printer_test_util.createCupsPrinterInfo('google2', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('google', '3', 'id3'),
+      createCupsPrinterInfo('google2', '4', 'id4'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsSavedPrintersList')
         .then(() => {
           // Wait for saved printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           savedPrintersElement = page.$$('settings-cups-saved-printers');
           assertTrue(!!savedPrintersElement);
@@ -984,29 +916,21 @@
           // There are 4 total printers but only 3 printers are visible and 1 is
           // hidden underneath the Show more section.
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'google', '3', 'id3', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'google2', '4', 'id4', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test1', '1', 'id1', PrinterType.SAVED)
+            createPrinterListEntry('google', '3', 'id3', PrinterType.SAVED),
+            createPrinterListEntry('google2', '4', 'id4', PrinterType.SAVED),
+            createPrinterListEntry('test1', '1', 'id1', PrinterType.SAVED)
           ]);
           // Assert that the Show more button is shown since printer list length
           // is > 3.
           assertTrue(!!savedPrintersElement.$$('#show-more-container'));
 
           // Add a new printer and expect it to be at the top of the list.
-          addNewSavedPrinter(cups_printer_test_util.createCupsPrinterInfo(
-              'newPrinter', '5', 'id5'));
+          addNewSavedPrinter(createCupsPrinterInfo('newPrinter', '5', 'id5'));
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'newPrinter', '5', 'id5', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'google', '3', 'id3', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'google2', '4', 'id4', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test1', '1', 'id1', PrinterType.SAVED)
+            createPrinterListEntry('newPrinter', '5', 'id5', PrinterType.SAVED),
+            createPrinterListEntry('google', '3', 'id3', PrinterType.SAVED),
+            createPrinterListEntry('google2', '4', 'id4', PrinterType.SAVED),
+            createPrinterListEntry('test1', '1', 'id1', PrinterType.SAVED)
           ]);
           assertTrue(!!savedPrintersElement.$$('#show-more-container'));
 
@@ -1017,12 +941,9 @@
           // visible printers. In this case, we remove 'test1' and now only
           // have 3 visible printers and 1 hidden printer: 'test2'.
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'newPrinter', '5', 'id5', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'google', '3', 'id3', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'google2', '4', 'id4', PrinterType.SAVED)
+            createPrinterListEntry('newPrinter', '5', 'id5', PrinterType.SAVED),
+            createPrinterListEntry('google', '3', 'id3', PrinterType.SAVED),
+            createPrinterListEntry('google2', '4', 'id4', PrinterType.SAVED)
           ]);
           assertTrue(!!savedPrintersElement.$$('#show-more-container'));
 
@@ -1030,12 +951,9 @@
           // printers but now 'test2' is our third visible printer.
           removeSavedPrinter('id4');
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'newPrinter', '5', 'id5', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'google', '3', 'id3', PrinterType.SAVED),
-            cups_printer_test_util.createPrinterListEntry(
-                'test2', '2', 'id2', PrinterType.SAVED)
+            createPrinterListEntry('newPrinter', '5', 'id5', PrinterType.SAVED),
+            createPrinterListEntry('google', '3', 'id3', PrinterType.SAVED),
+            createPrinterListEntry('test2', '2', 'id2', PrinterType.SAVED)
           ]);
           // Printer list length is <= 3, Show more button should be hidden.
           assertFalse(!!savedPrintersElement.$$('#show-more-container'));
@@ -1059,24 +977,23 @@
 
   setup(function() {
     const mojom = chromeos.networkConfig.mojom;
-    cupsPrintersBrowserProxy =
-        new printerBrowserProxy.TestCupsPrintersBrowserProxy();
+    cupsPrintersBrowserProxy = new TestCupsPrintersBrowserProxy();
 
-    settings.CupsPrintersBrowserProxyImpl.instance_ = cupsPrintersBrowserProxy;
+    CupsPrintersBrowserProxyImpl.instance_ = cupsPrintersBrowserProxy;
 
     // Simulate internet connection.
     wifi1 = OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi1');
     wifi1.connectionState = mojom.ConnectionStateType.kOnline;
 
     PolymerTest.clearBody();
-    settings.Router.getInstance().navigateTo(settings.routes.CUPS_PRINTERS);
+    Router.getInstance().navigateTo(routes.CUPS_PRINTERS);
 
     page = document.createElement('settings-cups-printers');
     document.body.appendChild(page);
     assertTrue(!!page);
     page.onActiveNetworksChanged([wifi1]);
 
-    Polymer.dom.flush();
+    flush();
   });
 
   teardown(function() {
@@ -1088,21 +1005,20 @@
 
   test('nearbyPrintersSuccessfullyPopulates', function() {
     const automaticPrinterList = [
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
+      createCupsPrinterInfo('test1', '1', 'id1'),
+      createCupsPrinterInfo('test2', '2', 'id2'),
     ];
     const discoveredPrinterList = [
-      cups_printer_test_util.createCupsPrinterInfo('test3', '3', 'id3'),
-      cups_printer_test_util.createCupsPrinterInfo('test4', '4', 'id4'),
+      createCupsPrinterInfo('test3', '3', 'id3'),
+      createCupsPrinterInfo('test4', '4', 'id4'),
     ];
 
-    return test_util.flushTasks().then(() => {
+    return flushTasks().then(() => {
       nearbyPrintersElement = page.$$('settings-cups-nearby-printers');
       assertTrue(!!nearbyPrintersElement);
 
       // Assert that no printers have been detected.
-      let nearbyPrinterEntries =
-          cups_printer_test_util.getPrinterEntries(nearbyPrintersElement);
+      let nearbyPrinterEntries = getPrinterEntries(nearbyPrintersElement);
       assertEquals(0, nearbyPrinterEntries.length);
 
       // Simuluate finding nearby printers.
@@ -1110,10 +1026,9 @@
           'on-nearby-printers-changed', automaticPrinterList,
           discoveredPrinterList);
 
-      Polymer.dom.flush();
+      flush();
 
-      nearbyPrinterEntries =
-          cups_printer_test_util.getPrinterEntries(nearbyPrintersElement);
+      nearbyPrinterEntries = getPrinterEntries(nearbyPrintersElement);
 
       const expectedPrinterList =
           automaticPrinterList.concat(discoveredPrinterList);
@@ -1122,18 +1037,18 @@
   });
 
   test('nearbyPrintersSortOrderAutoFirstThenDiscovered', function() {
-    const discoveredPrinterA = cups_printer_test_util.createCupsPrinterInfo(
-        'printerNameA', 'printerAddress1', 'printerId1');
-    const discoveredPrinterB = cups_printer_test_util.createCupsPrinterInfo(
-        'printerNameB', 'printerAddress2', 'printerId2');
-    const discoveredPrinterC = cups_printer_test_util.createCupsPrinterInfo(
-        'printerNameC', 'printerAddress3', 'printerId3');
-    const autoPrinterD = cups_printer_test_util.createCupsPrinterInfo(
-        'printerNameD', 'printerAddress4', 'printerId4');
-    const autoPrinterE = cups_printer_test_util.createCupsPrinterInfo(
-        'printerNameE', 'printerAddress5', 'printerId5');
-    const autoPrinterF = cups_printer_test_util.createCupsPrinterInfo(
-        'printerNameF', 'printerAddress6', 'printerId6');
+    const discoveredPrinterA =
+        createCupsPrinterInfo('printerNameA', 'printerAddress1', 'printerId1');
+    const discoveredPrinterB =
+        createCupsPrinterInfo('printerNameB', 'printerAddress2', 'printerId2');
+    const discoveredPrinterC =
+        createCupsPrinterInfo('printerNameC', 'printerAddress3', 'printerId3');
+    const autoPrinterD =
+        createCupsPrinterInfo('printerNameD', 'printerAddress4', 'printerId4');
+    const autoPrinterE =
+        createCupsPrinterInfo('printerNameE', 'printerAddress5', 'printerId5');
+    const autoPrinterF =
+        createCupsPrinterInfo('printerNameF', 'printerAddress6', 'printerId6');
 
     // Add printers in a non-alphabetical order to test sorting.
     const automaticPrinterList = [autoPrinterF, autoPrinterD, autoPrinterE];
@@ -1147,7 +1062,7 @@
       discoveredPrinterB, discoveredPrinterC
     ];
 
-    return test_util.flushTasks().then(() => {
+    return flushTasks().then(() => {
       nearbyPrintersElement = page.$$('settings-cups-nearby-printers');
       assertTrue(!!nearbyPrintersElement);
 
@@ -1156,23 +1071,21 @@
           'on-nearby-printers-changed', automaticPrinterList,
           discoveredPrinterList);
 
-      Polymer.dom.flush();
+      flush();
 
-      const nearbyPrinterEntries =
-          cups_printer_test_util.getPrinterEntries(nearbyPrintersElement);
+      const nearbyPrinterEntries = getPrinterEntries(nearbyPrintersElement);
 
       verifyPrintersList(nearbyPrinterEntries, expectedPrinterList);
     });
   });
 
   test('addingAutomaticPrinterIsSuccessful', function() {
-    const automaticPrinterList =
-        [cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1')];
+    const automaticPrinterList = [createCupsPrinterInfo('test1', '1', 'id1')];
     const discoveredPrinterList = [];
 
     let addButton = null;
 
-    return test_util.flushTasks()
+    return flushTasks()
         .then(() => {
           nearbyPrintersElement = page.$$('settings-cups-nearby-printers');
           assertTrue(!!nearbyPrintersElement);
@@ -1182,12 +1095,11 @@
               'on-nearby-printers-changed', automaticPrinterList,
               discoveredPrinterList);
 
-          Polymer.dom.flush();
+          flush();
 
           // Requery and assert that the newly detected printer automatic
           // printer has the correct button.
-          const nearbyPrinterEntries =
-              cups_printer_test_util.getPrinterEntries(nearbyPrintersElement);
+          const nearbyPrinterEntries = getPrinterEntries(nearbyPrintersElement);
           assertEquals(1, nearbyPrinterEntries.length);
           assertTrue(!!nearbyPrinterEntries[0].$$('.save-printer-button'));
 
@@ -1210,27 +1122,26 @@
 
   test('NavigateNearbyPrinterList', function() {
     const discoveredPrinterList = [
-      cups_printer_test_util.createCupsPrinterInfo('first', '3', 'id3'),
-      cups_printer_test_util.createCupsPrinterInfo('second', '4', 'id4'),
-      cups_printer_test_util.createCupsPrinterInfo('third', '2', 'id5'),
+      createCupsPrinterInfo('first', '3', 'id3'),
+      createCupsPrinterInfo('second', '4', 'id4'),
+      createCupsPrinterInfo('third', '2', 'id5'),
     ];
-    return test_util.flushTasks().then(async () => {
+    return flushTasks().then(async () => {
       nearbyPrintersElement = page.$$('settings-cups-nearby-printers');
 
       // Block so that FocusRowBehavior.attached can run.
-      await test_util.waitAfterNextRender(nearbyPrintersElement);
+      await waitAfterNextRender(nearbyPrintersElement);
 
       assertTrue(!!nearbyPrintersElement);
       // Simuluate finding nearby printers.
       cr.webUIListenerCallback(
           'on-nearby-printers-changed', [], discoveredPrinterList);
-      Polymer.dom.flush();
+      flush();
 
       // Wait one more time to ensure that async setup in FocusRowBehavior has
       // executed.
-      await test_util.waitAfterNextRender(nearbyPrintersElement);
-      const nearbyPrinterEntries =
-          cups_printer_test_util.getPrinterEntries(nearbyPrintersElement);
+      await waitAfterNextRender(nearbyPrintersElement);
+      const nearbyPrinterEntries = getPrinterEntries(nearbyPrintersElement);
       const printerEntryList = nearbyPrintersElement.$$('#printerEntryList');
 
       nearbyPrinterEntries[0].$$('#entry').focus();
@@ -1263,13 +1174,12 @@
 
   test('addingDiscoveredPrinterIsSuccessful', function() {
     const automaticPrinterList = [];
-    const discoveredPrinterList =
-        [cups_printer_test_util.createCupsPrinterInfo('test3', '3', 'id3')];
+    const discoveredPrinterList = [createCupsPrinterInfo('test3', '3', 'id3')];
 
     let manufacturerDialog = null;
     let setupButton = null;
 
-    return test_util.flushTasks()
+    return flushTasks()
         .then(() => {
           nearbyPrintersElement = page.$$('settings-cups-nearby-printers');
           assertTrue(!!nearbyPrintersElement);
@@ -1279,12 +1189,11 @@
               'on-nearby-printers-changed', automaticPrinterList,
               discoveredPrinterList);
 
-          Polymer.dom.flush();
+          flush();
 
           // Requery and assert that a newly detected discovered printer has
           // the correct icon button.
-          const nearbyPrinterEntries =
-              cups_printer_test_util.getPrinterEntries(nearbyPrintersElement);
+          const nearbyPrinterEntries = getPrinterEntries(nearbyPrintersElement);
           assertEquals(1, nearbyPrinterEntries.length);
           assertTrue(!!nearbyPrinterEntries[0].$$('#setupPrinterButton'));
 
@@ -1304,7 +1213,7 @@
         .then(() => {
           assertFalse(setupButton.disabled);
 
-          Polymer.dom.flush();
+          flush();
           const addDialog = page.$$('#addPrinterDialog');
           manufacturerDialog =
               addDialog.$$('add-printer-manufacturer-model-dialog');
@@ -1340,9 +1249,9 @@
     wifi1.connectionState =
         chromeos.networkConfig.mojom.ConnectionStateType.kConnected;
     page.onActiveNetworksChanged([wifi1]);
-    Polymer.dom.flush();
+    flush();
 
-    return test_util.flushTasks().then(() => {
+    return flushTasks().then(() => {
       // We require internet to be able to add a new printer. Connecting to
       // a network without connectivity should be equivalent to not being
       // connected to a network.
@@ -1357,9 +1266,9 @@
     wifi1.connectionState =
         chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected;
     page.onActiveNetworksChanged([wifi1]);
-    Polymer.dom.flush();
+    flush();
 
-    return test_util.flushTasks()
+    return flushTasks()
         .then(() => {
           // Expect offline text to show up when no internet is
           // connected.
@@ -1371,18 +1280,18 @@
           wifi1.connectionState =
               chromeos.networkConfig.mojom.ConnectionStateType.kOnline;
           page.onActiveNetworksChanged([wifi1]);
-          Polymer.dom.flush();
+          flush();
 
-          return test_util.flushTasks();
+          return flushTasks();
         })
         .then(() => {
           const automaticPrinterList = [
-            cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1'),
-            cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2'),
+            createCupsPrinterInfo('test1', '1', 'id1'),
+            createCupsPrinterInfo('test2', '2', 'id2'),
           ];
           const discoveredPrinterList = [
-            cups_printer_test_util.createCupsPrinterInfo('test3', '3', 'id3'),
-            cups_printer_test_util.createCupsPrinterInfo('test4', '4', 'id4'),
+            createCupsPrinterInfo('test3', '3', 'id3'),
+            createCupsPrinterInfo('test4', '4', 'id4'),
           ];
 
           // Simuluate finding nearby printers.
@@ -1390,7 +1299,7 @@
               'on-nearby-printers-changed', automaticPrinterList,
               discoveredPrinterList);
 
-          Polymer.dom.flush();
+          flush();
 
           nearbyPrintersElement = page.$$('settings-cups-nearby-printers');
           assertTrue(!!nearbyPrintersElement);
@@ -1399,8 +1308,7 @@
               nearbyPrintersElement.$$('#printerEntryList');
           assertTrue(!!printerEntryListTestElement);
 
-          const nearbyPrinterEntries =
-              cups_printer_test_util.getPrinterEntries(nearbyPrintersElement);
+          const nearbyPrinterEntries = getPrinterEntries(nearbyPrintersElement);
 
           const expectedPrinterList =
               automaticPrinterList.concat(discoveredPrinterList);
@@ -1410,15 +1318,12 @@
 
   test('NearbyPrintersSearchTermFiltersCorrectPrinters', function() {
     const discoveredPrinterList = [
-      cups_printer_test_util.createCupsPrinterInfo(
-          'test1', 'printerAddress1', 'printerId1'),
-      cups_printer_test_util.createCupsPrinterInfo(
-          'test2', 'printerAddress2', 'printerId2'),
-      cups_printer_test_util.createCupsPrinterInfo(
-          'google', 'printerAddress3', 'printerId3'),
+      createCupsPrinterInfo('test1', 'printerAddress1', 'printerId1'),
+      createCupsPrinterInfo('test2', 'printerAddress2', 'printerId2'),
+      createCupsPrinterInfo('google', 'printerAddress3', 'printerId3'),
     ];
 
-    return test_util.flushTasks().then(() => {
+    return flushTasks().then(() => {
       nearbyPrintersElement = page.$$('settings-cups-nearby-printers');
       assertTrue(!!nearbyPrintersElement);
 
@@ -1430,25 +1335,25 @@
       cr.webUIListenerCallback(
           'on-nearby-printers-changed', [], discoveredPrinterList);
 
-      Polymer.dom.flush();
+      flush();
 
       verifyVisiblePrinters(printerEntryListTestElement, [
-        cups_printer_test_util.createPrinterListEntry(
+        createPrinterListEntry(
             'google', 'printerAddress3', 'printerId3', PrinterType.DISCOVERD),
-        cups_printer_test_util.createPrinterListEntry(
+        createPrinterListEntry(
             'test1', 'printerAddress1', 'printerId1', PrinterType.DISCOVERD),
-        cups_printer_test_util.createPrinterListEntry(
+        createPrinterListEntry(
             'test2', 'printerAddress2', 'printerId2', PrinterType.DISCOVERD)
       ]);
 
       let searchTerm = 'google';
       nearbyPrintersElement.searchTerm = searchTerm;
-      Polymer.dom.flush();
+      flush();
 
       // Filtering "google" should result in one visible entry and two hidden
       // entries.
       verifySearchQueryResults(
-          nearbyPrintersElement, [cups_printer_test_util.createPrinterListEntry(
+          nearbyPrintersElement, [createPrinterListEntry(
                                      'google', 'printerAddress3', 'printerId3',
                                      PrinterType.DISCOVERD)],
           searchTerm);
@@ -1457,41 +1362,41 @@
       // entry.
       searchTerm = 'test';
       nearbyPrintersElement.searchTerm = searchTerm;
-      Polymer.dom.flush();
+      flush();
 
       verifySearchQueryResults(
           nearbyPrintersElement,
           [
-            cups_printer_test_util.createPrinterListEntry(
+            createPrinterListEntry(
                 'test1', 'printerAddress1', 'printerId1',
                 PrinterType.DISCOVERD),
-            cups_printer_test_util.createPrinterListEntry(
+            createPrinterListEntry(
                 'test2', 'printerAddress2', 'printerId2', PrinterType.DISCOVERD)
           ],
           searchTerm);
 
       // Add more printers and assert that they are correctly filtered.
-      discoveredPrinterList.push(cups_printer_test_util.createCupsPrinterInfo(
-          'test3', 'printerAddress4', 'printerId4'));
-      discoveredPrinterList.push(cups_printer_test_util.createCupsPrinterInfo(
-          'google2', 'printerAddress5', 'printerId5'));
+      discoveredPrinterList.push(
+          createCupsPrinterInfo('test3', 'printerAddress4', 'printerId4'));
+      discoveredPrinterList.push(
+          createCupsPrinterInfo('google2', 'printerAddress5', 'printerId5'));
 
       // Simuluate finding nearby printers.
       cr.webUIListenerCallback(
           'on-nearby-printers-changed', [], discoveredPrinterList);
 
-      Polymer.dom.flush();
+      flush();
 
       verifySearchQueryResults(
           nearbyPrintersElement,
           [
-            cups_printer_test_util.createPrinterListEntry(
+            createPrinterListEntry(
                 'test1', 'printerAddress1', 'printerId1',
                 PrinterType.DISCOVERD),
-            cups_printer_test_util.createPrinterListEntry(
+            createPrinterListEntry(
                 'test2', 'printerAddress2', 'printerId2',
                 PrinterType.DISCOVERD),
-            cups_printer_test_util.createPrinterListEntry(
+            createPrinterListEntry(
                 'test3', 'printerAddress4', 'printerId4', PrinterType.DISCOVERD)
           ],
           searchTerm);
@@ -1500,13 +1405,11 @@
 
   test('NearbyPrintersNoSearchFound', function() {
     const discoveredPrinterList = [
-      cups_printer_test_util.createCupsPrinterInfo(
-          'test1', 'printerAddress1', 'printerId1'),
-      cups_printer_test_util.createCupsPrinterInfo(
-          'google', 'printerAddress2', 'printerId2')
+      createCupsPrinterInfo('test1', 'printerAddress1', 'printerId1'),
+      createCupsPrinterInfo('google', 'printerAddress2', 'printerId2')
     ];
 
-    return test_util.flushTasks().then(() => {
+    return flushTasks().then(() => {
       nearbyPrintersElement = page.$$('settings-cups-nearby-printers');
       assertTrue(!!nearbyPrintersElement);
 
@@ -1518,16 +1421,16 @@
       cr.webUIListenerCallback(
           'on-nearby-printers-changed', [], discoveredPrinterList);
 
-      Polymer.dom.flush();
+      flush();
 
       let searchTerm = 'google';
       nearbyPrintersElement.searchTerm = searchTerm;
-      Polymer.dom.flush();
+      flush();
 
       // Set the search term and filter out the printers. Filtering "google"
       // should result in one visible entry and one hidden entries.
       verifySearchQueryResults(
-          nearbyPrintersElement, [cups_printer_test_util.createPrinterListEntry(
+          nearbyPrintersElement, [createPrinterListEntry(
                                      'google', 'printerAddress2', 'printerId2',
                                      PrinterType.DISCOVERED)],
           searchTerm);
@@ -1535,7 +1438,7 @@
       // Change search term to something that has no matches.
       searchTerm = 'noSearchFound';
       nearbyPrintersElement.searchTerm = searchTerm;
-      Polymer.dom.flush();
+      flush();
 
       verifySearchQueryResults(nearbyPrintersElement, [], searchTerm);
 
@@ -1543,10 +1446,10 @@
       // message is no longer there.
       searchTerm = 'google';
       nearbyPrintersElement.searchTerm = searchTerm;
-      Polymer.dom.flush();
+      flush();
 
       verifySearchQueryResults(
-          nearbyPrintersElement, [cups_printer_test_util.createPrinterListEntry(
+          nearbyPrintersElement, [createPrinterListEntry(
                                      'google', 'printerAddress2', 'printerId2',
                                      PrinterType.DISCOVERD)],
           searchTerm);
@@ -1568,11 +1471,10 @@
   let printerList = null;
 
   setup(function() {
-    cupsPrintersBrowserProxy =
-        new printerBrowserProxy.TestCupsPrintersBrowserProxy();
+    cupsPrintersBrowserProxy = new TestCupsPrintersBrowserProxy();
 
     PolymerTest.clearBody();
-    settings.Router.getInstance().navigateTo(settings.routes.CUPS_PRINTERS);
+    Router.getInstance().navigateTo(routes.CUPS_PRINTERS);
   });
 
   teardown(function() {
@@ -1589,38 +1491,34 @@
     // |cupsPrinterBrowserProxy| needs to have a list of printers before
     // initializing the landing page.
     cupsPrintersBrowserProxy.printerList = {printerList: printerList};
-    settings.CupsPrintersBrowserProxyImpl.instance_ = cupsPrintersBrowserProxy;
+    CupsPrintersBrowserProxyImpl.instance_ = cupsPrintersBrowserProxy;
 
     page = document.createElement('settings-cups-printers');
     document.body.appendChild(page);
     assertTrue(!!page);
 
-    Polymer.dom.flush();
+    flush();
   }
 
   // Verifies that enterprise printers are correctly shown on the OS settings
   // page.
   test('EnterprisePrinters', () => {
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo(
-          'test1', '1', 'id1', /*isManaged=*/ true),
-      cups_printer_test_util.createCupsPrinterInfo(
-          'test2', '2', 'id2', /*isManaged=*/ true),
+      createCupsPrinterInfo('test1', '1', 'id1', /*isManaged=*/ true),
+      createCupsPrinterInfo('test2', '2', 'id2', /*isManaged=*/ true),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsEnterprisePrintersList')
         .then(() => {
           // Wait for saved printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           enterprisePrintersElement =
               page.$$('settings-cups-enterprise-printers');
           printerEntryListTestElement =
               enterprisePrintersElement.$$('#printerEntryList');
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'test1', '1', 'id1', PrinterType.ENTERPRISE),
-            cups_printer_test_util.createPrinterListEntry(
-                'test2', '2', 'id2', PrinterType.ENTERPRISE),
+            createPrinterListEntry('test1', '1', 'id1', PrinterType.ENTERPRISE),
+            createPrinterListEntry('test2', '2', 'id2', PrinterType.ENTERPRISE),
           ]);
         });
   });
@@ -1631,20 +1529,19 @@
     let editDialog = null;
 
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1', true),
+      createCupsPrinterInfo('test1', '1', 'id1', true),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsEnterprisePrintersList')
         .then(() => {
           // Wait for enterprise printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           enterprisePrintersElement =
               page.$$('settings-cups-enterprise-printers');
           assertTrue(!!enterprisePrintersElement);
 
           const enterprisePrinterEntries =
-              cups_printer_test_util.getPrinterEntries(
-                  enterprisePrintersElement);
+              getPrinterEntries(enterprisePrintersElement);
 
           // Users are not allowed to remove enterprise printers.
           const removeButton = enterprisePrintersElement.$$('#removeButton');
@@ -1653,7 +1550,7 @@
           clickButton(enterprisePrinterEntries[0].$$('.icon-more-vert'));
           clickButton(enterprisePrintersElement.$$('#viewButton'));
 
-          Polymer.dom.flush();
+          flush();
 
           editDialog = initializeEditDialog(page);
 
@@ -1681,15 +1578,15 @@
 
   test('PressShowMoreButton', function() {
     createCupsPrinterPage([
-      cups_printer_test_util.createCupsPrinterInfo('test1', '1', 'id1', true),
-      cups_printer_test_util.createCupsPrinterInfo('test2', '2', 'id2', true),
-      cups_printer_test_util.createCupsPrinterInfo('test3', '3', 'id3', true),
-      cups_printer_test_util.createCupsPrinterInfo('test4', '4', 'id4', true),
+      createCupsPrinterInfo('test1', '1', 'id1', true),
+      createCupsPrinterInfo('test2', '2', 'id2', true),
+      createCupsPrinterInfo('test3', '3', 'id3', true),
+      createCupsPrinterInfo('test4', '4', 'id4', true),
     ]);
     return cupsPrintersBrowserProxy.whenCalled('getCupsEnterprisePrintersList')
         .then(() => {
           // Wait for enterprise printers to populate.
-          Polymer.dom.flush();
+          flush();
 
           enterprisePrintersElement =
               page.$$('settings-cups-enterprise-printers');
@@ -1701,12 +1598,9 @@
           // There are 4 total printers but only 3 printers are visible and 1 is
           // hidden underneath the Show more section.
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'test1', '1', 'id1', PrinterType.ENTERPRISE),
-            cups_printer_test_util.createPrinterListEntry(
-                'test2', '2', 'id2', PrinterType.ENTERPRISE),
-            cups_printer_test_util.createPrinterListEntry(
-                'test3', '3', 'id3', PrinterType.ENTERPRISE),
+            createPrinterListEntry('test1', '1', 'id1', PrinterType.ENTERPRISE),
+            createPrinterListEntry('test2', '2', 'id2', PrinterType.ENTERPRISE),
+            createPrinterListEntry('test3', '3', 'id3', PrinterType.ENTERPRISE),
           ]);
           // Assert that the Show more button is shown since printer list length
           // is > 3.
@@ -1717,14 +1611,10 @@
           assertFalse(!!enterprisePrintersElement.$$('#show-more-container'));
           // Clicking on the Show more button reveals all hidden printers.
           verifyVisiblePrinters(printerEntryListTestElement, [
-            cups_printer_test_util.createPrinterListEntry(
-                'test1', '1', 'id1', PrinterType.ENTERPRISE),
-            cups_printer_test_util.createPrinterListEntry(
-                'test2', '2', 'id2', PrinterType.ENTERPRISE),
-            cups_printer_test_util.createPrinterListEntry(
-                'test3', '3', 'id3', PrinterType.ENTERPRISE),
-            cups_printer_test_util.createPrinterListEntry(
-                'test4', '4', 'id4', PrinterType.ENTERPRISE),
+            createPrinterListEntry('test1', '1', 'id1', PrinterType.ENTERPRISE),
+            createPrinterListEntry('test2', '2', 'id2', PrinterType.ENTERPRISE),
+            createPrinterListEntry('test3', '3', 'id3', PrinterType.ENTERPRISE),
+            createPrinterListEntry('test4', '4', 'id4', PrinterType.ENTERPRISE),
           ]);
         });
   });
diff --git a/chrome/test/data/webui/settings/chromeos/cups_printer_page_tests.js b/chrome/test/data/webui/settings/chromeos/cups_printer_page_tests.js
index edc1a24f..fba2bdd1 100644
--- a/chrome/test/data/webui/settings/chromeos/cups_printer_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/cups_printer_page_tests.js
@@ -2,20 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// clang-format off
-// #import 'chrome://os-settings/chromeos/lazy_load.js';
+import {CupsPrintersBrowserProxyImpl, CupsPrintersEntryManager, PrinterSetupResult, PrinterType, PrintServerResult} from 'chrome://os-settings/chromeos/lazy_load.js';
+import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
+import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.m.js';
+import {keyEventOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-// #import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
-// #import {CupsPrintersBrowserProxyImpl,PrinterSetupResult,CupsPrintersEntryManager,PrintServerResult,PrinterType} from 'chrome://os-settings/chromeos/lazy_load.js';
-// #import {TestCupsPrintersBrowserProxy} from './test_cups_printers_browser_proxy.m.js';
-// #import {createCupsPrinterInfo,createPrinterListEntry} from './cups_printer_test_utils.m.js';
-// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-// #import {assertEquals, assertFalse, assertNotEquals, assertTrue} from '../../chai_assert.js';
-// #import {flushTasks} from '../../test_util.js';
-// #import {MojoInterfaceProviderImpl, MojoInterfaceProvider} from '//resources/cr_components/chromeos/network/mojo_interface_provider.m.js';
-// #import {keyEventOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
-// #import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.m.js';
-// clang-format on
+import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
+import {flushTasks} from '../../test_util.js';
+
+import {createCupsPrinterInfo, createPrinterListEntry} from './cups_printer_test_utils.js';
+import {TestCupsPrintersBrowserProxy} from './test_cups_printers_browser_proxy.js';
 
 /*
  * Helper function that waits for |getEulaUrl| to get called and then verifies
@@ -88,8 +85,8 @@
     // Test that pressing Enter before all the fields are populated does not
     // advance to the next dialog.
     const input = addDialog.$$(crInputId);
-    MockInteractions.keyEventOn(input, 'keypress', /*keycode=*/13, [], 'Enter');
-    Polymer.dom.flush();
+    keyEventOn(input, 'keypress', /*keycode=*/ 13, [], 'Enter');
+    flush();
 
     assertFalse(!!dialog.$$('add-printer-manufacturer-model-dialog'));
     assertFalse(dialog.showManufacturerDialog_);
@@ -100,16 +97,16 @@
 
     // Test that key press on random key while in input field is not accepted as
     // as valid Enter press.
-    MockInteractions.keyEventOn(input, 'keypress', /*keycode=*/16, [], 'Shift');
-    Polymer.dom.flush();
+    keyEventOn(input, 'keypress', /*keycode=*/ 16, [], 'Shift');
+    flush();
 
     assertFalse(!!dialog.$$('add-printer-manufacturer-model-dialog'));
     assertFalse(dialog.showManufacturerDialog_);
     assertTrue(dialog.showManuallyAddDialog_);
 
     // Now test Enter press with valid input.
-    MockInteractions.keyEventOn(input, 'keypress', /*keycode=*/13, [], 'Enter');
-    Polymer.dom.flush();
+    keyEventOn(input, 'keypress', /*keycode=*/ 13, [], 'Enter');
+    flush();
   }
 
   let page = null;
@@ -119,9 +116,8 @@
   let cupsPrintersBrowserProxy = null;
 
   setup(function() {
-    cupsPrintersBrowserProxy =
-        new printerBrowserProxy.TestCupsPrintersBrowserProxy();
-    settings.CupsPrintersBrowserProxyImpl.instance_ = cupsPrintersBrowserProxy;
+    cupsPrintersBrowserProxy = new TestCupsPrintersBrowserProxy();
+    CupsPrintersBrowserProxyImpl.instance_ = cupsPrintersBrowserProxy;
 
     PolymerTest.clearBody();
     page = document.createElement('settings-cups-printers');
@@ -133,7 +129,7 @@
     assertTrue(!!dialog);
 
     dialog.open();
-    Polymer.dom.flush();
+    flush();
   });
 
   teardown(function() {
@@ -207,17 +203,17 @@
     // Starts in add manual dialog.
     const addDialog = dialog.$$('add-printer-manually-dialog');
     assertTrue(!!addDialog);
-    Polymer.dom.flush();
+    flush();
     fillAddManuallyDialog(addDialog);
 
     addDialog.$$('.action-button').click();
-    Polymer.dom.flush();
+    flush();
 
     // Upon rejection, show model.
     return cupsPrintersBrowserProxy
         .whenCalled('getCupsPrinterManufacturersList')
         .then(function() {
-          return test_util.flushTasks();
+          return flushTasks();
         })
         .then(function() {
           // Showing model selection.
@@ -236,7 +232,7 @@
     // Starts in add manual dialog.
     const addDialog = dialog.$$('add-printer-manually-dialog');
     assertTrue(!!addDialog);
-    Polymer.dom.flush();
+    flush();
 
     fillAddManuallyDialog(addDialog);
 
@@ -246,7 +242,7 @@
 
     // Attempt to add the printer.
     addDialog.$$('.action-button').click();
-    Polymer.dom.flush();
+    flush();
 
     // Upon rejection, show model.
     return cupsPrintersBrowserProxy.whenCalled('getPrinterInfo')
@@ -267,7 +263,7 @@
     // Starts in add manual dialog.
     const addDialog = dialog.$$('add-printer-manually-dialog');
     assertTrue(!!addDialog);
-    Polymer.dom.flush();
+    flush();
 
     fillAddManuallyDialog(addDialog);
 
@@ -277,7 +273,7 @@
 
     // Attempt to add the printer.
     addDialog.$$('.action-button').click();
-    Polymer.dom.flush();
+    flush();
 
     // Upon rejection, show model.
     return cupsPrintersBrowserProxy.whenCalled('getPrinterInfo')
@@ -295,7 +291,7 @@
     // Starts in add manual dialog.
     const addDialog = dialog.$$('add-printer-manually-dialog');
     assertTrue(!!addDialog);
-    Polymer.dom.flush();
+    flush();
     fillAddManuallyDialog(addDialog);
 
     // Verify that getCupsPrinterModelList is not called.
@@ -308,7 +304,7 @@
     cupsPrintersBrowserProxy.manufacturers =
         ['ManufacturerA', 'ManufacturerB', 'Chromites'];
     addDialog.$$('.action-button').click();
-    Polymer.dom.flush();
+    flush();
 
     return cupsPrintersBrowserProxy
         .whenCalled('getCupsPrinterManufacturersList')
@@ -329,7 +325,7 @@
     const makeAndModel = 'Printer Make And Model';
     // Start on add manual dialog.
     dialog.fire('open-manually-add-printer-dialog');
-    Polymer.dom.flush();
+    flush();
 
     // Populate the printer object.
     dialog.newPrinter = {
@@ -363,7 +359,7 @@
     // Press the add button to advance dialog.
     const addDialog = dialog.$$('add-printer-manually-dialog');
     assertTrue(!!addDialog);
-    Polymer.dom.flush();
+    flush();
     clickAddButton(addDialog);
 
     // Click cancel on the manufacturer dialog when it shows up then verify
@@ -371,7 +367,7 @@
     return cupsPrintersBrowserProxy
         .whenCalled('getCupsPrinterManufacturersList')
         .then(function() {
-          Polymer.dom.flush();
+          flush();
           // Cancel setup with the cancel button.
           clickCancelButton(dialog.$$('add-printer-manufacturer-model-dialog'));
           return cupsPrintersBrowserProxy.whenCalled('cancelPrinterSetUp');
@@ -390,11 +386,11 @@
     // Start in add manual dialog.
     const addDialog = dialog.$$('add-printer-manually-dialog');
     assertTrue(!!addDialog);
-    Polymer.dom.flush();
+    flush();
     fillAddManuallyDialog(addDialog);
 
     addDialog.$$('.action-button').click();
-    Polymer.dom.flush();
+    flush();
 
     const expectedEulaLink = 'chrome://os-credits/#google';
     const expectedManufacturer = 'Google';
@@ -462,10 +458,10 @@
     // manufacturer dialog.
     const addDialog = dialog.$$('add-printer-manually-dialog');
     assertTrue(!!addDialog);
-    Polymer.dom.flush();
+    flush();
     fillAddManuallyDialog(addDialog);
     clickAddButton(addDialog);
-    Polymer.dom.flush();
+    flush();
 
     // Click the add button on the manufacturer dialog and then verify it is
     // disabled.
@@ -502,7 +498,7 @@
     return cupsPrintersBrowserProxy
         .whenCalled('getCupsPrinterManufacturersList')
         .then(function() {
-          return test_util.flushTasks();
+          return flushTasks();
         })
         .then(function() {
           // Showing model selection.
@@ -519,7 +515,7 @@
     return cupsPrintersBrowserProxy
         .whenCalled('getCupsPrinterManufacturersList')
         .then(function() {
-          return test_util.flushTasks();
+          return flushTasks();
         })
         .then(function() {
           // Showing model selection.
@@ -536,7 +532,7 @@
     return cupsPrintersBrowserProxy
         .whenCalled('getCupsPrinterManufacturersList')
         .then(function() {
-          return test_util.flushTasks();
+          return flushTasks();
         })
         .then(function() {
           // Showing model selection.
@@ -555,10 +551,10 @@
     // manufacturer dialog.
     const addDialog = dialog.$$('add-printer-manually-dialog');
     assertTrue(!!addDialog);
-    Polymer.dom.flush();
+    flush();
     fillAddManuallyDialog(addDialog);
     clickAddButton(addDialog);
-    Polymer.dom.flush();
+    flush();
 
     return cupsPrintersBrowserProxy
         .whenCalled('getCupsPrinterManufacturersList')
@@ -612,14 +608,14 @@
 
     select.value = 'socket';
     select.dispatchEvent(new CustomEvent('change'), {'bubbles': true});
-    Polymer.dom.flush();
+    flush();
 
     printerQueueInput = addDialog.$$('#printerQueueInput');
     assertFalse(!!printerQueueInput);
 
     select.value = 'http';
     select.dispatchEvent(new CustomEvent('change'), {'bubbles': true});
-    Polymer.dom.flush();
+    flush();
 
     printerQueueInput = addDialog.$$('#printerQueueInput');
     assertTrue(!!printerQueueInput);
@@ -641,23 +637,22 @@
   setup(function() {
     const mojom = chromeos.networkConfig.mojom;
 
-    cupsPrintersBrowserProxy =
-        new printerBrowserProxy.TestCupsPrintersBrowserProxy();
+    cupsPrintersBrowserProxy = new TestCupsPrintersBrowserProxy();
 
-    settings.CupsPrintersBrowserProxyImpl.instance_ = cupsPrintersBrowserProxy;
+    CupsPrintersBrowserProxyImpl.instance_ = cupsPrintersBrowserProxy;
 
     // Simulate internet connection.
     wifi1 = OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi1');
     wifi1.connectionState = mojom.ConnectionStateType.kOnline;
 
     PolymerTest.clearBody();
-    settings.Router.getInstance().navigateTo(settings.routes.CUPS_PRINTERS);
+    Router.getInstance().navigateTo(routes.CUPS_PRINTERS);
 
     page = document.createElement('settings-cups-printers');
     document.body.appendChild(page);
     assertTrue(!!page);
     page.onActiveNetworksChanged([wifi1]);
-    Polymer.dom.flush();
+    flush();
   });
 
   teardown(function() {
@@ -706,8 +701,7 @@
   function initializeAndOpenEditDialog(
       name, address, id, autoconf, manufacturer, model, protocol,
       serverAddress) {
-    page.activePrinter =
-        cups_printer_test_util.createCupsPrinterInfo(name, address, id);
+    page.activePrinter = createCupsPrinterInfo(name, address, id);
     page.activePrinter.printerPpdReference.autoconf = autoconf;
     page.activePrinter.printerProtocol = protocol;
     page.activePrinter.printServerUri = serverAddress;
@@ -717,7 +711,7 @@
     };
     // Trigger the edit dialog to open.
     page.fire('edit-cups-printer-details');
-    Polymer.dom.flush();
+    flush();
     dialog = page.$$('settings-cups-edit-printer-dialog');
     // This proxy function gets called whenever the edit dialog is initialized.
     return cupsPrintersBrowserProxy.whenCalled('getCupsPrinterModelsList');
@@ -834,7 +828,7 @@
           assertTrue(!!nameField);
           nameField.value = expectedName;
 
-          Polymer.dom.flush();
+          flush();
           clickSaveButton(dialog);
           return cupsPrintersBrowserProxy.whenCalled('updateCupsPrinter');
         })
@@ -1014,7 +1008,7 @@
           const dropDown = dialog.$$('.md-select');
           dropDown.value = 'http';
           dropDown.dispatchEvent(new CustomEvent('change'), {'bubbles': true});
-          Polymer.dom.flush();
+          flush();
           assertTrue(!saveButton.disabled);
         });
   });
@@ -1056,7 +1050,7 @@
           modelDropDown.dispatchEvent(
               new CustomEvent('change'), {'bubbles': true});
 
-          Polymer.dom.flush();
+          flush();
           assertTrue(!saveButton.disabled);
         });
   });
@@ -1130,7 +1124,7 @@
     wifi1.connectionState =
         chromeos.networkConfig.mojom.ConnectionStateType.kConnected;
     page.onActiveNetworksChanged([wifi1]);
-    Polymer.dom.flush();
+    flush();
     const expectedName = 'editedName';
     return initializeAndOpenEditDialog(
                /*name=*/ 'name', /*address=*/ 'address', /*id=*/ 'id',
@@ -1142,7 +1136,7 @@
           nameField.value = expectedName;
           nameField.fire('input');
 
-          Polymer.dom.flush();
+          flush();
 
           const saveButton = dialog.$$('.action-button');
           assertTrue(!!saveButton);
@@ -1176,7 +1170,7 @@
           nameField.value = expectedName;
           nameField.fire('input');
 
-          Polymer.dom.flush();
+          flush();
 
           const saveButton = dialog.$$('.action-button');
           assertTrue(!!saveButton);
@@ -1195,7 +1189,7 @@
   let page = null;
   let dialog = null;
 
-  /** @type {?settings.printing.CupsPrintersEntryManager} */
+  /** @type {?CupsPrintersEntryManager} */
   let entryManager = null;
 
   /** @type {?settings.TestCupsPrintersBrowserProxy} */
@@ -1203,18 +1197,17 @@
 
 
   setup(function() {
-    entryManager = settings.printing.CupsPrintersEntryManager.getInstance();
+    entryManager = CupsPrintersEntryManager.getInstance();
     setEntryManagerPrinters(
         /*savedPrinters=*/[], /*automaticPrinters=*/[],
         /*discoveredPrinters=*/[], /*printServerPrinters=*/[]);
 
-    cupsPrintersBrowserProxy =
-        new printerBrowserProxy.TestCupsPrintersBrowserProxy();
+    cupsPrintersBrowserProxy = new TestCupsPrintersBrowserProxy();
 
-    settings.CupsPrintersBrowserProxyImpl.instance_ = cupsPrintersBrowserProxy;
+    CupsPrintersBrowserProxyImpl.instance_ = cupsPrintersBrowserProxy;
 
     PolymerTest.clearBody();
-    settings.Router.getInstance().navigateTo(settings.routes.CUPS_PRINTERS);
+    Router.getInstance().navigateTo(routes.CUPS_PRINTERS);
 
     page = document.createElement('settings-cups-printers');
     document.body.appendChild(page);
@@ -1222,7 +1215,7 @@
     dialog = page.$$('settings-cups-add-printer-dialog');
     assertTrue(!!dialog);
 
-    Polymer.dom.flush();
+    flush();
   });
 
   teardown(function() {
@@ -1270,18 +1263,18 @@
     // Open the add manual printe dialog.
     assertTrue(!!page);
     dialog.open();
-    Polymer.dom.flush();
+    flush();
 
     const addPrinterDialog = dialog.$$('add-printer-manually-dialog');
     // Switch to Add print server dialog.
     addPrinterDialog.$$('#print-server-button').click();
-    Polymer.dom.flush();
+    flush();
     const printServerDialog = dialog.$$('add-print-server-dialog');
     assertTrue(!!printServerDialog);
 
-    Polymer.dom.flush();
+    flush();
     cupsPrintersBrowserProxy.setQueryPrintServerResult(error);
-    return test_util.flushTasks().then(() => {
+    return flushTasks().then(() => {
       // Fill dialog with the server address.
       const address = printServerDialog.$$('#printServerAddressInput');
       assertTrue(!!address);
@@ -1332,15 +1325,13 @@
     cupsPrintersBrowserProxy.printServerPrinters =
         /** @type{!CupsPrintServerPrintersInfo} */ ({
           printerList: [
-            cups_printer_test_util.createCupsPrinterInfo(
-                'nameA', 'serverAddress', 'idA'),
-            cups_printer_test_util.createCupsPrinterInfo(
-                'nameB', 'serverAddress', 'idB')
+            createCupsPrinterInfo('nameA', 'serverAddress', 'idA'),
+            createCupsPrinterInfo('nameB', 'serverAddress', 'idB')
           ]
         });
     return addPrintServer('serverAddress', PrintServerResult.NO_ERRORS)
         .then(() => {
-          Polymer.dom.flush();
+          flush();
           verifyToastMessage(
               'printServerFoundManyPrinters', /*numPrinters=*/ 2);
           assertEquals(2, entryManager.printServerPrinters.length);
@@ -1352,25 +1343,23 @@
     cupsPrintersBrowserProxy.printServerPrinters =
         /** @type{!CupsPrintServerPrintersInfo} */ ({
           printerList: [
-            cups_printer_test_util.createCupsPrinterInfo(
-                'nameA', 'serverAddress', 'idA'),
-            cups_printer_test_util.createCupsPrinterInfo(
-                'nameB', 'serverAddress', 'idB')
+            createCupsPrinterInfo('nameA', 'serverAddress', 'idA'),
+            createCupsPrinterInfo('nameB', 'serverAddress', 'idB')
           ]
         });
 
-    return test_util.flushTasks()
+    return flushTasks()
         .then(() => {
           // Simulate that a print server was queried previously.
           setEntryManagerPrinters(
               /*savedPrinters=*/[], /*nearbyPrinters=*/[],
               /*discoveredPrinters=*/[], [
-                cups_printer_test_util.createPrinterListEntry(
+                createPrinterListEntry(
                     'nameA', 'serverAddress', 'idA', PrinterType.PRINTSERVER),
-                cups_printer_test_util.createPrinterListEntry(
+                createPrinterListEntry(
                     'nameB', 'serverAddress', 'idB', PrinterType.PRINTSERVER)
               ]);
-          Polymer.dom.flush();
+          flush();
           assertEquals(2, entryManager.printServerPrinters.length);
 
           // This will attempt to add duplicate print server printers.
@@ -1378,7 +1367,7 @@
           return addPrintServer('serverAddress', PrintServerResult.NO_ERRORS);
         })
         .then(() => {
-          Polymer.dom.flush();
+          flush();
 
           verifyToastMessage(
               'printServerFoundManyPrinters', /*numPrinters=*/ 2);
@@ -1396,38 +1385,35 @@
     cupsPrintersBrowserProxy.printServerPrinters =
         /** @type{} CupsPrintServerPrintersInfo*/ ({
           printerList: [
-            cups_printer_test_util.createCupsPrinterInfo(
-                'nameA', 'serverAddress', 'idA'),
-            cups_printer_test_util.createCupsPrinterInfo(
-                'nameB', 'serverAddress', 'idB')
+            createCupsPrinterInfo('nameA', 'serverAddress', 'idA'),
+            createCupsPrinterInfo('nameB', 'serverAddress', 'idB')
           ]
         });
 
-    return test_util.flushTasks().then(() => {
+    return flushTasks().then(() => {
       // Simulate that a print server was queried previously.
       setEntryManagerPrinters(
           /*savedPrinters=*/[], /*nearbyPrinters=*/[],
           /*discoveredPrinters=*/[], [
-            cups_printer_test_util.createPrinterListEntry(
+            createPrinterListEntry(
                 'nameA', 'serverAddress', 'idA', PrinterType.PRINTSERVER),
-            cups_printer_test_util.createPrinterListEntry(
+            createPrinterListEntry(
                 'nameB', 'serverAddress', 'idB', PrinterType.PRINTSERVER)
           ]);
-      Polymer.dom.flush();
+      flush();
       assertEquals(2, entryManager.printServerPrinters.length);
 
       // Simulate adding a saved printer.
-      entryManager.setSavedPrintersList(
-          [cups_printer_test_util.createPrinterListEntry(
-              'nameA', 'serverAddress', 'idA', PrinterType.SAVED)]);
-      Polymer.dom.flush();
+      entryManager.setSavedPrintersList([createPrinterListEntry(
+          'nameA', 'serverAddress', 'idA', PrinterType.SAVED)]);
+      flush();
 
       // Simulate the underlying model changes. Nearby printers are also
       // updated after changes to saved printers.
       cr.webUIListenerCallback(
           'on-nearby-printers-changed', /*automaticPrinter=*/[],
           /*discoveredPrinters=*/[]);
-      Polymer.dom.flush();
+      flush();
 
       // Verify that we now only have 1 printer in print server printers
       // list.
@@ -1447,7 +1433,7 @@
         /** @type{} CupsPrintServerPrintersInfo*/ ({printerList: []});
     return addPrintServer('serverAddress', PrintServerResult.INCORRECT_URL)
         .then(() => {
-          Polymer.dom.flush();
+          flush();
           const printServerDialog = getPrintServerDialog(page);
           // Assert that the dialog did not close on errors.
           assertTrue(!!printServerDialog);
@@ -1461,7 +1447,7 @@
         /** @type{} CupsPrintServerPrintersInfo*/ ({printerList: []});
     return addPrintServer('serverAddress', PrintServerResult.CONNECTION_ERROR)
         .then(() => {
-          Polymer.dom.flush();
+          flush();
           verifyErrorMessage('printServerConnectionError');
         });
   });
@@ -1472,7 +1458,7 @@
     return addPrintServer(
                'serverAddress', PrintServerResult.CANNOT_PARSE_IPP_RESPONSE)
         .then(() => {
-          Polymer.dom.flush();
+          flush();
           verifyErrorMessage('printServerConfigurationErrorMessage');
         });
   });
@@ -1482,7 +1468,7 @@
         /** @type{} CupsPrintServerPrintersInfo*/ ({printerList: []});
     return addPrintServer('serverAddress', PrintServerResult.HTTP_ERROR)
         .then(() => {
-          Polymer.dom.flush();
+          flush();
           verifyErrorMessage('printServerConfigurationErrorMessage');
         });
   });
diff --git a/chrome/test/data/webui/settings/chromeos/cups_printer_test_utils.js b/chrome/test/data/webui/settings/chromeos/cups_printer_test_utils.js
index b723d3e..c9604b0 100644
--- a/chrome/test/data/webui/settings/chromeos/cups_printer_test_utils.js
+++ b/chrome/test/data/webui/settings/chromeos/cups_printer_test_utils.js
@@ -2,19 +2,51 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.define('cups_printer_test_util', function() {
-  /**
-   * @param {string} printerName
-   * @param {string} printerAddress
-   * @param {string} printerId
-   * @param {boolean} isManaged
-   * @return {!CupsPrinterInfo}
-   * @private
-   */
-  /* #export */ function createCupsPrinterInfo(
-      printerName, printerAddress, printerId, isManaged = false) {
-    const printer = {
-      isManaged: isManaged,
+/**
+ * @param {string} printerName
+ * @param {string} printerAddress
+ * @param {string} printerId
+ * @param {boolean} isManaged
+ * @return {!CupsPrinterInfo}
+ * @private
+ */
+export function createCupsPrinterInfo(
+    printerName, printerAddress, printerId, isManaged = false) {
+  const printer = {
+    isManaged: isManaged,
+    ppdManufacturer: '',
+    ppdModel: '',
+    printerAddress: printerAddress,
+    printerDescription: '',
+    printerId: printerId,
+    printerMakeAndModel: '',
+    printerName: printerName,
+    printerPPDPath: '',
+    printerPpdReference: {
+      userSuppliedPpdUrl: '',
+      effectiveMakeAndModel: '',
+      autoconf: false,
+    },
+    printerProtocol: 'ipp',
+    printerQueue: 'moreinfohere',
+    printerStatus: '',
+    printServerUri: '',
+  };
+  return printer;
+}
+
+/**
+ * Helper function that creates a new PrinterListEntry.
+ * @param {string} printerName
+ * @param {string} printerAddress
+ * @param {string} printerId
+ * @param {string} printerType
+ * @return {!PrinterListEntry}
+ */
+export function createPrinterListEntry(
+    printerName, printerAddress, printerId, printerType) {
+  const entry = {
+    printerInfo: {
       ppdManufacturer: '',
       ppdModel: '',
       printerAddress: printerAddress,
@@ -32,61 +64,21 @@
       printerQueue: 'moreinfohere',
       printerStatus: '',
       printServerUri: '',
-    };
-    return printer;
-  }
-
-  /**
-   * Helper function that creates a new PrinterListEntry.
-   * @param {string} printerName
-   * @param {string} printerAddress
-   * @param {string} printerId
-   * @param {string} printerType
-   * @return {!PrinterListEntry}
-   */
-  /* #export */ function createPrinterListEntry(
-      printerName, printerAddress, printerId, printerType) {
-    const entry = {
-      printerInfo: {
-        ppdManufacturer: '',
-        ppdModel: '',
-        printerAddress: printerAddress,
-        printerDescription: '',
-        printerId: printerId,
-        printerMakeAndModel: '',
-        printerName: printerName,
-        printerPPDPath: '',
-        printerPpdReference: {
-          userSuppliedPpdUrl: '',
-          effectiveMakeAndModel: '',
-          autoconf: false,
-        },
-        printerProtocol: 'ipp',
-        printerQueue: 'moreinfohere',
-        printerStatus: '',
-        printServerUri: '',
-      },
-      printerType: printerType,
-    };
-    return entry;
-  }
-
-  /**
-   * Helper method to pull an array of CupsPrinterEntry out of a
-   * |printersElement|.
-   * @param {!HTMLElement} printersElement
-   * @return {!Array<!HTMLElement>}
-   * @private
-   */
-  /* #export */ function getPrinterEntries(printersElement) {
-    const entryList = printersElement.$$('#printerEntryList');
-    return entryList.querySelectorAll(
-        'settings-cups-printers-entry:not([hidden])');
-  }
-  // #cr_define_end
-  return {
-    createCupsPrinterInfo: createCupsPrinterInfo,
-    getPrinterEntries: getPrinterEntries,
-    createPrinterListEntry: createPrinterListEntry,
+    },
+    printerType: printerType,
   };
-});
+  return entry;
+}
+
+/**
+ * Helper method to pull an array of CupsPrinterEntry out of a
+ * |printersElement|.
+ * @param {!HTMLElement} printersElement
+ * @return {!Array<!HTMLElement>}
+ * @private
+ */
+export function getPrinterEntries(printersElement) {
+  const entryList = printersElement.$$('#printerEntryList');
+  return entryList.querySelectorAll(
+      'settings-cups-printers-entry:not([hidden])');
+}
diff --git a/chrome/test/data/webui/settings/chromeos/device_page_tests.js b/chrome/test/data/webui/settings/chromeos/device_page_tests.js
index 5f9001b..eb3e07c 100644
--- a/chrome/test/data/webui/settings/chromeos/device_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/device_page_tests.js
@@ -2,2761 +2,2598 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// clang-format off
-// #import 'chrome://os-settings/chromeos/os_settings.js';
-// #import 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
+import 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
 
-// #import {setDisplayApiForTesting, Router, routes, DevicePageBrowserProxyImpl, IdleBehavior, NoteAppLockScreenSupport, LidClosedBehavior, StorageSpaceState} from 'chrome://os-settings/chromeos/os_settings.js';
-// #import {FakeSystemDisplay} from './fake_system_display.m.js';
-// #import {assert} from 'chrome://resources/js/assert.m.js';
-// #import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
-// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-// #import {waitAfterNextRender} from 'chrome://test/test_util.js';
-// #import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-// #import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-// #import {flushTasks} from 'chrome://test/test_util.js';
-// clang-format on
+import {DevicePageBrowserProxyImpl, IdleBehavior, LidClosedBehavior, NoteAppLockScreenSupport, Router, routes, setDisplayApiForTesting, StorageSpaceState} from 'chrome://os-settings/chromeos/os_settings.js';
+import {assert} from 'chrome://resources/js/assert.m.js';
+import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
+import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {flushTasks, waitAfterNextRender} from 'chrome://test/test_util.js';
 
-cr.define('device_page_tests', function() {
-  /** @enum {string} */
-  const TestNames = {
-    DevicePage: 'device page',
-    Display: 'display',
-    Keyboard: 'keyboard',
-    NightLight: 'night light',
-    Pointers: 'pointers',
-    PointingStick: 'pointing stick',
-    Power: 'power',
-    Storage: 'storage',
-    Stylus: 'stylus',
-    KeyboardArrangementDisabled: 'arrow_key_arrangement_disabled',
-  };
+import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
+
+import {FakeSystemDisplay} from './fake_system_display.m.js';
+
+/** @enum {string} */
+const TestNames = {
+  DevicePage: 'device page',
+  Display: 'display',
+  Keyboard: 'keyboard',
+  NightLight: 'night light',
+  Pointers: 'pointers',
+  PointingStick: 'pointing stick',
+  Power: 'power',
+  Storage: 'storage',
+  Stylus: 'stylus',
+  KeyboardArrangementDisabled: 'arrow_key_arrangement_disabled',
+};
+
+/**
+ * @constructor
+ * @implements {DevicePageBrowserProxy}
+ */
+function TestDevicePageBrowserProxy() {
+  this.keyboardShortcutViewerShown_ = 0;
+  this.updatePowerStatusCalled_ = 0;
+  this.requestPowerManagementSettingsCalled_ = 0;
+  this.requestNoteTakingApps_ = 0;
+  this.onNoteTakingAppsUpdated_ = null;
+
+  this.androidAppsReceived_ = false;
+  this.noteTakingApps_ = [];
+  this.setPreferredAppCount_ = 0;
+  this.setAppOnLockScreenCount_ = 0;
+
+  this.lastHighlightedDisplayId_ = '-1';
+}
+
+TestDevicePageBrowserProxy.prototype = {
+  /** override */
+  initializePointers: function() {
+    // Enable mouse and touchpad.
+    webUIListenerCallback('has-mouse-changed', true);
+    webUIListenerCallback('has-pointing-stick-changed', true);
+    webUIListenerCallback('has-touchpad-changed', true);
+    webUIListenerCallback('has-haptic-touchpad-changed', true);
+  },
+
+  /** override */
+  initializeStylus: function() {
+    // Enable stylus.
+    webUIListenerCallback('has-stylus-changed', true);
+  },
+
+  /** override */
+  initializeKeyboard: function() {},
+
+  /** override */
+  showKeyboardShortcutViewer: function() {
+    this.keyboardShortcutViewerShown_++;
+  },
+
+  /** override */
+  updateAndroidEnabled: function() {},
+
+  /** @override */
+  updatePowerStatus: function() {
+    this.updatePowerStatusCalled_++;
+  },
+
+  /** @override */
+  setPowerSource: function(powerSourceId) {
+    this.powerSourceId_ = powerSourceId;
+  },
+
+  /** @override */
+  requestPowerManagementSettings: function() {
+    this.requestPowerManagementSettingsCalled_++;
+  },
+
+  /** @override */
+  setIdleBehavior: function(behavior, whenOnAc) {
+    if (whenOnAc) {
+      this.acIdleBehavior_ = behavior;
+    } else {
+      this.batteryIdleBehavior_ = behavior;
+    }
+  },
+
+  /** @override */
+  setLidClosedBehavior: function(behavior) {
+    this.lidClosedBehavior_ = behavior;
+  },
+
+  /** @override */
+  setNoteTakingAppsUpdatedCallback: function(callback) {
+    this.onNoteTakingAppsUpdated_ = callback;
+  },
+
+  /** @override */
+  requestNoteTakingApps: function() {
+    this.requestNoteTakingApps_++;
+  },
+
+  /** @override */
+  setPreferredNoteTakingApp: function(appId) {
+    ++this.setPreferredAppCount_;
+
+    let changed = false;
+    this.noteTakingApps_.forEach(function(app) {
+      changed = changed || app.preferred !== (app.value === appId);
+      app.preferred = app.value === appId;
+    });
+
+    if (changed) {
+      this.scheduleLockScreenAppsUpdated_();
+    }
+  },
+
+  /** @override */
+  setPreferredNoteTakingAppEnabledOnLockScreen: function(enabled) {
+    ++this.setAppOnLockScreenCount_;
+
+    this.noteTakingApps_.forEach(function(app) {
+      if (enabled) {
+        if (app.preferred) {
+          assertEquals(
+              NoteAppLockScreenSupport.SUPPORTED, app.lockScreenSupport);
+        }
+        if (app.lockScreenSupport === NoteAppLockScreenSupport.SUPPORTED) {
+          app.lockScreenSupport = NoteAppLockScreenSupport.ENABLED;
+        }
+      } else {
+        if (app.preferred) {
+          assertEquals(NoteAppLockScreenSupport.ENABLED, app.lockScreenSupport);
+        }
+        if (app.lockScreenSupport === NoteAppLockScreenSupport.ENABLED) {
+          app.lockScreenSupport = NoteAppLockScreenSupport.SUPPORTED;
+        }
+      }
+    });
+
+    this.scheduleLockScreenAppsUpdated_();
+  },
+
+  /** @override */
+  highlightDisplay: function(id) {
+    this.lastHighlightedDisplayId_ = id;
+  },
+
+  /** @override */
+  updateStorageInfo: function() {},
+
+  // Test interface:
+  /**
+   * Sets whether the app list contains Android apps.
+   * @param {boolean} Whether the list of Android note-taking apps was
+   *     received.
+   */
+  setAndroidAppsReceived: function(received) {
+    this.androidAppsReceived_ = received;
+
+    this.scheduleLockScreenAppsUpdated_();
+  },
 
   /**
-   * @constructor
-   * @implements {settings.DevicePageBrowserProxy}
+   * @return {string} App id of the app currently selected as preferred.
    */
-  function TestDevicePageBrowserProxy() {
-    this.keyboardShortcutViewerShown_ = 0;
-    this.updatePowerStatusCalled_ = 0;
-    this.requestPowerManagementSettingsCalled_ = 0;
-    this.requestNoteTakingApps_ = 0;
-    this.onNoteTakingAppsUpdated_ = null;
+  getPreferredNoteTakingAppId: function() {
+    const app = this.noteTakingApps_.find(function(existing) {
+      return existing.preferred;
+    });
 
-    this.androidAppsReceived_ = false;
-    this.noteTakingApps_ = [];
-    this.setPreferredAppCount_ = 0;
-    this.setAppOnLockScreenCount_ = 0;
+    return app ? app.value : '';
+  },
 
-    this.lastHighlightedDisplayId_ = '-1';
+  /**
+   * @return {NoteAppLockScreenSupport | undefined} The lock screen
+   *     support state of the app currently selected as preferred.
+   */
+  getPreferredAppLockScreenState: function() {
+    const app = this.noteTakingApps_.find(function(existing) {
+      return existing.preferred;
+    });
+
+    return app ? app.lockScreenSupport : undefined;
+  },
+
+  /**
+   * Sets the current list of known note taking apps.
+   * @param {Array<!NoteAppInfo>} The list of apps to set.
+   */
+  setNoteTakingApps: function(apps) {
+    this.noteTakingApps_ = apps;
+    this.scheduleLockScreenAppsUpdated_();
+  },
+
+  /**
+   * Adds an app to the list of known note-taking apps.
+   * @param {!NoteAppInfo}
+   */
+  addNoteTakingApp: function(app) {
+    assert(!this.noteTakingApps_.find(function(existing) {
+      return existing.value === app.value;
+    }));
+
+    this.noteTakingApps_.push(app);
+    this.scheduleLockScreenAppsUpdated_();
+  },
+
+  /**
+   * Invokes the registered note taking apps update callback.
+   * @private
+   */
+  scheduleLockScreenAppsUpdated_: function() {
+    this.onNoteTakingAppsUpdated_(
+        this.noteTakingApps_.map(function(app) {
+          return Object.assign({}, app);
+        }),
+        !this.androidAppsReceived_);
   }
+};
 
-  TestDevicePageBrowserProxy.prototype = {
-    /** override */
-    initializePointers: function() {
-      // Enable mouse and touchpad.
-      cr.webUIListenerCallback('has-mouse-changed', true);
-      cr.webUIListenerCallback('has-pointing-stick-changed', true);
-      cr.webUIListenerCallback('has-touchpad-changed', true);
-      cr.webUIListenerCallback('has-haptic-touchpad-changed', true);
-    },
-
-    /** override */
-    initializeStylus: function() {
-      // Enable stylus.
-      cr.webUIListenerCallback('has-stylus-changed', true);
-    },
-
-    /** override */
-    initializeKeyboard: function() {},
-
-    /** override */
-    showKeyboardShortcutViewer: function() {
-      this.keyboardShortcutViewerShown_++;
-    },
-
-    /** override */
-    updateAndroidEnabled: function() {},
-
-    /** @override */
-    updatePowerStatus: function() {
-      this.updatePowerStatusCalled_++;
-    },
-
-    /** @override */
-    setPowerSource: function(powerSourceId) {
-      this.powerSourceId_ = powerSourceId;
-    },
-
-    /** @override */
-    requestPowerManagementSettings: function() {
-      this.requestPowerManagementSettingsCalled_++;
-    },
-
-    /** @override */
-    setIdleBehavior: function(behavior, whenOnAc) {
-      if (whenOnAc) {
-        this.acIdleBehavior_ = behavior;
-      } else {
-        this.batteryIdleBehavior_ = behavior;
-      }
-    },
-
-    /** @override */
-    setLidClosedBehavior: function(behavior) {
-      this.lidClosedBehavior_ = behavior;
-    },
-
-    /** @override */
-    setNoteTakingAppsUpdatedCallback: function(callback) {
-      this.onNoteTakingAppsUpdated_ = callback;
-    },
-
-    /** @override */
-    requestNoteTakingApps: function() {
-      this.requestNoteTakingApps_++;
-    },
-
-    /** @override */
-    setPreferredNoteTakingApp: function(appId) {
-      ++this.setPreferredAppCount_;
-
-      let changed = false;
-      this.noteTakingApps_.forEach(function(app) {
-        changed = changed || app.preferred !== (app.value === appId);
-        app.preferred = app.value === appId;
-      });
-
-      if (changed) {
-        this.scheduleLockScreenAppsUpdated_();
-      }
-    },
-
-    /** @override */
-    setPreferredNoteTakingAppEnabledOnLockScreen: function(enabled) {
-      ++this.setAppOnLockScreenCount_;
-
-      this.noteTakingApps_.forEach(function(app) {
-        if (enabled) {
-          if (app.preferred) {
-            assertEquals(
-                settings.NoteAppLockScreenSupport.SUPPORTED,
-                app.lockScreenSupport);
-          }
-          if (app.lockScreenSupport ===
-              settings.NoteAppLockScreenSupport.SUPPORTED) {
-            app.lockScreenSupport = settings.NoteAppLockScreenSupport.ENABLED;
-          }
-        } else {
-          if (app.preferred) {
-            assertEquals(
-                settings.NoteAppLockScreenSupport.ENABLED,
-                app.lockScreenSupport);
-          }
-          if (app.lockScreenSupport ===
-              settings.NoteAppLockScreenSupport.ENABLED) {
-            app.lockScreenSupport = settings.NoteAppLockScreenSupport.SUPPORTED;
-          }
-        }
-      });
-
-      this.scheduleLockScreenAppsUpdated_();
-    },
-
-    /** @override */
-    highlightDisplay: function(id) {
-      this.lastHighlightedDisplayId_ = id;
-    },
-
-    /** @override */
-    updateStorageInfo: function() {},
-
-    // Test interface:
-    /**
-     * Sets whether the app list contains Android apps.
-     * @param {boolean} Whether the list of Android note-taking apps was
-     *     received.
-     */
-    setAndroidAppsReceived: function(received) {
-      this.androidAppsReceived_ = received;
-
-      this.scheduleLockScreenAppsUpdated_();
-    },
-
-    /**
-     * @return {string} App id of the app currently selected as preferred.
-     */
-    getPreferredNoteTakingAppId: function() {
-      const app = this.noteTakingApps_.find(function(existing) {
-        return existing.preferred;
-      });
-
-      return app ? app.value : '';
-    },
-
-    /**
-     * @return {settings.NoteAppLockScreenSupport | undefined} The lock screen
-     *     support state of the app currently selected as preferred.
-     */
-    getPreferredAppLockScreenState: function() {
-      const app = this.noteTakingApps_.find(function(existing) {
-        return existing.preferred;
-      });
-
-      return app ? app.lockScreenSupport : undefined;
-    },
-
-    /**
-     * Sets the current list of known note taking apps.
-     * @param {Array<!settings.NoteAppInfo>} The list of apps to set.
-     */
-    setNoteTakingApps: function(apps) {
-      this.noteTakingApps_ = apps;
-      this.scheduleLockScreenAppsUpdated_();
-    },
-
-    /**
-     * Adds an app to the list of known note-taking apps.
-     * @param {!settings.NoteAppInfo}
-     */
-    addNoteTakingApp: function(app) {
-      assert(!this.noteTakingApps_.find(function(existing) {
-        return existing.value === app.value;
-      }));
-
-      this.noteTakingApps_.push(app);
-      this.scheduleLockScreenAppsUpdated_();
-    },
-
-    /**
-     * Invokes the registered note taking apps update callback.
-     * @private
-     */
-    scheduleLockScreenAppsUpdated_: function() {
-      this.onNoteTakingAppsUpdated_(
-          this.noteTakingApps_.map(function(app) {
-            return Object.assign({}, app);
-          }),
-          !this.androidAppsReceived_);
-    }
-  };
-
-  function getFakePrefs() {
-    return {
-      ash: {
-        ambient_color: {
-          enabled: {
-            key: 'ash.ambient_color.enabled',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: false,
-          },
-        },
-        night_light: {
-          enabled: {
-            key: 'ash.night_light.enabled',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: false,
-          },
-          color_temperature: {
-            key: 'ash.night_light.color_temperature',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 0,
-          },
-          schedule_type: {
-            key: 'ash.night_light.schedule_type',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 0,
-          },
-          custom_start_time: {
-            key: 'ash.night_light.custom_start_time',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 0,
-          },
-          custom_end_time: {
-            key: 'ash.night_light.custom_end_time',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 0,
-          },
+function getFakePrefs() {
+  return {
+    ash: {
+      ambient_color: {
+        enabled: {
+          key: 'ash.ambient_color.enabled',
+          type: chrome.settingsPrivate.PrefType.BOOLEAN,
+          value: false,
         },
       },
-      settings: {
-        // TODO(afakhry): Write tests to validate the Night Light slider
-        // behavior with 24-hour setting.
-        clock: {
-          use_24hour_clock: {
-            key: 'settings.clock.use_24hour_clock',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: false,
-          },
-        },
-        enable_stylus_tools: {
-          key: 'settings.enable_stylus_tools',
+      night_light: {
+        enabled: {
+          key: 'ash.night_light.enabled',
           type: chrome.settingsPrivate.PrefType.BOOLEAN,
           value: false,
         },
-        launch_palette_on_eject_event: {
-          key: 'settings.launch_palette_on_eject_event',
+        color_temperature: {
+          key: 'ash.night_light.color_temperature',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 0,
+        },
+        schedule_type: {
+          key: 'ash.night_light.schedule_type',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 0,
+        },
+        custom_start_time: {
+          key: 'ash.night_light.custom_start_time',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 0,
+        },
+        custom_end_time: {
+          key: 'ash.night_light.custom_end_time',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 0,
+        },
+      },
+    },
+    settings: {
+      // TODO(afakhry): Write tests to validate the Night Light slider
+      // behavior with 24-hour setting.
+      clock: {
+        use_24hour_clock: {
+          key: 'settings.clock.use_24hour_clock',
           type: chrome.settingsPrivate.PrefType.BOOLEAN,
           value: false,
         },
-        restore_last_lock_screen_note: {
-          key: 'settings.restore_last_lock_screen_note',
+      },
+      enable_stylus_tools: {
+        key: 'settings.enable_stylus_tools',
+        type: chrome.settingsPrivate.PrefType.BOOLEAN,
+        value: false,
+      },
+      launch_palette_on_eject_event: {
+        key: 'settings.launch_palette_on_eject_event',
+        type: chrome.settingsPrivate.PrefType.BOOLEAN,
+        value: false,
+      },
+      restore_last_lock_screen_note: {
+        key: 'settings.restore_last_lock_screen_note',
+        type: chrome.settingsPrivate.PrefType.BOOLEAN,
+        value: true,
+      },
+      touchpad: {
+        enable_tap_to_click: {
+          key: 'settings.touchpad.enable_tap_to_click',
           type: chrome.settingsPrivate.PrefType.BOOLEAN,
           value: true,
         },
-        touchpad: {
-          enable_tap_to_click: {
-            key: 'settings.touchpad.enable_tap_to_click',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: true,
-          },
-          enable_tap_dragging: {
-            key: 'settings.touchpad.enable_tap_dragging',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: false,
-          },
-          natural_scroll: {
-            key: 'settings.touchpad.natural_scroll',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: false,
-          },
-          acceleration: {
-            key: 'settings.touchpad.acceleration',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: true,
-          },
-          scroll_acceleration: {
-            key: 'settings.touchpad.scroll_acceleration',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: true,
-          },
-          sensitivity2: {
-            key: 'settings.touchpad.sensitivity2',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 3,
-          },
-          scroll_sensitivity: {
-            key: 'settings.touchpad.scroll_sensitivity',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 3,
-          },
-          haptic_feedback: {
-            key: 'settings.touchpad.haptic_feedback',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: true,
-          },
-          haptic_click_sensitivity: {
-            key: 'settings.touchpad.haptic_click_sensitivity',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 3,
-          },
+        enable_tap_dragging: {
+          key: 'settings.touchpad.enable_tap_dragging',
+          type: chrome.settingsPrivate.PrefType.BOOLEAN,
+          value: false,
         },
-        mouse: {
-          primary_right: {
-            key: 'settings.mouse.primary_right',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: false,
-          },
-          reverse_scroll: {
-            key: 'settings.mouse.reverse_scroll',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: false,
-          },
-          acceleration: {
-            key: 'settings.mouse.acceleration',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: true,
-          },
-          scroll_acceleration: {
-            key: 'settings.mouse.scroll_acceleration',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: true,
-          },
-          sensitivity2: {
-            key: 'settings.mouse.sensitivity2',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 4,
-          },
-          scroll_sensitivity: {
-            key: 'settings.mouse.scroll_sensitivity',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 4,
-          },
+        natural_scroll: {
+          key: 'settings.touchpad.natural_scroll',
+          type: chrome.settingsPrivate.PrefType.BOOLEAN,
+          value: false,
         },
-        pointing_stick: {
-          primary_right: {
-            key: 'settings.pointing_stick.primary_right',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: false,
-          },
-          acceleration: {
-            key: 'settings.pointing_stick.acceleration',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: true,
-          },
-          sensitivity: {
-            key: 'settings.pointing_stick.sensitivity',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 4,
-          },
+        acceleration: {
+          key: 'settings.touchpad.acceleration',
+          type: chrome.settingsPrivate.PrefType.BOOLEAN,
+          value: true,
         },
-        language: {
-          xkb_remap_search_key_to: {
-            key: 'settings.language.xkb_remap_search_key_to',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 0,
-          },
-          xkb_remap_control_key_to: {
-            key: 'settings.language.xkb_remap_control_key_to',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 1,
-          },
-          xkb_remap_alt_key_to: {
-            key: 'settings.language.xkb_remap_alt_key_to',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 2,
-          },
-          remap_caps_lock_key_to: {
-            key: 'settings.language.remap_caps_lock_key_to',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 4,
-          },
-          remap_escape_key_to: {
-            key: 'settings.language.remap_escape_key_to',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 5,
-          },
-          remap_backspace_key_to: {
-            key: 'settings.language.remap_backspace_key_to',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 6,
-          },
-          send_function_keys: {
-            key: 'settings.language.send_function_keys',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: false,
-          },
-          xkb_auto_repeat_enabled_r2: {
-            key: 'prefs.settings.language.xkb_auto_repeat_enabled_r2',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: true,
-          },
-          xkb_auto_repeat_delay_r2: {
-            key: 'settings.language.xkb_auto_repeat_delay_r2',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 500,
-          },
-          xkb_auto_repeat_interval_r2: {
-            key: 'settings.language.xkb_auto_repeat_interval_r2',
-            type: chrome.settingsPrivate.PrefType.NUMBER,
-            value: 500,
-          },
-        }
+        scroll_acceleration: {
+          key: 'settings.touchpad.scroll_acceleration',
+          type: chrome.settingsPrivate.PrefType.BOOLEAN,
+          value: true,
+        },
+        sensitivity2: {
+          key: 'settings.touchpad.sensitivity2',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 3,
+        },
+        scroll_sensitivity: {
+          key: 'settings.touchpad.scroll_sensitivity',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 3,
+        },
+        haptic_feedback: {
+          key: 'settings.touchpad.haptic_feedback',
+          type: chrome.settingsPrivate.PrefType.BOOLEAN,
+          value: true,
+        },
+        haptic_click_sensitivity: {
+          key: 'settings.touchpad.haptic_click_sensitivity',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 3,
+        },
+      },
+      mouse: {
+        primary_right: {
+          key: 'settings.mouse.primary_right',
+          type: chrome.settingsPrivate.PrefType.BOOLEAN,
+          value: false,
+        },
+        reverse_scroll: {
+          key: 'settings.mouse.reverse_scroll',
+          type: chrome.settingsPrivate.PrefType.BOOLEAN,
+          value: false,
+        },
+        acceleration: {
+          key: 'settings.mouse.acceleration',
+          type: chrome.settingsPrivate.PrefType.BOOLEAN,
+          value: true,
+        },
+        scroll_acceleration: {
+          key: 'settings.mouse.scroll_acceleration',
+          type: chrome.settingsPrivate.PrefType.BOOLEAN,
+          value: true,
+        },
+        sensitivity2: {
+          key: 'settings.mouse.sensitivity2',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 4,
+        },
+        scroll_sensitivity: {
+          key: 'settings.mouse.scroll_sensitivity',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 4,
+        },
+      },
+      pointing_stick: {
+        primary_right: {
+          key: 'settings.pointing_stick.primary_right',
+          type: chrome.settingsPrivate.PrefType.BOOLEAN,
+          value: false,
+        },
+        acceleration: {
+          key: 'settings.pointing_stick.acceleration',
+          type: chrome.settingsPrivate.PrefType.BOOLEAN,
+          value: true,
+        },
+        sensitivity: {
+          key: 'settings.pointing_stick.sensitivity',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 4,
+        },
+      },
+      language: {
+        xkb_remap_search_key_to: {
+          key: 'settings.language.xkb_remap_search_key_to',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 0,
+        },
+        xkb_remap_control_key_to: {
+          key: 'settings.language.xkb_remap_control_key_to',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 1,
+        },
+        xkb_remap_alt_key_to: {
+          key: 'settings.language.xkb_remap_alt_key_to',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 2,
+        },
+        remap_caps_lock_key_to: {
+          key: 'settings.language.remap_caps_lock_key_to',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 4,
+        },
+        remap_escape_key_to: {
+          key: 'settings.language.remap_escape_key_to',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 5,
+        },
+        remap_backspace_key_to: {
+          key: 'settings.language.remap_backspace_key_to',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 6,
+        },
+        send_function_keys: {
+          key: 'settings.language.send_function_keys',
+          type: chrome.settingsPrivate.PrefType.BOOLEAN,
+          value: false,
+        },
+        xkb_auto_repeat_enabled_r2: {
+          key: 'prefs.settings.language.xkb_auto_repeat_enabled_r2',
+          type: chrome.settingsPrivate.PrefType.BOOLEAN,
+          value: true,
+        },
+        xkb_auto_repeat_delay_r2: {
+          key: 'settings.language.xkb_auto_repeat_delay_r2',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 500,
+        },
+        xkb_auto_repeat_interval_r2: {
+          key: 'settings.language.xkb_auto_repeat_interval_r2',
+          type: chrome.settingsPrivate.PrefType.NUMBER,
+          value: 500,
+        },
       }
-    };
+    }
+  };
+}
+
+suite('SettingsDevicePage', function() {
+  /** @type {!SettingsDevicePage|undefined} */
+  let devicePage;
+
+  /** @type {!FakeSystemDisplay|undefined} */
+  let fakeSystemDisplay;
+
+  suiteSetup(function() {
+    // Disable animations so sub-pages open within one event loop.
+    testing.Test.disableAnimationsAndTransitions();
+  });
+
+  setup(function(done) {
+    fakeSystemDisplay = new FakeSystemDisplay();
+    setDisplayApiForTesting(fakeSystemDisplay);
+
+    PolymerTest.clearBody();
+    Router.getInstance().navigateTo(routes.BASIC);
+
+    devicePage = document.createElement('settings-device-page');
+    devicePage.prefs = getFakePrefs();
+    DevicePageBrowserProxyImpl.instance_ = new TestDevicePageBrowserProxy();
+
+    // settings-animated-pages expects a parent with data-page set.
+    const basicPage = document.createElement('div');
+    basicPage.dataset.page = 'basic';
+    basicPage.appendChild(devicePage);
+    document.body.appendChild(basicPage);
+
+    // Allow the light DOM to be distributed to settings-animated-pages.
+    setTimeout(done);
+  });
+
+  /** @return {!Promise<!HTMLElement>} */
+  function showAndGetDeviceSubpage(subpage, expectedRoute) {
+    const row = assert(devicePage.$$(`#main #${subpage}Row`));
+    row.click();
+    assertEquals(expectedRoute, Router.getInstance().getCurrentRoute());
+    const page = devicePage.$$('settings-' + subpage);
+    assert(page);
+    return Promise.resolve(page);
   }
 
-  suite('SettingsDevicePage', function() {
-    /** @type {!SettingsDevicePage|undefined} */
-    let devicePage;
+  /** @param {number} n The number of the display to add. */
+  function addDisplay(n) {
+    const display = {
+      id: 'fakeDisplayId' + n,
+      name: 'fakeDisplayName' + n,
+      mirroring: '',
+      isPrimary: n === 1,
+      isInternal: n === 1,
+      rotation: 0,
+      modes: [
+        {
+          deviceScaleFactor: 1.0,
+          widthInNativePixels: 1920,
+          heightInNativePixels: 1080,
+          width: 1920,
+          height: 1080,
+          refreshRate: 60,
+        },
+        {
+          deviceScaleFactor: 1.0,
+          widthInNativePixels: 1920,
+          heightInNativePixels: 1080,
+          width: 1920,
+          height: 1080,
+          refreshRate: 30,
+        },
+        {
+          deviceScaleFactor: 1.0,
+          widthInNativePixels: 3000,
+          heightInNativePixels: 2000,
+          width: 3000,
+          height: 2000,
+          refreshRate: 45,
+        },
+        {
+          deviceScaleFactor: 1.0,
+          widthInNativePixels: 3000,
+          heightInNativePixels: 2000,
+          width: 3000,
+          height: 2000,
+          refreshRate: 75,
+        },
+        // Include 3 copies of 3000x2000 mode to emulate duplicated modes
+        // reported by some monitors.  Only one is marked 'isNative'.
+        {
+          deviceScaleFactor: 1.0,
+          widthInNativePixels: 3000,
+          heightInNativePixels: 2000,
+          width: 3000,
+          height: 2000,
+          refreshRate: 100,
+        },
+        {
+          isNative: true,
+          deviceScaleFactor: 1.0,
+          widthInNativePixels: 3000,
+          heightInNativePixels: 2000,
+          width: 3000,
+          height: 2000,
+          refreshRate: 100,
+        },
+        {
+          deviceScaleFactor: 1.0,
+          widthInNativePixels: 3000,
+          heightInNativePixels: 2000,
+          width: 3000,
+          height: 2000,
+          refreshRate: 100,
+        }
+      ],
+      bounds: {
+        left: 0,
+        top: 0,
+        width: 1920,
+        height: 1080,
+      },
+      availableDisplayZoomFactors: [1, 1.25, 1.5, 2],
+    };
+    fakeSystemDisplay.addDisplayForTest(display);
+  }
 
-    /** @type {!FakeSystemDisplay|undefined} */
-    let fakeSystemDisplay;
+  /**
+   * @param {!Array<!IdleBehavior>} possibleAcIdleBehaviors
+   * @param {!Array<!IdleBehavior>} possibleBatteryIdleBehaviors
+   * @param {IdleBehavior} currAcIdleBehavior
+   * @param {IdleBehavior} currBatteryIdleBehavior
+   * @param {boolean} acIdleManaged
+   * @param {boolean} batteryIdleManaged
+   * @param {LidClosedBehavior} lidClosedBehavior
+   * @param {boolean} lidClosedControlled
+   * @param {boolean} hasLid
+   */
+  function sendPowerManagementSettings(
+      possibleAcIdleBehaviors, possibleBatteryIdleBehaviors, currAcIdleBehavior,
+      currBatteryIdleBehavior, acIdleManaged, batteryIdleManaged,
+      lidClosedBehavior, lidClosedControlled, hasLid) {
+    webUIListenerCallback('power-management-settings-changed', {
+      possibleAcIdleBehaviors: possibleAcIdleBehaviors,
+      possibleBatteryIdleBehaviors: possibleBatteryIdleBehaviors,
+      currentAcIdleBehavior: currAcIdleBehavior,
+      currentBatteryIdleBehavior: currBatteryIdleBehavior,
+      acIdleManaged: acIdleManaged,
+      batteryIdleManaged: batteryIdleManaged,
+      lidClosedBehavior: lidClosedBehavior,
+      lidClosedControlled: lidClosedControlled,
+      hasLid: hasLid,
+    });
+    flush();
+  }
+
+  /**
+   * @param {!HTMLElement} select
+   * @param {!value} string
+   */
+  function selectValue(select, value) {
+    select.value = value;
+    select.dispatchEvent(new CustomEvent('change'));
+    flush();
+  }
+
+  /**
+   * @param {!HTMLElement} pointersPage
+   * @param {boolean} expected
+   */
+  function expectReverseScrollValue(pointersPage, expected) {
+    const reverseScrollToggle =
+        pointersPage.$$('#enableReverseScrollingToggle');
+    assertEquals(expected, reverseScrollToggle.checked);
+    expectEquals(
+        expected, devicePage.prefs.settings.touchpad.natural_scroll.value);
+  }
+
+  /**
+   * Returns whether the element both exists and is visible.
+   * @param {?Element} element
+   * @return {boolean}
+   */
+  function isVisible(element) {
+    // offsetWidth and offsetHeight reflect more ways that an element could be
+    // hidden, compared to checking the hidden attribute directly.
+    return !!element && element.offsetWidth > 0 && element.offsetHeight > 0;
+  }
+
+  /**
+   * Checks that the deep link to a setting focuses the correct element.
+   * @param {!Route} route
+   * @param {!string} settingId
+   * @param {!Element} deepLinkElement The element that should be focused by
+   *                                   the deep link
+   * @param {!string} elementDesc A human-readable description of the element,
+   *                              for assertion messages
+   */
+  async function checkDeepLink(route, settingId, deepLinkElement, elementDesc) {
+    const params = new URLSearchParams();
+    params.append('settingId', settingId);
+    Router.getInstance().navigateTo(route, params);
+
+    await waitAfterNextRender(deepLinkElement);
+    assertEquals(
+        deepLinkElement, getDeepActiveElement(),
+        `${elementDesc} should be focused for settingId=${settingId}.`);
+  }
+
+  test(assert(TestNames.DevicePage), function() {
+    expectTrue(isVisible(devicePage.$$('#pointersRow')));
+    expectTrue(isVisible(devicePage.$$('#keyboardRow')));
+    expectTrue(isVisible(devicePage.$$('#displayRow')));
+
+    webUIListenerCallback('has-mouse-changed', false);
+    expectTrue(isVisible(devicePage.$$('#pointersRow')));
+    webUIListenerCallback('has-pointing-stick-changed', false);
+    expectTrue(isVisible(devicePage.$$('#pointersRow')));
+    webUIListenerCallback('has-touchpad-changed', false);
+    expectFalse(isVisible(devicePage.$$('#pointersRow')));
+    webUIListenerCallback('has-mouse-changed', true);
+    expectTrue(isVisible(devicePage.$$('#pointersRow')));
+  });
+
+  suite(assert(TestNames.Pointers), function() {
+    let pointersPage;
+
+    setup(function() {
+      return showAndGetDeviceSubpage('pointers', routes.POINTERS)
+          .then(function(page) {
+            pointersPage = page;
+          });
+    });
+
+    test('subpage responds to pointer attach/detach', function() {
+      assertEquals(routes.POINTERS, Router.getInstance().getCurrentRoute());
+      assertTrue(isVisible(pointersPage.$$('#mouse')));
+      assertTrue(isVisible(pointersPage.$$('#mouse h2')));
+      assertTrue(isVisible(pointersPage.$$('#pointingStick')));
+      assertTrue(isVisible(pointersPage.$$('#pointingStick h2')));
+      assertTrue(isVisible(pointersPage.$$('#touchpad')));
+      assertTrue(isVisible(pointersPage.$$('#touchpad h2')));
+
+      webUIListenerCallback('has-touchpad-changed', false);
+      assertEquals(routes.POINTERS, Router.getInstance().getCurrentRoute());
+      assertTrue(isVisible(pointersPage.$$('#mouse')));
+      assertTrue(isVisible(pointersPage.$$('#mouse h2')));
+      assertTrue(isVisible(pointersPage.$$('#pointingStick')));
+      assertTrue(isVisible(pointersPage.$$('#pointingStick h2')));
+      assertFalse(isVisible(pointersPage.$$('#touchpad')));
+      assertFalse(isVisible(pointersPage.$$('#touchpad h2')));
+
+      webUIListenerCallback('has-pointing-stick-changed', false);
+      assertEquals(routes.POINTERS, Router.getInstance().getCurrentRoute());
+      assertTrue(isVisible(pointersPage.$$('#mouse')));
+      assertFalse(isVisible(pointersPage.$$('#mouse h2')));
+      assertFalse(isVisible(pointersPage.$$('#pointingStick')));
+      assertFalse(isVisible(pointersPage.$$('#pointingStick h2')));
+      assertFalse(isVisible(pointersPage.$$('#touchpad')));
+      assertFalse(isVisible(pointersPage.$$('#touchpad h2')));
+
+      webUIListenerCallback('has-mouse-changed', false);
+      assertEquals(routes.DEVICE, Router.getInstance().getCurrentRoute());
+      assertFalse(isVisible(devicePage.$$('#main #pointersRow')));
+
+      webUIListenerCallback('has-touchpad-changed', true);
+      assertTrue(isVisible(devicePage.$$('#main #pointersRow')));
+
+      return showAndGetDeviceSubpage('pointers', routes.POINTERS)
+          .then(function(page) {
+            assertFalse(isVisible(pointersPage.$$('#mouse')));
+            assertFalse(isVisible(pointersPage.$$('#mouse h2')));
+            assertFalse(isVisible(pointersPage.$$('#pointingStick')));
+            assertFalse(isVisible(pointersPage.$$('#pointingStick h2')));
+            assertTrue(isVisible(pointersPage.$$('#touchpad')));
+            assertFalse(isVisible(pointersPage.$$('#touchpad h2')));
+
+            webUIListenerCallback('has-mouse-changed', true);
+            assertEquals(
+                routes.POINTERS, Router.getInstance().getCurrentRoute());
+            assertTrue(isVisible(pointersPage.$$('#mouse')));
+            assertTrue(isVisible(pointersPage.$$('#mouse h2')));
+            assertFalse(isVisible(pointersPage.$$('#pointingStick')));
+            assertFalse(isVisible(pointersPage.$$('#pointingStick h2')));
+            assertTrue(isVisible(pointersPage.$$('#touchpad')));
+            assertTrue(isVisible(pointersPage.$$('#touchpad h2')));
+          });
+    });
+
+    test('mouse', function() {
+      expectTrue(isVisible(pointersPage.$$('#mouse')));
+
+      const slider = assert(pointersPage.$$('#mouse settings-slider'));
+      expectEquals(4, slider.pref.value);
+      MockInteractions.pressAndReleaseKeyOn(
+          slider.shadowRoot.querySelector('cr-slider'), 37, [], 'ArrowLeft');
+      expectEquals(3, devicePage.prefs.settings.mouse.sensitivity2.value);
+
+      pointersPage.set('prefs.settings.mouse.sensitivity2.value', 5);
+      expectEquals(5, slider.pref.value);
+    });
+
+    test('touchpad', function() {
+      expectTrue(isVisible(pointersPage.$$('#touchpad')));
+
+      expectTrue(pointersPage.$$('#touchpad #enableTapToClick').checked);
+      expectFalse(pointersPage.$$('#touchpad #enableTapDragging').checked);
+
+      const slider = assert(pointersPage.$$('#touchpad settings-slider'));
+      expectEquals(3, slider.pref.value);
+      MockInteractions.pressAndReleaseKeyOn(
+          slider.shadowRoot.querySelector('cr-slider'), 39 /* right */, [],
+          'ArrowRight');
+      expectEquals(4, devicePage.prefs.settings.touchpad.sensitivity2.value);
+
+      pointersPage.set('prefs.settings.touchpad.sensitivity2.value', 2);
+      expectEquals(2, slider.pref.value);
+    });
+
+    test('haptic touchpad', function() {
+      expectTrue(pointersPage.$$('#touchpadHapticFeedbackToggle').checked);
+
+      const slider = assert(pointersPage.$$('#touchpadHapticClickSensitivity'));
+      expectEquals(3, slider.pref.value);
+      MockInteractions.pressAndReleaseKeyOn(
+          slider.shadowRoot.querySelector('cr-slider'), 39 /* right */, [],
+          'ArrowRight');
+      expectEquals(
+          5, devicePage.prefs.settings.touchpad.haptic_click_sensitivity.value);
+
+      pointersPage.set(
+          'prefs.settings.touchpad.haptic_click_sensitivity.value', 1);
+      expectEquals(1, slider.pref.value);
+    });
+
+    test('link doesn\'t activate control', function() {
+      expectReverseScrollValue(pointersPage, false);
+
+      // Tapping the link shouldn't enable the radio button.
+      const reverseScrollLabel =
+          pointersPage.$$('#enableReverseScrollingLabel');
+      const a = reverseScrollLabel.$.container.querySelector('a');
+      expectTrue(!!a);
+      // Prevent actually opening a link, which would block test.
+      a.removeAttribute('href');
+      a.click();
+      expectReverseScrollValue(pointersPage, false);
+
+      // Check specifically clicking toggle changes pref.
+      const reverseScrollToggle =
+          pointersPage.$$('#enableReverseScrollingToggle');
+      reverseScrollToggle.click();
+      expectReverseScrollValue(pointersPage, true);
+      devicePage.set('prefs.settings.touchpad.natural_scroll.value', false);
+      expectReverseScrollValue(pointersPage, false);
+
+      // Check specifically clicking the row changes pref.
+      const reverseScrollSettings = pointersPage.$$('#reverseScrollRow');
+      reverseScrollSettings.click();
+      expectReverseScrollValue(pointersPage, true);
+      devicePage.set('prefs.settings.touchpad.natural_scroll.value', false);
+      expectReverseScrollValue(pointersPage, false);
+    });
+
+    test('pointing stick acceleration toggle', function() {
+      const toggle = assert(pointersPage.$$('#pointingStickAcceleration'));
+      expectEquals(true, toggle.pref.value);
+      toggle.click();
+      expectEquals(
+          false, devicePage.prefs.settings.pointing_stick.acceleration.value);
+
+      pointersPage.set(
+          'prefs.settings.pointing_stick.acceleration.value', true);
+      expectEquals(true, toggle.pref.value);
+    });
+
+    test('pointing stick speed slider', function() {
+      const slider = assert(pointersPage.$$('#pointingStick settings-slider'));
+      expectEquals(4, slider.pref.value);
+      MockInteractions.pressAndReleaseKeyOn(
+          slider.shadowRoot.querySelector('cr-slider'), 37, [], 'ArrowLeft');
+      expectEquals(
+          3, devicePage.prefs.settings.pointing_stick.sensitivity.value);
+
+      pointersPage.set('prefs.settings.pointing_stick.sensitivity.value', 5);
+      expectEquals(5, slider.pref.value);
+    });
+
+    test('Deep link to pointing stick primary button setting', async () => {
+      return checkDeepLink(
+          routes.POINTERS, '437',
+          pointersPage.$$('#pointingStickSwapButtonDropdown')
+              .shadowRoot.querySelector('select'),
+          'Pointing stick primary button dropdown');
+    });
+
+    test('Deep link to pointing stick acceleration setting', async () => {
+      return checkDeepLink(
+          routes.POINTERS, '436',
+          pointersPage.$$('#pointingStickAcceleration')
+              .shadowRoot.querySelector('cr-toggle'),
+          'Pointing stick acceleration slider');
+    });
+
+    test('Deep link to pointing stick speed setting', async () => {
+      return checkDeepLink(
+          routes.POINTERS, '435',
+          pointersPage.$$('#pointingStickSpeedSlider')
+              .shadowRoot.querySelector('cr-slider'),
+          'Pointing stick speed slider');
+    });
+
+    test('Deep link to touchpad speed', async () => {
+      return checkDeepLink(
+          routes.POINTERS, '405',
+          pointersPage.$$('#touchpadSensitivity')
+              .shadowRoot.querySelector('cr-slider'),
+          'Touchpad speed slider');
+    });
+  });
+
+  suite(assert(TestNames.Keyboard), function() {
+    const name = k => `prefs.settings.language.${k}.value`;
+    const get = k => devicePage.get(name(k));
+    const set = (k, v) => devicePage.set(name(k), v);
+    let keyboardPage;
+
+    setup(async () => {
+      keyboardPage = await showAndGetDeviceSubpage('keyboard', routes.KEYBOARD);
+    });
+
+    test('keyboard', async () => {
+      // Initially, the optional keys are hidden.
+      expectFalse(!!keyboardPage.$$('#capsLockKey'));
+
+      // Pretend no internal keyboard is available.
+      const keyboardParams = {
+        'showCapsLock': false,
+        'showExternalMetaKey': false,
+        'showAppleCommandKey': false,
+        'hasLauncherKey': false,
+        'hasAssistantKey': false,
+      };
+      webUIListenerCallback('show-keys-changed', keyboardParams);
+      flush();
+      expectFalse(!!keyboardPage.$$('#launcherKey'));
+      expectFalse(!!keyboardPage.$$('#capsLockKey'));
+      expectFalse(!!keyboardPage.$$('#externalMetaKey'));
+      expectFalse(!!keyboardPage.$$('#externalCommandKey'));
+      expectFalse(!!keyboardPage.$$('#assistantKey'));
+
+      // Pretend a Caps Lock key is now available.
+      keyboardParams['showCapsLock'] = true;
+      webUIListenerCallback('show-keys-changed', keyboardParams);
+      flush();
+      expectFalse(!!keyboardPage.$$('#launcherKey'));
+      expectTrue(!!keyboardPage.$$('#capsLockKey'));
+      expectFalse(!!keyboardPage.$$('#externalMetaKey'));
+      expectFalse(!!keyboardPage.$$('#externalCommandKey'));
+      expectFalse(!!keyboardPage.$$('#assistantKey'));
+
+      // Add a non-Apple external keyboard.
+      keyboardParams['showExternalMetaKey'] = true;
+      webUIListenerCallback('show-keys-changed', keyboardParams);
+      flush();
+      expectFalse(!!keyboardPage.$$('#launcherKey'));
+      expectTrue(!!keyboardPage.$$('#capsLockKey'));
+      expectTrue(!!keyboardPage.$$('#externalMetaKey'));
+      expectFalse(!!keyboardPage.$$('#externalCommandKey'));
+      expectFalse(!!keyboardPage.$$('#assistantKey'));
+
+      // Add an Apple keyboard.
+      keyboardParams['showAppleCommandKey'] = true;
+      webUIListenerCallback('show-keys-changed', keyboardParams);
+      flush();
+      expectFalse(!!keyboardPage.$$('#launcherKey'));
+      expectTrue(!!keyboardPage.$$('#capsLockKey'));
+      expectTrue(!!keyboardPage.$$('#externalMetaKey'));
+      expectTrue(!!keyboardPage.$$('#externalCommandKey'));
+      expectFalse(!!keyboardPage.$$('#assistantKey'));
+
+      // Add an internal keyboard.
+      keyboardParams['hasLauncherKey'] = true;
+      webUIListenerCallback('show-keys-changed', keyboardParams);
+      flush();
+      expectTrue(!!keyboardPage.$$('#launcherKey'));
+      expectTrue(!!keyboardPage.$$('#capsLockKey'));
+      expectTrue(!!keyboardPage.$$('#externalMetaKey'));
+      expectTrue(!!keyboardPage.$$('#externalCommandKey'));
+      expectFalse(!!keyboardPage.$$('#assistantKey'));
+
+      // Pretend an Assistant key is now available.
+      keyboardParams['hasAssistantKey'] = true;
+      webUIListenerCallback('show-keys-changed', keyboardParams);
+      flush();
+      expectTrue(!!keyboardPage.$$('#launcherKey'));
+      expectTrue(!!keyboardPage.$$('#capsLockKey'));
+      expectTrue(!!keyboardPage.$$('#externalMetaKey'));
+      expectTrue(!!keyboardPage.$$('#externalCommandKey'));
+      expectTrue(!!keyboardPage.$$('#assistantKey'));
+
+      const collapse = keyboardPage.$$('iron-collapse');
+      assertTrue(!!collapse);
+      expectTrue(collapse.opened);
+
+      expectEquals(500, keyboardPage.$$('#delaySlider').pref.value);
+      expectEquals(500, keyboardPage.$$('#repeatRateSlider').pref.value);
+
+      // Test interaction with the settings-slider's underlying cr-slider.
+      MockInteractions.pressAndReleaseKeyOn(
+          keyboardPage.$$('#delaySlider').shadowRoot.querySelector('cr-slider'),
+          37 /* left */, [], 'ArrowLeft');
+      MockInteractions.pressAndReleaseKeyOn(
+          keyboardPage.$$('#repeatRateSlider')
+              .shadowRoot.querySelector('cr-slider'),
+          39, [], 'ArrowRight');
+      await flushTasks();
+      expectEquals(1000, get('xkb_auto_repeat_delay_r2'));
+      expectEquals(300, get('xkb_auto_repeat_interval_r2'));
+
+      // Test sliders change when prefs change.
+      set('xkb_auto_repeat_delay_r2', 1500);
+      await flushTasks();
+      expectEquals(1500, keyboardPage.$$('#delaySlider').pref.value);
+      set('xkb_auto_repeat_interval_r2', 2000);
+      await flushTasks();
+      expectEquals(2000, keyboardPage.$$('#repeatRateSlider').pref.value);
+
+      // Test sliders round to nearest value when prefs change.
+      set('xkb_auto_repeat_delay_r2', 600);
+      await flushTasks();
+      expectEquals(500, keyboardPage.$$('#delaySlider').pref.value);
+      set('xkb_auto_repeat_interval_r2', 45);
+      await flushTasks();
+      expectEquals(50, keyboardPage.$$('#repeatRateSlider').pref.value);
+
+      set('xkb_auto_repeat_enabled_r2', false);
+      expectFalse(collapse.opened);
+
+      // Test keyboard shortcut viewer button.
+      keyboardPage.$$('#keyboardShortcutViewer').click();
+      expectEquals(
+          1,
+          DevicePageBrowserProxyImpl.getInstance()
+              .keyboardShortcutViewerShown_);
+    });
+
+    test('Deep link to keyboard shortcuts', async () => {
+      return checkDeepLink(
+          routes.KEYBOARD, '413',
+          keyboardPage.$$('#keyboardShortcutViewer')
+              .shadowRoot.querySelector('cr-icon-button'),
+          'Keyboard shortcuts button');
+    });
+  });
+
+  suite(assert(TestNames.Display), function() {
+    let displayPage;
+    let browserProxy;
+
+    setup(async () => {
+      displayPage = await showAndGetDeviceSubpage('display', routes.DISPLAY);
+      browserProxy = DevicePageBrowserProxyImpl.getInstance();
+      await fakeSystemDisplay.getInfoCalled.promise;
+    });
+
+    test('display tests', function() {
+      // Verify all the conditionals that get run during page load
+      // before the display info has been populated.
+      expectEquals(undefined, displayPage.displays);
+      expectFalse(displayPage.showMirror_(true, displayPage.displays));
+      expectFalse(displayPage.showMirror_(false, displayPage.displays));
+      expectFalse(displayPage.isMirrored_(displayPage.displays));
+      expectFalse(
+          displayPage.showUnifiedDesktop_(true, true, displayPage.displays));
+      expectFalse(
+          displayPage.showUnifiedDesktop_(false, false, displayPage.displays));
+      expectEquals(
+          displayPage.invalidDisplayId_,
+          browserProxy.lastHighlightedDisplayId_);
+
+      // Add a display.
+      addDisplay(1);
+      fakeSystemDisplay.onDisplayChanged.callListeners();
+
+      return Promise
+          .all([
+            fakeSystemDisplay.getInfoCalled.promise,
+            fakeSystemDisplay.getLayoutCalled.promise,
+          ])
+          .then(function() {
+            // There should be a single display which should be primary and
+            // selected. Mirroring should be disabled.
+            expectEquals(1, displayPage.displays.length);
+            expectEquals(
+                displayPage.displays[0].id, displayPage.selectedDisplay.id);
+            expectEquals(
+                displayPage.displays[0].id, displayPage.primaryDisplayId);
+            expectFalse(displayPage.showMirror_(false, displayPage.displays));
+            expectFalse(displayPage.isMirrored_(displayPage.displays));
+
+            // Verify unified desktop only shown when enabled.
+            expectTrue(displayPage.showUnifiedDesktop_(
+                true, true, displayPage.displays));
+            expectFalse(displayPage.showUnifiedDesktop_(
+                false, false, displayPage.displays));
+
+            // Sanity check the first display is internal.
+            expectTrue(displayPage.displays[0].isInternal);
+
+            // Ambient EQ only shown when enabled.
+            expectTrue(displayPage.showAmbientColorSetting_(
+                true, displayPage.displays[0]));
+            expectFalse(displayPage.showAmbientColorSetting_(
+                false, displayPage.displays[0]));
+
+            // Verify that the arrangement section is not shown.
+            expectEquals(null, displayPage.$$('#arrangement-section'));
+
+            // Add a second display.
+            addDisplay(2);
+            fakeSystemDisplay.onDisplayChanged.callListeners();
+
+            return Promise.all([
+              fakeSystemDisplay.getInfoCalled.promise,
+              fakeSystemDisplay.getLayoutCalled.promise,
+              new Promise(function(resolve, reject) {
+                setTimeout(resolve);
+              })
+            ]);
+          })
+          .then(function() {
+            // There should be two displays, the first should be primary and
+            // selected. Mirroring should be enabled but set to false.
+            expectEquals(2, displayPage.displays.length);
+            expectEquals(
+                displayPage.displays[0].id, displayPage.selectedDisplay.id);
+            expectEquals(
+                displayPage.displays[0].id, displayPage.primaryDisplayId);
+            expectTrue(displayPage.showMirror_(false, displayPage.displays));
+            expectFalse(displayPage.isMirrored_(displayPage.displays));
+
+            // Verify unified desktop only shown when enabled.
+            expectTrue(displayPage.showUnifiedDesktop_(
+                true, true, displayPage.displays));
+            expectFalse(displayPage.showUnifiedDesktop_(
+                false, false, displayPage.displays));
+
+            // Sanity check the second display is not internal.
+            expectFalse(displayPage.displays[1].isInternal);
+
+
+            // Verify the display modes are parsed correctly.
+
+            // 5 total modes, 2 parent modes.
+            expectEquals(7, displayPage.modeToParentModeMap_.size);
+            expectEquals(0, displayPage.modeToParentModeMap_.get(0));
+            expectEquals(0, displayPage.modeToParentModeMap_.get(1));
+            expectEquals(5, displayPage.modeToParentModeMap_.get(2));
+            expectEquals(5, displayPage.modeToParentModeMap_.get(3));
+            expectEquals(5, displayPage.modeToParentModeMap_.get(4));
+            expectEquals(5, displayPage.modeToParentModeMap_.get(5));
+            expectEquals(5, displayPage.modeToParentModeMap_.get(6));
+
+            // Two resolution options, one for each parent mode.
+            expectEquals(2, displayPage.refreshRateList_.length);
+
+            // Each parent mode has the correct number of refresh rates.
+            expectEquals(2, displayPage.parentModeToRefreshRateMap_.size);
+            expectEquals(
+                2, displayPage.parentModeToRefreshRateMap_.get(0).length);
+            expectEquals(
+                3, displayPage.parentModeToRefreshRateMap_.get(5).length);
+
+            // Ambient EQ never shown on non-internal display regardless of
+            // whether it is enabled.
+            expectFalse(displayPage.showAmbientColorSetting_(
+                true, displayPage.displays[1]));
+            expectFalse(displayPage.showAmbientColorSetting_(
+                false, displayPage.displays[1]));
+
+            // Verify that the arrangement section is shown.
+            expectTrue(!!displayPage.$$('#arrangement-section'));
+
+            // Select the second display and make it primary. Also change the
+            // orientation of the second display.
+            const displayLayout = displayPage.$$('#displayLayout');
+            assertTrue(!!displayLayout);
+            const displayDiv = displayLayout.$$('#_fakeDisplayId2');
+            assertTrue(!!displayDiv);
+            displayDiv.click();
+            expectEquals(
+                displayPage.displays[1].id, displayPage.selectedDisplay.id);
+
+            displayPage.updatePrimaryDisplay_({target: {value: '0'}});
+            displayPage.onOrientationChange_({target: {value: '90'}});
+            fakeSystemDisplay.onDisplayChanged.callListeners();
+
+            return Promise.all([
+              fakeSystemDisplay.getInfoCalled.promise,
+              fakeSystemDisplay.getLayoutCalled.promise,
+              new Promise(function(resolve, reject) {
+                setTimeout(resolve);
+              })
+            ]);
+          })
+          .then(function() {
+            // Confirm that the second display is selected, primary, and
+            // rotated.
+            expectEquals(2, displayPage.displays.length);
+            expectEquals(
+                displayPage.displays[1].id, displayPage.selectedDisplay.id);
+            expectTrue(displayPage.displays[1].isPrimary);
+            expectEquals(
+                displayPage.displays[1].id, displayPage.primaryDisplayId);
+            expectEquals(90, displayPage.displays[1].rotation);
+
+            // Mirror the displays.
+            displayPage.onMirroredTap_({target: {blur: function() {}}});
+            fakeSystemDisplay.onDisplayChanged.callListeners();
+
+            return Promise.all([
+              fakeSystemDisplay.getInfoCalled.promise,
+              fakeSystemDisplay.getLayoutCalled.promise,
+              new Promise(function(resolve, reject) {
+                setTimeout(resolve);
+              })
+            ]);
+          })
+          .then(function() {
+            // Confirm that there is now only one display and that it is
+            // primary and mirroring is enabled.
+            expectEquals(1, displayPage.displays.length);
+            expectEquals(
+                displayPage.displays[0].id, displayPage.selectedDisplay.id);
+            expectTrue(displayPage.displays[0].isPrimary);
+            expectTrue(displayPage.showMirror_(false, displayPage.displays));
+            expectTrue(displayPage.isMirrored_(displayPage.displays));
+
+            // Verify that the arrangement section is shown while mirroring.
+            expectTrue(!!displayPage.$$('#arrangement-section'));
+
+            // Ensure that the zoom value remains unchanged while draggging.
+            function pointerEvent(eventType, ratio) {
+              const crSlider = displayPage.$.displaySizeSlider.$.slider;
+              const rect = crSlider.$.container.getBoundingClientRect();
+              crSlider.dispatchEvent(new PointerEvent(eventType, {
+                buttons: 1,
+                pointerId: 1,
+                clientX: rect.left + (ratio * rect.width),
+              }));
+            }
+
+            expectEquals(1, displayPage.selectedZoomPref_.value);
+            pointerEvent('pointerdown', .6);
+            expectEquals(1, displayPage.selectedZoomPref_.value);
+            pointerEvent('pointermove', .3);
+            expectEquals(1, displayPage.selectedZoomPref_.value);
+            pointerEvent('pointerup', 0);
+            expectEquals(1.25, displayPage.selectedZoomPref_.value);
+
+            // Navigate out of the display page.
+            return showAndGetDeviceSubpage('power', routes.POWER);
+          })
+          .then(function() {
+            // Moving out of the display page should set selected display to
+            // invalid.
+            expectEquals(
+                displayPage.invalidDisplayId_,
+                browserProxy.lastHighlightedDisplayId_);
+
+            // Navigate back to the display page.
+            return showAndGetDeviceSubpage('display', routes.DISPLAY);
+          });
+    });
+
+    test('Deep link to display mirroring', async () => {
+      const params = new URLSearchParams();
+      params.append('settingId', '428');
+      Router.getInstance().navigateTo(routes.DISPLAY, params);
+      // await fakeSystemDisplay.getInfoCalled.promise;
+
+      addDisplay(1);
+      addDisplay(1);
+      fakeSystemDisplay.onDisplayChanged.callListeners();
+      await fakeSystemDisplay.getInfoCalled.promise;
+      await fakeSystemDisplay.getLayoutCalled.promise;
+      expectEquals(2, displayPage.displays.length);
+
+      flush();
+      // await fakeSystemDisplay.getInfoCalled.promise;
+      assert(displayPage);
+      assertEquals(2, displayPage.displays.length);
+      assertTrue(displayPage.shouldShowArrangementSection_());
+
+      const deepLinkElement =
+          displayPage.$$('#displayMirrorCheckbox').$$('#checkbox');
+      await waitAfterNextRender(deepLinkElement);
+      assertEquals(
+          deepLinkElement, getDeepActiveElement(),
+          'Display mirroring checkbox should be focused for settingId=428.');
+    });
+
+    test('Keyboard display arrangement', async () => {
+      addDisplay(1);
+      addDisplay(2);
+      fakeSystemDisplay.onDisplayChanged.callListeners();
+
+      return Promise
+          .all([
+            fakeSystemDisplay.getInfoCalled.promise,
+            fakeSystemDisplay.getLayoutCalled.promise,
+          ])
+          .then(() => {
+            return new Promise(resolve => {
+              flush();
+
+              assert(displayPage);
+              assertEquals(2, displayPage.displays.length);
+              assertTrue(displayPage.shouldShowArrangementSection_());
+
+              expectTrue(!!displayPage.$$('#arrangement-section'));
+
+              expectTrue(displayPage.showMirror_(false, displayPage.displays));
+              expectFalse(displayPage.isMirrored_(displayPage.displays));
+
+              flush();
+
+              displayPage.async(resolve);
+            });
+          })
+          .then(() => {
+            const displayLayout = displayPage.$$('#displayLayout');
+            const display = displayLayout.$$('#_fakeDisplayId2');
+            const layout =
+                displayLayout.displayLayoutMap_.get('fakeDisplayId2');
+
+            expectEquals(layout.parentId, 'fakeDisplayId1');
+            expectEquals(layout.position, 'right');
+
+            const offset =
+                displayLayout.keyboardDragStepSize / displayLayout.visualScale;
+
+            display.focus();
+
+            display.dispatchEvent(new KeyboardEvent(
+                'keydown', {key: 'ArrowDown', bubbles: true}));
+            display.dispatchEvent(
+                new KeyboardEvent('keydown', {key: 'Enter', bubbles: true}));
+            expectEquals(offset, layout.offset);
+
+            display.dispatchEvent(new KeyboardEvent(
+                'keydown', {key: 'ArrowDown', bubbles: true}));
+            display.dispatchEvent(
+                new KeyboardEvent('keydown', {key: 'Enter', bubbles: true}));
+            expectEquals(offset * 2, layout.offset);
+
+            display.dispatchEvent(
+                new KeyboardEvent('keydown', {key: 'ArrowUp', bubbles: true}));
+            display.dispatchEvent(
+                new KeyboardEvent('keydown', {key: 'Enter', bubbles: true}));
+            expectEquals(offset, layout.offset);
+          });
+    });
+  });
+
+  test(assert(TestNames.NightLight), async function() {
+    // Set up a single display.
+    const displayPage =
+        await showAndGetDeviceSubpage('display', routes.DISPLAY);
+    await fakeSystemDisplay.getInfoCalled.promise;
+    addDisplay(1);
+    fakeSystemDisplay.onDisplayChanged.callListeners();
+    await fakeSystemDisplay.getInfoCalled.promise;
+    await fakeSystemDisplay.getLayoutCalled.promise;
+    expectEquals(1, displayPage.displays.length);
+
+    const temperature = displayPage.$$('#nightLightTemperatureDiv');
+    const schedule = displayPage.$$('#nightLightScheduleTypeDropDown');
+
+    // Night Light is off, so temperature is hidden. Schedule is always shown.
+    expectTrue(temperature.hidden);
+    expectFalse(schedule.hidden);
+
+    // Enable Night Light. Use an atomic update of |displayPage.prefs| so
+    // Polymer notices the change.
+    const newPrefs = getFakePrefs();
+    newPrefs.ash.night_light.enabled.value = true;
+    displayPage.prefs = newPrefs;
+    flush();
+
+    // Night Light is on, so temperature is visible.
+    expectFalse(temperature.hidden);
+    expectFalse(schedule.hidden);
+  });
+
+  suite(assert(TestNames.Power), function() {
+    /**
+     * Sets power sources using a deep copy of |sources|.
+     * @param {Array<PowerSource>} sources
+     * @param {string} powerSourceId
+     * @param {bool} isLowPowerCharger
+     */
+    function setPowerSources(sources, powerSourceId, isLowPowerCharger) {
+      const sourcesCopy = sources.map(function(source) {
+        return Object.assign({}, source);
+      });
+      webUIListenerCallback(
+          'power-sources-changed', sourcesCopy, powerSourceId,
+          isLowPowerCharger);
+    }
+
+    suite('power settings', function() {
+      let powerPage;
+      let powerSourceRow;
+      let powerSourceSelect;
+      let acIdleSelect;
+      let lidClosedToggle;
+
+      setup(function() {
+        return showAndGetDeviceSubpage('power', routes.POWER)
+            .then(function(page) {
+              powerPage = page;
+              powerSourceRow = assert(powerPage.$$('#powerSourceRow'));
+              powerSourceSelect = assert(powerPage.$$('#powerSource'));
+              assertEquals(
+                  1,
+                  DevicePageBrowserProxyImpl.getInstance()
+                      .updatePowerStatusCalled_);
+
+              lidClosedToggle = assert(powerPage.$$('#lidClosedToggle'));
+
+              assertEquals(
+                  1,
+                  DevicePageBrowserProxyImpl.getInstance()
+                      .requestPowerManagementSettingsCalled_);
+              sendPowerManagementSettings(
+                  [
+                    IdleBehavior.DISPLAY_OFF_SLEEP, IdleBehavior.DISPLAY_OFF,
+                    IdleBehavior.DISPLAY_ON
+                  ],
+                  [
+                    IdleBehavior.DISPLAY_OFF_SLEEP, IdleBehavior.DISPLAY_OFF,
+                    IdleBehavior.DISPLAY_ON
+                  ],
+                  IdleBehavior.DISPLAY_OFF_SLEEP,
+                  IdleBehavior.DISPLAY_OFF_SLEEP, false /* acIdleManaged */,
+                  false /* batteryIdleManaged */, LidClosedBehavior.SUSPEND,
+                  false /* lidClosedControlled */, true /* hasLid */);
+            });
+      });
+
+      test('no battery', function() {
+        const batteryStatus = {
+          present: false,
+          charging: false,
+          calculating: false,
+          percent: -1,
+          statusText: '',
+        };
+        webUIListenerCallback(
+            'battery-status-changed', Object.assign({}, batteryStatus));
+        flush();
+
+        // Power source row is hidden since there's no battery.
+        assertTrue(powerSourceRow.hidden);
+        // Idle settings while on battery and while charging should not be
+        // visible if the battery is not present.
+        assertEquals(null, powerPage.$$('#batteryIdleSettingBox'));
+        assertEquals(null, powerPage.$$('#acIdleSettingBox'));
+
+        const acIdleSelect = assert(powerPage.$$('#noBatteryAcIdleSelect'));
+        // Expect the "When idle" dropdown options to appear instead.
+        assert(acIdleSelect);
+
+        // Select a "When idle" selection and expect it to be set.
+        selectValue(acIdleSelect, IdleBehavior.DISPLAY_ON);
+        expectEquals(
+            IdleBehavior.DISPLAY_ON,
+            DevicePageBrowserProxyImpl.getInstance().acIdleBehavior_);
+      });
+
+      test('power sources', function() {
+        const batteryStatus = {
+          present: true,
+          charging: false,
+          calculating: false,
+          percent: 50,
+          statusText: '5 hours left',
+        };
+        webUIListenerCallback(
+            'battery-status-changed', Object.assign({}, batteryStatus));
+        setPowerSources([], '', false);
+        flush();
+
+        // Power sources row is visible but dropdown is hidden.
+        assertFalse(powerSourceRow.hidden);
+        assertTrue(powerSourceSelect.hidden);
+
+        // Attach a dual-role USB device.
+        const powerSource = {
+          id: '2',
+          is_dedicated_charger: false,
+          description: 'USB-C device',
+        };
+        setPowerSources([powerSource], '', false);
+        flush();
+
+        // "Battery" should be selected.
+        assertFalse(powerSourceSelect.hidden);
+        assertEquals('', powerSourceSelect.value);
+
+        // Select the power source.
+        setPowerSources([powerSource], powerSource.id, true);
+        flush();
+        assertFalse(powerSourceSelect.hidden);
+        assertEquals(powerSource.id, powerSourceSelect.value);
+
+        // Send another power source; the first should still be selected.
+        const otherPowerSource = Object.assign({}, powerSource);
+        otherPowerSource.id = '3';
+        setPowerSources([otherPowerSource, powerSource], powerSource.id, true);
+        flush();
+        assertFalse(powerSourceSelect.hidden);
+        assertEquals(powerSource.id, powerSourceSelect.value);
+      });
+
+      test('choose power source', function() {
+        const batteryStatus = {
+          present: true,
+          charging: false,
+          calculating: false,
+          percent: 50,
+          statusText: '5 hours left',
+        };
+        webUIListenerCallback(
+            'battery-status-changed', Object.assign({}, batteryStatus));
+
+        // Attach a dual-role USB device.
+        const powerSource = {
+          id: '3',
+          is_dedicated_charger: false,
+          description: 'USB-C device',
+        };
+        setPowerSources([powerSource], '', false);
+        flush();
+
+        // Select the device.
+        selectValue(powerSourceSelect, powerSourceSelect.children[1].value);
+        expectEquals(
+            powerSource.id,
+            DevicePageBrowserProxyImpl.getInstance().powerSourceId_);
+      });
+
+      test('set AC idle behavior', function() {
+        const batteryStatus = {
+          present: true,
+          charging: false,
+          calculating: false,
+          percent: 50,
+          statusText: '5 hours left',
+        };
+        webUIListenerCallback(
+            'battery-status-changed', Object.assign({}, batteryStatus));
+        setPowerSources([], '', false);
+        flush();
+
+        acIdleSelect = assert(powerPage.$$('#acIdleSelect'));
+        selectValue(acIdleSelect, IdleBehavior.DISPLAY_ON);
+        expectEquals(
+            IdleBehavior.DISPLAY_ON,
+            DevicePageBrowserProxyImpl.getInstance().acIdleBehavior_);
+      });
+
+      test('set battery idle behavior', function() {
+        return new Promise(function(resolve) {
+                 // Indicate battery presence so that idle settings box while
+                 // on battery is visible.
+                 const batteryStatus = {
+                   present: true,
+                   charging: false,
+                   calculating: false,
+                   percent: 50,
+                   statusText: '5 hours left',
+                 };
+                 webUIListenerCallback(
+                     'battery-status-changed',
+                     Object.assign({}, batteryStatus));
+                 powerPage.async(resolve);
+               })
+            .then(function() {
+              const batteryIdleSelect =
+                  assert(powerPage.$$('#batteryIdleSelect'));
+              selectValue(batteryIdleSelect, IdleBehavior.DISPLAY_ON);
+              expectEquals(
+                  IdleBehavior.DISPLAY_ON,
+                  DevicePageBrowserProxyImpl.getInstance()
+                      .batteryIdleBehavior_);
+            });
+      });
+
+      test('set lid behavior', function() {
+        const sendLid = function(lidBehavior) {
+          sendPowerManagementSettings(
+              [
+                IdleBehavior.DISPLAY_OFF_SLEEP, IdleBehavior.DISPLAY_OFF,
+                IdleBehavior.DISPLAY_ON
+              ],
+              [
+                IdleBehavior.DISPLAY_OFF_SLEEP, IdleBehavior.DISPLAY_OFF,
+                IdleBehavior.DISPLAY_ON
+              ],
+              IdleBehavior.DISPLAY_OFF, IdleBehavior.DISPLAY_OFF,
+              false /* acIdleManaged */, false /* batteryIdleManaged */,
+              lidBehavior, false /* lidClosedControlled */, true /* hasLid */);
+        };
+
+        sendLid(LidClosedBehavior.SUSPEND);
+        assertTrue(lidClosedToggle.checked);
+
+        lidClosedToggle.shadowRoot.querySelector('#control').click();
+        expectEquals(
+            LidClosedBehavior.DO_NOTHING,
+            DevicePageBrowserProxyImpl.getInstance().lidClosedBehavior_);
+        sendLid(LidClosedBehavior.DO_NOTHING);
+        expectFalse(lidClosedToggle.checked);
+
+        lidClosedToggle.shadowRoot.querySelector('#control').click();
+        expectEquals(
+            LidClosedBehavior.SUSPEND,
+            DevicePageBrowserProxyImpl.getInstance().lidClosedBehavior_);
+        sendLid(LidClosedBehavior.SUSPEND);
+        expectTrue(lidClosedToggle.checked);
+      });
+      test('display idle behavior for shut_down/stop_session', function() {
+        return new Promise(function(resolve) {
+                 // Send power management settings first.
+                 sendPowerManagementSettings(
+                     [
+                       IdleBehavior.DISPLAY_OFF_SLEEP,
+                       IdleBehavior.DISPLAY_OFF,
+                       IdleBehavior.DISPLAY_ON,
+                       IdleBehavior.SHUT_DOWN,
+                       IdleBehavior.STOP_SESSION,
+                     ],
+                     [
+                       IdleBehavior.DISPLAY_OFF_SLEEP,
+                       IdleBehavior.DISPLAY_OFF,
+                       IdleBehavior.DISPLAY_ON,
+                       IdleBehavior.SHUT_DOWN,
+                       IdleBehavior.STOP_SESSION,
+                     ],
+                     IdleBehavior.SHUT_DOWN, IdleBehavior.SHUT_DOWN,
+                     true /* acIdleManaged */, true /* batteryIdleManaged */,
+                     LidClosedBehavior.DO_NOTHING,
+                     false /* lidClosedControlled */, true /* hasLid */);
+                 powerPage.async(resolve);
+               })
+            .then(function() {
+              // Indicate battery presence so that battery idle settings
+              // box becomes visible. Default option should be selected
+              // properly even when battery idle settings box is stamped
+              // later.
+              const batteryStatus = {
+                present: true,
+                charging: false,
+                calculating: false,
+                percent: 50,
+                statusText: '5 hours left',
+              };
+              webUIListenerCallback(
+                  'battery-status-changed', Object.assign({}, batteryStatus));
+              return new Promise(function(resolve) {
+                powerPage.async(resolve);
+              });
+            })
+            .then(function() {
+              const batteryIdleSelect =
+                  assert(powerPage.$$('#batteryIdleSelect'));
+              expectEquals(
+                  IdleBehavior.SHUT_DOWN.toString(), batteryIdleSelect.value);
+              expectFalse(batteryIdleSelect.disabled);
+              const acIdleSelect = assert(powerPage.$$('#acIdleSelect'));
+              expectEquals(
+                  IdleBehavior.SHUT_DOWN.toString(), acIdleSelect.value);
+              expectFalse(acIdleSelect.disabled);
+              expectEquals(
+                  loadTimeData.getString('powerLidSleepLabel'),
+                  lidClosedToggle.label);
+              expectFalse(lidClosedToggle.checked);
+              expectFalse(lidClosedToggle.isPrefEnforced());
+            })
+            .then(function() {
+              sendPowerManagementSettings(
+                  [
+                    IdleBehavior.DISPLAY_OFF_SLEEP,
+                    IdleBehavior.DISPLAY_OFF,
+                    IdleBehavior.DISPLAY_ON,
+                    IdleBehavior.SHUT_DOWN,
+                    IdleBehavior.STOP_SESSION,
+                  ],
+                  [
+                    IdleBehavior.DISPLAY_OFF_SLEEP,
+                    IdleBehavior.DISPLAY_OFF,
+                    IdleBehavior.DISPLAY_ON,
+                    IdleBehavior.SHUT_DOWN,
+                    IdleBehavior.STOP_SESSION,
+                  ],
+                  IdleBehavior.SHUT_DOWN, IdleBehavior.SHUT_DOWN,
+                  true /* acIdleManaged */, true /* batteryIdleManaged */,
+                  LidClosedBehavior.DO_NOTHING, false /* lidClosedControlled */,
+                  true /* hasLid */);
+              return new Promise(function(resolve) {
+                powerPage.async(resolve);
+              });
+            })
+            .then(function() {
+              const batteryIdleSelect =
+                  assert(powerPage.$$('#batteryIdleSelect'));
+              expectEquals(
+                  IdleBehavior.SHUT_DOWN.toString(), batteryIdleSelect.value);
+              expectFalse(batteryIdleSelect.disabled);
+              const acIdleSelect = assert(powerPage.$$('#acIdleSelect'));
+              expectEquals(
+                  IdleBehavior.SHUT_DOWN.toString(), acIdleSelect.value);
+              expectFalse(acIdleSelect.disabled);
+              expectEquals(
+                  loadTimeData.getString('powerLidSleepLabel'),
+                  lidClosedToggle.label);
+              expectFalse(lidClosedToggle.checked);
+              expectFalse(lidClosedToggle.isPrefEnforced());
+            });
+      });
+      test('display idle and lid behavior', function() {
+        return new Promise(function(resolve) {
+                 // Send power management settings first.
+                 sendPowerManagementSettings(
+                     [
+                       IdleBehavior.DISPLAY_OFF_SLEEP, IdleBehavior.DISPLAY_OFF,
+                       IdleBehavior.DISPLAY_ON
+                     ],
+                     [
+                       IdleBehavior.DISPLAY_OFF_SLEEP, IdleBehavior.DISPLAY_OFF,
+                       IdleBehavior.DISPLAY_ON
+                     ],
+                     IdleBehavior.DISPLAY_ON, IdleBehavior.DISPLAY_OFF,
+                     false /* acIdleManaged */, false /* batteryIdleManaged */,
+                     LidClosedBehavior.DO_NOTHING,
+                     false /* lidClosedControlled */, true /* hasLid */);
+                 powerPage.async(resolve);
+               })
+            .then(function() {
+              // Indicate battery presence so that battery idle settings
+              // box becomes visible. Default option should be selected
+              // properly even when battery idle settings box is stamped
+              // later.
+              const batteryStatus = {
+                present: true,
+                charging: false,
+                calculating: false,
+                percent: 50,
+                statusText: '5 hours left',
+              };
+              webUIListenerCallback(
+                  'battery-status-changed', Object.assign({}, batteryStatus));
+              return new Promise(function(resolve) {
+                powerPage.async(resolve);
+              });
+            })
+            .then(function() {
+              acIdleSelect = assert(powerPage.$$('#acIdleSelect'));
+              const batteryIdleSelect =
+                  assert(powerPage.$$('#batteryIdleSelect'));
+              expectEquals(
+                  IdleBehavior.DISPLAY_ON.toString(), acIdleSelect.value);
+              expectEquals(
+                  IdleBehavior.DISPLAY_OFF.toString(), batteryIdleSelect.value);
+              expectFalse(acIdleSelect.disabled);
+              expectEquals(null, powerPage.$$('#acIdleManagedIndicator'));
+              expectEquals(
+                  loadTimeData.getString('powerLidSleepLabel'),
+                  lidClosedToggle.label);
+              expectFalse(lidClosedToggle.checked);
+              expectFalse(lidClosedToggle.isPrefEnforced());
+            })
+            .then(function() {
+              sendPowerManagementSettings(
+                  [
+                    IdleBehavior.DISPLAY_OFF_SLEEP, IdleBehavior.DISPLAY_OFF,
+                    IdleBehavior.DISPLAY_ON
+                  ],
+                  [
+                    IdleBehavior.DISPLAY_OFF_SLEEP, IdleBehavior.DISPLAY_OFF,
+                    IdleBehavior.DISPLAY_ON
+                  ],
+                  IdleBehavior.DISPLAY_OFF, IdleBehavior.DISPLAY_ON,
+                  false /* acIdleManaged */, false /* batteryIdleManaged */,
+                  LidClosedBehavior.SUSPEND, false /* lidClosedControlled */,
+                  true /* hasLid */);
+              return new Promise(function(resolve) {
+                powerPage.async(resolve);
+              });
+            })
+            .then(function() {
+              const batteryIdleSelect =
+                  assert(powerPage.$$('#batteryIdleSelect'));
+              expectEquals(
+                  IdleBehavior.DISPLAY_OFF.toString(), acIdleSelect.value);
+              expectEquals(
+                  IdleBehavior.DISPLAY_ON.toString(), batteryIdleSelect.value);
+              expectFalse(acIdleSelect.disabled);
+              expectFalse(batteryIdleSelect.disabled);
+              expectEquals(null, powerPage.$$('#acIdleManagedIndicator'));
+              expectEquals(null, powerPage.$$('#batteryIdleManagedIndicator'));
+              expectEquals(
+                  loadTimeData.getString('powerLidSleepLabel'),
+                  lidClosedToggle.label);
+              expectTrue(lidClosedToggle.checked);
+              expectFalse(lidClosedToggle.isPrefEnforced());
+            });
+      });
+
+      test('display managed idle and lid behavior', function() {
+        // When settings are managed, the controls should be disabled and
+        // the indicators should be shown.
+        return new Promise(function(resolve) {
+                 // Indicate battery presence so that idle settings box while
+                 // on battery is visible.
+                 const batteryStatus = {
+                   present: true,
+                   charging: false,
+                   calculating: false,
+                   percent: 50,
+                   statusText: '5 hours left',
+                 };
+                 webUIListenerCallback(
+                     'battery-status-changed',
+                     Object.assign({}, batteryStatus));
+                 sendPowerManagementSettings(
+                     [IdleBehavior.SHUT_DOWN], [IdleBehavior.SHUT_DOWN],
+                     IdleBehavior.SHUT_DOWN, IdleBehavior.SHUT_DOWN,
+                     true /* acIdleManaged */, true /* batteryIdleManaged */,
+                     LidClosedBehavior.SHUT_DOWN,
+                     true /* lidClosedControlled */, true /* hasLid */);
+                 powerPage.async(resolve);
+               })
+            .then(function() {
+              acIdleSelect = assert(powerPage.$$('#acIdleSelect'));
+              const batteryIdleSelect =
+                  assert(powerPage.$$('#batteryIdleSelect'));
+              expectEquals(
+                  IdleBehavior.SHUT_DOWN.toString(), acIdleSelect.value);
+              expectEquals(
+                  IdleBehavior.SHUT_DOWN.toString(), batteryIdleSelect.value);
+              expectTrue(acIdleSelect.disabled);
+              expectTrue(batteryIdleSelect.disabled);
+              expectNotEquals(null, powerPage.$$('#acIdleManagedIndicator'));
+              expectNotEquals(
+                  null, powerPage.$$('#batteryIdleManagedIndicator'));
+              expectEquals(
+                  loadTimeData.getString('powerLidShutDownLabel'),
+                  lidClosedToggle.label);
+              expectTrue(lidClosedToggle.checked);
+              expectTrue(lidClosedToggle.isPrefEnforced());
+            })
+            .then(function() {
+              sendPowerManagementSettings(
+                  [IdleBehavior.DISPLAY_OFF], [IdleBehavior.DISPLAY_OFF],
+                  IdleBehavior.DISPLAY_OFF, IdleBehavior.DISPLAY_OFF,
+                  false /* acIdleManaged */, false /* batteryIdleManaged */,
+                  LidClosedBehavior.STOP_SESSION,
+                  true /* lidClosedControlled */, true /* hasLid */);
+              return new Promise(function(resolve) {
+                powerPage.async(resolve);
+              });
+            })
+            .then(function() {
+              const batteryIdleSelect =
+                  assert(powerPage.$$('#batteryIdleSelect'));
+              expectEquals(
+                  IdleBehavior.DISPLAY_OFF.toString(), acIdleSelect.value);
+              expectEquals(
+                  IdleBehavior.DISPLAY_OFF.toString(), batteryIdleSelect.value);
+              expectTrue(acIdleSelect.disabled);
+              expectTrue(batteryIdleSelect.disabled);
+              expectEquals(null, powerPage.$$('#acIdleManagedIndicator'));
+              expectEquals(null, powerPage.$$('#batteryIdleManagedIndicator'));
+              expectEquals(
+                  loadTimeData.getString('powerLidSignOutLabel'),
+                  lidClosedToggle.label);
+              expectTrue(lidClosedToggle.checked);
+              expectTrue(lidClosedToggle.isPrefEnforced());
+            });
+      });
+
+      test('hide lid behavior when lid not present', function() {
+        return new Promise(function(resolve) {
+                 expectFalse(powerPage.$$('#lidClosedToggle').hidden);
+                 sendPowerManagementSettings(
+                     [
+                       IdleBehavior.DISPLAY_OFF_SLEEP, IdleBehavior.DISPLAY_OFF,
+                       IdleBehavior.DISPLAY_ON
+                     ],
+                     [
+                       IdleBehavior.DISPLAY_OFF_SLEEP, IdleBehavior.DISPLAY_OFF,
+                       IdleBehavior.DISPLAY_ON
+                     ],
+                     IdleBehavior.DISPLAY_OFF_SLEEP,
+                     IdleBehavior.DISPLAY_OFF_SLEEP, false /* acIdleManaged */,
+                     false /* batteryIdleManaged */, LidClosedBehavior.SUSPEND,
+                     false /* lidClosedControlled */, false /* hasLid */);
+                 powerPage.async(resolve);
+               })
+            .then(function() {
+              expectTrue(powerPage.$$('#lidClosedToggle').hidden);
+            });
+      });
+
+      test(
+          'hide display controlled battery idle behavior when battery not present',
+          function() {
+            return new Promise(function(resolve) {
+                     const batteryStatus = {
+                       present: false,
+                       charging: false,
+                       calculating: false,
+                       percent: -1,
+                       statusText: '',
+                     };
+                     webUIListenerCallback(
+                         'battery-status-changed',
+                         Object.assign({}, batteryStatus));
+                     flush();
+                     powerPage.async(resolve);
+                   })
+                .then(function() {
+                  expectEquals(null, powerPage.$$('#batteryIdleSettingBox'));
+                });
+          });
+      test('Deep link to sleep when laptop lid closed', async () => {
+        return checkDeepLink(
+            routes.POWER, '424',
+            lidClosedToggle.shadowRoot.querySelector('cr-toggle'),
+            'Sleep when closed toggle');
+      });
+    });
+  });
+
+  suite(assert(TestNames.Stylus), function() {
+    let stylusPage;
+    let appSelector;
+    let browserProxy;
+    let noAppsDiv;
+    let waitingDiv;
+
+    // Shorthand for NoteAppLockScreenSupport.
+    let LockScreenSupport;
+
+    suiteSetup(function() {
+      // Always show stylus settings.
+      loadTimeData.overrideValues({
+        hasInternalStylus: true,
+      });
+    });
+
+    setup(function() {
+      return showAndGetDeviceSubpage('stylus', routes.STYLUS)
+          .then(function(page) {
+            stylusPage = page;
+            browserProxy = DevicePageBrowserProxyImpl.getInstance();
+            appSelector = assert(page.$$('#selectApp'));
+            noAppsDiv = assert(page.$$('#no-apps'));
+            waitingDiv = assert(page.$$('#waiting'));
+            LockScreenSupport = NoteAppLockScreenSupport;
+
+            assertEquals(1, browserProxy.requestNoteTakingApps_);
+            assert(browserProxy.onNoteTakingAppsUpdated_);
+          });
+    });
+
+    // Helper function to allocate a note app entry.
+    function entry(name, value, preferred, lockScreenSupport) {
+      return {
+        name: name,
+        value: value,
+        preferred: preferred,
+        lockScreenSupport: lockScreenSupport
+      };
+    }
+
+    /**  @return {?Element} */
+    function noteTakingAppLockScreenSettings() {
+      return stylusPage.$$('#note-taking-app-lock-screen-settings');
+    }
+
+    /** @return {?Element} */
+    function enableAppOnLockScreenToggle() {
+      return stylusPage.$$('#enable-app-on-lock-screen-toggle');
+    }
+
+    /** @return {?Element} */
+    function enableAppOnLockScreenPolicyIndicator() {
+      return stylusPage.$$('#enable-app-on-lock-screen-policy-indicator');
+    }
+
+    /** @return {?Element} */
+    function enableAppOnLockScreenToggleLabel() {
+      return stylusPage.$$('#lock-screen-toggle-label');
+    }
+
+    /** @return {?Element} */
+    function keepLastNoteOnLockScreenToggle() {
+      return stylusPage.$$('#keep-last-note-on-lock-screen-toggle');
+    }
+
+    test('stylus tools prefs', function() {
+      // Both stylus tools prefs are initially false.
+      assertFalse(devicePage.prefs.settings.enable_stylus_tools.value);
+      assertFalse(
+          devicePage.prefs.settings.launch_palette_on_eject_event.value);
+
+      // Since both prefs are initially false, the launch palette on eject pref
+      // toggle is disabled.
+      expectTrue(isVisible(stylusPage.$$('#enableStylusToolsToggle')));
+      expectTrue(isVisible(stylusPage.$$('#launchPaletteOnEjectEventToggle')));
+      expectTrue(stylusPage.$$('#launchPaletteOnEjectEventToggle').disabled);
+      expectFalse(devicePage.prefs.settings.enable_stylus_tools.value);
+      expectFalse(
+          devicePage.prefs.settings.launch_palette_on_eject_event.value);
+
+      // Tapping the enable stylus tools pref causes the launch palette on
+      // eject pref toggle to not be disabled anymore.
+      stylusPage.$$('#enableStylusToolsToggle').click();
+      expectTrue(devicePage.prefs.settings.enable_stylus_tools.value);
+      expectFalse(stylusPage.$$('#launchPaletteOnEjectEventToggle').disabled);
+      stylusPage.$$('#launchPaletteOnEjectEventToggle').click();
+      expectTrue(devicePage.prefs.settings.launch_palette_on_eject_event.value);
+    });
+
+    test('choose first app if no preferred ones', function() {
+      // Selector chooses the first value in list if there is no preferred
+      // value set.
+      browserProxy.setNoteTakingApps([
+        entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
+        entry('n2', 'v2', false, LockScreenSupport.NOT_SUPPORTED)
+      ]);
+      flush();
+      assertEquals('v1', appSelector.value);
+    });
+
+    test('choose prefered app if exists', function() {
+      // Selector chooses the preferred value if set.
+      browserProxy.setNoteTakingApps([
+        entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
+        entry('n2', 'v2', true, LockScreenSupport.NOT_SUPPORTED)
+      ]);
+      flush();
+      assertEquals('v2', appSelector.value);
+    });
+
+    test('change preferred app', function() {
+      // Load app list.
+      browserProxy.setNoteTakingApps([
+        entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
+        entry('n2', 'v2', true, LockScreenSupport.NOT_SUPPORTED)
+      ]);
+      flush();
+      assertEquals(0, browserProxy.setPreferredAppCount_);
+      assertEquals('v2', browserProxy.getPreferredNoteTakingAppId());
+
+      // Update select element to new value, verify browser proxy is called.
+      appSelector.value = 'v1';
+      stylusPage.onSelectedAppChanged_();
+      assertEquals(1, browserProxy.setPreferredAppCount_);
+      assertEquals('v1', browserProxy.getPreferredNoteTakingAppId());
+    });
+
+    test('preferred app does not change without interaction', function() {
+      // Pass various types of data to page, verify the preferred note-app
+      // does not change.
+      browserProxy.setNoteTakingApps([]);
+      flush();
+      assertEquals('', browserProxy.getPreferredNoteTakingAppId());
+
+      browserProxy.onNoteTakingAppsUpdated_([], true);
+      flush();
+      assertEquals('', browserProxy.getPreferredNoteTakingAppId());
+
+      browserProxy.addNoteTakingApp(
+          entry('n', 'v', false, LockScreenSupport.NOT_SUPPORTED));
+      flush();
+      assertEquals('', browserProxy.getPreferredNoteTakingAppId());
+
+      browserProxy.setNoteTakingApps([
+        entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
+        entry('n2', 'v2', true, LockScreenSupport.NOT_SUPPORTED)
+      ]);
+      flush();
+      assertEquals(0, browserProxy.setPreferredAppCount_);
+      assertEquals('v2', browserProxy.getPreferredNoteTakingAppId());
+    });
+
+    test('Deep link to preferred app', async () => {
+      browserProxy.setNoteTakingApps([
+        entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
+        entry('n2', 'v2', false, LockScreenSupport.NOT_SUPPORTED)
+      ]);
+      browserProxy.setAndroidAppsReceived(true);
+
+      return checkDeepLink(
+          routes.STYLUS, '417', stylusPage.$$('#selectApp'),
+          'Note-taking apps dropdown');
+    });
+
+    test('app-visibility', function() {
+      // No apps available.
+      browserProxy.setNoteTakingApps([]);
+      assert(noAppsDiv.hidden);
+      assert(!waitingDiv.hidden);
+      assert(appSelector.hidden);
+
+      // Waiting for apps to finish loading.
+      browserProxy.setAndroidAppsReceived(true);
+      assert(!noAppsDiv.hidden);
+      assert(waitingDiv.hidden);
+      assert(appSelector.hidden);
+
+      // Apps loaded, show selector.
+      browserProxy.addNoteTakingApp(
+          entry('n', 'v', false, LockScreenSupport.NOT_SUPPORTED));
+      assert(noAppsDiv.hidden);
+      assert(waitingDiv.hidden);
+      assert(!appSelector.hidden);
+
+      // Waiting for Android apps again.
+      browserProxy.setAndroidAppsReceived(false);
+      assert(noAppsDiv.hidden);
+      assert(!waitingDiv.hidden);
+      assert(appSelector.hidden);
+
+      browserProxy.setAndroidAppsReceived(true);
+      assert(noAppsDiv.hidden);
+      assert(waitingDiv.hidden);
+      assert(!appSelector.hidden);
+    });
+
+    test('enabled-on-lock-screen', function() {
+      expectFalse(isVisible(noteTakingAppLockScreenSettings()));
+      expectFalse(isVisible(enableAppOnLockScreenToggle()));
+      expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
+
+      return new Promise(function(resolve) {
+               // No apps available.
+               browserProxy.setNoteTakingApps([]);
+               stylusPage.async(resolve);
+             })
+          .then(function() {
+            flush();
+            expectFalse(isVisible(noteTakingAppLockScreenSettings()));
+            expectFalse(isVisible(enableAppOnLockScreenToggle()));
+            expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
+
+            // Single app which does not support lock screen note taking.
+            browserProxy.addNoteTakingApp(
+                entry('n1', 'v1', true, LockScreenSupport.NOT_SUPPORTED));
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+            expectFalse(isVisible(noteTakingAppLockScreenSettings()));
+            expectFalse(isVisible(enableAppOnLockScreenToggle()));
+            expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
+
+            // Add an app with lock screen support, but do not select it yet.
+            browserProxy.addNoteTakingApp(
+                entry('n2', 'v2', false, LockScreenSupport.SUPPORTED));
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+            expectFalse(isVisible(noteTakingAppLockScreenSettings()));
+            expectFalse(isVisible(enableAppOnLockScreenToggle()));
+            expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
+
+            // Select the app with lock screen app support.
+            appSelector.value = 'v2';
+            stylusPage.onSelectedAppChanged_();
+            assertEquals(1, browserProxy.setPreferredAppCount_);
+            assertEquals('v2', browserProxy.getPreferredNoteTakingAppId());
+
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+            expectTrue(isVisible(noteTakingAppLockScreenSettings()));
+            expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
+            assert(isVisible(enableAppOnLockScreenToggle()));
+            expectFalse(enableAppOnLockScreenToggle().checked);
+
+            // Preferred app updated to be enabled on lock screen.
+            browserProxy.setNoteTakingApps([
+              entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
+              entry('n2', 'v2', true, LockScreenSupport.ENABLED)
+            ]);
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+            expectTrue(isVisible(noteTakingAppLockScreenSettings()));
+            expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
+            assert(isVisible(enableAppOnLockScreenToggle()));
+            expectTrue(enableAppOnLockScreenToggle().checked);
+
+            // Select the app that does not support lock screen again.
+            appSelector.value = 'v1';
+            stylusPage.onSelectedAppChanged_();
+            assertEquals(2, browserProxy.setPreferredAppCount_);
+            assertEquals('v1', browserProxy.getPreferredNoteTakingAppId());
+
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+            expectFalse(isVisible(noteTakingAppLockScreenSettings()));
+            expectFalse(isVisible(enableAppOnLockScreenToggle()));
+            expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
+          });
+    });
+
+    test('initial-app-lock-screen-enabled', function() {
+      return new Promise(function(resolve) {
+               browserProxy.setNoteTakingApps(
+                   [entry('n1', 'v1', true, LockScreenSupport.SUPPORTED)]);
+               stylusPage.async(resolve);
+             })
+          .then(function() {
+            flush();
+
+            expectTrue(isVisible(noteTakingAppLockScreenSettings()));
+            assert(isVisible(enableAppOnLockScreenToggle()));
+            expectFalse(enableAppOnLockScreenToggle().checked);
+            expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
+
+            browserProxy.setNoteTakingApps(
+                [entry('n1', 'v1', true, LockScreenSupport.ENABLED)]);
+
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+            expectTrue(isVisible(noteTakingAppLockScreenSettings()));
+            assert(isVisible(enableAppOnLockScreenToggle()));
+            expectTrue(enableAppOnLockScreenToggle().checked);
+            expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
+
+            browserProxy.setNoteTakingApps(
+                [entry('n1', 'v1', true, LockScreenSupport.SUPPORTED)]);
+
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+            expectTrue(isVisible(noteTakingAppLockScreenSettings()));
+            assert(isVisible(enableAppOnLockScreenToggle()));
+            expectFalse(enableAppOnLockScreenToggle().checked);
+            expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
+
+            browserProxy.setNoteTakingApps([]);
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+            expectFalse(isVisible(enableAppOnLockScreenToggle()));
+          });
+    });
+
+    test('tap-on-enable-note-taking-on-lock-screen', function() {
+      return new Promise(function(resolve) {
+               browserProxy.setNoteTakingApps(
+                   [entry('n1', 'v1', true, LockScreenSupport.SUPPORTED)]);
+               stylusPage.async(resolve);
+             })
+          .then(function() {
+            flush();
+
+            assert(isVisible(enableAppOnLockScreenToggle()));
+            expectFalse(enableAppOnLockScreenToggle().checked);
+            expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
+
+            enableAppOnLockScreenToggle().click();
+            assertEquals(1, browserProxy.setAppOnLockScreenCount_);
+
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+            expectTrue(enableAppOnLockScreenToggle().checked);
+            expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
+
+            expectEquals(
+                LockScreenSupport.ENABLED,
+                browserProxy.getPreferredAppLockScreenState());
+
+            enableAppOnLockScreenToggle().click();
+            assertEquals(2, browserProxy.setAppOnLockScreenCount_);
+
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+            expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
+            expectFalse(enableAppOnLockScreenToggle().checked);
+            expectEquals(
+                LockScreenSupport.SUPPORTED,
+                browserProxy.getPreferredAppLockScreenState());
+          });
+    });
+
+    test('tap-on-enable-note-taking-on-lock-screen-label', function() {
+      return new Promise(function(resolve) {
+               browserProxy.setNoteTakingApps(
+                   [entry('n1', 'v1', true, LockScreenSupport.SUPPORTED)]);
+               stylusPage.async(resolve);
+             })
+          .then(function() {
+            flush();
+
+            assert(isVisible(enableAppOnLockScreenToggle()));
+            expectFalse(enableAppOnLockScreenToggle().checked);
+
+            enableAppOnLockScreenToggleLabel().click();
+            assertEquals(1, browserProxy.setAppOnLockScreenCount_);
+
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+            expectTrue(enableAppOnLockScreenToggle().checked);
+            expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
+
+            expectEquals(
+                LockScreenSupport.ENABLED,
+                browserProxy.getPreferredAppLockScreenState());
+
+            enableAppOnLockScreenToggleLabel().click();
+            assertEquals(2, browserProxy.setAppOnLockScreenCount_);
+
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+            expectFalse(enableAppOnLockScreenToggle().checked);
+            expectEquals(
+                LockScreenSupport.SUPPORTED,
+                browserProxy.getPreferredAppLockScreenState());
+          });
+    });
+
+    test('lock-screen-apps-disabled-by-policy', function() {
+      expectFalse(isVisible(enableAppOnLockScreenToggle()));
+      expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
+
+      return new Promise(function(resolve) {
+               // Add an app with lock screen support.
+               browserProxy.addNoteTakingApp(entry(
+                   'n2', 'v2', true, LockScreenSupport.NOT_ALLOWED_BY_POLICY));
+               stylusPage.async(resolve);
+             })
+          .then(function() {
+            flush();
+            expectTrue(isVisible(noteTakingAppLockScreenSettings()));
+            assert(isVisible(enableAppOnLockScreenToggle()));
+            expectFalse(enableAppOnLockScreenToggle().checked);
+            expectTrue(isVisible(enableAppOnLockScreenPolicyIndicator()));
+
+            // The toggle should be disabled, so enabling app on lock screen
+            // should not be attempted.
+            enableAppOnLockScreenToggle().click();
+            assertEquals(0, browserProxy.setAppOnLockScreenCount_);
+
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+
+            // Tap on label should not work either.
+            enableAppOnLockScreenToggleLabel().click();
+            assertEquals(0, browserProxy.setAppOnLockScreenCount_);
+
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+            expectTrue(isVisible(noteTakingAppLockScreenSettings()));
+            assert(isVisible(enableAppOnLockScreenToggle()));
+            expectFalse(enableAppOnLockScreenToggle().checked);
+            expectTrue(isVisible(enableAppOnLockScreenPolicyIndicator()));
+
+            expectEquals(
+                LockScreenSupport.NOT_ALLOWED_BY_POLICY,
+                browserProxy.getPreferredAppLockScreenState());
+          });
+    });
+
+    test('keep-last-note-on-lock-screen', function() {
+      return new Promise(function(resolve) {
+               browserProxy.setNoteTakingApps([
+                 entry('n1', 'v1', true, LockScreenSupport.NOT_SUPPORTED),
+                 entry('n2', 'v2', false, LockScreenSupport.SUPPORTED)
+               ]);
+               stylusPage.async(resolve);
+             })
+          .then(function() {
+            flush();
+            expectFalse(isVisible(noteTakingAppLockScreenSettings()));
+            expectFalse(isVisible(keepLastNoteOnLockScreenToggle()));
+
+            browserProxy.setNoteTakingApps([
+              entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
+              entry('n2', 'v2', true, LockScreenSupport.SUPPORTED)
+            ]);
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+            expectTrue(isVisible(noteTakingAppLockScreenSettings()));
+            expectFalse(isVisible(keepLastNoteOnLockScreenToggle()));
+
+            browserProxy.setNoteTakingApps([
+              entry('n2', 'v2', true, LockScreenSupport.ENABLED),
+            ]);
+            return new Promise(function(resolve) {
+              stylusPage.async(resolve);
+            });
+          })
+          .then(function() {
+            flush();
+            expectTrue(isVisible(noteTakingAppLockScreenSettings()));
+            assert(isVisible(keepLastNoteOnLockScreenToggle()));
+            expectTrue(keepLastNoteOnLockScreenToggle().checked);
+
+            // Clicking the toggle updates the pref value.
+            keepLastNoteOnLockScreenToggle()
+                .shadowRoot.querySelector('#control')
+                .click();
+            expectFalse(keepLastNoteOnLockScreenToggle().checked);
+
+            expectFalse(
+                devicePage.prefs.settings.restore_last_lock_screen_note.value);
+
+            // Changing the pref value updates the toggle.
+            devicePage.set(
+                'prefs.settings.restore_last_lock_screen_note.value', true);
+            expectTrue(keepLastNoteOnLockScreenToggle().checked);
+          });
+    });
+  });
+
+  suite(assert(TestNames.Storage), function() {
+    /** @type {!Element} */
+    let storagePage;
+
+    /**
+     * Simulate storage size stat callback.
+     * @param {string} availableSize
+     * @param {string} usedSize
+     * @param {number} usedRatio
+     * @param {number} spaceState
+     */
+    function sendStorageSizeStat(
+        usedSize, availableSize, usedRatio, spaceState) {
+      webUIListenerCallback('storage-size-stat-changed', {
+        usedSize: usedSize,
+        availableSize: availableSize,
+        usedRatio: usedRatio,
+        spaceState: spaceState,
+      });
+      flush();
+    }
+
+    /**
+     * @param {string} id
+     * @return {string}
+     */
+    function getStorageItemLabelFromId(id) {
+      const rowItem = storagePage.$$('#' + id).shadowRoot;
+      return rowItem.querySelector('#label').innerText;
+    }
+
+    /**
+     * @param {string} id
+     * @return {string}
+     */
+    function getStorageItemSubLabelFromId(id) {
+      const rowItem = storagePage.$$('#' + id).shadowRoot;
+      return rowItem.querySelector('#subLabel').innerText;
+    }
 
     suiteSetup(function() {
       // Disable animations so sub-pages open within one event loop.
       testing.Test.disableAnimationsAndTransitions();
     });
 
-    setup(function(done) {
-      fakeSystemDisplay = new settings.FakeSystemDisplay();
-      settings.setDisplayApiForTesting(fakeSystemDisplay);
-
-      PolymerTest.clearBody();
-      settings.Router.getInstance().navigateTo(settings.routes.BASIC);
-
-      devicePage = document.createElement('settings-device-page');
-      devicePage.prefs = getFakePrefs();
-      settings.DevicePageBrowserProxyImpl.instance_ =
-          new TestDevicePageBrowserProxy();
-
-      // settings-animated-pages expects a parent with data-page set.
-      const basicPage = document.createElement('div');
-      basicPage.dataset.page = 'basic';
-      basicPage.appendChild(devicePage);
-      document.body.appendChild(basicPage);
-
-      // Allow the light DOM to be distributed to settings-animated-pages.
-      setTimeout(done);
+    setup(function() {
+      return showAndGetDeviceSubpage('storage', routes.STORAGE)
+          .then(function(page) {
+            storagePage = page;
+            storagePage.stopPeriodicUpdate_();
+          });
     });
 
-    /** @return {!Promise<!HTMLElement>} */
-    function showAndGetDeviceSubpage(subpage, expectedRoute) {
-      const row = assert(devicePage.$$(`#main #${subpage}Row`));
-      row.click();
+    test('storage stats size', async function() {
+      // Low available storage space.
+      sendStorageSizeStat('9.1 GB', '0.9 GB', 0.91, StorageSpaceState.LOW);
+      assertEquals('91%', storagePage.$.inUseLabelArea.style.width);
+      assertEquals('9%', storagePage.$.availableLabelArea.style.width);
+      assertTrue(isVisible(storagePage.$$('#lowMessage')));
+      assertFalse(isVisible(storagePage.$$('#criticallyLowMessage')));
+      assertTrue(!!storagePage.$$('#bar.space-low'));
+      assertFalse(!!storagePage.$$('#bar.space-critically-low'));
       assertEquals(
-          expectedRoute, settings.Router.getInstance().getCurrentRoute());
-      const page = devicePage.$$('settings-' + subpage);
-      assert(page);
-      return Promise.resolve(page);
-    }
-
-    /** @param {number} n The number of the display to add. */
-    function addDisplay(n) {
-      const display = {
-        id: 'fakeDisplayId' + n,
-        name: 'fakeDisplayName' + n,
-        mirroring: '',
-        isPrimary: n === 1,
-        isInternal: n === 1,
-        rotation: 0,
-        modes: [
-          {
-            deviceScaleFactor: 1.0,
-            widthInNativePixels: 1920,
-            heightInNativePixels: 1080,
-            width: 1920,
-            height: 1080,
-            refreshRate: 60,
-          },
-          {
-            deviceScaleFactor: 1.0,
-            widthInNativePixels: 1920,
-            heightInNativePixels: 1080,
-            width: 1920,
-            height: 1080,
-            refreshRate: 30,
-          },
-          {
-            deviceScaleFactor: 1.0,
-            widthInNativePixels: 3000,
-            heightInNativePixels: 2000,
-            width: 3000,
-            height: 2000,
-            refreshRate: 45,
-          },
-          {
-            deviceScaleFactor: 1.0,
-            widthInNativePixels: 3000,
-            heightInNativePixels: 2000,
-            width: 3000,
-            height: 2000,
-            refreshRate: 75,
-          },
-          // Include 3 copies of 3000x2000 mode to emulate duplicated modes
-          // reported by some monitors.  Only one is marked 'isNative'.
-          {
-            deviceScaleFactor: 1.0,
-            widthInNativePixels: 3000,
-            heightInNativePixels: 2000,
-            width: 3000,
-            height: 2000,
-            refreshRate: 100,
-          },
-          {
-            isNative: true,
-            deviceScaleFactor: 1.0,
-            widthInNativePixels: 3000,
-            heightInNativePixels: 2000,
-            width: 3000,
-            height: 2000,
-            refreshRate: 100,
-          },
-          {
-            deviceScaleFactor: 1.0,
-            widthInNativePixels: 3000,
-            heightInNativePixels: 2000,
-            width: 3000,
-            height: 2000,
-            refreshRate: 100,
-          }
-        ],
-        bounds: {
-          left: 0,
-          top: 0,
-          width: 1920,
-          height: 1080,
-        },
-        availableDisplayZoomFactors: [1, 1.25, 1.5, 2],
-      };
-      fakeSystemDisplay.addDisplayForTest(display);
-    }
-
-    /**
-     * @param {!Array<!settings.IdleBehavior>} possibleAcIdleBehaviors
-     * @param {!Array<!settings.IdleBehavior>} possibleBatteryIdleBehaviors
-     * @param {settings.IdleBehavior} currAcIdleBehavior
-     * @param {settings.IdleBehavior} currBatteryIdleBehavior
-     * @param {boolean} acIdleManaged
-     * @param {boolean} batteryIdleManaged
-     * @param {settings.LidClosedBehavior} lidClosedBehavior
-     * @param {boolean} lidClosedControlled
-     * @param {boolean} hasLid
-     */
-    function sendPowerManagementSettings(
-        possibleAcIdleBehaviors, possibleBatteryIdleBehaviors,
-        currAcIdleBehavior, currBatteryIdleBehavior, acIdleManaged,
-        batteryIdleManaged, lidClosedBehavior, lidClosedControlled, hasLid) {
-      cr.webUIListenerCallback('power-management-settings-changed', {
-        possibleAcIdleBehaviors: possibleAcIdleBehaviors,
-        possibleBatteryIdleBehaviors: possibleBatteryIdleBehaviors,
-        currentAcIdleBehavior: currAcIdleBehavior,
-        currentBatteryIdleBehavior: currBatteryIdleBehavior,
-        acIdleManaged: acIdleManaged,
-        batteryIdleManaged: batteryIdleManaged,
-        lidClosedBehavior: lidClosedBehavior,
-        lidClosedControlled: lidClosedControlled,
-        hasLid: hasLid,
-      });
-      Polymer.dom.flush();
-    }
-
-    /**
-     * @param {!HTMLElement} select
-     * @param {!value} string
-     */
-    function selectValue(select, value) {
-      select.value = value;
-      select.dispatchEvent(new CustomEvent('change'));
-      Polymer.dom.flush();
-    }
-
-    /**
-     * @param {!HTMLElement} pointersPage
-     * @param {boolean} expected
-     */
-    function expectReverseScrollValue(pointersPage, expected) {
-      const reverseScrollToggle =
-          pointersPage.$$('#enableReverseScrollingToggle');
-      assertEquals(expected, reverseScrollToggle.checked);
-      expectEquals(
-          expected, devicePage.prefs.settings.touchpad.natural_scroll.value);
-    }
-
-    /**
-     * Returns whether the element both exists and is visible.
-     * @param {?Element} element
-     * @return {boolean}
-     */
-    function isVisible(element) {
-      // offsetWidth and offsetHeight reflect more ways that an element could be
-      // hidden, compared to checking the hidden attribute directly.
-      return !!element && element.offsetWidth > 0 && element.offsetHeight > 0;
-    }
-
-    /**
-     * Checks that the deep link to a setting focuses the correct element.
-     * @param {!settings.Route} route
-     * @param {!string} settingId
-     * @param {!Element} deepLinkElement The element that should be focused by
-     *                                   the deep link
-     * @param {!string} elementDesc A human-readable description of the element,
-     *                              for assertion messages
-     */
-    async function checkDeepLink(
-        route, settingId, deepLinkElement, elementDesc) {
-      const params = new URLSearchParams();
-      params.append('settingId', settingId);
-      settings.Router.getInstance().navigateTo(route, params);
-
-      await test_util.waitAfterNextRender(deepLinkElement);
+          '9.1 GB',
+          storagePage.$.inUseLabelArea.querySelector('.storage-size')
+              .innerText);
       assertEquals(
-          deepLinkElement, getDeepActiveElement(),
-          `${elementDesc} should be focused for settingId=${settingId}.`);
-    }
+          '0.9 GB',
+          storagePage.$.availableLabelArea.querySelector('.storage-size')
+              .innerText);
 
-    test(assert(TestNames.DevicePage), function() {
-      expectTrue(isVisible(devicePage.$$('#pointersRow')));
-      expectTrue(isVisible(devicePage.$$('#keyboardRow')));
-      expectTrue(isVisible(devicePage.$$('#displayRow')));
+      // Critically low available storage space.
+      sendStorageSizeStat(
+          '9.7 GB', '0.3 GB', 0.97, StorageSpaceState.CRITICALLY_LOW);
+      assertEquals('97%', storagePage.$.inUseLabelArea.style.width);
+      assertEquals('3%', storagePage.$.availableLabelArea.style.width);
+      assertFalse(isVisible(storagePage.$$('#lowMessage')));
+      assertTrue(isVisible(storagePage.$$('#criticallyLowMessage')));
+      assertFalse(!!storagePage.$$('#bar.space-low'));
+      assertTrue(!!storagePage.$$('#bar.space-critically-low'));
+      assertEquals(
+          '9.7 GB',
+          storagePage.$.inUseLabelArea.querySelector('.storage-size')
+              .innerText);
+      assertEquals(
+          '0.3 GB',
+          storagePage.$.availableLabelArea.querySelector('.storage-size')
+              .innerText);
 
-      cr.webUIListenerCallback('has-mouse-changed', false);
-      expectTrue(isVisible(devicePage.$$('#pointersRow')));
-      cr.webUIListenerCallback('has-pointing-stick-changed', false);
-      expectTrue(isVisible(devicePage.$$('#pointersRow')));
-      cr.webUIListenerCallback('has-touchpad-changed', false);
-      expectFalse(isVisible(devicePage.$$('#pointersRow')));
-      cr.webUIListenerCallback('has-mouse-changed', true);
-      expectTrue(isVisible(devicePage.$$('#pointersRow')));
+      // Normal storage usage.
+      sendStorageSizeStat('2.5 GB', '7.5 GB', 0.25, StorageSpaceState.NORMAL);
+      assertEquals('25%', storagePage.$.inUseLabelArea.style.width);
+      assertEquals('75%', storagePage.$.availableLabelArea.style.width);
+      assertFalse(isVisible(storagePage.$$('#lowMessage')));
+      assertFalse(isVisible(storagePage.$$('#criticallyLowMessage')));
+      assertFalse(!!storagePage.$$('#bar.space-low'));
+      assertFalse(!!storagePage.$$('#bar.space-critically-low'));
+      assertEquals(
+          '2.5 GB',
+          storagePage.$.inUseLabelArea.querySelector('.storage-size')
+              .innerText);
+      assertEquals(
+          '7.5 GB',
+          storagePage.$.availableLabelArea.querySelector('.storage-size')
+              .innerText);
     });
 
-    suite(assert(TestNames.Pointers), function() {
-      let pointersPage;
+    test('system size', async function() {
+      assertEquals('System', storagePage.$$('#systemSizeLabel').innerText);
+      assertEquals(
+          'Calculating…', storagePage.$$('#systemSizeSubLabel').innerText);
 
-      setup(function() {
-        return showAndGetDeviceSubpage('pointers', settings.routes.POINTERS)
-            .then(function(page) {
-              pointersPage = page;
-            });
-      });
+      // Send system size callback.
+      webUIListenerCallback('storage-system-size-changed', '8.4 GB');
+      flush();
+      assertEquals('8.4 GB', storagePage.$$('#systemSizeSubLabel').innerText);
 
-      test('subpage responds to pointer attach/detach', function() {
-        assertEquals(
-            settings.routes.POINTERS,
-            settings.Router.getInstance().getCurrentRoute());
-        assertTrue(isVisible(pointersPage.$$('#mouse')));
-        assertTrue(isVisible(pointersPage.$$('#mouse h2')));
-        assertTrue(isVisible(pointersPage.$$('#pointingStick')));
-        assertTrue(isVisible(pointersPage.$$('#pointingStick h2')));
-        assertTrue(isVisible(pointersPage.$$('#touchpad')));
-        assertTrue(isVisible(pointersPage.$$('#touchpad h2')));
-
-        cr.webUIListenerCallback('has-touchpad-changed', false);
-        assertEquals(
-            settings.routes.POINTERS,
-            settings.Router.getInstance().getCurrentRoute());
-        assertTrue(isVisible(pointersPage.$$('#mouse')));
-        assertTrue(isVisible(pointersPage.$$('#mouse h2')));
-        assertTrue(isVisible(pointersPage.$$('#pointingStick')));
-        assertTrue(isVisible(pointersPage.$$('#pointingStick h2')));
-        assertFalse(isVisible(pointersPage.$$('#touchpad')));
-        assertFalse(isVisible(pointersPage.$$('#touchpad h2')));
-
-        cr.webUIListenerCallback('has-pointing-stick-changed', false);
-        assertEquals(
-            settings.routes.POINTERS,
-            settings.Router.getInstance().getCurrentRoute());
-        assertTrue(isVisible(pointersPage.$$('#mouse')));
-        assertFalse(isVisible(pointersPage.$$('#mouse h2')));
-        assertFalse(isVisible(pointersPage.$$('#pointingStick')));
-        assertFalse(isVisible(pointersPage.$$('#pointingStick h2')));
-        assertFalse(isVisible(pointersPage.$$('#touchpad')));
-        assertFalse(isVisible(pointersPage.$$('#touchpad h2')));
-
-        cr.webUIListenerCallback('has-mouse-changed', false);
-        assertEquals(
-            settings.routes.DEVICE,
-            settings.Router.getInstance().getCurrentRoute());
-        assertFalse(isVisible(devicePage.$$('#main #pointersRow')));
-
-        cr.webUIListenerCallback('has-touchpad-changed', true);
-        assertTrue(isVisible(devicePage.$$('#main #pointersRow')));
-
-        return showAndGetDeviceSubpage('pointers', settings.routes.POINTERS)
-            .then(function(page) {
-              assertFalse(isVisible(pointersPage.$$('#mouse')));
-              assertFalse(isVisible(pointersPage.$$('#mouse h2')));
-              assertFalse(isVisible(pointersPage.$$('#pointingStick')));
-              assertFalse(isVisible(pointersPage.$$('#pointingStick h2')));
-              assertTrue(isVisible(pointersPage.$$('#touchpad')));
-              assertFalse(isVisible(pointersPage.$$('#touchpad h2')));
-
-              cr.webUIListenerCallback('has-mouse-changed', true);
-              assertEquals(
-                  settings.routes.POINTERS,
-                  settings.Router.getInstance().getCurrentRoute());
-              assertTrue(isVisible(pointersPage.$$('#mouse')));
-              assertTrue(isVisible(pointersPage.$$('#mouse h2')));
-              assertFalse(isVisible(pointersPage.$$('#pointingStick')));
-              assertFalse(isVisible(pointersPage.$$('#pointingStick h2')));
-              assertTrue(isVisible(pointersPage.$$('#touchpad')));
-              assertTrue(isVisible(pointersPage.$$('#touchpad h2')));
-            });
-      });
-
-      test('mouse', function() {
-        expectTrue(isVisible(pointersPage.$$('#mouse')));
-
-        const slider = assert(pointersPage.$$('#mouse settings-slider'));
-        expectEquals(4, slider.pref.value);
-        MockInteractions.pressAndReleaseKeyOn(
-            slider.shadowRoot.querySelector('cr-slider'), 37, [], 'ArrowLeft');
-        expectEquals(3, devicePage.prefs.settings.mouse.sensitivity2.value);
-
-        pointersPage.set('prefs.settings.mouse.sensitivity2.value', 5);
-        expectEquals(5, slider.pref.value);
-      });
-
-      test('touchpad', function() {
-        expectTrue(isVisible(pointersPage.$$('#touchpad')));
-
-        expectTrue(pointersPage.$$('#touchpad #enableTapToClick').checked);
-        expectFalse(pointersPage.$$('#touchpad #enableTapDragging').checked);
-
-        const slider = assert(pointersPage.$$('#touchpad settings-slider'));
-        expectEquals(3, slider.pref.value);
-        MockInteractions.pressAndReleaseKeyOn(
-            slider.shadowRoot.querySelector('cr-slider'), 39 /* right */, [],
-            'ArrowRight');
-        expectEquals(4, devicePage.prefs.settings.touchpad.sensitivity2.value);
-
-        pointersPage.set('prefs.settings.touchpad.sensitivity2.value', 2);
-        expectEquals(2, slider.pref.value);
-      });
-
-      test('haptic touchpad', function() {
-        expectTrue(pointersPage.$$('#touchpadHapticFeedbackToggle').checked);
-
-        const slider =
-            assert(pointersPage.$$('#touchpadHapticClickSensitivity'));
-        expectEquals(3, slider.pref.value);
-        MockInteractions.pressAndReleaseKeyOn(
-            slider.shadowRoot.querySelector('cr-slider'), 39 /* right */, [],
-            'ArrowRight');
-        expectEquals(
-            5,
-            devicePage.prefs.settings.touchpad.haptic_click_sensitivity.value);
-
-        pointersPage.set(
-            'prefs.settings.touchpad.haptic_click_sensitivity.value', 1);
-        expectEquals(1, slider.pref.value);
-      });
-
-      test('link doesn\'t activate control', function() {
-        expectReverseScrollValue(pointersPage, false);
-
-        // Tapping the link shouldn't enable the radio button.
-        const reverseScrollLabel =
-            pointersPage.$$('#enableReverseScrollingLabel');
-        const a = reverseScrollLabel.$.container.querySelector('a');
-        expectTrue(!!a);
-        // Prevent actually opening a link, which would block test.
-        a.removeAttribute('href');
-        a.click();
-        expectReverseScrollValue(pointersPage, false);
-
-        // Check specifically clicking toggle changes pref.
-        const reverseScrollToggle =
-            pointersPage.$$('#enableReverseScrollingToggle');
-        reverseScrollToggle.click();
-        expectReverseScrollValue(pointersPage, true);
-        devicePage.set('prefs.settings.touchpad.natural_scroll.value', false);
-        expectReverseScrollValue(pointersPage, false);
-
-        // Check specifically clicking the row changes pref.
-        const reverseScrollSettings = pointersPage.$$('#reverseScrollRow');
-        reverseScrollSettings.click();
-        expectReverseScrollValue(pointersPage, true);
-        devicePage.set('prefs.settings.touchpad.natural_scroll.value', false);
-        expectReverseScrollValue(pointersPage, false);
-      });
-
-      test('pointing stick acceleration toggle', function() {
-        const toggle = assert(pointersPage.$$('#pointingStickAcceleration'));
-        expectEquals(true, toggle.pref.value);
-        toggle.click();
-        expectEquals(
-            false, devicePage.prefs.settings.pointing_stick.acceleration.value);
-
-        pointersPage.set(
-            'prefs.settings.pointing_stick.acceleration.value', true);
-        expectEquals(true, toggle.pref.value);
-      });
-
-      test('pointing stick speed slider', function() {
-        const slider =
-            assert(pointersPage.$$('#pointingStick settings-slider'));
-        expectEquals(4, slider.pref.value);
-        MockInteractions.pressAndReleaseKeyOn(
-            slider.shadowRoot.querySelector('cr-slider'), 37, [], 'ArrowLeft');
-        expectEquals(
-            3, devicePage.prefs.settings.pointing_stick.sensitivity.value);
-
-        pointersPage.set('prefs.settings.pointing_stick.sensitivity.value', 5);
-        expectEquals(5, slider.pref.value);
-      });
-
-      test('Deep link to pointing stick primary button setting', async () => {
-        return checkDeepLink(
-            settings.routes.POINTERS, '437',
-            pointersPage.$$('#pointingStickSwapButtonDropdown')
-                .shadowRoot.querySelector('select'),
-            'Pointing stick primary button dropdown');
-      });
-
-      test('Deep link to pointing stick acceleration setting', async () => {
-        return checkDeepLink(
-            settings.routes.POINTERS, '436',
-            pointersPage.$$('#pointingStickAcceleration')
-                .shadowRoot.querySelector('cr-toggle'),
-            'Pointing stick acceleration slider');
-      });
-
-      test('Deep link to pointing stick speed setting', async () => {
-        return checkDeepLink(
-            settings.routes.POINTERS, '435',
-            pointersPage.$$('#pointingStickSpeedSlider')
-                .shadowRoot.querySelector('cr-slider'),
-            'Pointing stick speed slider');
-      });
-
-      test('Deep link to touchpad speed', async () => {
-        return checkDeepLink(
-            settings.routes.POINTERS, '405',
-            pointersPage.$$('#touchpadSensitivity')
-                .shadowRoot.querySelector('cr-slider'),
-            'Touchpad speed slider');
-      });
+      // In guest mode, the system row should be hidden.
+      storagePage.isGuest_ = true;
+      flush();
+      assertFalse(isVisible(storagePage.$$('#systemSize')));
     });
 
-    suite(assert(TestNames.Keyboard), function() {
-      const name = k => `prefs.settings.language.${k}.value`;
-      const get = k => devicePage.get(name(k));
-      const set = (k, v) => devicePage.set(name(k), v);
-      let keyboardPage;
+    test('apps extensions size', async function() {
+      assertEquals(
+          'Apps and extensions', getStorageItemLabelFromId('appsSize'));
+      assertEquals('Calculating…', getStorageItemSubLabelFromId('appsSize'));
 
-      setup(async () => {
-        keyboardPage =
-            await showAndGetDeviceSubpage('keyboard', settings.routes.KEYBOARD);
-      });
-
-      test('keyboard', async () => {
-        // Initially, the optional keys are hidden.
-        expectFalse(!!keyboardPage.$$('#capsLockKey'));
-
-        // Pretend no internal keyboard is available.
-        const keyboardParams = {
-          'showCapsLock': false,
-          'showExternalMetaKey': false,
-          'showAppleCommandKey': false,
-          'hasLauncherKey': false,
-          'hasAssistantKey': false,
-        };
-        cr.webUIListenerCallback('show-keys-changed', keyboardParams);
-        Polymer.dom.flush();
-        expectFalse(!!keyboardPage.$$('#launcherKey'));
-        expectFalse(!!keyboardPage.$$('#capsLockKey'));
-        expectFalse(!!keyboardPage.$$('#externalMetaKey'));
-        expectFalse(!!keyboardPage.$$('#externalCommandKey'));
-        expectFalse(!!keyboardPage.$$('#assistantKey'));
-
-        // Pretend a Caps Lock key is now available.
-        keyboardParams['showCapsLock'] = true;
-        cr.webUIListenerCallback('show-keys-changed', keyboardParams);
-        Polymer.dom.flush();
-        expectFalse(!!keyboardPage.$$('#launcherKey'));
-        expectTrue(!!keyboardPage.$$('#capsLockKey'));
-        expectFalse(!!keyboardPage.$$('#externalMetaKey'));
-        expectFalse(!!keyboardPage.$$('#externalCommandKey'));
-        expectFalse(!!keyboardPage.$$('#assistantKey'));
-
-        // Add a non-Apple external keyboard.
-        keyboardParams['showExternalMetaKey'] = true;
-        cr.webUIListenerCallback('show-keys-changed', keyboardParams);
-        Polymer.dom.flush();
-        expectFalse(!!keyboardPage.$$('#launcherKey'));
-        expectTrue(!!keyboardPage.$$('#capsLockKey'));
-        expectTrue(!!keyboardPage.$$('#externalMetaKey'));
-        expectFalse(!!keyboardPage.$$('#externalCommandKey'));
-        expectFalse(!!keyboardPage.$$('#assistantKey'));
-
-        // Add an Apple keyboard.
-        keyboardParams['showAppleCommandKey'] = true;
-        cr.webUIListenerCallback('show-keys-changed', keyboardParams);
-        Polymer.dom.flush();
-        expectFalse(!!keyboardPage.$$('#launcherKey'));
-        expectTrue(!!keyboardPage.$$('#capsLockKey'));
-        expectTrue(!!keyboardPage.$$('#externalMetaKey'));
-        expectTrue(!!keyboardPage.$$('#externalCommandKey'));
-        expectFalse(!!keyboardPage.$$('#assistantKey'));
-
-        // Add an internal keyboard.
-        keyboardParams['hasLauncherKey'] = true;
-        cr.webUIListenerCallback('show-keys-changed', keyboardParams);
-        Polymer.dom.flush();
-        expectTrue(!!keyboardPage.$$('#launcherKey'));
-        expectTrue(!!keyboardPage.$$('#capsLockKey'));
-        expectTrue(!!keyboardPage.$$('#externalMetaKey'));
-        expectTrue(!!keyboardPage.$$('#externalCommandKey'));
-        expectFalse(!!keyboardPage.$$('#assistantKey'));
-
-        // Pretend an Assistant key is now available.
-        keyboardParams['hasAssistantKey'] = true;
-        cr.webUIListenerCallback('show-keys-changed', keyboardParams);
-        Polymer.dom.flush();
-        expectTrue(!!keyboardPage.$$('#launcherKey'));
-        expectTrue(!!keyboardPage.$$('#capsLockKey'));
-        expectTrue(!!keyboardPage.$$('#externalMetaKey'));
-        expectTrue(!!keyboardPage.$$('#externalCommandKey'));
-        expectTrue(!!keyboardPage.$$('#assistantKey'));
-
-        const collapse = keyboardPage.$$('iron-collapse');
-        assertTrue(!!collapse);
-        expectTrue(collapse.opened);
-
-        expectEquals(500, keyboardPage.$$('#delaySlider').pref.value);
-        expectEquals(500, keyboardPage.$$('#repeatRateSlider').pref.value);
-
-        // Test interaction with the settings-slider's underlying cr-slider.
-        MockInteractions.pressAndReleaseKeyOn(
-            keyboardPage.$$('#delaySlider')
-                .shadowRoot.querySelector('cr-slider'),
-            37 /* left */, [], 'ArrowLeft');
-        MockInteractions.pressAndReleaseKeyOn(
-            keyboardPage.$$('#repeatRateSlider')
-                .shadowRoot.querySelector('cr-slider'),
-            39, [], 'ArrowRight');
-        await test_util.flushTasks();
-        expectEquals(1000, get('xkb_auto_repeat_delay_r2'));
-        expectEquals(300, get('xkb_auto_repeat_interval_r2'));
-
-        // Test sliders change when prefs change.
-        set('xkb_auto_repeat_delay_r2', 1500);
-        await test_util.flushTasks();
-        expectEquals(1500, keyboardPage.$$('#delaySlider').pref.value);
-        set('xkb_auto_repeat_interval_r2', 2000);
-        await test_util.flushTasks();
-        expectEquals(2000, keyboardPage.$$('#repeatRateSlider').pref.value);
-
-        // Test sliders round to nearest value when prefs change.
-        set('xkb_auto_repeat_delay_r2', 600);
-        await test_util.flushTasks();
-        expectEquals(500, keyboardPage.$$('#delaySlider').pref.value);
-        set('xkb_auto_repeat_interval_r2', 45);
-        await test_util.flushTasks();
-        expectEquals(50, keyboardPage.$$('#repeatRateSlider').pref.value);
-
-        set('xkb_auto_repeat_enabled_r2', false);
-        expectFalse(collapse.opened);
-
-        // Test keyboard shortcut viewer button.
-        keyboardPage.$$('#keyboardShortcutViewer').click();
-        expectEquals(
-            1,
-            settings.DevicePageBrowserProxyImpl.getInstance()
-                .keyboardShortcutViewerShown_);
-      });
-
-      test('Deep link to keyboard shortcuts', async () => {
-        return checkDeepLink(
-            settings.routes.KEYBOARD, '413',
-            keyboardPage.$$('#keyboardShortcutViewer')
-                .shadowRoot.querySelector('cr-icon-button'),
-            'Keyboard shortcuts button');
-      });
+      // Send apps size callback.
+      webUIListenerCallback('storage-apps-size-changed', '59.5 KB');
+      flush();
+      assertEquals('59.5 KB', getStorageItemSubLabelFromId('appsSize'));
     });
 
-    suite(assert(TestNames.Display), function() {
-      let displayPage;
-      let browserProxy;
+    test('other users size', async function() {
+      // The other users row is visible by default, displaying
+      // "calculating...".
+      assertTrue(isVisible(storagePage.$$('#otherUsersSize')));
+      assertEquals('Other users', getStorageItemLabelFromId('otherUsersSize'));
+      assertEquals(
+          'Calculating…', getStorageItemSubLabelFromId('otherUsersSize'));
 
-      setup(async () => {
-        displayPage =
-            await showAndGetDeviceSubpage('display', settings.routes.DISPLAY);
-        browserProxy = settings.DevicePageBrowserProxyImpl.getInstance();
-        await fakeSystemDisplay.getInfoCalled.promise;
-      });
+      // Simulate absence of other users.
+      webUIListenerCallback('storage-other-users-size-changed', '0 B', true);
+      flush();
+      assertFalse(isVisible(storagePage.$$('#otherUsersSize')));
 
-      test('display tests', function() {
-        // Verify all the conditionals that get run during page load
-        // before the display info has been populated.
-        expectEquals(undefined, displayPage.displays);
-        expectFalse(displayPage.showMirror_(true, displayPage.displays));
-        expectFalse(displayPage.showMirror_(false, displayPage.displays));
-        expectFalse(displayPage.isMirrored_(displayPage.displays));
-        expectFalse(
-            displayPage.showUnifiedDesktop_(true, true, displayPage.displays));
-        expectFalse(displayPage.showUnifiedDesktop_(
-            false, false, displayPage.displays));
-        expectEquals(
-            displayPage.invalidDisplayId_,
-            browserProxy.lastHighlightedDisplayId_);
+      // Send other users callback with a size that is not null.
+      webUIListenerCallback(
+          'storage-other-users-size-changed', '322 MB', false);
+      flush();
+      assertTrue(isVisible(storagePage.$$('#otherUsersSize')));
+      assertEquals('322 MB', getStorageItemSubLabelFromId('otherUsersSize'));
 
-        // Add a display.
-        addDisplay(1);
-        fakeSystemDisplay.onDisplayChanged.callListeners();
-
-        return Promise
-            .all([
-              fakeSystemDisplay.getInfoCalled.promise,
-              fakeSystemDisplay.getLayoutCalled.promise,
-            ])
-            .then(function() {
-              // There should be a single display which should be primary and
-              // selected. Mirroring should be disabled.
-              expectEquals(1, displayPage.displays.length);
-              expectEquals(
-                  displayPage.displays[0].id, displayPage.selectedDisplay.id);
-              expectEquals(
-                  displayPage.displays[0].id, displayPage.primaryDisplayId);
-              expectFalse(displayPage.showMirror_(false, displayPage.displays));
-              expectFalse(displayPage.isMirrored_(displayPage.displays));
-
-              // Verify unified desktop only shown when enabled.
-              expectTrue(displayPage.showUnifiedDesktop_(
-                  true, true, displayPage.displays));
-              expectFalse(displayPage.showUnifiedDesktop_(
-                  false, false, displayPage.displays));
-
-              // Sanity check the first display is internal.
-              expectTrue(displayPage.displays[0].isInternal);
-
-              // Ambient EQ only shown when enabled.
-              expectTrue(displayPage.showAmbientColorSetting_(
-                  true, displayPage.displays[0]));
-              expectFalse(displayPage.showAmbientColorSetting_(
-                  false, displayPage.displays[0]));
-
-              // Verify that the arrangement section is not shown.
-              expectEquals(null, displayPage.$$('#arrangement-section'));
-
-              // Add a second display.
-              addDisplay(2);
-              fakeSystemDisplay.onDisplayChanged.callListeners();
-
-              return Promise.all([
-                fakeSystemDisplay.getInfoCalled.promise,
-                fakeSystemDisplay.getLayoutCalled.promise,
-                new Promise(function(resolve, reject) {
-                  setTimeout(resolve);
-                })
-              ]);
-            })
-            .then(function() {
-              // There should be two displays, the first should be primary and
-              // selected. Mirroring should be enabled but set to false.
-              expectEquals(2, displayPage.displays.length);
-              expectEquals(
-                  displayPage.displays[0].id, displayPage.selectedDisplay.id);
-              expectEquals(
-                  displayPage.displays[0].id, displayPage.primaryDisplayId);
-              expectTrue(displayPage.showMirror_(false, displayPage.displays));
-              expectFalse(displayPage.isMirrored_(displayPage.displays));
-
-              // Verify unified desktop only shown when enabled.
-              expectTrue(displayPage.showUnifiedDesktop_(
-                  true, true, displayPage.displays));
-              expectFalse(displayPage.showUnifiedDesktop_(
-                  false, false, displayPage.displays));
-
-              // Sanity check the second display is not internal.
-              expectFalse(displayPage.displays[1].isInternal);
-
-
-              // Verify the display modes are parsed correctly.
-
-              // 5 total modes, 2 parent modes.
-              expectEquals(7, displayPage.modeToParentModeMap_.size);
-              expectEquals(0, displayPage.modeToParentModeMap_.get(0));
-              expectEquals(0, displayPage.modeToParentModeMap_.get(1));
-              expectEquals(5, displayPage.modeToParentModeMap_.get(2));
-              expectEquals(5, displayPage.modeToParentModeMap_.get(3));
-              expectEquals(5, displayPage.modeToParentModeMap_.get(4));
-              expectEquals(5, displayPage.modeToParentModeMap_.get(5));
-              expectEquals(5, displayPage.modeToParentModeMap_.get(6));
-
-              // Two resolution options, one for each parent mode.
-              expectEquals(2, displayPage.refreshRateList_.length);
-
-              // Each parent mode has the correct number of refresh rates.
-              expectEquals(2, displayPage.parentModeToRefreshRateMap_.size);
-              expectEquals(
-                  2, displayPage.parentModeToRefreshRateMap_.get(0).length);
-              expectEquals(
-                  3, displayPage.parentModeToRefreshRateMap_.get(5).length);
-
-              // Ambient EQ never shown on non-internal display regardless of
-              // whether it is enabled.
-              expectFalse(displayPage.showAmbientColorSetting_(
-                  true, displayPage.displays[1]));
-              expectFalse(displayPage.showAmbientColorSetting_(
-                  false, displayPage.displays[1]));
-
-              // Verify that the arrangement section is shown.
-              expectTrue(!!displayPage.$$('#arrangement-section'));
-
-              // Select the second display and make it primary. Also change the
-              // orientation of the second display.
-              const displayLayout = displayPage.$$('#displayLayout');
-              assertTrue(!!displayLayout);
-              const displayDiv = displayLayout.$$('#_fakeDisplayId2');
-              assertTrue(!!displayDiv);
-              displayDiv.click();
-              expectEquals(
-                  displayPage.displays[1].id, displayPage.selectedDisplay.id);
-
-              displayPage.updatePrimaryDisplay_({target: {value: '0'}});
-              displayPage.onOrientationChange_({target: {value: '90'}});
-              fakeSystemDisplay.onDisplayChanged.callListeners();
-
-              return Promise.all([
-                fakeSystemDisplay.getInfoCalled.promise,
-                fakeSystemDisplay.getLayoutCalled.promise,
-                new Promise(function(resolve, reject) {
-                  setTimeout(resolve);
-                })
-              ]);
-            })
-            .then(function() {
-              // Confirm that the second display is selected, primary, and
-              // rotated.
-              expectEquals(2, displayPage.displays.length);
-              expectEquals(
-                  displayPage.displays[1].id, displayPage.selectedDisplay.id);
-              expectTrue(displayPage.displays[1].isPrimary);
-              expectEquals(
-                  displayPage.displays[1].id, displayPage.primaryDisplayId);
-              expectEquals(90, displayPage.displays[1].rotation);
-
-              // Mirror the displays.
-              displayPage.onMirroredTap_({target: {blur: function() {}}});
-              fakeSystemDisplay.onDisplayChanged.callListeners();
-
-              return Promise.all([
-                fakeSystemDisplay.getInfoCalled.promise,
-                fakeSystemDisplay.getLayoutCalled.promise,
-                new Promise(function(resolve, reject) {
-                  setTimeout(resolve);
-                })
-              ]);
-            })
-            .then(function() {
-              // Confirm that there is now only one display and that it is
-              // primary and mirroring is enabled.
-              expectEquals(1, displayPage.displays.length);
-              expectEquals(
-                  displayPage.displays[0].id, displayPage.selectedDisplay.id);
-              expectTrue(displayPage.displays[0].isPrimary);
-              expectTrue(displayPage.showMirror_(false, displayPage.displays));
-              expectTrue(displayPage.isMirrored_(displayPage.displays));
-
-              // Verify that the arrangement section is shown while mirroring.
-              expectTrue(!!displayPage.$$('#arrangement-section'));
-
-              // Ensure that the zoom value remains unchanged while draggging.
-              function pointerEvent(eventType, ratio) {
-                const crSlider = displayPage.$.displaySizeSlider.$.slider;
-                const rect = crSlider.$.container.getBoundingClientRect();
-                crSlider.dispatchEvent(new PointerEvent(eventType, {
-                  buttons: 1,
-                  pointerId: 1,
-                  clientX: rect.left + (ratio * rect.width),
-                }));
-              }
-
-              expectEquals(1, displayPage.selectedZoomPref_.value);
-              pointerEvent('pointerdown', .6);
-              expectEquals(1, displayPage.selectedZoomPref_.value);
-              pointerEvent('pointermove', .3);
-              expectEquals(1, displayPage.selectedZoomPref_.value);
-              pointerEvent('pointerup', 0);
-              expectEquals(1.25, displayPage.selectedZoomPref_.value);
-
-              // Navigate out of the display page.
-              return showAndGetDeviceSubpage('power', settings.routes.POWER);
-            })
-            .then(function() {
-              // Moving out of the display page should set selected display to
-              // invalid.
-              expectEquals(
-                  displayPage.invalidDisplayId_,
-                  browserProxy.lastHighlightedDisplayId_);
-
-              // Navigate back to the display page.
-              return showAndGetDeviceSubpage(
-                  'display', settings.routes.DISPLAY);
-            });
-      });
-
-      test('Deep link to display mirroring', async () => {
-        const params = new URLSearchParams();
-        params.append('settingId', '428');
-        settings.Router.getInstance().navigateTo(
-            settings.routes.DISPLAY, params);
-        // await fakeSystemDisplay.getInfoCalled.promise;
-
-        addDisplay(1);
-        addDisplay(1);
-        fakeSystemDisplay.onDisplayChanged.callListeners();
-        await fakeSystemDisplay.getInfoCalled.promise;
-        await fakeSystemDisplay.getLayoutCalled.promise;
-        expectEquals(2, displayPage.displays.length);
-
-        Polymer.dom.flush();
-        // await fakeSystemDisplay.getInfoCalled.promise;
-        assert(displayPage);
-        assertEquals(2, displayPage.displays.length);
-        assertTrue(displayPage.shouldShowArrangementSection_());
-
-        const deepLinkElement =
-            displayPage.$$('#displayMirrorCheckbox').$$('#checkbox');
-        await test_util.waitAfterNextRender(deepLinkElement);
-        assertEquals(
-            deepLinkElement, getDeepActiveElement(),
-            'Display mirroring checkbox should be focused for settingId=428.');
-      });
-
-      test('Keyboard display arrangement', async () => {
-        addDisplay(1);
-        addDisplay(2);
-        fakeSystemDisplay.onDisplayChanged.callListeners();
-
-        return Promise
-            .all([
-              fakeSystemDisplay.getInfoCalled.promise,
-              fakeSystemDisplay.getLayoutCalled.promise,
-            ])
-            .then(() => {
-              return new Promise(resolve => {
-                Polymer.dom.flush();
-
-                assert(displayPage);
-                assertEquals(2, displayPage.displays.length);
-                assertTrue(displayPage.shouldShowArrangementSection_());
-
-                expectTrue(!!displayPage.$$('#arrangement-section'));
-
-                expectTrue(
-                    displayPage.showMirror_(false, displayPage.displays));
-                expectFalse(displayPage.isMirrored_(displayPage.displays));
-
-                Polymer.dom.flush();
-
-                displayPage.async(resolve);
-              });
-            })
-            .then(() => {
-              const displayLayout = displayPage.$$('#displayLayout');
-              const display = displayLayout.$$('#_fakeDisplayId2');
-              const layout =
-                  displayLayout.displayLayoutMap_.get('fakeDisplayId2');
-
-              expectEquals(layout.parentId, 'fakeDisplayId1');
-              expectEquals(layout.position, 'right');
-
-              const offset = displayLayout.keyboardDragStepSize /
-                  displayLayout.visualScale;
-
-              display.focus();
-
-              display.dispatchEvent(new KeyboardEvent(
-                  'keydown', {key: 'ArrowDown', bubbles: true}));
-              display.dispatchEvent(
-                  new KeyboardEvent('keydown', {key: 'Enter', bubbles: true}));
-              expectEquals(offset, layout.offset);
-
-              display.dispatchEvent(new KeyboardEvent(
-                  'keydown', {key: 'ArrowDown', bubbles: true}));
-              display.dispatchEvent(
-                  new KeyboardEvent('keydown', {key: 'Enter', bubbles: true}));
-              expectEquals(offset * 2, layout.offset);
-
-              display.dispatchEvent(new KeyboardEvent(
-                  'keydown', {key: 'ArrowUp', bubbles: true}));
-              display.dispatchEvent(
-                  new KeyboardEvent('keydown', {key: 'Enter', bubbles: true}));
-              expectEquals(offset, layout.offset);
-            });
-      });
-    });
-
-    suite(assert(TestNames.KeyboardArrangementDisabled), function() {
-      let displayPage;
-      let browserProxy;
-
-      setup(async () => {
-        displayPage =
-            await showAndGetDeviceSubpage('display', settings.routes.DISPLAY);
-        browserProxy = settings.DevicePageBrowserProxyImpl.getInstance();
-        await fakeSystemDisplay.getInfoCalled.promise;
-      });
-
-      test('Arrow key arrangement diasabled test', async () => {
-        addDisplay(1);
-        addDisplay(2);
-        fakeSystemDisplay.onDisplayChanged.callListeners();
-
-        return Promise
-            .all([
-              fakeSystemDisplay.getInfoCalled.promise,
-              fakeSystemDisplay.getLayoutCalled.promise,
-            ])
-            .then(() => {
-              return new Promise(resolve => {
-                Polymer.dom.flush();
-
-                assert(displayPage);
-                assertEquals(2, displayPage.displays.length);
-                assertTrue(displayPage.shouldShowArrangementSection_());
-
-                expectTrue(!!displayPage.$$('#arrangement-section'));
-
-                expectTrue(
-                    displayPage.showMirror_(false, displayPage.displays));
-                expectFalse(displayPage.isMirrored_(displayPage.displays));
-
-                Polymer.dom.flush();
-
-                displayPage.async(resolve);
-              });
-            })
-            .then(() => {
-              const displayLayout = displayPage.$$('#displayLayout');
-              const display = displayLayout.$$('#_fakeDisplayId2');
-              const layout =
-                  displayLayout.displayLayoutMap_.get('fakeDisplayId2');
-
-              expectEquals(layout.parentId, 'fakeDisplayId1');
-              expectEquals(layout.position, 'right');
-
-              display.focus();
-
-              // All keyboard interaction should be ignored
-
-              display.dispatchEvent(new KeyboardEvent(
-                  'keydown', {key: 'ArrowUp', bubbles: true}));
-              display.dispatchEvent(
-                  new KeyboardEvent('keydown', {key: 'Enter', bubbles: true}));
-              expectEquals(0, layout.offset);
-
-              display.dispatchEvent(new KeyboardEvent(
-                  'keydown', {key: 'ArrowDown', bubbles: true}));
-              display.dispatchEvent(
-                  new KeyboardEvent('keydown', {key: 'Enter', bubbles: true}));
-              expectEquals(0, layout.offset);
-
-              display.dispatchEvent(new KeyboardEvent(
-                  'keydown', {key: 'ArrowLeft', bubbles: true}));
-              display.dispatchEvent(
-                  new KeyboardEvent('keydown', {key: 'Enter', bubbles: true}));
-              expectEquals(0, layout.offset);
-
-              display.dispatchEvent(new KeyboardEvent(
-                  'keydown', {key: 'ArrowRight', bubbles: true}));
-              display.dispatchEvent(
-                  new KeyboardEvent('keydown', {key: 'Enter', bubbles: true}));
-              expectEquals(0, layout.offset);
-            });
-      });
-    });
-
-    test(assert(TestNames.NightLight), async function() {
-      // Set up a single display.
-      const displayPage =
-          await showAndGetDeviceSubpage('display', settings.routes.DISPLAY);
-      await fakeSystemDisplay.getInfoCalled.promise;
-      addDisplay(1);
-      fakeSystemDisplay.onDisplayChanged.callListeners();
-      await fakeSystemDisplay.getInfoCalled.promise;
-      await fakeSystemDisplay.getLayoutCalled.promise;
-      expectEquals(1, displayPage.displays.length);
-
-      const temperature = displayPage.$$('#nightLightTemperatureDiv');
-      const schedule = displayPage.$$('#nightLightScheduleTypeDropDown');
-
-      // Night Light is off, so temperature is hidden. Schedule is always shown.
-      expectTrue(temperature.hidden);
-      expectFalse(schedule.hidden);
-
-      // Enable Night Light. Use an atomic update of |displayPage.prefs| so
-      // Polymer notices the change.
-      const newPrefs = getFakePrefs();
-      newPrefs.ash.night_light.enabled.value = true;
-      displayPage.prefs = newPrefs;
-      Polymer.dom.flush();
-
-      // Night Light is on, so temperature is visible.
-      expectFalse(temperature.hidden);
-      expectFalse(schedule.hidden);
-    });
-
-    suite(assert(TestNames.Power), function() {
-      /**
-       * Sets power sources using a deep copy of |sources|.
-       * @param {Array<settings.PowerSource>} sources
-       * @param {string} powerSourceId
-       * @param {bool} isLowPowerCharger
-       */
-      function setPowerSources(sources, powerSourceId, isLowPowerCharger) {
-        const sourcesCopy = sources.map(function(source) {
-          return Object.assign({}, source);
-        });
-        cr.webUIListenerCallback(
-            'power-sources-changed', sourcesCopy, powerSourceId,
-            isLowPowerCharger);
-      }
-
-      suite('power settings', function() {
-        let powerPage;
-        let powerSourceRow;
-        let powerSourceSelect;
-        let acIdleSelect;
-        let lidClosedToggle;
-
-        setup(function() {
-          return showAndGetDeviceSubpage('power', settings.routes.POWER)
-              .then(function(page) {
-                powerPage = page;
-                powerSourceRow = assert(powerPage.$$('#powerSourceRow'));
-                powerSourceSelect = assert(powerPage.$$('#powerSource'));
-                assertEquals(
-                    1,
-                    settings.DevicePageBrowserProxyImpl.getInstance()
-                        .updatePowerStatusCalled_);
-
-                lidClosedToggle = assert(powerPage.$$('#lidClosedToggle'));
-
-                assertEquals(
-                    1,
-                    settings.DevicePageBrowserProxyImpl.getInstance()
-                        .requestPowerManagementSettingsCalled_);
-                sendPowerManagementSettings(
-                    [
-                      settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                      settings.IdleBehavior.DISPLAY_OFF,
-                      settings.IdleBehavior.DISPLAY_ON
-                    ],
-                    [
-                      settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                      settings.IdleBehavior.DISPLAY_OFF,
-                      settings.IdleBehavior.DISPLAY_ON
-                    ],
-                    settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                    settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                    false /* acIdleManaged */, false /* batteryIdleManaged */,
-                    settings.LidClosedBehavior.SUSPEND,
-                    false /* lidClosedControlled */, true /* hasLid */);
-              });
-        });
-
-        test('no battery', function() {
-          const batteryStatus = {
-            present: false,
-            charging: false,
-            calculating: false,
-            percent: -1,
-            statusText: '',
-          };
-          cr.webUIListenerCallback(
-              'battery-status-changed', Object.assign({}, batteryStatus));
-          Polymer.dom.flush();
-
-          // Power source row is hidden since there's no battery.
-          assertTrue(powerSourceRow.hidden);
-          // Idle settings while on battery and while charging should not be
-          // visible if the battery is not present.
-          assertEquals(null, powerPage.$$('#batteryIdleSettingBox'));
-          assertEquals(null, powerPage.$$('#acIdleSettingBox'));
-
-          const acIdleSelect = assert(powerPage.$$('#noBatteryAcIdleSelect'));
-          // Expect the "When idle" dropdown options to appear instead.
-          assert(acIdleSelect);
-
-          // Select a "When idle" selection and expect it to be set.
-          selectValue(acIdleSelect, settings.IdleBehavior.DISPLAY_ON);
-          expectEquals(
-              settings.IdleBehavior.DISPLAY_ON,
-              settings.DevicePageBrowserProxyImpl.getInstance()
-                  .acIdleBehavior_);
-        });
-
-        test('power sources', function() {
-          const batteryStatus = {
-            present: true,
-            charging: false,
-            calculating: false,
-            percent: 50,
-            statusText: '5 hours left',
-          };
-          cr.webUIListenerCallback(
-              'battery-status-changed', Object.assign({}, batteryStatus));
-          setPowerSources([], '', false);
-          Polymer.dom.flush();
-
-          // Power sources row is visible but dropdown is hidden.
-          assertFalse(powerSourceRow.hidden);
-          assertTrue(powerSourceSelect.hidden);
-
-          // Attach a dual-role USB device.
-          const powerSource = {
-            id: '2',
-            is_dedicated_charger: false,
-            description: 'USB-C device',
-          };
-          setPowerSources([powerSource], '', false);
-          Polymer.dom.flush();
-
-          // "Battery" should be selected.
-          assertFalse(powerSourceSelect.hidden);
-          assertEquals('', powerSourceSelect.value);
-
-          // Select the power source.
-          setPowerSources([powerSource], powerSource.id, true);
-          Polymer.dom.flush();
-          assertFalse(powerSourceSelect.hidden);
-          assertEquals(powerSource.id, powerSourceSelect.value);
-
-          // Send another power source; the first should still be selected.
-          const otherPowerSource = Object.assign({}, powerSource);
-          otherPowerSource.id = '3';
-          setPowerSources(
-              [otherPowerSource, powerSource], powerSource.id, true);
-          Polymer.dom.flush();
-          assertFalse(powerSourceSelect.hidden);
-          assertEquals(powerSource.id, powerSourceSelect.value);
-        });
-
-        test('choose power source', function() {
-          const batteryStatus = {
-            present: true,
-            charging: false,
-            calculating: false,
-            percent: 50,
-            statusText: '5 hours left',
-          };
-          cr.webUIListenerCallback(
-              'battery-status-changed', Object.assign({}, batteryStatus));
-
-          // Attach a dual-role USB device.
-          const powerSource = {
-            id: '3',
-            is_dedicated_charger: false,
-            description: 'USB-C device',
-          };
-          setPowerSources([powerSource], '', false);
-          Polymer.dom.flush();
-
-          // Select the device.
-          selectValue(powerSourceSelect, powerSourceSelect.children[1].value);
-          expectEquals(
-              powerSource.id,
-              settings.DevicePageBrowserProxyImpl.getInstance().powerSourceId_);
-        });
-
-        test('set AC idle behavior', function() {
-          const batteryStatus = {
-            present: true,
-            charging: false,
-            calculating: false,
-            percent: 50,
-            statusText: '5 hours left',
-          };
-          cr.webUIListenerCallback(
-              'battery-status-changed', Object.assign({}, batteryStatus));
-          setPowerSources([], '', false);
-          Polymer.dom.flush();
-
-          acIdleSelect = assert(powerPage.$$('#acIdleSelect'));
-          selectValue(acIdleSelect, settings.IdleBehavior.DISPLAY_ON);
-          expectEquals(
-              settings.IdleBehavior.DISPLAY_ON,
-              settings.DevicePageBrowserProxyImpl.getInstance()
-                  .acIdleBehavior_);
-        });
-
-        test('set battery idle behavior', function() {
-          return new Promise(function(resolve) {
-                   // Indicate battery presence so that idle settings box while
-                   // on battery is visible.
-                   const batteryStatus = {
-                     present: true,
-                     charging: false,
-                     calculating: false,
-                     percent: 50,
-                     statusText: '5 hours left',
-                   };
-                   cr.webUIListenerCallback(
-                       'battery-status-changed',
-                       Object.assign({}, batteryStatus));
-                   powerPage.async(resolve);
-                 })
-              .then(function() {
-                const batteryIdleSelect =
-                    assert(powerPage.$$('#batteryIdleSelect'));
-                selectValue(
-                    batteryIdleSelect, settings.IdleBehavior.DISPLAY_ON);
-                expectEquals(
-                    settings.IdleBehavior.DISPLAY_ON,
-                    settings.DevicePageBrowserProxyImpl.getInstance()
-                        .batteryIdleBehavior_);
-              });
-        });
-
-        test('set lid behavior', function() {
-          const sendLid = function(lidBehavior) {
-            sendPowerManagementSettings(
-                [
-                  settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                  settings.IdleBehavior.DISPLAY_OFF,
-                  settings.IdleBehavior.DISPLAY_ON
-                ],
-                [
-                  settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                  settings.IdleBehavior.DISPLAY_OFF,
-                  settings.IdleBehavior.DISPLAY_ON
-                ],
-                settings.IdleBehavior.DISPLAY_OFF,
-                settings.IdleBehavior.DISPLAY_OFF, false /* acIdleManaged */,
-                false /* batteryIdleManaged */, lidBehavior,
-                false /* lidClosedControlled */, true /* hasLid */);
-          };
-
-          sendLid(settings.LidClosedBehavior.SUSPEND);
-          assertTrue(lidClosedToggle.checked);
-
-          lidClosedToggle.shadowRoot.querySelector('#control').click();
-          expectEquals(
-              settings.LidClosedBehavior.DO_NOTHING,
-              settings.DevicePageBrowserProxyImpl.getInstance()
-                  .lidClosedBehavior_);
-          sendLid(settings.LidClosedBehavior.DO_NOTHING);
-          expectFalse(lidClosedToggle.checked);
-
-          lidClosedToggle.shadowRoot.querySelector('#control').click();
-          expectEquals(
-              settings.LidClosedBehavior.SUSPEND,
-              settings.DevicePageBrowserProxyImpl.getInstance()
-                  .lidClosedBehavior_);
-          sendLid(settings.LidClosedBehavior.SUSPEND);
-          expectTrue(lidClosedToggle.checked);
-        });
-        test('display idle behavior for shut_down/stop_session', function() {
-          return new Promise(function(resolve) {
-                   // Send power management settings first.
-                   sendPowerManagementSettings(
-                       [
-                         settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                         settings.IdleBehavior.DISPLAY_OFF,
-                         settings.IdleBehavior.DISPLAY_ON,
-                         settings.IdleBehavior.SHUT_DOWN,
-                         settings.IdleBehavior.STOP_SESSION,
-                       ],
-                       [
-                         settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                         settings.IdleBehavior.DISPLAY_OFF,
-                         settings.IdleBehavior.DISPLAY_ON,
-                         settings.IdleBehavior.SHUT_DOWN,
-                         settings.IdleBehavior.STOP_SESSION,
-                       ],
-                       settings.IdleBehavior.SHUT_DOWN,
-                       settings.IdleBehavior.SHUT_DOWN,
-                       true /* acIdleManaged */, true /* batteryIdleManaged */,
-                       settings.LidClosedBehavior.DO_NOTHING,
-                       false /* lidClosedControlled */, true /* hasLid */);
-                   powerPage.async(resolve);
-                 })
-              .then(function() {
-                // Indicate battery presence so that battery idle settings
-                // box becomes visible. Default option should be selected
-                // properly even when battery idle settings box is stamped
-                // later.
-                const batteryStatus = {
-                  present: true,
-                  charging: false,
-                  calculating: false,
-                  percent: 50,
-                  statusText: '5 hours left',
-                };
-                cr.webUIListenerCallback(
-                    'battery-status-changed', Object.assign({}, batteryStatus));
-                return new Promise(function(resolve) {
-                  powerPage.async(resolve);
-                });
-              })
-              .then(function() {
-                const batteryIdleSelect =
-                    assert(powerPage.$$('#batteryIdleSelect'));
-                expectEquals(
-                    settings.IdleBehavior.SHUT_DOWN.toString(),
-                    batteryIdleSelect.value);
-                expectFalse(batteryIdleSelect.disabled);
-                const acIdleSelect = assert(powerPage.$$('#acIdleSelect'));
-                expectEquals(
-                    settings.IdleBehavior.SHUT_DOWN.toString(),
-                    acIdleSelect.value);
-                expectFalse(acIdleSelect.disabled);
-                expectEquals(
-                    loadTimeData.getString('powerLidSleepLabel'),
-                    lidClosedToggle.label);
-                expectFalse(lidClosedToggle.checked);
-                expectFalse(lidClosedToggle.isPrefEnforced());
-              })
-              .then(function() {
-                sendPowerManagementSettings(
-                    [
-                      settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                      settings.IdleBehavior.DISPLAY_OFF,
-                      settings.IdleBehavior.DISPLAY_ON,
-                      settings.IdleBehavior.SHUT_DOWN,
-                      settings.IdleBehavior.STOP_SESSION,
-                    ],
-                    [
-                      settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                      settings.IdleBehavior.DISPLAY_OFF,
-                      settings.IdleBehavior.DISPLAY_ON,
-                      settings.IdleBehavior.SHUT_DOWN,
-                      settings.IdleBehavior.STOP_SESSION,
-                    ],
-                    settings.IdleBehavior.SHUT_DOWN,
-                    settings.IdleBehavior.SHUT_DOWN, true /* acIdleManaged */,
-                    true /* batteryIdleManaged */,
-                    settings.LidClosedBehavior.DO_NOTHING,
-                    false /* lidClosedControlled */, true /* hasLid */);
-                return new Promise(function(resolve) {
-                  powerPage.async(resolve);
-                });
-              })
-              .then(function() {
-                const batteryIdleSelect =
-                    assert(powerPage.$$('#batteryIdleSelect'));
-                expectEquals(
-                    settings.IdleBehavior.SHUT_DOWN.toString(),
-                    batteryIdleSelect.value);
-                expectFalse(batteryIdleSelect.disabled);
-                const acIdleSelect = assert(powerPage.$$('#acIdleSelect'));
-                expectEquals(
-                    settings.IdleBehavior.SHUT_DOWN.toString(),
-                    acIdleSelect.value);
-                expectFalse(acIdleSelect.disabled);
-                expectEquals(
-                    loadTimeData.getString('powerLidSleepLabel'),
-                    lidClosedToggle.label);
-                expectFalse(lidClosedToggle.checked);
-                expectFalse(lidClosedToggle.isPrefEnforced());
-              });
-        });
-        test('display idle and lid behavior', function() {
-          return new Promise(function(resolve) {
-                   // Send power management settings first.
-                   sendPowerManagementSettings(
-                       [
-                         settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                         settings.IdleBehavior.DISPLAY_OFF,
-                         settings.IdleBehavior.DISPLAY_ON
-                       ],
-                       [
-                         settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                         settings.IdleBehavior.DISPLAY_OFF,
-                         settings.IdleBehavior.DISPLAY_ON
-                       ],
-                       settings.IdleBehavior.DISPLAY_ON,
-                       settings.IdleBehavior.DISPLAY_OFF,
-                       false /* acIdleManaged */,
-                       false /* batteryIdleManaged */,
-                       settings.LidClosedBehavior.DO_NOTHING,
-                       false /* lidClosedControlled */, true /* hasLid */);
-                   powerPage.async(resolve);
-                 })
-              .then(function() {
-                // Indicate battery presence so that battery idle settings
-                // box becomes visible. Default option should be selected
-                // properly even when battery idle settings box is stamped
-                // later.
-                const batteryStatus = {
-                  present: true,
-                  charging: false,
-                  calculating: false,
-                  percent: 50,
-                  statusText: '5 hours left',
-                };
-                cr.webUIListenerCallback(
-                    'battery-status-changed', Object.assign({}, batteryStatus));
-                return new Promise(function(resolve) {
-                  powerPage.async(resolve);
-                });
-              })
-              .then(function() {
-                acIdleSelect = assert(powerPage.$$('#acIdleSelect'));
-                const batteryIdleSelect =
-                    assert(powerPage.$$('#batteryIdleSelect'));
-                expectEquals(
-                    settings.IdleBehavior.DISPLAY_ON.toString(),
-                    acIdleSelect.value);
-                expectEquals(
-                    settings.IdleBehavior.DISPLAY_OFF.toString(),
-                    batteryIdleSelect.value);
-                expectFalse(acIdleSelect.disabled);
-                expectEquals(null, powerPage.$$('#acIdleManagedIndicator'));
-                expectEquals(
-                    loadTimeData.getString('powerLidSleepLabel'),
-                    lidClosedToggle.label);
-                expectFalse(lidClosedToggle.checked);
-                expectFalse(lidClosedToggle.isPrefEnforced());
-              })
-              .then(function() {
-                sendPowerManagementSettings(
-                    [
-                      settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                      settings.IdleBehavior.DISPLAY_OFF,
-                      settings.IdleBehavior.DISPLAY_ON
-                    ],
-                    [
-                      settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                      settings.IdleBehavior.DISPLAY_OFF,
-                      settings.IdleBehavior.DISPLAY_ON
-                    ],
-                    settings.IdleBehavior.DISPLAY_OFF,
-                    settings.IdleBehavior.DISPLAY_ON, false /* acIdleManaged */,
-                    false /* batteryIdleManaged */,
-                    settings.LidClosedBehavior.SUSPEND,
-                    false /* lidClosedControlled */, true /* hasLid */);
-                return new Promise(function(resolve) {
-                  powerPage.async(resolve);
-                });
-              })
-              .then(function() {
-                const batteryIdleSelect =
-                    assert(powerPage.$$('#batteryIdleSelect'));
-                expectEquals(
-                    settings.IdleBehavior.DISPLAY_OFF.toString(),
-                    acIdleSelect.value);
-                expectEquals(
-                    settings.IdleBehavior.DISPLAY_ON.toString(),
-                    batteryIdleSelect.value);
-                expectFalse(acIdleSelect.disabled);
-                expectFalse(batteryIdleSelect.disabled);
-                expectEquals(null, powerPage.$$('#acIdleManagedIndicator'));
-                expectEquals(
-                    null, powerPage.$$('#batteryIdleManagedIndicator'));
-                expectEquals(
-                    loadTimeData.getString('powerLidSleepLabel'),
-                    lidClosedToggle.label);
-                expectTrue(lidClosedToggle.checked);
-                expectFalse(lidClosedToggle.isPrefEnforced());
-              });
-        });
-
-        test('display managed idle and lid behavior', function() {
-          // When settings are managed, the controls should be disabled and
-          // the indicators should be shown.
-          return new Promise(function(resolve) {
-                   // Indicate battery presence so that idle settings box while
-                   // on battery is visible.
-                   const batteryStatus = {
-                     present: true,
-                     charging: false,
-                     calculating: false,
-                     percent: 50,
-                     statusText: '5 hours left',
-                   };
-                   cr.webUIListenerCallback(
-                       'battery-status-changed',
-                       Object.assign({}, batteryStatus));
-                   sendPowerManagementSettings(
-                       [settings.IdleBehavior.SHUT_DOWN],
-                       [settings.IdleBehavior.SHUT_DOWN],
-                       settings.IdleBehavior.SHUT_DOWN,
-                       settings.IdleBehavior.SHUT_DOWN,
-                       true /* acIdleManaged */, true /* batteryIdleManaged */,
-                       settings.LidClosedBehavior.SHUT_DOWN,
-                       true /* lidClosedControlled */, true /* hasLid */);
-                   powerPage.async(resolve);
-                 })
-              .then(function() {
-                acIdleSelect = assert(powerPage.$$('#acIdleSelect'));
-                const batteryIdleSelect =
-                    assert(powerPage.$$('#batteryIdleSelect'));
-                expectEquals(
-                    settings.IdleBehavior.SHUT_DOWN.toString(),
-                    acIdleSelect.value);
-                expectEquals(
-                    settings.IdleBehavior.SHUT_DOWN.toString(),
-                    batteryIdleSelect.value);
-                expectTrue(acIdleSelect.disabled);
-                expectTrue(batteryIdleSelect.disabled);
-                expectNotEquals(null, powerPage.$$('#acIdleManagedIndicator'));
-                expectNotEquals(
-                    null, powerPage.$$('#batteryIdleManagedIndicator'));
-                expectEquals(
-                    loadTimeData.getString('powerLidShutDownLabel'),
-                    lidClosedToggle.label);
-                expectTrue(lidClosedToggle.checked);
-                expectTrue(lidClosedToggle.isPrefEnforced());
-              })
-              .then(function() {
-                sendPowerManagementSettings(
-                    [settings.IdleBehavior.DISPLAY_OFF],
-                    [settings.IdleBehavior.DISPLAY_OFF],
-                    settings.IdleBehavior.DISPLAY_OFF,
-                    settings.IdleBehavior.DISPLAY_OFF,
-                    false /* acIdleManaged */, false /* batteryIdleManaged */,
-                    settings.LidClosedBehavior.STOP_SESSION,
-                    true /* lidClosedControlled */, true /* hasLid */);
-                return new Promise(function(resolve) {
-                  powerPage.async(resolve);
-                });
-              })
-              .then(function() {
-                const batteryIdleSelect =
-                    assert(powerPage.$$('#batteryIdleSelect'));
-                expectEquals(
-                    settings.IdleBehavior.DISPLAY_OFF.toString(),
-                    acIdleSelect.value);
-                expectEquals(
-                    settings.IdleBehavior.DISPLAY_OFF.toString(),
-                    batteryIdleSelect.value);
-                expectTrue(acIdleSelect.disabled);
-                expectTrue(batteryIdleSelect.disabled);
-                expectEquals(null, powerPage.$$('#acIdleManagedIndicator'));
-                expectEquals(
-                    null, powerPage.$$('#batteryIdleManagedIndicator'));
-                expectEquals(
-                    loadTimeData.getString('powerLidSignOutLabel'),
-                    lidClosedToggle.label);
-                expectTrue(lidClosedToggle.checked);
-                expectTrue(lidClosedToggle.isPrefEnforced());
-              });
-        });
-
-        test('hide lid behavior when lid not present', function() {
-          return new Promise(function(resolve) {
-                   expectFalse(powerPage.$$('#lidClosedToggle').hidden);
-                   sendPowerManagementSettings(
-                       [
-                         settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                         settings.IdleBehavior.DISPLAY_OFF,
-                         settings.IdleBehavior.DISPLAY_ON
-                       ],
-                       [
-                         settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                         settings.IdleBehavior.DISPLAY_OFF,
-                         settings.IdleBehavior.DISPLAY_ON
-                       ],
-                       settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                       settings.IdleBehavior.DISPLAY_OFF_SLEEP,
-                       false /* acIdleManaged */,
-                       false /* batteryIdleManaged */,
-                       settings.LidClosedBehavior.SUSPEND,
-                       false /* lidClosedControlled */, false /* hasLid */);
-                   powerPage.async(resolve);
-                 })
-              .then(function() {
-                expectTrue(powerPage.$$('#lidClosedToggle').hidden);
-              });
-        });
-
-        test(
-            'hide display controlled battery idle behavior when battery not present',
-            function() {
-              return new Promise(function(resolve) {
-                       const batteryStatus = {
-                         present: false,
-                         charging: false,
-                         calculating: false,
-                         percent: -1,
-                         statusText: '',
-                       };
-                       cr.webUIListenerCallback(
-                           'battery-status-changed',
-                           Object.assign({}, batteryStatus));
-                       Polymer.dom.flush();
-                       powerPage.async(resolve);
-                     })
-                  .then(function() {
-                    expectEquals(null, powerPage.$$('#batteryIdleSettingBox'));
-                  });
-            });
-        test('Deep link to sleep when laptop lid closed', async () => {
-          return checkDeepLink(
-              settings.routes.POWER, '424',
-              lidClosedToggle.shadowRoot.querySelector('cr-toggle'),
-              'Sleep when closed toggle');
-        });
-      });
-    });
-
-    suite(assert(TestNames.Stylus), function() {
-      let stylusPage;
-      let appSelector;
-      let browserProxy;
-      let noAppsDiv;
-      let waitingDiv;
-
-      // Shorthand for settings.NoteAppLockScreenSupport.
-      let LockScreenSupport;
-
-      suiteSetup(function() {
-        // Always show stylus settings.
-        loadTimeData.overrideValues({
-          hasInternalStylus: true,
-        });
-      });
-
-      setup(function() {
-        return showAndGetDeviceSubpage('stylus', settings.routes.STYLUS)
-            .then(function(page) {
-              stylusPage = page;
-              browserProxy = settings.DevicePageBrowserProxyImpl.getInstance();
-              appSelector = assert(page.$$('#selectApp'));
-              noAppsDiv = assert(page.$$('#no-apps'));
-              waitingDiv = assert(page.$$('#waiting'));
-              LockScreenSupport = settings.NoteAppLockScreenSupport;
-
-              assertEquals(1, browserProxy.requestNoteTakingApps_);
-              assert(browserProxy.onNoteTakingAppsUpdated_);
-            });
-      });
-
-      // Helper function to allocate a note app entry.
-      function entry(name, value, preferred, lockScreenSupport) {
-        return {
-          name: name,
-          value: value,
-          preferred: preferred,
-          lockScreenSupport: lockScreenSupport
-        };
-      }
-
-      /**  @return {?Element} */
-      function noteTakingAppLockScreenSettings() {
-        return stylusPage.$$('#note-taking-app-lock-screen-settings');
-      }
-
-      /** @return {?Element} */
-      function enableAppOnLockScreenToggle() {
-        return stylusPage.$$('#enable-app-on-lock-screen-toggle');
-      }
-
-      /** @return {?Element} */
-      function enableAppOnLockScreenPolicyIndicator() {
-        return stylusPage.$$('#enable-app-on-lock-screen-policy-indicator');
-      }
-
-      /** @return {?Element} */
-      function enableAppOnLockScreenToggleLabel() {
-        return stylusPage.$$('#lock-screen-toggle-label');
-      }
-
-      /** @return {?Element} */
-      function keepLastNoteOnLockScreenToggle() {
-        return stylusPage.$$('#keep-last-note-on-lock-screen-toggle');
-      }
-
-      test('stylus tools prefs', function() {
-        // Both stylus tools prefs are intially false.
-        assertFalse(devicePage.prefs.settings.enable_stylus_tools.value);
-        assertFalse(
-            devicePage.prefs.settings.launch_palette_on_eject_event.value);
-
-        // Since both prefs are intially false, the launch palette on eject pref
-        // toggle is disabled.
-        expectTrue(isVisible(stylusPage.$$('#enableStylusToolsToggle')));
-        expectTrue(
-            isVisible(stylusPage.$$('#launchPaletteOnEjectEventToggle')));
-        expectTrue(stylusPage.$$('#launchPaletteOnEjectEventToggle').disabled);
-        expectFalse(devicePage.prefs.settings.enable_stylus_tools.value);
-        expectFalse(
-            devicePage.prefs.settings.launch_palette_on_eject_event.value);
-
-        // Tapping the enable stylus tools pref causes the launch palette on
-        // eject pref toggle to not be disabled anymore.
-        stylusPage.$$('#enableStylusToolsToggle').click();
-        expectTrue(devicePage.prefs.settings.enable_stylus_tools.value);
-        expectFalse(stylusPage.$$('#launchPaletteOnEjectEventToggle').disabled);
-        stylusPage.$$('#launchPaletteOnEjectEventToggle').click();
-        expectTrue(
-            devicePage.prefs.settings.launch_palette_on_eject_event.value);
-      });
-
-      test('choose first app if no preferred ones', function() {
-        // Selector chooses the first value in list if there is no preferred
-        // value set.
-        browserProxy.setNoteTakingApps([
-          entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
-          entry('n2', 'v2', false, LockScreenSupport.NOT_SUPPORTED)
-        ]);
-        Polymer.dom.flush();
-        assertEquals('v1', appSelector.value);
-      });
-
-      test('choose prefered app if exists', function() {
-        // Selector chooses the preferred value if set.
-        browserProxy.setNoteTakingApps([
-          entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
-          entry('n2', 'v2', true, LockScreenSupport.NOT_SUPPORTED)
-        ]);
-        Polymer.dom.flush();
-        assertEquals('v2', appSelector.value);
-      });
-
-      test('change preferred app', function() {
-        // Load app list.
-        browserProxy.setNoteTakingApps([
-          entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
-          entry('n2', 'v2', true, LockScreenSupport.NOT_SUPPORTED)
-        ]);
-        Polymer.dom.flush();
-        assertEquals(0, browserProxy.setPreferredAppCount_);
-        assertEquals('v2', browserProxy.getPreferredNoteTakingAppId());
-
-        // Update select element to new value, verify browser proxy is called.
-        appSelector.value = 'v1';
-        stylusPage.onSelectedAppChanged_();
-        assertEquals(1, browserProxy.setPreferredAppCount_);
-        assertEquals('v1', browserProxy.getPreferredNoteTakingAppId());
-      });
-
-      test('preferred app does not change without interaction', function() {
-        // Pass various types of data to page, verify the preferred note-app
-        // does not change.
-        browserProxy.setNoteTakingApps([]);
-        Polymer.dom.flush();
-        assertEquals('', browserProxy.getPreferredNoteTakingAppId());
-
-        browserProxy.onNoteTakingAppsUpdated_([], true);
-        Polymer.dom.flush();
-        assertEquals('', browserProxy.getPreferredNoteTakingAppId());
-
-        browserProxy.addNoteTakingApp(
-            entry('n', 'v', false, LockScreenSupport.NOT_SUPPORTED));
-        Polymer.dom.flush();
-        assertEquals('', browserProxy.getPreferredNoteTakingAppId());
-
-        browserProxy.setNoteTakingApps([
-          entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
-          entry('n2', 'v2', true, LockScreenSupport.NOT_SUPPORTED)
-        ]);
-        Polymer.dom.flush();
-        assertEquals(0, browserProxy.setPreferredAppCount_);
-        assertEquals('v2', browserProxy.getPreferredNoteTakingAppId());
-      });
-
-      test('Deep link to preferred app', async () => {
-        browserProxy.setNoteTakingApps([
-          entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
-          entry('n2', 'v2', false, LockScreenSupport.NOT_SUPPORTED)
-        ]);
-        browserProxy.setAndroidAppsReceived(true);
-
-        return checkDeepLink(
-            settings.routes.STYLUS, '417', stylusPage.$$('#selectApp'),
-            'Note-taking apps dropdown');
-      });
-
-      test('app-visibility', function() {
-        // No apps available.
-        browserProxy.setNoteTakingApps([]);
-        assert(noAppsDiv.hidden);
-        assert(!waitingDiv.hidden);
-        assert(appSelector.hidden);
-
-        // Waiting for apps to finish loading.
-        browserProxy.setAndroidAppsReceived(true);
-        assert(!noAppsDiv.hidden);
-        assert(waitingDiv.hidden);
-        assert(appSelector.hidden);
-
-        // Apps loaded, show selector.
-        browserProxy.addNoteTakingApp(
-            entry('n', 'v', false, LockScreenSupport.NOT_SUPPORTED));
-        assert(noAppsDiv.hidden);
-        assert(waitingDiv.hidden);
-        assert(!appSelector.hidden);
-
-        // Waiting for Android apps again.
-        browserProxy.setAndroidAppsReceived(false);
-        assert(noAppsDiv.hidden);
-        assert(!waitingDiv.hidden);
-        assert(appSelector.hidden);
-
-        browserProxy.setAndroidAppsReceived(true);
-        assert(noAppsDiv.hidden);
-        assert(waitingDiv.hidden);
-        assert(!appSelector.hidden);
-      });
-
-      test('enabled-on-lock-screen', function() {
-        expectFalse(isVisible(noteTakingAppLockScreenSettings()));
-        expectFalse(isVisible(enableAppOnLockScreenToggle()));
-        expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
-
-        return new Promise(function(resolve) {
-                 // No apps available.
-                 browserProxy.setNoteTakingApps([]);
-                 stylusPage.async(resolve);
-               })
-            .then(function() {
-              Polymer.dom.flush();
-              expectFalse(isVisible(noteTakingAppLockScreenSettings()));
-              expectFalse(isVisible(enableAppOnLockScreenToggle()));
-              expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
-
-              // Single app which does not support lock screen note taking.
-              browserProxy.addNoteTakingApp(
-                  entry('n1', 'v1', true, LockScreenSupport.NOT_SUPPORTED));
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-              expectFalse(isVisible(noteTakingAppLockScreenSettings()));
-              expectFalse(isVisible(enableAppOnLockScreenToggle()));
-              expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
-
-              // Add an app with lock screen support, but do not select it yet.
-              browserProxy.addNoteTakingApp(
-                  entry('n2', 'v2', false, LockScreenSupport.SUPPORTED));
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-              expectFalse(isVisible(noteTakingAppLockScreenSettings()));
-              expectFalse(isVisible(enableAppOnLockScreenToggle()));
-              expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
-
-              // Select the app with lock screen app support.
-              appSelector.value = 'v2';
-              stylusPage.onSelectedAppChanged_();
-              assertEquals(1, browserProxy.setPreferredAppCount_);
-              assertEquals('v2', browserProxy.getPreferredNoteTakingAppId());
-
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-              expectTrue(isVisible(noteTakingAppLockScreenSettings()));
-              expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
-              assert(isVisible(enableAppOnLockScreenToggle()));
-              expectFalse(enableAppOnLockScreenToggle().checked);
-
-              // Preferred app updated to be enabled on lock screen.
-              browserProxy.setNoteTakingApps([
-                entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
-                entry('n2', 'v2', true, LockScreenSupport.ENABLED)
-              ]);
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-              expectTrue(isVisible(noteTakingAppLockScreenSettings()));
-              expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
-              assert(isVisible(enableAppOnLockScreenToggle()));
-              expectTrue(enableAppOnLockScreenToggle().checked);
-
-              // Select the app that does not support lock screen again.
-              appSelector.value = 'v1';
-              stylusPage.onSelectedAppChanged_();
-              assertEquals(2, browserProxy.setPreferredAppCount_);
-              assertEquals('v1', browserProxy.getPreferredNoteTakingAppId());
-
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-              expectFalse(isVisible(noteTakingAppLockScreenSettings()));
-              expectFalse(isVisible(enableAppOnLockScreenToggle()));
-              expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
-            });
-      });
-
-      test('initial-app-lock-screen-enabled', function() {
-        return new Promise(function(resolve) {
-                 browserProxy.setNoteTakingApps(
-                     [entry('n1', 'v1', true, LockScreenSupport.SUPPORTED)]);
-                 stylusPage.async(resolve);
-               })
-            .then(function() {
-              Polymer.dom.flush();
-
-              expectTrue(isVisible(noteTakingAppLockScreenSettings()));
-              assert(isVisible(enableAppOnLockScreenToggle()));
-              expectFalse(enableAppOnLockScreenToggle().checked);
-              expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
-
-              browserProxy.setNoteTakingApps(
-                  [entry('n1', 'v1', true, LockScreenSupport.ENABLED)]);
-
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-              expectTrue(isVisible(noteTakingAppLockScreenSettings()));
-              assert(isVisible(enableAppOnLockScreenToggle()));
-              expectTrue(enableAppOnLockScreenToggle().checked);
-              expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
-
-              browserProxy.setNoteTakingApps(
-                  [entry('n1', 'v1', true, LockScreenSupport.SUPPORTED)]);
-
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-              expectTrue(isVisible(noteTakingAppLockScreenSettings()));
-              assert(isVisible(enableAppOnLockScreenToggle()));
-              expectFalse(enableAppOnLockScreenToggle().checked);
-              expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
-
-              browserProxy.setNoteTakingApps([]);
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-              expectFalse(isVisible(enableAppOnLockScreenToggle()));
-            });
-      });
-
-      test('tap-on-enable-note-taking-on-lock-screen', function() {
-        return new Promise(function(resolve) {
-                 browserProxy.setNoteTakingApps(
-                     [entry('n1', 'v1', true, LockScreenSupport.SUPPORTED)]);
-                 stylusPage.async(resolve);
-               })
-            .then(function() {
-              Polymer.dom.flush();
-
-              assert(isVisible(enableAppOnLockScreenToggle()));
-              expectFalse(enableAppOnLockScreenToggle().checked);
-              expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
-
-              enableAppOnLockScreenToggle().click();
-              assertEquals(1, browserProxy.setAppOnLockScreenCount_);
-
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-              expectTrue(enableAppOnLockScreenToggle().checked);
-              expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
-
-              expectEquals(
-                  LockScreenSupport.ENABLED,
-                  browserProxy.getPreferredAppLockScreenState());
-
-              enableAppOnLockScreenToggle().click();
-              assertEquals(2, browserProxy.setAppOnLockScreenCount_);
-
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-              expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
-              expectFalse(enableAppOnLockScreenToggle().checked);
-              expectEquals(
-                  LockScreenSupport.SUPPORTED,
-                  browserProxy.getPreferredAppLockScreenState());
-            });
-      });
-
-      test('tap-on-enable-note-taking-on-lock-screen-label', function() {
-        return new Promise(function(resolve) {
-                 browserProxy.setNoteTakingApps(
-                     [entry('n1', 'v1', true, LockScreenSupport.SUPPORTED)]);
-                 stylusPage.async(resolve);
-               })
-            .then(function() {
-              Polymer.dom.flush();
-
-              assert(isVisible(enableAppOnLockScreenToggle()));
-              expectFalse(enableAppOnLockScreenToggle().checked);
-
-              enableAppOnLockScreenToggleLabel().click();
-              assertEquals(1, browserProxy.setAppOnLockScreenCount_);
-
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-              expectTrue(enableAppOnLockScreenToggle().checked);
-              expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
-
-              expectEquals(
-                  LockScreenSupport.ENABLED,
-                  browserProxy.getPreferredAppLockScreenState());
-
-              enableAppOnLockScreenToggleLabel().click();
-              assertEquals(2, browserProxy.setAppOnLockScreenCount_);
-
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-              expectFalse(enableAppOnLockScreenToggle().checked);
-              expectEquals(
-                  LockScreenSupport.SUPPORTED,
-                  browserProxy.getPreferredAppLockScreenState());
-            });
-      });
-
-      test('lock-screen-apps-disabled-by-policy', function() {
-        expectFalse(isVisible(enableAppOnLockScreenToggle()));
-        expectFalse(isVisible(enableAppOnLockScreenPolicyIndicator()));
-
-        return new Promise(function(resolve) {
-                 // Add an app with lock screen support.
-                 browserProxy.addNoteTakingApp(entry(
-                     'n2', 'v2', true,
-                     LockScreenSupport.NOT_ALLOWED_BY_POLICY));
-                 stylusPage.async(resolve);
-               })
-            .then(function() {
-              Polymer.dom.flush();
-              expectTrue(isVisible(noteTakingAppLockScreenSettings()));
-              assert(isVisible(enableAppOnLockScreenToggle()));
-              expectFalse(enableAppOnLockScreenToggle().checked);
-              expectTrue(isVisible(enableAppOnLockScreenPolicyIndicator()));
-
-              // The toggle should be disabled, so enabling app on lock screen
-              // should not be attempted.
-              enableAppOnLockScreenToggle().click();
-              assertEquals(0, browserProxy.setAppOnLockScreenCount_);
-
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-
-              // Tap on label should not work either.
-              enableAppOnLockScreenToggleLabel().click();
-              assertEquals(0, browserProxy.setAppOnLockScreenCount_);
-
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-              expectTrue(isVisible(noteTakingAppLockScreenSettings()));
-              assert(isVisible(enableAppOnLockScreenToggle()));
-              expectFalse(enableAppOnLockScreenToggle().checked);
-              expectTrue(isVisible(enableAppOnLockScreenPolicyIndicator()));
-
-              expectEquals(
-                  LockScreenSupport.NOT_ALLOWED_BY_POLICY,
-                  browserProxy.getPreferredAppLockScreenState());
-            });
-      });
-
-      test('keep-last-note-on-lock-screen', function() {
-        return new Promise(function(resolve) {
-                 browserProxy.setNoteTakingApps([
-                   entry('n1', 'v1', true, LockScreenSupport.NOT_SUPPORTED),
-                   entry('n2', 'v2', false, LockScreenSupport.SUPPORTED)
-                 ]);
-                 stylusPage.async(resolve);
-               })
-            .then(function() {
-              Polymer.dom.flush();
-              expectFalse(isVisible(noteTakingAppLockScreenSettings()));
-              expectFalse(isVisible(keepLastNoteOnLockScreenToggle()));
-
-              browserProxy.setNoteTakingApps([
-                entry('n1', 'v1', false, LockScreenSupport.NOT_SUPPORTED),
-                entry('n2', 'v2', true, LockScreenSupport.SUPPORTED)
-              ]);
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-              expectTrue(isVisible(noteTakingAppLockScreenSettings()));
-              expectFalse(isVisible(keepLastNoteOnLockScreenToggle()));
-
-              browserProxy.setNoteTakingApps([
-                entry('n2', 'v2', true, LockScreenSupport.ENABLED),
-              ]);
-              return new Promise(function(resolve) {
-                stylusPage.async(resolve);
-              });
-            })
-            .then(function() {
-              Polymer.dom.flush();
-              expectTrue(isVisible(noteTakingAppLockScreenSettings()));
-              assert(isVisible(keepLastNoteOnLockScreenToggle()));
-              expectTrue(keepLastNoteOnLockScreenToggle().checked);
-
-              // Clicking the toggle updates the pref value.
-              keepLastNoteOnLockScreenToggle()
-                  .shadowRoot.querySelector('#control')
-                  .click();
-              expectFalse(keepLastNoteOnLockScreenToggle().checked);
-
-              expectFalse(devicePage.prefs.settings
-                              .restore_last_lock_screen_note.value);
-
-              // Changing the pref value updates the toggle.
-              devicePage.set(
-                  'prefs.settings.restore_last_lock_screen_note.value', true);
-              expectTrue(keepLastNoteOnLockScreenToggle().checked);
-            });
-      });
-    });
-
-    suite(assert(TestNames.Storage), function() {
-      /** @type {!Element} */
-      let storagePage;
-
-      /**
-       * Simulate storage size stat callback.
-       * @param {string} availableSize
-       * @param {string} usedSize
-       * @param {number} usedRatio
-       * @param {number} spaceState
-       */
-      function sendStorageSizeStat(
-          usedSize, availableSize, usedRatio, spaceState) {
-        cr.webUIListenerCallback('storage-size-stat-changed', {
-          usedSize: usedSize,
-          availableSize: availableSize,
-          usedRatio: usedRatio,
-          spaceState: spaceState,
-        });
-        Polymer.dom.flush();
-      }
-
-      /**
-       * @param {string} id
-       * @return {string}
-       */
-      function getStorageItemLabelFromId(id) {
-        const rowItem = storagePage.$$('#' + id).shadowRoot;
-        return rowItem.querySelector('#label').innerText;
-      }
-
-      /**
-       * @param {string} id
-       * @return {string}
-       */
-      function getStorageItemSubLabelFromId(id) {
-        const rowItem = storagePage.$$('#' + id).shadowRoot;
-        return rowItem.querySelector('#subLabel').innerText;
-      }
-
-      suiteSetup(function() {
-        // Disable animations so sub-pages open within one event loop.
-        testing.Test.disableAnimationsAndTransitions();
-      });
-
-      setup(function() {
-        return showAndGetDeviceSubpage('storage', settings.routes.STORAGE)
-            .then(function(page) {
-              storagePage = page;
-              storagePage.stopPeriodicUpdate_();
-            });
-      });
-
-      test('storage stats size', async function() {
-        // Low available storage space.
-        sendStorageSizeStat(
-            '9.1 GB', '0.9 GB', 0.91, settings.StorageSpaceState.LOW);
-        assertEquals('91%', storagePage.$.inUseLabelArea.style.width);
-        assertEquals('9%', storagePage.$.availableLabelArea.style.width);
-        assertTrue(isVisible(storagePage.$$('#lowMessage')));
-        assertFalse(isVisible(storagePage.$$('#criticallyLowMessage')));
-        assertTrue(!!storagePage.$$('#bar.space-low'));
-        assertFalse(!!storagePage.$$('#bar.space-critically-low'));
-        assertEquals(
-            '9.1 GB',
-            storagePage.$.inUseLabelArea.querySelector('.storage-size')
-                .innerText);
-        assertEquals(
-            '0.9 GB',
-            storagePage.$.availableLabelArea.querySelector('.storage-size')
-                .innerText);
-
-        // Critically low available storage space.
-        sendStorageSizeStat(
-            '9.7 GB', '0.3 GB', 0.97,
-            settings.StorageSpaceState.CRITICALLY_LOW);
-        assertEquals('97%', storagePage.$.inUseLabelArea.style.width);
-        assertEquals('3%', storagePage.$.availableLabelArea.style.width);
-        assertFalse(isVisible(storagePage.$$('#lowMessage')));
-        assertTrue(isVisible(storagePage.$$('#criticallyLowMessage')));
-        assertFalse(!!storagePage.$$('#bar.space-low'));
-        assertTrue(!!storagePage.$$('#bar.space-critically-low'));
-        assertEquals(
-            '9.7 GB',
-            storagePage.$.inUseLabelArea.querySelector('.storage-size')
-                .innerText);
-        assertEquals(
-            '0.3 GB',
-            storagePage.$.availableLabelArea.querySelector('.storage-size')
-                .innerText);
-
-        // Normal storage usage.
-        sendStorageSizeStat(
-            '2.5 GB', '7.5 GB', 0.25, settings.StorageSpaceState.NORMAL);
-        assertEquals('25%', storagePage.$.inUseLabelArea.style.width);
-        assertEquals('75%', storagePage.$.availableLabelArea.style.width);
-        assertFalse(isVisible(storagePage.$$('#lowMessage')));
-        assertFalse(isVisible(storagePage.$$('#criticallyLowMessage')));
-        assertFalse(!!storagePage.$$('#bar.space-low'));
-        assertFalse(!!storagePage.$$('#bar.space-critically-low'));
-        assertEquals(
-            '2.5 GB',
-            storagePage.$.inUseLabelArea.querySelector('.storage-size')
-                .innerText);
-        assertEquals(
-            '7.5 GB',
-            storagePage.$.availableLabelArea.querySelector('.storage-size')
-                .innerText);
-      });
-
-      test('system size', async function() {
-        assertEquals('System', storagePage.$$('#systemSizeLabel').innerText);
-        assertEquals(
-            'Calculating…', storagePage.$$('#systemSizeSubLabel').innerText);
-
-        // Send system size callback.
-        cr.webUIListenerCallback('storage-system-size-changed', '8.4 GB');
-        Polymer.dom.flush();
-        assertEquals('8.4 GB', storagePage.$$('#systemSizeSubLabel').innerText);
-
-        // In guest mode, the system row should be hidden.
-        storagePage.isGuest_ = true;
-        Polymer.dom.flush();
-        assertFalse(isVisible(storagePage.$$('#systemSize')));
-      });
-
-      test('apps extensions size', async function() {
-        assertEquals(
-            'Apps and extensions', getStorageItemLabelFromId('appsSize'));
-        assertEquals('Calculating…', getStorageItemSubLabelFromId('appsSize'));
-
-        // Send apps size callback.
-        cr.webUIListenerCallback('storage-apps-size-changed', '59.5 KB');
-        Polymer.dom.flush();
-        assertEquals('59.5 KB', getStorageItemSubLabelFromId('appsSize'));
-      });
-
-      test('other users size', async function() {
-        // The other users row is visible by default, displaying
-        // "calculating...".
-        assertTrue(isVisible(storagePage.$$('#otherUsersSize')));
-        assertEquals(
-            'Other users', getStorageItemLabelFromId('otherUsersSize'));
-        assertEquals(
-            'Calculating…', getStorageItemSubLabelFromId('otherUsersSize'));
-
-        // Simulate absence of other users.
-        cr.webUIListenerCallback(
-            'storage-other-users-size-changed', '0 B', true);
-        Polymer.dom.flush();
-        assertFalse(isVisible(storagePage.$$('#otherUsersSize')));
-
-        // Send other users callback with a size that is not null.
-        cr.webUIListenerCallback(
-            'storage-other-users-size-changed', '322 MB', false);
-        Polymer.dom.flush();
-        assertTrue(isVisible(storagePage.$$('#otherUsersSize')));
-        assertEquals('322 MB', getStorageItemSubLabelFromId('otherUsersSize'));
-
-        // If the user is in Guest mode, the row is not visible.
-        storagePage.isGuest_ = true;
-        cr.webUIListenerCallback(
-            'storage-other-users-size-changed', '322 MB', false);
-        Polymer.dom.flush();
-        assertFalse(isVisible(storagePage.$$('#otherUsersSize')));
-      });
+      // If the user is in Guest mode, the row is not visible.
+      storagePage.isGuest_ = true;
+      webUIListenerCallback(
+          'storage-other-users-size-changed', '322 MB', false);
+      flush();
+      assertFalse(isVisible(storagePage.$$('#otherUsersSize')));
     });
   });
-
-  // #cr_define_end
-  return {TestNames: TestNames};
 });
diff --git a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
index 335cb92b..da1402e 100644
--- a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
@@ -2,1292 +2,1284 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {TestAboutPageBrowserProxyChromeOS} from './test_about_page_browser_proxy_chromeos.js';
-import {TestDeviceNameBrowserProxy} from './test_device_name_browser_proxy.m.js';
-import { AboutPageBrowserProxyImpl, BrowserChannel, DeviceNameBrowserProxyImpl, DeviceNameState, LifetimeBrowserProxyImpl, Router, routes, SetDeviceNameResult, UpdateStatus } from 'chrome://os-settings/chromeos/os_settings.js';
-import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
-import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {TestLifetimeBrowserProxy} from './test_os_lifetime_browser_proxy.m.js';
-import {eventToPromise,flushTasks,waitAfterNextRender} from 'chrome://test/test_util.js';
-import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {CrPolicyIndicatorType} from '//resources/cr_elements/policy/cr_policy_indicator_behavior.m.js';
+import {AboutPageBrowserProxyImpl, BrowserChannel, DeviceNameBrowserProxyImpl, DeviceNameState, LifetimeBrowserProxyImpl, Router, routes, SetDeviceNameResult, UpdateStatus} from 'chrome://os-settings/chromeos/os_settings.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {eventToPromise, flushTasks, waitAfterNextRender} from 'chrome://test/test_util.js';
 
-  suite('AboutPageTest', function() {
-    let page = null;
+import {TestAboutPageBrowserProxyChromeOS} from './test_about_page_browser_proxy_chromeos.js';
+import {TestDeviceNameBrowserProxy} from './test_device_name_browser_proxy.js';
+import {TestLifetimeBrowserProxy} from './test_os_lifetime_browser_proxy.m.js';
 
-    /** @type {?settings.TestAboutPageBrowserProxyChromeOS} */
-    let aboutBrowserProxy = null;
+suite('AboutPageTest', function() {
+  let page = null;
 
-    /** @type {?TestLifetimeBrowserProxy} */
-    let lifetimeBrowserProxy = null;
+  /** @type {?settings.TestAboutPageBrowserProxyChromeOS} */
+  let aboutBrowserProxy = null;
 
-    const SPINNER_ICON = 'chrome://resources/images/throbber_small.svg';
+  /** @type {?TestLifetimeBrowserProxy} */
+  let lifetimeBrowserProxy = null;
 
-    setup(function() {
-      lifetimeBrowserProxy = new TestLifetimeBrowserProxy();
-      LifetimeBrowserProxyImpl.setInstance(lifetimeBrowserProxy);
+  const SPINNER_ICON = 'chrome://resources/images/throbber_small.svg';
 
-      aboutBrowserProxy = new TestAboutPageBrowserProxyChromeOS();
-      AboutPageBrowserProxyImpl.instance_ = aboutBrowserProxy;
-      return initNewPage();
-    });
+  setup(function() {
+    lifetimeBrowserProxy = new TestLifetimeBrowserProxy();
+    LifetimeBrowserProxyImpl.setInstance(lifetimeBrowserProxy);
 
-    teardown(function() {
-      page.remove();
-      page = null;
-      Router.getInstance().resetRouteForTesting();
-    });
-
-    /**
-     * @param {!UpdateStatus} status
-     * @param {{
-     *   progress: number|undefined,
-     *   message: string|undefined
-     *   rollback: bool|undefined
-     *   powerwash: bool|undefined
-     * }} opt_options
-     */
-    function fireStatusChanged(status, opt_options) {
-      const options = opt_options || {};
-      cr.webUIListenerCallback('update-status-changed', {
-        progress: options.progress === undefined ? 1 : options.progress,
-        message: options.message,
-        status: status,
-        rollback: options.rollback,
-        powerwash: options.powerwash,
-      });
-    }
-
-    /** @return {!Promise} */
-    function initNewPage() {
-      aboutBrowserProxy.reset();
-      lifetimeBrowserProxy.reset();
-      PolymerTest.clearBody();
-      page = document.createElement('os-settings-about-page');
-      Router.getInstance().navigateTo(routes.ABOUT);
-      document.body.appendChild(page);
-      return Promise.all([
-        aboutBrowserProxy.whenCalled('getChannelInfo'),
-        aboutBrowserProxy.whenCalled('refreshUpdateStatus'),
-        aboutBrowserProxy.whenCalled('refreshTPMFirmwareUpdateStatus'),
-        aboutBrowserProxy.whenCalled('checkInternetConnection'),
-      ]);
-    }
-
-    /**
-     * @param {string} id
-     */
-    function navigateToSettingsPageWithId(id) {
-      const params = new URLSearchParams();
-      params.append('settingId', id);
-      Router.getInstance().navigateTo(
-          routes.ABOUT_ABOUT, params);
-
-      flush();
-    }
-
-    /**
-     * @param {string} id
-     * @return {!HTMLButtonElement}
-     */
-    function getDeepLinkButtonElementById(id) {
-      return page.$$(`#${id}`).shadowRoot.querySelector('cr-icon-button');
-    }
-
-    /**
-     * Test that the status icon and status message update according to
-     * incoming 'update-status-changed' events.
-     */
-    test('IconAndMessageUpdates', function() {
-      const icon = page.$$('iron-icon');
-      assertTrue(!!icon);
-      const statusMessageEl = page.$$('#updateStatusMessage div');
-      let previousMessageText = statusMessageEl.textContent;
-
-      fireStatusChanged(UpdateStatus.CHECKING);
-      assertEquals(SPINNER_ICON, icon.src);
-      assertEquals(null, icon.getAttribute('icon'));
-      assertNotEquals(previousMessageText, statusMessageEl.textContent);
-      previousMessageText = statusMessageEl.textContent;
-
-      fireStatusChanged(UpdateStatus.UPDATING, {progress: 0});
-      assertEquals(SPINNER_ICON, icon.src);
-      assertEquals(null, icon.getAttribute('icon'));
-      assertFalse(statusMessageEl.textContent.includes('%'));
-      assertNotEquals(previousMessageText, statusMessageEl.textContent);
-      previousMessageText = statusMessageEl.textContent;
-
-      fireStatusChanged(UpdateStatus.UPDATING, {progress: 1});
-      assertNotEquals(previousMessageText, statusMessageEl.textContent);
-      assertTrue(statusMessageEl.textContent.includes('%'));
-      previousMessageText = statusMessageEl.textContent;
-
-      fireStatusChanged(UpdateStatus.NEARLY_UPDATED);
-      assertEquals(null, icon.src);
-      assertEquals('settings:check-circle', icon.icon);
-      assertNotEquals(previousMessageText, statusMessageEl.textContent);
-      previousMessageText = statusMessageEl.textContent;
-
-      fireStatusChanged(UpdateStatus.DISABLED_BY_ADMIN);
-      assertEquals(null, icon.src);
-      assertEquals('cr20:domain', icon.icon);
-      assertNotEquals(previousMessageText, statusMessageEl.textContent);
-
-      fireStatusChanged(UpdateStatus.FAILED);
-      assertEquals(null, icon.src);
-      assertEquals('cr:error-outline', icon.icon);
-      assertEquals(0, statusMessageEl.textContent.trim().length);
-
-      fireStatusChanged(UpdateStatus.DISABLED);
-      assertEquals(null, icon.src);
-      assertEquals(null, icon.getAttribute('icon'));
-      assertEquals(0, statusMessageEl.textContent.trim().length);
-    });
-
-    test('ErrorMessageWithHtml', function() {
-      const htmlError = 'hello<br>there<br>was<pre>an</pre>error';
-      fireStatusChanged(UpdateStatus.FAILED, {message: htmlError});
-      const statusMessageEl = page.$$('#updateStatusMessage div');
-      assertEquals(htmlError, statusMessageEl.innerHTML);
-    });
-
-    test('FailedLearnMoreLink', function() {
-      // Check that link is shown when update failed.
-      fireStatusChanged(UpdateStatus.FAILED, {message: 'foo'});
-      assertTrue(!!page.$$('#updateStatusMessage a:not([hidden])'));
-
-      // Check that link is hidden when update hasn't failed.
-      fireStatusChanged(UpdateStatus.UPDATED, {message: ''});
-      assertTrue(!!page.$$('#updateStatusMessage a[hidden]'));
-    });
-
-    test('Relaunch', function() {
-      const {relaunch} = page.$;
-      assertTrue(!!relaunch);
-      assertTrue(relaunch.hidden);
-
-      fireStatusChanged(UpdateStatus.NEARLY_UPDATED);
-      assertFalse(relaunch.hidden);
-      relaunch.click();
-      return lifetimeBrowserProxy.whenCalled('relaunch');
-    });
-
-    test('Rollback', async () => {
-      loadTimeData.overrideValues({
-        deviceManager: 'google.com',
-        isManaged: true,
-      });
-      await initNewPage();
-      const statusMessageEl = page.$$('#updateStatusMessage div');
-
-      const progress = 90;
-      fireStatusChanged(
-          UpdateStatus.UPDATING,
-          {progress: progress, powerwash: true, rollback: true});
-
-      assertEquals(
-          page.i18nAdvanced(
-              'aboutRollbackInProgress',
-              {substitutions: [page.deviceManager_, progress + '%']}),
-          statusMessageEl.innerHTML);
-
-      fireStatusChanged(
-          UpdateStatus.NEARLY_UPDATED, {powerwash: true, rollback: true});
-
-      assertEquals(
-          page.i18nAdvanced(
-              'aboutRollbackSuccess', {substitutions: [page.deviceManager_]}),
-          statusMessageEl.innerHTML);
-    });
-
-    test('NoInternet', function() {
-      assertTrue(page.$.updateStatusMessage.hidden);
-      aboutBrowserProxy.sendStatusNoInternet();
-      flush();
-      assertFalse(page.$.updateStatusMessage.hidden);
-      assertNotEquals(
-          page.$.updateStatusMessage.innerHTML.includes('no internet'));
-    });
-
-    /**
-     * Test that all buttons update according to incoming
-     * 'update-status-changed' events for the case where target and current
-     * channel are the same.
-     */
-    test('ButtonsUpdate_SameChannel', function() {
-      const {checkForUpdates, relaunch} = page.$;
-
-      assertTrue(!!relaunch);
-      assertTrue(!!checkForUpdates);
-
-      function assertAllHidden() {
-        assertTrue(checkForUpdates.hidden);
-        assertTrue(relaunch.hidden);
-        // Ensure that when all buttons are hidden, the container is also
-        // hidden.
-        assertTrue(page.$.buttonContainer.hidden);
-      }
-
-      // Check that |UPDATED| status is ignored if the user has not
-      // explicitly checked for updates yet.
-      fireStatusChanged(UpdateStatus.UPDATED);
-      assertFalse(checkForUpdates.hidden);
-      assertTrue(relaunch.hidden);
-
-      // Check that the "Check for updates" button gets hidden for certain
-      // UpdateStatus values, even if the CHECKING state was never
-      // encountered (for example triggering update from crosh command
-      // line).
-      fireStatusChanged(UpdateStatus.UPDATING);
-      assertAllHidden();
-      fireStatusChanged(UpdateStatus.NEARLY_UPDATED);
-      assertTrue(checkForUpdates.hidden);
-      assertFalse(relaunch.hidden);
-
-      fireStatusChanged(UpdateStatus.CHECKING);
-      assertAllHidden();
-
-      fireStatusChanged(UpdateStatus.UPDATING);
-      assertAllHidden();
-
-      fireStatusChanged(UpdateStatus.NEARLY_UPDATED);
-      assertTrue(checkForUpdates.hidden);
-      assertFalse(relaunch.hidden);
-
-      fireStatusChanged(UpdateStatus.UPDATED);
-      assertAllHidden();
-
-      fireStatusChanged(UpdateStatus.FAILED);
-      assertFalse(checkForUpdates.hidden);
-      assertTrue(relaunch.hidden);
-
-      fireStatusChanged(UpdateStatus.DISABLED);
-      assertAllHidden();
-
-      fireStatusChanged(UpdateStatus.DISABLED_BY_ADMIN);
-      assertFalse(checkForUpdates.hidden);
-      assertTrue(relaunch.hidden);
-    });
-
-    /**
-     * Test that buttons update according to incoming
-     * 'update-status-changed' events for the case where the target channel
-     * is more stable than current channel and update will powerwash.
-     */
-    test('ButtonsUpdate_BetaToStable', async () => {
-      aboutBrowserProxy.setChannels(BrowserChannel.BETA, BrowserChannel.STABLE);
-      await initNewPage();
-
-      fireStatusChanged(UpdateStatus.NEARLY_UPDATED, {powerwash: true});
-
-      assertTrue(!!page.$.relaunch);
-      assertFalse(page.$.relaunch.hidden);
-
-      assertEquals(
-          page.$.relaunch.innerText,
-          loadTimeData.getString('aboutRelaunchAndPowerwash'));
-
-      page.$.relaunch.click();
-      await lifetimeBrowserProxy.whenCalled('relaunch');
-    });
-
-    /**
-     * Test that buttons update according to incoming
-     * 'update-status-changed' events for the case where the target channel
-     * is less stable than current channel.
-     */
-    test('ButtonsUpdate_StableToBeta', async () => {
-      aboutBrowserProxy.setChannels(BrowserChannel.STABLE, BrowserChannel.BETA);
-      await initNewPage();
-
-      fireStatusChanged(UpdateStatus.NEARLY_UPDATED, {powerwash: false});
-
-      assertTrue(!!page.$.relaunch);
-      assertFalse(page.$.relaunch.hidden);
-
-      assertEquals(
-          page.$.relaunch.innerText, loadTimeData.getString('aboutRelaunch'));
-
-      page.$.relaunch.click();
-      await lifetimeBrowserProxy.whenCalled('relaunch');
-    });
-
-    /**
-     * The relaunch and powerwash button is shown if the powerwash flag is set
-     * in the update status.
-     */
-    test('ButtonsUpdate_Powerwash', async () => {
-      await initNewPage();
-
-      fireStatusChanged(UpdateStatus.NEARLY_UPDATED, {powerwash: true});
-
-      assertTrue(!!page.$.relaunch);
-      assertFalse(page.$.relaunch.hidden);
-
-      assertEquals(
-          page.$.relaunch.innerText,
-          loadTimeData.getString('aboutRelaunchAndPowerwash'));
-
-      page.$.relaunch.click();
-      await lifetimeBrowserProxy.whenCalled('relaunch');
-    });
-
-    /**
-     * Test that release notes button can toggled by feature flags.
-     * Test that release notes button handles offline/online mode properly.
-     * page.$$("#") is used to access items inside dom-if.
-     */
-    test('ReleaseNotes', async () => {
-      const releaseNotes = null;
-
-      /**
-       * Checks the visibility of the "release notes" section when online.
-       * @param {boolean} isShowing Whether the section is expected to be
-       *     visible.
-       */
-      function checkReleaseNotesOnline(isShowing) {
-        const releaseNotesOnlineEl = page.$$('#releaseNotesOnline');
-        assertEquals(isShowing, !!releaseNotesOnlineEl);
-      }
-
-      /**
-       * Checks the visibility of the "release notes" for offline mode.
-       * @param {boolean} isShowing Whether the section is expected to be
-       *     visible.
-       */
-      function checkReleaseNotesOffline(isShowing) {
-        const releaseNotesOfflineEl = page.$$('#releaseNotesOffline');
-        // According to
-        // https://polymer-library.polymer-project.org/1.0/api/elements/dom-if
-        // the element will not be removed from the dom if already rendered.
-        // Can be just hidden instead for better performance.
-        assertEquals(
-            isShowing,
-            !!releaseNotesOfflineEl &&
-                window.getComputedStyle(releaseNotesOfflineEl).display !==
-                    'none');
-      }
-
-      aboutBrowserProxy.setInternetConnection(false);
-      await initNewPage();
-      checkReleaseNotesOnline(false);
-      checkReleaseNotesOffline(true);
-
-      aboutBrowserProxy.setInternetConnection(true);
-      await initNewPage();
-      checkReleaseNotesOnline(true);
-      checkReleaseNotesOffline(false);
-
-      page.$$('#releaseNotesOnline').click();
-      return aboutBrowserProxy.whenCalled('launchReleaseNotes');
-    });
-
-    test('Deep link to release notes', async () => {
-      loadTimeData.overrideValues({
-        isDeepLinkingEnabled: true,
-      });
-      aboutBrowserProxy.setInternetConnection(false);
-      await initNewPage();
-
-      const params = new URLSearchParams();
-      params.append('settingId', '1703');
-      Router.getInstance().navigateTo(
-          routes.ABOUT_ABOUT, params);
-
-      flush();
-
-      const deepLinkElement = page.$$('#releaseNotesOffline')
-                                  .shadowRoot.querySelector('cr-icon-button');
-      await waitAfterNextRender(deepLinkElement);
-      assertEquals(
-          deepLinkElement, getDeepActiveElement(),
-          'Release notes should be focused for settingId=1703.');
-    });
-
-    test('RegulatoryInfo', async () => {
-      const regulatoryInfo = {text: 'foo', url: 'bar'};
-
-      /**
-       * Checks the visibility of the "regulatory info" section.
-       * @param {boolean} isShowing Whether the section is expected to be
-       *     visible.
-       * @return {!Promise}
-       */
-      async function checkRegulatoryInfo(isShowing) {
-        await aboutBrowserProxy.whenCalled('getRegulatoryInfo');
-        const regulatoryInfoEl = page.$.regulatoryInfo;
-        assertTrue(!!regulatoryInfoEl);
-        assertEquals(isShowing, !regulatoryInfoEl.hidden);
-
-        if (isShowing) {
-          const img = regulatoryInfoEl.querySelector('img');
-          assertTrue(!!img);
-          assertEquals(regulatoryInfo.text, img.getAttribute('alt'));
-          assertEquals(regulatoryInfo.url, img.getAttribute('src'));
-        }
-      }
-
-      await checkRegulatoryInfo(false);
-      aboutBrowserProxy.setRegulatoryInfo(regulatoryInfo);
-      await initNewPage();
-      await checkRegulatoryInfo(true);
-    });
-
-    test('TPMFirmwareUpdate', async () => {
-      assertTrue(page.$.aboutTPMFirmwareUpdate.hidden);
-      aboutBrowserProxy.setTPMFirmwareUpdateStatus({updateAvailable: true});
-      aboutBrowserProxy.refreshTPMFirmwareUpdateStatus();
-      assertFalse(page.$.aboutTPMFirmwareUpdate.hidden);
-      page.$.aboutTPMFirmwareUpdate.click();
-      await flushTasks();
-      const dialog = page.$$('os-settings-powerwash-dialog');
-      assertTrue(!!dialog);
-      assertTrue(dialog.$.dialog.open);
-      dialog.$$('#powerwash').click();
-      const requestTpmFirmwareUpdate =
-          await lifetimeBrowserProxy.whenCalled('factoryReset');
-      assertTrue(requestTpmFirmwareUpdate);
-    });
-
-    test('DeviceEndOfLife', async () => {
-      /**
-       * Checks the visibility of the end of life message and icon.
-       * @param {boolean} isShowing Whether the end of life UI is expected
-       *     to be visible.
-       * @return {!Promise}
-       */
-      async function checkHasEndOfLife(isShowing) {
-        await aboutBrowserProxy.whenCalled('getEndOfLifeInfo');
-        const {endOfLifeMessageContainer} = page.$;
-        assertTrue(!!endOfLifeMessageContainer);
-
-        assertEquals(isShowing, !endOfLifeMessageContainer.hidden);
-
-        // Update status message should be hidden before user has
-        // checked for updates.
-        assertTrue(page.$.updateStatusMessage.hidden);
-
-        fireStatusChanged(UpdateStatus.CHECKING);
-        assertEquals(isShowing, page.$.updateStatusMessage.hidden);
-
-        if (isShowing) {
-          const icon = page.$$('iron-icon');
-          assertTrue(!!icon);
-          assertEquals(null, icon.src);
-          assertEquals('os-settings:end-of-life', icon.icon);
-
-          const {checkForUpdates} = page.$;
-          assertTrue(!!checkForUpdates);
-          assertTrue(checkForUpdates.hidden);
-        }
-      }
-
-      // Force test proxy to not respond to JS requests.
-      // End of life message should still be hidden in this case.
-      aboutBrowserProxy.setEndOfLifeInfo(new Promise(function(res, rej) {}));
-      await initNewPage();
-      await checkHasEndOfLife(false);
-      aboutBrowserProxy.setEndOfLifeInfo({
-        hasEndOfLife: true,
-        endOfLifeAboutMessage: '',
-      });
-      await initNewPage();
-      await checkHasEndOfLife(true);
-      aboutBrowserProxy.setEndOfLifeInfo({
-        hasEndOfLife: false,
-        endOfLifeAboutMessage: '',
-      });
-      await initNewPage();
-      await checkHasEndOfLife(false);
-    });
-
-    test('managed detailed build info page', async () => {
-      loadTimeData.overrideValues({
-        isManaged: true,
-      });
-
-      // Despite there being a valid end of life, the information is not
-      // shown if the user is managed.
-      aboutBrowserProxy.setEndOfLifeInfo({
-        hasEndOfLife: true,
-        aboutPageEndOfLifeMessage: 'message',
-      });
-      await initNewPage();
-      page.scroller = page.offsetParent;
-      assertTrue(!!page.$['detailed-build-info-trigger']);
-      page.$['detailed-build-info-trigger'].click();
-      const buildInfoPage = page.$$('settings-detailed-build-info');
-      assertTrue(!!buildInfoPage);
-      assertTrue(!!buildInfoPage.$['endOfLifeSectionContainer']);
-      assertTrue(buildInfoPage.$['endOfLifeSectionContainer'].hidden);
-    });
-
-    test('detailed build info page', async () => {
-      loadTimeData.overrideValues({
-        isManaged: false,
-      });
-
-      async function checkEndOfLifeSection() {
-        await aboutBrowserProxy.whenCalled('getEndOfLifeInfo');
-        const buildInfoPage = page.$$('settings-detailed-build-info');
-        assertTrue(!!buildInfoPage.$['endOfLifeSectionContainer']);
-        assertFalse(buildInfoPage.$['endOfLifeSectionContainer'].hidden);
-      }
-
-      aboutBrowserProxy.setEndOfLifeInfo({
-        hasEndOfLife: true,
-        aboutPageEndOfLifeMessage: '',
-      });
-      await initNewPage();
-      page.scroller = page.offsetParent;
-      assertTrue(!!page.$['detailed-build-info-trigger']);
-      page.$['detailed-build-info-trigger'].click();
-      const buildInfoPage = page.$$('settings-detailed-build-info');
-      assertTrue(!!buildInfoPage);
-      assertTrue(!!buildInfoPage.$['endOfLifeSectionContainer']);
-      assertTrue(buildInfoPage.$['endOfLifeSectionContainer'].hidden);
-
-      aboutBrowserProxy.setEndOfLifeInfo({
-        hasEndOfLife: true,
-        aboutPageEndOfLifeMessage: 'message',
-      });
-      await initNewPage();
-      page.scroller = page.offsetParent;
-      assertTrue(!!page.$['detailed-build-info-trigger']);
-      page.$['detailed-build-info-trigger'].click();
-      checkEndOfLifeSection();
-    });
-
-    test('GetHelp', function() {
-      assertTrue(!!page.$.help);
-      page.$.help.click();
-      return aboutBrowserProxy.whenCalled('openOsHelpPage');
-    });
-
-    test('LaunchDiagnostics', async function() {
-      loadTimeData.overrideValues({
-        isDeepLinkingEnabled: true,
-      });
-
-      await initNewPage();
-      flush();
-
-      assertTrue(!!page.$.diagnostics);
-      page.$.diagnostics.click();
-      await aboutBrowserProxy.whenCalled('openDiagnostics');
-    });
-
-    test('Deep link to diagnostics', async () => {
-      loadTimeData.overrideValues({
-        isDeepLinkingEnabled: true,
-      });
-
-      await initNewPage();
-      flush();
-
-      const diagnosticsId = '1707';
-      navigateToSettingsPageWithId(diagnosticsId);
-
-      const deepLinkElement = getDeepLinkButtonElementById('diagnostics');
-      await waitAfterNextRender(deepLinkElement);
-      assertEquals(
-          deepLinkElement, getDeepActiveElement(),
-          `Diagnostics should be focused for settingId=${diagnosticsId}.`);
-    });
-
-    test('LaunchFirmwareUpdates', async function() {
-      loadTimeData.overrideValues({
-        isDeepLinkingEnabled: true,
-        isFirmwareUpdaterAppEnabled: true,
-      });
-
-      await initNewPage();
-      flush();
-
-      assertTrue(!!page.$.firmwareUpdates);
-      page.$.firmwareUpdates.click();
-      await aboutBrowserProxy.whenCalled('openFirmwareUpdatesPage');
-    });
-
-    test('Deep link to firmware updates', async () => {
-      loadTimeData.overrideValues({
-        isDeepLinkingEnabled: true,
-        isFirmwareUpdaterAppEnabled: true,
-      });
-
-      await initNewPage();
-      flush();
-
-      const firmwareUpdatesId = '1709';
-      navigateToSettingsPageWithId(firmwareUpdatesId);
-
-      const deepLinkElement = getDeepLinkButtonElementById('firmwareUpdates');
-      await waitAfterNextRender(deepLinkElement);
-      assertEquals(
-          deepLinkElement, getDeepActiveElement(),
-          `Firmware updates should be focused for settingId=${
-              firmwareUpdatesId}.`);
-    });
-
-    // Regression test for crbug.com/1220294
-    test('Update button shown initially', async () => {
-      aboutBrowserProxy.blockRefreshUpdateStatus();
-      await initNewPage();
-
-      const {checkForUpdates} = page.$;
-      assertFalse(checkForUpdates.hidden);
-    });
-
-    test('Update button click moves focus', async () => {
-      await initNewPage();
-
-      const {checkForUpdates, updateStatusMessageInner} = page.$;
-      checkForUpdates.click();
-      await aboutBrowserProxy.whenCalled('requestUpdate');
-      assertEquals(
-          updateStatusMessageInner, getDeepActiveElement(),
-          'Update status message should be focused.');
-    });
+    aboutBrowserProxy = new TestAboutPageBrowserProxyChromeOS();
+    AboutPageBrowserProxyImpl.instance_ = aboutBrowserProxy;
+    return initNewPage();
   });
 
-  suite('DetailedBuildInfoTest', function() {
-    let page = null;
-    let browserProxy = null;
-    let deviceNameBrowserProxy = null;
+  teardown(function() {
+    page.remove();
+    page = null;
+    Router.getInstance().resetRouteForTesting();
+  });
 
-    setup(function() {
-      browserProxy = new TestAboutPageBrowserProxyChromeOS();
-      deviceNameBrowserProxy = new TestDeviceNameBrowserProxy();
-      AboutPageBrowserProxyImpl.instance_ = browserProxy;
-      DeviceNameBrowserProxyImpl.instance_ = deviceNameBrowserProxy;
-      PolymerTest.clearBody();
+  /**
+   * @param {!UpdateStatus} status
+   * @param {{
+   *   progress: number|undefined,
+   *   message: string|undefined
+   *   rollback: bool|undefined
+   *   powerwash: bool|undefined
+   * }} opt_options
+   */
+  function fireStatusChanged(status, opt_options) {
+    const options = opt_options || {};
+    cr.webUIListenerCallback('update-status-changed', {
+      progress: options.progress === undefined ? 1 : options.progress,
+      message: options.message,
+      status: status,
+      rollback: options.rollback,
+      powerwash: options.powerwash,
     });
+  }
 
-    teardown(function() {
-      page.remove();
-      page = null;
-      Router.getInstance().resetRouteForTesting();
+  /** @return {!Promise} */
+  function initNewPage() {
+    aboutBrowserProxy.reset();
+    lifetimeBrowserProxy.reset();
+    PolymerTest.clearBody();
+    page = document.createElement('os-settings-about-page');
+    Router.getInstance().navigateTo(routes.ABOUT);
+    document.body.appendChild(page);
+    return Promise.all([
+      aboutBrowserProxy.whenCalled('getChannelInfo'),
+      aboutBrowserProxy.whenCalled('refreshUpdateStatus'),
+      aboutBrowserProxy.whenCalled('refreshTPMFirmwareUpdateStatus'),
+      aboutBrowserProxy.whenCalled('checkInternetConnection'),
+    ]);
+  }
+
+  /**
+   * @param {string} id
+   */
+  function navigateToSettingsPageWithId(id) {
+    const params = new URLSearchParams();
+    params.append('settingId', id);
+    Router.getInstance().navigateTo(routes.ABOUT_ABOUT, params);
+
+    flush();
+  }
+
+  /**
+   * @param {string} id
+   * @return {!HTMLButtonElement}
+   */
+  function getDeepLinkButtonElementById(id) {
+    return page.$$(`#${id}`).shadowRoot.querySelector('cr-icon-button');
+  }
+
+  /**
+   * Test that the status icon and status message update according to
+   * incoming 'update-status-changed' events.
+   */
+  test('IconAndMessageUpdates', function() {
+    const icon = page.$$('iron-icon');
+    assertTrue(!!icon);
+    const statusMessageEl = page.$$('#updateStatusMessage div');
+    let previousMessageText = statusMessageEl.textContent;
+
+    fireStatusChanged(UpdateStatus.CHECKING);
+    assertEquals(SPINNER_ICON, icon.src);
+    assertEquals(null, icon.getAttribute('icon'));
+    assertNotEquals(previousMessageText, statusMessageEl.textContent);
+    previousMessageText = statusMessageEl.textContent;
+
+    fireStatusChanged(UpdateStatus.UPDATING, {progress: 0});
+    assertEquals(SPINNER_ICON, icon.src);
+    assertEquals(null, icon.getAttribute('icon'));
+    assertFalse(statusMessageEl.textContent.includes('%'));
+    assertNotEquals(previousMessageText, statusMessageEl.textContent);
+    previousMessageText = statusMessageEl.textContent;
+
+    fireStatusChanged(UpdateStatus.UPDATING, {progress: 1});
+    assertNotEquals(previousMessageText, statusMessageEl.textContent);
+    assertTrue(statusMessageEl.textContent.includes('%'));
+    previousMessageText = statusMessageEl.textContent;
+
+    fireStatusChanged(UpdateStatus.NEARLY_UPDATED);
+    assertEquals(null, icon.src);
+    assertEquals('settings:check-circle', icon.icon);
+    assertNotEquals(previousMessageText, statusMessageEl.textContent);
+    previousMessageText = statusMessageEl.textContent;
+
+    fireStatusChanged(UpdateStatus.DISABLED_BY_ADMIN);
+    assertEquals(null, icon.src);
+    assertEquals('cr20:domain', icon.icon);
+    assertNotEquals(previousMessageText, statusMessageEl.textContent);
+
+    fireStatusChanged(UpdateStatus.FAILED);
+    assertEquals(null, icon.src);
+    assertEquals('cr:error-outline', icon.icon);
+    assertEquals(0, statusMessageEl.textContent.trim().length);
+
+    fireStatusChanged(UpdateStatus.DISABLED);
+    assertEquals(null, icon.src);
+    assertEquals(null, icon.getAttribute('icon'));
+    assertEquals(0, statusMessageEl.textContent.trim().length);
+  });
+
+  test('ErrorMessageWithHtml', function() {
+    const htmlError = 'hello<br>there<br>was<pre>an</pre>error';
+    fireStatusChanged(UpdateStatus.FAILED, {message: htmlError});
+    const statusMessageEl = page.$$('#updateStatusMessage div');
+    assertEquals(htmlError, statusMessageEl.innerHTML);
+  });
+
+  test('FailedLearnMoreLink', function() {
+    // Check that link is shown when update failed.
+    fireStatusChanged(UpdateStatus.FAILED, {message: 'foo'});
+    assertTrue(!!page.$$('#updateStatusMessage a:not([hidden])'));
+
+    // Check that link is hidden when update hasn't failed.
+    fireStatusChanged(UpdateStatus.UPDATED, {message: ''});
+    assertTrue(!!page.$$('#updateStatusMessage a[hidden]'));
+  });
+
+  test('Relaunch', function() {
+    const {relaunch} = page.$;
+    assertTrue(!!relaunch);
+    assertTrue(relaunch.hidden);
+
+    fireStatusChanged(UpdateStatus.NEARLY_UPDATED);
+    assertFalse(relaunch.hidden);
+    relaunch.click();
+    return lifetimeBrowserProxy.whenCalled('relaunch');
+  });
+
+  test('Rollback', async () => {
+    loadTimeData.overrideValues({
+      deviceManager: 'google.com',
+      isManaged: true,
     });
+    await initNewPage();
+    const statusMessageEl = page.$$('#updateStatusMessage div');
 
-    test('Initialization', async () => {
-      page = document.createElement('settings-detailed-build-info');
-      document.body.appendChild(page);
+    const progress = 90;
+    fireStatusChanged(
+        UpdateStatus.UPDATING,
+        {progress: progress, powerwash: true, rollback: true});
 
-      await Promise.all([
-        browserProxy.whenCalled('pageReady'),
-        browserProxy.whenCalled('canChangeChannel'),
-        browserProxy.whenCalled('getChannelInfo'),
-        browserProxy.whenCalled('getVersionInfo'),
-      ]);
-    });
+    assertEquals(
+        page.i18nAdvanced(
+            'aboutRollbackInProgress',
+            {substitutions: [page.deviceManager_, progress + '%']}),
+        statusMessageEl.innerHTML);
+
+    fireStatusChanged(
+        UpdateStatus.NEARLY_UPDATED, {powerwash: true, rollback: true});
+
+    assertEquals(
+        page.i18nAdvanced(
+            'aboutRollbackSuccess', {substitutions: [page.deviceManager_]}),
+        statusMessageEl.innerHTML);
+  });
+
+  test('NoInternet', function() {
+    assertTrue(page.$.updateStatusMessage.hidden);
+    aboutBrowserProxy.sendStatusNoInternet();
+    flush();
+    assertFalse(page.$.updateStatusMessage.hidden);
+    assertNotEquals(
+        page.$.updateStatusMessage.innerHTML.includes('no internet'));
+  });
+
+  /**
+   * Test that all buttons update according to incoming
+   * 'update-status-changed' events for the case where target and current
+   * channel are the same.
+   */
+  test('ButtonsUpdate_SameChannel', function() {
+    const {checkForUpdates, relaunch} = page.$;
+
+    assertTrue(!!relaunch);
+    assertTrue(!!checkForUpdates);
+
+    function assertAllHidden() {
+      assertTrue(checkForUpdates.hidden);
+      assertTrue(relaunch.hidden);
+      // Ensure that when all buttons are hidden, the container is also
+      // hidden.
+      assertTrue(page.$.buttonContainer.hidden);
+    }
+
+    // Check that |UPDATED| status is ignored if the user has not
+    // explicitly checked for updates yet.
+    fireStatusChanged(UpdateStatus.UPDATED);
+    assertFalse(checkForUpdates.hidden);
+    assertTrue(relaunch.hidden);
+
+    // Check that the "Check for updates" button gets hidden for certain
+    // UpdateStatus values, even if the CHECKING state was never
+    // encountered (for example triggering update from crosh command
+    // line).
+    fireStatusChanged(UpdateStatus.UPDATING);
+    assertAllHidden();
+    fireStatusChanged(UpdateStatus.NEARLY_UPDATED);
+    assertTrue(checkForUpdates.hidden);
+    assertFalse(relaunch.hidden);
+
+    fireStatusChanged(UpdateStatus.CHECKING);
+    assertAllHidden();
+
+    fireStatusChanged(UpdateStatus.UPDATING);
+    assertAllHidden();
+
+    fireStatusChanged(UpdateStatus.NEARLY_UPDATED);
+    assertTrue(checkForUpdates.hidden);
+    assertFalse(relaunch.hidden);
+
+    fireStatusChanged(UpdateStatus.UPDATED);
+    assertAllHidden();
+
+    fireStatusChanged(UpdateStatus.FAILED);
+    assertFalse(checkForUpdates.hidden);
+    assertTrue(relaunch.hidden);
+
+    fireStatusChanged(UpdateStatus.DISABLED);
+    assertAllHidden();
+
+    fireStatusChanged(UpdateStatus.DISABLED_BY_ADMIN);
+    assertFalse(checkForUpdates.hidden);
+    assertTrue(relaunch.hidden);
+  });
+
+  /**
+   * Test that buttons update according to incoming
+   * 'update-status-changed' events for the case where the target channel
+   * is more stable than current channel and update will powerwash.
+   */
+  test('ButtonsUpdate_BetaToStable', async () => {
+    aboutBrowserProxy.setChannels(BrowserChannel.BETA, BrowserChannel.STABLE);
+    await initNewPage();
+
+    fireStatusChanged(UpdateStatus.NEARLY_UPDATED, {powerwash: true});
+
+    assertTrue(!!page.$.relaunch);
+    assertFalse(page.$.relaunch.hidden);
+
+    assertEquals(
+        page.$.relaunch.innerText,
+        loadTimeData.getString('aboutRelaunchAndPowerwash'));
+
+    page.$.relaunch.click();
+    await lifetimeBrowserProxy.whenCalled('relaunch');
+  });
+
+  /**
+   * Test that buttons update according to incoming
+   * 'update-status-changed' events for the case where the target channel
+   * is less stable than current channel.
+   */
+  test('ButtonsUpdate_StableToBeta', async () => {
+    aboutBrowserProxy.setChannels(BrowserChannel.STABLE, BrowserChannel.BETA);
+    await initNewPage();
+
+    fireStatusChanged(UpdateStatus.NEARLY_UPDATED, {powerwash: false});
+
+    assertTrue(!!page.$.relaunch);
+    assertFalse(page.$.relaunch.hidden);
+
+    assertEquals(
+        page.$.relaunch.innerText, loadTimeData.getString('aboutRelaunch'));
+
+    page.$.relaunch.click();
+    await lifetimeBrowserProxy.whenCalled('relaunch');
+  });
+
+  /**
+   * The relaunch and powerwash button is shown if the powerwash flag is set
+   * in the update status.
+   */
+  test('ButtonsUpdate_Powerwash', async () => {
+    await initNewPage();
+
+    fireStatusChanged(UpdateStatus.NEARLY_UPDATED, {powerwash: true});
+
+    assertTrue(!!page.$.relaunch);
+    assertFalse(page.$.relaunch.hidden);
+
+    assertEquals(
+        page.$.relaunch.innerText,
+        loadTimeData.getString('aboutRelaunchAndPowerwash'));
+
+    page.$.relaunch.click();
+    await lifetimeBrowserProxy.whenCalled('relaunch');
+  });
+
+  /**
+   * Test that release notes button can toggled by feature flags.
+   * Test that release notes button handles offline/online mode properly.
+   * page.$$("#") is used to access items inside dom-if.
+   */
+  test('ReleaseNotes', async () => {
+    const releaseNotes = null;
 
     /**
-     * Checks whether the "change channel" button state (enabled/disabled)
-     * correctly reflects whether the user is allowed to change channel (as
-     * dictated by the browser via loadTimeData boolean).
-     * @param {boolean} canChangeChannel Whether to simulate the case where
-     *     changing channels is allowed.
-     * @return {!Promise}
+     * Checks the visibility of the "release notes" section when online.
+     * @param {boolean} isShowing Whether the section is expected to be
+     *     visible.
      */
-    async function checkChangeChannelButton(canChangeChannel) {
-      browserProxy.setCanChangeChannel(canChangeChannel);
-      page = document.createElement('settings-detailed-build-info');
-      document.body.appendChild(page);
-      await browserProxy.whenCalled('canChangeChannel');
-      await waitAfterNextRender(page);
-
-      const changeChannelButton = page.$$('cr-button');
-      assertTrue(!!changeChannelButton);
-      assertEquals(canChangeChannel, !changeChannelButton.disabled);
+    function checkReleaseNotesOnline(isShowing) {
+      const releaseNotesOnlineEl = page.$$('#releaseNotesOnline');
+      assertEquals(isShowing, !!releaseNotesOnlineEl);
     }
 
     /**
-     * Checks whether the change channel policy indicator shows correct state.
-     * @param {boolean} canChangeChannel Whether to simulate the case where
-     *     changing channels is allowed.
-     * @param {boolean?} isManaged Whether device is enterprise managed.
-     * @return {!Promise}
+     * Checks the visibility of the "release notes" for offline mode.
+     * @param {boolean} isShowing Whether the section is expected to be
+     *     visible.
      */
-    async function checkChangeChannelPolicyIndicator(
-        canChangeChannel, isManaged) {
-      if (isManaged !== undefined) {
-        loadTimeData.overrideValues({
-          aboutEnterpriseManaged: isManaged,
-        });
-      }
-      browserProxy.setCanChangeChannel(canChangeChannel);
-      page = document.createElement('settings-detailed-build-info');
-      document.body.appendChild(page);
-      await browserProxy.whenCalled('canChangeChannel');
-      await waitAfterNextRender(page);
-
-      const policyIndicator = page.$$('#changeChannelPolicyIndicator');
-      assertEquals(!policyIndicator, canChangeChannel);
-      if (!canChangeChannel) {
-        if (isManaged) {
-          assertEquals(
-              CrPolicyIndicatorType.DEVICE_POLICY,
-              policyIndicator.indicatorType);
-        } else {
-          assertEquals(
-              CrPolicyIndicatorType.OWNER, policyIndicator.indicatorType);
-        }
-      }
-    }
-
-    test(
-        'Change channel button should be enabled when user can change',
-        async function() {
-          await checkChangeChannelButton(/*canChangeChannel=*/ true);
-        });
-
-    test(
-        'Change channel button should be disabled when user can not change',
-        async function() {
-          await checkChangeChannelButton(/*canChangeChannel=*/ false);
-        });
-
-    test(
-        'Change channel policy indicator should hide when user can change',
-        async function() {
-          await checkChangeChannelPolicyIndicator(/*canChangeChannel=*/ true);
-        });
-
-    test(
-        'Change channel policy indicator should show when user can not change',
-        async function() {
-          // show managed by device policy.
-          await checkChangeChannelPolicyIndicator(
-              /*canChangeChannel=*/ false, /*isManaged*/ true);
-          // show managed by owner.
-          await checkChangeChannelPolicyIndicator(
-              /*canChangeChannel=*/ false, /*isManaged*/ false);
-        });
-
-    /**
-     * Checks whether the "change channel" button state (enabled/disabled)
-     * is correct before getChannelInfo() returns
-     * (see https://crbug.com/848750). Here, getChannelInfo() is blocked
-     * manually until after the button check.
-     */
-    async function checkChangeChannelButtonWithDelayedChannelState(
-        canChangeChannel) {
-      const resolver = new PromiseResolver();
-      browserProxy.getChannelInfo = async function() {
-        await resolver.promise;
-        this.methodCalled('getChannelInfo');
-        return Promise.resolve(this.channelInfo_);
-      };
-      const result = await checkChangeChannelButton(canChangeChannel);
-      resolver.resolve();
-      return result;
-    }
-
-    test('ChangeChannel_EnabledWithDelayedChannelState', function() {
-      return checkChangeChannelButtonWithDelayedChannelState(true);
-    });
-
-    test('ChangeChannel_DisabledWithDelayedChannelState', function() {
-      return checkChangeChannelButtonWithDelayedChannelState(false);
-    });
-
-    test('Deep link to change channel', async () => {
-      loadTimeData.overrideValues({
-        isDeepLinkingEnabled: true,
-      });
-      page = document.createElement('settings-detailed-build-info');
-      document.body.appendChild(page);
-
-      const params = new URLSearchParams();
-      params.append('settingId', '1700');
-      Router.getInstance().navigateTo(
-          routes.DETAILED_BUILD_INFO, params);
-
-      flush();
-
-      const deepLinkElement = page.$$('cr-button');
-      await waitAfterNextRender(deepLinkElement);
+    function checkReleaseNotesOffline(isShowing) {
+      const releaseNotesOfflineEl = page.$$('#releaseNotesOffline');
+      // According to
+      // https://polymer-library.polymer-project.org/1.0/api/elements/dom-if
+      // the element will not be removed from the dom if already rendered.
+      // Can be just hidden instead for better performance.
       assertEquals(
-          deepLinkElement, getDeepActiveElement(),
-          'Change channel button should be focused for settingId=1700.');
-    });
-
-    async function checkCopyBuildDetailsButton() {
-      page = document.createElement('settings-detailed-build-info');
-      document.body.appendChild(page);
-      const copyBuildDetailsButton = page.$$('cr-icon-button');
-      await browserProxy.whenCalled('getVersionInfo');
-      await browserProxy.whenCalled('getChannelInfo');
-      await browserProxy.whenCalled('canChangeChannel');
-
-      const expectedClipBoardText =
-          `${loadTimeData.getString('application_label')}: ` +
-          `${loadTimeData.getString('aboutBrowserVersion')}\n` +
-          `Platform: ${browserProxy.versionInfo_.osVersion}\n` +
-          `Channel: ${browserProxy.channelInfo_.targetChannel}\n` +
-          `Firmware Version: ${browserProxy.versionInfo_.osFirmware}\n` +
-          `ARC Enabled: ${loadTimeData.getBoolean('aboutIsArcEnabled')}\n` +
-          `ARC: ${browserProxy.versionInfo_.arcVersion}\n` +
-          `Enterprise Enrolled: ` +
-          `${loadTimeData.getBoolean('aboutEnterpriseManaged')}\n` +
-          `Developer Mode: ` +
-          `${loadTimeData.getBoolean('aboutIsDeveloperMode')}`;
-
-      assertTrue(!!copyBuildDetailsButton);
-      await navigator.clipboard.readText().then(text => assertFalse(!!text));
-      copyBuildDetailsButton.click();
-      await navigator.clipboard.readText().then(
-          text => assertEquals(text, expectedClipBoardText));
+          isShowing,
+          !!releaseNotesOfflineEl &&
+              window.getComputedStyle(releaseNotesOfflineEl).display !==
+                  'none');
     }
 
-    test('CheckCopyBuildDetails', function() {
-      checkCopyBuildDetailsButton();
+    aboutBrowserProxy.setInternetConnection(false);
+    await initNewPage();
+    checkReleaseNotesOnline(false);
+    checkReleaseNotesOffline(true);
+
+    aboutBrowserProxy.setInternetConnection(true);
+    await initNewPage();
+    checkReleaseNotesOnline(true);
+    checkReleaseNotesOffline(false);
+
+    page.$$('#releaseNotesOnline').click();
+    return aboutBrowserProxy.whenCalled('launchReleaseNotes');
+  });
+
+  test('Deep link to release notes', async () => {
+    loadTimeData.overrideValues({
+      isDeepLinkingEnabled: true,
     });
+    aboutBrowserProxy.setInternetConnection(false);
+    await initNewPage();
 
-    test('Deep link to change device name', async () => {
-      loadTimeData.overrideValues({
-        isDeepLinkingEnabled: true,
-      });
-      page = document.createElement('settings-detailed-build-info');
-      document.body.appendChild(page);
+    const params = new URLSearchParams();
+    params.append('settingId', '1703');
+    Router.getInstance().navigateTo(routes.ABOUT_ABOUT, params);
 
-      const params = new URLSearchParams();
-      params.append('settingId', '1708');
-      Router.getInstance().navigateTo(
-          routes.DETAILED_BUILD_INFO, params);
+    flush();
 
-      flush();
+    const deepLinkElement = page.$$('#releaseNotesOffline')
+                                .shadowRoot.querySelector('cr-icon-button');
+    await waitAfterNextRender(deepLinkElement);
+    assertEquals(
+        deepLinkElement, getDeepActiveElement(),
+        'Release notes should be focused for settingId=1703.');
+  });
 
-      const deepLinkElement = page.$$('cr-icon-button');
-      await waitAfterNextRender(deepLinkElement);
-      assertEquals(
-          deepLinkElement, getDeepActiveElement(),
-          'Change device name button should be focused for settingId=1708.');
-    });
-
-    function flushAsync() {
-      flush();
-      // Use setTimeout to wait for the next macrotask.
-      return new Promise(resolve => setTimeout(resolve));
-    }
+  test('RegulatoryInfo', async () => {
+    const regulatoryInfo = {text: 'foo', url: 'bar'};
 
     /**
-     * Checks whether the "edit device name" button state (enabled/disabled)
-     * correctly reflects whether the user is allowed to edit the name.
-     * @param {string} testDeviceName
-     * @param {DeviceNameState} deviceNameState
+     * Checks the visibility of the "regulatory info" section.
+     * @param {boolean} isShowing Whether the section is expected to be
+     *     visible.
      * @return {!Promise}
      */
-    function checkDeviceNameMetadata(testDeviceName, deviceNameState) {
-      cr.webUIListenerCallback(
-          'settings.updateDeviceNameMetadata',
-          {deviceName: testDeviceName, deviceNameState: deviceNameState});
+    async function checkRegulatoryInfo(isShowing) {
+      await aboutBrowserProxy.whenCalled('getRegulatoryInfo');
+      const regulatoryInfoEl = page.$.regulatoryInfo;
+      assertTrue(!!regulatoryInfoEl);
+      assertEquals(isShowing, !regulatoryInfoEl.hidden);
 
-      assertEquals(page.$$('#deviceName').innerText, testDeviceName);
-
-      let canEditDeviceName = null;
-      switch (deviceNameState) {
-        case (DeviceNameState.CAN_BE_MODIFIED):
-          canEditDeviceName = true;
-          break;
-        default:
-          canEditDeviceName = false;
+      if (isShowing) {
+        const img = regulatoryInfoEl.querySelector('img');
+        assertTrue(!!img);
+        assertEquals(regulatoryInfo.text, img.getAttribute('alt'));
+        assertEquals(regulatoryInfo.url, img.getAttribute('src'));
       }
+    }
 
-      const canEditDeviceNameButton = page.$$('cr-icon-button');
-      assertTrue(!!canEditDeviceNameButton);
-      assertEquals(canEditDeviceName, !canEditDeviceNameButton.disabled);
+    await checkRegulatoryInfo(false);
+    aboutBrowserProxy.setRegulatoryInfo(regulatoryInfo);
+    await initNewPage();
+    await checkRegulatoryInfo(true);
+  });
 
-      flushAsync();
-      const policyIndicator = page.$$('#editHostnamePolicyIndicator');
-      if (deviceNameState === DeviceNameState.CAN_BE_MODIFIED) {
-        assertFalse(!!policyIndicator);
-      } else if (
-          deviceNameState ===
-          DeviceNameState.CANNOT_BE_MODIFIED_BECAUSE_OF_POLICIES) {
-        assertTrue(!!policyIndicator);
+  test('TPMFirmwareUpdate', async () => {
+    assertTrue(page.$.aboutTPMFirmwareUpdate.hidden);
+    aboutBrowserProxy.setTPMFirmwareUpdateStatus({updateAvailable: true});
+    aboutBrowserProxy.refreshTPMFirmwareUpdateStatus();
+    assertFalse(page.$.aboutTPMFirmwareUpdate.hidden);
+    page.$.aboutTPMFirmwareUpdate.click();
+    await flushTasks();
+    const dialog = page.$$('os-settings-powerwash-dialog');
+    assertTrue(!!dialog);
+    assertTrue(dialog.$.dialog.open);
+    dialog.$$('#powerwash').click();
+    const requestTpmFirmwareUpdate =
+        await lifetimeBrowserProxy.whenCalled('factoryReset');
+    assertTrue(requestTpmFirmwareUpdate);
+  });
+
+  test('DeviceEndOfLife', async () => {
+    /**
+     * Checks the visibility of the end of life message and icon.
+     * @param {boolean} isShowing Whether the end of life UI is expected
+     *     to be visible.
+     * @return {!Promise}
+     */
+    async function checkHasEndOfLife(isShowing) {
+      await aboutBrowserProxy.whenCalled('getEndOfLifeInfo');
+      const {endOfLifeMessageContainer} = page.$;
+      assertTrue(!!endOfLifeMessageContainer);
+
+      assertEquals(isShowing, !endOfLifeMessageContainer.hidden);
+
+      // Update status message should be hidden before user has
+      // checked for updates.
+      assertTrue(page.$.updateStatusMessage.hidden);
+
+      fireStatusChanged(UpdateStatus.CHECKING);
+      assertEquals(isShowing, page.$.updateStatusMessage.hidden);
+
+      if (isShowing) {
+        const icon = page.$$('iron-icon');
+        assertTrue(!!icon);
+        assertEquals(null, icon.src);
+        assertEquals('os-settings:end-of-life', icon.icon);
+
+        const {checkForUpdates} = page.$;
+        assertTrue(!!checkForUpdates);
+        assertTrue(checkForUpdates.hidden);
+      }
+    }
+
+    // Force test proxy to not respond to JS requests.
+    // End of life message should still be hidden in this case.
+    aboutBrowserProxy.setEndOfLifeInfo(new Promise(function(res, rej) {}));
+    await initNewPage();
+    await checkHasEndOfLife(false);
+    aboutBrowserProxy.setEndOfLifeInfo({
+      hasEndOfLife: true,
+      endOfLifeAboutMessage: '',
+    });
+    await initNewPage();
+    await checkHasEndOfLife(true);
+    aboutBrowserProxy.setEndOfLifeInfo({
+      hasEndOfLife: false,
+      endOfLifeAboutMessage: '',
+    });
+    await initNewPage();
+    await checkHasEndOfLife(false);
+  });
+
+  test('managed detailed build info page', async () => {
+    loadTimeData.overrideValues({
+      isManaged: true,
+    });
+
+    // Despite there being a valid end of life, the information is not
+    // shown if the user is managed.
+    aboutBrowserProxy.setEndOfLifeInfo({
+      hasEndOfLife: true,
+      aboutPageEndOfLifeMessage: 'message',
+    });
+    await initNewPage();
+    page.scroller = page.offsetParent;
+    assertTrue(!!page.$['detailed-build-info-trigger']);
+    page.$['detailed-build-info-trigger'].click();
+    const buildInfoPage = page.$$('settings-detailed-build-info');
+    assertTrue(!!buildInfoPage);
+    assertTrue(!!buildInfoPage.$['endOfLifeSectionContainer']);
+    assertTrue(buildInfoPage.$['endOfLifeSectionContainer'].hidden);
+  });
+
+  test('detailed build info page', async () => {
+    loadTimeData.overrideValues({
+      isManaged: false,
+    });
+
+    async function checkEndOfLifeSection() {
+      await aboutBrowserProxy.whenCalled('getEndOfLifeInfo');
+      const buildInfoPage = page.$$('settings-detailed-build-info');
+      assertTrue(!!buildInfoPage.$['endOfLifeSectionContainer']);
+      assertFalse(buildInfoPage.$['endOfLifeSectionContainer'].hidden);
+    }
+
+    aboutBrowserProxy.setEndOfLifeInfo({
+      hasEndOfLife: true,
+      aboutPageEndOfLifeMessage: '',
+    });
+    await initNewPage();
+    page.scroller = page.offsetParent;
+    assertTrue(!!page.$['detailed-build-info-trigger']);
+    page.$['detailed-build-info-trigger'].click();
+    const buildInfoPage = page.$$('settings-detailed-build-info');
+    assertTrue(!!buildInfoPage);
+    assertTrue(!!buildInfoPage.$['endOfLifeSectionContainer']);
+    assertTrue(buildInfoPage.$['endOfLifeSectionContainer'].hidden);
+
+    aboutBrowserProxy.setEndOfLifeInfo({
+      hasEndOfLife: true,
+      aboutPageEndOfLifeMessage: 'message',
+    });
+    await initNewPage();
+    page.scroller = page.offsetParent;
+    assertTrue(!!page.$['detailed-build-info-trigger']);
+    page.$['detailed-build-info-trigger'].click();
+    checkEndOfLifeSection();
+  });
+
+  test('GetHelp', function() {
+    assertTrue(!!page.$.help);
+    page.$.help.click();
+    return aboutBrowserProxy.whenCalled('openOsHelpPage');
+  });
+
+  test('LaunchDiagnostics', async function() {
+    loadTimeData.overrideValues({
+      isDeepLinkingEnabled: true,
+    });
+
+    await initNewPage();
+    flush();
+
+    assertTrue(!!page.$.diagnostics);
+    page.$.diagnostics.click();
+    await aboutBrowserProxy.whenCalled('openDiagnostics');
+  });
+
+  test('Deep link to diagnostics', async () => {
+    loadTimeData.overrideValues({
+      isDeepLinkingEnabled: true,
+    });
+
+    await initNewPage();
+    flush();
+
+    const diagnosticsId = '1707';
+    navigateToSettingsPageWithId(diagnosticsId);
+
+    const deepLinkElement = getDeepLinkButtonElementById('diagnostics');
+    await waitAfterNextRender(deepLinkElement);
+    assertEquals(
+        deepLinkElement, getDeepActiveElement(),
+        `Diagnostics should be focused for settingId=${diagnosticsId}.`);
+  });
+
+  test('LaunchFirmwareUpdates', async function() {
+    loadTimeData.overrideValues({
+      isDeepLinkingEnabled: true,
+      isFirmwareUpdaterAppEnabled: true,
+    });
+
+    await initNewPage();
+    flush();
+
+    assertTrue(!!page.$.firmwareUpdates);
+    page.$.firmwareUpdates.click();
+    await aboutBrowserProxy.whenCalled('openFirmwareUpdatesPage');
+  });
+
+  test('Deep link to firmware updates', async () => {
+    loadTimeData.overrideValues({
+      isDeepLinkingEnabled: true,
+      isFirmwareUpdaterAppEnabled: true,
+    });
+
+    await initNewPage();
+    flush();
+
+    const firmwareUpdatesId = '1709';
+    navigateToSettingsPageWithId(firmwareUpdatesId);
+
+    const deepLinkElement = getDeepLinkButtonElementById('firmwareUpdates');
+    await waitAfterNextRender(deepLinkElement);
+    assertEquals(
+        deepLinkElement, getDeepActiveElement(),
+        `Firmware updates should be focused for settingId=${
+            firmwareUpdatesId}.`);
+  });
+
+  // Regression test for crbug.com/1220294
+  test('Update button shown initially', async () => {
+    aboutBrowserProxy.blockRefreshUpdateStatus();
+    await initNewPage();
+
+    const {checkForUpdates} = page.$;
+    assertFalse(checkForUpdates.hidden);
+  });
+
+  test('Update button click moves focus', async () => {
+    await initNewPage();
+
+    const {checkForUpdates, updateStatusMessageInner} = page.$;
+    checkForUpdates.click();
+    await aboutBrowserProxy.whenCalled('requestUpdate');
+    assertEquals(
+        updateStatusMessageInner, getDeepActiveElement(),
+        'Update status message should be focused.');
+  });
+});
+
+suite('DetailedBuildInfoTest', function() {
+  let page = null;
+  let browserProxy = null;
+  let deviceNameBrowserProxy = null;
+
+  setup(function() {
+    browserProxy = new TestAboutPageBrowserProxyChromeOS();
+    deviceNameBrowserProxy = new TestDeviceNameBrowserProxy();
+    AboutPageBrowserProxyImpl.instance_ = browserProxy;
+    DeviceNameBrowserProxyImpl.instance_ = deviceNameBrowserProxy;
+    PolymerTest.clearBody();
+  });
+
+  teardown(function() {
+    page.remove();
+    page = null;
+    Router.getInstance().resetRouteForTesting();
+  });
+
+  test('Initialization', async () => {
+    page = document.createElement('settings-detailed-build-info');
+    document.body.appendChild(page);
+
+    await Promise.all([
+      browserProxy.whenCalled('pageReady'),
+      browserProxy.whenCalled('canChangeChannel'),
+      browserProxy.whenCalled('getChannelInfo'),
+      browserProxy.whenCalled('getVersionInfo'),
+    ]);
+  });
+
+  /**
+   * Checks whether the "change channel" button state (enabled/disabled)
+   * correctly reflects whether the user is allowed to change channel (as
+   * dictated by the browser via loadTimeData boolean).
+   * @param {boolean} canChangeChannel Whether to simulate the case where
+   *     changing channels is allowed.
+   * @return {!Promise}
+   */
+  async function checkChangeChannelButton(canChangeChannel) {
+    browserProxy.setCanChangeChannel(canChangeChannel);
+    page = document.createElement('settings-detailed-build-info');
+    document.body.appendChild(page);
+    await browserProxy.whenCalled('canChangeChannel');
+    await waitAfterNextRender(page);
+
+    const changeChannelButton = page.$$('cr-button');
+    assertTrue(!!changeChannelButton);
+    assertEquals(canChangeChannel, !changeChannelButton.disabled);
+  }
+
+  /**
+   * Checks whether the change channel policy indicator shows correct state.
+   * @param {boolean} canChangeChannel Whether to simulate the case where
+   *     changing channels is allowed.
+   * @param {boolean?} isManaged Whether device is enterprise managed.
+   * @return {!Promise}
+   */
+  async function checkChangeChannelPolicyIndicator(
+      canChangeChannel, isManaged) {
+    if (isManaged !== undefined) {
+      loadTimeData.overrideValues({
+        aboutEnterpriseManaged: isManaged,
+      });
+    }
+    browserProxy.setCanChangeChannel(canChangeChannel);
+    page = document.createElement('settings-detailed-build-info');
+    document.body.appendChild(page);
+    await browserProxy.whenCalled('canChangeChannel');
+    await waitAfterNextRender(page);
+
+    const policyIndicator = page.$$('#changeChannelPolicyIndicator');
+    assertEquals(!policyIndicator, canChangeChannel);
+    if (!canChangeChannel) {
+      if (isManaged) {
         assertEquals(
             CrPolicyIndicatorType.DEVICE_POLICY, policyIndicator.indicatorType);
-      } else if (
-          deviceNameState ===
-          DeviceNameState.CANNOT_BE_MODIFIED_BECAUSE_NOT_DEVICE_OWNER) {
-        assertTrue(!!policyIndicator);
+      } else {
         assertEquals(
             CrPolicyIndicatorType.OWNER, policyIndicator.indicatorType);
       }
     }
+  }
 
-    test('DeviceNameMetadata', async () => {
-      loadTimeData.overrideValues({
-        isHostnameSettingEnabled: true,
+  test(
+      'Change channel button should be enabled when user can change',
+      async function() {
+        await checkChangeChannelButton(/*canChangeChannel=*/ true);
       });
 
-      page = document.createElement('settings-detailed-build-info');
-      document.body.appendChild(page);
+  test(
+      'Change channel button should be disabled when user can not change',
+      async function() {
+        await checkChangeChannelButton(/*canChangeChannel=*/ false);
+      });
 
-      await deviceNameBrowserProxy.whenCalled('notifyReadyForDeviceName');
-      checkDeviceNameMetadata(
-          'TestDeviceName1', DeviceNameState.CAN_BE_MODIFIED);
+  test(
+      'Change channel policy indicator should hide when user can change',
+      async function() {
+        await checkChangeChannelPolicyIndicator(/*canChangeChannel=*/ true);
+      });
 
-      // Verify that we can still make changes to device name metadata even
-      // if notifyReadyForDeviceName() is not called again.
-      checkDeviceNameMetadata(
-          'TestDeviceName2',
-          DeviceNameState.CANNOT_BE_MODIFIED_BECAUSE_OF_POLICIES);
-      checkDeviceNameMetadata(
-          'TestDeviceName3',
-          DeviceNameState.CANNOT_BE_MODIFIED_BECAUSE_NOT_DEVICE_OWNER);
-    });
+  test(
+      'Change channel policy indicator should show when user can not change',
+      async function() {
+        // show managed by device policy.
+        await checkChangeChannelPolicyIndicator(
+            /*canChangeChannel=*/ false, /*isManaged*/ true);
+        // show managed by owner.
+        await checkChangeChannelPolicyIndicator(
+            /*canChangeChannel=*/ false, /*isManaged*/ false);
+      });
+
+  /**
+   * Checks whether the "change channel" button state (enabled/disabled)
+   * is correct before getChannelInfo() returns
+   * (see https://crbug.com/848750). Here, getChannelInfo() is blocked
+   * manually until after the button check.
+   */
+  async function checkChangeChannelButtonWithDelayedChannelState(
+      canChangeChannel) {
+    const resolver = new PromiseResolver();
+    browserProxy.getChannelInfo = async function() {
+      await resolver.promise;
+      this.methodCalled('getChannelInfo');
+      return Promise.resolve(this.channelInfo_);
+    };
+    const result = await checkChangeChannelButton(canChangeChannel);
+    resolver.resolve();
+    return result;
+  }
+
+  test('ChangeChannel_EnabledWithDelayedChannelState', function() {
+    return checkChangeChannelButtonWithDelayedChannelState(true);
   });
 
-  suite('EditHostnameDialogTest', function() {
-    let dialog = null;
-    let deviceNameBrowserProxy = null;
+  test('ChangeChannel_DisabledWithDelayedChannelState', function() {
+    return checkChangeChannelButtonWithDelayedChannelState(false);
+  });
 
-    setup(function() {
-      deviceNameBrowserProxy = new TestDeviceNameBrowserProxy();
-      DeviceNameBrowserProxyImpl.instance_ = deviceNameBrowserProxy;
-      PolymerTest.clearBody();
+  test('Deep link to change channel', async () => {
+    loadTimeData.overrideValues({
+      isDeepLinkingEnabled: true,
     });
+    page = document.createElement('settings-detailed-build-info');
+    document.body.appendChild(page);
 
-    teardown(function() {
-      dialog.remove();
-      dialog = null;
-      Router.getInstance().resetRouteForTesting();
+    const params = new URLSearchParams();
+    params.append('settingId', '1700');
+    Router.getInstance().navigateTo(routes.DETAILED_BUILD_INFO, params);
+
+    flush();
+
+    const deepLinkElement = page.$$('cr-button');
+    await waitAfterNextRender(deepLinkElement);
+    assertEquals(
+        deepLinkElement, getDeepActiveElement(),
+        'Change channel button should be focused for settingId=1700.');
+  });
+
+  async function checkCopyBuildDetailsButton() {
+    page = document.createElement('settings-detailed-build-info');
+    document.body.appendChild(page);
+    const copyBuildDetailsButton = page.$$('cr-icon-button');
+    await browserProxy.whenCalled('getVersionInfo');
+    await browserProxy.whenCalled('getChannelInfo');
+    await browserProxy.whenCalled('canChangeChannel');
+
+    const expectedClipBoardText =
+        `${loadTimeData.getString('application_label')}: ` +
+        `${loadTimeData.getString('aboutBrowserVersion')}\n` +
+        `Platform: ${browserProxy.versionInfo_.osVersion}\n` +
+        `Channel: ${browserProxy.channelInfo_.targetChannel}\n` +
+        `Firmware Version: ${browserProxy.versionInfo_.osFirmware}\n` +
+        `ARC Enabled: ${loadTimeData.getBoolean('aboutIsArcEnabled')}\n` +
+        `ARC: ${browserProxy.versionInfo_.arcVersion}\n` +
+        `Enterprise Enrolled: ` +
+        `${loadTimeData.getBoolean('aboutEnterpriseManaged')}\n` +
+        `Developer Mode: ` +
+        `${loadTimeData.getBoolean('aboutIsDeveloperMode')}`;
+
+    assertTrue(!!copyBuildDetailsButton);
+    await navigator.clipboard.readText().then(text => assertFalse(!!text));
+    copyBuildDetailsButton.click();
+    await navigator.clipboard.readText().then(
+        text => assertEquals(text, expectedClipBoardText));
+  }
+
+  test('CheckCopyBuildDetails', function() {
+    checkCopyBuildDetailsButton();
+  });
+
+  test('Deep link to change device name', async () => {
+    loadTimeData.overrideValues({
+      isDeepLinkingEnabled: true,
     });
+    page = document.createElement('settings-detailed-build-info');
+    document.body.appendChild(page);
 
-    function flushAsync() {
-      flush();
-      // Use setTimeout to wait for the next macrotask.
-      return new Promise(resolve => setTimeout(resolve));
+    const params = new URLSearchParams();
+    params.append('settingId', '1708');
+    Router.getInstance().navigateTo(routes.DETAILED_BUILD_INFO, params);
+
+    flush();
+
+    const deepLinkElement = page.$$('cr-icon-button');
+    await waitAfterNextRender(deepLinkElement);
+    assertEquals(
+        deepLinkElement, getDeepActiveElement(),
+        'Change device name button should be focused for settingId=1708.');
+  });
+
+  function flushAsync() {
+    flush();
+    // Use setTimeout to wait for the next macrotask.
+    return new Promise(resolve => setTimeout(resolve));
+  }
+
+  /**
+   * Checks whether the "edit device name" button state (enabled/disabled)
+   * correctly reflects whether the user is allowed to edit the name.
+   * @param {string} testDeviceName
+   * @param {DeviceNameState} deviceNameState
+   * @return {!Promise}
+   */
+  function checkDeviceNameMetadata(testDeviceName, deviceNameState) {
+    cr.webUIListenerCallback(
+        'settings.updateDeviceNameMetadata',
+        {deviceName: testDeviceName, deviceNameState: deviceNameState});
+
+    assertEquals(page.$$('#deviceName').innerText, testDeviceName);
+
+    let canEditDeviceName = null;
+    switch (deviceNameState) {
+      case (DeviceNameState.CAN_BE_MODIFIED):
+        canEditDeviceName = true;
+        break;
+      default:
+        canEditDeviceName = false;
     }
 
-    test('OpenAndCloseDialog', async () => {
-      loadTimeData.overrideValues({
-        isHostnameSettingEnabled: true,
-      });
+    const canEditDeviceNameButton = page.$$('cr-icon-button');
+    assertTrue(!!canEditDeviceNameButton);
+    assertEquals(canEditDeviceName, !canEditDeviceNameButton.disabled);
 
-      const page = document.createElement('settings-detailed-build-info');
-      document.body.appendChild(page);
-
-      await deviceNameBrowserProxy.whenCalled('notifyReadyForDeviceName');
-      const editHostnameButton = page.$$('#editHostnameButton');
-      assertTrue(!!editHostnameButton);
-      editHostnameButton.click();
-      flush();
-
-      dialog = page.$$('edit-hostname-dialog');
-      assertTrue(!!dialog);
-      assertTrue(dialog.$.dialog.open);
-
-      dialog.$$('#cancel').click();
-      flush();
-      assertFalse(dialog.$.dialog.open);
-    });
-
-    /**
-     * @param {string} value The value of the input
-     * @param {boolean} invalid If the input is invalid or not
-     * @param {string} inputCount The length of value in string format
-     */
-    function assertInput(value, invalid, valueLength) {
-      const inputBox = dialog.$$('#deviceName');
-      const inputCount = dialog.$$('#inputCount');
-      assertTrue(!!inputBox);
-      assertTrue(!!inputCount);
-
-      assertEquals(inputBox.value, value);
-      assertEquals(inputBox.invalid, invalid);
-      assertEquals(inputCount.textContent.trim(), valueLength + '/15');
-
-      // Done button should be disabled when input is invalid and cancel button
-      // should be always enabled.
-      const doneButton = dialog.$$('#done');
-      const cancelButton = dialog.$$('#cancel');
-      assertTrue(!!doneButton);
-      assertTrue(!!cancelButton);
-      assertEquals(invalid, doneButton.disabled);
-      assertTrue(!cancelButton.disabled);
-
-      // Verify A11y labels and descriptions.
+    flushAsync();
+    const policyIndicator = page.$$('#editHostnamePolicyIndicator');
+    if (deviceNameState === DeviceNameState.CAN_BE_MODIFIED) {
+      assertFalse(!!policyIndicator);
+    } else if (
+        deviceNameState ===
+        DeviceNameState.CANNOT_BE_MODIFIED_BECAUSE_OF_POLICIES) {
+      assertTrue(!!policyIndicator);
       assertEquals(
-          inputBox.ariaLabel, dialog.i18n('aboutDeviceNameInputA11yLabel'));
-      assertEquals(
-          inputBox.ariaDescription,
-          dialog.i18n('aboutDeviceNameConstraintsA11yDescription'));
-      assertEquals(
-          doneButton.ariaLabel,
-          dialog.i18n('aboutDeviceNameDoneBtnA11yLabel', value));
+          CrPolicyIndicatorType.DEVICE_POLICY, policyIndicator.indicatorType);
+    } else if (
+        deviceNameState ===
+        DeviceNameState.CANNOT_BE_MODIFIED_BECAUSE_NOT_DEVICE_OWNER) {
+      assertTrue(!!policyIndicator);
+      assertEquals(CrPolicyIndicatorType.OWNER, policyIndicator.indicatorType);
     }
+  }
 
-    test('CheckInputSanitizationAndValidity', async function() {
-      loadTimeData.overrideValues({
-        isHostnameSettingEnabled: true,
-      });
-
-      dialog = document.createElement('edit-hostname-dialog');
-      document.body.appendChild(dialog);
-      const inputBox = dialog.$$('#deviceName');
-      assertTrue(!!inputBox);
-
-      // Test empty name, which is the value on opening dialog.
-      assertInput(
-          /*value=*/ '', /*invalid=*/ true, /*valueLength=*/ '0');
-
-      // Test name with no emojis, under character limit.
-      inputBox.value = '123456789';
-      assertInput(
-          /*value=*/ '123456789', /*invalid=*/ false,
-          /*valueLength=*/ '9');
-
-      // Test name with emojis, under character limit.
-      inputBox.value = '1234🦤56789🧟';
-      assertInput(
-          /*value=*/ '123456789', /*invalid=*/ false,
-          /*valueLength=*/ '9');
-
-      // Test name with only emojis, under character limit.
-      inputBox.value = '🦤🦤🦤🦤🦤';
-      assertInput(
-          /*value=*/ '', /*invalid=*/ true, /*valueLength=*/ '0');
-
-      // Test name with no emojis, at character limit.
-      inputBox.value = '123456789012345';
-      assertInput(
-          /*value=*/ '123456789012345', /*invalid=*/ false,
-          /*valueLength=*/ '15');
-
-      // Test name with emojis, at character limit.
-      inputBox.value = '123456789012345🧟';
-      assertInput(
-          /*value=*/ '123456789012345', /*invalid=*/ false,
-          /*valueLength=*/ '15');
-
-      // Test name with only emojis, at character limit.
-      inputBox.value =
-          '🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤';
-      assertInput(
-          /*value=*/ '', /*invalid=*/ true, /*valueLength=*/ '0');
-
-      // Test name with no emojis, above character limit.
-      inputBox.value = '1234567890123456';
-      assertInput(
-          /*value=*/ '123456789012345', /*invalid=*/ true,
-          /*valueLength=*/ '15');
-
-      // Make sure input is not invalid once its value changes to a string below
-      // the character limit. (Simulates the user pressing backspace once
-      // they've reached the limit).
-      inputBox.value = '12345678901234';
-      assertInput(
-          /*value=*/ '12345678901234', /*invalid=*/ false,
-          /*valueLength=*/ '14');
-
-      // Test name with emojis, above character limit.
-      inputBox.value = '123456789012345🧟';
-      assertInput(
-          /*value=*/ '123456789012345', /*invalid=*/ false,
-          /*valueLength=*/ '15');
-
-      // Test name with only emojis, above character limit.
-      inputBox.value =
-          '🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤';
-      assertInput(
-          /*value=*/ '', /*invalid=*/ true, /*valueLength=*/ '0');
-
-      // Test invalid name because of empty space character.
-      inputBox.value = 'Device Name';
-      assertInput(
-          /*value=*/ 'Device Name', /*invalid=*/ true, /*valueLength=*/ '11');
-
-      // Test invalid name because of special characters.
-      inputBox.value = 'Device&(#@!';
-      assertInput(
-          /*value=*/ 'Device&(#@!', /*invalid=*/ true, /*valueLength=*/ '11');
-
-      // Test valid name with letters and numbers.
-      inputBox.value = 'Device123';
-      assertInput(
-          /*value=*/ 'Device123', /*invalid=*/ false, /*valueLength=*/ '9');
-
-      // Test valid name with letters and numbers and hyphens.
-      inputBox.value = '-Device1-';
-      assertInput(
-          /*value=*/ '-Device1-', /*invalid=*/ false, /*valueLength=*/ '9');
+  test('DeviceNameMetadata', async () => {
+    loadTimeData.overrideValues({
+      isHostnameSettingEnabled: true,
     });
 
-    test('SetDeviceName', async () => {
-      loadTimeData.overrideValues({
-        isHostnameSettingEnabled: true,
-      });
+    page = document.createElement('settings-detailed-build-info');
+    document.body.appendChild(page);
 
-      dialog = document.createElement('edit-hostname-dialog');
-      document.body.appendChild(dialog);
+    await deviceNameBrowserProxy.whenCalled('notifyReadyForDeviceName');
+    checkDeviceNameMetadata('TestDeviceName1', DeviceNameState.CAN_BE_MODIFIED);
 
-      deviceNameBrowserProxy.setDeviceNameResult(
-          SetDeviceNameResult.UPDATE_SUCCESSFUL);
-      dialog.$$('#deviceName').value = 'TestName';
-      dialog.$$('#done').click();
-      flush();
+    // Verify that we can still make changes to device name metadata even
+    // if notifyReadyForDeviceName() is not called again.
+    checkDeviceNameMetadata(
+        'TestDeviceName2',
+        DeviceNameState.CANNOT_BE_MODIFIED_BECAUSE_OF_POLICIES);
+    checkDeviceNameMetadata(
+        'TestDeviceName3',
+        DeviceNameState.CANNOT_BE_MODIFIED_BECAUSE_NOT_DEVICE_OWNER);
+  });
+});
 
-      await deviceNameBrowserProxy.whenCalled('attemptSetDeviceName');
-      assertEquals(deviceNameBrowserProxy.getDeviceName(), 'TestName');
-      assertFalse(dialog.$.dialog.open);
-    });
+suite('EditHostnameDialogTest', function() {
+  let dialog = null;
+  let deviceNameBrowserProxy = null;
+
+  setup(function() {
+    deviceNameBrowserProxy = new TestDeviceNameBrowserProxy();
+    DeviceNameBrowserProxyImpl.instance_ = deviceNameBrowserProxy;
+    PolymerTest.clearBody();
   });
 
-  suite('ChannelSwitcherDialogTest', function() {
-    let dialog = null;
-    let radioButtons = null;
-    let browserProxy = null;
-    let currentChannel;
-
-    setup(function() {
-      currentChannel = BrowserChannel.BETA;
-      browserProxy = new TestAboutPageBrowserProxyChromeOS();
-      browserProxy.setChannels(currentChannel, currentChannel);
-      AboutPageBrowserProxyImpl.instance_ = browserProxy;
-      PolymerTest.clearBody();
-      dialog = document.createElement('settings-channel-switcher-dialog');
-      document.body.appendChild(dialog);
-
-      radioButtons = dialog.shadowRoot.querySelectorAll('cr-radio-button');
-      assertEquals(3, radioButtons.length);
-      return browserProxy.whenCalled('getChannelInfo');
-    });
-
-    teardown(function() {
-      dialog.remove();
-    });
-
-    test('Initialization', function() {
-      const radioGroup = dialog.$$('cr-radio-group');
-      assertTrue(!!radioGroup);
-      assertTrue(!!dialog.$.warningSelector);
-      assertTrue(!!dialog.$.changeChannel);
-      assertTrue(!!dialog.$.changeChannelAndPowerwash);
-
-      // Check that upon initialization the radio button corresponding to
-      // the current release channel is pre-selected.
-      assertEquals(currentChannel, radioGroup.selected);
-      assertEquals(dialog.$.warningSelector.selected, -1);
-
-      // Check that action buttons are hidden when current and target
-      // channel are the same.
-      assertTrue(dialog.$.changeChannel.hidden);
-      assertTrue(dialog.$.changeChannelAndPowerwash.hidden);
-    });
-
-    // Test case where user switches to a less stable channel.
-    test('ChangeChannel_LessStable', async () => {
-      assertEquals(BrowserChannel.DEV, radioButtons.item(2).name);
-      radioButtons.item(2).click();
-      flush();
-
-      await browserProxy.whenCalled('getChannelInfo');
-      assertEquals(dialog.$.warningSelector.selected, 2);
-      // Check that only the "Change channel" button becomes visible.
-      assertTrue(dialog.$.changeChannelAndPowerwash.hidden);
-      assertFalse(dialog.$.changeChannel.hidden);
-
-      const whenTargetChannelChangedFired =
-          eventToPromise('target-channel-changed', dialog);
-
-      dialog.$.changeChannel.click();
-      const [channel, isPowerwashAllowed] =
-          await browserProxy.whenCalled('setChannel');
-      assertEquals(BrowserChannel.DEV, channel);
-      assertFalse(isPowerwashAllowed);
-      const {detail} = await whenTargetChannelChangedFired;
-      assertEquals(BrowserChannel.DEV, detail);
-    });
-
-    // Test case where user switches to a more stable channel.
-    test('ChangeChannel_MoreStable', async () => {
-      assertEquals(BrowserChannel.STABLE, radioButtons.item(0).name);
-      radioButtons.item(0).click();
-      flush();
-
-      await browserProxy.whenCalled('getChannelInfo');
-      assertEquals(dialog.$.warningSelector.selected, 1);
-      // Check that only the "Change channel and Powerwash" button becomes
-      // visible.
-      assertFalse(dialog.$.changeChannelAndPowerwash.hidden);
-      assertTrue(dialog.$.changeChannel.hidden);
-
-      const whenTargetChannelChangedFired =
-          eventToPromise('target-channel-changed', dialog);
-
-      dialog.$.changeChannelAndPowerwash.click();
-      const [channel, isPowerwashAllowed] =
-          await browserProxy.whenCalled('setChannel');
-      assertEquals(BrowserChannel.STABLE, channel);
-      assertTrue(isPowerwashAllowed);
-      const {detail} = await whenTargetChannelChangedFired;
-      assertEquals(BrowserChannel.STABLE, detail);
-    });
+  teardown(function() {
+    dialog.remove();
+    dialog = null;
+    Router.getInstance().resetRouteForTesting();
   });
 
-  suite('AboutPageTest_OfficialBuild', function() {
-    let page = null;
-    let browserProxy = null;
+  function flushAsync() {
+    flush();
+    // Use setTimeout to wait for the next macrotask.
+    return new Promise(resolve => setTimeout(resolve));
+  }
 
-    setup(function() {
-      browserProxy = new TestAboutPageBrowserProxyChromeOS();
-      AboutPageBrowserProxyImpl.instance_ = browserProxy;
-      PolymerTest.clearBody();
-      page = document.createElement('os-settings-about-page');
-      document.body.appendChild(page);
+  test('OpenAndCloseDialog', async () => {
+    loadTimeData.overrideValues({
+      isHostnameSettingEnabled: true,
     });
 
-    teardown(function() {
-      page.remove();
-      page = null;
-      Router.getInstance().resetRouteForTesting();
-    });
+    const page = document.createElement('settings-detailed-build-info');
+    document.body.appendChild(page);
 
-    test('ReportAnIssue', function() {
-      assertTrue(!!page.$.reportIssue);
-      page.$.reportIssue.click();
-      return browserProxy.whenCalled('openFeedbackDialog');
-    });
+    await deviceNameBrowserProxy.whenCalled('notifyReadyForDeviceName');
+    const editHostnameButton = page.$$('#editHostnameButton');
+    assertTrue(!!editHostnameButton);
+    editHostnameButton.click();
+    flush();
 
-    test('Deep link to report an issue', async () => {
-      loadTimeData.overrideValues({
-        isDeepLinkingEnabled: true,
-      });
+    dialog = page.$$('edit-hostname-dialog');
+    assertTrue(!!dialog);
+    assertTrue(dialog.$.dialog.open);
 
-      const params = new URLSearchParams();
-      params.append('settingId', '1705');
-      Router.getInstance().navigateTo(
-          routes.ABOUT_ABOUT, params);
-
-      flush();
-
-      const deepLinkElement =
-          page.$$('#reportIssue').shadowRoot.querySelector('cr-icon-button');
-      await waitAfterNextRender(deepLinkElement);
-      assertEquals(
-          deepLinkElement, getDeepActiveElement(),
-          'Report an issue button should be focused for settingId=1705.');
-    });
-
-    test('Deep link to terms of service', async () => {
-      loadTimeData.overrideValues({
-        isDeepLinkingEnabled: true,
-      });
-
-      const params = new URLSearchParams();
-      params.append('settingId', '1706');
-      Router.getInstance().navigateTo(
-          routes.ABOUT_ABOUT, params);
-
-      flush();
-
-      const deepLinkElement = page.$$('#aboutProductTos');
-      await waitAfterNextRender(deepLinkElement);
-      assertEquals(
-          deepLinkElement, getDeepActiveElement(),
-          'Terms of service link should be focused for settingId=1706.');
-    });
+    dialog.$$('#cancel').click();
+    flush();
+    assertFalse(dialog.$.dialog.open);
   });
+
+  /**
+   * @param {string} value The value of the input
+   * @param {boolean} invalid If the input is invalid or not
+   * @param {string} inputCount The length of value in string format
+   */
+  function assertInput(value, invalid, valueLength) {
+    const inputBox = dialog.$$('#deviceName');
+    const inputCount = dialog.$$('#inputCount');
+    assertTrue(!!inputBox);
+    assertTrue(!!inputCount);
+
+    assertEquals(inputBox.value, value);
+    assertEquals(inputBox.invalid, invalid);
+    assertEquals(inputCount.textContent.trim(), valueLength + '/15');
+
+    // Done button should be disabled when input is invalid and cancel button
+    // should be always enabled.
+    const doneButton = dialog.$$('#done');
+    const cancelButton = dialog.$$('#cancel');
+    assertTrue(!!doneButton);
+    assertTrue(!!cancelButton);
+    assertEquals(invalid, doneButton.disabled);
+    assertTrue(!cancelButton.disabled);
+
+    // Verify A11y labels and descriptions.
+    assertEquals(
+        inputBox.ariaLabel, dialog.i18n('aboutDeviceNameInputA11yLabel'));
+    assertEquals(
+        inputBox.ariaDescription,
+        dialog.i18n('aboutDeviceNameConstraintsA11yDescription'));
+    assertEquals(
+        doneButton.ariaLabel,
+        dialog.i18n('aboutDeviceNameDoneBtnA11yLabel', value));
+  }
+
+  test('CheckInputSanitizationAndValidity', async function() {
+    loadTimeData.overrideValues({
+      isHostnameSettingEnabled: true,
+    });
+
+    dialog = document.createElement('edit-hostname-dialog');
+    document.body.appendChild(dialog);
+    const inputBox = dialog.$$('#deviceName');
+    assertTrue(!!inputBox);
+
+    // Test empty name, which is the value on opening dialog.
+    assertInput(
+        /*value=*/ '', /*invalid=*/ true, /*valueLength=*/ '0');
+
+    // Test name with no emojis, under character limit.
+    inputBox.value = '123456789';
+    assertInput(
+        /*value=*/ '123456789', /*invalid=*/ false,
+        /*valueLength=*/ '9');
+
+    // Test name with emojis, under character limit.
+    inputBox.value = '1234🦤56789🧟';
+    assertInput(
+        /*value=*/ '123456789', /*invalid=*/ false,
+        /*valueLength=*/ '9');
+
+    // Test name with only emojis, under character limit.
+    inputBox.value = '🦤🦤🦤🦤🦤';
+    assertInput(
+        /*value=*/ '', /*invalid=*/ true, /*valueLength=*/ '0');
+
+    // Test name with no emojis, at character limit.
+    inputBox.value = '123456789012345';
+    assertInput(
+        /*value=*/ '123456789012345', /*invalid=*/ false,
+        /*valueLength=*/ '15');
+
+    // Test name with emojis, at character limit.
+    inputBox.value = '123456789012345🧟';
+    assertInput(
+        /*value=*/ '123456789012345', /*invalid=*/ false,
+        /*valueLength=*/ '15');
+
+    // Test name with only emojis, at character limit.
+    inputBox.value =
+        '🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤';
+    assertInput(
+        /*value=*/ '', /*invalid=*/ true, /*valueLength=*/ '0');
+
+    // Test name with no emojis, above character limit.
+    inputBox.value = '1234567890123456';
+    assertInput(
+        /*value=*/ '123456789012345', /*invalid=*/ true,
+        /*valueLength=*/ '15');
+
+    // Make sure input is not invalid once its value changes to a string below
+    // the character limit. (Simulates the user pressing backspace once
+    // they've reached the limit).
+    inputBox.value = '12345678901234';
+    assertInput(
+        /*value=*/ '12345678901234', /*invalid=*/ false,
+        /*valueLength=*/ '14');
+
+    // Test name with emojis, above character limit.
+    inputBox.value = '123456789012345🧟';
+    assertInput(
+        /*value=*/ '123456789012345', /*invalid=*/ false,
+        /*valueLength=*/ '15');
+
+    // Test name with only emojis, above character limit.
+    inputBox.value =
+        '🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤🦤';
+    assertInput(
+        /*value=*/ '', /*invalid=*/ true, /*valueLength=*/ '0');
+
+    // Test invalid name because of empty space character.
+    inputBox.value = 'Device Name';
+    assertInput(
+        /*value=*/ 'Device Name', /*invalid=*/ true, /*valueLength=*/ '11');
+
+    // Test invalid name because of special characters.
+    inputBox.value = 'Device&(#@!';
+    assertInput(
+        /*value=*/ 'Device&(#@!', /*invalid=*/ true, /*valueLength=*/ '11');
+
+    // Test valid name with letters and numbers.
+    inputBox.value = 'Device123';
+    assertInput(
+        /*value=*/ 'Device123', /*invalid=*/ false, /*valueLength=*/ '9');
+
+    // Test valid name with letters and numbers and hyphens.
+    inputBox.value = '-Device1-';
+    assertInput(
+        /*value=*/ '-Device1-', /*invalid=*/ false, /*valueLength=*/ '9');
+  });
+
+  test('SetDeviceName', async () => {
+    loadTimeData.overrideValues({
+      isHostnameSettingEnabled: true,
+    });
+
+    dialog = document.createElement('edit-hostname-dialog');
+    document.body.appendChild(dialog);
+
+    deviceNameBrowserProxy.setDeviceNameResult(
+        SetDeviceNameResult.UPDATE_SUCCESSFUL);
+    dialog.$$('#deviceName').value = 'TestName';
+    dialog.$$('#done').click();
+    flush();
+
+    await deviceNameBrowserProxy.whenCalled('attemptSetDeviceName');
+    assertEquals(deviceNameBrowserProxy.getDeviceName(), 'TestName');
+    assertFalse(dialog.$.dialog.open);
+  });
+});
+
+suite('ChannelSwitcherDialogTest', function() {
+  let dialog = null;
+  let radioButtons = null;
+  let browserProxy = null;
+  let currentChannel;
+
+  setup(function() {
+    currentChannel = BrowserChannel.BETA;
+    browserProxy = new TestAboutPageBrowserProxyChromeOS();
+    browserProxy.setChannels(currentChannel, currentChannel);
+    AboutPageBrowserProxyImpl.instance_ = browserProxy;
+    PolymerTest.clearBody();
+    dialog = document.createElement('settings-channel-switcher-dialog');
+    document.body.appendChild(dialog);
+
+    radioButtons = dialog.shadowRoot.querySelectorAll('cr-radio-button');
+    assertEquals(3, radioButtons.length);
+    return browserProxy.whenCalled('getChannelInfo');
+  });
+
+  teardown(function() {
+    dialog.remove();
+  });
+
+  test('Initialization', function() {
+    const radioGroup = dialog.$$('cr-radio-group');
+    assertTrue(!!radioGroup);
+    assertTrue(!!dialog.$.warningSelector);
+    assertTrue(!!dialog.$.changeChannel);
+    assertTrue(!!dialog.$.changeChannelAndPowerwash);
+
+    // Check that upon initialization the radio button corresponding to
+    // the current release channel is pre-selected.
+    assertEquals(currentChannel, radioGroup.selected);
+    assertEquals(dialog.$.warningSelector.selected, -1);
+
+    // Check that action buttons are hidden when current and target
+    // channel are the same.
+    assertTrue(dialog.$.changeChannel.hidden);
+    assertTrue(dialog.$.changeChannelAndPowerwash.hidden);
+  });
+
+  // Test case where user switches to a less stable channel.
+  test('ChangeChannel_LessStable', async () => {
+    assertEquals(BrowserChannel.DEV, radioButtons.item(2).name);
+    radioButtons.item(2).click();
+    flush();
+
+    await browserProxy.whenCalled('getChannelInfo');
+    assertEquals(dialog.$.warningSelector.selected, 2);
+    // Check that only the "Change channel" button becomes visible.
+    assertTrue(dialog.$.changeChannelAndPowerwash.hidden);
+    assertFalse(dialog.$.changeChannel.hidden);
+
+    const whenTargetChannelChangedFired =
+        eventToPromise('target-channel-changed', dialog);
+
+    dialog.$.changeChannel.click();
+    const [channel, isPowerwashAllowed] =
+        await browserProxy.whenCalled('setChannel');
+    assertEquals(BrowserChannel.DEV, channel);
+    assertFalse(isPowerwashAllowed);
+    const {detail} = await whenTargetChannelChangedFired;
+    assertEquals(BrowserChannel.DEV, detail);
+  });
+
+  // Test case where user switches to a more stable channel.
+  test('ChangeChannel_MoreStable', async () => {
+    assertEquals(BrowserChannel.STABLE, radioButtons.item(0).name);
+    radioButtons.item(0).click();
+    flush();
+
+    await browserProxy.whenCalled('getChannelInfo');
+    assertEquals(dialog.$.warningSelector.selected, 1);
+    // Check that only the "Change channel and Powerwash" button becomes
+    // visible.
+    assertFalse(dialog.$.changeChannelAndPowerwash.hidden);
+    assertTrue(dialog.$.changeChannel.hidden);
+
+    const whenTargetChannelChangedFired =
+        eventToPromise('target-channel-changed', dialog);
+
+    dialog.$.changeChannelAndPowerwash.click();
+    const [channel, isPowerwashAllowed] =
+        await browserProxy.whenCalled('setChannel');
+    assertEquals(BrowserChannel.STABLE, channel);
+    assertTrue(isPowerwashAllowed);
+    const {detail} = await whenTargetChannelChangedFired;
+    assertEquals(BrowserChannel.STABLE, detail);
+  });
+});
+
+suite('AboutPageTest_OfficialBuild', function() {
+  let page = null;
+  let browserProxy = null;
+
+  setup(function() {
+    browserProxy = new TestAboutPageBrowserProxyChromeOS();
+    AboutPageBrowserProxyImpl.instance_ = browserProxy;
+    PolymerTest.clearBody();
+    page = document.createElement('os-settings-about-page');
+    document.body.appendChild(page);
+  });
+
+  teardown(function() {
+    page.remove();
+    page = null;
+    Router.getInstance().resetRouteForTesting();
+  });
+
+  test('ReportAnIssue', function() {
+    assertTrue(!!page.$.reportIssue);
+    page.$.reportIssue.click();
+    return browserProxy.whenCalled('openFeedbackDialog');
+  });
+
+  test('Deep link to report an issue', async () => {
+    loadTimeData.overrideValues({
+      isDeepLinkingEnabled: true,
+    });
+
+    const params = new URLSearchParams();
+    params.append('settingId', '1705');
+    Router.getInstance().navigateTo(routes.ABOUT_ABOUT, params);
+
+    flush();
+
+    const deepLinkElement =
+        page.$$('#reportIssue').shadowRoot.querySelector('cr-icon-button');
+    await waitAfterNextRender(deepLinkElement);
+    assertEquals(
+        deepLinkElement, getDeepActiveElement(),
+        'Report an issue button should be focused for settingId=1705.');
+  });
+
+  test('Deep link to terms of service', async () => {
+    loadTimeData.overrideValues({
+      isDeepLinkingEnabled: true,
+    });
+
+    const params = new URLSearchParams();
+    params.append('settingId', '1706');
+    Router.getInstance().navigateTo(routes.ABOUT_ABOUT, params);
+
+    flush();
+
+    const deepLinkElement = page.$$('#aboutProductTos');
+    await waitAfterNextRender(deepLinkElement);
+    assertEquals(
+        deepLinkElement, getDeepActiveElement(),
+        'Terms of service link should be focused for settingId=1706.');
+  });
+});
diff --git a/chrome/test/data/webui/settings/chromeos/os_printing_page_tests.js b/chrome/test/data/webui/settings/chromeos/os_printing_page_tests.js
index 095472631..9fc44d2 100644
--- a/chrome/test/data/webui/settings/chromeos/os_printing_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_printing_page_tests.js
@@ -2,16 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// clang-format off
-// #import 'chrome://os-settings/chromeos/lazy_load.js';
+import 'chrome://os-settings/chromeos/lazy_load.js';
 
-// #import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-// #import {flush} from'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-// #import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
-// #import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-// #import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
-// #import {flushTasks, waitAfterNextRender} from 'chrome://test/test_util.js';
-// clang-format on
+import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
+import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {flushTasks, waitAfterNextRender} from 'chrome://test/test_util.js';
+
+import {assertEquals, assertTrue} from '../../chai_assert.js';
 
 suite('PrintingPageTests', function() {
   /** @type {SettingsPrintingPageElement} */
@@ -23,7 +21,7 @@
 
   teardown(function() {
     printingPage.remove();
-    settings.Router.getInstance().resetRouteForTesting();
+    Router.getInstance().resetRouteForTesting();
   });
 
   /**
@@ -35,21 +33,20 @@
         document.createElement('os-settings-printing-page'));
     assertTrue(!!printingPage);
     document.body.appendChild(printingPage);
-    return test_util.flushTasks();
+    return flushTasks();
   }
 
   test('Deep link to print jobs', async () => {
     await initializePrintingPage();
     const params = new URLSearchParams();
     params.append('settingId', '1402');
-    settings.Router.getInstance().navigateTo(
-        settings.routes.OS_PRINTING, params);
+    Router.getInstance().navigateTo(routes.OS_PRINTING, params);
 
-    Polymer.dom.flush();
+    flush();
 
     const deepLinkElement = printingPage.$$('#printManagement')
                                 .shadowRoot.querySelector('cr-icon-button');
-    await test_util.waitAfterNextRender(deepLinkElement);
+    await waitAfterNextRender(deepLinkElement);
     assertEquals(
         deepLinkElement, getDeepActiveElement(),
         'Print jobs button should be focused for settingId=1402.');
@@ -60,14 +57,13 @@
 
     const params = new URLSearchParams();
     params.append('settingId', '1403');
-    settings.Router.getInstance().navigateTo(
-        settings.routes.OS_PRINTING, params);
+    Router.getInstance().navigateTo(routes.OS_PRINTING, params);
 
-    Polymer.dom.flush();
+    flush();
 
     const deepLinkElement = printingPage.$$('#scanningApp')
                                 .shadowRoot.querySelector('cr-icon-button');
-    await test_util.waitAfterNextRender(deepLinkElement);
+    await waitAfterNextRender(deepLinkElement);
     assertEquals(
         deepLinkElement, getDeepActiveElement(),
         'Scanning app button should be focused for settingId=1403.');
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
index 7d0383b7..bb2d7d34 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
@@ -37,7 +37,7 @@
 var OSSettingsDevicePageV3Test = class extends OSSettingsV3BrowserTest {
   /** @override */
   get browsePreload() {
-    return 'chrome://os-settings/test_loader.html?module=settings/chromeos/device_page_tests.m.js';
+    return 'chrome://os-settings/test_loader.html?module=settings/chromeos/device_page_tests.js';
   }
 
   /** @override */
@@ -99,26 +99,6 @@
     'OSSettingsPeoplePageAccountManagerWithArcAccountRestrictionsEnabledV3Test',
     'All', () => mocha.run());
 
-var OSSettingsDevicePageKeyboardArrangementDisabledV3Test =
-    class extends OSSettingsV3BrowserTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://os-settings/test_loader.html?module=settings/chromeos/device_page_tests.m.js';
-  }
-
-  /** @override */
-  get featureList() {
-    return {
-      enabled: super.featureList.enabled,
-      disabled: ['ash::features::kKeyboardBasedDisplayArrangementInSettings']
-    };
-  }
-};
-
-TEST_F(
-    'OSSettingsDevicePageKeyboardArrangementDisabledV3Test', 'All',
-    () => mocha.grep('/.*arrow_key_arrangement_disabled.*/').run());
-
 var OSSettingsNearbyShareSubPageV3Test = class extends OSSettingsV3BrowserTest {
   /** @override */
   get browsePreload() {
@@ -388,10 +368,10 @@
    'DictationChangeLanguageLocaleDialogTest',
    'change_dictation_locale_dialog_test.js'
  ],
- ['CupsPrinterEntry', 'cups_printer_entry_tests.m.js'],
- ['CupsPrinterLandingPage', 'cups_printer_landing_page_tests.m.js'],
+ ['CupsPrinterEntry', 'cups_printer_entry_tests.js'],
+ ['CupsPrinterLandingPage', 'cups_printer_landing_page_tests.js'],
  // TODO(crbug/1240970): Re-enable once flakiness is fixed.
- // ['CupsPrinterPage', 'cups_printer_page_tests.m.js'],
+ // ['CupsPrinterPage', 'cups_printer_page_tests.js'],
  ['DarkModeSubpage', 'dark_mode_subpage_tests.js'],
  ['DateTimePage', 'date_time_page_tests.js'],
  ['EsimInstallErrorDialog', 'esim_install_error_dialog_test.js'],
@@ -475,7 +455,7 @@
    'quick_unlock_authenticate_browsertest_chromeos.m.js'
  ],
  ['PersonalizationPage', 'personalization_page_test.js'],
- ['PrintingPage', 'os_printing_page_tests.m.js'],
+ ['PrintingPage', 'os_printing_page_tests.js'],
  ['PrivacyPage', 'os_privacy_page_test.m.js'],
  ['ResetPage', 'os_reset_page_test.m.js'],
  ['SettingsSchedulerSlider', 'settings_scheduler_slider_test.m.js'],
diff --git a/chrome/test/data/webui/settings/chromeos/test_cups_printers_browser_proxy.js b/chrome/test/data/webui/settings/chromeos/test_cups_printers_browser_proxy.js
index a11e35d..d03c91e 100644
--- a/chrome/test/data/webui/settings/chromeos/test_cups_printers_browser_proxy.js
+++ b/chrome/test/data/webui/settings/chromeos/test_cups_printers_browser_proxy.js
@@ -2,199 +2,190 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// clang-format off
-// #import {TestBrowserProxy} from '../../test_browser_proxy.js';
-// #import {CupsPrintersBrowserProxy,PrinterSetupResult,PrintServerResult} from 'chrome://os-settings/chromeos/lazy_load.js';
-// clang-format on
+import {CupsPrintersBrowserProxy, PrinterSetupResult, PrintServerResult} from 'chrome://os-settings/chromeos/lazy_load.js';
 
-cr.define('printerBrowserProxy', function() {
-  /** @implements {settings.CupsPrintersBrowserProxy} */
-  /* #export */ class TestCupsPrintersBrowserProxy extends TestBrowserProxy {
-    constructor() {
-      super([
-        'addCupsPrinter',
-        'addDiscoveredPrinter',
-        'getCupsSavedPrintersList',
-        'getCupsEnterprisePrintersList',
-        'getCupsPrinterManufacturersList',
-        'getCupsPrinterModelsList',
-        'getPrinterInfo',
-        'getPrinterPpdManufacturerAndModel',
-        'queryPrintServer',
-        'startDiscoveringPrinters',
-        'stopDiscoveringPrinters',
-        'cancelPrinterSetUp',
-        'updateCupsPrinter',
-        'removeCupsPrinter',
-        'reconfigureCupsPrinter',
-        'getEulaUrl',
-      ]);
+import {TestBrowserProxy} from '../../test_browser_proxy.js';
 
-      this.printerList = /** @type{?CupsPrintersList} */ ({printerList: []});
-      this.printServerPrinters =
-          /** @type{?CupsPrintersList}  */ ({printerList: []});
-      this.manufacturers =
-          /** @type{?ManufacturersInfo} */ (
-              {success: false, manufacturers: []});
-      this.models =
-          /** @type{?ModelsInfo} */ ({success: false, models: []});
-      this.printerInfo = {};
-      this.printerPpdMakeModel =
-          /** @type{PrinterPpdMakeModel */ (
-              {ppdManufacturer: '', ppdModel: ''});
+/** @implements {CupsPrintersBrowserProxy} */
+export class TestCupsPrintersBrowserProxy extends TestBrowserProxy {
+  constructor() {
+    super([
+      'addCupsPrinter',
+      'addDiscoveredPrinter',
+      'getCupsSavedPrintersList',
+      'getCupsEnterprisePrintersList',
+      'getCupsPrinterManufacturersList',
+      'getCupsPrinterModelsList',
+      'getPrinterInfo',
+      'getPrinterPpdManufacturerAndModel',
+      'queryPrintServer',
+      'startDiscoveringPrinters',
+      'stopDiscoveringPrinters',
+      'cancelPrinterSetUp',
+      'updateCupsPrinter',
+      'removeCupsPrinter',
+      'reconfigureCupsPrinter',
+      'getEulaUrl',
+    ]);
 
-      /**
-       * |eulaUrl_| in conjunction with |setEulaUrl| mimics setting the EULA url
-       * for a printer.
-       * @private {string}
-       */
-      this.eulaUrl_ = '';
+    this.printerList = /** @type{?CupsPrintersList} */ ({printerList: []});
+    this.printServerPrinters =
+        /** @type{?CupsPrintersList}  */ ({printerList: []});
+    this.manufacturers =
+        /** @type{?ManufacturersInfo} */ ({success: false, manufacturers: []});
+    this.models =
+        /** @type{?ModelsInfo} */ ({success: false, models: []});
+    this.printerInfo = {};
+    this.printerPpdMakeModel =
+        /** @type{PrinterPpdMakeModel */ ({ppdManufacturer: '', ppdModel: ''});
 
-      /**
-       * If set, 'getPrinterInfo' will fail and the promise will be reject with
-       * this PrinterSetupResult.
-       * @private {PrinterSetupResult}
-       */
-      this.getPrinterInfoResult_ = null;
+    /**
+     * |eulaUrl_| in conjunction with |setEulaUrl| mimics setting the EULA url
+     * for a printer.
+     * @private {string}
+     */
+    this.eulaUrl_ = '';
 
-      /**
-       * Contains the result code from querying a print server.
-       * @private {PrintServerResult}
-       */
-      this.queryPrintServerResult_ = null;
+    /**
+     * If set, 'getPrinterInfo' will fail and the promise will be reject with
+     * this PrinterSetupResult.
+     * @private {PrinterSetupResult}
+     */
+    this.getPrinterInfoResult_ = null;
 
-      /**
-       * If set, 'addDiscoveredPrinter' will fail and the promise will be
-       * rejected with this printer.
-       * @private {CupsPrinterInfo}
-       */
-      this.addDiscoveredFailedPrinter_ = null;
-    }
+    /**
+     * Contains the result code from querying a print server.
+     * @private {PrintServerResult}
+     */
+    this.queryPrintServerResult_ = null;
 
-    /** @override */
-    addCupsPrinter(newPrinter) {
-      this.methodCalled('addCupsPrinter', newPrinter);
-      return Promise.resolve(PrinterSetupResult.SUCCESS);
-    }
-
-    /** @override */
-    addDiscoveredPrinter(printerId) {
-      this.methodCalled('addDiscoveredPrinter', printerId);
-      if (this.addDiscoveredFailedPrinter_ != null) {
-        return Promise.reject(this.addDiscoveredFailedPrinter_);
-      }
-      return Promise.resolve(PrinterSetupResult.SUCCESS);
-    }
-
-    /** @override */
-    getCupsSavedPrintersList() {
-      this.methodCalled('getCupsSavedPrintersList');
-      return Promise.resolve(this.printerList);
-    }
-
-    /** @override */
-    getCupsEnterprisePrintersList() {
-      this.methodCalled('getCupsEnterprisePrintersList');
-      return Promise.resolve(this.printerList);
-    }
-
-    /** @override */
-    getCupsPrinterManufacturersList() {
-      this.methodCalled('getCupsPrinterManufacturersList');
-      return Promise.resolve(this.manufacturers);
-    }
-
-    /** @override */
-    getCupsPrinterModelsList(manufacturer) {
-      this.methodCalled('getCupsPrinterModelsList', manufacturer);
-      return Promise.resolve(this.models);
-    }
-
-    /** @override */
-    getPrinterInfo(newPrinter) {
-      this.methodCalled('getPrinterInfo', newPrinter);
-      if (this.getPrinterInfoResult_ != null) {
-        return Promise.reject(this.getPrinterInfoResult_);
-      }
-      return Promise.resolve(this.printerInfo);
-    }
-
-    /** @override */
-    startDiscoveringPrinters() {
-      this.methodCalled('startDiscoveringPrinters');
-    }
-
-    /** @override */
-    stopDiscoveringPrinters() {
-      this.methodCalled('stopDiscoveringPrinters');
-    }
-
-    /** @override */
-    cancelPrinterSetUp(newPrinter) {
-      this.methodCalled('cancelPrinterSetUp', newPrinter);
-    }
-
-    /** @override */
-    updateCupsPrinter(printerId, printerName) {
-      this.methodCalled('updateCupsPrinter', [printerId, printerName]);
-      return Promise.resolve(PrinterSetupResult.EDIT_SUCCESS);
-    }
-
-    /** @override */
-    removeCupsPrinter(printerId, printerName) {
-      this.methodCalled('removeCupsPrinter', [printerId, printerName]);
-    }
-
-    /** @override */
-    getPrinterPpdManufacturerAndModel(printerId) {
-      this.methodCalled('getPrinterPpdManufacturerAndModel', printerId);
-      return Promise.resolve(this.printerPpdMakeModel);
-    }
-
-    /** @override */
-    reconfigureCupsPrinter(printer) {
-      this.methodCalled('reconfigureCupsPrinter', printer);
-      return Promise.resolve(PrinterSetupResult.EDIT_SUCCESS);
-    }
-
-    /** @override */
-    getEulaUrl(ppdManufacturer, ppdModel) {
-      this.methodCalled('getEulaUrl', [ppdManufacturer, ppdModel]);
-      return Promise.resolve(this.eulaUrl_);
-    }
-
-    /** @override */
-    queryPrintServer(serverUrl) {
-      this.methodCalled('queryPrintServer', serverUrl);
-      if (this.queryPrintServerResult_ !== PrintServerResult.NO_ERRORS) {
-        return Promise.reject(this.queryPrintServerResult_);
-      }
-      return Promise.resolve(this.printServerPrinters);
-    }
-
-
-    /** @param {string} eulaUrl */
-    setEulaUrl(eulaUrl) {
-      this.eulaUrl_ = eulaUrl;
-    }
-
-    /** @param {PrinterSetupResult} result */
-    setGetPrinterInfoResult(result) {
-      this.getPrinterInfoResult_ = result;
-    }
-
-    /** @param {PrintServerResult} result */
-    setQueryPrintServerResult(result) {
-      this.queryPrintServerResult_ = result;
-    }
-
-    /** @param {!CupsPrinterInfo} printer */
-    setAddDiscoveredPrinterFailure(printer) {
-      this.addDiscoveredFailedPrinter_ = printer;
-    }
+    /**
+     * If set, 'addDiscoveredPrinter' will fail and the promise will be
+     * rejected with this printer.
+     * @private {CupsPrinterInfo}
+     */
+    this.addDiscoveredFailedPrinter_ = null;
   }
-  // #cr_define_end
-  return {
-    TestCupsPrintersBrowserProxy: TestCupsPrintersBrowserProxy,
-  };
-});
+
+  /** @override */
+  addCupsPrinter(newPrinter) {
+    this.methodCalled('addCupsPrinter', newPrinter);
+    return Promise.resolve(PrinterSetupResult.SUCCESS);
+  }
+
+  /** @override */
+  addDiscoveredPrinter(printerId) {
+    this.methodCalled('addDiscoveredPrinter', printerId);
+    if (this.addDiscoveredFailedPrinter_ != null) {
+      return Promise.reject(this.addDiscoveredFailedPrinter_);
+    }
+    return Promise.resolve(PrinterSetupResult.SUCCESS);
+  }
+
+  /** @override */
+  getCupsSavedPrintersList() {
+    this.methodCalled('getCupsSavedPrintersList');
+    return Promise.resolve(this.printerList);
+  }
+
+  /** @override */
+  getCupsEnterprisePrintersList() {
+    this.methodCalled('getCupsEnterprisePrintersList');
+    return Promise.resolve(this.printerList);
+  }
+
+  /** @override */
+  getCupsPrinterManufacturersList() {
+    this.methodCalled('getCupsPrinterManufacturersList');
+    return Promise.resolve(this.manufacturers);
+  }
+
+  /** @override */
+  getCupsPrinterModelsList(manufacturer) {
+    this.methodCalled('getCupsPrinterModelsList', manufacturer);
+    return Promise.resolve(this.models);
+  }
+
+  /** @override */
+  getPrinterInfo(newPrinter) {
+    this.methodCalled('getPrinterInfo', newPrinter);
+    if (this.getPrinterInfoResult_ != null) {
+      return Promise.reject(this.getPrinterInfoResult_);
+    }
+    return Promise.resolve(this.printerInfo);
+  }
+
+  /** @override */
+  startDiscoveringPrinters() {
+    this.methodCalled('startDiscoveringPrinters');
+  }
+
+  /** @override */
+  stopDiscoveringPrinters() {
+    this.methodCalled('stopDiscoveringPrinters');
+  }
+
+  /** @override */
+  cancelPrinterSetUp(newPrinter) {
+    this.methodCalled('cancelPrinterSetUp', newPrinter);
+  }
+
+  /** @override */
+  updateCupsPrinter(printerId, printerName) {
+    this.methodCalled('updateCupsPrinter', [printerId, printerName]);
+    return Promise.resolve(PrinterSetupResult.EDIT_SUCCESS);
+  }
+
+  /** @override */
+  removeCupsPrinter(printerId, printerName) {
+    this.methodCalled('removeCupsPrinter', [printerId, printerName]);
+  }
+
+  /** @override */
+  getPrinterPpdManufacturerAndModel(printerId) {
+    this.methodCalled('getPrinterPpdManufacturerAndModel', printerId);
+    return Promise.resolve(this.printerPpdMakeModel);
+  }
+
+  /** @override */
+  reconfigureCupsPrinter(printer) {
+    this.methodCalled('reconfigureCupsPrinter', printer);
+    return Promise.resolve(PrinterSetupResult.EDIT_SUCCESS);
+  }
+
+  /** @override */
+  getEulaUrl(ppdManufacturer, ppdModel) {
+    this.methodCalled('getEulaUrl', [ppdManufacturer, ppdModel]);
+    return Promise.resolve(this.eulaUrl_);
+  }
+
+  /** @override */
+  queryPrintServer(serverUrl) {
+    this.methodCalled('queryPrintServer', serverUrl);
+    if (this.queryPrintServerResult_ !== PrintServerResult.NO_ERRORS) {
+      return Promise.reject(this.queryPrintServerResult_);
+    }
+    return Promise.resolve(this.printServerPrinters);
+  }
+
+
+  /** @param {string} eulaUrl */
+  setEulaUrl(eulaUrl) {
+    this.eulaUrl_ = eulaUrl;
+  }
+
+  /** @param {PrinterSetupResult} result */
+  setGetPrinterInfoResult(result) {
+    this.getPrinterInfoResult_ = result;
+  }
+
+  /** @param {PrintServerResult} result */
+  setQueryPrintServerResult(result) {
+    this.queryPrintServerResult_ = result;
+  }
+
+  /** @param {!CupsPrinterInfo} printer */
+  setAddDiscoveredPrinterFailure(printer) {
+    this.addDiscoveredFailedPrinter_ = printer;
+  }
+}
diff --git a/chrome/test/data/webui/settings/chromeos/test_device_name_browser_proxy.js b/chrome/test/data/webui/settings/chromeos/test_device_name_browser_proxy.js
index cce96a6..39d81379 100644
--- a/chrome/test/data/webui/settings/chromeos/test_device_name_browser_proxy.js
+++ b/chrome/test/data/webui/settings/chromeos/test_device_name_browser_proxy.js
@@ -2,13 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// clang-format off
-// #import {TestBrowserProxy} from '../../test_browser_proxy.js';
-// #import {SetDeviceNameResult} from 'chrome://os-settings/chromeos/os_settings.js'
-// clang-format on
+import {SetDeviceNameResult} from 'chrome://os-settings/chromeos/os_settings.js';
+
+import {TestBrowserProxy} from '../../test_browser_proxy.js';
 
 /** @implements {DeviceNameBrowserProxy} */
-/* #export */ class TestDeviceNameBrowserProxy extends TestBrowserProxy {
+export class TestDeviceNameBrowserProxy extends TestBrowserProxy {
   constructor() {
     super([
       'notifyReadyForDeviceName',
diff --git a/chromeos/components/quick_answers/BUILD.gn b/chromeos/components/quick_answers/BUILD.gn
index 9d987c34..5d54cf19 100644
--- a/chromeos/components/quick_answers/BUILD.gn
+++ b/chromeos/components/quick_answers/BUILD.gn
@@ -103,6 +103,7 @@
     "//chromeos/services/assistant/public/shared",
     "//chromeos/services/machine_learning/public/cpp:stub",
     "//chromeos/services/machine_learning/public/mojom",
+    "//components/language/core/browser:browser",
     "//components/prefs:prefs",
     "//components/prefs:test_support",
     "//services/data_decoder/public/cpp:test_support",
diff --git a/chromeos/components/quick_answers/public/cpp/quick_answers_state.cc b/chromeos/components/quick_answers/public/cpp/quick_answers_state.cc
index e3eef81..c462ae8 100644
--- a/chromeos/components/quick_answers/public/cpp/quick_answers_state.cc
+++ b/chromeos/components/quick_answers/public/cpp/quick_answers_state.cc
@@ -138,6 +138,10 @@
       language::prefs::kApplicationLocale,
       base::BindRepeating(&QuickAnswersState::OnApplicationLocaleReady,
                           base::Unretained(this)));
+  pref_change_registrar_->Add(
+      language::prefs::kPreferredLanguages,
+      base::BindRepeating(&QuickAnswersState::UpdatePreferredLanguages,
+                          base::Unretained(this)));
 
   UpdateSettingsEnabled();
   UpdateConsentStatus();
@@ -145,6 +149,7 @@
   UpdateTranslationEnabled();
   UpdateUnitConversionEnabled();
   OnApplicationLocaleReady();
+  UpdatePreferredLanguages();
 
   prefs_initialized_ = true;
 
@@ -275,28 +280,46 @@
 void QuickAnswersState::OnApplicationLocaleReady() {
   auto locale = pref_change_registrar_->prefs()->GetString(
       language::prefs::kApplicationLocale);
-  if (application_locale_ == locale) {
+
+  if (locale.empty())
+    return;
+
+  // We should not directly use the pref locale, resolve the generic locale name
+  // to one of the locally defined ones first.
+  std::string resolved_locale;
+  bool resolve_success =
+      l10n_util::CheckAndResolveLocale(locale, &resolved_locale,
+                                       /*perform_io=*/false);
+  DCHECK(resolve_success);
+
+  if (resolved_application_loacle_ == resolved_locale) {
     return;
   }
-  application_locale_ = locale;
+  resolved_application_loacle_ = resolved_locale;
 
   for (auto& observer : observers_) {
-    observer.OnApplicationLocaleReady(locale);
+    observer.OnApplicationLocaleReady(resolved_locale);
   }
 
   UpdateEligibility();
 }
 
+void QuickAnswersState::UpdatePreferredLanguages() {
+  auto preferred_languages = pref_change_registrar_->prefs()->GetString(
+      language::prefs::kPreferredLanguages);
+  if (preferred_languages_ == preferred_languages) {
+    return;
+  }
+  preferred_languages_ = preferred_languages;
+}
+
 void QuickAnswersState::UpdateEligibility() {
   if (!pref_change_registrar_)
     return;
 
-  if (application_locale_.empty())
+  if (resolved_application_loacle_.empty())
     return;
 
-  std::string resolved_locale;
-  l10n_util::CheckAndResolveLocale(application_locale_, &resolved_locale,
-                                   /*perform_io=*/false);
   is_eligible_ = IsQuickAnswersAllowedForLocale(
-      resolved_locale, icu::Locale::getDefault().getName());
+      resolved_application_loacle_, icu::Locale::getDefault().getName());
 }
diff --git a/chromeos/components/quick_answers/public/cpp/quick_answers_state.h b/chromeos/components/quick_answers/public/cpp/quick_answers_state.h
index 45eb5a0..e925d586 100644
--- a/chromeos/components/quick_answers/public/cpp/quick_answers_state.h
+++ b/chromeos/components/quick_answers/public/cpp/quick_answers_state.h
@@ -68,7 +68,12 @@
   bool definition_enabled() const { return definition_enabled_; }
   bool translation_enabled() const { return translation_enabled_; }
   bool unit_conversion_enabled() const { return unit_conversion_enabled_; }
-  const std::string& application_locale() const { return application_locale_; }
+  const std::string& application_locale() const {
+    return resolved_application_loacle_;
+  }
+  const std::string& preferred_languages() const {
+    return preferred_languages_;
+  }
   bool is_eligible() const { return is_eligible_; }
 
   void set_eligibility_for_testing(bool is_eligible) {
@@ -88,6 +93,7 @@
   void UpdateTranslationEnabled();
   void UpdateUnitConversionEnabled();
   void OnApplicationLocaleReady();
+  void UpdatePreferredLanguages();
 
   // Called when the feature eligibility might change.
   void UpdateEligibility();
@@ -108,8 +114,12 @@
   // Whether the Quick Answers unit conversion is enabled.
   bool unit_conversion_enabled_ = true;
 
-  // The application locale.
-  std::string application_locale_;
+  // The resolved application locale.
+  std::string resolved_application_loacle_;
+
+  // The list of preferred languages, separated by comma.
+  // (ex. "en-US,zh,fr").
+  std::string preferred_languages_;
 
   // Whether the Quick Answers feature is eligible. The value is derived from a
   // number of other states.
diff --git a/chromeos/components/quick_answers/quick_answers_model.h b/chromeos/components/quick_answers/quick_answers_model.h
index 1b8f442a..8e41f00 100644
--- a/chromeos/components/quick_answers/quick_answers_model.h
+++ b/chromeos/components/quick_answers/quick_answers_model.h
@@ -156,12 +156,6 @@
 
 // Information of the device that used by the user to send the request.
 struct DeviceProperties {
-  // Device language code.
-  std::string language;
-
-  // List (separated by comma) of user preferred languages.
-  std::string preferred_languages;
-
   // Whether the request is send by an internal user.
   bool is_internal = false;
 };
diff --git a/chromeos/components/quick_answers/test/quick_answers_test_base.cc b/chromeos/components/quick_answers/test/quick_answers_test_base.cc
index 5ba9e0e..85e6c22 100644
--- a/chromeos/components/quick_answers/test/quick_answers_test_base.cc
+++ b/chromeos/components/quick_answers/test/quick_answers_test_base.cc
@@ -4,6 +4,12 @@
 
 #include "chromeos/components/quick_answers/test/quick_answers_test_base.h"
 
+#include "chromeos/components/quick_answers/public/cpp/quick_answers_prefs.h"
+#include "components/language/core/browser/pref_names.h"
+#include "components/prefs/pref_registry_simple.h"
+
+#include "base/logging.h"
+
 QuickAnswersTestBase::QuickAnswersTestBase() = default;
 
 QuickAnswersTestBase::~QuickAnswersTestBase() = default;
@@ -11,11 +17,25 @@
 void QuickAnswersTestBase::SetUp() {
   testing::Test::SetUp();
 
-  if (!QuickAnswersState::Get())
+  // Setup test pref service.
+  test_pref_service_ = std::make_unique<TestingPrefServiceSimple>();
+  // Register profile prefs observed by Quick answers state.
+  auto* registry = test_pref_service_->registry();
+  quick_answers::prefs::RegisterProfilePrefs(registry);
+  registry->RegisterStringPref(language::prefs::kApplicationLocale,
+                               std::string());
+  registry->RegisterStringPref(language::prefs::kPreferredLanguages,
+                               std::string());
+
+  if (!QuickAnswersState::Get()) {
     quick_answers_state_ = std::make_unique<QuickAnswersState>();
+  }
+
+  quick_answers_state_->RegisterPrefChanges(test_pref_service_.get());
 }
 
 void QuickAnswersTestBase::TearDown() {
   quick_answers_state_.reset();
+  test_pref_service_.reset();
   testing::Test::TearDown();
 }
diff --git a/chromeos/components/quick_answers/test/quick_answers_test_base.h b/chromeos/components/quick_answers/test/quick_answers_test_base.h
index e8b949f..a6e16e28b 100644
--- a/chromeos/components/quick_answers/test/quick_answers_test_base.h
+++ b/chromeos/components/quick_answers/test/quick_answers_test_base.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "chromeos/components/quick_answers/public/cpp/quick_answers_state.h"
+#include "components/prefs/testing_pref_service.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 // Helper class for Quick Answers related tests.
@@ -24,7 +25,11 @@
   void SetUp() override;
   void TearDown() override;
 
+  PrefService* prefs() { return test_pref_service_.get(); }
+
  private:
+  std::unique_ptr<TestingPrefServiceSimple> test_pref_service_;
+
   std::unique_ptr<QuickAnswersState> quick_answers_state_;
 };
 
diff --git a/chromeos/components/quick_answers/understanding/intent_generator.cc b/chromeos/components/quick_answers/understanding/intent_generator.cc
index a4d6799..0ef0947 100644
--- a/chromeos/components/quick_answers/understanding/intent_generator.cc
+++ b/chromeos/components/quick_answers/understanding/intent_generator.cc
@@ -113,13 +113,12 @@
   return false;
 }
 
-bool IsPreferredLanguage(const std::string& detected_language,
-                         const std::string& preferred_languages_string) {
-  auto preferred_languages =
-      base::SplitString(preferred_languages_string, ",", base::TRIM_WHITESPACE,
-                        base::SPLIT_WANT_NONEMPTY);
+bool IsPreferredLanguage(const std::string& detected_language) {
+  auto preferred_languages_list =
+      base::SplitString(QuickAnswersState::Get()->preferred_languages(), ",",
+                        base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
 
-  for (const std::string& locale : preferred_languages) {
+  for (const std::string& locale : preferred_languages_list) {
     if (l10n_util::GetLanguage(locale) == detected_language)
       return true;
   }
@@ -195,7 +194,7 @@
   if (correctness) {
     std::move(complete_callback_)
         .Run(IntentInfo(request.selected_text, IntentType::kDictionary,
-                        request.context.device_properties.language));
+                        QuickAnswersState::Get()->application_locale()));
     return;
   }
 
@@ -224,7 +223,7 @@
     text_annotation_request->text = base::UTF16ToUTF8(
         base::i18n::ToLower(base::UTF8ToUTF16(request.selected_text)));
     text_annotation_request->default_locales =
-        request.context.device_properties.language;
+        QuickAnswersState::Get()->application_locale();
 
     text_classifier_->Annotate(
         std::move(text_annotation_request),
@@ -265,7 +264,7 @@
           .Run(IntentInfo(
               entity_str,
               RewriteIntent(request.selected_text, entity_str, it->second),
-              request.context.device_properties.language));
+              QuickAnswersState::Get()->application_locale()));
       return;
     }
   }
@@ -287,7 +286,7 @@
   // Don't generate translation intent if no device language is provided or the
   // length of selected text is above the threshold. Returns unknown intent
   // type.
-  if (request.context.device_properties.language.empty() ||
+  if (QuickAnswersState::Get()->application_locale().empty() ||
       request.selected_text.length() > kTranslationTextLengthThreshold) {
     std::move(complete_callback_)
         .Run(IntentInfo(request.selected_text, IntentType::kUnknown));
@@ -310,13 +309,12 @@
   // Generate translation intent if the detected language is different to the
   // system language and is not one of the preferred languages.
   if (detected_language.has_value() &&
-      detected_language.value() != request.context.device_properties.language &&
-      !IsPreferredLanguage(
-          detected_language.value(),
-          request.context.device_properties.preferred_languages)) {
+      detected_language.value() !=
+          QuickAnswersState::Get()->application_locale() &&
+      !IsPreferredLanguage(detected_language.value())) {
     std::move(complete_callback_)
         .Run(IntentInfo(request.selected_text, IntentType::kTranslation,
-                        request.context.device_properties.language,
+                        QuickAnswersState::Get()->application_locale(),
                         detected_language.value()));
     return;
   }
diff --git a/chromeos/components/quick_answers/understanding/intent_generator_unittest.cc b/chromeos/components/quick_answers/understanding/intent_generator_unittest.cc
index e52fb8f7..20f3bb85 100644
--- a/chromeos/components/quick_answers/understanding/intent_generator_unittest.cc
+++ b/chromeos/components/quick_answers/understanding/intent_generator_unittest.cc
@@ -19,6 +19,7 @@
 #include "chromeos/services/machine_learning/public/cpp/fake_service_connection.h"
 #include "chromeos/services/machine_learning/public/mojom/machine_learning_service.mojom.h"
 #include "chromeos/services/machine_learning/public/mojom/text_classifier.mojom.h"
+#include "components/language/core/browser/pref_names.h"
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
 #include "services/network/test/test_url_loader_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -132,8 +133,8 @@
 
   QuickAnswersRequest request;
   request.selected_text = "quick answers";
-  request.context.device_properties.language = "es";
-  request.context.device_properties.preferred_languages = "es";
+  prefs()->SetString(language::prefs::kApplicationLocale, "es");
+  prefs()->SetString(language::prefs::kPreferredLanguages, "es");
   intent_generator_->GenerateIntent(request);
 
   FlushForTesting();
@@ -152,8 +153,8 @@
 
   QuickAnswersRequest request;
   request.selected_text = "quick answers";
-  request.context.device_properties.language = "en";
-  request.context.device_properties.preferred_languages = "en";
+  prefs()->SetString(language::prefs::kApplicationLocale, "en");
+  prefs()->SetString(language::prefs::kPreferredLanguages, "en");
   intent_generator_->GenerateIntent(request);
 
   FlushForTesting();
@@ -171,8 +172,8 @@
 
   QuickAnswersRequest request;
   request.selected_text = "quick answers";
-  request.context.device_properties.language = "es";
-  request.context.device_properties.preferred_languages = "es,en,zh";
+  prefs()->SetString(language::prefs::kApplicationLocale, "es");
+  prefs()->SetString(language::prefs::kPreferredLanguages, "es,en,zh");
   intent_generator_->GenerateIntent(request);
 
   FlushForTesting();
@@ -190,8 +191,8 @@
 
   QuickAnswersRequest request;
   request.selected_text = "quick answers";
-  request.context.device_properties.language = "es";
-  request.context.device_properties.preferred_languages = "es-MX,en-US,zh-CN";
+  prefs()->SetString(language::prefs::kApplicationLocale, "es");
+  prefs()->SetString(language::prefs::kPreferredLanguages, "es-MX,en-US,zh-CN");
   intent_generator_->GenerateIntent(request);
 
   FlushForTesting();
@@ -212,8 +213,8 @@
       "Search the world's information, including webpages, images, videos and "
       "more. Google has many special features to help you find exactly what "
       "you're looking ...";
-  request.context.device_properties.language = "es";
-  request.context.device_properties.preferred_languages = "es";
+  prefs()->SetString(language::prefs::kApplicationLocale, "es");
+  prefs()->SetString(language::prefs::kPreferredLanguages, "es");
   intent_generator_->GenerateIntent(request);
 
   FlushForTesting();
@@ -231,8 +232,8 @@
 TEST_F(IntentGeneratorTest, TranslationIntentWithAnnotation) {
   QuickAnswersRequest request;
   request.selected_text = "unfathomable";
-  request.context.device_properties.language = "es";
-  request.context.device_properties.preferred_languages = "es";
+  prefs()->SetString(language::prefs::kApplicationLocale, "es");
+  prefs()->SetString(language::prefs::kPreferredLanguages, "es");
 
   // Create the test annotations.
   std::vector<TextEntityPtr> entities;
diff --git a/chromeos/crosapi/mojom/app_service_types.mojom b/chromeos/crosapi/mojom/app_service_types.mojom
index e748694..c574b94b 100644
--- a/chromeos/crosapi/mojom/app_service_types.mojom
+++ b/chromeos/crosapi/mojom/app_service_types.mojom
@@ -2,7 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 //
-// Next MinVersion: 19
+// NOTE: Future MinVersion values should take into account that MinVersion is
+// scoped per struct. In the past, some of the MinVersion values in this file
+// were set based on the understanding that the entire file should share a
+// MinVersion counter.
 
 module crosapi.mojom;
 
@@ -346,8 +349,11 @@
 // The result from launching an app.
 [Stable]
 struct LaunchResult {
-  // The id to represent which instance the app is launched in.
+  // The id to represent which instance the app is launched in. Deprecated: use
+  // `instance_ids`.
   mojo_base.mojom.UnguessableToken instance_id@0;
+  // The IDs that represent the instances the app is launched in.
+  [MinVersion=1] array<mojo_base.mojom.UnguessableToken>? instance_ids@1;
 };
 
 // Enumeration of app launch sources.
diff --git a/chromeos/dbus/hps/fake_hps_dbus_client.cc b/chromeos/dbus/hps/fake_hps_dbus_client.cc
index d0411ce5..d552e8b 100644
--- a/chromeos/dbus/hps/fake_hps_dbus_client.cc
+++ b/chromeos/dbus/hps/fake_hps_dbus_client.cc
@@ -82,6 +82,12 @@
   }
 }
 
+void FakeHpsDBusClient::Shutdown() {
+  for (auto& observer : observers_) {
+    observer.OnShutdown();
+  }
+}
+
 void FakeHpsDBusClient::Reset() {
   hps_notify_result_.reset();
   hps_notify_count_ = 0;
diff --git a/chromeos/dbus/hps/fake_hps_dbus_client.h b/chromeos/dbus/hps/fake_hps_dbus_client.h
index d56e2f6..c1987307 100644
--- a/chromeos/dbus/hps/fake_hps_dbus_client.h
+++ b/chromeos/dbus/hps/fake_hps_dbus_client.h
@@ -64,6 +64,9 @@
   // Simulte HpsService restart.
   void Restart();
 
+  // Simulte HpsService shutdown.
+  void Shutdown();
+
   // Resets all parameters; used in unittests.
   void Reset();
 
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni
index d7b2894..aa64a8d22 100644
--- a/chromeos/tast_control.gni
+++ b/chromeos/tast_control.gni
@@ -155,11 +155,6 @@
   # https://crbug.com/1300941
   "ui.WebUIJSErrors",
 
-  # https://crbug.com/1306316
-  "policy.URLCheck.whitelist",  # nocheck
-  "policy.URLCheck.blacklist",  # nocheck
-  "policy.UserNativePrintersAllowed",  # nocheck
-
   # https://crbug.com/1306441
   "policy.UserAvatarImage",
 
diff --git a/components/BUILD.gn b/components/BUILD.gn
index 5c50c86d..d8e17fd2 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -768,6 +768,7 @@
       "//components/content_settings/renderer",
       "//components/continuous_search/common/public/mojom",
       "//components/continuous_search/renderer",
+      "//components/custom_handlers:browser_tests",
       "//components/dom_distiller/content/browser",
       "//components/dom_distiller/core",
       "//components/dom_distiller/core:test_support",
diff --git a/components/account_manager_core/chromeos/account_manager.cc b/components/account_manager_core/chromeos/account_manager.cc
index db07823..dc6b8ad 100644
--- a/components/account_manager_core/chromeos/account_manager.cc
+++ b/components/account_manager_core/chromeos/account_manager.cc
@@ -23,6 +23,7 @@
 #include "base/task/task_runner_util.h"
 #include "base/task/thread_pool.h"
 #include "base/threading/sequenced_task_runner_handle.h"
+#include "build/chromeos_buildflags.h"
 #include "components/account_manager_core/account.h"
 #include "components/account_manager_core/chromeos/tokens.pb.h"
 #include "components/account_manager_core/pref_names.h"
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc
index ddd2cf1..d88a6ea 100644
--- a/components/autofill/content/renderer/autofill_agent.cc
+++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -985,7 +985,7 @@
 
 void AutofillAgent::ProcessForms() {
   FormCache::UpdateFormCacheResult cache =
-      form_cache_.ExtractNewForms(field_data_manager_.get());
+      form_cache_.UpdateFormCache(field_data_manager_.get());
 
   // Always communicate to browser process for topmost frame.
   if (!cache.updated_forms.empty() || !cache.removed_forms.empty() ||
diff --git a/components/autofill/content/renderer/autofill_agent_browsertest.cc b/components/autofill/content/renderer/autofill_agent_browsertest.cc
index 083ad4e6..ed4149a 100644
--- a/components/autofill/content/renderer/autofill_agent_browsertest.cc
+++ b/components/autofill/content/renderer/autofill_agent_browsertest.cc
@@ -195,39 +195,28 @@
   std::unique_ptr<AutofillAssistantAgent> autofill_assistant_agent_;
 };
 
-// The parameter indicates if kAutofillDisplaceRemovedForms is enabled.
-class AutofillAgentTestWithFeatures
-    : public AutofillAgentTest,
-      public ::testing::WithParamInterface<bool> {
+// Enables AutofillAcrossIframes.
+class AutofillAgentTestWithFeatures : public AutofillAgentTest {
  public:
   AutofillAgentTestWithFeatures() {
-    std::vector<base::Feature> enabled;
-    std::vector<base::Feature> disabled;
-    enabled.push_back(features::kAutofillAcrossIframes);
-    (GetParam() ? enabled : disabled)
-        .push_back(features::kAutofillDisplaceRemovedForms);
-    scoped_features_.InitWithFeatures(enabled, disabled);
+    scoped_features_.InitAndEnableFeature(features::kAutofillAcrossIframes);
   }
 
  private:
   base::test::ScopedFeatureList scoped_features_;
 };
 
-INSTANTIATE_TEST_SUITE_P(AutofillAgentTest,
-                         AutofillAgentTestWithFeatures,
-                         ::testing::Bool());
-
-TEST_P(AutofillAgentTestWithFeatures, FormsSeen_Empty) {
+TEST_F(AutofillAgentTestWithFeatures, FormsSeen_Empty) {
   EXPECT_CALL(autofill_driver_, FormsSeen(SizeIs(0), SizeIs(0)));
   LoadHTML(R"(<body> </body>)");
 }
 
-TEST_P(AutofillAgentTestWithFeatures, FormsSeen_NoEmpty) {
+TEST_F(AutofillAgentTestWithFeatures, FormsSeen_NoEmpty) {
   EXPECT_CALL(autofill_driver_, FormsSeen(SizeIs(0), SizeIs(0)));
   LoadHTML(R"(<body> <form></form> </body>)");
 }
 
-TEST_P(AutofillAgentTestWithFeatures, FormsSeen_NewFormUnowned) {
+TEST_F(AutofillAgentTestWithFeatures, FormsSeen_NewFormUnowned) {
   EXPECT_CALL(autofill_driver_,
               FormsSeen(HasSingleElementWhich(HasFormId(0), HasNumFields(1),
                                               HasNumChildFrames(0)),
@@ -235,7 +224,7 @@
   LoadHTML(R"(<body> <input> </body>)");
 }
 
-TEST_P(AutofillAgentTestWithFeatures, FormsSeen_NewForm) {
+TEST_F(AutofillAgentTestWithFeatures, FormsSeen_NewForm) {
   EXPECT_CALL(autofill_driver_,
               FormsSeen(HasSingleElementWhich(HasFormId(1), HasNumFields(1),
                                               HasNumChildFrames(0)),
@@ -243,7 +232,7 @@
   LoadHTML(R"(<body> <form><input></form> </body>)");
 }
 
-TEST_P(AutofillAgentTestWithFeatures, FormsSeen_NewIframe) {
+TEST_F(AutofillAgentTestWithFeatures, FormsSeen_NewIframe) {
   EXPECT_CALL(autofill_driver_,
               FormsSeen(HasSingleElementWhich(HasFormId(1), HasNumFields(0),
                                               HasNumChildFrames(1)),
@@ -251,7 +240,7 @@
   LoadHTML(R"(<body> <form><iframe></iframe></form> </body>)");
 }
 
-TEST_P(AutofillAgentTestWithFeatures, FormsSeen_UpdatedForm) {
+TEST_F(AutofillAgentTestWithFeatures, FormsSeen_UpdatedForm) {
   {
     EXPECT_CALL(autofill_driver_,
                 FormsSeen(HasSingleElementWhich(HasFormId(1), HasNumFields(1),
@@ -272,7 +261,7 @@
   }
 }
 
-TEST_P(AutofillAgentTestWithFeatures, FormsSeen_RemovedForm) {
+TEST_F(AutofillAgentTestWithFeatures, FormsSeen_RemovedForm) {
   {
     EXPECT_CALL(autofill_driver_, FormsSeen(SizeIs(1), SizeIs(0)));
     LoadHTML(R"(<body> <form><input></form> </body>)");
diff --git a/components/autofill/content/renderer/form_cache.cc b/components/autofill/content/renderer/form_cache.cc
index 1126220..0f15fe0 100644
--- a/components/autofill/content/renderer/form_cache.cc
+++ b/components/autofill/content/renderer/form_cache.cc
@@ -110,16 +110,8 @@
 FormCache::FormCache(WebLocalFrame* frame) : frame_(frame) {}
 FormCache::~FormCache() = default;
 
-void FormCache::MaybeUpdateParsedFormsPeak() {
-  peak_size_of_parsed_forms_ = std::max(
-      peak_size_of_parsed_forms_,
-      std::max(parsed_forms_by_renderer_id_.size(), parsed_forms_.size()));
-}
-
 FormCache::UpdateFormCacheResult FormCache::UpdateFormCache(
     const FieldDataManager* field_data_manager) {
-  DCHECK(base::FeatureList::IsEnabled(features::kAutofillDisplaceRemovedForms));
-
   initial_checked_state_.clear();
   initial_select_values_.clear();
 
@@ -127,12 +119,12 @@
 
   // Log an error message for deprecated attributes, but only the first time
   // the form is parsed.
-  bool log_deprecation_messages = parsed_forms_by_renderer_id_.empty();
+  bool log_deprecation_messages = parsed_forms_.empty();
 
-  // |parsed_forms_by_renderer_id_| is re-populated below in ProcessForm().
+  // |parsed_forms_| is re-populated below in ProcessForm().
   std::map<FormRendererId, FormData> old_parsed_forms =
-      std::move(parsed_forms_by_renderer_id_);
-  parsed_forms_by_renderer_id_.clear();
+      std::move(parsed_forms_);
+  parsed_forms_.clear();
 
   UpdateFormCacheResult r;
   r.removed_forms = base::MakeFlatSet<FormRendererId>(
@@ -170,8 +162,7 @@
         // Store only forms that contain iframes or fields.
         if (IsFormInteresting(form, num_editable_elements)) {
           FormRendererId form_id = form.unique_renderer_id;
-          DCHECK(parsed_forms_by_renderer_id_.find(form_id) ==
-                 parsed_forms_by_renderer_id_.end());
+          DCHECK(parsed_forms_.find(form_id) == parsed_forms_.end());
           auto it = old_parsed_forms.find(form_id);
           if (it == old_parsed_forms.end() ||
               !FormData::DeepEqual(std::move(it->second), form)) {
@@ -179,7 +170,7 @@
             r.updated_forms.push_back(form);
           }
           r.removed_forms.erase(form_id);
-          parsed_forms_by_renderer_id_[form_id] = std::move(form);
+          parsed_forms_[form_id] = std::move(form);
         }
         return true;
       };
@@ -189,10 +180,8 @@
                                           form_util::EXTRACT_OPTIONS);
 
   WebDocument document = frame_->GetDocument();
-  if (document.IsNull()) {
-    MaybeUpdateParsedFormsPeak();
+  if (document.IsNull())
     return r;
-  }
 
   for (const WebFormElement& form_element : document.Forms()) {
     FormData form;
@@ -205,7 +194,6 @@
             std::move(form),
             form_util::ExtractAutofillableElementsInForm(form_element))) {
       PruneInitialValueCaches(observed_unique_renderer_ids);
-      MaybeUpdateParsedFormsPeak();
       return r;
     }
   }
@@ -223,166 +211,20 @@
           fieldsets, control_elements, iframe_elements, nullptr, document,
           field_data_manager, extract_mask, &synthetic_form, nullptr)) {
     PruneInitialValueCaches(observed_unique_renderer_ids);
-    MaybeUpdateParsedFormsPeak();
     return r;
   }
   if (!ProcessForm(std::move(synthetic_form), control_elements)) {
     PruneInitialValueCaches(observed_unique_renderer_ids);
-    MaybeUpdateParsedFormsPeak();
     return r;
   }
 
   PruneInitialValueCaches(observed_unique_renderer_ids);
-  MaybeUpdateParsedFormsPeak();
-  return r;
-}
-
-FormCache::UpdateFormCacheResult FormCache::ExtractNewForms(
-    const FieldDataManager* field_data_manager) {
-  if (base::FeatureList::IsEnabled(features::kAutofillDisplaceRemovedForms)) {
-    return UpdateFormCache(field_data_manager);
-  }
-
-  UpdateFormCacheResult r;
-  r.removed_forms = base::MakeFlatSet<FormRendererId>(
-      parsed_forms_, {}, &FormData::unique_renderer_id);
-
-  WebDocument document = frame_->GetDocument();
-  if (document.IsNull()) {
-    MaybeUpdateParsedFormsPeak();
-    return r;
-  }
-
-  initial_checked_state_.clear();
-  initial_select_values_.clear();
-
-  std::set<FieldRendererId> observed_unique_renderer_ids;
-
-  // Log an error message for deprecated attributes, but only the first time
-  // the form is parsed.
-  bool log_deprecation_messages = parsed_forms_.empty();
-
-  const form_util::ExtractMask extract_mask =
-      static_cast<form_util::ExtractMask>(form_util::EXTRACT_VALUE |
-                                          form_util::EXTRACT_OPTIONS);
-
-  size_t num_fields_seen = 0;
-  size_t num_frames_seen = 0;
-  for (const WebFormElement& form_element : document.Forms()) {
-    std::vector<WebFormControlElement> control_elements =
-        form_util::ExtractAutofillableElementsInForm(form_element);
-
-    FormData form;
-    if (!WebFormElementToFormData(form_element, WebFormControlElement(),
-                                  field_data_manager, extract_mask, &form,
-                                  nullptr)) {
-      continue;
-    }
-
-    for (const auto& field : form.fields)
-      observed_unique_renderer_ids.insert(field.unique_renderer_id);
-
-    num_fields_seen += form.fields.size();
-    num_frames_seen += form.child_frames.size();
-
-    if (num_fields_seen > kMaxParseableFields) {
-      PruneInitialValueCaches(observed_unique_renderer_ids);
-      MaybeUpdateParsedFormsPeak();
-      return r;
-    }
-
-    if (num_frames_seen > kMaxParseableChildFrames)
-      form.child_frames.clear();
-
-    size_t num_editable_elements =
-        ScanFormControlElements(control_elements, log_deprecation_messages);
-
-    if (!IsFormInteresting(form, num_editable_elements))
-      continue;
-
-    // The form is in the DOM and is interesting, so has not been removed.
-    r.removed_forms.erase(form.unique_renderer_id);
-
-    if (!base::Contains(parsed_forms_, form)) {
-      for (auto it = parsed_forms_.begin(); it != parsed_forms_.end(); ++it) {
-        if (it->SameFormAs(form)) {
-          parsed_forms_.erase(it);
-          break;
-        }
-      }
-
-      SaveInitialValues(control_elements);
-      r.updated_forms.push_back(form);
-      parsed_forms_.insert(form);
-    }
-  }
-
-  // Look for more parseable fields outside of forms.
-  std::vector<WebElement> fieldsets;
-  std::vector<WebFormControlElement> control_elements =
-      form_util::GetUnownedAutofillableFormFieldElements(document, &fieldsets);
-  std::vector<WebElement> iframe_elements =
-      form_util::GetUnownedIframeElements(document);
-
-  FormData synthetic_form;
-  if (!UnownedFormElementsAndFieldSetsToFormData(
-          fieldsets, control_elements, iframe_elements, nullptr, document,
-          field_data_manager, extract_mask, &synthetic_form, nullptr)) {
-    PruneInitialValueCaches(observed_unique_renderer_ids);
-    MaybeUpdateParsedFormsPeak();
-    return r;
-  }
-
-  for (const auto& field : synthetic_form.fields)
-    observed_unique_renderer_ids.insert(field.unique_renderer_id);
-
-  num_fields_seen += synthetic_form.fields.size();
-  num_frames_seen += synthetic_form.child_frames.size();
-  if (num_fields_seen > kMaxParseableFields) {
-    PruneInitialValueCaches(observed_unique_renderer_ids);
-    MaybeUpdateParsedFormsPeak();
-    return r;
-  }
-
-  if (num_frames_seen > kMaxParseableChildFrames)
-    synthetic_form.child_frames.clear();
-
-  size_t num_editable_elements =
-      ScanFormControlElements(control_elements, log_deprecation_messages);
-
-  if (!IsFormInteresting(synthetic_form, num_editable_elements)) {
-    PruneInitialValueCaches(observed_unique_renderer_ids);
-    MaybeUpdateParsedFormsPeak();
-    return r;
-  }
-
-  // The form is in the DOM and is interesting, so has not been removed.
-  r.removed_forms.erase(synthetic_form.unique_renderer_id);
-
-  if (!base::Contains(parsed_forms_, synthetic_form)) {
-    SaveInitialValues(control_elements);
-    r.updated_forms.push_back(synthetic_form);
-    parsed_forms_.insert(synthetic_form);
-    parsed_forms_.erase(synthetic_form_);
-    synthetic_form_ = synthetic_form;
-  }
-
-  PruneInitialValueCaches(observed_unique_renderer_ids);
-  MaybeUpdateParsedFormsPeak();
   return r;
 }
 
 void FormCache::Reset() {
-  // Record the size of the cached parsed forms every time it reaches its peak
-  // size. The peak size is reached right before the cache is cleared.
-  UMA_HISTOGRAM_COUNTS_1000("Autofill.FormCacheSize",
-                            peak_size_of_parsed_forms_);
-
   synthetic_form_ = FormData();
   parsed_forms_.clear();
-  // TODO(crbug/1215333): Remove after the `AutofillUseNewFormExtraction`
-  // feature is deleted.
-  parsed_forms_by_renderer_id_.clear();
   initial_select_values_.clear();
   initial_checked_state_.clear();
   fields_eligible_for_manual_filling_.clear();
diff --git a/components/autofill/content/renderer/form_cache.h b/components/autofill/content/renderer/form_cache.h
index 42bd9f6..a7a84e2 100644
--- a/components/autofill/content/renderer/form_cache.h
+++ b/components/autofill/content/renderer/form_cache.h
@@ -53,24 +53,6 @@
 
   ~FormCache();
 
-  // Scans the DOM in |frame_| extracting and storing forms that have not been
-  // seen before. Returns the extracted forms.
-  //
-  // Note that modified forms are considered new forms.
-  //
-  // To reduce the computational cost, we limit the number of fields and frames
-  // summed over all forms, in addition to the per-form limits in
-  // form_util::FormOrFieldsetsToFormData():
-  // - if the number of fields over all forms exceeds |kMaxParseableFields|,
-  //   only a subset of forms is returned which does not exceed the limit;
-  // - if the number of frames over all forms exceeds kMaxParseableFrames, all
-  //   forms are returned but only a subset of them have non-empty
-  //   FormData::child_frames.
-  // In either case, the subset is chosen so that the returned list of forms
-  // does not exceed the limits of fields and frames.
-  UpdateFormCacheResult ExtractNewForms(
-      const FieldDataManager* field_data_manager);
-
   // Returns the diff of forms since the last call to UpdateFormCache(): the new
   // forms, the still present but changed forms, and the removed forms.
   //
@@ -99,12 +81,7 @@
   // In either case, the subset is chosen so that the returned list of forms
   // does not exceed the limits of fields and frames.
   //
-  // Updates |parsed_forms_by_renderer_id_| to contain the forms that are
-  // currently in the DOM.
-  //
-  // TODO(crbug/1215333):/ Modified version of ExtractNewForms(). It is used
-  // only if `AutofillUseNewFormExtraction` feature is enabled. Remove
-  // ExtractNewForms() after the feature is deleted.
+  // Updates |parsed_forms_| to contain the forms that are currently in the DOM.
   UpdateFormCacheResult UpdateFormCache(
       const FieldDataManager* field_data_manager);
 
@@ -150,30 +127,13 @@
   // |initial_checked_state_| whose keys not contained in |ids_to_retain|.
   void PruneInitialValueCaches(const std::set<FieldRendererId>& ids_to_retain);
 
-  // Update the peak size of the cached forms stored in
-  // |peak_size_of_parsed_forms_|.
-  // TODO(crbug/1215333): Remove after `Autofill.FormCacheSize` experiment is
-  // completed.
-  void MaybeUpdateParsedFormsPeak();
-
   // The frame this FormCache is associated with. Weak reference.
   blink::WebLocalFrame* frame_;
 
-  // The cached forms. Used to prevent re-extraction of forms.
-  // TODO(crbug/896689) Move to std::map<unique_rederer_id, FormData>.
-  std::set<FormData, FormData::IdentityComparator> parsed_forms_;
-
   // Same as |parsed_forms_|, but moved to a different type. It is used only if
   // `AutofillUseNewFormExtraction` feature is enabled.
   // TODO(crbug/1215333): Remove |parsed_forms_| after the feature is deleted.
-  std::map<FormRendererId, FormData> parsed_forms_by_renderer_id_;
-
-  // Stores the peak size of the cached forms for `Autofill.FormCacheSize`
-  // metric. The cached forms are stored in |parsed_forms_| or
-  // |parsed_forms_by_renderer_id_| depending on the
-  // `AutofillUseNewFormExtraction` feature.
-  // TODO(crbug/1215333): Remove after the experiment is completed.
-  size_t peak_size_of_parsed_forms_ = 0;
+  std::map<FormRendererId, FormData> parsed_forms_;
 
   // The synthetic FormData is for all the fieldsets in the document without a
   // form owner.
diff --git a/components/autofill/content/renderer/form_cache_browsertest.cc b/components/autofill/content/renderer/form_cache_browsertest.cc
index 5a071b9..8e6aa08 100644
--- a/components/autofill/content/renderer/form_cache_browsertest.cc
+++ b/components/autofill/content/renderer/form_cache_browsertest.cc
@@ -78,24 +78,7 @@
   std::unique_ptr<test::FocusTestUtils> focus_test_utils_;
 };
 
-class ParameterizedFormCacheBrowserTest
-    : public FormCacheBrowserTest,
-      public testing::WithParamInterface<bool> {
- public:
-  ParameterizedFormCacheBrowserTest() {
-    bool use_new_form_extraction = GetParam();
-    std::vector<base::Feature> enabled;
-    std::vector<base::Feature> disabled;
-    (use_new_form_extraction ? &enabled : &disabled)
-        ->push_back(features::kAutofillDisplaceRemovedForms);
-    scoped_features_.InitWithFeatures(enabled, disabled);
-  }
-
- private:
-  base::test::ScopedFeatureList scoped_features_;
-};
-
-TEST_P(ParameterizedFormCacheBrowserTest, UpdatedForms) {
+TEST_F(FormCacheBrowserTest, UpdatedForms) {
   LoadHTML(R"(
     <form id="form1">
       <input type="text" name="foo1">
@@ -106,7 +89,7 @@
   )");
 
   FormCache form_cache(GetMainFrame());
-  FormCache::UpdateFormCacheResult forms = form_cache.ExtractNewForms(nullptr);
+  FormCache::UpdateFormCacheResult forms = form_cache.UpdateFormCache(nullptr);
 
   EXPECT_THAT(forms.updated_forms,
               UnorderedElementsAre(HasId(FormRendererId()), HasName("form1")));
@@ -123,7 +106,7 @@
   EXPECT_TRUE(unowned_form->child_frames.empty());
 }
 
-TEST_P(ParameterizedFormCacheBrowserTest, RemovedForms) {
+TEST_F(FormCacheBrowserTest, RemovedForms) {
   LoadHTML(R"(
     <form id="form1">
       <input type="text" name="foo1">
@@ -139,7 +122,7 @@
   )");
 
   FormCache form_cache(GetMainFrame());
-  FormCache::UpdateFormCacheResult forms = form_cache.ExtractNewForms(nullptr);
+  FormCache::UpdateFormCacheResult forms = form_cache.UpdateFormCache(nullptr);
 
   EXPECT_THAT(forms.updated_forms,
               UnorderedElementsAre(HasId(FormRendererId()), HasName("form1"),
@@ -151,7 +134,7 @@
     document.getElementById("form2").innerHTML = "";
   )");
 
-  forms = form_cache.ExtractNewForms(nullptr);
+  forms = form_cache.UpdateFormCache(nullptr);
 
   EXPECT_TRUE(forms.updated_forms.empty());
   EXPECT_THAT(forms.removed_forms,
@@ -161,16 +144,10 @@
     document.getElementById("unowned_element").remove();
   )");
 
-  forms = form_cache.ExtractNewForms(nullptr);
+  forms = form_cache.UpdateFormCache(nullptr);
 
   EXPECT_TRUE(forms.updated_forms.empty());
-  if (base::FeatureList::IsEnabled(features::kAutofillDisplaceRemovedForms)) {
-    EXPECT_THAT(forms.removed_forms, ElementsAre(FormRendererId()));
-  } else {
-    EXPECT_THAT(
-        forms.removed_forms,
-        ElementsAre(FormRendererId(), FormRendererId(1), FormRendererId(2)));
-  }
+  EXPECT_THAT(forms.removed_forms, ElementsAre(FormRendererId()));
 
   ExecuteJavaScriptForTests(R"(
     document.getElementById("form2").innerHTML = `
@@ -180,18 +157,10 @@
     `;
   )");
 
-  forms = form_cache.ExtractNewForms(nullptr);
+  forms = form_cache.UpdateFormCache(nullptr);
 
-  if (base::FeatureList::IsEnabled(features::kAutofillDisplaceRemovedForms)) {
-    EXPECT_THAT(forms.updated_forms, ElementsAre(HasName("form2")));
-    EXPECT_TRUE(forms.removed_forms.empty());
-  } else {
-    // Unfortunately, this does not contain FormRendererId(2) because
-    // ExtractNewForms() does not remove its old forms.
-    EXPECT_TRUE(forms.updated_forms.empty());
-    EXPECT_THAT(forms.removed_forms,
-                ElementsAre(FormRendererId(), FormRendererId(1)));
-  }
+  EXPECT_THAT(forms.updated_forms, ElementsAre(HasName("form2")));
+  EXPECT_TRUE(forms.removed_forms.empty());
 
   ExecuteJavaScriptForTests(R"(
     document.getElementById("form2").innerHTML = `
@@ -202,19 +171,14 @@
     `;
   )");
 
-  forms = form_cache.ExtractNewForms(nullptr);
+  forms = form_cache.UpdateFormCache(nullptr);
 
   EXPECT_THAT(forms.updated_forms, ElementsAre(HasName("form2")));
-  if (base::FeatureList::IsEnabled(features::kAutofillDisplaceRemovedForms)) {
-    EXPECT_TRUE(forms.removed_forms.empty());
-  } else {
-    EXPECT_THAT(forms.removed_forms,
-                ElementsAre(FormRendererId(), FormRendererId(1)));
-  }
+  EXPECT_TRUE(forms.removed_forms.empty());
 }
 
 // Test if the form gets re-extracted after a label change.
-TEST_P(ParameterizedFormCacheBrowserTest, ExtractFormAfterDynamicFieldChange) {
+TEST_F(FormCacheBrowserTest, ExtractFormAfterDynamicFieldChange) {
   LoadHTML(R"(
     <form id="f"><input></form>
     <form id="g"> <label id="label">Name</label><input></form>
@@ -222,7 +186,7 @@
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
   EXPECT_THAT(forms.updated_forms,
               UnorderedElementsAre(HasName("f"), HasName("g")));
   EXPECT_TRUE(forms.removed_forms.empty());
@@ -231,12 +195,12 @@
     document.getElementById("label").innerHTML = "Last Name";
   )");
 
-  forms = form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+  forms = form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
   EXPECT_THAT(forms.updated_forms, ElementsAre(HasName("g")));
   EXPECT_TRUE(forms.removed_forms.empty());
 }
 
-class FormCacheIframeBrowserTest : public ParameterizedFormCacheBrowserTest {
+class FormCacheIframeBrowserTest : public FormCacheBrowserTest {
  public:
   FormCacheIframeBrowserTest() {
     scoped_feature_list_.InitAndEnableFeature(features::kAutofillAcrossIframes);
@@ -247,7 +211,7 @@
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
-TEST_P(FormCacheIframeBrowserTest, ExtractFrames) {
+TEST_F(FormCacheIframeBrowserTest, ExtractFrames) {
   LoadHTML(R"(
     <form id="form1">
       <iframe id="frame1"></iframe>
@@ -262,7 +226,7 @@
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
 
   EXPECT_THAT(forms.updated_forms,
               UnorderedElementsAre(HasId(FormRendererId()), HasName("form1")));
@@ -280,7 +244,7 @@
               ElementsAre(AllOf(IsToken(frame2_token, -1))));
 }
 
-TEST_P(ParameterizedFormCacheBrowserTest, ExtractFormsTwice) {
+TEST_F(FormCacheBrowserTest, ExtractFormsTwice) {
   LoadHTML(R"(
     <form id="form1">
       <input type="text" name="foo1">
@@ -292,19 +256,19 @@
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
 
   EXPECT_THAT(forms.updated_forms,
               UnorderedElementsAre(HasId(FormRendererId()), HasName("form1")));
   EXPECT_TRUE(forms.removed_forms.empty());
 
-  forms = form_cache.ExtractNewForms(nullptr);
+  forms = form_cache.UpdateFormCache(nullptr);
   // As nothing has changed, there are no new or removed forms.
   EXPECT_TRUE(forms.updated_forms.empty());
   EXPECT_TRUE(forms.removed_forms.empty());
 }
 
-TEST_P(FormCacheIframeBrowserTest, ExtractFramesTwice) {
+TEST_F(FormCacheIframeBrowserTest, ExtractFramesTwice) {
   LoadHTML(R"(
     <form id="form1">
       <iframe></iframe>
@@ -314,20 +278,20 @@
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
 
   EXPECT_THAT(forms.updated_forms,
               UnorderedElementsAre(HasId(FormRendererId()), HasName("form1")));
   EXPECT_TRUE(forms.removed_forms.empty());
 
-  forms = form_cache.ExtractNewForms(nullptr);
+  forms = form_cache.UpdateFormCache(nullptr);
   // As nothing has changed, there are no new or removed forms.
   EXPECT_TRUE(forms.updated_forms.empty());
   EXPECT_TRUE(forms.removed_forms.empty());
 }
 
 // TODO(crbug.com/1117028) Adjust expectations when we omit invisible iframes.
-TEST_P(FormCacheIframeBrowserTest, ExtractFramesAfterVisibilityChange) {
+TEST_F(FormCacheIframeBrowserTest, ExtractFramesAfterVisibilityChange) {
   LoadHTML(R"(
     <form id="form1">
       <iframe id="frame1" style="display: none;"></iframe>
@@ -351,7 +315,7 @@
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
   EXPECT_THAT(forms.updated_forms,
               UnorderedElementsAre(HasId(FormRendererId()), HasName("form1")));
   EXPECT_TRUE(forms.removed_forms.empty());
@@ -364,7 +328,7 @@
   ASSERT_GT(GetSize(iframe2), 0);
   ASSERT_GT(GetSize(iframe3), 0);
 
-  forms = form_cache.ExtractNewForms(nullptr);
+  forms = form_cache.UpdateFormCache(nullptr);
   EXPECT_TRUE(forms.updated_forms.empty());
   EXPECT_TRUE(forms.removed_forms.empty());
 
@@ -375,12 +339,12 @@
   ASSERT_LE(GetSize(iframe2), 0);
   ASSERT_LE(GetSize(iframe3), 0);
 
-  forms = form_cache.ExtractNewForms(nullptr);
+  forms = form_cache.UpdateFormCache(nullptr);
   EXPECT_TRUE(forms.updated_forms.empty());
   EXPECT_TRUE(forms.removed_forms.empty());
 }
 
-TEST_P(ParameterizedFormCacheBrowserTest, ExtractFormsAfterModification) {
+TEST_F(FormCacheBrowserTest, ExtractFormsAfterModification) {
   LoadHTML(R"(
     <form id="form1">
       <input type="text" name="foo1">
@@ -392,7 +356,7 @@
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
   EXPECT_THAT(forms.updated_forms,
               UnorderedElementsAre(HasId(FormRendererId()), HasName("form1")));
   EXPECT_TRUE(forms.removed_forms.empty());
@@ -412,7 +376,7 @@
     document.body.appendChild(new_input_2);
   )");
 
-  forms = form_cache.ExtractNewForms(nullptr);
+  forms = form_cache.UpdateFormCache(nullptr);
   EXPECT_THAT(forms.updated_forms,
               UnorderedElementsAre(HasId(FormRendererId()), HasName("form1")));
   EXPECT_TRUE(forms.removed_forms.empty());
@@ -426,7 +390,7 @@
   EXPECT_EQ(2u, unowned_form->fields.size());
 }
 
-TEST_P(ParameterizedFormCacheBrowserTest, FillAndClear) {
+TEST_F(FormCacheBrowserTest, FillAndClear) {
   LoadHTML(R"(
     <input type="text" name="text" id="text">
     <input type="checkbox" checked name="checkbox" id="checkbox">
@@ -438,7 +402,7 @@
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
 
   EXPECT_THAT(forms.updated_forms, ElementsAre(HasId(FormRendererId())));
   EXPECT_TRUE(forms.removed_forms.empty());
@@ -475,7 +439,7 @@
 
 // Tests that correct focus, change and blur events are emitted during the
 // autofilling and clearing of the form with an initially focused element.
-TEST_P(ParameterizedFormCacheBrowserTest,
+TEST_F(FormCacheBrowserTest,
        VerifyFocusAndBlurEventsAfterAutofillAndClearingWithFocusElement) {
   // Load a form.
   LoadHTML(
@@ -489,7 +453,7 @@
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
 
   EXPECT_THAT(forms.updated_forms,
               UnorderedElementsAre(HasId(FormRendererId()), HasName("myForm")));
@@ -529,7 +493,7 @@
   EXPECT_EQ(GetFocusLog(), "c0b0f1c1b1f0c0b0f1c1b1f0");
 }
 
-TEST_P(ParameterizedFormCacheBrowserTest, FreeDataOnElementRemoval) {
+TEST_F(FormCacheBrowserTest, FreeDataOnElementRemoval) {
   LoadHTML(R"(
     <div id="container">
       <input type="text" name="text" id="text">
@@ -543,7 +507,7 @@
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
 
   EXPECT_THAT(forms.updated_forms, ElementsAre(HasId(FormRendererId())));
   EXPECT_TRUE(forms.removed_forms.empty());
@@ -558,7 +522,7 @@
     }
   )");
 
-  forms = form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+  forms = form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
   EXPECT_TRUE(forms.updated_forms.empty());
   EXPECT_THAT(forms.removed_forms, ElementsAre(FormRendererId()));
   EXPECT_EQ(0u, FormCacheTestApi(&form_cache).initial_select_values_size());
@@ -567,8 +531,7 @@
 
 // Test that the select element's user edited field state is set
 // to false after clearing the form.
-TEST_P(ParameterizedFormCacheBrowserTest,
-       ClearFormSelectElementEditedStateReset) {
+TEST_F(FormCacheBrowserTest, ClearFormSelectElementEditedStateReset) {
   LoadHTML(R"(
     <input type="text" name="text" id="text">
     <select name="date" id="date">
@@ -585,7 +548,7 @@
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
 
   EXPECT_THAT(forms.updated_forms, ElementsAre(HasId(FormRendererId())));
   EXPECT_TRUE(forms.removed_forms.empty());
@@ -639,8 +602,7 @@
   EXPECT_TRUE(select_month.UserHasEditedTheField());
 }
 
-TEST_P(ParameterizedFormCacheBrowserTest,
-       IsFormElementEligibleForManualFilling) {
+TEST_F(FormCacheBrowserTest, IsFormElementEligibleForManualFilling) {
   // Load a form.
   LoadHTML(
       "<html><form id='myForm'>"
@@ -656,7 +618,7 @@
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
 
   EXPECT_THAT(forms.updated_forms, ElementsAre(HasName("myForm")));
   EXPECT_TRUE(forms.removed_forms.empty());
@@ -683,31 +645,22 @@
 
 // Test that the FormCache does not contain empty forms.
 TEST_F(FormCacheBrowserTest, DoNotStoreEmptyForms) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kAutofillDisplaceRemovedForms);
-
   LoadHTML(R"(<form></form>)");
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
 
   EXPECT_TRUE(forms.updated_forms.empty());
   EXPECT_TRUE(forms.removed_forms.empty());
 
   EXPECT_EQ(1u, GetMainFrame()->GetDocument().Forms().size());
-  EXPECT_EQ(0u,
-            FormCacheTestApi(&form_cache).parsed_forms_by_renderer_id_size());
+  EXPECT_EQ(0u, FormCacheTestApi(&form_cache).parsed_forms_size());
 }
 
 // Test that the FormCache never contains more than |kMaxParseableFields|
 // non-empty parsed forms.
 TEST_F(FormCacheBrowserTest, FormCacheSizeUpperBound) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(
-      features::kAutofillDisplaceRemovedForms);
-
   // Create a HTML page that contains `kMaxParseableFields + 1` non-empty
   // forms.
   std::string html;
@@ -718,7 +671,7 @@
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
 
   EXPECT_EQ(forms.updated_forms.size(), kMaxParseableFields);
   EXPECT_TRUE(forms.removed_forms.empty());
@@ -726,12 +679,12 @@
   EXPECT_EQ(kMaxParseableFields + 1,
             GetMainFrame()->GetDocument().Forms().size());
   EXPECT_EQ(kMaxParseableFields,
-            FormCacheTestApi(&form_cache).parsed_forms_by_renderer_id_size());
+            FormCacheTestApi(&form_cache).parsed_forms_size());
 }
 
-// Test that FormCache::ExtractNewForms() limits the number of total fields by
+// Test that FormCache::UpdateFormCache() limits the number of total fields by
 // skipping any additional forms.
-TEST_P(ParameterizedFormCacheBrowserTest, FieldLimit) {
+TEST_F(FormCacheBrowserTest, FieldLimit) {
   std::string html;
   for (unsigned int i = 0; i < kMaxParseableFields + 1; i++)
     html += "<form><input></form>";
@@ -742,15 +695,15 @@
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
 
   EXPECT_EQ(kMaxParseableFields, forms.updated_forms.size());
   EXPECT_TRUE(forms.removed_forms.empty());
 }
 
-// Test that FormCache::ExtractNewForms() limits the number of total frames by
+// Test that FormCache::UpdateFormCache() limits the number of total frames by
 // clearing their frames and skipping the then-empty forms.
-TEST_P(FormCacheIframeBrowserTest, FrameLimit) {
+TEST_F(FormCacheIframeBrowserTest, FrameLimit) {
   std::string html;
   for (unsigned int i = 0; i < kMaxParseableChildFrames + 1; i++)
     html += "<form><iframe></iframe></form>";
@@ -761,13 +714,13 @@
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
 
   EXPECT_EQ(kMaxParseableChildFrames, forms.updated_forms.size());
   EXPECT_TRUE(forms.removed_forms.empty());
 }
 
-// Test that FormCache::ExtractNewForms() limits the number of total fields and
+// Test that FormCache::UpdateFormCache() limits the number of total fields and
 // total frames:
 // - the forms [0, kMaxParseableChildFrames) should be unchanged,
 // - the forms [kMaxParseableChildFrames, kMaxParseableFields) should have
@@ -779,7 +732,7 @@
 #else
 #define MAYBE_FieldAndFrameLimit FieldAndFrameLimit
 #endif
-TEST_P(FormCacheIframeBrowserTest, MAYBE_FieldAndFrameLimit) {
+TEST_F(FormCacheIframeBrowserTest, MAYBE_FieldAndFrameLimit) {
   ASSERT_LE(kMaxParseableChildFrames, kMaxParseableFields);
 
   std::string html;
@@ -792,7 +745,7 @@
 
   FormCache form_cache(GetMainFrame());
   FormCache::UpdateFormCacheResult forms =
-      form_cache.ExtractNewForms(/*field_data_manager=*/nullptr);
+      form_cache.UpdateFormCache(/*field_data_manager=*/nullptr);
 
   EXPECT_EQ(forms.updated_forms.size(), kMaxParseableFields);
   EXPECT_TRUE(base::ranges::none_of(forms.updated_forms,
@@ -808,9 +761,4 @@
   EXPECT_TRUE(forms.removed_forms.empty());
 }
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         ParameterizedFormCacheBrowserTest,
-                         testing::Bool());
-INSTANTIATE_TEST_SUITE_P(All, FormCacheIframeBrowserTest, testing::Bool());
-
 }  // namespace autofill
diff --git a/components/autofill/content/renderer/form_cache_test_api.h b/components/autofill/content/renderer/form_cache_test_api.h
index 9889921..c0d88adb 100644
--- a/components/autofill/content/renderer/form_cache_test_api.h
+++ b/components/autofill/content/renderer/form_cache_test_api.h
@@ -39,16 +39,10 @@
 
   size_t parsed_forms_size() { return form_cache_->parsed_forms_.size(); }
 
-  // TODO(crbug/1215333): Remove once the `AutofillUseNewFormExtraction` feature
-  // is launched.
-  size_t parsed_forms_by_renderer_id_size() {
-    return form_cache_->parsed_forms_by_renderer_id_.size();
-  }
-
  private:
   FormCache* form_cache_;
 };
 
 }  // namespace autofill
 
-#endif  // COMPONENTS_AUTOFILL_CONTENT_RENDERER_FORM_CACHE_TEST_API_H_
\ No newline at end of file
+#endif  // COMPONENTS_AUTOFILL_CONTENT_RENDERER_FORM_CACHE_TEST_API_H_
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index be20f26..394a192 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -21,11 +21,11 @@
   output_dir = "$root_gen_dir/components/autofill/core/browser"
 }
 
-action("default_regex_patterns_cc") {
+action("regex_patterns_cc") {
   visibility = [ ":*" ]
   sources = [ "pattern_provider/resources/regex_patterns.json" ]
-  script = "pattern_provider/transpile_default_regex_patterns.py"
-  outputs = [ "$target_gen_dir/pattern_provider/default_regex_patterns.cc" ]
+  script = "pattern_provider/transpile_regex_patterns.py"
+  outputs = [ "$target_gen_dir/pattern_provider/regex_patterns.cc" ]
   args = rebase_path(sources, root_build_dir) +
          rebase_path(outputs, root_build_dir)
 }
@@ -219,11 +219,9 @@
     "metrics/form_events/form_events.h",
     "metrics/payments/virtual_card_enrollment_metrics.cc",
     "metrics/payments/virtual_card_enrollment_metrics.h",
-    "pattern_provider/default_regex_patterns.h",
-    "pattern_provider/pattern_configuration_parser.cc",
-    "pattern_provider/pattern_configuration_parser.h",
     "pattern_provider/pattern_provider.cc",
     "pattern_provider/pattern_provider.h",
+    "pattern_provider/regex_patterns.h",
     "payments/account_info_getter.h",
     "payments/autofill_offer_manager.cc",
     "payments/autofill_offer_manager.h",
@@ -375,7 +373,7 @@
     "webdata/system_encryptor.h",
   ]
 
-  sources += get_target_outputs(":default_regex_patterns_cc")
+  sources += get_target_outputs(":regex_patterns_cc")
 
   if (is_win) {
     sources += [
@@ -454,7 +452,7 @@
   ]
   deps = [
     ":autofill_address_rewriter_resources",
-    ":default_regex_patterns_cc",
+    ":regex_patterns_cc",
     "//base",
     "//base:i18n",
     "//build:branding_buildflags",
@@ -778,9 +776,7 @@
     "logging/log_manager_unittest.cc",
     "logging/log_router_unittest.cc",
     "metrics/autofill_metrics_unittest.cc",
-    "pattern_provider/default_regex_patterns_unittest.cc",
-    "pattern_provider/pattern_configuration_parser_unittest.cc",
-    "pattern_provider/pattern_provider_unittest.cc",
+    "pattern_provider/regex_patterns_unittest.cc",
     "payments/autofill_offer_manager_unittest.cc",
     "payments/credit_card_access_manager_unittest.cc",
     "payments/credit_card_cvc_authenticator_unittest.cc",
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc
index 5f8fc52f..91ee325 100644
--- a/components/autofill/core/browser/autofill_manager.cc
+++ b/components/autofill/core/browser/autofill_manager.cc
@@ -178,13 +178,11 @@
 void AutofillManager::OnFormsSeen(
     const std::vector<FormData>& updated_forms,
     const std::vector<FormGlobalId>& removed_forms) {
-  if (base::FeatureList::IsEnabled(features::kAutofillDisplaceRemovedForms)) {
-    // Erase forms that have been removed from the DOM. This prevents
-    // |form_structures_| from growing up its upper bound
-    // kAutofillManagerMaxFormCacheSize.
-    for (FormGlobalId removed_form : removed_forms)
-      form_structures_.erase(removed_form);
-  }
+  // Erase forms that have been removed from the DOM. This prevents
+  // |form_structures_| from growing up its upper bound
+  // kAutofillManagerMaxFormCacheSize.
+  for (FormGlobalId removed_form : removed_forms)
+    form_structures_.erase(removed_form);
 
   if (!IsValidFormDataVector(updated_forms) || !driver_->RendererIsAvailable())
     return;
diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc
index a112e86..bbeae700 100644
--- a/components/autofill/core/browser/autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/autofill_manager_unittest.cc
@@ -202,32 +202,20 @@
   std::unique_ptr<MockAutofillManager> manager_;
 };
 
-// The test parameters en-/disable kAutofillDisplaceRemovedForms and set the
-// number of forms, respectively.
-class AutofillManagerTest_WithOrWithoutCacheFix_WithIntParam
+// The test parameter sets the number of forms to be generated.
+class AutofillManagerTest_WithIntParam
     : public AutofillManagerTest,
-      public ::testing::WithParamInterface<std::tuple<bool, size_t>> {
+      public ::testing::WithParamInterface<size_t> {
  public:
-  AutofillManagerTest_WithOrWithoutCacheFix_WithIntParam() {
-    scoped_feature_list_.InitWithFeatureState(
-        features::kAutofillDisplaceRemovedForms, displace_removed_forms());
-  }
-
-  bool displace_removed_forms() const { return std::get<0>(GetParam()); }
-  size_t num_forms() const { return std::get<1>(GetParam()); }
-
- protected:
-  base::test::ScopedFeatureList scoped_feature_list_;
+  size_t num_forms() const { return GetParam(); }
 };
 
-INSTANTIATE_TEST_SUITE_P(
-    AutofillManagerTest,
-    AutofillManagerTest_WithOrWithoutCacheFix_WithIntParam,
-    testing::Combine(testing::Bool(), testing::Values(0, 1, 5, 10, 100, 110)));
+INSTANTIATE_TEST_SUITE_P(AutofillManagerTest,
+                         AutofillManagerTest_WithIntParam,
+                         testing::Values(0, 1, 5, 10, 100, 110));
 
 // Tests that the cache size is bounded by kAutofillManagerMaxFormCacheSize.
-TEST_P(AutofillManagerTest_WithOrWithoutCacheFix_WithIntParam,
-       CacheBoundFormsSeen) {
+TEST_P(AutofillManagerTest_WithIntParam, CacheBoundFormsSeen) {
   size_t num_exp_forms =
       std::min(num_forms(), kAutofillManagerMaxFormCacheSize);
   std::vector<FormData> forms = CreateTestForms(num_forms());
@@ -235,33 +223,21 @@
   OnFormsSeenWithExpectations(*manager_, forms, {}, exp_forms);
 }
 
-// Enables kAutofillDisplaceRemovedForms.
-class AutofillManagerTest_WithCacheFix : public AutofillManagerTest {
- public:
-  AutofillManagerTest_WithCacheFix() {
-    scoped_feature_list_.InitAndEnableFeature(
-        features::kAutofillDisplaceRemovedForms);
-  }
-
- protected:
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
 // Tests that removing unseen forms has no effect.
-TEST_F(AutofillManagerTest_WithCacheFix, RemoveUnseenForms) {
+TEST_F(AutofillManagerTest, RemoveUnseenForms) {
   std::vector<FormData> forms = CreateTestForms(9);
   OnFormsSeenWithExpectations(*manager_, {}, GetFormIds(forms), {});
 }
 
 // Tests that all forms can be removed at once.
-TEST_F(AutofillManagerTest_WithCacheFix, RemoveAllForms) {
+TEST_F(AutofillManagerTest, RemoveAllForms) {
   std::vector<FormData> forms = CreateTestForms(9);
   OnFormsSeenWithExpectations(*manager_, forms, {}, forms);
   OnFormsSeenWithExpectations(*manager_, {}, GetFormIds(forms), {});
 }
 
 // Tests that removing some forms leaves the other forms untouched.
-TEST_F(AutofillManagerTest_WithCacheFix, RemoveSomeForms) {
+TEST_F(AutofillManagerTest, RemoveSomeForms) {
   std::vector<FormData> forms = CreateTestForms(9);
   auto range = [&](size_t begin, size_t end) {
     return std::vector<FormData>(forms.begin() + begin, forms.begin() + end);
@@ -272,7 +248,7 @@
 }
 
 // Tests that adding and removing the same forms has no effect.
-TEST_F(AutofillManagerTest_WithCacheFix, UpdateAndRemoveSameForms) {
+TEST_F(AutofillManagerTest, UpdateAndRemoveSameForms) {
   std::vector<FormData> forms = CreateTestForms(9);
   OnFormsSeenWithExpectations(*manager_, forms, GetFormIds(forms), forms);
   OnFormsSeenWithExpectations(*manager_, forms, GetFormIds(forms), forms);
diff --git a/components/autofill/core/browser/pattern_provider/default_regex_patterns.h b/components/autofill/core/browser/pattern_provider/default_regex_patterns.h
deleted file mode 100644
index 3c8607d..0000000
--- a/components/autofill/core/browser/pattern_provider/default_regex_patterns.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PATTERN_PROVIDER_DEFAULT_REGEX_PATTERNS_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_PATTERN_PROVIDER_DEFAULT_REGEX_PATTERNS_H_
-
-#include "components/autofill/core/browser/pattern_provider/pattern_provider.h"
-
-namespace autofill {
-
-PatternProvider::Map CreateDefaultRegexPatterns();
-
-}  // namespace autofill
-
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PATTERN_PROVIDER_DEFAULT_REGEX_PATTERNS_H_
diff --git a/components/autofill/core/browser/pattern_provider/pattern_configuration_parser.cc b/components/autofill/core/browser/pattern_provider/pattern_configuration_parser.cc
deleted file mode 100644
index e373491..0000000
--- a/components/autofill/core/browser/pattern_provider/pattern_configuration_parser.cc
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/autofill/core/browser/pattern_provider/pattern_configuration_parser.h"
-
-#include "base/bind.h"
-#include "base/feature_list.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/task/task_traits.h"
-#include "base/task/thread_pool.h"
-#include "base/values.h"
-#include "components/autofill/core/browser/autofill_type.h"
-#include "components/autofill/core/browser/field_types.h"
-#include "components/autofill/core/browser/pattern_provider/pattern_provider.h"
-#include "components/autofill/core/common/autofill_features.h"
-#include "components/autofill/core/common/language_code.h"
-#include "components/grit/components_resources.h"
-#include "ui/base/resource/resource_bundle.h"
-
-namespace autofill {
-
-namespace field_type_parsing {
-
-namespace {
-
-const char kPositivePatternKey[] = "positive_pattern";
-const char kNegativePatternKey[] = "negative_pattern";
-const char kPositiveScoreKey[] = "positive_score";
-const char kMatchFieldAttributesKey[] = "match_field_attributes";
-const char kMatchFieldInputTypesKey[] = "match_field_input_types";
-const char kVersionKey[] = "version";
-
-// Converts a JSON list like [1,2,3] to a DenseSet<Enum>{1,2,3}, provided that
-// the values are in the range [0, ..., Enum::kMaxValue].
-template <typename Enum>
-absl::optional<DenseSet<Enum>> JsonListToDenseSet(
-    const base::Value* list_value) {
-  if (!list_value)
-    return absl::nullopt;
-
-  DenseSet<Enum> set;
-  for (const base::Value& v : list_value->GetListDeprecated()) {
-    if (!v.is_int())
-      return absl::nullopt;
-    int i = v.GetInt();
-    auto attribute = static_cast<Enum>(i);
-    if (i < 0 || attribute > Enum::kMaxValue)
-      return absl::nullopt;
-    set.insert(attribute);
-  }
-  return set;
-}
-
-bool ParseMatchingPattern(PatternProvider::Map& patterns,
-                          const std::string& field_type,
-                          const LanguageCode& language,
-                          const base::Value& value) {
-  if (!value.is_dict())
-    return false;
-
-  const std::string* positive_pattern =
-      value.FindStringKey(kPositivePatternKey);
-  const std::string* negative_pattern =
-      value.FindStringKey(kNegativePatternKey);
-  absl::optional<double> positive_score =
-      value.FindDoubleKey(kPositiveScoreKey);
-  absl::optional<DenseSet<MatchAttribute>> match_field_attributes =
-      JsonListToDenseSet<MatchAttribute>(
-          value.FindListKey(kMatchFieldAttributesKey));
-  absl::optional<DenseSet<MatchFieldType>> match_field_input_types =
-      JsonListToDenseSet<MatchFieldType>(
-          value.FindListKey(kMatchFieldInputTypesKey));
-
-  if (!positive_pattern || !positive_score || !match_field_attributes ||
-      !match_field_input_types) {
-    return false;
-  }
-
-  MatchingPattern new_pattern;
-  new_pattern.positive_pattern = base::UTF8ToUTF16(*positive_pattern);
-  new_pattern.positive_score = *positive_score;
-  new_pattern.negative_pattern =
-      negative_pattern ? base::UTF8ToUTF16(*negative_pattern) : u"";
-  new_pattern.match_field_attributes = *match_field_attributes;
-  new_pattern.match_field_input_types = *match_field_input_types;
-  new_pattern.language = language;
-
-  std::vector<MatchingPattern>* pattern_list = &patterns[field_type][language];
-  pattern_list->push_back(new_pattern);
-
-  DVLOG(2) << "Correctly parsed MatchingPattern with with type " << field_type
-           << ", language " << language.value() << ", pattern "
-           << new_pattern.positive_pattern << ".";
-
-  return true;
-}
-
-// Callback which is used once the JSON is parsed. If the configuration versions
-// are equal or both unspecified (i.e. set to 0) this prioritizes the remote
-// configuration over the local one.
-void OnJsonParsed(data_decoder::DataDecoder::ValueOrError result) {
-  if (features::kAutofillParsingWithRemotePatternsParam.Get()) {
-    DVLOG(1) << "Remote patterns are disabled.";
-    return;
-  }
-
-  if (!result.value) {
-    DVLOG(1) << "Failed to parse PatternProvider configuration JSON string.";
-    return;
-  }
-
-  base::Version version = ExtractVersionFromJsonObject(result.value.value());
-  absl::optional<PatternProvider::Map> patterns =
-      GetConfigurationFromJsonObject(result.value.value());
-
-  if (patterns && version.IsValid()) {
-    DVLOG(1) << "Successfully parsed PatternProvider configuration.";
-    PatternProvider& pattern_provider = PatternProvider::GetInstance();
-    pattern_provider.SetPatterns(std::move(patterns.value()),
-                                 std::move(version));
-  } else {
-    DVLOG(1) << "Failed to parse PatternProvider configuration JSON object.";
-  }
-}
-
-}  // namespace
-
-absl::optional<PatternProvider::Map> GetConfigurationFromJsonObject(
-    const base::Value& root) {
-  PatternProvider::Map patterns;
-
-  if (!root.is_dict()) {
-    DVLOG(1) << "JSON object is not a dictionary.";
-    return absl::nullopt;
-  }
-
-  for (const auto [field_type, field_type_dict] : root.DictItems()) {
-    if (!field_type_dict.is_dict()) {
-      DVLOG(1) << "|" << field_type << "| does not contain a dictionary.";
-      return absl::nullopt;
-    }
-
-    for (const auto [language, inner_list] : field_type_dict.DictItems()) {
-      if (!inner_list.is_list()) {
-        DVLOG(1) << "Language |" << language << "| in |" << field_type
-                 << "| does not contain a list.";
-        return absl::nullopt;
-      }
-
-      for (const auto& matchingPatternObj : inner_list.GetListDeprecated()) {
-        bool success = ParseMatchingPattern(
-            patterns, field_type, LanguageCode(language), matchingPatternObj);
-        if (!success) {
-          DVLOG(1) << "Found incorrect |MatchingPattern| object in list |"
-                   << field_type << "|, language |" << language << "|.";
-          return absl::nullopt;
-        }
-      }
-    }
-  }
-
-  return absl::make_optional(patterns);
-}
-
-base::Version ExtractVersionFromJsonObject(base::Value& root) {
-  if (!root.is_dict())
-    return base::Version("0");
-
-  absl::optional<base::Value> version_str = root.ExtractKey(kVersionKey);
-  if (!version_str || !version_str.value().is_string())
-    return base::Version("0");
-
-  base::Version version = base::Version(version_str.value().GetString());
-  if (!version.IsValid())
-    return base::Version("0");
-
-  return version;
-}
-
-void PopulateFromJsonString(std::string json_string) {
-  data_decoder::DataDecoder::ParseJsonIsolated(std::move(json_string),
-                                               base::BindOnce(&OnJsonParsed));
-}
-
-absl::optional<PatternProvider::Map>
-GetPatternsFromResourceBundleSynchronously() {
-  if (!ui::ResourceBundle::HasSharedInstance()) {
-    VLOG(1) << "Resource Bundle unavailable to load Autofill Matching Pattern "
-               "definitions.";
-    return absl::nullopt;
-  }
-
-  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
-  std::string resource_string =
-      bundle.LoadDataResourceString(IDR_AUTOFILL_REGEX_JSON);
-  absl::optional<base::Value> json_object =
-      base::JSONReader::Read(resource_string);
-
-  // Discard version, since this is the only getter used in unit tests.
-  base::Version version = ExtractVersionFromJsonObject(json_object.value());
-  absl::optional<PatternProvider::Map> configuration_map =
-      GetConfigurationFromJsonObject(json_object.value());
-
-  return configuration_map;
-}
-
-}  // namespace field_type_parsing
-
-}  // namespace autofill
diff --git a/components/autofill/core/browser/pattern_provider/pattern_configuration_parser.h b/components/autofill/core/browser/pattern_provider/pattern_configuration_parser.h
deleted file mode 100644
index 7f83e50..0000000
--- a/components/autofill/core/browser/pattern_provider/pattern_configuration_parser.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_PATTERN_PROVIDER_PATTERN_CONFIGURATION_PARSER_H_
-#define COMPONENTS_AUTOFILL_CORE_BROWSER_PATTERN_PROVIDER_PATTERN_CONFIGURATION_PARSER_H_
-
-#include <string>
-
-#include "base/callback_helpers.h"
-#include "base/json/json_reader.h"
-#include "base/version.h"
-#include "components/autofill/core/browser/form_parsing/autofill_parsing_utils.h"
-#include "components/autofill/core/browser/pattern_provider/pattern_provider.h"
-#include "services/data_decoder/public/cpp/data_decoder.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
-
-namespace autofill {
-
-namespace field_type_parsing {
-
-// Tries to extract the configuration version from the JSON base::Value tree.
-// This removes the key if found, so that validation is easier later on.
-// If not found, default to version 0.
-base::Version ExtractVersionFromJsonObject(base::Value& root);
-
-// Transforms the parsed JSON base::Value tree into the map used in
-// |PatternProvider|. Requires the version key to already be extracted.
-// The root is expected to be a dictionary with keys corresponding to
-// strings representing |ServerFieldType|. Then there should be
-// second level dictionaries with keys describing the language. These
-// should point to a list of objects representing |MatchingPattern|.
-//  {
-//    "FIELD_NAME": {
-//      "language":[
-//        {MatchingPatternFields}
-//      ]
-//    }
-//  }
-//  An example can be found in the relative resources folder.
-absl::optional<PatternProvider::Map> GetConfigurationFromJsonObject(
-    const base::Value& root);
-
-// Tries to get and parse the default configuration in the resource bundle
-// into a valid map used in |PatternProvider| and swap it in for further use.
-// The callback is used as a signal for testing.
-void PopulateFromResourceBundle(
-    base::OnceClosure done_callback = base::DoNothing());
-
-// Tries to parse the given JSON string into a valid map used in the
-// |PatternProvider| and swap it in for further use.
-void PopulateFromJsonString(std::string json_string);
-
-// Synchronous getter used to set up a test fixture.
-absl::optional<PatternProvider::Map>
-GetPatternsFromResourceBundleSynchronously();
-
-}  // namespace field_type_parsing
-
-}  // namespace autofill
-
-#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PATTERN_PROVIDER_PATTERN_CONFIGURATION_PARSER_H_
diff --git a/components/autofill/core/browser/pattern_provider/pattern_configuration_parser_unittest.cc b/components/autofill/core/browser/pattern_provider/pattern_configuration_parser_unittest.cc
deleted file mode 100644
index 6874493..0000000
--- a/components/autofill/core/browser/pattern_provider/pattern_configuration_parser_unittest.cc
+++ /dev/null
@@ -1,297 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/autofill/core/browser/pattern_provider/pattern_configuration_parser.h"
-
-#include <stddef.h>
-
-#include "base/json/json_reader.h"
-#include "base/test/gtest_util.h"
-#include "base/version.h"
-#include "components/autofill/core/browser/pattern_provider/pattern_provider.h"
-#include "components/autofill/core/common/language_code.h"
-#include "components/grit/components_resources.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/base/resource/resource_bundle.h"
-
-namespace autofill {
-
-namespace field_type_parsing {
-
-// Test that the |base::Value| object of the configuration is
-// parsed to the map structure used by |PatternProvider| as
-// expected, given the input is valid.
-TEST(PatternConfigurationParserTest, WellFormedParsedCorrectly) {
-  std::string json_message = R"(
-    {
-      "version": "1.0",
-      "FULL_NAME": {
-        "en": [
-          {
-            "pattern_identifier": "Name_en",
-            "positive_pattern": "name|full name",
-            "positive_score": 2.0,
-            "negative_pattern": "company",
-            "match_field_attributes": [1],
-            "match_field_input_types": [0,1]
-          }
-        ],
-        "fr": [
-          {
-            "pattern_identifier": "Name_fr",
-            "positive_pattern": "nom|prenom",
-            "positive_score": 2.0,
-            "negative_pattern": "compagne",
-            "match_field_attributes": [1],
-            "match_field_input_types": [0,1]
-          }
-        ]
-      },
-      "ADDRESS": {
-        "en": [
-          {
-            "pattern_identifier": "Address",
-            "positive_pattern": "address",
-            "positive_score": 2.0,
-            "negative_pattern": "email",
-            "match_field_attributes": [1],
-            "match_field_input_types": [0,1]
-          }
-        ]
-      }
-    })";
-  absl::optional<base::Value> json_object =
-      base::JSONReader::Read(json_message);
-
-  ASSERT_TRUE(json_object) << "Incorrectly formatted JSON string.";
-
-  base::Version version = ExtractVersionFromJsonObject(json_object.value());
-  absl::optional<PatternProvider::Map> optional_patterns =
-      GetConfigurationFromJsonObject(json_object.value());
-
-  ASSERT_TRUE(version.IsValid());
-  ASSERT_TRUE(optional_patterns);
-
-  ASSERT_EQ(base::Version("1.0"), version);
-
-  PatternProvider::Map patterns = optional_patterns.value();
-
-  ASSERT_EQ(2U, patterns.size());
-  ASSERT_TRUE(patterns.count("FULL_NAME"));
-  ASSERT_EQ(2U, patterns["FULL_NAME"].size());
-  ASSERT_TRUE(patterns["FULL_NAME"].count(LanguageCode("en")));
-  ASSERT_TRUE(patterns["FULL_NAME"].count(LanguageCode("fr")));
-
-  ASSERT_TRUE(patterns.count("ADDRESS"));
-  ASSERT_EQ(1U, patterns["ADDRESS"].size());
-  ASSERT_TRUE(patterns["ADDRESS"].count(LanguageCode("en")));
-
-  // Test one |MatchingPattern| to check that they are parsed correctly.
-  MatchingPattern* pattern = &patterns["FULL_NAME"][LanguageCode("fr")][0];
-
-  ASSERT_EQ(u"nom|prenom", pattern->positive_pattern);
-  ASSERT_EQ(u"compagne", pattern->negative_pattern);
-  ASSERT_EQ(LanguageCode("fr"), pattern->language);
-  ASSERT_NEAR(2.0, pattern->positive_score, 1e-6);
-}
-
-// Test that the parser does not return anything if some |MatchingPattern|
-// object is missing a property.
-TEST(PatternConfigurationParserTest, MalformedMissingProperty) {
-  std::string json_message = R"(
-    {
-      "version": "1.0",
-      "FULL_NAME": {
-        "en": [
-          {
-            "pattern_identifier": "Name_en",
-            "positive_pattern": "name|full name",
-            "positive_score": 2.0,
-            "negative_pattern": "company",
-            "match_field_attributes": [1],
-            "match_field_input_types": [0,1]
-          }
-        ],
-        "fr": [
-          {
-            "pattern_identifier": "Name_fr",
-            "positive_pattern": "nom|prenom",
-            "negative_pattern": "compagne",
-            "match_field_attributes": [1],
-            "match_field_input_types": [0,1]
-          }
-        ]
-      }
-    })";
-  absl::optional<base::Value> json_object =
-      base::JSONReader::Read(json_message);
-
-  ASSERT_TRUE(json_object) << "Incorrectly formatted JSON string.";
-
-  absl::optional<PatternProvider::Map> optional_patterns =
-      GetConfigurationFromJsonObject(json_object.value());
-
-  ASSERT_FALSE(optional_patterns);
-}
-
-// Test that the parser correctly sets the default version if
-// it is not present in the configuration.
-TEST(PatternConfigurationParserTest, MalformedMissingVersion) {
-  std::string json_message = R"(
-    {
-      "FULL_NAME": {
-        "en": [
-          {
-            "positive_pattern": "name|full name",
-            "positive_score": 2.0,
-            "negative_pattern": "company",
-            "match_field_attributes": [1],
-            "match_field_input_types": [0,1]
-          }
-        ]
-      }
-    })";
-  absl::optional<base::Value> json_object =
-      base::JSONReader::Read(json_message);
-
-  ASSERT_TRUE(json_object) << "Incorrectly formatted JSON string.";
-
-  base::Version version = ExtractVersionFromJsonObject(json_object.value());
-
-  ASSERT_EQ(base::Version("0"), version);
-}
-
-// Test that the parser does not return anything if the inner key points
-// to a single object instead of a list.
-TEST(PatternConfigurationParserTest, MalformedNotListPerLanguage) {
-  std::string json_message = R"(
-    {
-      "FULL_NAME": {
-        "en": {
-          "positive_pattern": "name|full name",
-          "positive_score": 2.0,
-          "negative_pattern": "company",
-          "match_field_attributes": [1],
-          "match_field_input_types": [0,1]
-        }
-      }
-    })";
-  absl::optional<base::Value> json_object =
-      base::JSONReader::Read(json_message);
-
-  ASSERT_TRUE(json_object) << "Incorrectly formatted JSON string.";
-
-  absl::optional<PatternProvider::Map> optional_patterns =
-      GetConfigurationFromJsonObject(json_object.value());
-
-  ASSERT_FALSE(optional_patterns);
-}
-
-// Test that the parser does not return anything if the match_field_attributes
-// are not a list.
-TEST(PatternConfigurationParserTest, MalformedNotListMatchFieldAttributes) {
-  std::string json_message = R"(
-    {
-      "FULL_NAME": {
-        "en": {
-          "positive_pattern": "name|full name",
-          "positive_score": 2.0,
-          "negative_pattern": "company",
-          "match_field_attributes": 1,
-          "match_field_input_types": [0,1]
-        }
-      }
-    })";
-  absl::optional<base::Value> json_object =
-      base::JSONReader::Read(json_message);
-
-  ASSERT_TRUE(json_object) << "Incorrectly formatted JSON string.";
-
-  absl::optional<PatternProvider::Map> optional_patterns =
-      GetConfigurationFromJsonObject(json_object.value());
-
-  ASSERT_FALSE(optional_patterns);
-}
-
-// Test that the parser does not return anything if the match_field_attributes
-// are not a list.
-TEST(PatternConfigurationParserTest, MalformedNotListMatchFieldInputTypes) {
-  std::string json_message = R"(
-    {
-      "FULL_NAME": {
-        "en": {
-          "positive_pattern": "name|full name",
-          "positive_score": 2.0,
-          "negative_pattern": "company",
-          "match_field_attributes": [0],
-          "match_field_input_types": 0
-        }
-      }
-    })";
-  absl::optional<base::Value> json_object =
-      base::JSONReader::Read(json_message);
-
-  ASSERT_TRUE(json_object) << "Incorrectly formatted JSON string.";
-
-  absl::optional<PatternProvider::Map> optional_patterns =
-      GetConfigurationFromJsonObject(json_object.value());
-
-  ASSERT_FALSE(optional_patterns);
-}
-
-// Test that the parser does not return anything if the match_field_attributes
-// are out of bounds.
-TEST(PatternConfigurationParserTest, MalformedInvalidMatchingAttributes) {
-  std::string json_message = R"(
-    {
-      "FULL_NAME": {
-        "en": {
-          "positive_pattern": "name|full name",
-          "positive_score": 2.0,
-          "negative_pattern": "company",
-          "match_field_attributes": [-1],
-          "match_field_input_types": [0,1]
-        }
-      }
-    })";
-  absl::optional<base::Value> json_object =
-      base::JSONReader::Read(json_message);
-
-  ASSERT_TRUE(json_object) << "Incorrectly formatted JSON string.";
-
-  absl::optional<PatternProvider::Map> optional_patterns =
-      GetConfigurationFromJsonObject(json_object.value());
-
-  ASSERT_FALSE(optional_patterns);
-}
-
-// Test that the parser does not return anything if the match_field_input_types
-// are out of bounds.
-TEST(PatternConfigurationParserTest, MalformedInvalidMatchingFieldTypes) {
-  std::string json_message = R"(
-    {
-      "FULL_NAME": {
-        "en": {
-          "positive_pattern": "name|full name",
-          "positive_score": 2.0,
-          "negative_pattern": "company",
-          "match_field_attributes": [0],
-          "match_field_input_types": [0,999]
-        }
-      }
-    })";
-  absl::optional<base::Value> json_object =
-      base::JSONReader::Read(json_message);
-
-  ASSERT_TRUE(json_object) << "Incorrectly formatted JSON string.";
-
-  absl::optional<PatternProvider::Map> optional_patterns =
-      GetConfigurationFromJsonObject(json_object.value());
-
-  ASSERT_FALSE(optional_patterns);
-}
-
-}  // namespace field_type_parsing
-
-}  // namespace autofill
diff --git a/components/autofill/core/browser/pattern_provider/pattern_provider.cc b/components/autofill/core/browser/pattern_provider/pattern_provider.cc
index a81bdb2..637b968e 100644
--- a/components/autofill/core/browser/pattern_provider/pattern_provider.cc
+++ b/components/autofill/core/browser/pattern_provider/pattern_provider.cc
@@ -13,8 +13,7 @@
 #include "base/no_destructor.h"
 #include "components/autofill/core/browser/autofill_type.h"
 #include "components/autofill/core/browser/form_parsing/autofill_parsing_utils.h"
-#include "components/autofill/core/browser/pattern_provider/default_regex_patterns.h"
-#include "components/autofill/core/browser/pattern_provider/pattern_configuration_parser.h"
+#include "components/autofill/core/browser/pattern_provider/regex_patterns.h"
 #include "components/autofill/core/common/autofill_features.h"
 
 namespace autofill {
@@ -22,10 +21,12 @@
 namespace {
 const char* kSourceCodeLanguage = "en";
 
+using Map =
+    std::map<std::string, std::map<LanguageCode, std::vector<MatchingPattern>>>;
+
 // Adds the English patterns, restricted to MatchAttribute::kName, to
 // every other language.
-void EnrichPatternsWithEnVersion(
-    PatternProvider::Map* type_and_lang_to_patterns) {
+void EnrichPatternsWithEnVersion(Map* type_and_lang_to_patterns) {
   DCHECK(type_and_lang_to_patterns);
   for (auto& [type, lang_to_patterns] : *type_and_lang_to_patterns) {
     auto it = lang_to_patterns.find(LanguageCode(kSourceCodeLanguage));
@@ -45,7 +46,7 @@
 }
 
 // Sorts patterns in descending order by their score.
-void SortPatternsByScore(PatternProvider::Map* type_and_lang_to_patterns) {
+void SortPatternsByScore(Map* type_and_lang_to_patterns) {
   for (auto& [type, lang_to_patterns] : *type_and_lang_to_patterns) {
     for (auto& [page_language, patterns] : lang_to_patterns) {
       std::sort(patterns.begin(), patterns.end(),
@@ -62,7 +63,7 @@
   static base::NoDestructor<PatternProvider> instance;
   static bool initialized = false;
   if (!initialized) {
-    instance->SetPatterns(CreateDefaultRegexPatterns(), base::Version());
+    instance->SetPatterns(CreateRegexPatterns());
     initialized = true;
   }
   return *instance;
@@ -71,17 +72,11 @@
 PatternProvider::PatternProvider() = default;
 PatternProvider::~PatternProvider() = default;
 
-void PatternProvider::SetPatterns(PatternProvider::Map patterns,
-                                  const base::Version& version) {
+void PatternProvider::SetPatterns(PatternProvider::Map patterns) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  if (!pattern_version_.IsValid() ||
-      (version.IsValid() && pattern_version_ <= version)) {
-    patterns_ = std::move(patterns);
-    pattern_version_ = version;
-    EnrichPatternsWithEnVersion(&patterns_);
-    SortPatternsByScore(&patterns_);
-  }
+  patterns_ = std::move(patterns);
+  EnrichPatternsWithEnVersion(&patterns_);
+  SortPatternsByScore(&patterns_);
 }
 
 const std::vector<MatchingPattern> PatternProvider::GetMatchPatterns(
@@ -115,11 +110,6 @@
 }
 
 const std::vector<MatchingPattern> PatternProvider::GetAllPatternsByType(
-    ServerFieldType type) const {
-  return GetAllPatternsByType(AutofillType::ServerFieldTypeToString(type));
-}
-
-const std::vector<MatchingPattern> PatternProvider::GetAllPatternsByType(
     const std::string& type) const {
   auto it = patterns_.find(type);
   if (it == patterns_.end())
diff --git a/components/autofill/core/browser/pattern_provider/pattern_provider.h b/components/autofill/core/browser/pattern_provider/pattern_provider.h
index 4c33a74..4f5f615 100644
--- a/components/autofill/core/browser/pattern_provider/pattern_provider.h
+++ b/components/autofill/core/browser/pattern_provider/pattern_provider.h
@@ -24,17 +24,9 @@
 // ways to load the data in for further use.
 class PatternProvider {
  public:
-  // The outer keys are field types or other pattern names. The inner keys are
-  // page languages in lower case.
-  using Map = std::map<std::string,
-                       std::map<LanguageCode, std::vector<MatchingPattern>>>;
-
   // Returns a reference to the global Pattern Provider.
   static PatternProvider& GetInstance();
 
-  // Setter for loading patterns from external storage.
-  void SetPatterns(const Map patterns, const base::Version& version);
-
   // Finds the patterns for a given ServerFieldType and for a given
   // |page_language|.
   const std::vector<MatchingPattern> GetMatchPatterns(
@@ -50,10 +42,6 @@
 
   // Finds all patterns, across all languages, for a given server field |type|.
   const std::vector<MatchingPattern> GetAllPatternsByType(
-      ServerFieldType type) const;
-
-  // Finds all patterns, across all languages, for a given server field |type|.
-  const std::vector<MatchingPattern> GetAllPatternsByType(
       const std::string& type) const;
 
  protected:
@@ -61,10 +49,18 @@
   ~PatternProvider();
 
  private:
+  // The outer keys are field types or other pattern names. The inner keys are
+  // page languages in lower case.
+  using Map = std::map<std::string,
+                       std::map<LanguageCode, std::vector<MatchingPattern>>>;
+
   FRIEND_TEST_ALL_PREFIXES(AutofillPatternProviderTest, TestDefaultEqualsJson);
 
   friend class base::NoDestructor<PatternProvider>;
 
+  // Setter for loading patterns from external storage.
+  void SetPatterns(Map patterns);
+
   // Sequence checker to ensure thread-safety for pattern swapping.
   // All functions accessing the |patterns_| member variable are
   // expected to be called from the UI thread.
@@ -73,9 +69,6 @@
   // Local map to store a vector of patterns keyed by field type and
   // page language.
   Map patterns_;
-
-  // Version for keeping track which pattern set is currently used.
-  base::Version pattern_version_;
 };
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/pattern_provider/pattern_provider_unittest.cc b/components/autofill/core/browser/pattern_provider/pattern_provider_unittest.cc
deleted file mode 100644
index dd5ddbf..0000000
--- a/components/autofill/core/browser/pattern_provider/pattern_provider_unittest.cc
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "base/task/thread_pool.h"
-#include "base/test/gtest_util.h"
-#include "base/test/scoped_feature_list.h"
-#include "base/test/task_environment.h"
-#include "components/autofill/core/browser/autofill_type.h"
-#include "components/autofill/core/browser/field_types.h"
-#include "components/autofill/core/browser/form_parsing/autofill_parsing_utils.h"
-#include "components/autofill/core/browser/pattern_provider/pattern_configuration_parser.h"
-#include "components/autofill/core/browser/pattern_provider/pattern_provider.h"
-#include "components/autofill/core/common/autofill_features.h"
-#include "components/autofill/core/common/language_code.h"
-#include "components/grit/components_resources.h"
-#include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/base/resource/resource_bundle.h"
-
-namespace autofill {
-
-namespace {
-
-LanguageCode kLanguageDe("de");
-LanguageCode kLanguageEn("en");
-
-base::FieldTrialParams GetFeatureParams(bool language_dependent) {
-  base::FieldTrialParams feature_parameters{
-      {features::kAutofillParsingWithLanguageSpecificPatternsParam.name,
-       language_dependent ? "true" : "false"}};
-  return feature_parameters;
-}
-
-MatchingPattern GetCompanyPatternEn() {
-  autofill::MatchingPattern m_p;
-  m_p.positive_pattern = u"company|business|organization|organisation";
-  m_p.positive_score = 1.1;
-  m_p.negative_pattern = u"";
-  m_p.match_field_attributes = {MatchAttribute::kName};
-  m_p.match_field_input_types = {MatchFieldType::kText};
-  m_p.language = kLanguageEn;
-  return m_p;
-}
-
-MatchingPattern GetCompanyPatternDe() {
-  autofill::MatchingPattern m_p;
-  m_p.positive_pattern = u"|(?<!con)firma|firmenname";
-  m_p.positive_score = 1.1;
-  m_p.negative_pattern = u"";
-  m_p.match_field_attributes = {MatchAttribute::kLabel, MatchAttribute::kName};
-  m_p.match_field_input_types = {MatchFieldType::kText};
-  m_p.language = kLanguageDe;
-  return m_p;
-}
-
-// Pattern Provider with custom values set for testing.
-class UnitTestPatternProvider : public PatternProvider {
- public:
-  UnitTestPatternProvider()
-      : UnitTestPatternProvider({GetCompanyPatternDe()},
-                                {GetCompanyPatternEn()}) {}
-
-  UnitTestPatternProvider(const std::vector<MatchingPattern>& de_patterns,
-                          const std::vector<MatchingPattern>& en_patterns) {
-    Map patterns;
-    auto& company_patterns =
-        patterns[AutofillType::ServerFieldTypeToString(COMPANY_NAME)];
-    company_patterns[kLanguageDe] = de_patterns;
-    company_patterns[kLanguageEn] = en_patterns;
-    SetPatterns(std::move(patterns), base::Version());
-  }
-};
-
-// Called when the JSON bundle has been parsed, and sets the PatternProvider's
-// patterns.
-void OnJsonParsed(base::OnceClosure done_callback,
-                  data_decoder::DataDecoder::ValueOrError result) {
-  base::Version version =
-      field_type_parsing::ExtractVersionFromJsonObject(result.value.value());
-  absl::optional<PatternProvider::Map> patterns =
-      field_type_parsing::GetConfigurationFromJsonObject(result.value.value());
-  ASSERT_TRUE(patterns);
-  ASSERT_TRUE(version.IsValid());
-  PatternProvider& pattern_provider = PatternProvider::GetInstance();
-  pattern_provider.SetPatterns(std::move(patterns.value()), std::move(version));
-  std::move(done_callback).Run();
-}
-
-// Loads the string from the Resource Bundle on a worker thread.
-void LoadPatternsFromResourceBundle() {
-  ASSERT_TRUE(ui::ResourceBundle::HasSharedInstance());
-  ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance();
-  base::RunLoop run_loop;
-  base::ThreadPool::PostTaskAndReplyWithResult(
-      FROM_HERE, {base::MayBlock()},
-      base::BindOnce(&ui::ResourceBundle::LoadDataResourceString,
-                     base::Unretained(&bundle), IDR_AUTOFILL_REGEX_JSON),
-      base::BindOnce(
-          [](base::OnceClosure done_callback, std::string resource_string) {
-            data_decoder::DataDecoder::ParseJsonIsolated(
-                std::move(resource_string),
-                base::BindOnce(&OnJsonParsed, std::move(done_callback)));
-          },
-          run_loop.QuitClosure()));
-  run_loop.Run();
-}
-
-}  // namespace
-
-bool operator==(const MatchingPattern& mp1, const MatchingPattern& mp2) {
-  return mp1.language == mp2.language &&
-         mp1.positive_pattern == mp2.positive_pattern &&
-         mp1.negative_pattern == mp2.negative_pattern &&
-         mp1.positive_score == mp2.positive_score &&
-         mp1.match_field_attributes == mp2.match_field_attributes &&
-         mp1.match_field_input_types == mp2.match_field_input_types;
-}
-
-TEST(AutofillPatternProviderTest, Single_Match) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeatureWithParameters(
-      features::kAutofillParsingPatternProvider,
-      GetFeatureParams(/*language_dependent=*/true));
-
-  UnitTestPatternProvider p;
-  EXPECT_THAT(p.GetMatchPatterns("COMPANY_NAME", kLanguageEn),
-              ::testing::ElementsAre(GetCompanyPatternEn()));
-  EXPECT_THAT(
-      p.GetMatchPatterns("COMPANY_NAME", kLanguageDe),
-      ::testing::ElementsAre(GetCompanyPatternDe(), GetCompanyPatternEn()));
-}
-
-TEST(AutofillPatternProviderTest, BasedOnMatchType) {
-  UnitTestPatternProvider p;
-  EXPECT_THAT(
-      p.GetAllPatternsByType("COMPANY_NAME"),
-      ::testing::ElementsAre(GetCompanyPatternDe(), GetCompanyPatternEn()));
-}
-
-TEST(AutofillPatternProviderTest, TestDefaultEqualsJson) {
-  base::test::TaskEnvironment task_environment_;
-  data_decoder::test::InProcessDataDecoder in_process_data_decoder_;
-
-  auto default_version = PatternProvider::GetInstance().pattern_version_;
-  auto default_patterns = PatternProvider::GetInstance().patterns_;
-
-  // We want to make sure that the JSON loading actually does set the patterns.
-  // To this end, manipulate the current patterns. Then |default_patterns| can
-  // only be identical to |json_patterns| if loading the JSON updates the
-  // patterns.
-  PatternProvider::GetInstance().patterns_.clear();
-  ASSERT_NE(default_patterns, PatternProvider::GetInstance().patterns_);
-
-  // Load the JSON explicitly from the file.
-  LoadPatternsFromResourceBundle();
-
-  auto json_version = PatternProvider::GetInstance().pattern_version_;
-  auto json_patterns = PatternProvider::GetInstance().patterns_;
-
-  EXPECT_FALSE(default_version.IsValid());
-  EXPECT_TRUE(json_version.IsValid());
-  EXPECT_EQ(default_patterns, json_patterns);
-}
-
-TEST(AutofillPatternProviderTest, UnknownLanguages) {
-  {
-    base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitAndEnableFeatureWithParameters(
-        features::kAutofillParsingPatternProvider,
-        GetFeatureParams(/*language_dependent=*/true));
-    UnitTestPatternProvider p;
-    EXPECT_EQ(p.GetMatchPatterns(COMPANY_NAME, LanguageCode("")),
-              p.GetAllPatternsByType(COMPANY_NAME));
-    EXPECT_EQ(p.GetMatchPatterns(COMPANY_NAME, LanguageCode("io")),
-              p.GetAllPatternsByType(COMPANY_NAME));
-  }
-
-  {
-    base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitAndEnableFeatureWithParameters(
-        features::kAutofillParsingPatternProvider,
-        GetFeatureParams(/*language_dependent=*/false));
-    UnitTestPatternProvider p;
-    EXPECT_EQ(p.GetMatchPatterns(COMPANY_NAME, LanguageCode("")),
-              p.GetAllPatternsByType(COMPANY_NAME));
-    EXPECT_EQ(p.GetMatchPatterns(COMPANY_NAME, LanguageCode("io")),
-              p.GetAllPatternsByType(COMPANY_NAME));
-  }
-}
-
-TEST(AutofillPatternProviderTest, EnrichPatternsWithEnVersion) {
-  {
-    base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitAndEnableFeatureWithParameters(
-        features::kAutofillParsingPatternProvider,
-        GetFeatureParams(/*language_dependent=*/true));
-    UnitTestPatternProvider p;
-    EXPECT_EQ(p.GetMatchPatterns(COMPANY_NAME, kLanguageEn),
-              std::vector<MatchingPattern>{GetCompanyPatternEn()});
-    EXPECT_EQ(p.GetMatchPatterns(COMPANY_NAME, kLanguageDe),
-              std::vector<MatchingPattern>(
-                  {GetCompanyPatternDe(), GetCompanyPatternEn()}));
-  }
-
-  {
-    base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitAndEnableFeatureWithParameters(
-        features::kAutofillParsingPatternProvider,
-        GetFeatureParams(/*language_dependent=*/false));
-    UnitTestPatternProvider p;
-    EXPECT_EQ(p.GetMatchPatterns(COMPANY_NAME, kLanguageEn),
-              std::vector<MatchingPattern>(
-                  {GetCompanyPatternDe(), GetCompanyPatternEn()}));
-    EXPECT_EQ(p.GetMatchPatterns(COMPANY_NAME, kLanguageDe),
-              std::vector<MatchingPattern>(
-                  {GetCompanyPatternDe(), GetCompanyPatternEn()}));
-  }
-}
-
-TEST(AutofillPatternProviderTest, SortPatternsByScore) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeatureWithParameters(
-      features::kAutofillParsingPatternProvider,
-      GetFeatureParams(/*language_dependent=*/true));
-  std::vector<MatchingPattern> de_input_patterns;
-  de_input_patterns.push_back(GetCompanyPatternDe());
-  de_input_patterns.push_back(GetCompanyPatternDe());
-  de_input_patterns.push_back(GetCompanyPatternDe());
-  de_input_patterns.push_back(GetCompanyPatternDe());
-  de_input_patterns[0].positive_score = 3.0;
-  de_input_patterns[1].positive_score = 1.0;
-  de_input_patterns[2].positive_score = 5.0;
-  de_input_patterns[3].positive_score = 3.0;
-  UnitTestPatternProvider p(de_input_patterns, {});
-  const std::vector<MatchingPattern>& de_patterns =
-      p.GetMatchPatterns(COMPANY_NAME, kLanguageDe);
-  ASSERT_EQ(de_patterns.size(), de_input_patterns.size());
-  EXPECT_EQ(de_patterns[0].positive_score, 5.0);
-  EXPECT_EQ(de_patterns[1].positive_score, 3.0);
-  EXPECT_EQ(de_patterns[2].positive_score, 3.0);
-  EXPECT_EQ(de_patterns[3].positive_score, 1.0);
-}
-
-}  // namespace autofill
diff --git a/components/autofill/core/browser/pattern_provider/regex_patterns.h b/components/autofill/core/browser/pattern_provider/regex_patterns.h
new file mode 100644
index 0000000..7f1478da
--- /dev/null
+++ b/components/autofill/core/browser/pattern_provider/regex_patterns.h
@@ -0,0 +1,17 @@
+// 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_AUTOFILL_CORE_BROWSER_PATTERN_PROVIDER_REGEX_PATTERNS_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_PATTERN_PROVIDER_REGEX_PATTERNS_H_
+
+#include "components/autofill/core/browser/pattern_provider/pattern_provider.h"
+
+namespace autofill {
+
+std::map<std::string, std::map<LanguageCode, std::vector<MatchingPattern>>>
+CreateRegexPatterns();
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_PATTERN_PROVIDER_REGEX_PATTERNS_H_
diff --git a/components/autofill/core/browser/pattern_provider/default_regex_patterns_unittest.cc b/components/autofill/core/browser/pattern_provider/regex_patterns_unittest.cc
similarity index 96%
rename from components/autofill/core/browser/pattern_provider/default_regex_patterns_unittest.cc
rename to components/autofill/core/browser/pattern_provider/regex_patterns_unittest.cc
index 58a65dd..22bf809 100644
--- a/components/autofill/core/browser/pattern_provider/default_regex_patterns_unittest.cc
+++ b/components/autofill/core/browser/pattern_provider/regex_patterns_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/autofill/core/browser/pattern_provider/default_regex_patterns.h"
+#include "components/autofill/core/browser/pattern_provider/regex_patterns.h"
 
 // Keep these tests in sync with
 // components/autofill/core/browser/autofill_regexes_unittest.cc.
@@ -35,9 +35,8 @@
 };
 
 // Returns whether at least one of |patterns| matches |sample|.
-bool MatchesAnyPattern(
-    const std::string& sample,
-    const std::vector<MatchingPattern>& patterns) {
+bool MatchesAnyPattern(const std::string& sample,
+                       const std::vector<MatchingPattern>& patterns) {
   std::u16string utf16_sample = base::UTF8ToUTF16(sample);
 
   // Returns whether |pattern| matches |utf16_sample|.
@@ -79,7 +78,7 @@
 
   const std::vector<MatchingPattern> patterns =
       PatternProvider::GetInstance().GetMatchPatterns(pattern_name,
-                                                       LanguageCode(language));
+                                                      LanguageCode(language));
 
   EXPECT_EQ(is_positive_sample, MatchesAnyPattern(sample, patterns));
 }
diff --git a/components/autofill/core/browser/pattern_provider/transpile_default_regex_patterns.py b/components/autofill/core/browser/pattern_provider/transpile_regex_patterns.py
similarity index 93%
rename from components/autofill/core/browser/pattern_provider/transpile_default_regex_patterns.py
rename to components/autofill/core/browser/pattern_provider/transpile_regex_patterns.py
index cc0e3e8..23e96c6 100755
--- a/components/autofill/core/browser/pattern_provider/transpile_default_regex_patterns.py
+++ b/components/autofill/core/browser/pattern_provider/transpile_regex_patterns.py
@@ -75,7 +75,7 @@
   output('// found in the LICENSE file.\n')
   output('\n')
   output('#include "components/autofill/core/browser/pattern_provider/'\
-               'default_regex_patterns.h"\n')
+               'regex_patterns.h"\n')
   output('#include "components/autofill/core/common/language_code.h"\n')
   output('\n')
   output('namespace autofill {\n')
@@ -91,7 +91,9 @@
   output('\n')
   output('}  // namespace\n')
   output('\n')
-  output('PatternProvider::Map CreateDefaultRegexPatterns() {\n')
+  output('std::map<std::string,')
+  output('         std::map<LanguageCode, std::vector<MatchingPattern>>>');
+  output('CreateRegexPatterns() {\n')
   output('  struct JsonPattern {\n')
   output('    const char* name;\n')
   output('    const char* language;\n')
@@ -105,7 +107,9 @@
   for line in build_cpp_map_population(cpp):
     output(line)
     output('\n')
-  output('  PatternProvider::Map map;\n')
+  output('  std::map<std::string,')
+  output('           std::map<LanguageCode, std::vector<MatchingPattern>>>');
+  output('  map;\n')
   output('  size_t len = sizeof(patterns) / sizeof(patterns[0]);\n')
   output('  for (size_t i = 0; i < len; ++i) {\n')
   output('    const JsonPattern& p = patterns[i];\n')
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc
index bb1f9a85..7141eb1 100644
--- a/components/autofill/core/common/autofill_features.cc
+++ b/components/autofill/core/common/autofill_features.cc
@@ -120,12 +120,6 @@
 const base::Feature kAutofillDisableFilling{"AutofillDisableFilling",
                                             base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Controls whether to displace removed forms in both FormCache and
-// AutofillManager.
-// TODO(crbug.com/1215333): Remove the feature when the experiment is completed.
-const base::Feature kAutofillDisplaceRemovedForms{
-    "AutofillDisplaceRemovedForms", base::FEATURE_DISABLED_BY_DEFAULT};
-
 // Kill switch for Autofill address import.
 const base::Feature kAutofillDisableAddressImport{
     "AutofillDisableAddressImport", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h
index 3291694c4..767ec63 100644
--- a/components/autofill/core/common/autofill_features.h
+++ b/components/autofill/core/common/autofill_features.h
@@ -60,8 +60,6 @@
 COMPONENT_EXPORT(AUTOFILL)
 extern const base::Feature kAutofillDisableAddressImport;
 COMPONENT_EXPORT(AUTOFILL)
-extern const base::Feature kAutofillDisplaceRemovedForms;
-COMPONENT_EXPORT(AUTOFILL)
 extern const base::Feature kAutofillEnableAccountWalletStorage;
 COMPONENT_EXPORT(AUTOFILL)
 extern const base::Feature kAutofillEnableAugmentedPhoneCountryCode;
diff --git a/components/autofill/core/common/form_data.cc b/components/autofill/core/common/form_data.cc
index 8932740..b78899ab 100644
--- a/components/autofill/core/common/form_data.cc
+++ b/components/autofill/core/common/form_data.cc
@@ -144,49 +144,6 @@
   return true;
 }
 
-bool FormData::IdentityComparator::operator()(const FormData& a,
-                                              const FormData& b) const {
-  // |unique_renderer_id| uniquely identifies the form, if and only if it is
-  // set; the other members compared below together uniquely identify the form
-  // as well.
-  auto tie = [](const FormData& f) {
-    return std::tie(f.host_frame, f.unique_renderer_id, f.name, f.id_attribute,
-                    f.name_attribute, f.url, f.action, f.is_form_tag);
-  };
-  if (tie(a) < tie(b))
-    return true;
-  if (tie(b) < tie(a))
-    return false;
-  // A less-than relation on FormData::child_frames.
-  auto less_child_frames =
-      [](const std::vector<FrameTokenWithPredecessor>& as,
-         const std::vector<FrameTokenWithPredecessor>& bs) {
-        return base::ranges::lexicographical_compare(
-            as, bs, [](const auto& a, const auto& b) {
-              return std::tie(a.token, a.predecessor) <
-                     std::tie(b.token, b.predecessor);
-            });
-      };
-  if (less_child_frames(a.child_frames, b.child_frames))
-    return true;
-  if (less_child_frames(b.child_frames, a.child_frames))
-    return false;
-  return base::ranges::lexicographical_compare(
-      a.fields, b.fields, FormFieldData::IdentityComparator());
-}
-
-// Used for `Autofill.ExtractNewForms.ShallowEqualityDiffersFromDeepEquality`
-// metric. These values are persisted to logs. Entries should not be renumbered
-// and numeric values should never be reused.
-// TODO(crbug/1215333): Remove after the `AutofillUseNewFormExtraction`
-// feature is deleted.
-enum class FormDataEquality {
-  kShallowCompEnough = 0,
-  kDeepCompNeeded = 1,
-  kEqualForms = 2,
-  kMaxValue = kEqualForms,
-};
-
 // static
 bool FormData::DeepEqual(const FormData& a, const FormData& b) {
   // We compare all unique identifiers first, including the field renderer IDs,
@@ -196,9 +153,6 @@
       !base::ranges::equal(a.fields, b.fields, {},
                            &FormFieldData::unique_renderer_id,
                            &FormFieldData::unique_renderer_id)) {
-    UMA_HISTOGRAM_ENUMERATION(
-        "Autofill.ExtractNewForms.ShallowEqualityDiffersFromDeepEquality",
-        FormDataEquality::kShallowCompEnough);
     return false;
   }
 
@@ -206,14 +160,8 @@
       a.name_attribute != b.name_attribute || a.url != b.url ||
       a.action != b.action || a.is_form_tag != b.is_form_tag ||
       !base::ranges::equal(a.fields, b.fields, &FormFieldData::DeepEqual)) {
-    UMA_HISTOGRAM_ENUMERATION(
-        "Autofill.ExtractNewForms.ShallowEqualityDiffersFromDeepEquality",
-        FormDataEquality::kDeepCompNeeded);
     return false;
   }
-  UMA_HISTOGRAM_ENUMERATION(
-      "Autofill.ExtractNewForms.ShallowEqualityDiffersFromDeepEquality",
-      FormDataEquality::kEqualForms);
   return true;
 }
 
@@ -338,9 +286,4 @@
   return buffer;
 }
 
-bool FormDataEqualForTesting(const FormData& lhs, const FormData& rhs) {
-  FormData::IdentityComparator less;
-  return !less(lhs, rhs) && !less(rhs, lhs);
-}
-
 }  // namespace autofill
diff --git a/components/autofill/core/common/form_data.h b/components/autofill/core/common/form_data.h
index 0555e056..1f65bc4c 100644
--- a/components/autofill/core/common/form_data.h
+++ b/components/autofill/core/common/form_data.h
@@ -134,14 +134,6 @@
 // [4] https://html.spec.whatwg.org/multipage/input.html#attr-input-type
 // clang-format on
 struct FormData {
-  // Less-than relation for STL containers. Compares only members needed to
-  // uniquely identify a form.
-  // TODO(crbug.com/1215333): Remove once `AutofillUseNewFormExtraction` is
-  // launched.
-  struct IdentityComparator {
-    bool operator()(const FormData& a, const FormData& b) const;
-  };
-
   // Returns true if all members of forms |a| and |b| are identical.
   static bool DeepEqual(const FormData& a, const FormData& b);
 
@@ -287,8 +279,6 @@
 
 LogBuffer& operator<<(LogBuffer& buffer, const FormData& form);
 
-bool FormDataEqualForTesting(const FormData& lhs, const FormData& rhs);
-
 }  // namespace autofill
 
 #endif  // COMPONENTS_AUTOFILL_CORE_COMMON_FORM_DATA_H_
diff --git a/components/autofill/core/common/mojom/autofill_types_mojom_traits_unittest.cc b/components/autofill/core/common/mojom/autofill_types_mojom_traits_unittest.cc
index 98bfa5d8..b3f8d8f 100644
--- a/components/autofill/core/common/mojom/autofill_types_mojom_traits_unittest.cc
+++ b/components/autofill/core/common/mojom/autofill_types_mojom_traits_unittest.cc
@@ -27,12 +27,6 @@
                                            "Option4"};
 namespace {
 
-template <typename T>
-bool EquivalentData(const T& a, const T& b) {
-  typename T::IdentityComparator less;
-  return !less(a, b) && !less(b, a);
-}
-
 void CreateTestFieldDataPredictions(const std::string& signature,
                                     FormFieldDataPredictions* field_predict) {
   field_predict->host_form_signature = "TestHostFormSignature";
@@ -86,12 +80,12 @@
                                     const PasswordFormFillData& actual) {
   EXPECT_EQ(expected.form_renderer_id, actual.form_renderer_id);
   EXPECT_EQ(expected.action, actual.action);
-  EXPECT_TRUE(
-      EquivalentData(test::WithoutUnserializedData(expected.username_field),
-                     actual.username_field));
-  EXPECT_TRUE(
-      EquivalentData(test::WithoutUnserializedData(expected.password_field),
-                     actual.password_field));
+  EXPECT_TRUE(FormFieldData::DeepEqual(
+      test::WithoutUnserializedData(expected.username_field),
+      actual.username_field));
+  EXPECT_TRUE(FormFieldData::DeepEqual(
+      test::WithoutUnserializedData(expected.password_field),
+      actual.password_field));
   EXPECT_EQ(expected.preferred_realm, actual.preferred_realm);
   EXPECT_EQ(expected.uses_account_store, actual.uses_account_store);
 
@@ -133,7 +127,7 @@
 class AutofillTypeTraitsTestImpl : public testing::Test,
                                    public mojom::TypeTraitsTest {
  public:
-  AutofillTypeTraitsTestImpl() {}
+  AutofillTypeTraitsTestImpl() = default;
 
   mojo::PendingRemote<mojom::TypeTraitsTest> GetTypeTraitsTestRemote() {
     mojo::PendingRemote<mojom::TypeTraitsTest> remote;
@@ -191,7 +185,8 @@
                          base::OnceClosure closure,
                          const FormFieldData& passed) {
   EXPECT_TRUE(passed.host_frame.is_empty());
-  EXPECT_TRUE(EquivalentData(test::WithoutUnserializedData(expected), passed));
+  EXPECT_TRUE(FormFieldData::DeepEqual(test::WithoutUnserializedData(expected),
+                                       passed));
   EXPECT_EQ(expected.value, passed.value);
   EXPECT_EQ(expected.user_input, passed.user_input);
   std::move(closure).Run();
@@ -201,7 +196,8 @@
                     base::OnceClosure closure,
                     const FormData& passed) {
   EXPECT_TRUE(passed.host_frame.is_empty());
-  EXPECT_TRUE(EquivalentData(test::WithoutUnserializedData(expected), passed));
+  EXPECT_TRUE(
+      FormData::DeepEqual(test::WithoutUnserializedData(expected), passed));
   std::move(closure).Run();
 }
 
diff --git a/components/custom_handlers/BUILD.gn b/components/custom_handlers/BUILD.gn
index b09e34f..b036c5a4 100644
--- a/components/custom_handlers/BUILD.gn
+++ b/components/custom_handlers/BUILD.gn
@@ -16,6 +16,7 @@
 
   deps = [
     "//build:chromeos_buildflags",
+    "//components/keyed_service/content",
     "//components/keyed_service/core",
     "//components/pref_registry",
     "//components/prefs",
@@ -44,12 +45,15 @@
 source_set("test_support") {
   testonly = true
   sources = [
+    "simple_protocol_handler_registry_factory.cc",
+    "simple_protocol_handler_registry_factory.h",
     "test_protocol_handler_registry_delegate.cc",
     "test_protocol_handler_registry_delegate.h",
   ]
   deps = [
     ":custom_handlers",
     "//base",
+    "//components/keyed_service/content",
   ]
 }
 
@@ -74,3 +78,21 @@
     "//third_party/blink/public/common:headers",
   ]
 }
+
+source_set("browser_tests") {
+  testonly = true
+  defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
+  sources = [ "protocol_handler_registry_browsertest.cc" ]
+  deps = [
+    ":custom_handlers",
+    ":test_support",
+    "//base/test:test_support",
+    "//components/keyed_service/content",
+    "//content/shell:content_shell_lib",
+    "//content/test:browsertest_support",
+    "//content/test:test_support",
+    "//net:test_support",
+    "//testing/gmock",
+    "//testing/gtest",
+  ]
+}
diff --git a/components/custom_handlers/DEPS b/components/custom_handlers/DEPS
index 0379ae6..ba81a85 100644
--- a/components/custom_handlers/DEPS
+++ b/components/custom_handlers/DEPS
@@ -10,6 +10,8 @@
   "+content/public/common",
   "+content/public/test",
   "+net/base",
+  "+content/shell",
+  "+net/test/embedded_test_server",
   "+third_party/blink/public/common",
   "+services/network/public/cpp",
   "+ui/base/l10n",
diff --git a/components/custom_handlers/protocol_handler_registry_browsertest.cc b/components/custom_handlers/protocol_handler_registry_browsertest.cc
new file mode 100644
index 0000000..dfb3f14
--- /dev/null
+++ b/components/custom_handlers/protocol_handler_registry_browsertest.cc
@@ -0,0 +1,200 @@
+// Copyright (c) 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <memory>
+#include <string>
+
+#include "base/scoped_observation.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
+#include "components/custom_handlers/protocol_handler.h"
+#include "components/custom_handlers/protocol_handler_registry.h"
+#include "components/custom_handlers/simple_protocol_handler_registry_factory.h"
+#include "content/public/browser/navigation_controller.h"
+#include "content/public/browser/navigation_entry.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/common/content_client.h"
+#include "content/public/common/content_features.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/content_browser_test.h"
+#include "content/public/test/content_browser_test_utils.h"
+#include "content/public/test/fenced_frame_test_util.h"
+#include "content/shell/browser/shell.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+
+using content::WebContents;
+
+namespace {
+
+using custom_handlers::ProtocolHandlerRegistry;
+
+class ProtocolHandlerChangeWaiter : public ProtocolHandlerRegistry::Observer {
+ public:
+  explicit ProtocolHandlerChangeWaiter(ProtocolHandlerRegistry* registry) {
+    registry_observation_.Observe(registry);
+  }
+  ProtocolHandlerChangeWaiter(const ProtocolHandlerChangeWaiter&) = delete;
+  ProtocolHandlerChangeWaiter& operator=(const ProtocolHandlerChangeWaiter&) =
+      delete;
+  ~ProtocolHandlerChangeWaiter() override = default;
+
+  void Wait() { run_loop_.Run(); }
+  // ProtocolHandlerRegistry::Observer:
+  void OnProtocolHandlerRegistryChanged() override { run_loop_.Quit(); }
+
+ private:
+  base::ScopedObservation<custom_handlers::ProtocolHandlerRegistry,
+                          custom_handlers::ProtocolHandlerRegistry::Observer>
+      registry_observation_{this};
+  base::RunLoop run_loop_;
+};
+
+}  // namespace
+
+namespace custom_handlers {
+
+class RegisterProtocolHandlerBrowserTest : public content::ContentBrowserTest {
+ public:
+  RegisterProtocolHandlerBrowserTest() = default;
+
+  void SetUpOnMainThread() override {
+    embedded_test_server()->ServeFilesFromSourceDirectory(
+        "components/test/data/");
+  }
+
+  void AddProtocolHandler(const std::string& protocol, const GURL& url) {
+    ProtocolHandler handler =
+        ProtocolHandler::CreateProtocolHandler(protocol, url);
+    ProtocolHandlerRegistry* registry =
+        SimpleProtocolHandlerRegistryFactory::GetForBrowserContext(
+            browser_context(), true);
+    // Fake that this registration is happening on profile startup. Otherwise
+    // it'll try to register with the OS, which causes DCHECKs on Windows when
+    // running as admin on Windows 7.
+    registry->SetIsLoading(true);
+    registry->OnAcceptRegisterProtocolHandler(handler);
+    registry->SetIsLoading(true);
+    ASSERT_TRUE(registry->IsHandledProtocol(protocol));
+  }
+
+  void RemoveProtocolHandler(const std::string& protocol, const GURL& url) {
+    ProtocolHandler handler =
+        ProtocolHandler::CreateProtocolHandler(protocol, url);
+    ProtocolHandlerRegistry* registry =
+        SimpleProtocolHandlerRegistryFactory::GetForBrowserContext(
+            browser_context(), true);
+    registry->RemoveHandler(handler);
+    ASSERT_FALSE(registry->IsHandledProtocol(protocol));
+  }
+
+  content::WebContents* web_contents() { return shell()->web_contents(); }
+  content::BrowserContext* browser_context() {
+    return web_contents()->GetBrowserContext();
+  }
+
+ protected:
+  content::test::FencedFrameTestHelper& fenced_frame_test_helper() {
+    return fenced_frame_helper_;
+  }
+
+ private:
+  content::test::FencedFrameTestHelper fenced_frame_helper_;
+};
+
+IN_PROC_BROWSER_TEST_F(RegisterProtocolHandlerBrowserTest, CustomHandler) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  GURL handler_url = embedded_test_server()->GetURL("/custom_handler.html");
+  AddProtocolHandler("news", handler_url);
+
+  ASSERT_TRUE(NavigateToURL(shell(), GURL("news:test"), handler_url));
+
+  ASSERT_EQ(handler_url, web_contents()->GetLastCommittedURL());
+
+  // Also check redirects.
+  GURL redirect_url =
+      embedded_test_server()->GetURL("/server-redirect?news:test");
+  ASSERT_TRUE(NavigateToURL(shell(), redirect_url, handler_url));
+
+  ASSERT_EQ(handler_url, web_contents()->GetLastCommittedURL());
+}
+
+// https://crbug.com/178097: Implement registerProtocolHandler on Android
+#if !BUILDFLAG(IS_ANDROID)
+// FencedFrames can not register to handle any protocols.
+IN_PROC_BROWSER_TEST_F(RegisterProtocolHandlerBrowserTest, FencedFrame) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  ASSERT_TRUE(
+      NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html")));
+
+  // Create a FencedFrame.
+  content::RenderFrameHost* fenced_frame_host =
+      fenced_frame_test_helper().CreateFencedFrame(
+          web_contents()->GetMainFrame(),
+          embedded_test_server()->GetURL("/fenced_frames/title1.html"));
+  ASSERT_TRUE(fenced_frame_host);
+
+  // Ensure the registry is currently empty.
+  GURL url("web+search:testing");
+  ProtocolHandlerRegistry* registry =
+      SimpleProtocolHandlerRegistryFactory::GetForBrowserContext(
+          browser_context(), true);
+  ASSERT_EQ(0u, registry->GetHandlersFor(url.scheme()).size());
+
+  // Attempt to add an entry.
+  ProtocolHandlerChangeWaiter waiter(registry);
+  ASSERT_TRUE(content::ExecuteScript(fenced_frame_host,
+                                     "navigator.registerProtocolHandler('web+"
+                                     "search', 'test.html?%s', 'test');"));
+  waiter.Wait();
+
+  // Ensure the registry is still empty.
+  ASSERT_EQ(0u, registry->GetHandlersFor(url.scheme()).size());
+}
+#endif
+
+// https://crbug.com/178097: Implement registerProtocolHandler on Android
+#if !BUILDFLAG(IS_ANDROID)
+class RegisterProtocolHandlerAndServiceWorkerInterceptor
+    : public RegisterProtocolHandlerBrowserTest {
+ public:
+  void SetUpOnMainThread() override {
+    RegisterProtocolHandlerBrowserTest::SetUpOnMainThread();
+
+    ASSERT_TRUE(embedded_test_server()->Start());
+
+    // Navigate to the test page.
+    ASSERT_TRUE(NavigateToURL(
+        shell(), embedded_test_server()->GetURL(
+                     "/protocol_handler/service_workers/"
+                     "test_protocol_handler_and_service_workers.html")));
+  }
+};
+
+// TODO(crbug.com/1204127): Fix flakiness.
+IN_PROC_BROWSER_TEST_F(RegisterProtocolHandlerAndServiceWorkerInterceptor,
+                       DISABLED_RegisterFetchListenerForHTMLHandler) {
+  // Register a service worker intercepting requests to the HTML handler.
+  EXPECT_EQ(true,
+            content::EvalJs(shell(), "registerFetchListenerForHTMLHandler();"));
+
+  {
+    // Register a HTML handler with a user gesture.
+    ProtocolHandlerRegistry* registry =
+        SimpleProtocolHandlerRegistryFactory::GetForBrowserContext(
+            browser_context(), true);
+    ProtocolHandlerChangeWaiter waiter(registry);
+    ASSERT_TRUE(content::ExecJs(shell(), "registerHTMLHandler();"));
+    waiter.Wait();
+  }
+
+  // Verify that a page with the registered scheme is managed by the service
+  // worker, not the HTML handler.
+  EXPECT_EQ(true,
+            content::EvalJs(shell(),
+                            "pageWithCustomSchemeHandledByServiceWorker();"));
+}
+#endif
+
+}  // namespace custom_handlers
diff --git a/components/custom_handlers/simple_protocol_handler_registry_factory.cc b/components/custom_handlers/simple_protocol_handler_registry_factory.cc
new file mode 100644
index 0000000..de310882
--- /dev/null
+++ b/components/custom_handlers/simple_protocol_handler_registry_factory.cc
@@ -0,0 +1,66 @@
+// Copyright (c) 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/custom_handlers/simple_protocol_handler_registry_factory.h"
+
+#include <memory>
+
+#include "base/no_destructor.h"
+#include "build/build_config.h"
+#include "components/custom_handlers/protocol_handler_registry.h"
+#include "components/custom_handlers/test_protocol_handler_registry_delegate.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+
+namespace custom_handlers {
+
+// static
+SimpleProtocolHandlerRegistryFactory*
+SimpleProtocolHandlerRegistryFactory::GetInstance() {
+  static base::NoDestructor<SimpleProtocolHandlerRegistryFactory> factory;
+  return factory.get();
+}
+
+// static
+ProtocolHandlerRegistry*
+SimpleProtocolHandlerRegistryFactory::GetForBrowserContext(
+    content::BrowserContext* context,
+    bool create) {
+  return static_cast<ProtocolHandlerRegistry*>(
+      GetInstance()->GetServiceForBrowserContext(context, create));
+}
+
+SimpleProtocolHandlerRegistryFactory::SimpleProtocolHandlerRegistryFactory()
+    : BrowserContextKeyedServiceFactory(
+          "ProtocolHandlerRegistry",
+          BrowserContextDependencyManager::GetInstance()) {}
+
+// Will be created when initializing profile_io_data, so we might
+// as well have the framework create this along with other
+// PKSs to preserve orderly civic conduct :)
+bool SimpleProtocolHandlerRegistryFactory::ServiceIsCreatedWithBrowserContext()
+    const {
+  return true;
+}
+
+// Do not create this service for tests. MANY tests will fail
+// due to the threading requirements of this service. ALSO,
+// not creating this increases test isolation (which is GOOD!)
+bool SimpleProtocolHandlerRegistryFactory::ServiceIsNULLWhileTesting() const {
+  return true;
+}
+
+KeyedService* SimpleProtocolHandlerRegistryFactory::BuildServiceInstanceFor(
+    content::BrowserContext* context) const {
+  // We can't ensure the UserPref has been set, so we pass a nullptr
+  // PrefService.
+  ProtocolHandlerRegistry* registry = new ProtocolHandlerRegistry(
+      nullptr, std::make_unique<TestProtocolHandlerRegistryDelegate>());
+
+  // Must be called as a part of the creation process.
+  registry->InitProtocolSettings();
+
+  return registry;
+}
+
+}  // namespace custom_handlers
diff --git a/components/custom_handlers/simple_protocol_handler_registry_factory.h b/components/custom_handlers/simple_protocol_handler_registry_factory.h
new file mode 100644
index 0000000..a1b0f64
--- /dev/null
+++ b/components/custom_handlers/simple_protocol_handler_registry_factory.h
@@ -0,0 +1,67 @@
+// Copyright (c) 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_CUSTOM_HANDLERS_SIMPLE_PROTOCOL_HANDLER_REGISTRY_FACTORY_H_
+#define COMPONENTS_CUSTOM_HANDLERS_SIMPLE_PROTOCOL_HANDLER_REGISTRY_FACTORY_H_
+
+#include "base/no_destructor.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+namespace custom_handlers {
+
+class ProtocolHandlerRegistry;
+
+// Simgleton that owns all the ProtocolHandlerRegistrys and associates them with
+// BrowserContext instances.
+//
+// It creates the Registry instances without access to the PrefService storage.
+// This is useful for testing purposes, since we can't be sure the UserPref
+// storage has been set (eg, Web Platform Tests).
+//
+// It uses the TestProtocolHandlerRegistryDelegate, hence it doesn't provide any
+// OS integration during the registration process.
+//
+// It does not override the GetBrowserContextToUse method from
+// BrowserContextKeyedServiceFactory, which means that no service is returned in
+// Incognito.
+class SimpleProtocolHandlerRegistryFactory
+    : public BrowserContextKeyedServiceFactory {
+ public:
+  // Returns the singleton instance of the ProtocolHandlerRegistryFactory.
+  static SimpleProtocolHandlerRegistryFactory* GetInstance();
+
+  // Returns the ProtocolHandlerRegistry that provides intent registration for
+  // |context|. Ownership stays with this factory object.
+  // Allows the caller to indicate that the KeyedService should not be created
+  // if it's not registered. This is particularly useful for testings purposes,
+  // since the TestBrowserContext doesn't implement the TwoPhaseShutdown of
+  // KeyedService instances.
+  static ProtocolHandlerRegistry* GetForBrowserContext(
+      content::BrowserContext* context,
+      bool create = false);
+
+  SimpleProtocolHandlerRegistryFactory(
+      const SimpleProtocolHandlerRegistryFactory&) = delete;
+  SimpleProtocolHandlerRegistryFactory& operator=(
+      const SimpleProtocolHandlerRegistryFactory&) = delete;
+
+ protected:
+  // BrowserContextKeyedServiceFactory implementation.
+  bool ServiceIsCreatedWithBrowserContext() const override;
+  bool ServiceIsNULLWhileTesting() const override;
+
+ private:
+  friend class base::NoDestructor<SimpleProtocolHandlerRegistryFactory>;
+
+  SimpleProtocolHandlerRegistryFactory();
+  ~SimpleProtocolHandlerRegistryFactory() override = default;
+
+  // BrowserContextKeyedServiceFactory implementation.
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* profile) const override;
+};
+
+}  // namespace custom_handlers
+
+#endif  // COMPONENTS_CUSTOM_HANDLERS_SIMPLE_PROTOCOL_HANDLER_REGISTRY_FACTORY_H
diff --git a/components/exo/data_device.cc b/components/exo/data_device.cc
index 870f67a..66b4dac 100644
--- a/components/exo/data_device.cc
+++ b/components/exo/data_device.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/run_loop.h"
+#include "build/chromeos_buildflags.h"
 #include "components/exo/data_device_delegate.h"
 #include "components/exo/data_exchange_delegate.h"
 #include "components/exo/data_offer.h"
diff --git a/components/exo/data_device_unittest.cc b/components/exo/data_device_unittest.cc
index 2590f00..aa279a4 100644
--- a/components/exo/data_device_unittest.cc
+++ b/components/exo/data_device_unittest.cc
@@ -12,6 +12,7 @@
 #include "ash/shell.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind.h"
+#include "build/chromeos_buildflags.h"
 #include "components/exo/data_device_delegate.h"
 #include "components/exo/data_exchange_delegate.h"
 #include "components/exo/data_offer.h"
diff --git a/components/exo/wayland/zcr_touchpad_haptics.cc b/components/exo/wayland/zcr_touchpad_haptics.cc
index 4c44948d..55281655 100644
--- a/components/exo/wayland/zcr_touchpad_haptics.cc
+++ b/components/exo/wayland/zcr_touchpad_haptics.cc
@@ -10,6 +10,7 @@
 
 #include "base/feature_list.h"
 #include "base/logging.h"
+#include "build/chromeos_buildflags.h"
 #include "components/exo/wayland/server_util.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/events/devices/haptic_touchpad_effects.h"
diff --git a/components/flags_ui/resources/flags.html b/components/flags_ui/resources/flags.html
index bbc88ba9..4fca8d2 100644
--- a/components/flags_ui/resources/flags.html
+++ b/components/flags_ui/resources/flags.html
@@ -12,7 +12,7 @@
 <title>$i18n{title}</title>
 
 <link rel="stylesheet" href="flags.css">
-<if expr="lacros or chromeos">
+<if expr="chromeos_lacros or chromeos_ash">
   <link rel="stylesheet" href="chrome://resources/css/os_header.css">
 </if>
 
@@ -45,7 +45,7 @@
 </div>
 <div id="body-container" style="visibility:hidden">
   <div id="flagsTemplate">
-<if expr="lacros or chromeos">
+<if expr="chromeos_lacros or chromeos_ash">
     <div class="os-link-container" id="os-link-container">
       <span id="os-flags-link-container" class="os-link-icon"></span>
       <span aria-hidden="true" id="os-link-desc">$i18n{os-flags-text1}</span>
@@ -63,7 +63,7 @@
     <div class="blurb-container">
       <span class="blurb-warning">$i18n{page-warning}</span>
       <span>$i18n{page-warning-explanation}</span>
-<if expr="chromeos">
+<if expr="chromeos_ash">
       <p id="owner-warning">$i18n{owner-warning}</p>
 </if>
     </div>
diff --git a/components/metrics/metrics_log.h b/components/metrics/metrics_log.h
index 728afa2..355d7b4 100644
--- a/components/metrics/metrics_log.h
+++ b/components/metrics/metrics_log.h
@@ -18,6 +18,7 @@
 #include "base/metrics/histogram_base.h"
 #include "base/strings/string_piece_forward.h"
 #include "base/time/time.h"
+#include "build/chromeos_buildflags.h"
 #include "components/metrics/metrics_reporting_default_state.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/metrics_proto/chrome_user_metrics_extension.pb.h"
diff --git a/components/password_manager/content/browser/content_password_manager_driver_unittest.cc b/components/password_manager/content/browser/content_password_manager_driver_unittest.cc
index 14b3605..628ffbc 100644
--- a/components/password_manager/content/browser/content_password_manager_driver_unittest.cc
+++ b/components/password_manager/content/browser/content_password_manager_driver_unittest.cc
@@ -184,7 +184,7 @@
 }
 
 MATCHER_P(FormDataEqualTo, form_data, "") {
-  return autofill::FormDataEqualForTesting(arg, form_data);
+  return autofill::FormData::DeepEqual(arg, form_data);
 }
 
 }  // namespace
diff --git a/components/password_manager/core/browser/password_form_manager_unittest.cc b/components/password_manager/core/browser/password_form_manager_unittest.cc
index c7109267..efb62a6 100644
--- a/components/password_manager/core/browser/password_form_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_form_manager_unittest.cc
@@ -118,7 +118,7 @@
 }
 
 MATCHER_P(FormDataPointeeEqualTo, form_data, "") {
-  return autofill::FormDataEqualForTesting(*arg, form_data);
+  return autofill::FormData::DeepEqual(*arg, form_data);
 }
 
 class MockPasswordManagerDriver : public StubPasswordManagerDriver {
@@ -188,9 +188,7 @@
   EXPECT_EQ(expected.username_element, actual.username_element);
   EXPECT_EQ(expected.password_element, actual.password_element);
   EXPECT_EQ(expected.blocked_by_user, actual.blocked_by_user);
-  FormData::IdentityComparator less;
-  EXPECT_FALSE(less(expected.form_data, actual.form_data));
-  EXPECT_FALSE(less(actual.form_data, expected.form_data));
+  EXPECT_TRUE(FormData::DeepEqual(expected.form_data, actual.form_data));
 }
 
 struct ExpectedGenerationUKM {
diff --git a/components/password_manager/core/browser/password_save_manager_impl_unittest.cc b/components/password_manager/core/browser/password_save_manager_impl_unittest.cc
index d05e850c..d4139bb6 100644
--- a/components/password_manager/core/browser/password_save_manager_impl_unittest.cc
+++ b/components/password_manager/core/browser/password_save_manager_impl_unittest.cc
@@ -72,7 +72,7 @@
   EXPECT_EQ(expected.password_element, actual.password_element);
   EXPECT_EQ(expected.blocked_by_user, actual.blocked_by_user);
   EXPECT_TRUE(
-      autofill::FormDataEqualForTesting(expected.form_data, actual.form_data));
+      autofill::FormData::DeepEqual(expected.form_data, actual.form_data));
 }
 
 struct ExpectedGenerationUKM {
diff --git a/components/prefs/pref_service.h b/components/prefs/pref_service.h
index 9e6bc4a..41be3d16 100644
--- a/components/prefs/pref_service.h
+++ b/components/prefs/pref_service.h
@@ -27,6 +27,7 @@
 #include "base/time/time.h"
 #include "base/values.h"
 #include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
 #include "components/prefs/persistent_pref_store.h"
 #include "components/prefs/pref_value_store.h"
 #include "components/prefs/prefs_export.h"
diff --git a/components/printing/renderer/print_render_frame_helper.h b/components/printing/renderer/print_render_frame_helper.h
index 0235941..cd26f9e 100644
--- a/components/printing/renderer/print_render_frame_helper.h
+++ b/components/printing/renderer/print_render_frame_helper.h
@@ -16,6 +16,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
 #include "cc/paint/paint_canvas.h"
 #include "components/printing/common/print.mojom.h"
 #include "content/public/renderer/render_frame_observer.h"
diff --git a/components/resources/autofill_regex_resources.grdp b/components/resources/autofill_regex_resources.grdp
deleted file mode 100644
index 844aaaf..0000000
--- a/components/resources/autofill_regex_resources.grdp
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<grit-part>
-  <include name="IDR_AUTOFILL_REGEX_JSON" file="../autofill/core/browser/pattern_provider/resources/regex_patterns.json" type="BINDATA" compress="brotli" />
-</grit-part>
diff --git a/components/resources/components_resources.grd b/components/resources/components_resources.grd
index 60f6613..c5a41e3 100644
--- a/components/resources/components_resources.grd
+++ b/components/resources/components_resources.grd
@@ -14,7 +14,6 @@
   <release seq="1">
     <includes>
       <part file="about_ui_resources.grdp" />
-      <part file="autofill_regex_resources.grdp" />
       <part file="dom_distiller_resources.grdp" />
       <part file="flags_ui_resources.grdp" />
       <part file="management_resources.grdp" />
diff --git a/chrome/test/data/custom_handler.html b/components/test/data/custom_handler.html
similarity index 100%
rename from chrome/test/data/custom_handler.html
rename to components/test/data/custom_handler.html
diff --git a/chrome/test/data/protocol_handler/service_workers/fetch_listener_for_html_handler.js b/components/test/data/protocol_handler/service_workers/fetch_listener_for_html_handler.js
similarity index 87%
rename from chrome/test/data/protocol_handler/service_workers/fetch_listener_for_html_handler.js
rename to components/test/data/protocol_handler/service_workers/fetch_listener_for_html_handler.js
index 1f61c10..87b2d6a 100644
--- a/chrome/test/data/protocol_handler/service_workers/fetch_listener_for_html_handler.js
+++ b/components/test/data/protocol_handler/service_workers/fetch_listener_for_html_handler.js
@@ -3,8 +3,9 @@
 // found in the LICENSE file.
 
 self.addEventListener('fetch', function(event) {
-  if (!event.request.url.includes('handler.html'))
+  if (!event.request.url.includes('handler.html')) {
     return;
+  }
 
   event.respondWith(new Response(
       `<script>
diff --git a/chrome/test/data/protocol_handler/service_workers/handler.html b/components/test/data/protocol_handler/service_workers/handler.html
similarity index 100%
rename from chrome/test/data/protocol_handler/service_workers/handler.html
rename to components/test/data/protocol_handler/service_workers/handler.html
diff --git a/chrome/test/data/protocol_handler/service_workers/test_protocol_handler_and_service_workers.html b/components/test/data/protocol_handler/service_workers/test_protocol_handler_and_service_workers.html
similarity index 100%
rename from chrome/test/data/protocol_handler/service_workers/test_protocol_handler_and_service_workers.html
rename to components/test/data/protocol_handler/service_workers/test_protocol_handler_and_service_workers.html
diff --git a/chrome/test/data/protocol_handler/service_workers/test_protocol_handler_and_service_workers.js b/components/test/data/protocol_handler/service_workers/test_protocol_handler_and_service_workers.js
similarity index 87%
rename from chrome/test/data/protocol_handler/service_workers/test_protocol_handler_and_service_workers.js
rename to components/test/data/protocol_handler/service_workers/test_protocol_handler_and_service_workers.js
index a47b4290..dfd1944 100644
--- a/chrome/test/data/protocol_handler/service_workers/test_protocol_handler_and_service_workers.js
+++ b/components/test/data/protocol_handler/service_workers/test_protocol_handler_and_service_workers.js
@@ -26,16 +26,16 @@
   a.href = url;
   a.rel = 'opener';
   a.target = '_blank';
-  let handled_by_service_worker;
+  let handledByServiceWorker;
   await new Promise(resolve => {
     window.addEventListener('message', function(event) {
-      handled_by_service_worker = event.data.handled_by_service_worker;
+      handledByServiceWorker = event.data.handled_by_service_worker;
       event.source.close();
       resolve();
-    }, {once: true})
+    }, {once: true});
     a.click();
   });
-  return handled_by_service_worker;
+  return handledByServiceWorker;
 }
 
 function pageWithCustomSchemeHandledByServiceWorker() {
diff --git a/components/test/data/title1.html b/components/test/data/title1.html
new file mode 100644
index 0000000..2526072
--- /dev/null
+++ b/components/test/data/title1.html
@@ -0,0 +1,4 @@
+<html>
+<head></head>
+<body>This page has no title.</body>
+</html>
diff --git a/components/test/data/webcrypto/aes_ctr.json b/components/test/data/webcrypto/aes_ctr.json
deleted file mode 100644
index 62c0b5a..0000000
--- a/components/test/data/webcrypto/aes_ctr.json
+++ /dev/null
@@ -1,82 +0,0 @@
-[
-  // From https://www.rfc-editor.org/rfc/rfc3686.txt
-  // Test Vector #3: Encrypting 36 octets using AES-CTR with 128-bit key
-  {
-    "key": "7691BE035E5020A8AC6E618529F9A0DC",
-    "plain_text": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223",
-    "counter": "00E0017B27777F3F4A1786F000000001",
-    "length": 32,
-    "cipher_text": "C1CF48A89F2FFDD9CF4652E9EFDB72D74540A42BDE6D7836D59A5CEAAEF3105325B2072F"
-  },
-
-  // From https://www.rfc-editor.org/rfc/rfc3686.txt
-  // Test Vector #8: Encrypting 32 octets using AES-CTR with 256-bit key
-  {
-    "key": "F6D66D6BD52D59BB0796365879EFF886C66DD51A5B6A99744B50590C87A23884",
-    "plain_text": "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F",
-    "counter": "00FAAC24C1585EF15A43D87500000001",
-    "length": 32,
-    "cipher_text": "F05E231B3894612C49EE000B804EB2A9B8306B508F839D6A5530831D9344AF1C"
-  },
-
-  // Empty plaintext, using a 256-bit key.
-  {
-    "key": "F6D66D6BD52D59BB0796365879EFF886C66DD51A5B6A99744B50590C87A23884",
-    "plain_text": "",
-    "counter": "00FAAC24C1585EF15A43D87500000001",
-    "length": 32,
-    "cipher_text": ""
-  },
-
-  // 32-bit counter wrap-around (manually constructed).
-  //
-  // Starts a 32-bit counter at 0xFFFFFFFF and encrypts 3 blocks worth of data.
-  // The counter will wrap around and take on values of 0 and 1.
-  {
-    "key": "F6D66D6BD52D59BB0796365879EFF886C66DD51A5B6A99744B50590C87A23884",
-    "plain_text": "F05E231B3894612C49EE000B804EB2A9B8306B508F839D6A5530831D9344AF1CC1CF48A89F2FFDD9CF4652E9EFDB72D7",
-    "counter": "00FAAC24C1585EF15A43D875FFFFFFFF",
-    "length": 32,
-    "cipher_text": "2E32E02FF9E69A1D6B78AC4308A67592C5DD5505589B79183D4189619A1467E4319069B0A3BE9AF28EA158E96398CE71"
-  },
-
-  // 1-bit counter wrap-around (manually constructed).
-  //
-  // Starts a 1-bit counter at 1 and encrypts 2 blocks worth of data.
-  {
-    "key": "7691BE035E5020A8AC6E618529F9A0DC",
-    "plain_text": "C05E231B3894612C49EE000B804EB2A6B8306B508F839D6A5530831D9344AF1C",
-    "counter": "00FAAC24C1585EF15A43D875000000FF",
-    "length": 1,
-    "cipher_text": "52334727723A84F4278FB319386CD7B5587DD8B2D9AA394D83EF8A826C4761AA"
-  },
-
-  // 4-bit counter wrap-around (manually constructed).
-  //
-  // Starts a 4-bit counter at 14 and encrypts 3 blocks worth of data.
-  {
-    "key": "7691BE035E5020A8AC6E618529F9A0DC",
-    "plain_text": "C05E231B3894612C49EE000B804EB2A6B8306B508F839D6A5530831D9344AF1C1415161718191A1B1C1D1E1F20212223",
-    "counter": "00FAAC24C1585EF15A43D8750000111E",
-    "length": 4,
-    "cipher_text": "5573894046DEF46162ED54966A22D8F0517B61A0CE7E657A5A5124A7F62AAE149A3C7856711C59D67F34F31374CF7A72"
-  },
-
-  // Same test as above, however the plaintext/ciphertext is not a multiple of block size.
-  {
-    "key": "7691BE035E5020A8AC6E618529F9A0DC",
-    "plain_text": "C05E231B3894612C49EE000B804EB2A6B8306B508F839D6A5530831D9344AF1C1415161718191A1B1C1D1E1F20",
-    "counter": "00FAAC24C1585EF15A43D8750000111E",
-    "length": 4,
-    "cipher_text": "5573894046DEF46162ED54966A22D8F0517B61A0CE7E657A5A5124A7F62AAE149A3C7856711C59D67F34F31374"
-  },
-
-  // 128-bit counter wrap-around (manually constructed).
-  {
-    "key": "7691BE035E5020A8AC6E618529F9A0DC",
-    "plain_text": "C05E231B3894612C49EE000B804EB2A6B8306B508F839D6A5530831D9344AF1C1415161718191A1B1C1D1E1F20212223",
-    "counter": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE",
-    "length": 128,
-    "cipher_text": "D2C49B275BC73814DC90ECE98959041C9A3481F2247E08B0AF5D8DE3F521C9DAF535B0A8156DF9D2370EE7328103C8AD"
-  }
-]
diff --git a/components/version_ui/resources/about_version.html b/components/version_ui/resources/about_version.html
index 42cabec4..a813b676 100644
--- a/components/version_ui/resources/about_version.html
+++ b/components/version_ui/resources/about_version.html
@@ -21,7 +21,7 @@
 <if expr="is_android or is_ios">
     <link rel="stylesheet" href="about_version_mobile.css">
 </if>
-<if expr="lacros or chromeos">
+<if expr="chromeos_lacros or chromeos_ash">
     <link rel="stylesheet" href="chrome://resources/css/os_header.css">
 </if>
 
@@ -29,7 +29,7 @@
   </head>
 
   <body>
-<if expr="lacros or chromeos">
+<if expr="chromeos_lacros or chromeos_ash">
     <div class="os-link-container-container" id="os-link-container" hidden>
       <div class="os-link-container">
         <span class="os-link-icon"></span>
@@ -87,7 +87,7 @@
             <span>$i18n{cl}</span>
           </td>
         </tr>
-<if expr="not chromeos">
+<if expr="not chromeos_ash">
         <tr>
           <td class="label">$i18n{os_name}</td>
           <td class="version" id="os_type">
@@ -109,7 +109,7 @@
           </td>
         </tr>
 </if>
-<if expr="chromeos">
+<if expr="chromeos_ash">
         <tr>
           <td class="label">$i18n{platform}</td>
           <td class="version" id="os_type">
diff --git a/components/version_ui/resources/about_version.js b/components/version_ui/resources/about_version.js
index 71bf0e2..3e76d61 100644
--- a/components/version_ui/resources/about_version.js
+++ b/components/version_ui/resources/about_version.js
@@ -41,7 +41,7 @@
   $('profile_path').textContent = profilePath;
 }
 
-// <if expr="chromeos or is_win">
+// <if expr="chromeos_ash or is_win">
 /**
  * Callback from the backend with the OS version to display.
  * @param {string} osVersion The OS version to display.
@@ -51,7 +51,7 @@
 }
 // </if>
 
-// <if expr="chromeos">
+// <if expr="chromeos_ash">
 /**
  * Callback from the backend with the firmware version to display.
  * @param {string} firmwareVersion
@@ -111,10 +111,10 @@
 
 /* All the work we do onload. */
 function onLoadWork() {
-  // <if expr="chromeos or is_win">
+  // <if expr="chromeos_ash or is_win">
   addWebUIListener('return-os-version', returnOsVersion);
   // </if>
-  // <if expr="chromeos">
+  // <if expr="chromeos_ash">
   addWebUIListener('return-os-firmware-version', returnOsFirmwareVersion);
   addWebUIListener('return-arc-version', returnARCVersion);
   // </if>
@@ -123,12 +123,12 @@
   // </if>
 
   chrome.send('requestVersionInfo');
-  const includeVariationsCmd = location.search.includes("show-variations-cmd");
+  const includeVariationsCmd = location.search.includes('show-variations-cmd');
   sendWithPromise('requestVariationInfo', includeVariationsCmd)
       .then(handleVariationInfo);
   sendWithPromise('requestPathInfo').then(handlePathInfo);
 
-  // <if expr="chromeos">
+  // <if expr="chromeos_ash">
   $('arc_holder').hidden = true;
   chrome.chromeosInfoPrivate.get(['customizationId'], returnCustomizationId);
   // </if>
diff --git a/components/viz/service/display/overlay_processor_using_strategy.h b/components/viz/service/display/overlay_processor_using_strategy.h
index 629e155a..07b65d0 100644
--- a/components/viz/service/display/overlay_processor_using_strategy.h
+++ b/components/viz/service/display/overlay_processor_using_strategy.h
@@ -14,6 +14,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
 #include "components/viz/common/quads/aggregated_render_pass.h"
 #include "components/viz/service/display/display_resource_provider.h"
 #include "components/viz/service/display/output_surface.h"
diff --git a/components/webcrypto/algorithms/aes_ctr_unittest.cc b/components/webcrypto/algorithms/aes_ctr_unittest.cc
index de633028..c91ea0f00 100644
--- a/components/webcrypto/algorithms/aes_ctr_unittest.cc
+++ b/components/webcrypto/algorithms/aes_ctr_unittest.cc
@@ -5,7 +5,6 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include "base/values.h"
 #include "components/webcrypto/algorithm_dispatch.h"
 #include "components/webcrypto/algorithms/test_helpers.h"
 #include "components/webcrypto/crypto_data.h"
@@ -26,66 +25,113 @@
       new blink::WebCryptoAesCtrParams(length_bits, counter));
 }
 
+blink::WebCryptoKey AesCtrKeyFromBytes(const std::vector<uint8_t>& bytes) {
+  blink::WebCryptoKey key = ImportSecretKeyFromRaw(
+      bytes, CreateAlgorithm(blink::kWebCryptoAlgorithmIdAesCtr),
+      blink::kWebCryptoKeyUsageEncrypt | blink::kWebCryptoKeyUsageDecrypt);
+  EXPECT_EQ(bytes.size() * 8, key.Algorithm().AesParams()->LengthBits());
+  return key;
+}
+
 class WebCryptoAesCtrTest : public WebCryptoTestBase {};
 
+struct AesCtrKnownAnswer {
+  const char* key;
+  const char* plaintext;
+  const char* counter;
+  size_t counter_length;
+  const char* ciphertext;
+};
+
+const char k128BitTestKey[] = "7691BE035E5020A8AC6E618529F9A0DC";
+const char k256BitTestKey[] =
+    "F6D66D6BD52D59BB0796365879EFF886C66DD51A5B6A99744B50590C87A23884";
+
+const AesCtrKnownAnswer kAesCtrKnownAnswers[] = {
+    // RFC 3686 test vector #3:
+    {k128BitTestKey,
+     "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20212223",
+     "00E0017B27777F3F4A1786F000000001", 32,
+     "C1CF48A89F2FFDD9CF4652E9EFDB72D74540A42BDE6D7836D59A5CEAAEF3105325B2072"
+     "F"},
+    // RFC 3686 test vector #8:
+    {k256BitTestKey,
+     "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F",
+     "00FAAC24C1585EF15A43D87500000001", 32,
+     "F05E231B3894612C49EE000B804EB2A9B8306B508F839D6A5530831D9344AF1C"},
+    // Empty plaintext, same key as above:
+    {k256BitTestKey, "", "00FAAC24C1585EF15A43D87500000001", 32, ""},
+    // 32-bit counter wraparound:
+    {k256BitTestKey,
+     "F05E231B3894612C49EE000B804EB2A9B8306B508F839D6A5530831D9344AF1CC1CF48A89"
+     "F2FFDD9CF4652E9EFDB72D7",
+     "00FAAC24C1585EF15A43D875FFFFFFFF", 32,
+     "2E32E02FF9E69A1D6B78AC4308A67592C5DD5505589B79183D4189619A1467E4319069B0A"
+     "3BE9AF28EA158E96398CE71"},
+    // 1-bit counter wraparound:
+    {k128BitTestKey,
+     "C05E231B3894612C49EE000B804EB2A6B8306B508F839D6A5530831D9344AF1C",
+     "00FAAC24C1585EF15A43D875000000FF", 1,
+     "52334727723A84F4278FB319386CD7B5587DD8B2D9AA394D83EF8A826C4761AA"},
+    // 4-bit counter wraparound:
+    {k128BitTestKey,
+     "C05E231B3894612C49EE000B804EB2A6B8306B508F839D6A5530831D9344AF1C141516171"
+     "8191A1B1C1D1E1F20212223",
+     "00FAAC24C1585EF15A43D8750000111E", 4,
+     "5573894046DEF46162ED54966A22D8F0517B61A0CE7E657A5A5124A7F62AAE149A3C78567"
+     "11C59D67F34F31374CF7A72"},
+    // same, but plaintext is not a multiple of block size:
+    {k128BitTestKey,
+     "C05E231B3894612C49EE000B804EB2A6B8306B508F839D6A5530831D9344AF1C141516171"
+     "8191A1B1C1D1E1F20",
+     "00FAAC24C1585EF15A43D8750000111E", 4,
+     "5573894046DEF46162ED54966A22D8F0517B61A0CE7E657A5A5124A7F62AAE149A3C78567"
+     "11C59D67F34F31374"},
+    // 128-bit counter wraparound:
+    {k128BitTestKey,
+     "C05E231B3894612C49EE000B804EB2A6B8306B508F839D6A5530831D9344AF1C141516171"
+     "8191A1B1C1D1E1F20212223",
+     "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE", 128,
+     "D2C49B275BC73814DC90ECE98959041C9A3481F2247E08B0AF5D8DE3F521C9DAF535B0A81"
+     "56DF9D2370EE7328103C8AD"},
+};
+
 TEST_F(WebCryptoAesCtrTest, EncryptDecryptKnownAnswer) {
-  base::Value tests;
-  ASSERT_TRUE(ReadJsonTestFileAsList("aes_ctr.json", &tests));
+  for (const auto& test : kAesCtrKnownAnswers) {
+    SCOPED_TRACE(&test - &kAesCtrKnownAnswers[0]);
 
-  for (size_t test_index = 0; test_index < tests.GetListDeprecated().size();
-       ++test_index) {
-    SCOPED_TRACE(test_index);
-    const base::Value& test_value = tests.GetListDeprecated()[test_index];
-    ASSERT_TRUE(test_value.is_dict());
-    const base::DictionaryValue* test =
-        &base::Value::AsDictionaryValue(test_value);
+    std::vector<uint8_t> key_bytes = HexStringToBytes(test.key);
+    std::vector<uint8_t> counter = HexStringToBytes(test.counter);
+    std::vector<uint8_t> plaintext = HexStringToBytes(test.plaintext);
+    std::vector<uint8_t> ciphertext = HexStringToBytes(test.ciphertext);
 
-    std::vector<uint8_t> test_key = GetBytesFromHexString(test, "key");
-    std::vector<uint8_t> test_counter = GetBytesFromHexString(test, "counter");
-    absl::optional<int> counter_length_bits = test->FindIntKey("length");
-    ASSERT_TRUE(counter_length_bits);
-
-    std::vector<uint8_t> test_plain_text =
-        GetBytesFromHexString(test, "plain_text");
-    std::vector<uint8_t> test_cipher_text =
-        GetBytesFromHexString(test, "cipher_text");
-
-    blink::WebCryptoKey key = ImportSecretKeyFromRaw(
-        test_key, CreateAlgorithm(blink::kWebCryptoAlgorithmIdAesCtr),
-        blink::kWebCryptoKeyUsageEncrypt | blink::kWebCryptoKeyUsageDecrypt);
-
-    EXPECT_EQ(test_key.size() * 8, key.Algorithm().AesParams()->LengthBits());
+    blink::WebCryptoKey key = AesCtrKeyFromBytes(key_bytes);
 
     std::vector<uint8_t> output;
 
     // Test encryption.
     EXPECT_EQ(Status::Success(),
-              Encrypt(CreateAesCtrAlgorithm(test_counter, *counter_length_bits),
-                      key, CryptoData(test_plain_text), &output));
-    EXPECT_BYTES_EQ(test_cipher_text, output);
+              Encrypt(CreateAesCtrAlgorithm(counter, test.counter_length), key,
+                      CryptoData(plaintext), &output));
+    EXPECT_EQ(ciphertext, output);
 
     // Test decryption.
     EXPECT_EQ(Status::Success(),
-              Decrypt(CreateAesCtrAlgorithm(test_counter, *counter_length_bits),
-                      key, CryptoData(test_cipher_text), &output));
-    EXPECT_BYTES_EQ(test_plain_text, output);
+              Decrypt(CreateAesCtrAlgorithm(counter, test.counter_length), key,
+                      CryptoData(ciphertext), &output));
+    EXPECT_EQ(plaintext, output);
   }
 }
 
 // The counter block must be exactly 16 bytes.
 TEST_F(WebCryptoAesCtrTest, InvalidCounterBlockLength) {
-  const unsigned int kBadCounterBlockLengthBytes[] = {0, 15, 17};
-
-  blink::WebCryptoKey key = ImportSecretKeyFromRaw(
-      std::vector<uint8_t>(16),  // 128-bit key of all zeros.
-      CreateAlgorithm(blink::kWebCryptoAlgorithmIdAesCtr),
-      blink::kWebCryptoKeyUsageEncrypt | blink::kWebCryptoKeyUsageDecrypt);
+  blink::WebCryptoKey key = AesCtrKeyFromBytes(std::vector<uint8_t>(16));
 
   std::vector<uint8_t> input(32);
   std::vector<uint8_t> output;
 
-  for (size_t i = 0; i < std::size(kBadCounterBlockLengthBytes); ++i) {
-    std::vector<uint8_t> bad_counter(kBadCounterBlockLengthBytes[i]);
+  for (size_t bad_length : {0, 15, 17}) {
+    std::vector<uint8_t> bad_counter(bad_length);
 
     EXPECT_EQ(Status::ErrorIncorrectSizeAesCtrCounter(),
               Encrypt(CreateAesCtrAlgorithm(bad_counter, 128), key,
@@ -97,29 +143,22 @@
   }
 }
 
-// The counter length cannot be less than 1 or greater than 128.
 TEST_F(WebCryptoAesCtrTest, InvalidCounterLength) {
-  const uint8_t kBadCounterLengthBits[] = {0, 129};
-
-  blink::WebCryptoKey key = ImportSecretKeyFromRaw(
-      std::vector<uint8_t>(16),  // 128-bit key of all zeros.
-      CreateAlgorithm(blink::kWebCryptoAlgorithmIdAesCtr),
-      blink::kWebCryptoKeyUsageEncrypt | blink::kWebCryptoKeyUsageDecrypt);
+  blink::WebCryptoKey key = AesCtrKeyFromBytes(std::vector<uint8_t>(16));
 
   std::vector<uint8_t> counter(16);
   std::vector<uint8_t> input(32);
   std::vector<uint8_t> output;
 
-  for (size_t i = 0; i < std::size(kBadCounterLengthBits); ++i) {
-    uint8_t bad_counter_length_bits = kBadCounterLengthBits[i];
+  // The counter length cannot be less than 1 or greater than 128.
+  for (uint8_t bad_length : {0, 129}) {
+    EXPECT_EQ(Status::ErrorInvalidAesCtrCounterLength(),
+              Encrypt(CreateAesCtrAlgorithm(counter, bad_length), key,
+                      CryptoData(input), &output));
 
     EXPECT_EQ(Status::ErrorInvalidAesCtrCounterLength(),
-              Encrypt(CreateAesCtrAlgorithm(counter, bad_counter_length_bits),
-                      key, CryptoData(input), &output));
-
-    EXPECT_EQ(Status::ErrorInvalidAesCtrCounterLength(),
-              Decrypt(CreateAesCtrAlgorithm(counter, bad_counter_length_bits),
-                      key, CryptoData(input), &output));
+              Decrypt(CreateAesCtrAlgorithm(counter, bad_length), key,
+                      CryptoData(input), &output));
   }
 }
 
@@ -132,12 +171,8 @@
 // block would end up wrapping back to the starting value.
 TEST_F(WebCryptoAesCtrTest, OverflowAndRepeatCounter) {
   const uint8_t kCounterLengthBits = 4;
-  const uint8_t kStartCounter[] = {0, 1, 15};
 
-  blink::WebCryptoKey key = ImportSecretKeyFromRaw(
-      std::vector<uint8_t>(16),  // 128-bit key of all zeros.
-      CreateAlgorithm(blink::kWebCryptoAlgorithmIdAesCtr),
-      blink::kWebCryptoKeyUsageEncrypt | blink::kWebCryptoKeyUsageDecrypt);
+  blink::WebCryptoKey key = AesCtrKeyFromBytes(std::vector<uint8_t>(16));
 
   std::vector<uint8_t> buffer(272);
 
@@ -148,9 +183,9 @@
 
   std::vector<uint8_t> output;
 
-  for (size_t i = 0; i < std::size(kStartCounter); ++i) {
+  for (uint8_t start : {0, 1, 15}) {
     std::vector<uint8_t> counter(16);
-    counter[15] = kStartCounter[i];
+    counter[15] = start;
 
     // Baseline test: Encrypting 16 blocks should work (don't bother to check
     // output, the known answer tests already do that).
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
index f10a6e01..ca17af65 100644
--- a/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
+++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl.cc
@@ -95,6 +95,8 @@
   absl::optional<url::Origin> destination;
 
   int num_data_registered = 0;
+
+  const base::TimeTicks register_time;
 };
 
 struct AttributionDataHostManagerImpl::DelayedTrigger {
@@ -112,6 +114,11 @@
   }
 };
 
+struct AttributionDataHostManagerImpl::NavigationDataHost {
+  mojo::PendingReceiver<blink::mojom::AttributionDataHost> data_host;
+  base::TimeTicks register_time;
+};
+
 AttributionDataHostManagerImpl::AttributionDataHostManagerImpl(
     AttributionManager* attribution_manager)
     : attribution_manager_(attribution_manager) {
@@ -132,15 +139,18 @@
 
   receivers_.Add(this, std::move(data_host),
                  FrozenContext{.context_origin = std::move(context_origin),
-                               .source_type = AttributionSourceType::kEvent});
+                               .source_type = AttributionSourceType::kEvent,
+                               .register_time = base::TimeTicks::Now()});
   data_hosts_in_source_mode_++;
 }
 
 void AttributionDataHostManagerImpl::RegisterNavigationDataHost(
     mojo::PendingReceiver<blink::mojom::AttributionDataHost> data_host,
     const blink::AttributionSrcToken& attribution_src_token) {
-  navigation_data_host_map_.emplace(attribution_src_token,
-                                    std::move(data_host));
+  navigation_data_host_map_.emplace(
+      attribution_src_token,
+      NavigationDataHost{.data_host = std::move(data_host),
+                         .register_time = base::TimeTicks::Now()});
   data_hosts_in_source_mode_++;
 }
 
@@ -161,10 +171,11 @@
     return;
 
   receivers_.Add(
-      this, std::move(it->second),
+      this, std::move(it->second.data_host),
       FrozenContext{.context_origin = source_origin,
                     .source_type = AttributionSourceType::kNavigation,
-                    .destination = destination_origin});
+                    .destination = destination_origin,
+                    .register_time = it->second.register_time});
 
   navigation_data_host_map_.erase(it);
 }
@@ -172,8 +183,13 @@
 void AttributionDataHostManagerImpl::NotifyNavigationFailure(
     const blink::AttributionSrcToken& attribution_src_token) {
   // TODO(johnidel): Record metrics for how many potential sources are dropped.
-  navigation_data_host_map_.erase(attribution_src_token);
-  OnSourceEligibleDataHostFinished();
+
+  auto it = navigation_data_host_map_.find(attribution_src_token);
+  DCHECK(it != navigation_data_host_map_.end());
+
+  base::TimeTicks register_time = it->second.register_time;
+  navigation_data_host_map_.erase(it);
+  OnSourceEligibleDataHostFinished(register_time);
 }
 
 void AttributionDataHostManagerImpl::SourceDataAvailable(
@@ -258,7 +274,7 @@
 
   if (!context.destination.has_value()) {
     context.destination = url::Origin();
-    OnSourceEligibleDataHostFinished();
+    OnSourceEligibleDataHostFinished(context.register_time);
   } else if (!context.destination->opaque()) {
     return;
   }
@@ -390,10 +406,11 @@
   if (context.destination.has_value() && context.destination->opaque())
     return;
 
-  OnSourceEligibleDataHostFinished();
+  OnSourceEligibleDataHostFinished(context.register_time);
 }
 
-void AttributionDataHostManagerImpl::OnSourceEligibleDataHostFinished() {
+void AttributionDataHostManagerImpl::OnSourceEligibleDataHostFinished(
+    base::TimeTicks register_time) {
   // Decrement the number of receivers in source mode and flush triggers if
   // applicable.
   //
@@ -404,6 +421,9 @@
   // TODO(apaseltiner): Should we flush triggers when the
   // `AttributionDataHostManagerImpl` is about to be destroyed?
 
+  base::UmaHistogramMediumTimes("Conversions.SourceEligibleDataHostLifeTime",
+                                base::TimeTicks::Now() - register_time);
+
   DCHECK_GT(data_hosts_in_source_mode_, 0u);
   data_hosts_in_source_mode_--;
   if (data_hosts_in_source_mode_ > 0)
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl.h b/content/browser/attribution_reporting/attribution_data_host_manager_impl.h
index 528a000..a43f051 100644
--- a/content/browser/attribution_reporting/attribution_data_host_manager_impl.h
+++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl.h
@@ -19,6 +19,7 @@
 
 namespace base {
 class TimeDelta;
+class TimeTicks;
 }  // namespace base
 
 namespace content {
@@ -67,6 +68,8 @@
 
   struct DelayedTrigger;
 
+  struct NavigationDataHost;
+
   // blink::mojom::AttributionDataHost:
   void SourceDataAvailable(
       blink::mojom::AttributionSourceDataPtr data) override;
@@ -74,7 +77,7 @@
       blink::mojom::AttributionTriggerDataPtr data) override;
 
   void OnReceiverDisconnected();
-  void OnSourceEligibleDataHostFinished();
+  void OnSourceEligibleDataHostFinished(base::TimeTicks register_time);
 
   void SetTriggerTimer(base::TimeDelta delay);
   void ProcessDelayedTrigger();
@@ -89,8 +92,7 @@
   // register sources associated with a navigation. These are not added to
   // `receivers_` until the necessary browser process information is available
   // to validate the attribution sources which is after the navigation finishes.
-  base::flat_map<blink::AttributionSrcToken,
-                 mojo::PendingReceiver<blink::mojom::AttributionDataHost>>
+  base::flat_map<blink::AttributionSrcToken, NavigationDataHost>
       navigation_data_host_map_;
 
   // The number of connected receivers that may register a source. Used to
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc
index e6966cc..f644746 100644
--- a/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc
@@ -129,6 +129,8 @@
     data_host_manager_.RegisterDataHost(
         data_host_remote.data_host.BindNewPipeAndPassReceiver(), page_origin);
 
+    task_environment_.FastForwardBy(base::Milliseconds(1));
+
     auto source_data = blink::mojom::AttributionSourceData::New();
     source_data->source_event_id = 10;
     source_data->destination = destination_origin;
@@ -148,6 +150,8 @@
 
   histograms.ExpectUniqueSample("Conversions.RegisteredSourcesPerDataHost", 1,
                                 1);
+  histograms.ExpectTimeBucketCount("Conversions.SourceEligibleDataHostLifeTime",
+                                   base::Milliseconds(1), 1);
 }
 
 TEST_F(AttributionDataHostManagerImplTest,
@@ -801,6 +805,8 @@
 
 TEST_F(AttributionDataHostManagerImplTest,
        SourceDataHost_NavigationSourceRegistered) {
+  base::HistogramTester histograms;
+
   const auto page_origin = url::Origin::Create(GURL("https://page.example"));
   const auto destination_origin =
       url::Origin::Create(GURL("https://trigger.example"));
@@ -822,28 +828,36 @@
 
   const blink::AttributionSrcToken attribution_src_token;
 
-  mojo::Remote<blink::mojom::AttributionDataHost> data_host_remote;
-  data_host_manager_.RegisterNavigationDataHost(
-      data_host_remote.BindNewPipeAndPassReceiver(), attribution_src_token);
+  {
+    RemoteDataHost data_host_remote{.task_environment = task_environment_};
+    data_host_manager_.RegisterNavigationDataHost(
+        data_host_remote.data_host.BindNewPipeAndPassReceiver(),
+        attribution_src_token);
 
-  data_host_manager_.NotifyNavigationForDataHost(
-      attribution_src_token, page_origin, destination_origin);
+    task_environment_.FastForwardBy(base::Milliseconds(1));
 
-  auto source_data = blink::mojom::AttributionSourceData::New();
-  source_data->source_event_id = 10;
-  source_data->destination = destination_origin;
-  source_data->reporting_origin = reporting_origin;
-  source_data->priority = 20;
-  source_data->debug_key = blink::mojom::AttributionDebugKey::New(789);
-  source_data->filter_data = blink::mojom::AttributionFilterData::New();
-  source_data->aggregatable_source =
-      AggregatableSourceMojoBuilder()
-          .AddKey(/*key_id=*/"key",
-                  blink::mojom::AttributionAggregatableKey::New(
-                      /*high_bits=*/5, /*low_bits=*/345))
-          .Build();
-  data_host_remote->SourceDataAvailable(std::move(source_data));
-  data_host_remote.FlushForTesting();
+    data_host_manager_.NotifyNavigationForDataHost(
+        attribution_src_token, page_origin, destination_origin);
+
+    auto source_data = blink::mojom::AttributionSourceData::New();
+    source_data->source_event_id = 10;
+    source_data->destination = destination_origin;
+    source_data->reporting_origin = reporting_origin;
+    source_data->priority = 20;
+    source_data->debug_key = blink::mojom::AttributionDebugKey::New(789);
+    source_data->filter_data = blink::mojom::AttributionFilterData::New();
+    source_data->aggregatable_source =
+        AggregatableSourceMojoBuilder()
+            .AddKey(/*key_id=*/"key",
+                    blink::mojom::AttributionAggregatableKey::New(
+                        /*high_bits=*/5, /*low_bits=*/345))
+            .Build();
+    data_host_remote.data_host->SourceDataAvailable(std::move(source_data));
+    data_host_remote.data_host.FlushForTesting();
+  }
+
+  histograms.ExpectTimeBucketCount("Conversions.SourceEligibleDataHostLifeTime",
+                                   base::Milliseconds(1), 1);
 }
 
 // Ensures correct behavior in
@@ -877,30 +891,35 @@
     EXPECT_CALL(mock_manager_, HandleTrigger);
   }
 
-  mojo::Remote<blink::mojom::AttributionDataHost> source_data_host_remote;
-  data_host_manager_.RegisterDataHost(
-      source_data_host_remote.BindNewPipeAndPassReceiver(),
-      url::Origin::Create(GURL("https://page1.example")));
+  {
+    RemoteDataHost source_data_host_remote{.task_environment =
+                                               task_environment_};
+    data_host_manager_.RegisterDataHost(
+        source_data_host_remote.data_host.BindNewPipeAndPassReceiver(),
+        url::Origin::Create(GURL("https://page1.example")));
 
-  mojo::Remote<blink::mojom::AttributionDataHost> trigger_data_host_remote;
-  data_host_manager_.RegisterDataHost(
-      trigger_data_host_remote.BindNewPipeAndPassReceiver(),
-      url::Origin::Create(GURL("https://page2.example")));
+    mojo::Remote<blink::mojom::AttributionDataHost> trigger_data_host_remote;
+    data_host_manager_.RegisterDataHost(
+        trigger_data_host_remote.BindNewPipeAndPassReceiver(),
+        url::Origin::Create(GURL("https://page2.example")));
 
-  // Because there is a connected data host in source mode, this trigger should
-  // be delayed.
-  auto trigger_data = blink::mojom::AttributionTriggerData::New();
-  trigger_data->reporting_origin =
-      url::Origin::Create(GURL("https://report.test"));
-  trigger_data->filters = blink::mojom::AttributionFilterData::New();
-  trigger_data->aggregatable_trigger =
-      blink::mojom::AttributionAggregatableTrigger::New();
-  trigger_data_host_remote->TriggerDataAvailable(std::move(trigger_data));
-  trigger_data_host_remote.FlushForTesting();
+    task_environment_.FastForwardBy(base::Milliseconds(1));
 
-  task_environment_.FastForwardBy(base::Seconds(5) - base::Microseconds(1));
-  checkpoint.Call(1);
-  task_environment_.FastForwardBy(base::Microseconds(1));
+    // Because there is a connected data host in source mode, this trigger
+    // should be delayed.
+    auto trigger_data = blink::mojom::AttributionTriggerData::New();
+    trigger_data->reporting_origin =
+        url::Origin::Create(GURL("https://report.test"));
+    trigger_data->filters = blink::mojom::AttributionFilterData::New();
+    trigger_data->aggregatable_trigger =
+        blink::mojom::AttributionAggregatableTrigger::New();
+    trigger_data_host_remote->TriggerDataAvailable(std::move(trigger_data));
+    trigger_data_host_remote.FlushForTesting();
+
+    task_environment_.FastForwardBy(base::Seconds(5) - base::Microseconds(1));
+    checkpoint.Call(1);
+    task_environment_.FastForwardBy(base::Microseconds(1));
+  }
 
   CheckTriggerQueueHistograms(histograms, {
                                               .enqueued = 1,
@@ -910,6 +929,13 @@
                                                       {base::Seconds(5), 1},
                                                   },
                                           });
+
+  // Recorded when source data host was disconnected.
+  histograms.ExpectTimeBucketCount("Conversions.SourceEligibleDataHostLifeTime",
+                                   base::Seconds(5), 1);
+  // Recorded when trigger data was available.
+  histograms.ExpectTimeBucketCount("Conversions.SourceEligibleDataHostLifeTime",
+                                   base::Milliseconds(1), 1);
 }
 
 TEST_F(AttributionDataHostManagerImplTest,
@@ -1052,6 +1078,8 @@
       trigger_data_host_remote.BindNewPipeAndPassReceiver(),
       url::Origin::Create(GURL("https://page2.example")));
 
+  task_environment_.FastForwardBy(base::Milliseconds(1));
+
   data_host_manager_.NotifyNavigationFailure(attribution_src_token);
 
   auto trigger_data = blink::mojom::AttributionTriggerData::New();
@@ -1066,6 +1094,8 @@
   CheckTriggerQueueHistograms(histograms, {.skipped_queue = 1});
 
   histograms.ExpectTotalCount("Conversions.TriggerQueueDelay", 0);
+  histograms.ExpectTimeBucketCount("Conversions.SourceEligibleDataHostLifeTime",
+                                   base::Milliseconds(1), 2);
 }
 
 TEST_F(AttributionDataHostManagerImplTest,
diff --git a/content/browser/buckets/bucket_manager.cc b/content/browser/buckets/bucket_manager.cc
index c1369fd..5e067cd 100644
--- a/content/browser/buckets/bucket_manager.cc
+++ b/content/browser/buckets/bucket_manager.cc
@@ -33,11 +33,10 @@
     return;
   }
 
-  bool insert_succeeded;
-  std::tie(it, insert_succeeded) = hosts_.insert(
+  auto [insert_it, insert_succeeded] = hosts_.insert(
       {origin, std::make_unique<BucketManagerHost>(this, origin)});
   DCHECK(insert_succeeded);
-  it->second->BindReceiver(std::move(receiver));
+  insert_it->second->BindReceiver(std::move(receiver));
 }
 
 void BucketManager::OnHostReceiverDisconnect(BucketManagerHost* host,
diff --git a/content/browser/cache_storage/legacy/legacy_cache_storage.cc b/content/browser/cache_storage/legacy/legacy_cache_storage.cc
index f4b729c9..41bc265 100644
--- a/content/browser/cache_storage/legacy/legacy_cache_storage.cc
+++ b/content/browser/cache_storage/legacy/legacy_cache_storage.cc
@@ -309,7 +309,8 @@
       const std::string& cache_name,
       CacheAndErrorCallback callback,
       const std::tuple<CacheStorageError, std::string>& result) {
-    auto [status, cache_dir] = result;
+    CacheStorageError status = std::get<0>(result);
+    const std::string& cache_dir = std::get<1>(result);
 
     if (status != CacheStorageError::kSuccess) {
       std::move(callback).Run(nullptr, status);
diff --git a/content/browser/download/save_package.cc b/content/browser/download/save_package.cc
index 1d68e50..7bc6876 100644
--- a/content/browser/download/save_package.cc
+++ b/content/browser/download/save_package.cc
@@ -917,7 +917,7 @@
         save_item_ptr->id(), save_item_ptr->url(), save_item_ptr->referrer(),
         requester_frame->GetProcess()->GetID(),
         requester_frame->render_view_host()->GetRoutingID(),
-        requester_frame->routing_id(), save_item_ptr->save_source(),
+        requester_frame->GetRoutingID(), save_item_ptr->save_source(),
         save_item_ptr->full_path(),
         page_->GetMainDocument().GetBrowserContext(),
         page_->GetMainDocument()
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 959bccf..cae28648 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -10240,7 +10240,7 @@
   GetStoragePartition()->CreateRestrictedCookieManager(
       network::mojom::RestrictedCookieManagerRole::SCRIPT, origin,
       isolation_info,
-      /*is_service_worker=*/false, GetProcess()->GetID(), routing_id(),
+      /*is_service_worker=*/false, GetProcess()->GetID(), GetRoutingID(),
       std::move(receiver), CreateCookieAccessObserver());
 }
 
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h
index b3d6060..7787185 100644
--- a/content/browser/renderer_host/render_frame_host_impl.h
+++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -590,8 +590,6 @@
   // successively.
   void OnAudibleStateChanged(bool is_audible);
 
-  int routing_id() const { return routing_id_; }
-
   // Called when this frame has added a child. This is a continuation of an IPC
   // that was partially handled on the IO thread (to allocate |new_routing_id|,
   // |frame_token| and |devtools_frame_token|), and is forwarded here. The
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc
index 9208dc7..23c9354 100644
--- a/content/browser/renderer_host/render_frame_host_manager.cc
+++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -3579,7 +3579,7 @@
     if (!new_rvh->is_active())
       new_rvh->PostRenderViewReady();
 
-    new_rvh->SetMainFrameRoutingId(render_frame_host_->routing_id());
+    new_rvh->SetMainFrameRoutingId(render_frame_host_->GetRoutingID());
     if (old_rvh != new_rvh)
       old_rvh->SetMainFrameRoutingId(MSG_ROUTING_NONE);
   }
diff --git a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
index b5023295..a6d9a8e 100644
--- a/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
+++ b/content/browser/renderer_host/render_frame_host_manager_browsertest.cc
@@ -8703,7 +8703,7 @@
   RenderFrameDeletedObserver delete_c5(c5);
 
   GURL b2_url = b2->GetLastCommittedURL();
-  int b2_routing_id = b2->routing_id();
+  int b2_routing_id = b2->GetRoutingID();
 
   auto proxy_count = [](RenderFrameHostImpl* rfh) {
     return rfh->browsing_context_state()->GetProxyCount();
@@ -8791,7 +8791,8 @@
   NavigateFrameToURL(b2->frame_tree_node(), b2_url);
 
   // B2 has been replaced
-  EXPECT_NE(b2_routing_id, a1->child_at(0)->current_frame_host()->routing_id());
+  EXPECT_NE(b2_routing_id,
+            a1->child_at(0)->current_frame_host()->GetRoutingID());
   // B3 hasn't been replaced.
   EXPECT_EQ(b3, a1->child_at(1)->current_frame_host());
   RenderFrameHostImpl* b6 = a1->child_at(0)->current_frame_host();
diff --git a/content/browser/renderer_host/render_view_host_browsertest.cc b/content/browser/renderer_host/render_view_host_browsertest.cc
index 2f4a439..82e82546 100644
--- a/content/browser/renderer_host/render_view_host_browsertest.cc
+++ b/content/browser/renderer_host/render_view_host_browsertest.cc
@@ -100,8 +100,8 @@
           .root();
 
   EXPECT_TRUE(new_root->current_frame_host());
-  EXPECT_NE(old_root->current_frame_host()->routing_id(),
-            new_root->current_frame_host()->routing_id());
+  EXPECT_NE(old_root->current_frame_host()->GetRoutingID(),
+            new_root->current_frame_host()->GetRoutingID());
 }
 
 IN_PROC_BROWSER_TEST_F(RenderViewHostTest, IsFocusedElementEditable) {
diff --git a/content/browser/renderer_host/render_view_host_unittest.cc b/content/browser/renderer_host/render_view_host_unittest.cc
index 791c7ec..bf684ffe 100644
--- a/content/browser/renderer_host/render_view_host_unittest.cc
+++ b/content/browser/renderer_host/render_view_host_unittest.cc
@@ -232,7 +232,7 @@
       contents()->GetPrimaryFrameTree().root()->current_frame_host();
   EXPECT_EQ(contents()->GetMainFrame(), root_rfh);
   EXPECT_EQ(test_rvh()->GetProcess(), root_rfh->GetProcess());
-  EXPECT_NE(test_rvh()->GetRoutingID(), root_rfh->routing_id());
+  EXPECT_NE(test_rvh()->GetRoutingID(), root_rfh->GetRoutingID());
 }
 
 }  // namespace content
diff --git a/content/renderer/accessibility/ax_tree_distiller.cc b/content/renderer/accessibility/ax_tree_distiller.cc
index de7dd327..f9f5f377 100644
--- a/content/renderer/accessibility/ax_tree_distiller.cc
+++ b/content/renderer/accessibility/ax_tree_distiller.cc
@@ -4,6 +4,7 @@
 
 #include "content/renderer/accessibility/ax_tree_distiller.h"
 
+#include <memory>
 #include <queue>
 #include <vector>
 
diff --git a/content/renderer/accessibility/ax_tree_distiller.h b/content/renderer/accessibility/ax_tree_distiller.h
index 7ae4bff4..e44f4db 100644
--- a/content/renderer/accessibility/ax_tree_distiller.h
+++ b/content/renderer/accessibility/ax_tree_distiller.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <vector>
 
+#include "content/common/content_export.h"
 #include "ui/accessibility/ax_node_id_forward.h"
 #include "ui/accessibility/ax_tree_update_forward.h"
 
@@ -21,7 +22,7 @@
 //  A class that creates and stores a distilled AXTree for a particular render
 //  frame.
 //
-class AXTreeDistiller {
+class CONTENT_EXPORT AXTreeDistiller {
  public:
   explicit AXTreeDistiller(RenderFrameImpl* render_frame);
   ~AXTreeDistiller();
diff --git a/content/renderer/accessibility/ax_tree_distiller_browsertest.cc b/content/renderer/accessibility/ax_tree_distiller_browsertest.cc
new file mode 100644
index 0000000..c1934f3
--- /dev/null
+++ b/content/renderer/accessibility/ax_tree_distiller_browsertest.cc
@@ -0,0 +1,128 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/renderer/accessibility/ax_tree_distiller.h"
+
+#include <memory>
+#include <string>
+
+#include "content/public/test/render_view_test.h"
+#include "content/renderer/render_frame_impl.h"
+#include "ui/accessibility/ax_node.h"
+#include "ui/accessibility/ax_tree.h"
+
+namespace content {
+
+class AXTreeDistillerTestBase : public RenderViewTest {
+ public:
+  AXTreeDistillerTestBase() = default;
+  AXTreeDistillerTestBase(const AXTreeDistillerTestBase&) = delete;
+  AXTreeDistillerTestBase& operator=(const AXTreeDistillerTestBase&) = delete;
+  ~AXTreeDistillerTestBase() override = default;
+
+  void DistillPage(const char* html) {
+    LoadHTML(html);
+    RenderFrameImpl* render_frame_impl =
+        RenderFrameImpl::FromWebFrame(GetMainFrame());
+    distiller_ = std::make_unique<AXTreeDistiller>(render_frame_impl);
+    distiller_->Distill();
+  }
+
+  void CheckTextNodes(const std::vector<std::string>& text_node_contents) {
+    // AXTree snapshot from distiller should unserialize successfully.
+    ui::AXTree tree;
+    EXPECT_TRUE(tree.Unserialize(*(distiller_->GetSnapshot())));
+
+    // Text node IDs list from distiller should be the same length as
+    // |text_node_contents| passed in.
+    auto* text_node_ids = distiller_->GetTextNodeIDs();
+    EXPECT_EQ(text_node_ids->size(), text_node_contents.size());
+
+    // Iterate through each text node ID from distiller and check that the text
+    // value equals the passed-in string from |text_node_contents|.
+    for (size_t i = 0; i < text_node_ids->size(); i++) {
+      ui::AXNode* node = tree.GetFromId(text_node_ids->at(i));
+      EXPECT_TRUE(node);
+      std::string value;
+      EXPECT_TRUE(
+          node->GetStringAttribute(ax::mojom::StringAttribute::kName, &value));
+      EXPECT_EQ(value, text_node_contents[i]);
+    }
+  }
+
+ private:
+  std::unique_ptr<AXTreeDistiller> distiller_;
+};
+
+struct TestCase {
+  const char* test_name;
+  const char* html;
+  std::vector<std::string> text_node_contents;
+};
+
+class AXTreeDistillerTest : public AXTreeDistillerTestBase,
+                            public ::testing::WithParamInterface<TestCase> {
+ public:
+  static std::string ParamInfoToString(
+      ::testing::TestParamInfo<TestCase> param_info) {
+    return param_info.param.test_name;
+  }
+};
+
+// AXTreeDistillerTest is a parameterized test. Add each test case to the object
+// below in the form of struct |TestCase|. Include a dividing line as a comment
+// for easy reading.
+const TestCase kDistillWebPageTestCases[] = {
+    {"simple_page",
+     R"HTML(<!doctype html>
+      <body>
+        <div>Test</div>
+      <body>)HTML",
+     {"Test"}},
+    /* ----------------------- */
+    {"simple_page_two_nodes",
+     R"HTML(<!doctype html>
+      <body>
+        <div>Test 1</div>
+        <div>Test 2</div>
+      <body>)HTML",
+     {"Test 1", "Test 2"}},
+    /* ----------------------- */
+    {"simple_page_no_content",
+     R"HTML(<!doctype html>
+      <body>
+        <header>Header</header>
+        <div role='banner'>Banner</div>
+        <div role="navigation'>Navigation</div>
+        <audio>Audio</audio>
+        <img alt='Image alt'></img>
+        <button>Button</button>
+        <div aria-label='Label'></div>
+        <div role='complementary'>Complementary</div>
+        <div role='content'>Content Info</div>
+        <footer>Footer</footer>
+      <body>)HTML",
+     {}},
+    /* ----------------------- */
+    {"simple_page_article",
+     R"HTML(<!doctype html>
+      <body>
+        <div>Not content</div>
+        <div role='article'>Content</div>
+      <body>)HTML",
+     {"Content"}},
+};
+
+TEST_P(AXTreeDistillerTest, DistillsWebPage) {
+  TestCase param = GetParam();
+  DistillPage(param.html);
+  CheckTextNodes(param.text_node_contents);
+}
+
+INSTANTIATE_TEST_SUITE_P(/* prefix */,
+                         AXTreeDistillerTest,
+                         ::testing::ValuesIn(kDistillWebPageTestCases),
+                         AXTreeDistillerTest::ParamInfoToString);
+
+}  // namespace content
diff --git a/content/shell/BUILD.gn b/content/shell/BUILD.gn
index 9e6fde15..6038325 100644
--- a/content/shell/BUILD.gn
+++ b/content/shell/BUILD.gn
@@ -234,6 +234,8 @@
     "//build:chromeos_buildflags",
     "//cc/base",
     "//components/cdm/renderer",
+    "//components/custom_handlers",
+    "//components/custom_handlers:test_support",
     "//components/keyed_service/content",
     "//components/metrics",
     "//components/metrics:net",
diff --git a/content/shell/DEPS b/content/shell/DEPS
index 0d1d9f1..5d0b5bd 100644
--- a/content/shell/DEPS
+++ b/content/shell/DEPS
@@ -31,6 +31,7 @@
   #   1) it's an example browser
   #   2) it's not linked into the content library
   "+components/embedder_support",
+  "+components/custom_handlers",
   "+components/crash",
   "+components/download",
   "+components/keyed_service/core",
diff --git a/content/shell/browser/shell.cc b/content/shell/browser/shell.cc
index 23ea81b4..379c87f 100644
--- a/content/shell/browser/shell.cc
+++ b/content/shell/browser/shell.cc
@@ -21,6 +21,10 @@
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
+#include "components/custom_handlers/protocol_handler.h"
+#include "components/custom_handlers/protocol_handler_registry.h"
+#include "components/custom_handlers/simple_protocol_handler_registry_factory.h"
+#include "content/public/browser/browser_context.h"
 #include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/navigation_entry.h"
@@ -491,6 +495,43 @@
              : blink::mojom::DisplayMode::kBrowser;
 }
 
+#if !BUILDFLAG(IS_ANDROID)
+void Shell::RegisterProtocolHandler(RenderFrameHost* requesting_frame,
+                                    const std::string& protocol,
+                                    const GURL& url,
+                                    bool user_gesture) {
+  content::BrowserContext* context = requesting_frame->GetBrowserContext();
+  if (context->IsOffTheRecord())
+    return;
+
+  custom_handlers::ProtocolHandler handler =
+      custom_handlers::ProtocolHandler::CreateProtocolHandler(
+          protocol, url, GetProtocolHandlerSecurityLevel(requesting_frame));
+
+  // The parameters's normalization process defined in the spec has been already
+  // applied in the WebContentImpl class, so at this point it shouldn't be
+  // possible to create an invalid handler.
+  // https://html.spec.whatwg.org/multipage/system-state.html#normalize-protocol-handler-parameters
+  DCHECK(handler.IsValid());
+
+  custom_handlers::ProtocolHandlerRegistry* registry = custom_handlers::
+      SimpleProtocolHandlerRegistryFactory::GetForBrowserContext(context, true);
+  DCHECK(registry);
+  if (registry->SilentlyHandleRegisterHandlerRequest(handler))
+    return;
+
+  // FencedFrames can not register to handle any protocols.
+  if (requesting_frame->IsNestedWithinFencedFrame()) {
+    registry->OnIgnoreRegisterProtocolHandler(handler);
+    return;
+  }
+
+  // TODO(jfernandez): Are we interested at all on using the
+  // PermissionRequestManager in the ContentShell ?
+  registry->OnAcceptRegisterProtocolHandler(handler);
+}
+#endif
+
 void Shell::RequestToLockMouse(WebContents* web_contents,
                                bool user_gesture,
                                bool last_unlocked_by_target) {
diff --git a/content/shell/browser/shell.h b/content/shell/browser/shell.h
index f0ff103e..799f31a 100644
--- a/content/shell/browser/shell.h
+++ b/content/shell/browser/shell.h
@@ -131,6 +131,12 @@
   bool IsFullscreenForTabOrPending(const WebContents* web_contents) override;
   blink::mojom::DisplayMode GetDisplayMode(
       const WebContents* web_contents) override;
+#if !BUILDFLAG(IS_ANDROID)
+  void RegisterProtocolHandler(RenderFrameHost* requesting_frame,
+                               const std::string& protocol,
+                               const GURL& url,
+                               bool user_gesture) override;
+#endif
   void RequestToLockMouse(WebContents* web_contents,
                           bool user_gesture,
                           bool last_unlocked_by_target) override;
diff --git a/content/shell/browser/shell_content_browser_client.cc b/content/shell/browser/shell_content_browser_client.cc
index 1720e904..18742ff 100644
--- a/content/shell/browser/shell_content_browser_client.cc
+++ b/content/shell/browser/shell_content_browser_client.cc
@@ -20,6 +20,9 @@
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
 #include "cc/base/switches.h"
+#include "components/custom_handlers/protocol_handler_registry.h"
+#include "components/custom_handlers/protocol_handler_throttle.h"
+#include "components/custom_handlers/simple_protocol_handler_registry_factory.h"
 #include "components/metrics/client_info.h"
 #include "components/metrics/metrics_service.h"
 #include "components/metrics/metrics_state_manager.h"
@@ -268,6 +271,37 @@
   return browser_main_parts;
 }
 
+bool ShellContentBrowserClient::HasCustomSchemeHandler(
+    content::BrowserContext* browser_context,
+    const std::string& scheme) {
+  if (custom_handlers::ProtocolHandlerRegistry* protocol_handler_registry =
+          custom_handlers::SimpleProtocolHandlerRegistryFactory::
+              GetForBrowserContext(browser_context)) {
+    return protocol_handler_registry->IsHandledProtocol(scheme);
+  }
+  return false;
+}
+
+std::vector<std::unique_ptr<blink::URLLoaderThrottle>>
+ShellContentBrowserClient::CreateURLLoaderThrottles(
+    const network::ResourceRequest& request,
+    BrowserContext* browser_context,
+    const base::RepeatingCallback<WebContents*()>& wc_getter,
+    NavigationUIData* navigation_ui_data,
+    int frame_tree_node_id) {
+  std::vector<std::unique_ptr<blink::URLLoaderThrottle>> result;
+
+  auto* factory = custom_handlers::SimpleProtocolHandlerRegistryFactory::
+      GetForBrowserContext(browser_context);
+  // null in unit tests.
+  if (factory) {
+    result.push_back(
+        std::make_unique<custom_handlers::ProtocolHandlerThrottle>(*factory));
+  }
+
+  return result;
+}
+
 bool ShellContentBrowserClient::IsHandledURL(const GURL& url) {
   if (!url.is_valid())
     return false;
diff --git a/content/shell/browser/shell_content_browser_client.h b/content/shell/browser/shell_content_browser_client.h
index 9aa5169..f4dd5460 100644
--- a/content/shell/browser/shell_content_browser_client.h
+++ b/content/shell/browser/shell_content_browser_client.h
@@ -49,6 +49,15 @@
   std::unique_ptr<BrowserMainParts> CreateBrowserMainParts(
       MainFunctionParams parameters) override;
   bool IsHandledURL(const GURL& url) override;
+  bool HasCustomSchemeHandler(content::BrowserContext* browser_context,
+                              const std::string& scheme) override;
+  std::vector<std::unique_ptr<blink::URLLoaderThrottle>>
+  CreateURLLoaderThrottles(
+      const network::ResourceRequest& request,
+      BrowserContext* browser_context,
+      const base::RepeatingCallback<WebContents*()>& wc_getter,
+      NavigationUIData* navigation_ui_data,
+      int frame_tree_node_id) override;
   void AppendExtraCommandLineSwitches(base::CommandLine* command_line,
                                       int child_process_id) override;
   std::string GetAcceptLangs(BrowserContext* context) override;
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 6c73cecf..c6b6b05f 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1392,6 +1392,7 @@
     "../browser/worker_host/worker_browsertest.cc",
     "../browser/worker_network_isolation_key_browsertest.cc",
     "../child/webthemeengine_impl_default_browsertest.cc",
+    "../renderer/accessibility/ax_tree_distiller_browsertest.cc",
     "../renderer/accessibility/render_accessibility_impl_browsertest.cc",
     "../renderer/blink_platform_audio_hardware_browsertest.cc",
     "../renderer/gin_browsertest.cc",
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
index 3c51b3f..8c117dc 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -467,9 +467,6 @@
 # Flaky on Win / Passthrough command decoder (both GL and D3D11 backends)
 crbug.com/1307905 [ win passthrough ] conformance/attribs/gl-vertexattribpointer.html [ RetryOnFailure ]
 
-# Vulkan / Win / Intel flaky
-crbug.com/1307924 [ win intel angle-vulkan passthrough ] conformance/rendering/out-of-bounds-array-buffers.html [ Failure ]
-
 ####################
 # Mac failures     #
 ####################
@@ -713,9 +710,6 @@
 crbug.com/1099959 [ swiftshader-gl no-passthrough ] WebglExtension_EXT_sRGB [ Failure ]
 crbug.com/1099959 [ swiftshader-gl no-passthrough ] WebglExtension_EXT_texture_compression_rgtc [ Failure ]
 
-# All platforms, Vulkan backend
-crbug.com/1309304 [ angle-swiftshader passthrough ] conformance/rendering/out-of-bounds-index-buffers.html [ Failure ]
-
 #######################################################################
 # Automated Entries After This Point - Do Not Manually Add Below Here #
 #######################################################################
diff --git a/device/fido/make_credential_request_handler.cc b/device/fido/make_credential_request_handler.cc
index e4e7029f..96d44dcf 100644
--- a/device/fido/make_credential_request_handler.cc
+++ b/device/fido/make_credential_request_handler.cc
@@ -948,8 +948,8 @@
   // Only Windows cares about |authenticator_attachment| on the request.
   request->authenticator_attachment = options_.authenticator_attachment;
 
-  const absl::optional<AuthenticatorSupportedOptions>& auth_options =
-      authenticator->Options();
+  const absl::optional<AuthenticatorSupportedOptions>&
+      auth_options_empty_on_win = authenticator->Options();
   switch (options_.resident_key) {
     case ResidentKeyRequirement::kRequired:
       request->resident_key_required = true;
@@ -963,10 +963,11 @@
           // Windows does not yet support rk=preferred.
           authenticator->GetType() != FidoAuthenticator::Type::kWinNative &&
 #endif
-          auth_options && auth_options->supports_resident_key &&
+          auth_options_empty_on_win &&
+          auth_options_empty_on_win->supports_resident_key &&
           !authenticator->DiscoverableCredentialStorageFull() &&
           (observer()->SupportsPIN() ||
-           auth_options->user_verification_availability ==
+           auth_options_empty_on_win->user_verification_availability ==
                AuthenticatorSupportedOptions::UserVerificationAvailability::
                    kSupportedAndConfigured);
       break;
@@ -981,9 +982,10 @@
       request->large_blob_key = true;
       break;
     case LargeBlobSupport::kPreferred:
-      request->large_blob_key = auth_options &&
-                                auth_options->supports_large_blobs &&
-                                request->resident_key_required;
+      request->large_blob_key =
+          auth_options_empty_on_win &&
+          auth_options_empty_on_win->supports_large_blobs &&
+          request->resident_key_required;
       break;
     case LargeBlobSupport::kNotRequested:
       request->large_blob_key = false;
@@ -992,7 +994,7 @@
 
   if (!options_.make_u2f_api_credential &&
       (request->resident_key_required ||
-       (auth_options && auth_options->always_uv))) {
+       (auth_options_empty_on_win && auth_options_empty_on_win->always_uv))) {
     request->user_verification = UserVerificationRequirement::kRequired;
   } else {
     request->user_verification = options_.user_verification;
@@ -1009,12 +1011,13 @@
     request->hmac_secret = false;
   }
 
-  if (request->large_blob_key && !auth_options->supports_large_blobs) {
+  if (request->large_blob_key && auth_options_empty_on_win &&
+      !auth_options_empty_on_win->supports_large_blobs) {
     request->large_blob_key = false;
   }
 
-  if (request->min_pin_length_requested &&
-      !auth_options->supports_min_pin_length_extension) {
+  if (request->min_pin_length_requested && auth_options_empty_on_win &&
+      !auth_options_empty_on_win->supports_min_pin_length_extension) {
     request->min_pin_length_requested = false;
   }
 
diff --git a/docs/updater/design_doc.md b/docs/updater/design_doc.md
index e2bee87..257dd5f 100644
--- a/docs/updater/design_doc.md
+++ b/docs/updater/design_doc.md
@@ -6,36 +6,155 @@
 
 ## Objective
 The objective is to create an updater for desktop client software using Chromium
-code and tools.
+code and tools. The updater is an open-source drop-in replacement for Google
+Update/Omaha and can be customized by 3rd party embedders for updating
+non-Google client software.
 
-## Elevation on Windows when a system application installer is executed
+The desktop platforms include Windows, macOS, Linux.
 
-`UpdaterSetup.exe`, also known as the metainstaller, is typically downloaded
-from the Internet and run by the user from a web browser. When this
-metainstaller is executed, the browser launches it at
+## Overview
+The updater is responsible for:
+*   Installing applications. (On applicable platforms.)
+*   Automatically and silently keeping those applications (and itself)
+    up-to-date.
+*   Providing those applications with services to manage their installation.
+*   Providing update servers with anonymous telemetry about those applications.
+*   Detecting the uninstallation of those applications, and automatically
+    removing itself when all other applications have been uninstalled.
+
+The behavior of the updater is mostly platform-independent. However, platform-
+specific modules exist to translate cross-platform concepts (such as IPC
+interfaces) to platform-specific technologies (such as COM or XPC).
+Additionally, some updater behavior related to installs and uninstalls are
+tailored to platform conventions.
+
+The updater is layered atop //components/update\_client, which implements a
+cross-platform mechanism to interact with an Omaha server for the purpose of
+updating CRXs. //components/update\_client is also used by the component and
+extension updaters in Chrome.
+
+To keep applications up-to-date, the updater periodically polls an Omaha server,
+communicating the state of installed applications, and receiving update
+instructions. It applies updates the server instructs it to, and then reports
+the results of the operation back to Omaha servers.
+
+## Detailed Design
+Once installed, the updater operates as a collection of processes that are
+launched on-demand and orchestrate their operations over IPC. The *server
+process* hosts an engine that conducts most of the work of updating software,
+and it is driven by *client processes* that issue commands to it and potentially
+display UI to the user.
+
+The updater may be installed *per-user* or *system-wide*. If installed per-user,
+the updater can only update applications owned by that user, whereas a system-
+wide updater can update applications owned by any entity on the system. In
+multi-user systems, it is efficient for software such as the browser to be
+installed system-wide, owned by root (or the system user) and run by individual
+users, but this requires the updater to maintain root privileges in order to
+update it. Therefore, in a system-wide installation, the server process runs as
+root (or at high integrity). A system-wide installation of the updater and any
+number of per-user installations of the updater can coexist and operate
+independently on the same system.
+
+Different versions of the updater can coexist even within the same installation
+of the updater, but only one such instance is *active*. Inactive versions of the
+updater periodically attempt to *qualify* themselves by running self-tests and
+(if they pass) take over as the active updater; or uninstall themselves as out
+of date once a newer version of the updater has activated.
+
+The functionality of the server process is split into two interfaces:
+*   UpdateService, which is served only by the active instance and may be called
+    by any client. When an instance activates, it replaces IPC registrations so
+    that UpdateService routes to it.
+*   UpdateServiceInternal, which is served by all instances but may only be
+    called by updater clients of the same version.
+
+Where necessary, the updater acquires a single cross-process lock to prevent
+races between activations and ongoing update operations.
+
+### Installing the Updater
+Instances of the updater are installed in one of the following ways:
+*   A user runs an installer for the updater with the intent of installing an
+    application. The updater will install itself, and then use itself to install
+    the application. (This is the primary flow on Windows.)
+*   An application installs the updater as part of its own installation,
+    first-run experience, or repair/recovery. (This is the primary flow on
+    macOS.)
+*   The updater downloads an update for itself and installs it.
+
+#### Updater Installer Types
+The updater is distributed via the following installer types:
+*   Online Installers
+*   Offline Installers
+
+##### Online Installers
+An online installer installs the updater and then acts as a client process and
+commands the server process to install the application the user desired.
+
+Online installers are composed of three parts: a *tag*, a *metainstaller*, and
+an *updater resource*. The metainstaller is a lightweight executable that
+uncompresses its updater resource into a safe temporary directory and then 
+launches the updater's setup client process (`--install`). It passes along the
+tag, an unsigned (and untrusted) piece of data that is embedded in the
+executable which communicates the installation parameters for the software the
+user is trying to install.
+
+###### Tagging
+TODO(crbug.com/1035895): Document tagging format, process, contents.
+
+###### Updater Resource Extraction
+TODO(crbug.com/1035895): Document updater resource compression.
+
+Online installers are typically run by the end user after being downloaded from
+the Internet. When the installer is executed, the OS launches it at
 [medium integrity](https://docs.microsoft.com/en-us/windows/win32/secauthz/mandatory-integrity-control).
-In order to be able to install a system application (i.e., an application
-installed for all users on the system), this metainstaller needs to run with
-administrative privileges.
 
-To achieve this, the metainstaller detects this condition (running at medium but
-trying to install a system app) early on, and re-launches itself at high
-integrity. This will result in an
+However, depending on the tag, the updater and application may need to be
+installed system-wide. To achieve this, the metainstaller must re-launch itself
+at high integrity. This will result in an
 [UAC prompt](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works)
 on Windows.
 
-The process flow looks like this:
+The metainstaller determines whether to relaunch before unpacking the updater
+resources, since unpacking to a user-writable temp directory is not secure for
+a system-wide installation.
 
-```
-UpdaterSetup
-  -> Detects the need for elevation
-    -> Elevates UpdaterSetup and add `--expect-elevated` switch
-      -> UpdaterSetup installs the updater and application to %ProgramFiles%
-```
+The metainstaller appends the `--expect-elevated` switch to the relaunch command
+line, to allow the relaunched process to exit with an error if it is not running
+at the correct integrity level.
 
-## Dynamic Install Parameters
+##### Offline Installers
+TODO(crbug.com/1035895): Document the standalone installer.
 
-### `installdataindex`
+TODO(crbug.com/1035895): Document bundling the updater with apps.
+
+#### Activation
+TODO(crbug.com/1035895): Add the state flowchart.
+
+Instances are installed in the `Unqualified` state. Whenever an instance’s
+server starts up, it checks whether it should transition to a new state. Only
+the server instance in the `Active` state is permitted to make changes to the
+various applications managed by the updater. When an updater enters the
+`Active` state, previously active updaters will discover when they next start
+up that they should transition out of the `Active` state and uninstall
+themselves.
+
+TODO(crbug.com/1035895): Add the mode check algorithm.
+
+### Installing Applications
+TODO(crbug.com/1035895): Describe app installs.
+
+TODO(crbug.com/1035895): Describe installer APIs (per platform).
+
+TODO(crbug.com/1035895): Document UI, accessibility, internationalization.
+
+TODO(crbug.com/1035895): Document relevant enterprise policies.
+
+TODO(crbug.com/1035895): Document registration API.
+
+#### Dynamic Install Parameters
+
+##### `installdataindex`
 
 `installdataindex` is one of the install parameters that can be specified for
 first installs on the command line or via the
@@ -187,3 +306,81 @@
 The updater will not delete this file.
 * This installerdata is not persisted anywhere else, and it is not sent as a
 part of pings to the update server.
+
+### Updating Applications
+TODO(crbug.com/1035895): Document scheduler.
+
+TODO(crbug.com/1035895): Document differential updates.
+
+TODO(crbug.com/1035895): Document recovery.
+
+TODO(crbug.com/1035895): Document actives API & user count telemetry.
+
+TODO(crbug.com/1035895): Document relevant enterprise policies.
+
+TODO(crbug.com/1035895): Document ticket promotion (macOS).
+
+TODO(crbug.com/1035895): Document usage-stats opt-in.
+
+TODO(crbug.com/1035895): Document EULA/ToS acceptance.
+
+### Uninstalling Applications
+TODO(crbug.com/1035895): Document uninstallation API.
+
+TODO(crbug.com/1035895): Document file-based existence checker on macOS.
+
+TODO(crbug.com/1035895): Document registry-based existence checker on Windows.
+
+TODO(crbug.com/1035895): Document updater uninstallation.
+
+### Advanced Topics
+
+#### State
+TODO(crbug.com/1035895): Document prefs (global & local).
+
+TODO(crbug.com/1035895): Document usage of registry on Windows.
+
+TODO(crbug.com/1035895): Document usage of Keystone tickets on macOS.
+
+#### IPC
+TODO(crbug.com/1035895): Document COM.
+
+TODO(crbug.com/1035895): Document XPC.
+
+TODO(crbug.com/1035895): Document any IPC fallbacks that exist.
+
+#### Network
+TODO(crbug.com/1035895): Document network stack (per platform).
+
+TODO(crbug.com/1035895): Document CUP.
+
+TODO(crbug.com/1035895): Document anti-DoS headers.
+
+TODO(crbug.com/1035895): Document X-Retry-After behavior.
+
+TODO(crbug.com/1035895): Document proxy behavior.
+
+## Testing
+TODO(crbug.com/1035895): Document testing strategies, framework.
+
+TODO(crbug.com/1035895): Document test build.
+
+TODO(crbug.com/1035895): Document external constants override.
+
+TODO(crbug.com/1035895): Document builders & test machines.
+
+TODO(crbug.com/1035895): Document old updater in third\_party.
+
+TODO(crbug.com/1035895): Document manual testing tools.
+
+## Release
+TODO(crbug.com/1035895): Document build.
+
+TODO(crbug.com/1035895): Document signing.
+
+TODO(crbug.com/1035895): Document branching & versioning.
+
+TODO(crbug.com/1035895): Document A/B release qualification process.
+
+## Tools
+TODO(crbug.com/1035895): Document tagger.
diff --git a/infra/config/generated/builders/ci/GPU Win x64 Builder/properties.json b/infra/config/generated/builders/ci/GPU Win x64 Builder/properties.json
index 94f3cb4..9b68118 100644
--- a/infra/config/generated/builders/ci/GPU Win x64 Builder/properties.json
+++ b/infra/config/generated/builders/ci/GPU Win x64 Builder/properties.json
@@ -1,9 +1,99 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "GPU Win x64 Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-gpu-archive",
+              "builder_group": "chromium.gpu",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win10 x64 Release (NVIDIA)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-gpu-archive",
+              "builder_group": "chromium.gpu",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "GPU Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "GPU Win x64 Builder",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "Win10 x64 Release (NVIDIA)",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng",
+          "group": "tryserver.chromium.win"
+        },
+        {
+          "builder": "win10_chromium_x64_rel_ng",
+          "group": "tryserver.chromium.win"
+        }
+      ]
+    }
+  },
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 80,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git "a/infra/config/generated/builders/ci/Win 7 Tests x64 \0501\051/properties.json" "b/infra/config/generated/builders/ci/Win 7 Tests x64 \0501\051/properties.json"
index ccc0012..3d8e417 100644
--- "a/infra/config/generated/builders/ci/Win 7 Tests x64 \0501\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win 7 Tests x64 \0501\051/properties.json"
@@ -1,4 +1,81 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win 7 Tests x64 (1)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win x64 Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Win 7 Tests x64 (1)",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "win_chromium_x64_rel_ng",
+          "group": "tryserver.chromium.win"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": true,
     "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/ci/Win x64 Builder/properties.json b/infra/config/generated/builders/ci/Win x64 Builder/properties.json
index ccc0012..44d3421e 100644
--- a/infra/config/generated/builders/ci/Win x64 Builder/properties.json
+++ b/infra/config/generated/builders/ci/Win x64 Builder/properties.json
@@ -1,9 +1,178 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win 7 Tests x64 (1)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win x64 Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win10 Tests x64",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win11 Tests x64",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-fyi-archive",
+              "builder_group": "chromium.fyi",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Win x64 Builder",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "Win 7 Tests x64 (1)",
+          "project": "chromium"
+        },
+        {
+          "bucket": "ci",
+          "builder": "Win10 Tests x64",
+          "project": "chromium"
+        },
+        {
+          "bucket": "ci",
+          "builder": "Win11 Tests x64",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng",
+          "group": "tryserver.chromium.win"
+        },
+        {
+          "builder": "win10_chromium_x64_rel_ng",
+          "group": "tryserver.chromium.win"
+        },
+        {
+          "builder": "win11-x64-fyi-rel",
+          "group": "tryserver.chromium.win"
+        },
+        {
+          "builder": "win_chromium_x64_rel_ng",
+          "group": "tryserver.chromium.win"
+        }
+      ]
+    }
+  },
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/Win10 Tests x64/properties.json b/infra/config/generated/builders/ci/Win10 Tests x64/properties.json
index ccc0012..720e9e8 100644
--- a/infra/config/generated/builders/ci/Win10 Tests x64/properties.json
+++ b/infra/config/generated/builders/ci/Win10 Tests x64/properties.json
@@ -1,4 +1,88 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win x64 Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win10 Tests x64",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Win10 Tests x64",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng",
+          "group": "tryserver.chromium.win"
+        },
+        {
+          "builder": "win10_chromium_x64_rel_ng",
+          "group": "tryserver.chromium.win"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": true,
     "rpc_extra_params": "?prod",
diff --git "a/infra/config/generated/builders/ci/Win10 x64 Release \050NVIDIA\051/properties.json" "b/infra/config/generated/builders/ci/Win10 x64 Release \050NVIDIA\051/properties.json"
index 330bb143..49694ae 100644
--- "a/infra/config/generated/builders/ci/Win10 x64 Release \050NVIDIA\051/properties.json"
+++ "b/infra/config/generated/builders/ci/Win10 x64 Release \050NVIDIA\051/properties.json"
@@ -1,4 +1,88 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "GPU Win x64 Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-gpu-archive",
+              "builder_group": "chromium.gpu",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win10 x64 Release (NVIDIA)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-gpu-archive",
+              "builder_group": "chromium.gpu",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "GPU Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Win10 x64 Release (NVIDIA)",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng",
+          "group": "tryserver.chromium.win"
+        },
+        {
+          "builder": "win10_chromium_x64_rel_ng",
+          "group": "tryserver.chromium.win"
+        }
+      ]
+    }
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/Win11 Tests x64/properties.json b/infra/config/generated/builders/ci/Win11 Tests x64/properties.json
index ef42b767..86694361 100644
--- a/infra/config/generated/builders/ci/Win11 Tests x64/properties.json
+++ b/infra/config/generated/builders/ci/Win11 Tests x64/properties.json
@@ -1,4 +1,84 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win x64 Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win11 Tests x64",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-fyi-archive",
+              "builder_group": "chromium.fyi",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Win11 Tests x64",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "win11-x64-fyi-rel",
+          "group": "tryserver.chromium.win"
+        }
+      ]
+    }
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/win-annotator-rel/properties.json b/infra/config/generated/builders/ci/win-annotator-rel/properties.json
index fc3bce3..c5b49c9 100644
--- a/infra/config/generated/builders/ci/win-annotator-rel/properties.json
+++ b/infra/config/generated/builders/ci/win-annotator-rel/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 80,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/win-asan/properties.json b/infra/config/generated/builders/ci/win-asan/properties.json
index a68e122..04c212c 100644
--- a/infra/config/generated/builders/ci/win-asan/properties.json
+++ b/infra/config/generated/builders/ci/win-asan/properties.json
@@ -1,10 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "jobs": 500,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/win-backuprefptr-x86-fyi-rel/properties.json b/infra/config/generated/builders/ci/win-backuprefptr-x86-fyi-rel/properties.json
index fc3bce3..c5b49c9 100644
--- a/infra/config/generated/builders/ci/win-backuprefptr-x86-fyi-rel/properties.json
+++ b/infra/config/generated/builders/ci/win-backuprefptr-x86-fyi-rel/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 80,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/win-swangle-chromium-x86/properties.json b/infra/config/generated/builders/ci/win-swangle-chromium-x86/properties.json
index 31e1f463..91ee1f3 100644
--- a/infra/config/generated/builders/ci/win-swangle-chromium-x86/properties.json
+++ b/infra/config/generated/builders/ci/win-swangle-chromium-x86/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 80,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/win-swangle-x64/properties.json b/infra/config/generated/builders/ci/win-swangle-x64/properties.json
index 31e1f463..91ee1f3 100644
--- a/infra/config/generated/builders/ci/win-swangle-x64/properties.json
+++ b/infra/config/generated/builders/ci/win-swangle-x64/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 80,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/win-updater-builder-rel/properties.json b/infra/config/generated/builders/ci/win-updater-builder-rel/properties.json
index 5988b8a..78c43f5 100644
--- a/infra/config/generated/builders/ci/win-updater-builder-rel/properties.json
+++ b/infra/config/generated/builders/ci/win-updater-builder-rel/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 80,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/win32-archive-dbg/properties.json b/infra/config/generated/builders/ci/win32-archive-dbg/properties.json
index 016a2a08..c518c1c5 100644
--- a/infra/config/generated/builders/ci/win32-archive-dbg/properties.json
+++ b/infra/config/generated/builders/ci/win32-archive-dbg/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 250,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/ci/win32-updater-builder-rel/properties.json b/infra/config/generated/builders/ci/win32-updater-builder-rel/properties.json
index 5988b8a..78c43f5 100644
--- a/infra/config/generated/builders/ci/win32-updater-builder-rel/properties.json
+++ b/infra/config/generated/builders/ci/win32-updater-builder-rel/properties.json
@@ -1,9 +1,8 @@
 {
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
+  "$build/reclient": {
+    "instance": "rbe-chromium-trusted",
+    "jobs": 80,
+    "metrics_project": "chromium-reclient-metrics"
   },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
diff --git a/infra/config/generated/builders/reclient/Win x64 Builder reclient staging/properties.json b/infra/config/generated/builders/reclient/Win x64 Builder reclient staging/properties.json
index 7ec74ea..46100e66 100644
--- a/infra/config/generated/builders/reclient/Win x64 Builder reclient staging/properties.json
+++ b/infra/config/generated/builders/reclient/Win x64 Builder reclient staging/properties.json
@@ -1,4 +1,48 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "reclient",
+              "builder": "Win x64 Builder reclient staging",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-fyi-archive",
+              "builder_group": "chromium.reclient.fyi",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage",
+                  "enable_reclient",
+                  "reclient_staging"
+                ],
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "reclient",
+          "builder": "Win x64 Builder reclient staging",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/reclient": {
     "instance": "rbe-chromium-trusted",
     "metrics_project": "chromium-reclient-metrics"
diff --git a/infra/config/generated/builders/reclient/Win x64 Builder reclient test/properties.json b/infra/config/generated/builders/reclient/Win x64 Builder reclient test/properties.json
index 254af6a..c978c0db 100644
--- a/infra/config/generated/builders/reclient/Win x64 Builder reclient test/properties.json
+++ b/infra/config/generated/builders/reclient/Win x64 Builder reclient test/properties.json
@@ -1,4 +1,48 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "reclient",
+              "builder": "Win x64 Builder reclient test",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-fyi-archive",
+              "builder_group": "chromium.reclient.fyi",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage",
+                  "enable_reclient",
+                  "reclient_test"
+                ],
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "reclient",
+          "builder": "Win x64 Builder reclient test",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/reclient": {
     "instance": "goma-foundry-experiments",
     "metrics_project": "chromium-reclient-metrics"
diff --git a/infra/config/generated/builders/try/win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng/properties.json b/infra/config/generated/builders/try/win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng/properties.json
index d4fde02b..db7591d 100644
--- a/infra/config/generated/builders/try/win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng/properties.json
+++ b/infra/config/generated/builders/try/win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng/properties.json
@@ -1,4 +1,154 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "GPU Win x64 Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-gpu-archive",
+              "builder_group": "chromium.gpu",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win x64 Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win10 Tests x64",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win10 x64 Release (NVIDIA)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-gpu-archive",
+              "builder_group": "chromium.gpu",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "GPU Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "GPU Win x64 Builder",
+          "project": "chromium"
+        },
+        {
+          "bucket": "ci",
+          "builder": "Win x64 Builder",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "Win10 Tests x64",
+          "project": "chromium"
+        },
+        {
+          "bucket": "ci",
+          "builder": "Win10 x64 Release (NVIDIA)",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": false,
     "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/try/win10_chromium_x64_rel_ng-compilator/properties.json b/infra/config/generated/builders/try/win10_chromium_x64_rel_ng-compilator/properties.json
index 6d9233ee..2f5679a 100644
--- a/infra/config/generated/builders/try/win10_chromium_x64_rel_ng-compilator/properties.json
+++ b/infra/config/generated/builders/try/win10_chromium_x64_rel_ng-compilator/properties.json
@@ -1,4 +1,157 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "GPU Win x64 Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-gpu-archive",
+              "builder_group": "chromium.gpu",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win x64 Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win10 Tests x64",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win10 x64 Release (NVIDIA)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-gpu-archive",
+              "builder_group": "chromium.gpu",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "GPU Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "GPU Win x64 Builder",
+          "project": "chromium"
+        },
+        {
+          "bucket": "ci",
+          "builder": "Win x64 Builder",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "Win10 Tests x64",
+          "project": "chromium"
+        },
+        {
+          "bucket": "ci",
+          "builder": "Win10 x64 Release (NVIDIA)",
+          "project": "chromium"
+        }
+      ],
+      "rts_config": {
+        "condition": "QUICK_RUN_ONLY"
+      }
+    }
+  },
   "$build/code_coverage": {
     "coverage_test_types": [
       "unit",
diff --git a/infra/config/generated/builders/try/win10_chromium_x64_rel_ng/properties.json b/infra/config/generated/builders/try/win10_chromium_x64_rel_ng/properties.json
index 85a6e86..e7225eb 100644
--- a/infra/config/generated/builders/try/win10_chromium_x64_rel_ng/properties.json
+++ b/infra/config/generated/builders/try/win10_chromium_x64_rel_ng/properties.json
@@ -3,6 +3,159 @@
     "compilator": "win10_chromium_x64_rel_ng-compilator",
     "compilator_watcher_git_revision": "7809a690bbd935bcb3b4d922e24cabe168aaabc8"
   },
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "GPU Win x64 Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-gpu-archive",
+              "builder_group": "chromium.gpu",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win x64 Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win10 Tests x64",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win10 x64 Release (NVIDIA)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-gpu-archive",
+              "builder_group": "chromium.gpu",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "GPU Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "GPU Win x64 Builder",
+          "project": "chromium"
+        },
+        {
+          "bucket": "ci",
+          "builder": "Win x64 Builder",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "Win10 Tests x64",
+          "project": "chromium"
+        },
+        {
+          "bucket": "ci",
+          "builder": "Win10 x64 Release (NVIDIA)",
+          "project": "chromium"
+        }
+      ],
+      "rts_config": {
+        "condition": "QUICK_RUN_ONLY"
+      }
+    }
+  },
   "$build/code_coverage": {
     "coverage_test_types": [
       "unit",
diff --git a/infra/config/generated/builders/try/win11-x64-fyi-rel/properties.json b/infra/config/generated/builders/try/win11-x64-fyi-rel/properties.json
index b8b797a..741ef58e 100644
--- a/infra/config/generated/builders/try/win11-x64-fyi-rel/properties.json
+++ b/infra/config/generated/builders/try/win11-x64-fyi-rel/properties.json
@@ -1,4 +1,85 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win x64 Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win11 Tests x64",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-fyi-archive",
+              "builder_group": "chromium.fyi",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Win x64 Builder",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "Win11 Tests x64",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/code_coverage": {
     "coverage_test_types": [
       "unit",
diff --git a/infra/config/generated/builders/try/win_chromium_x64_rel_ng/properties.json b/infra/config/generated/builders/try/win_chromium_x64_rel_ng/properties.json
index d4fde02b..45009387 100644
--- a/infra/config/generated/builders/try/win_chromium_x64_rel_ng/properties.json
+++ b/infra/config/generated/builders/try/win_chromium_x64_rel_ng/properties.json
@@ -1,4 +1,82 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win 7 Tests x64 (1)",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              },
+              "parent": {
+                "bucket": "ci",
+                "builder": "Win x64 Builder",
+                "project": "chromium"
+              }
+            }
+          },
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "Win x64 Builder",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "build_gs_bucket": "chromium-win-archive",
+              "builder_group": "chromium.win",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64,
+                "target_platform": "win"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "use_clang_coverage"
+                ],
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "Win x64 Builder",
+          "project": "chromium"
+        }
+      ],
+      "builder_ids_in_scope_for_testing": [
+        {
+          "bucket": "ci",
+          "builder": "Win 7 Tests x64 (1)",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": false,
     "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 038d064d..75314c2 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -39835,11 +39835,10 @@
       }
       properties:
         '{'
-        '  "$build/goma": {'
-        '    "enable_ats": true,'
-        '    "rpc_extra_params": "?prod",'
-        '    "server_host": "goma.chromium.org",'
-        '    "use_luci_auth": true'
+        '  "$build/reclient": {'
+        '    "instance": "rbe-chromium-trusted",'
+        '    "jobs": 80,'
+        '    "metrics_project": "chromium-reclient-metrics"'
         '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
@@ -39981,11 +39980,10 @@
       }
       properties:
         '{'
-        '  "$build/goma": {'
-        '    "enable_ats": true,'
-        '    "rpc_extra_params": "?prod",'
-        '    "server_host": "goma.chromium.org",'
-        '    "use_luci_auth": true'
+        '  "$build/reclient": {'
+        '    "instance": "rbe-chromium-trusted",'
+        '    "jobs": 80,'
+        '    "metrics_project": "chromium-reclient-metrics"'
         '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
@@ -41155,11 +41153,10 @@
       }
       properties:
         '{'
-        '  "$build/goma": {'
-        '    "enable_ats": true,'
-        '    "rpc_extra_params": "?prod",'
-        '    "server_host": "goma.chromium.org",'
-        '    "use_luci_auth": true'
+        '  "$build/reclient": {'
+        '    "instance": "rbe-chromium-trusted",'
+        '    "jobs": 80,'
+        '    "metrics_project": "chromium-reclient-metrics"'
         '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
@@ -41230,11 +41227,10 @@
       }
       properties:
         '{'
-        '  "$build/goma": {'
-        '    "enable_ats": true,'
-        '    "rpc_extra_params": "?prod",'
-        '    "server_host": "goma.chromium.org",'
-        '    "use_luci_auth": true'
+        '  "$build/reclient": {'
+        '    "instance": "rbe-chromium-trusted",'
+        '    "jobs": 80,'
+        '    "metrics_project": "chromium-reclient-metrics"'
         '  },'
         '  "$recipe_engine/resultdb/test_presentation": {'
         '    "column_keys": [],'
diff --git a/infra/config/subprojects/chromium/ci/chromium.angle.star b/infra/config/subprojects/chromium/ci/chromium.angle.star
index 9fe3ce8..363a107 100644
--- a/infra/config/subprojects/chromium/ci/chromium.angle.star
+++ b/infra/config/subprojects/chromium/ci/chromium.angle.star
@@ -191,6 +191,9 @@
         category = "Windows|Builder|Chromium",
         short_name = "x64",
     ),
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.thin_tester(
@@ -234,6 +237,9 @@
         category = "Windows|Builder|ANGLE",
         short_name = "x64",
     ),
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.thin_tester(
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star
index 024e9ec5a..e7919d30 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -665,6 +665,9 @@
     ),
     notifies = ["chrome-memory-safety"],
     os = os.WINDOWS_ANY,
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.builder(
@@ -1387,6 +1390,25 @@
 
 ci.builder(
     name = "Win11 Tests x64",
+    builder_spec = builder_config.builder_spec(
+        execution_mode = builder_config.execution_mode.TEST,
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+            apply_configs = [
+                "use_clang_coverage",
+            ],
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_bits = 64,
+            target_platform = builder_config.target_platform.WIN,
+        ),
+        build_gs_bucket = "chromium-fyi-archive",
+    ),
     builderless = True,
     console_view_entry = consoles.console_view_entry(
         category = "win11",
@@ -1417,4 +1439,7 @@
     execution_timeout = 16 * time.hour,
     notifies = ["annotator-rel"],
     os = os.WINDOWS_DEFAULT,
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI,
+    reclient_instance = rbe_instance.DEFAULT,
 )
diff --git a/infra/config/subprojects/chromium/ci/chromium.gpu.star b/infra/config/subprojects/chromium/ci/chromium.gpu.star
index c5c6c7de..486d487 100644
--- a/infra/config/subprojects/chromium/ci/chromium.gpu.star
+++ b/infra/config/subprojects/chromium/ci/chromium.gpu.star
@@ -106,10 +106,31 @@
 ci.gpu.windows_builder(
     name = "GPU Win x64 Builder",
     branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE,
+    builder_spec = builder_config.builder_spec(
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+            apply_configs = [
+                "use_clang_coverage",
+            ],
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_bits = 64,
+            target_platform = builder_config.target_platform.WIN,
+        ),
+        build_gs_bucket = "chromium-gpu-archive",
+    ),
     console_view_entry = consoles.console_view_entry(
         category = "Windows",
     ),
     cq_mirrors_console_view = "mirrors",
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.gpu.windows_builder(
@@ -227,6 +248,25 @@
 ci.thin_tester(
     name = "Win10 x64 Release (NVIDIA)",
     branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE,
+    builder_spec = builder_config.builder_spec(
+        execution_mode = builder_config.execution_mode.TEST,
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+            apply_configs = [
+                "use_clang_coverage",
+            ],
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_bits = 64,
+            target_platform = builder_config.target_platform.WIN,
+        ),
+        build_gs_bucket = "chromium-gpu-archive",
+    ),
     console_view_entry = consoles.console_view_entry(
         category = "Windows",
     ),
diff --git a/infra/config/subprojects/chromium/ci/chromium.memory.star b/infra/config/subprojects/chromium/ci/chromium.memory.star
index bb188bb..858c2d8 100644
--- a/infra/config/subprojects/chromium/ci/chromium.memory.star
+++ b/infra/config/subprojects/chromium/ci/chromium.memory.star
@@ -290,4 +290,7 @@
     execution_timeout = 5 * time.hour,
     builderless = True,
     os = os.WINDOWS_DEFAULT,
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.DEFAULT,
+    reclient_instance = rbe_instance.DEFAULT,
 )
diff --git a/infra/config/subprojects/chromium/ci/chromium.star b/infra/config/subprojects/chromium/ci/chromium.star
index 94dff72..cc51b44 100644
--- a/infra/config/subprojects/chromium/ci/chromium.star
+++ b/infra/config/subprojects/chromium/ci/chromium.star
@@ -467,6 +467,9 @@
     cores = 32,
     os = os.WINDOWS_DEFAULT,
     sheriff_rotations = args.ignore_default(None),
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.DEFAULT,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.swangle.star b/infra/config/subprojects/chromium/ci/chromium.swangle.star
index 0ca325d3..5ea741d 100644
--- a/infra/config/subprojects/chromium/ci/chromium.swangle.star
+++ b/infra/config/subprojects/chromium/ci/chromium.swangle.star
@@ -98,7 +98,9 @@
         short_name = "x86",
     ),
     executable = ci.DEFAULT_EXECUTABLE,
-    goma_backend = goma.backend.RBE_PROD,
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.gpu.windows_builder(
@@ -116,7 +118,9 @@
         category = "ToT ANGLE|Windows",
         short_name = "x86",
     ),
-    goma_backend = goma.backend.RBE_PROD,
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.gpu.windows_builder(
@@ -125,7 +129,9 @@
         category = "ToT SwiftShader|Windows",
         short_name = "x64",
     ),
-    goma_backend = goma.backend.RBE_PROD,
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.gpu.windows_builder(
@@ -144,7 +150,9 @@
         short_name = "x64",
     ),
     executable = ci.DEFAULT_EXECUTABLE,
-    goma_backend = goma.backend.RBE_PROD,
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.gpu.windows_builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.updater.star b/infra/config/subprojects/chromium/ci/chromium.updater.star
index ce11948..f6e104051 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/builders.star", "goma", "os")
-load("//lib/ci.star", "ci")
+load("//lib/ci.star", "ci", "rbe_instance", "rbe_jobs")
 load("//lib/consoles.star", "consoles")
 
 ci.defaults.set(
@@ -213,6 +213,9 @@
         short_name = "bld",
     ),
     os = os.WINDOWS_DEFAULT,
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.builder(
@@ -223,6 +226,9 @@
         short_name = "bld",
     ),
     os = os.WINDOWS_DEFAULT,
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.LOW_JOBS_FOR_CI,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.thin_tester(
diff --git a/infra/config/subprojects/chromium/ci/chromium.win.star b/infra/config/subprojects/chromium/ci/chromium.win.star
index a95e47a..239e7c2 100644
--- a/infra/config/subprojects/chromium/ci/chromium.win.star
+++ b/infra/config/subprojects/chromium/ci/chromium.win.star
@@ -5,6 +5,7 @@
 
 load("//lib/args.star", "args")
 load("//lib/branches.star", "branches")
+load("//lib/builder_config.star", "builder_config")
 load("//lib/builders.star", "goma", "os", "sheriff_rotations")
 load("//lib/ci.star", "ci", "rbe_instance", "rbe_jobs")
 load("//lib/consoles.star", "consoles")
@@ -118,6 +119,22 @@
     name = "Win 7 Tests x64 (1)",
     builderless = True,
     branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE,
+    builder_spec = builder_config.builder_spec(
+        execution_mode = builder_config.execution_mode.TEST,
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_bits = 64,
+            target_platform = builder_config.target_platform.WIN,
+        ),
+        build_gs_bucket = "chromium-win-archive",
+    ),
     console_view_entry = consoles.console_view_entry(
         category = "release|tester",
         short_name = "64",
@@ -145,6 +162,24 @@
 ci.builder(
     name = "Win x64 Builder",
     branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE,
+    builder_spec = builder_config.builder_spec(
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+            apply_configs = [
+                "use_clang_coverage",
+            ],
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_bits = 64,
+            target_platform = builder_config.target_platform.WIN,
+        ),
+        build_gs_bucket = "chromium-win-archive",
+    ),
     console_view_entry = consoles.console_view_entry(
         category = "release|builder",
         short_name = "64",
@@ -152,11 +187,33 @@
     cores = 32,
     cq_mirrors_console_view = "mirrors",
     os = os.WINDOWS_ANY,
+    goma_backend = None,
+    reclient_jobs = rbe_jobs.DEFAULT,
+    reclient_instance = rbe_instance.DEFAULT,
 )
 
 ci.builder(
     name = "Win10 Tests x64",
     branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE,
+    builder_spec = builder_config.builder_spec(
+        execution_mode = builder_config.execution_mode.TEST,
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+            apply_configs = [
+                "use_clang_coverage",
+            ],
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_bits = 64,
+            target_platform = builder_config.target_platform.WIN,
+        ),
+        build_gs_bucket = "chromium-win-archive",
+    ),
     console_view_entry = consoles.console_view_entry(
         category = "release|tester",
         short_name = "w10",
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
index 510ce49..63582d70 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
@@ -4,6 +4,7 @@
 """Definitions of builders in the tryserver.chromium.win builder group."""
 
 load("//lib/branches.star", "branches")
+load("//lib/builder_config.star", "builder_config")
 load("//lib/builders.star", "goma", "os")
 load("//lib/try.star", "try_")
 load("//lib/consoles.star", "consoles")
@@ -90,6 +91,10 @@
 
 try_.builder(
     name = "win_chromium_x64_rel_ng",
+    mirrors = [
+        "ci/Win x64 Builder",
+        "ci/Win 7 Tests x64 (1)",
+    ],
 )
 
 try_.builder(
@@ -117,6 +122,10 @@
 
 try_.builder(
     name = "win11-x64-fyi-rel",
+    mirrors = [
+        "ci/Win x64 Builder",
+        "ci/Win11 Tests x64",
+    ],
     builderless = True,
     use_clang_coverage = True,
     coverage_test_types = ["unit", "overall"],
@@ -125,6 +134,12 @@
 
 try_.builder(
     name = "win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng",
+    mirrors = [
+        "ci/Win x64 Builder",
+        "ci/Win10 Tests x64",
+        "ci/GPU Win x64 Builder",
+        "ci/Win10 x64 Release (NVIDIA)",
+    ],
     os = os.WINDOWS_10,
 )
 
@@ -132,6 +147,17 @@
     name = "win10_chromium_x64_rel_ng",
     compilator = "win10_chromium_x64_rel_ng-compilator",
     branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE,
+    mirrors = [
+        "ci/Win x64 Builder",
+        "ci/Win10 Tests x64",
+        "ci/GPU Win x64 Builder",
+        "ci/Win10 x64 Release (NVIDIA)",
+    ],
+    try_settings = builder_config.try_settings(
+        rts_config = builder_config.rts_config(
+            condition = builder_config.rts_condition.QUICK_RUN_ONLY,
+        ),
+    ),
     use_clang_coverage = True,
     coverage_test_types = ["unit", "overall"],
     main_list_view = "try",
diff --git a/infra/config/subprojects/reclient/reclient.star b/infra/config/subprojects/reclient/reclient.star
index d442a10..3db0b3c 100644
--- a/infra/config/subprojects/reclient/reclient.star
+++ b/infra/config/subprojects/reclient/reclient.star
@@ -6,6 +6,7 @@
 load("//lib/builders.star", "cpu", "os")
 load("//lib/ci.star", "ci")
 load("//lib/consoles.star", "consoles")
+load("//lib/structs.star", "structs")
 load("//console-header.star", "HEADER")
 
 luci.bucket(
@@ -91,6 +92,20 @@
 
 fyi_reclient_staging_builder(
     name = "Win x64 Builder reclient staging",
+    builder_spec = builder_config.copy_from(
+        "ci/Win x64 Builder",
+        lambda spec: structs.evolve(
+            spec,
+            gclient_config = structs.extend(
+                spec.gclient_config,
+                apply_configs = [
+                    "enable_reclient",
+                    "reclient_staging",
+                ],
+            ),
+            build_gs_bucket = "chromium-fyi-archive",
+        ),
+    ),
     builderless = True,
     console_view_category = "win",
     cores = 32,
@@ -100,6 +115,20 @@
 
 fyi_reclient_test_builder(
     name = "Win x64 Builder reclient test",
+    builder_spec = builder_config.copy_from(
+        "ci/Win x64 Builder",
+        lambda spec: structs.evolve(
+            spec,
+            gclient_config = structs.extend(
+                spec.gclient_config,
+                apply_configs = [
+                    "enable_reclient",
+                    "reclient_test",
+                ],
+            ),
+            build_gs_bucket = "chromium-fyi-archive",
+        ),
+    ),
     builderless = True,
     console_view_category = "win",
     cores = 32,
diff --git a/ios/chrome/browser/commerce/BUILD.gn b/ios/chrome/browser/commerce/BUILD.gn
index a59b539..efa5fb6d 100644
--- a/ios/chrome/browser/commerce/BUILD.gn
+++ b/ios/chrome/browser/commerce/BUILD.gn
@@ -10,6 +10,7 @@
     "shopping_persisted_data_tab_helper.mm",
   ]
   deps = [
+    ":shopping_service",
     "//components/commerce/core:feature_list",
     "//components/commerce/core:proto",
     "//components/optimization_guide/core:core",
@@ -27,6 +28,23 @@
   configs += [ "//build/config/compiler:enable_arc" ]
 }
 
+static_library("shopping_service") {
+  sources = [
+    "shopping_service_factory.h",
+    "shopping_service_factory.mm",
+  ]
+
+  deps = [
+    "//base",
+    "//components/commerce/core:shopping_service",
+    "//components/keyed_service/ios",
+    "//ios/chrome/browser/browser_state",
+    "//ios/web",
+  ]
+
+  configs += [ "//build/config/compiler:enable_arc" ]
+}
+
 source_set("unit_tests") {
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
diff --git a/ios/chrome/browser/commerce/shopping_service_factory.h b/ios/chrome/browser/commerce/shopping_service_factory.h
new file mode 100644
index 0000000..9f2b832
--- /dev/null
+++ b/ios/chrome/browser/commerce/shopping_service_factory.h
@@ -0,0 +1,43 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_COMMERCE_SHOPPING_SERVICE_FACTORY_H_
+#define IOS_CHROME_BROWSER_COMMERCE_SHOPPING_SERVICE_FACTORY_H_
+
+#include <memory>
+
+#include "base/no_destructor.h"
+#include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
+
+namespace commerce {
+
+class ShoppingService;
+
+class ShoppingServiceFactory : public BrowserStateKeyedServiceFactory {
+ public:
+  ShoppingServiceFactory(const ShoppingServiceFactory&) = delete;
+  ShoppingServiceFactory& operator=(const ShoppingServiceFactory&) = delete;
+
+  static ShoppingServiceFactory* GetInstance();
+
+  static ShoppingService* GetForBrowserState(web::BrowserState* state);
+  static ShoppingService* GetForBrowserStateIfExists(web::BrowserState* state);
+
+ private:
+  friend class base::NoDestructor<ShoppingServiceFactory>;
+
+  ShoppingServiceFactory();
+  ~ShoppingServiceFactory() override = default;
+
+  // BrowserContextKeyedServiceFactory:
+  std::unique_ptr<KeyedService> BuildServiceInstanceFor(
+      web::BrowserState* state) const override;
+  web::BrowserState* GetBrowserStateToUse(
+      web::BrowserState* state) const override;
+  bool ServiceIsNULLWhileTesting() const override;
+};
+
+}  // namespace commerce
+
+#endif  // IOS_CHROME_BROWSER_COMMERCE_SHOPPING_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/commerce/shopping_service_factory.mm b/ios/chrome/browser/commerce/shopping_service_factory.mm
new file mode 100644
index 0000000..08b1ae8
--- /dev/null
+++ b/ios/chrome/browser/commerce/shopping_service_factory.mm
@@ -0,0 +1,56 @@
+// 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 "ios/chrome/browser/commerce/shopping_service_factory.h"
+
+#include "components/commerce/core/shopping_service.h"
+#include "components/keyed_service/ios/browser_state_dependency_manager.h"
+#include "ios/chrome/browser/browser_state/browser_state_otr_helper.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace commerce {
+
+// static
+ShoppingServiceFactory* ShoppingServiceFactory::GetInstance() {
+  static base::NoDestructor<ShoppingServiceFactory> instance;
+  return instance.get();
+}
+
+// static
+ShoppingService* ShoppingServiceFactory::GetForBrowserState(
+    web::BrowserState* state) {
+  return static_cast<ShoppingService*>(
+      GetInstance()->GetServiceForBrowserState(state, true));
+}
+
+// static
+ShoppingService* ShoppingServiceFactory::GetForBrowserStateIfExists(
+    web::BrowserState* state) {
+  return static_cast<ShoppingService*>(
+      GetInstance()->GetServiceForBrowserState(state, false));
+}
+
+ShoppingServiceFactory::ShoppingServiceFactory()
+    : BrowserStateKeyedServiceFactory(
+          "ShoppingService",
+          BrowserStateDependencyManager::GetInstance()) {}
+
+std::unique_ptr<KeyedService> ShoppingServiceFactory::BuildServiceInstanceFor(
+    web::BrowserState* state) const {
+  return std::make_unique<ShoppingService>();
+}
+
+web::BrowserState* ShoppingServiceFactory::GetBrowserStateToUse(
+    web::BrowserState* state) const {
+  return GetBrowserStateRedirectedInIncognito(state);
+}
+
+bool ShoppingServiceFactory::ServiceIsNULLWhileTesting() const {
+  return true;
+}
+
+}  // namespace commerce
diff --git a/remoting/host/client_session.cc b/remoting/host/client_session.cc
index b467c8d..89b9071 100644
--- a/remoting/host/client_session.cc
+++ b/remoting/host/client_session.cc
@@ -565,7 +565,11 @@
 
     video_stream.stream->SelectSource(id);
 
-    video_stream.stream->SetObserver(this);
+    // SetObserver(this) is not called on the new video-stream, because
+    // per-monitor resizing should be handled by OnDesktopDisplayChanged()
+    // rather than OnVideoSizeChanged(). The latter would send out a legacy
+    // (non-extended) video-layout message, which may confuse the client when
+    // multi-stream is being used.
 
     // Pause capturing if necessary.
     video_stream.stream->Pause(pause_video_);
diff --git a/remoting/host/webauthn/remote_webauthn_constants.cc b/remoting/host/webauthn/remote_webauthn_constants.cc
index 1c16c63..86750dc 100644
--- a/remoting/host/webauthn/remote_webauthn_constants.cc
+++ b/remoting/host/webauthn/remote_webauthn_constants.cc
@@ -13,6 +13,7 @@
 const char kCreateMessageType[] = "create";
 const char kGetMessageType[] = "get";
 const char kCancelMessageType[] = "cancel";
+const char kClientDisconnectedMessageType[] = "clientDisconnected";
 
 const char kIsUvpaaResponseIsAvailableKey[] = "isAvailable";
 const char kGetRemoteStateResponseIsRemotedKey[] = "isRemoted";
diff --git a/remoting/host/webauthn/remote_webauthn_constants.h b/remoting/host/webauthn/remote_webauthn_constants.h
index d9ca47ac7..6490581c 100644
--- a/remoting/host/webauthn/remote_webauthn_constants.h
+++ b/remoting/host/webauthn/remote_webauthn_constants.h
@@ -15,6 +15,7 @@
 extern const char kCreateMessageType[];
 extern const char kGetMessageType[];
 extern const char kCancelMessageType[];
+extern const char kClientDisconnectedMessageType[];
 
 // NMH message keys.
 extern const char kIsUvpaaResponseIsAvailableKey[];
diff --git a/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc b/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc
index 41855bc..a9d850a 100644
--- a/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc
+++ b/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc
@@ -128,8 +128,7 @@
   DCHECK(task_runner_->BelongsToCurrentThread());
 
   if (!EnsureIpcConnection()) {
-    response.SetBoolKey(kIsUvpaaResponseIsAvailableKey, false);
-    SendMessageToClient(std::move(response));
+    SendClientDisconnectedMessage();
     return;
   }
 
@@ -148,7 +147,8 @@
 
   DCHECK(task_runner_->BelongsToCurrentThread());
 
-  if (!ConnectIpcOrSendError(response)) {
+  if (!EnsureIpcConnection()) {
+    SendClientDisconnectedMessage();
     return;
   }
   const base::Value* message_id = FindMessageIdOrSendError(response);
@@ -176,7 +176,8 @@
 
   DCHECK(task_runner_->BelongsToCurrentThread());
 
-  if (!ConnectIpcOrSendError(response)) {
+  if (!EnsureIpcConnection()) {
+    SendClientDisconnectedMessage();
     return;
   }
   const base::Value* message_id = FindMessageIdOrSendError(response);
@@ -202,8 +203,7 @@
   //   {id: string, type: 'cancelResponse', wasCanceled: boolean}
 
   if (!EnsureIpcConnection()) {
-    response.SetBoolKey(kCancelResponseWasCanceledKey, false);
-    SendMessageToClient(std::move(response));
+    SendClientDisconnectedMessage();
     return;
   }
 
@@ -257,10 +257,11 @@
 void RemoteWebAuthnNativeMessagingHost::OnIpcDisconnected() {
   DCHECK(task_runner_->BelongsToCurrentThread());
 
-  // TODO(yuweih): Feed pending callbacks with error responses.
   remote_.reset();
   if (!get_remote_state_responses_.empty()) {
     SendNextRemoteState(false);
+  } else {
+    SendClientDisconnectedMessage();
   }
 }
 
@@ -413,21 +414,6 @@
   client_->PostMessageFromNativeHost(message_json);
 }
 
-bool RemoteWebAuthnNativeMessagingHost::ConnectIpcOrSendError(
-    base::Value& response) {
-  DCHECK(task_runner_->BelongsToCurrentThread());
-
-  if (EnsureIpcConnection()) {
-    return true;
-  }
-  // TODO(yuweih): See if this is the right error to use here.
-  response.SetKey(kWebAuthnErrorKey,
-                  CreateWebAuthnExceptionDetailsDict(
-                      "InvalidStateError", "Failed to connect to IPC server."));
-  SendMessageToClient(std::move(response));
-  return false;
-}
-
 const base::Value* RemoteWebAuthnNativeMessagingHost::FindMessageIdOrSendError(
     base::Value& response) {
   const base::Value* message_id = response.FindKey(kMessageId);
@@ -505,4 +491,12 @@
   }
 }
 
+void RemoteWebAuthnNativeMessagingHost::SendClientDisconnectedMessage() {
+  DCHECK(task_runner_->BelongsToCurrentThread());
+
+  base::Value message(base::Value::Type::DICTIONARY);
+  message.SetStringKey(kMessageType, kClientDisconnectedMessageType);
+  SendMessageToClient(std::move(message));
+}
+
 }  // namespace remoting
diff --git a/remoting/host/webauthn/remote_webauthn_native_messaging_host.h b/remoting/host/webauthn/remote_webauthn_native_messaging_host.h
index 0e65ac2..42bab0a 100644
--- a/remoting/host/webauthn/remote_webauthn_native_messaging_host.h
+++ b/remoting/host/webauthn/remote_webauthn_native_messaging_host.h
@@ -67,16 +67,10 @@
 
   // Attempts to connect to the IPC server if the connection has not been
   // established. Returns a boolean indicating whether there is a valid IPC
-  // connection to the crd host
+  // connection to the crd host.
   bool EnsureIpcConnection();
   void SendMessageToClient(base::Value message);
 
-  // Attempts to connect IPC. If it succeeds, |response| will not be touched and
-  // `true` will be returned; if it fails, |response| will be attached with a
-  // WebAuthn error dict and sent to the NMH client, and `false` will be
-  // returned.
-  bool ConnectIpcOrSendError(base::Value& response);
-
   // Finds and returns the message ID from |response|. If message ID is not
   // found, |response| will be attached with a WebAuthn error dict and sent to
   // the NMH client, and `nullptr` will be returned.
@@ -96,6 +90,10 @@
   void OnRequestCancellerDisconnected(
       mojo::RemoteSetElementId disconnecting_canceller);
 
+  // Sends a clientDisconnected message to the extension, so it can detach from
+  // the WebAuthn proxy API and clean up pending requests.
+  void SendClientDisconnectedMessage();
+
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
   raw_ptr<extensions::NativeMessageHost::Client> client_ = nullptr;
   std::unique_ptr<ChromotingHostServicesProvider> host_service_api_client_;
diff --git a/remoting/host/webauthn/remote_webauthn_native_messaging_host_unittest.cc b/remoting/host/webauthn/remote_webauthn_native_messaging_host_unittest.cc
index 0543cdb..1420892 100644
--- a/remoting/host/webauthn/remote_webauthn_native_messaging_host_unittest.cc
+++ b/remoting/host/webauthn/remote_webauthn_native_messaging_host_unittest.cc
@@ -125,6 +125,8 @@
   // Blocks until a new message is received, then returns the message.
   const base::Value& ReadMessage();
 
+  void ResetReceiver();
+
   MockWebAuthnProxy webauthn_proxy_;
   MockChromotingHostServicesProvider* api_provider_;
   MockChromotingSessionServices api_;
@@ -207,6 +209,10 @@
   return latest_message_;
 }
 
+void RemoteWebAuthnNativeMessagingHostTest::ResetReceiver() {
+  webauthn_proxy_receiver_.reset();
+}
+
 TEST_F(RemoteWebAuthnNativeMessagingHostTest, HelloRequest) {
   SendMessage(CreateRequestMessage(kHelloMessage));
 
@@ -257,6 +263,21 @@
   ASSERT_EQ(*response.FindBoolKey(kIsUvpaaResponseIsAvailableKey), true);
 }
 
+TEST_F(RemoteWebAuthnNativeMessagingHostTest,
+       ClientDisconnectedWhenRequestIsPending_MessageSent) {
+  ExpectGetSessionServices();
+  ExpectBindWebAuthnProxy();
+  EXPECT_CALL(webauthn_proxy_, IsUserVerifyingPlatformAuthenticatorAvailable(_))
+      .WillOnce([&](mojom::WebAuthnProxy::
+                        IsUserVerifyingPlatformAuthenticatorAvailableCallback
+                            callback) { ResetReceiver(); });
+  SendMessage(CreateRequestMessage(kIsUvpaaMessageType));
+
+  const base::Value& response = ReadMessage();
+  ASSERT_EQ(*response.FindStringKey(kMessageType),
+            kClientDisconnectedMessageType);
+}
+
 TEST_F(RemoteWebAuthnNativeMessagingHostTest, ParallelIsUvpaaRequests) {
   ExpectGetSessionServices();
   ExpectBindWebAuthnProxy();
@@ -300,7 +321,7 @@
 }
 
 TEST_F(RemoteWebAuthnNativeMessagingHostTest,
-       Create_IpcConnectionFailed_Error) {
+       Create_IpcConnectionFailed_ClientDisconnectMessageSent) {
   ExpectGetSessionServices(false);
   auto request = CreateRequestMessage(kCreateMessageType);
   request.SetStringKey(kCreateRequestDataKey, "fake");
@@ -308,9 +329,8 @@
 
   const base::Value& response = ReadMessage();
 
-  VerifyResponseMessage(response, kCreateMessageType);
-  ASSERT_EQ(response.FindStringKey(kCreateResponseDataKey), nullptr);
-  ASSERT_NE(response.FindKey(kWebAuthnErrorKey), nullptr);
+  ASSERT_EQ(*response.FindStringKey(kMessageType),
+            kClientDisconnectedMessageType);
 }
 
 TEST_F(RemoteWebAuthnNativeMessagingHostTest, Create_EmptyResponse) {
@@ -380,7 +400,8 @@
   ASSERT_NE(response.FindKey(kWebAuthnErrorKey), nullptr);
 }
 
-TEST_F(RemoteWebAuthnNativeMessagingHostTest, Get_IpcConnectionFailed_Error) {
+TEST_F(RemoteWebAuthnNativeMessagingHostTest,
+       Get_IpcConnectionFailed_ClientDisconnectedMessageSent) {
   ExpectGetSessionServices(false);
   auto request = CreateRequestMessage(kGetMessageType);
   request.SetStringKey(kGetRequestDataKey, "fake");
@@ -388,9 +409,8 @@
 
   const base::Value& response = ReadMessage();
 
-  VerifyResponseMessage(response, kGetMessageType);
-  ASSERT_EQ(response.FindStringKey(kGetResponseDataKey), nullptr);
-  ASSERT_NE(response.FindKey(kWebAuthnErrorKey), nullptr);
+  ASSERT_EQ(*response.FindStringKey(kMessageType),
+            kClientDisconnectedMessageType);
 }
 
 TEST_F(RemoteWebAuthnNativeMessagingHostTest, Get_EmptyResponse) {
@@ -446,15 +466,15 @@
 }
 
 TEST_F(RemoteWebAuthnNativeMessagingHostTest,
-       Cancel_IpcConnectionFailed_Failure) {
+       Cancel_IpcConnectionFailed_ClientDisconnectedMessageSent) {
   ExpectGetSessionServices(false);
 
   SendMessage(CreateRequestMessage(kCancelMessageType));
 
   const base::Value& response = ReadMessage();
 
-  VerifyResponseMessage(response, kCancelMessageType);
-  ASSERT_EQ(*response.FindBoolKey(kCancelResponseWasCanceledKey), false);
+  ASSERT_EQ(*response.FindStringKey(kMessageType),
+            kClientDisconnectedMessageType);
 }
 
 TEST_F(RemoteWebAuthnNativeMessagingHostTest, Cancel_NonexistentId_Failure) {
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json
index 1e3e15e..2b9cbb6 100644
--- a/testing/buildbot/chrome.json
+++ b/testing/buildbot/chrome.json
@@ -1727,7 +1727,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_all_tast_tests_eve",
+        "name": "lacros_all_tast_tests eve",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1790,7 +1790,7 @@
         "args": [],
         "cros_board": "atlas",
         "cros_img": "atlas-release/R102-14658.0.0",
-        "name": "lacros_all_tast_tests_ATLAS_RELEASE_LKGM",
+        "name": "lacros_all_tast_tests ATLAS_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1805,7 +1805,7 @@
         "args": [],
         "cros_board": "atlas",
         "cros_img": "atlas-release/R101-14588.23.0",
-        "name": "lacros_all_tast_tests_ATLAS_RELEASE_DEV",
+        "name": "lacros_all_tast_tests ATLAS_RELEASE_DEV",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1820,7 +1820,7 @@
         "args": [],
         "cros_board": "atlas",
         "cros_img": "atlas-release/R100-14526.43.0",
-        "name": "lacros_all_tast_tests_ATLAS_RELEASE_BETA",
+        "name": "lacros_all_tast_tests ATLAS_RELEASE_BETA",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1835,7 +1835,7 @@
         "args": [],
         "cros_board": "atlas",
         "cros_img": "atlas-release/R100-14526.57.0",
-        "name": "lacros_all_tast_tests_ATLAS_RELEASE_STABLE",
+        "name": "lacros_all_tast_tests ATLAS_RELEASE_STABLE",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1850,7 +1850,7 @@
         "args": [],
         "cros_board": "eve",
         "cros_img": "eve-release/R102-14658.0.0",
-        "name": "lacros_all_tast_tests_EVE_RELEASE_LKGM",
+        "name": "lacros_all_tast_tests EVE_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1865,7 +1865,7 @@
         "args": [],
         "cros_board": "eve",
         "cros_img": "eve-release/R101-14588.23.0",
-        "name": "lacros_all_tast_tests_EVE_RELEASE_DEV",
+        "name": "lacros_all_tast_tests EVE_RELEASE_DEV",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1880,7 +1880,7 @@
         "args": [],
         "cros_board": "eve",
         "cros_img": "eve-release/R100-14526.43.0",
-        "name": "lacros_all_tast_tests_EVE_RELEASE_BETA",
+        "name": "lacros_all_tast_tests EVE_RELEASE_BETA",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1895,7 +1895,7 @@
         "args": [],
         "cros_board": "eve",
         "cros_img": "eve-release/R100-14526.57.0",
-        "name": "lacros_all_tast_tests_EVE_RELEASE_STABLE",
+        "name": "lacros_all_tast_tests EVE_RELEASE_STABLE",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1955,7 +1955,7 @@
         "args": [],
         "cros_board": "hana",
         "cros_img": "hana-release/R102-14658.0.0",
-        "name": "lacros_all_tast_tests_HANA_RELEASE_LKGM",
+        "name": "lacros_all_tast_tests HANA_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1970,7 +1970,7 @@
         "args": [],
         "cros_board": "hana",
         "cros_img": "hana-release/R101-14588.23.0",
-        "name": "lacros_all_tast_tests_HANA_RELEASE_LKGM",
+        "name": "lacros_all_tast_tests HANA_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1985,7 +1985,7 @@
         "args": [],
         "cros_board": "hana",
         "cros_img": "hana-release/R101-14583.0.0",
-        "name": "lacros_all_tast_tests_HANA_RELEASE_LKGM",
+        "name": "lacros_all_tast_tests HANA_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2000,7 +2000,7 @@
         "args": [],
         "cros_board": "hana",
         "cros_img": "hana-release/R101-14583.0.0",
-        "name": "lacros_all_tast_tests_HANA_RELEASE_LKGM",
+        "name": "lacros_all_tast_tests HANA_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2015,7 +2015,7 @@
         "args": [],
         "cros_board": "jacuzzi",
         "cros_img": "jacuzzi-release/R102-14658.0.0",
-        "name": "lacros_all_tast_tests_JACUZZI_RELEASE_LKGM",
+        "name": "lacros_all_tast_tests JACUZZI_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2030,7 +2030,7 @@
         "args": [],
         "cros_board": "jacuzzi",
         "cros_img": "jacuzzi-release/R101-14588.23.0",
-        "name": "lacros_all_tast_tests_JACUZZI_RELEASE_DEV",
+        "name": "lacros_all_tast_tests JACUZZI_RELEASE_DEV",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2045,7 +2045,7 @@
         "args": [],
         "cros_board": "jacuzzi",
         "cros_img": "jacuzzi-release/R100-14526.43.0",
-        "name": "lacros_all_tast_tests_JACUZZI_RELEASE_BETA",
+        "name": "lacros_all_tast_tests JACUZZI_RELEASE_BETA",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2060,7 +2060,7 @@
         "args": [],
         "cros_board": "jacuzzi",
         "cros_img": "jacuzzi-release/R100-14526.57.0",
-        "name": "lacros_all_tast_tests_JACUZZI_RELEASE_STABLE",
+        "name": "lacros_all_tast_tests JACUZZI_RELEASE_STABLE",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2077,7 +2077,7 @@
         ],
         "cros_board": "hana",
         "cros_img": "hana-release/R102-14658.0.0",
-        "name": "ozone_unittests_HANA_RELEASE_LKGM",
+        "name": "ozone_unittests HANA_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2093,7 +2093,7 @@
         ],
         "cros_board": "hana",
         "cros_img": "hana-release/R101-14588.23.0",
-        "name": "ozone_unittests_HANA_RELEASE_LKGM",
+        "name": "ozone_unittests HANA_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2109,7 +2109,7 @@
         ],
         "cros_board": "hana",
         "cros_img": "hana-release/R101-14583.0.0",
-        "name": "ozone_unittests_HANA_RELEASE_LKGM",
+        "name": "ozone_unittests HANA_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2125,7 +2125,7 @@
         ],
         "cros_board": "hana",
         "cros_img": "hana-release/R101-14583.0.0",
-        "name": "ozone_unittests_HANA_RELEASE_LKGM",
+        "name": "ozone_unittests HANA_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2141,7 +2141,7 @@
         ],
         "cros_board": "jacuzzi",
         "cros_img": "jacuzzi-release/R102-14658.0.0",
-        "name": "ozone_unittests_JACUZZI_RELEASE_LKGM",
+        "name": "ozone_unittests JACUZZI_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2157,7 +2157,7 @@
         ],
         "cros_board": "jacuzzi",
         "cros_img": "jacuzzi-release/R101-14588.23.0",
-        "name": "ozone_unittests_JACUZZI_RELEASE_DEV",
+        "name": "ozone_unittests JACUZZI_RELEASE_DEV",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2173,7 +2173,7 @@
         ],
         "cros_board": "jacuzzi",
         "cros_img": "jacuzzi-release/R100-14526.43.0",
-        "name": "ozone_unittests_JACUZZI_RELEASE_BETA",
+        "name": "ozone_unittests JACUZZI_RELEASE_BETA",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2189,7 +2189,7 @@
         ],
         "cros_board": "jacuzzi",
         "cros_img": "jacuzzi-release/R100-14526.57.0",
-        "name": "ozone_unittests_JACUZZI_RELEASE_STABLE",
+        "name": "ozone_unittests JACUZZI_RELEASE_STABLE",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2205,7 +2205,7 @@
         ],
         "cros_board": "hana",
         "cros_img": "hana-release/R102-14658.0.0",
-        "name": "viz_unittests_HANA_RELEASE_LKGM",
+        "name": "viz_unittests HANA_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2221,7 +2221,7 @@
         ],
         "cros_board": "hana",
         "cros_img": "hana-release/R101-14588.23.0",
-        "name": "viz_unittests_HANA_RELEASE_LKGM",
+        "name": "viz_unittests HANA_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2237,7 +2237,7 @@
         ],
         "cros_board": "hana",
         "cros_img": "hana-release/R101-14583.0.0",
-        "name": "viz_unittests_HANA_RELEASE_LKGM",
+        "name": "viz_unittests HANA_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2253,7 +2253,7 @@
         ],
         "cros_board": "hana",
         "cros_img": "hana-release/R101-14583.0.0",
-        "name": "viz_unittests_HANA_RELEASE_LKGM",
+        "name": "viz_unittests HANA_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2269,7 +2269,7 @@
         ],
         "cros_board": "jacuzzi",
         "cros_img": "jacuzzi-release/R102-14658.0.0",
-        "name": "viz_unittests_JACUZZI_RELEASE_LKGM",
+        "name": "viz_unittests JACUZZI_RELEASE_LKGM",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2285,7 +2285,7 @@
         ],
         "cros_board": "jacuzzi",
         "cros_img": "jacuzzi-release/R101-14588.23.0",
-        "name": "viz_unittests_JACUZZI_RELEASE_DEV",
+        "name": "viz_unittests JACUZZI_RELEASE_DEV",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2301,7 +2301,7 @@
         ],
         "cros_board": "jacuzzi",
         "cros_img": "jacuzzi-release/R100-14526.43.0",
-        "name": "viz_unittests_JACUZZI_RELEASE_BETA",
+        "name": "viz_unittests JACUZZI_RELEASE_BETA",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -2317,7 +2317,7 @@
         ],
         "cros_board": "jacuzzi",
         "cros_img": "jacuzzi-release/R100-14526.57.0",
-        "name": "viz_unittests_JACUZZI_RELEASE_STABLE",
+        "name": "viz_unittests JACUZZI_RELEASE_STABLE",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -4272,6 +4272,38 @@
           "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test_id_prefix": "ninja://chrome/test:chrome_sizes/"
+      },
+      {
+        "args": [
+          "--git-revision=${got_revision}"
+        ],
+        "isolate_name": "variations_smoke_tests",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "variations_smoke_tests",
+        "precommit_args": [
+          "--gerrit-issue=${patch_issue}",
+          "--gerrit-patchset=${patch_set}",
+          "--buildbucket-id=${buildbucket_build_id}"
+        ],
+        "resultdb": {
+          "enable": true,
+          "result_format": "single"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Mac-10.15",
+              "pool": "chrome.tests"
+            }
+          ],
+          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://chrome/test:variations_smoke_tests/"
       }
     ]
   },
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index c5874ad..fecf27f 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -8085,11 +8085,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_apk_ToT_Tests"
+            "weblayer_instrumentation_test_apk ToT_Tests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_apk_ToT_Tests",
+        "name": "weblayer_instrumentation_test_apk ToT_Tests",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -8163,11 +8163,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_100"
+            "weblayer_skew_tests with_client_from_100"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_100",
+        "name": "weblayer_skew_tests with_client_from_100",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -8247,11 +8247,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_101"
+            "weblayer_skew_tests with_client_from_101"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_101",
+        "name": "weblayer_skew_tests with_client_from_101",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -8331,11 +8331,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_96"
+            "weblayer_skew_tests with_client_from_96"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_96",
+        "name": "weblayer_skew_tests with_client_from_96",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -8415,11 +8415,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_97"
+            "weblayer_skew_tests with_client_from_97"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_97",
+        "name": "weblayer_skew_tests with_client_from_97",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -8499,11 +8499,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_98"
+            "weblayer_skew_tests with_client_from_98"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_98",
+        "name": "weblayer_skew_tests with_client_from_98",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -8583,11 +8583,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_99"
+            "weblayer_skew_tests with_client_from_99"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_99",
+        "name": "weblayer_skew_tests with_client_from_99",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -8667,11 +8667,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_100"
+            "weblayer_skew_tests with_impl_from_100"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_100",
+        "name": "weblayer_skew_tests with_impl_from_100",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -8751,11 +8751,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_101"
+            "weblayer_skew_tests with_impl_from_101"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_101",
+        "name": "weblayer_skew_tests with_impl_from_101",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -8835,11 +8835,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_96"
+            "weblayer_skew_tests with_impl_from_96"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_96",
+        "name": "weblayer_skew_tests with_impl_from_96",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -8919,11 +8919,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_97"
+            "weblayer_skew_tests with_impl_from_97"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_97",
+        "name": "weblayer_skew_tests with_impl_from_97",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -9003,11 +9003,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_98"
+            "weblayer_skew_tests with_impl_from_98"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_98",
+        "name": "weblayer_skew_tests with_impl_from_98",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -9087,11 +9087,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_99"
+            "weblayer_skew_tests with_impl_from_99"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_99",
+        "name": "weblayer_skew_tests with_impl_from_99",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index c5ee9ac..27c482b 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -45836,11 +45836,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_apk_ToT_Tests"
+            "weblayer_instrumentation_test_apk ToT_Tests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_apk_ToT_Tests",
+        "name": "weblayer_instrumentation_test_apk ToT_Tests",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45914,11 +45914,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_100"
+            "weblayer_skew_tests with_client_from_100"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_100",
+        "name": "weblayer_skew_tests with_client_from_100",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45998,11 +45998,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_101"
+            "weblayer_skew_tests with_client_from_101"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_101",
+        "name": "weblayer_skew_tests with_client_from_101",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46082,11 +46082,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_96"
+            "weblayer_skew_tests with_client_from_96"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_96",
+        "name": "weblayer_skew_tests with_client_from_96",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46166,11 +46166,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_97"
+            "weblayer_skew_tests with_client_from_97"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_97",
+        "name": "weblayer_skew_tests with_client_from_97",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46250,11 +46250,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_98"
+            "weblayer_skew_tests with_client_from_98"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_98",
+        "name": "weblayer_skew_tests with_client_from_98",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46334,11 +46334,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_99"
+            "weblayer_skew_tests with_client_from_99"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_99",
+        "name": "weblayer_skew_tests with_client_from_99",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46418,11 +46418,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_100"
+            "weblayer_skew_tests with_impl_from_100"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_100",
+        "name": "weblayer_skew_tests with_impl_from_100",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46502,11 +46502,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_101"
+            "weblayer_skew_tests with_impl_from_101"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_101",
+        "name": "weblayer_skew_tests with_impl_from_101",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46586,11 +46586,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_96"
+            "weblayer_skew_tests with_impl_from_96"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_96",
+        "name": "weblayer_skew_tests with_impl_from_96",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46670,11 +46670,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_97"
+            "weblayer_skew_tests with_impl_from_97"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_97",
+        "name": "weblayer_skew_tests with_impl_from_97",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46754,11 +46754,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_98"
+            "weblayer_skew_tests with_impl_from_98"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_98",
+        "name": "weblayer_skew_tests with_impl_from_98",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46838,11 +46838,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_99"
+            "weblayer_skew_tests with_impl_from_99"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_99",
+        "name": "weblayer_skew_tests with_impl_from_99",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46926,11 +46926,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_chrome_with_client_from_100"
+            "weblayer_skew_tests_with_chrome with_client_from_100"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_chrome_with_client_from_100",
+        "name": "weblayer_skew_tests_with_chrome with_client_from_100",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47010,11 +47010,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_chrome_with_client_from_101"
+            "weblayer_skew_tests_with_chrome with_client_from_101"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_chrome_with_client_from_101",
+        "name": "weblayer_skew_tests_with_chrome with_client_from_101",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47094,11 +47094,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_chrome_with_client_from_96"
+            "weblayer_skew_tests_with_chrome with_client_from_96"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_chrome_with_client_from_96",
+        "name": "weblayer_skew_tests_with_chrome with_client_from_96",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47178,11 +47178,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_chrome_with_client_from_97"
+            "weblayer_skew_tests_with_chrome with_client_from_97"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_chrome_with_client_from_97",
+        "name": "weblayer_skew_tests_with_chrome with_client_from_97",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47262,11 +47262,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_chrome_with_client_from_98"
+            "weblayer_skew_tests_with_chrome with_client_from_98"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_chrome_with_client_from_98",
+        "name": "weblayer_skew_tests_with_chrome with_client_from_98",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47346,11 +47346,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_chrome_with_client_from_99"
+            "weblayer_skew_tests_with_chrome with_client_from_99"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_chrome_with_client_from_99",
+        "name": "weblayer_skew_tests_with_chrome with_client_from_99",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47430,11 +47430,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_chrome_with_impl_from_100"
+            "weblayer_skew_tests_with_chrome with_impl_from_100"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_chrome_with_impl_from_100",
+        "name": "weblayer_skew_tests_with_chrome with_impl_from_100",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47514,11 +47514,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_chrome_with_impl_from_101"
+            "weblayer_skew_tests_with_chrome with_impl_from_101"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_chrome_with_impl_from_101",
+        "name": "weblayer_skew_tests_with_chrome with_impl_from_101",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47598,11 +47598,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_chrome_with_impl_from_96"
+            "weblayer_skew_tests_with_chrome with_impl_from_96"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_chrome_with_impl_from_96",
+        "name": "weblayer_skew_tests_with_chrome with_impl_from_96",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47682,11 +47682,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_chrome_with_impl_from_97"
+            "weblayer_skew_tests_with_chrome with_impl_from_97"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_chrome_with_impl_from_97",
+        "name": "weblayer_skew_tests_with_chrome with_impl_from_97",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47766,11 +47766,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_chrome_with_impl_from_98"
+            "weblayer_skew_tests_with_chrome with_impl_from_98"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_chrome_with_impl_from_98",
+        "name": "weblayer_skew_tests_with_chrome with_impl_from_98",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47850,11 +47850,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_chrome_with_impl_from_99"
+            "weblayer_skew_tests_with_chrome with_impl_from_99"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_chrome_with_impl_from_99",
+        "name": "weblayer_skew_tests_with_chrome with_impl_from_99",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47927,11 +47927,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_apk_ToT_Tests"
+            "weblayer_instrumentation_test_apk ToT_Tests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_apk_ToT_Tests",
+        "name": "weblayer_instrumentation_test_apk ToT_Tests",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48005,11 +48005,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_100"
+            "weblayer_skew_tests with_client_from_100"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_100",
+        "name": "weblayer_skew_tests with_client_from_100",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48089,11 +48089,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_101"
+            "weblayer_skew_tests with_client_from_101"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_101",
+        "name": "weblayer_skew_tests with_client_from_101",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48173,11 +48173,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_96"
+            "weblayer_skew_tests with_client_from_96"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_96",
+        "name": "weblayer_skew_tests with_client_from_96",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48257,11 +48257,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_97"
+            "weblayer_skew_tests with_client_from_97"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_97",
+        "name": "weblayer_skew_tests with_client_from_97",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48341,11 +48341,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_98"
+            "weblayer_skew_tests with_client_from_98"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_98",
+        "name": "weblayer_skew_tests with_client_from_98",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48425,11 +48425,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_99"
+            "weblayer_skew_tests with_client_from_99"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_99",
+        "name": "weblayer_skew_tests with_client_from_99",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48509,11 +48509,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_100"
+            "weblayer_skew_tests with_impl_from_100"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_100",
+        "name": "weblayer_skew_tests with_impl_from_100",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48593,11 +48593,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_101"
+            "weblayer_skew_tests with_impl_from_101"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_101",
+        "name": "weblayer_skew_tests with_impl_from_101",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48677,11 +48677,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_96"
+            "weblayer_skew_tests with_impl_from_96"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_96",
+        "name": "weblayer_skew_tests with_impl_from_96",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48761,11 +48761,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_97"
+            "weblayer_skew_tests with_impl_from_97"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_97",
+        "name": "weblayer_skew_tests with_impl_from_97",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48845,11 +48845,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_98"
+            "weblayer_skew_tests with_impl_from_98"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_98",
+        "name": "weblayer_skew_tests with_impl_from_98",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48929,11 +48929,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_99"
+            "weblayer_skew_tests with_impl_from_99"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_99",
+        "name": "weblayer_skew_tests with_impl_from_99",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49006,11 +49006,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_instrumentation_test_apk_ToT_Tests"
+            "weblayer_instrumentation_test_apk ToT_Tests"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_instrumentation_test_apk_ToT_Tests",
+        "name": "weblayer_instrumentation_test_apk ToT_Tests",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49084,11 +49084,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_100"
+            "weblayer_skew_tests with_client_from_100"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_100",
+        "name": "weblayer_skew_tests with_client_from_100",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49168,11 +49168,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_101"
+            "weblayer_skew_tests with_client_from_101"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_101",
+        "name": "weblayer_skew_tests with_client_from_101",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49252,11 +49252,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_96"
+            "weblayer_skew_tests with_client_from_96"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_96",
+        "name": "weblayer_skew_tests with_client_from_96",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49336,11 +49336,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_97"
+            "weblayer_skew_tests with_client_from_97"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_97",
+        "name": "weblayer_skew_tests with_client_from_97",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49420,11 +49420,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_98"
+            "weblayer_skew_tests with_client_from_98"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_98",
+        "name": "weblayer_skew_tests with_client_from_98",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49504,11 +49504,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_client_from_99"
+            "weblayer_skew_tests with_client_from_99"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_client_from_99",
+        "name": "weblayer_skew_tests with_client_from_99",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49588,11 +49588,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_100"
+            "weblayer_skew_tests with_impl_from_100"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_100",
+        "name": "weblayer_skew_tests with_impl_from_100",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49672,11 +49672,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_101"
+            "weblayer_skew_tests with_impl_from_101"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_101",
+        "name": "weblayer_skew_tests with_impl_from_101",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49756,11 +49756,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_96"
+            "weblayer_skew_tests with_impl_from_96"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_96",
+        "name": "weblayer_skew_tests with_impl_from_96",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49840,11 +49840,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_97"
+            "weblayer_skew_tests with_impl_from_97"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_97",
+        "name": "weblayer_skew_tests with_impl_from_97",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49924,11 +49924,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_98"
+            "weblayer_skew_tests with_impl_from_98"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_98",
+        "name": "weblayer_skew_tests with_impl_from_98",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50008,11 +50008,11 @@
             "--bucket",
             "chromium-result-details",
             "--test-name",
-            "weblayer_skew_tests_with_impl_from_99"
+            "weblayer_skew_tests with_impl_from_99"
           ],
           "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
         },
-        "name": "weblayer_skew_tests_with_impl_from_99",
+        "name": "weblayer_skew_tests with_impl_from_99",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
diff --git a/testing/buildbot/chromium.angle.json b/testing/buildbot/chromium.angle.json
index 8639f5a..74d6fde1 100644
--- a/testing/buildbot/chromium.angle.json
+++ b/testing/buildbot/chromium.angle.json
@@ -282,7 +282,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "angle_end2end_tests_iPhone X 14.4",
+        "name": "angle_end2end_tests iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -341,7 +341,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "angle_white_box_tests_iPhone X 14.4",
+        "name": "angle_white_box_tests iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 8faa0d0..77cea3d 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -1382,7 +1382,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "cc_unittests_amd64-generic",
+        "name": "cc_unittests amd64-generic",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1410,7 +1410,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "cc_unittests_eve",
+        "name": "cc_unittests eve",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1440,7 +1440,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_all_tast_tests_amd64-generic",
+        "name": "lacros_all_tast_tests amd64-generic",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1469,7 +1469,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_all_tast_tests_eve",
+        "name": "lacros_all_tast_tests eve",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1500,7 +1500,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "ozone_unittests_amd64-generic",
+        "name": "ozone_unittests amd64-generic",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -1528,7 +1528,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "ozone_unittests_eve",
+        "name": "ozone_unittests eve",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -5743,28 +5743,6 @@
       },
       {
         "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "lacros_chrome_browsertests_Lacros plus ToT ash",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "lacros_chrome_browsertests",
-        "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/"
-      },
-      {
-        "args": [
           "--ash-chrome-path-override=../../lacros_version_skew_tests_v100.0.4896.64/test_ash_chrome",
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter"
         ],
@@ -5773,7 +5751,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 100.0.4896.64",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 100.0.4896.64",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5803,7 +5781,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 101.0.4951.13",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 101.0.4951.13",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5833,7 +5811,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 102.0.4984.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 102.0.4984.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5863,7 +5841,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 99.0.4844.33",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 99.0.4844.33",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5892,7 +5870,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros plus ToT ash",
+        "name": "lacros_chrome_browsertests on ToT ash",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5902,8 +5880,8 @@
           ],
           "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/"
+        "test": "lacros_chrome_browsertests",
+        "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/"
       },
       {
         "args": [
@@ -5915,7 +5893,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 100.0.4896.64",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 100.0.4896.64",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5945,7 +5923,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 101.0.4951.13",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 101.0.4951.13",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -5975,7 +5953,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 102.0.4984.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 102.0.4984.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6005,7 +5983,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 99.0.4844.33",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 99.0.4844.33",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -6026,6 +6004,28 @@
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/"
       },
       {
+        "args": [
+          "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter"
+        ],
+        "isolate_profile_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "lacros_chrome_browsertests_run_in_series on ToT ash",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-18.04"
+            }
+          ],
+          "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/"
+      },
+      {
         "isolate_profile_data": true,
         "merge": {
           "args": [],
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json
index b9c4c0c6..83fa76a 100644
--- a/testing/buildbot/chromium.clang.json
+++ b/testing/buildbot/chromium.clang.json
@@ -40537,7 +40537,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone 6s 15.2",
+        "name": "absl_hardening_tests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40588,7 +40588,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s 15.2",
+        "name": "base_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40639,7 +40639,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone 6s 15.2",
+        "name": "boringssl_crypto_tests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40690,7 +40690,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone 6s 15.2",
+        "name": "boringssl_ssl_tests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40741,7 +40741,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s 15.2",
+        "name": "components_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40792,7 +40792,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone 6s 15.2",
+        "name": "crypto_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40843,7 +40843,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s 15.2",
+        "name": "gfx_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40894,7 +40894,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone 6s 15.2",
+        "name": "google_apis_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40945,7 +40945,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s 15.2",
+        "name": "ios_chrome_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40996,7 +40996,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone 6s 15.2",
+        "name": "ios_net_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41047,7 +41047,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s 15.2",
+        "name": "ios_web_inttests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41098,7 +41098,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s 15.2",
+        "name": "ios_web_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41149,7 +41149,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s 15.2",
+        "name": "ios_web_view_inttests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41200,7 +41200,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone 6s 15.2",
+        "name": "net_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41251,7 +41251,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s 15.2",
+        "name": "skia_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41302,7 +41302,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone 6s 15.2",
+        "name": "sql_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41353,7 +41353,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s 15.2",
+        "name": "ui_base_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41404,7 +41404,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone 6s 15.2",
+        "name": "url_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41475,7 +41475,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone 6S 12.3.1",
+        "name": "absl_hardening_tests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41521,7 +41521,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6S 12.3.1",
+        "name": "base_unittests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41567,7 +41567,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone 6S 12.3.1",
+        "name": "boringssl_crypto_tests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41613,7 +41613,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone 6S 12.3.1",
+        "name": "boringssl_ssl_tests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41659,7 +41659,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6S 12.3.1",
+        "name": "components_unittests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41705,7 +41705,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone 6S 12.3.1",
+        "name": "crypto_unittests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41751,7 +41751,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6S 12.3.1",
+        "name": "gfx_unittests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41797,7 +41797,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone 6S 12.3.1",
+        "name": "google_apis_unittests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41843,7 +41843,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6S 12.3.1",
+        "name": "ios_chrome_unittests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41889,7 +41889,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone 6S 12.3.1",
+        "name": "ios_net_unittests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41935,7 +41935,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6S 12.3.1",
+        "name": "ios_web_inttests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41981,7 +41981,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6S 12.3.1",
+        "name": "ios_web_unittests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42027,7 +42027,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6S 12.3.1",
+        "name": "ios_web_view_inttests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42073,7 +42073,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone 6S 12.3.1",
+        "name": "net_unittests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42119,7 +42119,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6S 12.3.1",
+        "name": "skia_unittests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42165,7 +42165,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone 6S 12.3.1",
+        "name": "sql_unittests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42211,7 +42211,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6S 12.3.1",
+        "name": "ui_base_unittests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42257,7 +42257,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone 6S 12.3.1",
+        "name": "url_unittests iPhone 6S 12.3.1",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 7ca4569..58d70af 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -26169,7 +26169,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPad Air 2 15.2",
+        "name": "absl_hardening_tests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26220,7 +26220,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone X 15.2",
+        "name": "absl_hardening_tests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26271,7 +26271,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPad Air 2 15.2",
+        "name": "base_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26322,7 +26322,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone X 15.2",
+        "name": "base_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26373,7 +26373,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPad Air 2 15.2",
+        "name": "boringssl_crypto_tests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26424,7 +26424,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone X 15.2",
+        "name": "boringssl_crypto_tests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26475,7 +26475,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPad Air 2 15.2",
+        "name": "boringssl_ssl_tests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26526,7 +26526,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone X 15.2",
+        "name": "boringssl_ssl_tests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26577,7 +26577,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPad Air 2 15.2",
+        "name": "components_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26628,7 +26628,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone X 15.2",
+        "name": "components_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26679,7 +26679,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crashpad_tests_iPad Air 2 15.2",
+        "name": "crashpad_tests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26730,7 +26730,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crashpad_tests_iPhone X 15.2",
+        "name": "crashpad_tests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26781,7 +26781,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPad Air 2 15.2",
+        "name": "crypto_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26832,7 +26832,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone X 15.2",
+        "name": "crypto_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26883,7 +26883,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPad Air 2 15.2",
+        "name": "gfx_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26934,7 +26934,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone X 15.2",
+        "name": "gfx_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -26985,7 +26985,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPad Air 2 15.2",
+        "name": "google_apis_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27036,7 +27036,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone X 15.2",
+        "name": "google_apis_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27087,7 +27087,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPad Air 2 15.2",
+        "name": "ios_chrome_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27138,7 +27138,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone X 15.2",
+        "name": "ios_chrome_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27189,7 +27189,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPad Air 2 15.2",
+        "name": "ios_components_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27240,7 +27240,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPhone X 15.2",
+        "name": "ios_components_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27291,7 +27291,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPad Air 2 15.2",
+        "name": "ios_net_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27343,7 +27343,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone X 15.2",
+        "name": "ios_net_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27395,7 +27395,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPad Air 2 15.2",
+        "name": "ios_remoting_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27446,7 +27446,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone X 15.2",
+        "name": "ios_remoting_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27497,7 +27497,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPad Air 2 15.2",
+        "name": "ios_testing_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27548,7 +27548,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPhone X 15.2",
+        "name": "ios_testing_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27599,7 +27599,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPad Air 2 15.2",
+        "name": "ios_web_inttests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27650,7 +27650,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone X 15.2",
+        "name": "ios_web_inttests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27701,7 +27701,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPad Air 2 15.2",
+        "name": "ios_web_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27752,7 +27752,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone X 15.2",
+        "name": "ios_web_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27803,7 +27803,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPad Air 2 15.2",
+        "name": "ios_web_view_inttests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27854,7 +27854,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone X 15.2",
+        "name": "ios_web_view_inttests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27905,7 +27905,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPad Air 2 15.2",
+        "name": "ios_web_view_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -27956,7 +27956,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone X 15.2",
+        "name": "ios_web_view_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28007,7 +28007,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPad Air 2 15.2",
+        "name": "net_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28058,7 +28058,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone X 15.2",
+        "name": "net_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28109,7 +28109,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPad Air 2 15.2",
+        "name": "services_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28160,7 +28160,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPhone X 15.2",
+        "name": "services_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28211,7 +28211,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPad Air 2 15.2",
+        "name": "skia_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28262,7 +28262,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone X 15.2",
+        "name": "skia_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28313,7 +28313,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPad Air 2 15.2",
+        "name": "sql_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28364,7 +28364,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone X 15.2",
+        "name": "sql_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28415,7 +28415,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPad Air 2 15.2",
+        "name": "ui_base_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28466,7 +28466,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone X 15.2",
+        "name": "ui_base_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28517,7 +28517,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPad Air 2 15.2",
+        "name": "url_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28568,7 +28568,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone X 15.2",
+        "name": "url_unittests iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28625,7 +28625,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28678,7 +28678,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28731,7 +28731,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_integration_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28785,7 +28785,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28839,7 +28839,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_settings_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28893,7 +28893,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_settings_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -28947,7 +28947,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_signin_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29001,7 +29001,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29055,7 +29055,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29108,7 +29108,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29161,7 +29161,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_ui_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29215,7 +29215,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29269,7 +29269,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_web_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29322,7 +29322,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_web_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29375,7 +29375,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_showcase_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29428,7 +29428,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_showcase_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29481,7 +29481,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_web_shell_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29534,7 +29534,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_web_shell_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29592,7 +29592,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone 6s 14.5",
+        "name": "absl_hardening_tests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29643,7 +29643,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPad Air 2 14.5",
+        "name": "base_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29694,7 +29694,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s 14.5",
+        "name": "base_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29745,7 +29745,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s Plus 14.5",
+        "name": "base_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29796,7 +29796,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone SE (1st generation) 14.5",
+        "name": "base_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29847,7 +29847,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone 6s 14.5",
+        "name": "boringssl_crypto_tests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29898,7 +29898,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone 6s 14.5",
+        "name": "boringssl_ssl_tests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -29949,7 +29949,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPad Air 2 14.5",
+        "name": "components_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30000,7 +30000,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s 14.5",
+        "name": "components_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30051,7 +30051,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s Plus 14.5",
+        "name": "components_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30102,7 +30102,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone SE (1st generation) 14.5",
+        "name": "components_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30153,7 +30153,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crashpad_tests_iPhone 6s 14.5",
+        "name": "crashpad_tests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30204,7 +30204,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone 6s 14.5",
+        "name": "crypto_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30255,7 +30255,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPad Air 2 14.5",
+        "name": "gfx_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30306,7 +30306,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s 14.5",
+        "name": "gfx_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30357,7 +30357,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s Plus 14.5",
+        "name": "gfx_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30408,7 +30408,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone SE (1st generation) 14.5",
+        "name": "gfx_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30459,7 +30459,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone 6s 14.5",
+        "name": "google_apis_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30511,7 +30511,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30563,7 +30563,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30615,7 +30615,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30667,7 +30667,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_integration_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30720,7 +30720,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.5",
+        "name": "ios_chrome_integration_eg2tests_module iPad Pro (12.9-inch) (2nd generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30773,7 +30773,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_integration_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30826,7 +30826,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_settings_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30879,7 +30879,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_settings_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30932,7 +30932,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_settings_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -30985,7 +30985,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_signin_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31038,7 +31038,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.5",
+        "name": "ios_chrome_signin_eg2tests_module iPad Pro (12.9-inch) (2nd generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31091,7 +31091,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_signin_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31144,7 +31144,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31196,7 +31196,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31248,7 +31248,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31300,7 +31300,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_ui_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31353,7 +31353,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.5",
+        "name": "ios_chrome_ui_eg2tests_module iPad Pro (12.9-inch) (2nd generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31406,7 +31406,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_ui_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31458,7 +31458,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPad Air 2 14.5",
+        "name": "ios_chrome_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31509,7 +31509,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s 14.5",
+        "name": "ios_chrome_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31560,7 +31560,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s Plus 14.5",
+        "name": "ios_chrome_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31611,7 +31611,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone SE (1st generation) 14.5",
+        "name": "ios_chrome_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31663,7 +31663,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_web_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31715,7 +31715,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_web_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31767,7 +31767,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_web_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31818,7 +31818,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPhone 6s 14.5",
+        "name": "ios_components_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31869,7 +31869,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone 6s 14.5",
+        "name": "ios_net_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31921,7 +31921,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone 6s 14.5",
+        "name": "ios_remoting_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -31973,7 +31973,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_showcase_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32025,7 +32025,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_showcase_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32077,7 +32077,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone X 14.5",
+        "name": "ios_showcase_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32128,7 +32128,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPhone 6s 14.5",
+        "name": "ios_testing_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32179,7 +32179,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPad Air 2 14.5",
+        "name": "ios_web_inttests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32230,7 +32230,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s 14.5",
+        "name": "ios_web_inttests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32281,7 +32281,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s Plus 14.5",
+        "name": "ios_web_inttests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32332,7 +32332,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone SE (1st generation) 14.5",
+        "name": "ios_web_inttests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32384,7 +32384,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_web_shell_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32436,7 +32436,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.5",
+        "name": "ios_web_shell_eg2tests_module iPad Pro (12.9-inch) (2nd generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32488,7 +32488,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone X 14.5",
+        "name": "ios_web_shell_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32539,7 +32539,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPad Air 2 14.5",
+        "name": "ios_web_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32590,7 +32590,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s 14.5",
+        "name": "ios_web_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32641,7 +32641,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s Plus 14.5",
+        "name": "ios_web_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32692,7 +32692,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone SE (1st generation) 14.5",
+        "name": "ios_web_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32743,7 +32743,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPad Air 2 14.5",
+        "name": "ios_web_view_inttests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32794,7 +32794,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s 14.5",
+        "name": "ios_web_view_inttests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32845,7 +32845,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s Plus 14.5",
+        "name": "ios_web_view_inttests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32896,7 +32896,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone SE (1st generation) 14.5",
+        "name": "ios_web_view_inttests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32947,7 +32947,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPad Air 2 14.5",
+        "name": "ios_web_view_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -32998,7 +32998,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s 14.5",
+        "name": "ios_web_view_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33049,7 +33049,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s Plus 14.5",
+        "name": "ios_web_view_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33100,7 +33100,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone SE (1st generation) 14.5",
+        "name": "ios_web_view_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33151,7 +33151,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone 6s 14.5",
+        "name": "net_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33202,7 +33202,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPhone 6s 14.5",
+        "name": "services_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33253,7 +33253,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPad Air 2 14.5",
+        "name": "skia_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33304,7 +33304,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s 14.5",
+        "name": "skia_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33355,7 +33355,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s Plus 14.5",
+        "name": "skia_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33406,7 +33406,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone SE (1st generation) 14.5",
+        "name": "skia_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33457,7 +33457,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone 6s 14.5",
+        "name": "sql_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33508,7 +33508,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPad Air 2 14.5",
+        "name": "ui_base_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33559,7 +33559,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s 14.5",
+        "name": "ui_base_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33610,7 +33610,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s Plus 14.5",
+        "name": "ui_base_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33661,7 +33661,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone SE (1st generation) 14.5",
+        "name": "ui_base_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33712,7 +33712,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone 6s 14.5",
+        "name": "url_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33770,7 +33770,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone 6s 14.4",
+        "name": "absl_hardening_tests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33821,7 +33821,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone 6s 15.2",
+        "name": "absl_hardening_tests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33872,7 +33872,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPad Air 2 14.4",
+        "name": "base_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33923,7 +33923,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPad Air 2 15.2",
+        "name": "base_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -33974,7 +33974,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s 14.4",
+        "name": "base_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34025,7 +34025,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s 15.2",
+        "name": "base_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34076,7 +34076,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s Plus 14.4",
+        "name": "base_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34127,7 +34127,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s Plus 15.2",
+        "name": "base_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34178,7 +34178,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone SE (1st generation) 14.4",
+        "name": "base_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34229,7 +34229,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone SE (1st generation) 15.2",
+        "name": "base_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34280,7 +34280,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone 6s 14.4",
+        "name": "boringssl_crypto_tests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34331,7 +34331,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone 6s 15.2",
+        "name": "boringssl_crypto_tests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34382,7 +34382,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone 6s 14.4",
+        "name": "boringssl_ssl_tests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34433,7 +34433,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone 6s 15.2",
+        "name": "boringssl_ssl_tests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34484,7 +34484,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPad Air 2 14.4",
+        "name": "components_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34535,7 +34535,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPad Air 2 15.2",
+        "name": "components_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34586,7 +34586,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s 14.4",
+        "name": "components_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34637,7 +34637,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s 15.2",
+        "name": "components_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34688,7 +34688,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s Plus 14.4",
+        "name": "components_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34739,7 +34739,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s Plus 15.2",
+        "name": "components_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34790,7 +34790,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone SE (1st generation) 14.4",
+        "name": "components_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34841,7 +34841,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone SE (1st generation) 15.2",
+        "name": "components_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34892,7 +34892,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone 6s 14.4",
+        "name": "crypto_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34943,7 +34943,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone 6s 15.2",
+        "name": "crypto_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -34994,7 +34994,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPad Air 2 14.4",
+        "name": "gfx_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35045,7 +35045,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPad Air 2 15.2",
+        "name": "gfx_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35096,7 +35096,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s 14.4",
+        "name": "gfx_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35147,7 +35147,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s 15.2",
+        "name": "gfx_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35198,7 +35198,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s Plus 14.4",
+        "name": "gfx_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35249,7 +35249,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s Plus 15.2",
+        "name": "gfx_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35300,7 +35300,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone SE (1st generation) 14.4",
+        "name": "gfx_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35351,7 +35351,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone SE (1st generation) 15.2",
+        "name": "gfx_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35402,7 +35402,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone 6s 14.4",
+        "name": "google_apis_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35453,7 +35453,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone 6s 15.2",
+        "name": "google_apis_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35505,7 +35505,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35557,7 +35557,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35609,7 +35609,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35661,7 +35661,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35713,7 +35713,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 14.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35765,7 +35765,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 15.2",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35817,7 +35817,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_integration_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35870,7 +35870,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_integration_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35923,7 +35923,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -35976,7 +35976,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36029,7 +36029,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36082,7 +36082,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36135,7 +36135,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_settings_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36188,7 +36188,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_settings_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36241,7 +36241,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_settings_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36294,7 +36294,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_settings_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36347,7 +36347,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone X 14.4",
+        "name": "ios_chrome_settings_eg2tests_module iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36400,7 +36400,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone X 15.2",
+        "name": "ios_chrome_settings_eg2tests_module iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36453,7 +36453,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_signin_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36506,7 +36506,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_signin_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36559,7 +36559,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36612,7 +36612,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36665,7 +36665,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36718,7 +36718,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36771,7 +36771,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36823,7 +36823,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36875,7 +36875,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36927,7 +36927,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -36979,7 +36979,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone X 14.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37031,7 +37031,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone X 15.2",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37083,7 +37083,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_ui_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37136,7 +37136,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_ui_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37189,7 +37189,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37242,7 +37242,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37295,7 +37295,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37348,7 +37348,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37400,7 +37400,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPad Air 2 14.4",
+        "name": "ios_chrome_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37451,7 +37451,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPad Air 2 15.2",
+        "name": "ios_chrome_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37502,7 +37502,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s 14.4",
+        "name": "ios_chrome_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37553,7 +37553,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s 15.2",
+        "name": "ios_chrome_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37604,7 +37604,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s Plus 14.4",
+        "name": "ios_chrome_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37655,7 +37655,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s Plus 15.2",
+        "name": "ios_chrome_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37706,7 +37706,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone SE (1st generation) 14.4",
+        "name": "ios_chrome_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37757,7 +37757,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone SE (1st generation) 15.2",
+        "name": "ios_chrome_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37809,7 +37809,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_web_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37861,7 +37861,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_web_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37913,7 +37913,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_web_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -37965,7 +37965,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_web_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38017,7 +38017,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone X 14.4",
+        "name": "ios_chrome_web_eg2tests_module iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38069,7 +38069,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone X 15.2",
+        "name": "ios_chrome_web_eg2tests_module iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38120,7 +38120,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPhone 6s 14.4",
+        "name": "ios_components_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38171,7 +38171,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPhone 6s 15.2",
+        "name": "ios_components_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38222,7 +38222,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone 6s 14.4",
+        "name": "ios_net_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38274,7 +38274,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone 6s 15.2",
+        "name": "ios_net_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38326,7 +38326,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone 6s 14.4",
+        "name": "ios_remoting_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38377,7 +38377,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone 6s 15.2",
+        "name": "ios_remoting_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38429,7 +38429,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_showcase_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38481,7 +38481,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_showcase_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38533,7 +38533,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_showcase_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38585,7 +38585,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_showcase_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38637,7 +38637,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone X 14.4",
+        "name": "ios_showcase_eg2tests_module iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38689,7 +38689,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone X 15.2",
+        "name": "ios_showcase_eg2tests_module iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38740,7 +38740,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPhone 6s 14.4",
+        "name": "ios_testing_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38791,7 +38791,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPhone 6s 15.2",
+        "name": "ios_testing_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38842,7 +38842,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPad Air 2 14.4",
+        "name": "ios_web_inttests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38893,7 +38893,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPad Air 2 15.2",
+        "name": "ios_web_inttests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38944,7 +38944,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s 14.4",
+        "name": "ios_web_inttests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -38995,7 +38995,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s 15.2",
+        "name": "ios_web_inttests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39046,7 +39046,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s Plus 14.4",
+        "name": "ios_web_inttests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39097,7 +39097,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s Plus 15.2",
+        "name": "ios_web_inttests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39148,7 +39148,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone SE (1st generation) 14.4",
+        "name": "ios_web_inttests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39199,7 +39199,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone SE (1st generation) 15.2",
+        "name": "ios_web_inttests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39251,7 +39251,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_web_shell_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39303,7 +39303,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_web_shell_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39355,7 +39355,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_web_shell_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39407,7 +39407,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_web_shell_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39459,7 +39459,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_web_shell_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39511,7 +39511,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_web_shell_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39562,7 +39562,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPad Air 2 14.4",
+        "name": "ios_web_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39613,7 +39613,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPad Air 2 15.2",
+        "name": "ios_web_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39664,7 +39664,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s 14.4",
+        "name": "ios_web_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39715,7 +39715,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s 15.2",
+        "name": "ios_web_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39766,7 +39766,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s Plus 14.4",
+        "name": "ios_web_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39817,7 +39817,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s Plus 15.2",
+        "name": "ios_web_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39868,7 +39868,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone SE (1st generation) 14.4",
+        "name": "ios_web_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39919,7 +39919,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone SE (1st generation) 15.2",
+        "name": "ios_web_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -39970,7 +39970,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPad Air 2 14.4",
+        "name": "ios_web_view_inttests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40021,7 +40021,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPad Air 2 15.2",
+        "name": "ios_web_view_inttests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40072,7 +40072,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s 14.4",
+        "name": "ios_web_view_inttests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40123,7 +40123,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s 15.2",
+        "name": "ios_web_view_inttests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40174,7 +40174,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s Plus 14.4",
+        "name": "ios_web_view_inttests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40225,7 +40225,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s Plus 15.2",
+        "name": "ios_web_view_inttests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40276,7 +40276,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone SE (1st generation) 14.4",
+        "name": "ios_web_view_inttests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40327,7 +40327,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone SE (1st generation) 15.2",
+        "name": "ios_web_view_inttests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40378,7 +40378,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPad Air 2 14.4",
+        "name": "ios_web_view_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40429,7 +40429,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPad Air 2 15.2",
+        "name": "ios_web_view_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40480,7 +40480,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s 14.4",
+        "name": "ios_web_view_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40531,7 +40531,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s 15.2",
+        "name": "ios_web_view_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40582,7 +40582,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s Plus 14.4",
+        "name": "ios_web_view_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40633,7 +40633,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s Plus 15.2",
+        "name": "ios_web_view_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40684,7 +40684,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone SE (1st generation) 14.4",
+        "name": "ios_web_view_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40735,7 +40735,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone SE (1st generation) 15.2",
+        "name": "ios_web_view_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40786,7 +40786,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone 6s 14.4",
+        "name": "net_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40837,7 +40837,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone 6s 15.2",
+        "name": "net_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40888,7 +40888,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPhone 6s 14.4",
+        "name": "services_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40939,7 +40939,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPhone 6s 15.2",
+        "name": "services_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -40990,7 +40990,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPad Air 2 14.4",
+        "name": "skia_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41041,7 +41041,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPad Air 2 15.2",
+        "name": "skia_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41092,7 +41092,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s 14.4",
+        "name": "skia_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41143,7 +41143,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s 15.2",
+        "name": "skia_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41194,7 +41194,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s Plus 14.4",
+        "name": "skia_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41245,7 +41245,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s Plus 15.2",
+        "name": "skia_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41296,7 +41296,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone SE (1st generation) 14.4",
+        "name": "skia_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41347,7 +41347,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone SE (1st generation) 15.2",
+        "name": "skia_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41398,7 +41398,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone 6s 14.4",
+        "name": "sql_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41449,7 +41449,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone 6s 15.2",
+        "name": "sql_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41500,7 +41500,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPad Air 2 14.4",
+        "name": "ui_base_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41551,7 +41551,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPad Air 2 15.2",
+        "name": "ui_base_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41602,7 +41602,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s 14.4",
+        "name": "ui_base_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41653,7 +41653,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s 15.2",
+        "name": "ui_base_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41704,7 +41704,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s Plus 14.4",
+        "name": "ui_base_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41755,7 +41755,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s Plus 15.2",
+        "name": "ui_base_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41806,7 +41806,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone SE (1st generation) 14.4",
+        "name": "ui_base_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41857,7 +41857,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone SE (1st generation) 15.2",
+        "name": "ui_base_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41908,7 +41908,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone 6s 14.4",
+        "name": "url_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -41959,7 +41959,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone 6s 15.2",
+        "name": "url_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42017,7 +42017,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone 6s 14.4",
+        "name": "absl_hardening_tests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42071,7 +42071,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone 6s 15.2",
+        "name": "absl_hardening_tests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42125,7 +42125,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPad Air 2 14.4",
+        "name": "base_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42179,7 +42179,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPad Air 2 15.2",
+        "name": "base_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42233,7 +42233,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s 14.4",
+        "name": "base_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42287,7 +42287,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s 15.2",
+        "name": "base_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42341,7 +42341,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s Plus 14.4",
+        "name": "base_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42395,7 +42395,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s Plus 15.2",
+        "name": "base_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42449,7 +42449,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone SE (1st generation) 14.4",
+        "name": "base_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42503,7 +42503,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone SE (1st generation) 15.2",
+        "name": "base_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42557,7 +42557,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone 6s 14.4",
+        "name": "boringssl_crypto_tests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42611,7 +42611,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone 6s 15.2",
+        "name": "boringssl_crypto_tests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42665,7 +42665,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone 6s 14.4",
+        "name": "boringssl_ssl_tests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42719,7 +42719,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone 6s 15.2",
+        "name": "boringssl_ssl_tests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42773,7 +42773,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPad Air 2 14.4",
+        "name": "components_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42827,7 +42827,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPad Air 2 15.2",
+        "name": "components_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42881,7 +42881,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s 14.4",
+        "name": "components_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42935,7 +42935,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s 15.2",
+        "name": "components_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -42989,7 +42989,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s Plus 14.4",
+        "name": "components_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43043,7 +43043,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s Plus 15.2",
+        "name": "components_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43097,7 +43097,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone SE (1st generation) 14.4",
+        "name": "components_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43151,7 +43151,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone SE (1st generation) 15.2",
+        "name": "components_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43205,7 +43205,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone 6s 14.4",
+        "name": "crypto_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43259,7 +43259,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone 6s 15.2",
+        "name": "crypto_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43313,7 +43313,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPad Air 2 14.4",
+        "name": "gfx_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43367,7 +43367,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPad Air 2 15.2",
+        "name": "gfx_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43421,7 +43421,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s 14.4",
+        "name": "gfx_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43475,7 +43475,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s 15.2",
+        "name": "gfx_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43529,7 +43529,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s Plus 14.4",
+        "name": "gfx_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43583,7 +43583,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s Plus 15.2",
+        "name": "gfx_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43637,7 +43637,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone SE (1st generation) 14.4",
+        "name": "gfx_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43691,7 +43691,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone SE (1st generation) 15.2",
+        "name": "gfx_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43745,7 +43745,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone 6s 14.4",
+        "name": "google_apis_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43799,7 +43799,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone 6s 15.2",
+        "name": "google_apis_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43854,7 +43854,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43909,7 +43909,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -43964,7 +43964,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44019,7 +44019,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44074,7 +44074,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 14.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44129,7 +44129,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 15.2",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44184,7 +44184,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_integration_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44240,7 +44240,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_integration_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44296,7 +44296,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44352,7 +44352,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44408,7 +44408,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44464,7 +44464,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44520,7 +44520,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_settings_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44576,7 +44576,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_settings_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44632,7 +44632,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_settings_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44688,7 +44688,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_settings_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44744,7 +44744,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone X 14.4",
+        "name": "ios_chrome_settings_eg2tests_module iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44800,7 +44800,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone X 15.2",
+        "name": "ios_chrome_settings_eg2tests_module iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44856,7 +44856,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_signin_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44912,7 +44912,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_signin_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -44968,7 +44968,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45024,7 +45024,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45080,7 +45080,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45136,7 +45136,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45192,7 +45192,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45247,7 +45247,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45302,7 +45302,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45357,7 +45357,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45412,7 +45412,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone X 14.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45467,7 +45467,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone X 15.2",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45522,7 +45522,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_ui_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45578,7 +45578,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_ui_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45634,7 +45634,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45690,7 +45690,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45746,7 +45746,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45802,7 +45802,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45857,7 +45857,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPad Air 2 14.4",
+        "name": "ios_chrome_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45911,7 +45911,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPad Air 2 15.2",
+        "name": "ios_chrome_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -45965,7 +45965,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s 14.4",
+        "name": "ios_chrome_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46019,7 +46019,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s 15.2",
+        "name": "ios_chrome_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46073,7 +46073,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s Plus 14.4",
+        "name": "ios_chrome_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46127,7 +46127,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s Plus 15.2",
+        "name": "ios_chrome_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46181,7 +46181,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone SE (1st generation) 14.4",
+        "name": "ios_chrome_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46235,7 +46235,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone SE (1st generation) 15.2",
+        "name": "ios_chrome_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46290,7 +46290,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_web_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46345,7 +46345,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_web_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46400,7 +46400,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_web_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46455,7 +46455,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_web_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46510,7 +46510,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone X 14.4",
+        "name": "ios_chrome_web_eg2tests_module iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46565,7 +46565,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone X 15.2",
+        "name": "ios_chrome_web_eg2tests_module iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46619,7 +46619,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPhone 6s 14.4",
+        "name": "ios_components_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46673,7 +46673,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPhone 6s 15.2",
+        "name": "ios_components_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46727,7 +46727,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone 6s 14.4",
+        "name": "ios_net_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46782,7 +46782,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone 6s 15.2",
+        "name": "ios_net_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46837,7 +46837,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone 6s 14.4",
+        "name": "ios_remoting_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46891,7 +46891,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone 6s 15.2",
+        "name": "ios_remoting_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -46946,7 +46946,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_showcase_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47001,7 +47001,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_showcase_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47056,7 +47056,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_showcase_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47111,7 +47111,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_showcase_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47166,7 +47166,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone X 14.4",
+        "name": "ios_showcase_eg2tests_module iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47221,7 +47221,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone X 15.2",
+        "name": "ios_showcase_eg2tests_module iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47275,7 +47275,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPhone 6s 14.4",
+        "name": "ios_testing_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47329,7 +47329,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPhone 6s 15.2",
+        "name": "ios_testing_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47383,7 +47383,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPad Air 2 14.4",
+        "name": "ios_web_inttests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47437,7 +47437,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPad Air 2 15.2",
+        "name": "ios_web_inttests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47491,7 +47491,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s 14.4",
+        "name": "ios_web_inttests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47545,7 +47545,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s 15.2",
+        "name": "ios_web_inttests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47599,7 +47599,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s Plus 14.4",
+        "name": "ios_web_inttests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47653,7 +47653,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s Plus 15.2",
+        "name": "ios_web_inttests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47707,7 +47707,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone SE (1st generation) 14.4",
+        "name": "ios_web_inttests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47761,7 +47761,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone SE (1st generation) 15.2",
+        "name": "ios_web_inttests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47816,7 +47816,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_web_shell_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47871,7 +47871,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_web_shell_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47926,7 +47926,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_web_shell_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -47981,7 +47981,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_web_shell_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48036,7 +48036,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_web_shell_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48091,7 +48091,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_web_shell_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48145,7 +48145,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPad Air 2 14.4",
+        "name": "ios_web_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48199,7 +48199,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPad Air 2 15.2",
+        "name": "ios_web_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48253,7 +48253,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s 14.4",
+        "name": "ios_web_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48307,7 +48307,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s 15.2",
+        "name": "ios_web_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48361,7 +48361,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s Plus 14.4",
+        "name": "ios_web_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48415,7 +48415,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s Plus 15.2",
+        "name": "ios_web_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48469,7 +48469,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone SE (1st generation) 14.4",
+        "name": "ios_web_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48523,7 +48523,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone SE (1st generation) 15.2",
+        "name": "ios_web_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48577,7 +48577,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPad Air 2 14.4",
+        "name": "ios_web_view_inttests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48631,7 +48631,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPad Air 2 15.2",
+        "name": "ios_web_view_inttests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48685,7 +48685,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s 14.4",
+        "name": "ios_web_view_inttests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48739,7 +48739,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s 15.2",
+        "name": "ios_web_view_inttests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48793,7 +48793,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s Plus 14.4",
+        "name": "ios_web_view_inttests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48847,7 +48847,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s Plus 15.2",
+        "name": "ios_web_view_inttests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48901,7 +48901,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone SE (1st generation) 14.4",
+        "name": "ios_web_view_inttests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -48955,7 +48955,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone SE (1st generation) 15.2",
+        "name": "ios_web_view_inttests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49009,7 +49009,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPad Air 2 14.4",
+        "name": "ios_web_view_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49063,7 +49063,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPad Air 2 15.2",
+        "name": "ios_web_view_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49117,7 +49117,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s 14.4",
+        "name": "ios_web_view_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49171,7 +49171,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s 15.2",
+        "name": "ios_web_view_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49225,7 +49225,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s Plus 14.4",
+        "name": "ios_web_view_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49279,7 +49279,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s Plus 15.2",
+        "name": "ios_web_view_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49333,7 +49333,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone SE (1st generation) 14.4",
+        "name": "ios_web_view_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49387,7 +49387,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone SE (1st generation) 15.2",
+        "name": "ios_web_view_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49441,7 +49441,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone 6s 14.4",
+        "name": "net_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49495,7 +49495,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone 6s 15.2",
+        "name": "net_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49549,7 +49549,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPhone 6s 14.4",
+        "name": "services_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49603,7 +49603,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPhone 6s 15.2",
+        "name": "services_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49657,7 +49657,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPad Air 2 14.4",
+        "name": "skia_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49711,7 +49711,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPad Air 2 15.2",
+        "name": "skia_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49765,7 +49765,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s 14.4",
+        "name": "skia_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49819,7 +49819,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s 15.2",
+        "name": "skia_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49873,7 +49873,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s Plus 14.4",
+        "name": "skia_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49927,7 +49927,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s Plus 15.2",
+        "name": "skia_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -49981,7 +49981,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone SE (1st generation) 14.4",
+        "name": "skia_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50035,7 +50035,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone SE (1st generation) 15.2",
+        "name": "skia_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50089,7 +50089,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone 6s 14.4",
+        "name": "sql_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50143,7 +50143,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone 6s 15.2",
+        "name": "sql_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50197,7 +50197,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPad Air 2 14.4",
+        "name": "ui_base_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50251,7 +50251,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPad Air 2 15.2",
+        "name": "ui_base_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50305,7 +50305,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s 14.4",
+        "name": "ui_base_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50359,7 +50359,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s 15.2",
+        "name": "ui_base_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50413,7 +50413,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s Plus 14.4",
+        "name": "ui_base_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50467,7 +50467,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s Plus 15.2",
+        "name": "ui_base_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50521,7 +50521,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone SE (1st generation) 14.4",
+        "name": "ui_base_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50575,7 +50575,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone SE (1st generation) 15.2",
+        "name": "ui_base_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50629,7 +50629,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone 6s 14.4",
+        "name": "url_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50683,7 +50683,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone 6s 15.2",
+        "name": "url_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50738,7 +50738,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "cronet_test_iPhone X 15.2",
+        "name": "cronet_test iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50793,7 +50793,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPad Air 2 15.2",
+        "name": "absl_hardening_tests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50844,7 +50844,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPad Air 2 15.2",
+        "name": "base_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50895,7 +50895,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPad Air 2 15.2",
+        "name": "boringssl_crypto_tests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50946,7 +50946,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPad Air 2 15.2",
+        "name": "boringssl_ssl_tests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -50997,7 +50997,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPad Air 2 15.2",
+        "name": "components_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51048,7 +51048,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPad Air 2 15.2",
+        "name": "crypto_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51099,7 +51099,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPad Air 2 15.2",
+        "name": "gfx_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51150,7 +51150,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPad Air 2 15.2",
+        "name": "google_apis_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51202,7 +51202,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51254,7 +51254,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_integration_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51307,7 +51307,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_settings_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51360,7 +51360,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_signin_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51413,7 +51413,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51465,7 +51465,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_ui_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51517,7 +51517,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPad Air 2 15.2",
+        "name": "ios_chrome_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51569,7 +51569,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_web_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51620,7 +51620,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPad Air 2 15.2",
+        "name": "ios_components_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51671,7 +51671,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPad Air 2 15.2",
+        "name": "ios_net_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51723,7 +51723,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPad Air 2 15.2",
+        "name": "ios_remoting_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51775,7 +51775,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_showcase_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51826,7 +51826,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPad Air 2 15.2",
+        "name": "ios_testing_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51877,7 +51877,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPad Air 2 15.2",
+        "name": "ios_web_inttests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51929,7 +51929,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_web_shell_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -51980,7 +51980,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPad Air 2 15.2",
+        "name": "ios_web_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52031,7 +52031,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPad Air 2 15.2",
+        "name": "ios_web_view_inttests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52082,7 +52082,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPad Air 2 15.2",
+        "name": "ios_web_view_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52133,7 +52133,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPad Air 2 15.2",
+        "name": "net_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52184,7 +52184,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPad Air 2 15.2",
+        "name": "services_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52235,7 +52235,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPad Air 2 15.2",
+        "name": "skia_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52286,7 +52286,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPad Air 2 15.2",
+        "name": "sql_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52337,7 +52337,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPad Air 2 15.2",
+        "name": "ui_base_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52388,7 +52388,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPad Air 2 15.2",
+        "name": "url_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52445,7 +52445,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPad Air 2 15.0",
+        "name": "absl_hardening_tests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52498,7 +52498,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone X 15.0",
+        "name": "absl_hardening_tests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52551,7 +52551,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPad Air 2 15.0",
+        "name": "base_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52604,7 +52604,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone X 15.0",
+        "name": "base_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52657,7 +52657,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPad Air 2 15.0",
+        "name": "boringssl_crypto_tests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52710,7 +52710,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone X 15.0",
+        "name": "boringssl_crypto_tests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52763,7 +52763,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPad Air 2 15.0",
+        "name": "boringssl_ssl_tests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52816,7 +52816,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone X 15.0",
+        "name": "boringssl_ssl_tests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52869,7 +52869,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPad Air 2 15.0",
+        "name": "components_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52922,7 +52922,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone X 15.0",
+        "name": "components_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -52975,7 +52975,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPad Air 2 15.0",
+        "name": "crypto_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53028,7 +53028,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone X 15.0",
+        "name": "crypto_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53081,7 +53081,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPad Air 2 15.0",
+        "name": "gfx_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53134,7 +53134,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone X 15.0",
+        "name": "gfx_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53187,7 +53187,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPad Air 2 15.0",
+        "name": "google_apis_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53240,7 +53240,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone X 15.0",
+        "name": "google_apis_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53294,7 +53294,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 15.0",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53348,7 +53348,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 15.0",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53402,7 +53402,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 15.0",
+        "name": "ios_chrome_integration_eg2tests_module iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53457,7 +53457,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone X 15.0",
+        "name": "ios_chrome_integration_eg2tests_module iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53512,7 +53512,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 15.0",
+        "name": "ios_chrome_settings_eg2tests_module iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53567,7 +53567,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone X 15.0",
+        "name": "ios_chrome_settings_eg2tests_module iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53622,7 +53622,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 15.0",
+        "name": "ios_chrome_signin_eg2tests_module iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53677,7 +53677,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone X 15.0",
+        "name": "ios_chrome_signin_eg2tests_module iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53732,7 +53732,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 15.0",
+        "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53786,7 +53786,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone X 15.0",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53840,7 +53840,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 15.0",
+        "name": "ios_chrome_ui_eg2tests_module iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53895,7 +53895,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone X 15.0",
+        "name": "ios_chrome_ui_eg2tests_module iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -53949,7 +53949,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPad Air 2 15.0",
+        "name": "ios_chrome_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54002,7 +54002,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone X 15.0",
+        "name": "ios_chrome_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54056,7 +54056,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad Air 2 15.0",
+        "name": "ios_chrome_web_eg2tests_module iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54110,7 +54110,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone X 15.0",
+        "name": "ios_chrome_web_eg2tests_module iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54163,7 +54163,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPad Air 2 15.0",
+        "name": "ios_components_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54216,7 +54216,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPhone X 15.0",
+        "name": "ios_components_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54269,7 +54269,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPad Air 2 15.0",
+        "name": "ios_net_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54323,7 +54323,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone X 15.0",
+        "name": "ios_net_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54377,7 +54377,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPad Air 2 15.0",
+        "name": "ios_remoting_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54430,7 +54430,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone X 15.0",
+        "name": "ios_remoting_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54484,7 +54484,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad Air 2 15.0",
+        "name": "ios_showcase_eg2tests_module iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54538,7 +54538,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone X 15.0",
+        "name": "ios_showcase_eg2tests_module iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54591,7 +54591,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPad Air 2 15.0",
+        "name": "ios_testing_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54644,7 +54644,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPhone X 15.0",
+        "name": "ios_testing_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54697,7 +54697,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPad Air 2 15.0",
+        "name": "ios_web_inttests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54750,7 +54750,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone X 15.0",
+        "name": "ios_web_inttests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54804,7 +54804,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Air 2 15.0",
+        "name": "ios_web_shell_eg2tests_module iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54858,7 +54858,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone X 15.0",
+        "name": "ios_web_shell_eg2tests_module iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54911,7 +54911,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPad Air 2 15.0",
+        "name": "ios_web_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -54964,7 +54964,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone X 15.0",
+        "name": "ios_web_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55017,7 +55017,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPad Air 2 15.0",
+        "name": "ios_web_view_inttests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55070,7 +55070,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone X 15.0",
+        "name": "ios_web_view_inttests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55123,7 +55123,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPad Air 2 15.0",
+        "name": "ios_web_view_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55176,7 +55176,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone X 15.0",
+        "name": "ios_web_view_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55229,7 +55229,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPad Air 2 15.0",
+        "name": "net_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55282,7 +55282,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone X 15.0",
+        "name": "net_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55335,7 +55335,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPad Air 2 15.0",
+        "name": "services_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55388,7 +55388,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPhone X 15.0",
+        "name": "services_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55441,7 +55441,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPad Air 2 15.0",
+        "name": "skia_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55494,7 +55494,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone X 15.0",
+        "name": "skia_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55547,7 +55547,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPad Air 2 15.0",
+        "name": "sql_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55600,7 +55600,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone X 15.0",
+        "name": "sql_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55653,7 +55653,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPad Air 2 15.0",
+        "name": "ui_base_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55706,7 +55706,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone X 15.0",
+        "name": "ui_base_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55759,7 +55759,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPad Air 2 15.0",
+        "name": "url_unittests iPad Air 2 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55812,7 +55812,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone X 15.0",
+        "name": "url_unittests iPhone X 15.0",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55870,7 +55870,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone X 14.5",
+        "name": "absl_hardening_tests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55921,7 +55921,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPad Air 2 14.5",
+        "name": "base_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -55972,7 +55972,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s Plus 14.5",
+        "name": "base_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56023,7 +56023,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone X 14.5",
+        "name": "base_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56074,7 +56074,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone X 14.5",
+        "name": "boringssl_crypto_tests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56125,7 +56125,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone X 14.5",
+        "name": "boringssl_ssl_tests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56176,7 +56176,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPad Air 2 14.5",
+        "name": "components_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56227,7 +56227,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s Plus 14.5",
+        "name": "components_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56278,7 +56278,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone X 14.5",
+        "name": "components_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56329,7 +56329,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crashpad_tests_iPhone X 14.5",
+        "name": "crashpad_tests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56380,7 +56380,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone X 14.5",
+        "name": "crypto_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56431,7 +56431,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPad Air 2 14.5",
+        "name": "gfx_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56482,7 +56482,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s Plus 14.5",
+        "name": "gfx_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56533,7 +56533,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone X 14.5",
+        "name": "gfx_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56584,7 +56584,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone X 14.5",
+        "name": "google_apis_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56636,7 +56636,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad (6th generation) 14.5",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad (6th generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56688,7 +56688,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air (3rd generation) 14.5",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad Air (3rd generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56740,7 +56740,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56792,7 +56792,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56844,7 +56844,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad (6th generation) 14.5",
+        "name": "ios_chrome_integration_eg2tests_module iPad (6th generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56897,7 +56897,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.5",
+        "name": "ios_chrome_integration_eg2tests_module iPad Pro (12.9-inch) (2nd generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -56950,7 +56950,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57003,7 +57003,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_integration_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57056,7 +57056,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad (6th generation) 14.5",
+        "name": "ios_chrome_settings_eg2tests_module iPad (6th generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57109,7 +57109,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad Air (3rd generation) 14.5",
+        "name": "ios_chrome_settings_eg2tests_module iPad Air (3rd generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57162,7 +57162,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_settings_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57215,7 +57215,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_settings_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57268,7 +57268,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad (6th generation) 14.5",
+        "name": "ios_chrome_signin_eg2tests_module iPad (6th generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57321,7 +57321,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.5",
+        "name": "ios_chrome_signin_eg2tests_module iPad Pro (12.9-inch) (2nd generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57374,7 +57374,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57427,7 +57427,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_signin_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57480,7 +57480,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad (6th generation) 14.5",
+        "name": "ios_chrome_smoke_eg2tests_module iPad (6th generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57532,7 +57532,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad Air (3rd generation) 14.5",
+        "name": "ios_chrome_smoke_eg2tests_module iPad Air (3rd generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57584,7 +57584,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57636,7 +57636,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57688,7 +57688,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad (6th generation) 14.5",
+        "name": "ios_chrome_ui_eg2tests_module iPad (6th generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57741,7 +57741,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.5",
+        "name": "ios_chrome_ui_eg2tests_module iPad Pro (12.9-inch) (2nd generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57794,7 +57794,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57847,7 +57847,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_ui_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57899,7 +57899,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPad Air 2 14.5",
+        "name": "ios_chrome_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -57950,7 +57950,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s Plus 14.5",
+        "name": "ios_chrome_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58001,7 +58001,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone X 14.5",
+        "name": "ios_chrome_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58053,7 +58053,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad (6th generation) 14.5",
+        "name": "ios_chrome_web_eg2tests_module iPad (6th generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58105,7 +58105,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad Air (3rd generation) 14.5",
+        "name": "ios_chrome_web_eg2tests_module iPad Air (3rd generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58157,7 +58157,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_web_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58209,7 +58209,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_web_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58260,7 +58260,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPhone X 14.5",
+        "name": "ios_components_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58311,7 +58311,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone X 14.5",
+        "name": "ios_net_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58363,7 +58363,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone X 14.5",
+        "name": "ios_remoting_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58415,7 +58415,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad (6th generation) 14.5",
+        "name": "ios_showcase_eg2tests_module iPad (6th generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58467,7 +58467,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad Air (3rd generation) 14.5",
+        "name": "ios_showcase_eg2tests_module iPad Air (3rd generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58519,7 +58519,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_showcase_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58571,7 +58571,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone X 14.5",
+        "name": "ios_showcase_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58622,7 +58622,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPhone X 14.5",
+        "name": "ios_testing_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58673,7 +58673,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPad Air 2 14.5",
+        "name": "ios_web_inttests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58724,7 +58724,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s Plus 14.5",
+        "name": "ios_web_inttests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58775,7 +58775,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone X 14.5",
+        "name": "ios_web_inttests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58827,7 +58827,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad (6th generation) 14.5",
+        "name": "ios_web_shell_eg2tests_module iPad (6th generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58879,7 +58879,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Pro (12.9-inch) (2nd generation) 14.5",
+        "name": "ios_web_shell_eg2tests_module iPad Pro (12.9-inch) (2nd generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58931,7 +58931,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_web_shell_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -58983,7 +58983,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone X 14.5",
+        "name": "ios_web_shell_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59034,7 +59034,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPad Air 2 14.5",
+        "name": "ios_web_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59085,7 +59085,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s Plus 14.5",
+        "name": "ios_web_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59136,7 +59136,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone X 14.5",
+        "name": "ios_web_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59187,7 +59187,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPad Air 2 14.5",
+        "name": "ios_web_view_inttests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59238,7 +59238,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s Plus 14.5",
+        "name": "ios_web_view_inttests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59289,7 +59289,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone X 14.5",
+        "name": "ios_web_view_inttests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59340,7 +59340,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPad Air 2 14.5",
+        "name": "ios_web_view_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59391,7 +59391,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s Plus 14.5",
+        "name": "ios_web_view_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59442,7 +59442,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone X 14.5",
+        "name": "ios_web_view_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59493,7 +59493,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone X 14.5",
+        "name": "net_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59544,7 +59544,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPhone X 14.5",
+        "name": "services_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59595,7 +59595,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPad Air 2 14.5",
+        "name": "skia_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59646,7 +59646,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s Plus 14.5",
+        "name": "skia_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59697,7 +59697,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone X 14.5",
+        "name": "skia_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59748,7 +59748,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone X 14.5",
+        "name": "sql_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59799,7 +59799,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPad Air 2 14.5",
+        "name": "ui_base_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59850,7 +59850,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s Plus 14.5",
+        "name": "ui_base_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59901,7 +59901,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone X 14.5",
+        "name": "ui_base_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -59952,7 +59952,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone X 14.5",
+        "name": "url_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60015,7 +60015,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone 6s 14.5",
+        "name": "absl_hardening_tests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60066,7 +60066,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone 6s 15.4",
+        "name": "absl_hardening_tests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60117,7 +60117,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPad Air 2 14.5",
+        "name": "base_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60168,7 +60168,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPad Air 2 15.4",
+        "name": "base_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60219,7 +60219,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s 14.5",
+        "name": "base_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60270,7 +60270,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s 15.4",
+        "name": "base_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60321,7 +60321,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s Plus 14.5",
+        "name": "base_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60372,7 +60372,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s Plus 15.4",
+        "name": "base_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60423,7 +60423,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone SE (1st generation) 14.5",
+        "name": "base_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60474,7 +60474,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone SE (1st generation) 15.4",
+        "name": "base_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60525,7 +60525,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone 6s 14.5",
+        "name": "boringssl_crypto_tests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60576,7 +60576,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone 6s 15.4",
+        "name": "boringssl_crypto_tests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60627,7 +60627,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone 6s 14.5",
+        "name": "boringssl_ssl_tests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60678,7 +60678,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone 6s 15.4",
+        "name": "boringssl_ssl_tests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60729,7 +60729,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPad Air 2 14.5",
+        "name": "components_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60780,7 +60780,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPad Air 2 15.4",
+        "name": "components_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60831,7 +60831,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s 14.5",
+        "name": "components_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60882,7 +60882,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s 15.4",
+        "name": "components_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60933,7 +60933,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s Plus 14.5",
+        "name": "components_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -60984,7 +60984,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s Plus 15.4",
+        "name": "components_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61035,7 +61035,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone SE (1st generation) 14.5",
+        "name": "components_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61086,7 +61086,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone SE (1st generation) 15.4",
+        "name": "components_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61137,7 +61137,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crashpad_tests_iPhone 6s 14.5",
+        "name": "crashpad_tests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61188,7 +61188,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crashpad_tests_iPhone 6s 15.4",
+        "name": "crashpad_tests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61239,7 +61239,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone 6s 14.5",
+        "name": "crypto_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61290,7 +61290,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone 6s 15.4",
+        "name": "crypto_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61341,7 +61341,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPad Air 2 14.5",
+        "name": "gfx_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61392,7 +61392,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPad Air 2 15.4",
+        "name": "gfx_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61443,7 +61443,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s 14.5",
+        "name": "gfx_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61494,7 +61494,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s 15.4",
+        "name": "gfx_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61545,7 +61545,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s Plus 14.5",
+        "name": "gfx_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61596,7 +61596,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s Plus 15.4",
+        "name": "gfx_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61647,7 +61647,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone SE (1st generation) 14.5",
+        "name": "gfx_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61698,7 +61698,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone SE (1st generation) 15.4",
+        "name": "gfx_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61749,7 +61749,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone 6s 14.5",
+        "name": "google_apis_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61800,7 +61800,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone 6s 15.4",
+        "name": "google_apis_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61852,7 +61852,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61904,7 +61904,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -61956,7 +61956,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62008,7 +62008,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62060,7 +62060,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62112,7 +62112,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 15.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62164,7 +62164,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_integration_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62217,7 +62217,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_chrome_integration_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62270,7 +62270,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62323,7 +62323,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62376,7 +62376,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_integration_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62429,7 +62429,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone X 15.4",
+        "name": "ios_chrome_integration_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62482,7 +62482,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_settings_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62535,7 +62535,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_chrome_settings_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62588,7 +62588,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_settings_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62641,7 +62641,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_chrome_settings_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62694,7 +62694,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_settings_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62747,7 +62747,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone X 15.4",
+        "name": "ios_chrome_settings_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62800,7 +62800,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_signin_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62853,7 +62853,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_chrome_signin_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62906,7 +62906,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -62959,7 +62959,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63012,7 +63012,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_signin_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63065,7 +63065,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone X 15.4",
+        "name": "ios_chrome_signin_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63118,7 +63118,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63170,7 +63170,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63222,7 +63222,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63274,7 +63274,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63326,7 +63326,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63378,7 +63378,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone X 15.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63430,7 +63430,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_ui_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63483,7 +63483,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_chrome_ui_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63536,7 +63536,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63589,7 +63589,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63642,7 +63642,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_ui_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63695,7 +63695,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone X 15.4",
+        "name": "ios_chrome_ui_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63747,7 +63747,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPad Air 2 14.5",
+        "name": "ios_chrome_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63798,7 +63798,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPad Air 2 15.4",
+        "name": "ios_chrome_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63849,7 +63849,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s 14.5",
+        "name": "ios_chrome_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63900,7 +63900,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s 15.4",
+        "name": "ios_chrome_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -63951,7 +63951,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s Plus 14.5",
+        "name": "ios_chrome_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64002,7 +64002,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s Plus 15.4",
+        "name": "ios_chrome_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64053,7 +64053,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone SE (1st generation) 14.5",
+        "name": "ios_chrome_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64104,7 +64104,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone SE (1st generation) 15.4",
+        "name": "ios_chrome_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64156,7 +64156,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_web_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64208,7 +64208,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_chrome_web_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64260,7 +64260,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_web_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64312,7 +64312,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_chrome_web_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64364,7 +64364,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_web_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64416,7 +64416,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone X 15.4",
+        "name": "ios_chrome_web_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64467,7 +64467,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPhone 6s 14.5",
+        "name": "ios_components_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64518,7 +64518,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPhone 6s 15.4",
+        "name": "ios_components_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64569,7 +64569,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone 6s 14.5",
+        "name": "ios_net_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64621,7 +64621,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone 6s 15.4",
+        "name": "ios_net_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64673,7 +64673,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone 6s 14.5",
+        "name": "ios_remoting_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64724,7 +64724,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone 6s 15.4",
+        "name": "ios_remoting_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64776,7 +64776,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_showcase_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64828,7 +64828,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_showcase_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64880,7 +64880,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_showcase_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64932,7 +64932,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_showcase_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -64984,7 +64984,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone X 14.5",
+        "name": "ios_showcase_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65036,7 +65036,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone X 15.4",
+        "name": "ios_showcase_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65088,7 +65088,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_swift_interop_xcuitests_module_iPhone X 14.5",
+        "name": "ios_swift_interop_xcuitests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65140,7 +65140,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_swift_interop_xcuitests_module_iPhone X 15.4",
+        "name": "ios_swift_interop_xcuitests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65191,7 +65191,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPhone 6s 14.5",
+        "name": "ios_testing_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65242,7 +65242,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPhone 6s 15.4",
+        "name": "ios_testing_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65293,7 +65293,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPad Air 2 14.5",
+        "name": "ios_web_inttests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65344,7 +65344,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPad Air 2 15.4",
+        "name": "ios_web_inttests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65395,7 +65395,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s 14.5",
+        "name": "ios_web_inttests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65446,7 +65446,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s 15.4",
+        "name": "ios_web_inttests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65497,7 +65497,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s Plus 14.5",
+        "name": "ios_web_inttests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65548,7 +65548,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s Plus 15.4",
+        "name": "ios_web_inttests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65599,7 +65599,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone SE (1st generation) 14.5",
+        "name": "ios_web_inttests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65650,7 +65650,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone SE (1st generation) 15.4",
+        "name": "ios_web_inttests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65702,7 +65702,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_web_shell_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65754,7 +65754,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_web_shell_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65806,7 +65806,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_web_shell_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65858,7 +65858,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_web_shell_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65910,7 +65910,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone X 14.5",
+        "name": "ios_web_shell_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -65962,7 +65962,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone X 15.4",
+        "name": "ios_web_shell_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66013,7 +66013,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPad Air 2 14.5",
+        "name": "ios_web_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66064,7 +66064,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPad Air 2 15.4",
+        "name": "ios_web_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66115,7 +66115,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s 14.5",
+        "name": "ios_web_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66166,7 +66166,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s 15.4",
+        "name": "ios_web_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66217,7 +66217,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s Plus 14.5",
+        "name": "ios_web_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66268,7 +66268,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s Plus 15.4",
+        "name": "ios_web_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66319,7 +66319,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone SE (1st generation) 14.5",
+        "name": "ios_web_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66370,7 +66370,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone SE (1st generation) 15.4",
+        "name": "ios_web_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66421,7 +66421,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPad Air 2 14.5",
+        "name": "ios_web_view_inttests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66472,7 +66472,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPad Air 2 15.4",
+        "name": "ios_web_view_inttests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66523,7 +66523,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s 14.5",
+        "name": "ios_web_view_inttests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66574,7 +66574,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s 15.4",
+        "name": "ios_web_view_inttests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66625,7 +66625,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s Plus 14.5",
+        "name": "ios_web_view_inttests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66676,7 +66676,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s Plus 15.4",
+        "name": "ios_web_view_inttests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66727,7 +66727,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone SE (1st generation) 14.5",
+        "name": "ios_web_view_inttests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66778,7 +66778,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone SE (1st generation) 15.4",
+        "name": "ios_web_view_inttests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66829,7 +66829,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPad Air 2 14.5",
+        "name": "ios_web_view_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66880,7 +66880,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPad Air 2 15.4",
+        "name": "ios_web_view_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66931,7 +66931,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s 14.5",
+        "name": "ios_web_view_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -66982,7 +66982,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s 15.4",
+        "name": "ios_web_view_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67033,7 +67033,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s Plus 14.5",
+        "name": "ios_web_view_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67084,7 +67084,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s Plus 15.4",
+        "name": "ios_web_view_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67135,7 +67135,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone SE (1st generation) 14.5",
+        "name": "ios_web_view_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67186,7 +67186,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone SE (1st generation) 15.4",
+        "name": "ios_web_view_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67237,7 +67237,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone 6s 14.5",
+        "name": "net_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67288,7 +67288,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone 6s 15.4",
+        "name": "net_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67339,7 +67339,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPhone 6s 14.5",
+        "name": "services_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67390,7 +67390,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPhone 6s 15.4",
+        "name": "services_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67441,7 +67441,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPad Air 2 14.5",
+        "name": "skia_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67492,7 +67492,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPad Air 2 15.4",
+        "name": "skia_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67543,7 +67543,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s 14.5",
+        "name": "skia_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67594,7 +67594,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s 15.4",
+        "name": "skia_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67645,7 +67645,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s Plus 14.5",
+        "name": "skia_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67696,7 +67696,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s Plus 15.4",
+        "name": "skia_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67747,7 +67747,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone SE (1st generation) 14.5",
+        "name": "skia_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67798,7 +67798,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone SE (1st generation) 15.4",
+        "name": "skia_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67849,7 +67849,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone 6s 14.5",
+        "name": "sql_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67900,7 +67900,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone 6s 15.4",
+        "name": "sql_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -67951,7 +67951,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPad Air 2 14.5",
+        "name": "ui_base_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68002,7 +68002,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPad Air 2 15.4",
+        "name": "ui_base_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68053,7 +68053,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s 14.5",
+        "name": "ui_base_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68104,7 +68104,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s 15.4",
+        "name": "ui_base_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68155,7 +68155,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s Plus 14.5",
+        "name": "ui_base_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68206,7 +68206,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s Plus 15.4",
+        "name": "ui_base_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68257,7 +68257,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone SE (1st generation) 14.5",
+        "name": "ui_base_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68308,7 +68308,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone SE (1st generation) 15.4",
+        "name": "ui_base_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68359,7 +68359,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone 6s 14.5",
+        "name": "url_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68410,7 +68410,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone 6s 15.4",
+        "name": "url_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68473,7 +68473,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone 6s 14.5",
+        "name": "absl_hardening_tests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68524,7 +68524,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone 6s 15.4",
+        "name": "absl_hardening_tests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68575,7 +68575,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPad Air 2 14.5",
+        "name": "base_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68626,7 +68626,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPad Air 2 15.4",
+        "name": "base_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68677,7 +68677,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s 14.5",
+        "name": "base_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68728,7 +68728,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s 15.4",
+        "name": "base_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68779,7 +68779,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s Plus 14.5",
+        "name": "base_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68830,7 +68830,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s Plus 15.4",
+        "name": "base_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68881,7 +68881,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone SE (1st generation) 14.5",
+        "name": "base_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68932,7 +68932,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone SE (1st generation) 15.4",
+        "name": "base_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -68983,7 +68983,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone 6s 14.5",
+        "name": "boringssl_crypto_tests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69034,7 +69034,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone 6s 15.4",
+        "name": "boringssl_crypto_tests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69085,7 +69085,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone 6s 14.5",
+        "name": "boringssl_ssl_tests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69136,7 +69136,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone 6s 15.4",
+        "name": "boringssl_ssl_tests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69187,7 +69187,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPad Air 2 14.5",
+        "name": "components_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69238,7 +69238,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPad Air 2 15.4",
+        "name": "components_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69289,7 +69289,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s 14.5",
+        "name": "components_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69340,7 +69340,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s 15.4",
+        "name": "components_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69391,7 +69391,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s Plus 14.5",
+        "name": "components_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69442,7 +69442,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s Plus 15.4",
+        "name": "components_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69493,7 +69493,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone SE (1st generation) 14.5",
+        "name": "components_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69544,7 +69544,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone SE (1st generation) 15.4",
+        "name": "components_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69595,7 +69595,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crashpad_tests_iPhone 6s 14.5",
+        "name": "crashpad_tests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69646,7 +69646,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crashpad_tests_iPhone 6s 15.4",
+        "name": "crashpad_tests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69697,7 +69697,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone 6s 14.5",
+        "name": "crypto_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69748,7 +69748,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone 6s 15.4",
+        "name": "crypto_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69799,7 +69799,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPad Air 2 14.5",
+        "name": "gfx_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69850,7 +69850,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPad Air 2 15.4",
+        "name": "gfx_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69901,7 +69901,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s 14.5",
+        "name": "gfx_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -69952,7 +69952,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s 15.4",
+        "name": "gfx_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70003,7 +70003,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s Plus 14.5",
+        "name": "gfx_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70054,7 +70054,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s Plus 15.4",
+        "name": "gfx_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70105,7 +70105,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone SE (1st generation) 14.5",
+        "name": "gfx_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70156,7 +70156,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone SE (1st generation) 15.4",
+        "name": "gfx_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70207,7 +70207,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone 6s 14.5",
+        "name": "google_apis_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70258,7 +70258,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone 6s 15.4",
+        "name": "google_apis_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70310,7 +70310,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70362,7 +70362,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70414,7 +70414,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70466,7 +70466,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70518,7 +70518,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70570,7 +70570,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 15.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70622,7 +70622,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_integration_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70675,7 +70675,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_chrome_integration_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70728,7 +70728,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70781,7 +70781,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70834,7 +70834,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_integration_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70887,7 +70887,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone X 15.4",
+        "name": "ios_chrome_integration_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70940,7 +70940,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_settings_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -70993,7 +70993,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_chrome_settings_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71046,7 +71046,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_settings_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71099,7 +71099,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_chrome_settings_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71152,7 +71152,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_settings_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71205,7 +71205,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone X 15.4",
+        "name": "ios_chrome_settings_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71258,7 +71258,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_signin_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71311,7 +71311,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_chrome_signin_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71364,7 +71364,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71417,7 +71417,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71470,7 +71470,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_signin_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71523,7 +71523,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone X 15.4",
+        "name": "ios_chrome_signin_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71576,7 +71576,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71628,7 +71628,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71680,7 +71680,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71732,7 +71732,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71784,7 +71784,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71836,7 +71836,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone X 15.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71888,7 +71888,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_ui_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71941,7 +71941,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_chrome_ui_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -71994,7 +71994,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72047,7 +72047,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72100,7 +72100,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_ui_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72153,7 +72153,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone X 15.4",
+        "name": "ios_chrome_ui_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72205,7 +72205,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPad Air 2 14.5",
+        "name": "ios_chrome_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72256,7 +72256,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPad Air 2 15.4",
+        "name": "ios_chrome_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72307,7 +72307,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s 14.5",
+        "name": "ios_chrome_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72358,7 +72358,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s 15.4",
+        "name": "ios_chrome_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72409,7 +72409,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s Plus 14.5",
+        "name": "ios_chrome_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72460,7 +72460,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s Plus 15.4",
+        "name": "ios_chrome_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72511,7 +72511,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone SE (1st generation) 14.5",
+        "name": "ios_chrome_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72562,7 +72562,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone SE (1st generation) 15.4",
+        "name": "ios_chrome_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72614,7 +72614,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_chrome_web_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72666,7 +72666,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_chrome_web_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72718,7 +72718,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_chrome_web_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72770,7 +72770,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_chrome_web_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72822,7 +72822,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone X 14.5",
+        "name": "ios_chrome_web_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72874,7 +72874,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone X 15.4",
+        "name": "ios_chrome_web_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72925,7 +72925,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPhone 6s 14.5",
+        "name": "ios_components_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -72976,7 +72976,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPhone 6s 15.4",
+        "name": "ios_components_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73027,7 +73027,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone 6s 14.5",
+        "name": "ios_net_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73079,7 +73079,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone 6s 15.4",
+        "name": "ios_net_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73131,7 +73131,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone 6s 14.5",
+        "name": "ios_remoting_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73182,7 +73182,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone 6s 15.4",
+        "name": "ios_remoting_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73234,7 +73234,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_showcase_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73286,7 +73286,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_showcase_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73338,7 +73338,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_showcase_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73390,7 +73390,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_showcase_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73442,7 +73442,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone X 14.5",
+        "name": "ios_showcase_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73494,7 +73494,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone X 15.4",
+        "name": "ios_showcase_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73545,7 +73545,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPhone 6s 14.5",
+        "name": "ios_testing_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73596,7 +73596,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPhone 6s 15.4",
+        "name": "ios_testing_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73647,7 +73647,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPad Air 2 14.5",
+        "name": "ios_web_inttests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73698,7 +73698,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPad Air 2 15.4",
+        "name": "ios_web_inttests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73749,7 +73749,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s 14.5",
+        "name": "ios_web_inttests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73800,7 +73800,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s 15.4",
+        "name": "ios_web_inttests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73851,7 +73851,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s Plus 14.5",
+        "name": "ios_web_inttests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73902,7 +73902,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s Plus 15.4",
+        "name": "ios_web_inttests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -73953,7 +73953,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone SE (1st generation) 14.5",
+        "name": "ios_web_inttests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74004,7 +74004,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone SE (1st generation) 15.4",
+        "name": "ios_web_inttests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74056,7 +74056,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Air 2 14.5",
+        "name": "ios_web_shell_eg2tests_module iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74108,7 +74108,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Air 2 15.4",
+        "name": "ios_web_shell_eg2tests_module iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74160,7 +74160,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 7 14.5",
+        "name": "ios_web_shell_eg2tests_module iPhone 7 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74212,7 +74212,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 7 15.4",
+        "name": "ios_web_shell_eg2tests_module iPhone 7 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74264,7 +74264,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone X 14.5",
+        "name": "ios_web_shell_eg2tests_module iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74316,7 +74316,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone X 15.4",
+        "name": "ios_web_shell_eg2tests_module iPhone X 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74367,7 +74367,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPad Air 2 14.5",
+        "name": "ios_web_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74418,7 +74418,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPad Air 2 15.4",
+        "name": "ios_web_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74469,7 +74469,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s 14.5",
+        "name": "ios_web_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74520,7 +74520,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s 15.4",
+        "name": "ios_web_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74571,7 +74571,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s Plus 14.5",
+        "name": "ios_web_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74622,7 +74622,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s Plus 15.4",
+        "name": "ios_web_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74673,7 +74673,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone SE (1st generation) 14.5",
+        "name": "ios_web_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74724,7 +74724,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone SE (1st generation) 15.4",
+        "name": "ios_web_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74775,7 +74775,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPad Air 2 14.5",
+        "name": "ios_web_view_inttests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74826,7 +74826,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPad Air 2 15.4",
+        "name": "ios_web_view_inttests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74877,7 +74877,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s 14.5",
+        "name": "ios_web_view_inttests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74928,7 +74928,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s 15.4",
+        "name": "ios_web_view_inttests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -74979,7 +74979,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s Plus 14.5",
+        "name": "ios_web_view_inttests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75030,7 +75030,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s Plus 15.4",
+        "name": "ios_web_view_inttests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75081,7 +75081,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone SE (1st generation) 14.5",
+        "name": "ios_web_view_inttests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75132,7 +75132,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone SE (1st generation) 15.4",
+        "name": "ios_web_view_inttests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75183,7 +75183,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPad Air 2 14.5",
+        "name": "ios_web_view_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75234,7 +75234,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPad Air 2 15.4",
+        "name": "ios_web_view_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75285,7 +75285,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s 14.5",
+        "name": "ios_web_view_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75336,7 +75336,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s 15.4",
+        "name": "ios_web_view_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75387,7 +75387,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s Plus 14.5",
+        "name": "ios_web_view_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75438,7 +75438,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s Plus 15.4",
+        "name": "ios_web_view_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75489,7 +75489,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone SE (1st generation) 14.5",
+        "name": "ios_web_view_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75540,7 +75540,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone SE (1st generation) 15.4",
+        "name": "ios_web_view_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75591,7 +75591,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone 6s 14.5",
+        "name": "net_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75642,7 +75642,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone 6s 15.4",
+        "name": "net_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75693,7 +75693,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPhone 6s 14.5",
+        "name": "services_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75744,7 +75744,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPhone 6s 15.4",
+        "name": "services_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75795,7 +75795,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPad Air 2 14.5",
+        "name": "skia_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75846,7 +75846,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPad Air 2 15.4",
+        "name": "skia_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75897,7 +75897,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s 14.5",
+        "name": "skia_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75948,7 +75948,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s 15.4",
+        "name": "skia_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -75999,7 +75999,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s Plus 14.5",
+        "name": "skia_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76050,7 +76050,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s Plus 15.4",
+        "name": "skia_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76101,7 +76101,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone SE (1st generation) 14.5",
+        "name": "skia_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76152,7 +76152,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone SE (1st generation) 15.4",
+        "name": "skia_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76203,7 +76203,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone 6s 14.5",
+        "name": "sql_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76254,7 +76254,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone 6s 15.4",
+        "name": "sql_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76305,7 +76305,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPad Air 2 14.5",
+        "name": "ui_base_unittests iPad Air 2 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76356,7 +76356,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPad Air 2 15.4",
+        "name": "ui_base_unittests iPad Air 2 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76407,7 +76407,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s 14.5",
+        "name": "ui_base_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76458,7 +76458,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s 15.4",
+        "name": "ui_base_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76509,7 +76509,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s Plus 14.5",
+        "name": "ui_base_unittests iPhone 6s Plus 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76560,7 +76560,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s Plus 15.4",
+        "name": "ui_base_unittests iPhone 6s Plus 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76611,7 +76611,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone SE (1st generation) 14.5",
+        "name": "ui_base_unittests iPhone SE (1st generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76662,7 +76662,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone SE (1st generation) 15.4",
+        "name": "ui_base_unittests iPhone SE (1st generation) 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76713,7 +76713,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone 6s 14.5",
+        "name": "url_unittests iPhone 6s 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76764,7 +76764,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone 6s 15.4",
+        "name": "url_unittests iPhone 6s 15.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76824,7 +76824,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "aura_unittests_amd64-generic",
+        "name": "aura_unittests amd64-generic",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76852,7 +76852,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "aura_unittests_eve",
+        "name": "aura_unittests eve",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76882,7 +76882,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "cc_unittests_amd64-generic",
+        "name": "cc_unittests amd64-generic",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76910,7 +76910,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "cc_unittests_eve",
+        "name": "cc_unittests eve",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76940,7 +76940,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_all_tast_tests_informational_amd64-generic",
+        "name": "lacros_all_tast_tests_informational amd64-generic",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -76969,7 +76969,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_all_tast_tests_informational_eve",
+        "name": "lacros_all_tast_tests_informational eve",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -77000,7 +77000,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_fyi_tast_tests_amd64-generic",
+        "name": "lacros_fyi_tast_tests amd64-generic",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -77029,7 +77029,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_fyi_tast_tests_eve",
+        "name": "lacros_fyi_tast_tests eve",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -77060,7 +77060,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "ozone_unittests_amd64-generic",
+        "name": "ozone_unittests amd64-generic",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -77088,7 +77088,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "ozone_unittests_eve",
+        "name": "ozone_unittests eve",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -77120,7 +77120,7 @@
         "args": [],
         "cros_board": "octopus",
         "cros_img": "octopus-full/R101-14543.0.0-rc1",
-        "name": "lacros_fyi_tast_tests_OCTOPUS_FULL",
+        "name": "lacros_fyi_tast_tests OCTOPUS_FULL",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
         "test": "lacros_fyi_tast_tests",
@@ -77131,7 +77131,7 @@
         "args": [],
         "cros_board": "eve",
         "cros_img": "eve-full/R100-14495.0.0-rc1",
-        "name": "lacros_fyi_tast_tests_EVE_FULL",
+        "name": "lacros_fyi_tast_tests EVE_FULL",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
         "test": "lacros_fyi_tast_tests",
@@ -77142,7 +77142,7 @@
         "args": [],
         "cros_board": "octopus",
         "cros_img": "octopus-full/R101-14543.0.0-rc1",
-        "name": "ozone_unittests_OCTOPUS_FULL",
+        "name": "ozone_unittests OCTOPUS_FULL",
         "swarming": {},
         "test": "ozone_unittests",
         "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
@@ -77152,7 +77152,7 @@
         "args": [],
         "cros_board": "eve",
         "cros_img": "eve-full/R100-14495.0.0-rc1",
-        "name": "ozone_unittests_EVE_FULL",
+        "name": "ozone_unittests EVE_FULL",
         "swarming": {},
         "test": "ozone_unittests",
         "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
@@ -86073,23 +86073,6 @@
       },
       {
         "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "lacros_chrome_browsertests_Lacros plus ToT ash",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "lacros_chrome_browsertests",
-        "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/"
-      },
-      {
-        "args": [
           "--ash-chrome-path-override=../../lacros_version_skew_tests_v100.0.4896.64/test_ash_chrome",
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter"
         ],
@@ -86098,7 +86081,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 100.0.4896.64",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 100.0.4896.64",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -86123,7 +86106,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 101.0.4951.13",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 101.0.4951.13",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -86148,7 +86131,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 102.0.4984.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 102.0.4984.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -86173,7 +86156,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 99.0.4844.33",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 99.0.4844.33",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -86197,13 +86180,13 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros plus ToT ash",
+        "name": "lacros_chrome_browsertests on ToT ash",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "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/"
+        "test": "lacros_chrome_browsertests",
+        "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/"
       },
       {
         "args": [
@@ -86215,7 +86198,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 100.0.4896.64",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 100.0.4896.64",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -86240,7 +86223,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 101.0.4951.13",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 101.0.4951.13",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -86265,7 +86248,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 102.0.4984.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 102.0.4984.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -86290,7 +86273,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 99.0.4844.33",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 99.0.4844.33",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -86306,6 +86289,23 @@
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/"
       },
       {
+        "args": [
+          "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter"
+        ],
+        "isolate_profile_data": true,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "lacros_chrome_browsertests_run_in_series on ToT ash",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "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/"
+      },
+      {
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -87562,28 +87562,6 @@
       },
       {
         "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "lacros_chrome_browsertests_Lacros plus ToT ash",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04",
-              "ssd": "0"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "lacros_chrome_browsertests",
-        "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/"
-      },
-      {
-        "args": [
           "--ash-chrome-path-override=../../lacros_version_skew_tests_v100.0.4896.64/test_ash_chrome",
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter"
         ],
@@ -87591,7 +87569,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 100.0.4896.64",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 100.0.4896.64",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -87621,7 +87599,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 101.0.4951.13",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 101.0.4951.13",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -87651,7 +87629,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 102.0.4984.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 102.0.4984.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -87681,7 +87659,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 99.0.4844.33",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 99.0.4844.33",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -87710,7 +87688,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros plus ToT ash",
+        "name": "lacros_chrome_browsertests on ToT ash",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -87721,8 +87699,8 @@
           ],
           "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/"
+        "test": "lacros_chrome_browsertests",
+        "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/"
       },
       {
         "args": [
@@ -87733,7 +87711,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 100.0.4896.64",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 100.0.4896.64",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -87763,7 +87741,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 101.0.4951.13",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 101.0.4951.13",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -87793,7 +87771,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 102.0.4984.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 102.0.4984.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -87823,7 +87801,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 99.0.4844.33",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 99.0.4844.33",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -87845,6 +87823,28 @@
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/"
       },
       {
+        "args": [
+          "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "lacros_chrome_browsertests_run_in_series on ToT ash",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-18.04",
+              "ssd": "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/"
+      },
+      {
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -89259,28 +89259,6 @@
       },
       {
         "args": [
-          "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "lacros_chrome_browsertests_Lacros plus ToT ash",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04",
-              "ssd": "0"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "lacros_chrome_browsertests",
-        "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/"
-      },
-      {
-        "args": [
           "--ash-chrome-path-override=../../lacros_version_skew_tests_v100.0.4896.64/test_ash_chrome",
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter"
         ],
@@ -89288,7 +89266,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 100.0.4896.64",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 100.0.4896.64",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -89318,7 +89296,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 101.0.4951.13",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 101.0.4951.13",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -89348,7 +89326,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 102.0.4984.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 102.0.4984.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -89378,7 +89356,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 99.0.4844.33",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 99.0.4844.33",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -89407,7 +89385,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros plus ToT ash",
+        "name": "lacros_chrome_browsertests on ToT ash",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -89418,8 +89396,8 @@
           ],
           "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/"
+        "test": "lacros_chrome_browsertests",
+        "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/"
       },
       {
         "args": [
@@ -89430,7 +89408,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 100.0.4896.64",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 100.0.4896.64",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -89460,7 +89438,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 101.0.4951.13",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 101.0.4951.13",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -89490,7 +89468,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 102.0.4984.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 102.0.4984.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -89520,7 +89498,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 99.0.4844.33",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 99.0.4844.33",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -89542,6 +89520,28 @@
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/"
       },
       {
+        "args": [
+          "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "lacros_chrome_browsertests_run_in_series on ToT ash",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-18.04",
+              "ssd": "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/"
+      },
+      {
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -90187,7 +90187,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 100.0.4896.64",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 100.0.4896.64",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -90211,7 +90211,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 101.0.4951.13",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 101.0.4951.13",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -90235,7 +90235,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 102.0.4984.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 102.0.4984.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -90259,7 +90259,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_Lacros version skew testing ash 99.0.4844.33",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 99.0.4844.33",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -90283,7 +90283,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 100.0.4896.64",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 100.0.4896.64",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -90307,7 +90307,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 101.0.4951.13",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 101.0.4951.13",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -90331,7 +90331,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 102.0.4984.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 102.0.4984.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
@@ -90355,7 +90355,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series_Lacros version skew testing ash 99.0.4844.33",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 99.0.4844.33",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index 5689f830..d22d0a6 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -12197,7 +12197,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone 6s 14.4",
+        "name": "absl_hardening_tests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -12249,7 +12249,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone 6s 15.2",
+        "name": "absl_hardening_tests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -12301,7 +12301,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPad Air 2 14.4",
+        "name": "base_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -12353,7 +12353,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPad Air 2 15.2",
+        "name": "base_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -12405,7 +12405,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s 14.4",
+        "name": "base_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -12457,7 +12457,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s 15.2",
+        "name": "base_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -12509,7 +12509,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s Plus 14.4",
+        "name": "base_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -12561,7 +12561,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone 6s Plus 15.2",
+        "name": "base_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -12613,7 +12613,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone SE (1st generation) 14.4",
+        "name": "base_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -12665,7 +12665,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "base_unittests_iPhone SE (1st generation) 15.2",
+        "name": "base_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -12717,7 +12717,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone 6s 14.4",
+        "name": "boringssl_crypto_tests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -12769,7 +12769,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone 6s 15.2",
+        "name": "boringssl_crypto_tests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -12821,7 +12821,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone 6s 14.4",
+        "name": "boringssl_ssl_tests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -12873,7 +12873,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone 6s 15.2",
+        "name": "boringssl_ssl_tests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -12925,7 +12925,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPad Air 2 14.4",
+        "name": "components_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -12977,7 +12977,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPad Air 2 15.2",
+        "name": "components_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13029,7 +13029,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s 14.4",
+        "name": "components_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13081,7 +13081,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s 15.2",
+        "name": "components_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13133,7 +13133,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s Plus 14.4",
+        "name": "components_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13185,7 +13185,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone 6s Plus 15.2",
+        "name": "components_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13237,7 +13237,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone SE (1st generation) 14.4",
+        "name": "components_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13289,7 +13289,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "components_unittests_iPhone SE (1st generation) 15.2",
+        "name": "components_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13341,7 +13341,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone 6s 14.4",
+        "name": "crypto_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13393,7 +13393,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone 6s 15.2",
+        "name": "crypto_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13445,7 +13445,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPad Air 2 14.4",
+        "name": "gfx_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13497,7 +13497,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPad Air 2 15.2",
+        "name": "gfx_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13549,7 +13549,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s 14.4",
+        "name": "gfx_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13601,7 +13601,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s 15.2",
+        "name": "gfx_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13653,7 +13653,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s Plus 14.4",
+        "name": "gfx_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13705,7 +13705,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone 6s Plus 15.2",
+        "name": "gfx_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13757,7 +13757,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone SE (1st generation) 14.4",
+        "name": "gfx_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13809,7 +13809,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "gfx_unittests_iPhone SE (1st generation) 15.2",
+        "name": "gfx_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13861,7 +13861,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone 6s 14.4",
+        "name": "google_apis_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13913,7 +13913,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone 6s 15.2",
+        "name": "google_apis_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -13966,7 +13966,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14020,7 +14020,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14074,7 +14074,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14128,7 +14128,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14182,7 +14182,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14236,7 +14236,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14289,7 +14289,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPad Air 2 14.4",
+        "name": "ios_chrome_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14341,7 +14341,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPad Air 2 15.2",
+        "name": "ios_chrome_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14393,7 +14393,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s 14.4",
+        "name": "ios_chrome_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14445,7 +14445,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s 15.2",
+        "name": "ios_chrome_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14497,7 +14497,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s Plus 14.4",
+        "name": "ios_chrome_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14549,7 +14549,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone 6s Plus 15.2",
+        "name": "ios_chrome_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14601,7 +14601,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone SE (1st generation) 14.4",
+        "name": "ios_chrome_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14653,7 +14653,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_unittests_iPhone SE (1st generation) 15.2",
+        "name": "ios_chrome_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14705,7 +14705,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPhone 6s 14.4",
+        "name": "ios_components_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14757,7 +14757,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPhone 6s 15.2",
+        "name": "ios_components_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14809,7 +14809,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone 6s 14.4",
+        "name": "ios_net_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14862,7 +14862,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone 6s 15.2",
+        "name": "ios_net_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14915,7 +14915,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone 6s 14.4",
+        "name": "ios_remoting_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -14967,7 +14967,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone 6s 15.2",
+        "name": "ios_remoting_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15019,7 +15019,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPhone 6s 14.4",
+        "name": "ios_testing_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15071,7 +15071,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPhone 6s 15.2",
+        "name": "ios_testing_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15123,7 +15123,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPad Air 2 14.4",
+        "name": "ios_web_inttests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15175,7 +15175,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPad Air 2 15.2",
+        "name": "ios_web_inttests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15227,7 +15227,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s 14.4",
+        "name": "ios_web_inttests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15279,7 +15279,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s 15.2",
+        "name": "ios_web_inttests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15331,7 +15331,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s Plus 14.4",
+        "name": "ios_web_inttests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15383,7 +15383,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone 6s Plus 15.2",
+        "name": "ios_web_inttests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15435,7 +15435,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone SE (1st generation) 14.4",
+        "name": "ios_web_inttests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15487,7 +15487,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_inttests_iPhone SE (1st generation) 15.2",
+        "name": "ios_web_inttests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15540,7 +15540,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_web_shell_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15593,7 +15593,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 6s 15.2",
+        "name": "ios_web_shell_eg2tests_module iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15645,7 +15645,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPad Air 2 14.4",
+        "name": "ios_web_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15697,7 +15697,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPad Air 2 15.2",
+        "name": "ios_web_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15749,7 +15749,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s 14.4",
+        "name": "ios_web_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15801,7 +15801,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s 15.2",
+        "name": "ios_web_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15853,7 +15853,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s Plus 14.4",
+        "name": "ios_web_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15905,7 +15905,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone 6s Plus 15.2",
+        "name": "ios_web_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -15957,7 +15957,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone SE (1st generation) 14.4",
+        "name": "ios_web_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16009,7 +16009,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_unittests_iPhone SE (1st generation) 15.2",
+        "name": "ios_web_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16061,7 +16061,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPad Air 2 14.4",
+        "name": "ios_web_view_inttests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16113,7 +16113,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPad Air 2 15.2",
+        "name": "ios_web_view_inttests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16165,7 +16165,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s 14.4",
+        "name": "ios_web_view_inttests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16217,7 +16217,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s 15.2",
+        "name": "ios_web_view_inttests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16269,7 +16269,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s Plus 14.4",
+        "name": "ios_web_view_inttests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16321,7 +16321,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone 6s Plus 15.2",
+        "name": "ios_web_view_inttests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16373,7 +16373,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone SE (1st generation) 14.4",
+        "name": "ios_web_view_inttests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16425,7 +16425,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_inttests_iPhone SE (1st generation) 15.2",
+        "name": "ios_web_view_inttests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16477,7 +16477,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPad Air 2 14.4",
+        "name": "ios_web_view_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16529,7 +16529,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPad Air 2 15.2",
+        "name": "ios_web_view_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16581,7 +16581,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s 14.4",
+        "name": "ios_web_view_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16633,7 +16633,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s 15.2",
+        "name": "ios_web_view_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16685,7 +16685,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s Plus 14.4",
+        "name": "ios_web_view_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16737,7 +16737,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone 6s Plus 15.2",
+        "name": "ios_web_view_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16789,7 +16789,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone SE (1st generation) 14.4",
+        "name": "ios_web_view_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16841,7 +16841,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_view_unittests_iPhone SE (1st generation) 15.2",
+        "name": "ios_web_view_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16893,7 +16893,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone 6s 14.4",
+        "name": "net_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16945,7 +16945,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone 6s 15.2",
+        "name": "net_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -16997,7 +16997,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPhone 6s 14.4",
+        "name": "services_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17049,7 +17049,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPhone 6s 15.2",
+        "name": "services_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17101,7 +17101,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPad Air 2 14.4",
+        "name": "skia_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17153,7 +17153,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPad Air 2 15.2",
+        "name": "skia_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17205,7 +17205,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s 14.4",
+        "name": "skia_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17257,7 +17257,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s 15.2",
+        "name": "skia_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17309,7 +17309,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s Plus 14.4",
+        "name": "skia_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17361,7 +17361,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone 6s Plus 15.2",
+        "name": "skia_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17413,7 +17413,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone SE (1st generation) 14.4",
+        "name": "skia_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17465,7 +17465,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "skia_unittests_iPhone SE (1st generation) 15.2",
+        "name": "skia_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17517,7 +17517,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone 6s 14.4",
+        "name": "sql_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17569,7 +17569,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone 6s 15.2",
+        "name": "sql_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17621,7 +17621,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPad Air 2 14.4",
+        "name": "ui_base_unittests iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17673,7 +17673,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPad Air 2 15.2",
+        "name": "ui_base_unittests iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17725,7 +17725,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s 14.4",
+        "name": "ui_base_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17777,7 +17777,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s 15.2",
+        "name": "ui_base_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17829,7 +17829,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s Plus 14.4",
+        "name": "ui_base_unittests iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17881,7 +17881,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone 6s Plus 15.2",
+        "name": "ui_base_unittests iPhone 6s Plus 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17933,7 +17933,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone SE (1st generation) 14.4",
+        "name": "ui_base_unittests iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -17985,7 +17985,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ui_base_unittests_iPhone SE (1st generation) 15.2",
+        "name": "ui_base_unittests iPhone SE (1st generation) 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18037,7 +18037,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone 6s 14.4",
+        "name": "url_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18089,7 +18089,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone 6s 15.2",
+        "name": "url_unittests iPhone 6s 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18149,7 +18149,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18202,7 +18202,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18255,7 +18255,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18308,7 +18308,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18361,7 +18361,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 14.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18414,7 +18414,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone X 15.2",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18467,7 +18467,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_integration_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18521,7 +18521,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_integration_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18575,7 +18575,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18629,7 +18629,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18683,7 +18683,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_settings_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18737,7 +18737,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_settings_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18791,7 +18791,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_settings_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18845,7 +18845,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_settings_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18899,7 +18899,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone X 14.4",
+        "name": "ios_chrome_settings_eg2tests_module iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -18953,7 +18953,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone X 15.2",
+        "name": "ios_chrome_settings_eg2tests_module iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19007,7 +19007,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_signin_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19061,7 +19061,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_signin_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19115,7 +19115,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19169,7 +19169,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19223,7 +19223,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19276,7 +19276,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_smoke_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19329,7 +19329,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19382,7 +19382,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19435,7 +19435,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone X 14.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19488,7 +19488,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone X 15.2",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19541,7 +19541,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_ui_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19595,7 +19595,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_ui_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19649,7 +19649,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19703,7 +19703,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19757,7 +19757,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_web_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19810,7 +19810,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_chrome_web_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19863,7 +19863,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_chrome_web_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19916,7 +19916,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_chrome_web_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -19969,7 +19969,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone X 14.4",
+        "name": "ios_chrome_web_eg2tests_module iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20022,7 +20022,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone X 15.2",
+        "name": "ios_chrome_web_eg2tests_module iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20075,7 +20075,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_showcase_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20128,7 +20128,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_showcase_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20181,7 +20181,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_showcase_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20234,7 +20234,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_showcase_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20287,7 +20287,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone X 14.4",
+        "name": "ios_showcase_eg2tests_module iPhone X 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20340,7 +20340,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone X 15.2",
+        "name": "ios_showcase_eg2tests_module iPhone X 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20393,7 +20393,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_web_shell_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20446,7 +20446,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Air 2 15.2",
+        "name": "ios_web_shell_eg2tests_module iPad Air 2 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20499,7 +20499,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 7 14.4",
+        "name": "ios_web_shell_eg2tests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20552,7 +20552,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 7 15.2",
+        "name": "ios_web_shell_eg2tests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20610,7 +20610,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "absl_hardening_tests_iPhone 6s 14.4",
+        "name": "absl_hardening_tests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20661,7 +20661,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_crypto_tests_iPhone 6s 14.4",
+        "name": "boringssl_crypto_tests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20712,7 +20712,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "boringssl_ssl_tests_iPhone 6s 14.4",
+        "name": "boringssl_ssl_tests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20763,7 +20763,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "crypto_unittests_iPhone 6s 14.4",
+        "name": "crypto_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20814,7 +20814,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "google_apis_unittests_iPhone 6s 14.4",
+        "name": "google_apis_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20866,7 +20866,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_bookmarks_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_bookmarks_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20918,7 +20918,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_integration_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -20971,7 +20971,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21024,7 +21024,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone 6s Plus 14.4",
+        "name": "ios_chrome_integration_eg2tests_module iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21077,7 +21077,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_integration_eg2tests_module_iPhone SE (1st generation) 14.4",
+        "name": "ios_chrome_integration_eg2tests_module iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21130,7 +21130,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_settings_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_settings_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21183,7 +21183,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_signin_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21236,7 +21236,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21289,7 +21289,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone 6s Plus 14.4",
+        "name": "ios_chrome_signin_eg2tests_module iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21342,7 +21342,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_signin_eg2tests_module_iPhone SE (1st generation) 14.4",
+        "name": "ios_chrome_signin_eg2tests_module iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21395,7 +21395,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_smoke_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_smoke_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21447,7 +21447,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_chrome_ui_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21500,7 +21500,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21553,7 +21553,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone 6s Plus 14.4",
+        "name": "ios_chrome_ui_eg2tests_module iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21606,7 +21606,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_ui_eg2tests_module_iPhone SE (1st generation) 14.4",
+        "name": "ios_chrome_ui_eg2tests_module iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21659,7 +21659,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_chrome_web_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_chrome_web_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21710,7 +21710,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_components_unittests_iPhone 6s 14.4",
+        "name": "ios_components_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21762,7 +21762,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_crash_xcuitests_module_iPhone 7 14.4",
+        "name": "ios_crash_xcuitests_module iPhone 7 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21814,7 +21814,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_crash_xcuitests_module_iPhone 7 15.2",
+        "name": "ios_crash_xcuitests_module iPhone 7 15.2",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21865,7 +21865,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_net_unittests_iPhone 6s 14.4",
+        "name": "ios_net_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21917,7 +21917,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone 6s 14.4",
+        "name": "ios_remoting_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -21969,7 +21969,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_showcase_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_showcase_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -22020,7 +22020,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_testing_unittests_iPhone 6s 14.4",
+        "name": "ios_testing_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -22072,7 +22072,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPad Air 2 14.4",
+        "name": "ios_web_shell_eg2tests_module iPad Air 2 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -22124,7 +22124,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 6s 14.4",
+        "name": "ios_web_shell_eg2tests_module iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -22176,7 +22176,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone 6s Plus 14.4",
+        "name": "ios_web_shell_eg2tests_module iPhone 6s Plus 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -22228,7 +22228,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_web_shell_eg2tests_module_iPhone SE (1st generation) 14.4",
+        "name": "ios_web_shell_eg2tests_module iPhone SE (1st generation) 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -22279,7 +22279,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "net_unittests_iPhone 6s 14.4",
+        "name": "net_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -22330,7 +22330,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "services_unittests_iPhone 6s 14.4",
+        "name": "services_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -22381,7 +22381,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "sql_unittests_iPhone 6s 14.4",
+        "name": "sql_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -22432,7 +22432,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "url_unittests_iPhone 6s 14.4",
+        "name": "url_unittests iPhone 6s 14.4",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
diff --git a/testing/buildbot/chromium.reclient.fyi.json b/testing/buildbot/chromium.reclient.fyi.json
index 0e08525..749fc3f 100644
--- a/testing/buildbot/chromium.reclient.fyi.json
+++ b/testing/buildbot/chromium.reclient.fyi.json
@@ -10,5 +10,15 @@
     "additional_compile_targets": [
       "all"
     ]
+  },
+  "Simple Chrome Builder reclient staging": {
+    "additional_compile_targets": [
+      "chromiumos_preflight"
+    ]
+  },
+  "Simple Chrome Builder reclient test": {
+    "additional_compile_targets": [
+      "chromiumos_preflight"
+    ]
   }
 }
diff --git a/testing/buildbot/chromium.webrtc.fyi.json b/testing/buildbot/chromium.webrtc.fyi.json
index 943b02b..39cd9e9f 100644
--- a/testing/buildbot/chromium.webrtc.fyi.json
+++ b/testing/buildbot/chromium.webrtc.fyi.json
@@ -718,7 +718,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPad Air (3rd generation) 14.5",
+        "name": "ios_remoting_unittests iPad Air (3rd generation) 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
@@ -769,7 +769,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
-        "name": "ios_remoting_unittests_iPhone X 14.5",
+        "name": "ios_remoting_unittests iPhone X 14.5",
         "resultdb": {
           "enable": true,
           "has_native_resultdb_integration": true
diff --git a/testing/buildbot/generate_buildbot_json.py b/testing/buildbot/generate_buildbot_json.py
index 8791948d..6163d7f 100755
--- a/testing/buildbot/generate_buildbot_json.py
+++ b/testing/buildbot/generate_buildbot_json.py
@@ -266,6 +266,13 @@
     if not 'identifier' in variant:
       raise BBGenErr('Missing required identifier field in matrix '
                      'compound suite %s, %s' % (suite, sub_suite))
+    if variant['identifier'] == '':
+      raise BBGenErr('Identifier field can not be "" in matrix '
+                     'compound suite %s, %s' % (suite, sub_suite))
+    if variant['identifier'].strip() != variant['identifier']:
+      raise BBGenErr('Identifier field can not have leading and trailing '
+                     'whitespace in matrix compound suite %s, %s' %
+                     (suite, sub_suite))
 
 
 class BBJSONGenerator(object):  # pylint: disable=useless-object-inheritance
@@ -1204,7 +1211,7 @@
         # The identifier is used to make the name of the test unique.
         # Generators in the recipe uniquely identify a test by it's name, so we
         # don't want to have the same name for each variant.
-        cloned_config['name'] = '{}_{}'.format(test_name,
+        cloned_config['name'] = '{} {}'.format(test_name,
                                                cloned_variant['identifier'])
         definitions.append(cloned_config)
       test_suite[test_name] = definitions
diff --git a/testing/buildbot/generate_buildbot_json_unittest.py b/testing/buildbot/generate_buildbot_json_unittest.py
index 41cdc2a..4ab619f4 100755
--- a/testing/buildbot/generate_buildbot_json_unittest.py
+++ b/testing/buildbot/generate_buildbot_json_unittest.py
@@ -5274,6 +5274,76 @@
 }
 """
 
+MATRIX_COMPOUND_EMPTY_IDENTIFIER = """\
+{
+  'basic_suites': {
+    'foo_tests': {
+      'foo_test': {},
+    },
+  },
+  'matrix_compound_suites': {
+    'matrix_tests': {
+      'foo_tests': {
+        'variants': [
+          {
+            'identifier': '',
+            'swarming': {
+              'dimension_sets': [
+                {
+                  'foo': 'empty identifier not allowed',
+                },
+              ],
+            },
+          },
+        ],
+      },
+    },
+  },
+}
+"""
+
+MATRIX_COMPOUND_TRAILING_IDENTIFIER = """\
+{
+  'basic_suites': {
+    'foo_tests': {
+      'foo_test': {},
+    },
+  },
+  'matrix_compound_suites': {
+    'matrix_tests': {
+      'foo_tests': {
+        'variants': [
+          {
+            'identifier': ' ',
+            'swarming': {
+              'dimension_sets': [
+                {
+                  'foo': 'strip to empty not allowed',
+                },
+              ],
+            },
+          },
+        ],
+      },
+      'foo_tests': {
+        'variants': [
+          {
+            'identifier': 'id ',
+            'swarming': {
+              'dimension_sets': [
+                {
+                  'foo': 'trailing whitespace not allowed',
+                },
+              ],
+            },
+          },
+        ],
+      },
+    },
+  },
+}
+"""
+
 MATRIX_MISMATCHED_SWARMING_LENGTH = """\
 {
   'basic_suites': {
@@ -5765,7 +5835,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "swarming_test_a_variant",
+        "name": "swarming_test a_variant",
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -5791,7 +5861,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "args_test_args",
+        "name": "args_test args",
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -5805,7 +5875,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "args_test_mixins",
+        "name": "args_test mixins",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5824,7 +5894,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "args_test_swarming",
+        "name": "args_test swarming",
         "swarming": {
           "a": "b",
           "can_use_on_swarming_builders": true,
@@ -5855,7 +5925,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "mixins_test_args",
+        "name": "mixins_test args",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "value": "test"
@@ -5869,7 +5939,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "mixins_test_mixins",
+        "name": "mixins_test mixins",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5888,7 +5958,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "mixins_test_swarming",
+        "name": "mixins_test swarming",
         "swarming": {
           "a": "b",
           "can_use_on_swarming_builders": true,
@@ -5921,7 +5991,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "swarming_test_args",
+        "name": "swarming_test args",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5939,7 +6009,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "swarming_test_mixins",
+        "name": "swarming_test mixins",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -5958,7 +6028,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "swarming_test_swarming",
+        "name": "swarming_test swarming",
         "swarming": {
           "a": "b",
           "can_use_on_swarming_builders": true,
@@ -5994,7 +6064,7 @@
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "swarming_test_a_variant",
+        "name": "swarming_test a_variant",
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -6007,12 +6077,12 @@
 
 EMPTY_SKYLAB_TEST_EXCEPTIONS = """\
 {
-  'tast.foo_OCTOPUS_TOT': {
+  'tast.foo OCTOPUS_TOT': {
     'remove_from': [
       'Fake Tester',
     ]
   },
-  'tast.foo_OCTOPUS_TOT-1': {
+  'tast.foo OCTOPUS_TOT-1': {
     'remove_from': [
       'Fake Tester',
     ]
@@ -6135,7 +6205,7 @@
         "args": [],
         "cros_board": "octopus",
         "cros_img": "octopus-release/R89-13655.0.0",
-        "name": "tast.basic_OCTOPUS_TOT",
+        "name": "tast.basic OCTOPUS_TOT",
         "suite": "tast.basic",
         "swarming": {},
         "test": "tast.basic",
@@ -6145,7 +6215,7 @@
         "args": [],
         "cros_board": "octopus",
         "cros_img": "octopus-release/R88-13597.23.0",
-        "name": "tast.basic_OCTOPUS_TOT-1",
+        "name": "tast.basic OCTOPUS_TOT-1",
         "suite": "tast.basic",
         "swarming": {},
         "test": "tast.basic",
@@ -6166,7 +6236,7 @@
         "args": [],
         "cros_board": "octopus",
         "cros_img": "octopus-release/R89-13655.0.0",
-        "name": "tast.basic_OCTOPUS_TOT",
+        "name": "tast.basic OCTOPUS_TOT",
         "suite": "tast.basic",
         "swarming": {},
         "test": "tast.basic",
@@ -6205,6 +6275,29 @@
         'Missing required identifier field in matrix compound suite*'):
       fbb.check_output_file_consistency(verbose=True)
 
+  def test_empty_identifier(self):
+    """
+    Variant identifier is empty.
+    """
+    fbb = FakeBBGen(self.args, MATRIX_GTEST_SUITE_WATERFALL,
+                    MATRIX_COMPOUND_EMPTY_IDENTIFIER, LUCI_MILO_CFG)
+    with self.assertRaisesRegex(
+        generate_buildbot_json.BBGenErr,
+        'Identifier field can not be "" in matrix compound suite*'):
+      fbb.check_output_file_consistency(verbose=True)
+
+  def test_trailing_identifier(self):
+    """
+    Variant identifier has trailing whitespace.
+    """
+    fbb = FakeBBGen(self.args, MATRIX_GTEST_SUITE_WATERFALL,
+                    MATRIX_COMPOUND_TRAILING_IDENTIFIER, LUCI_MILO_CFG)
+    with self.assertRaisesRegex(
+        generate_buildbot_json.BBGenErr,
+        'Identifier field can not have leading and trailing whitespace in'
+        ' matrix compound suite*'):
+      fbb.check_output_file_consistency(verbose=True)
+
   def test_mismatched_swarming_length(self):
     """
     Swarming dimension set length mismatch test. Composition set > basic set
diff --git a/testing/buildbot/internal.chromeos.fyi.json b/testing/buildbot/internal.chromeos.fyi.json
index 6807feb8..7386888 100644
--- a/testing/buildbot/internal.chromeos.fyi.json
+++ b/testing/buildbot/internal.chromeos.fyi.json
@@ -1127,7 +1127,7 @@
         "args": [],
         "cros_board": "octopus",
         "cros_img": "octopus-release/R102-14658.0.0",
-        "name": "lacros_fyi_tast_tests_OCTOPUS_RELEASE_LKGM",
+        "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_LKGM",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
         "test": "lacros_fyi_tast_tests",
@@ -1138,7 +1138,7 @@
         "args": [],
         "cros_board": "octopus",
         "cros_img": "octopus-release/R101-14588.23.0",
-        "name": "lacros_fyi_tast_tests_OCTOPUS_RELEASE_DEV",
+        "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_DEV",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
         "test": "lacros_fyi_tast_tests",
@@ -1149,7 +1149,7 @@
         "args": [],
         "cros_board": "octopus",
         "cros_img": "octopus-release/R100-14526.43.0",
-        "name": "lacros_fyi_tast_tests_OCTOPUS_RELEASE_BETA",
+        "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_BETA",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
         "test": "lacros_fyi_tast_tests",
@@ -1160,7 +1160,7 @@
         "args": [],
         "cros_board": "octopus",
         "cros_img": "octopus-release/R100-14526.57.0",
-        "name": "lacros_fyi_tast_tests_OCTOPUS_RELEASE_STABLE",
+        "name": "lacros_fyi_tast_tests OCTOPUS_RELEASE_STABLE",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
         "test": "lacros_fyi_tast_tests",
@@ -1171,7 +1171,7 @@
         "args": [],
         "cros_board": "octopus",
         "cros_img": "octopus-release/R102-14658.0.0",
-        "name": "ozone_unittests_OCTOPUS_RELEASE_LKGM",
+        "name": "ozone_unittests OCTOPUS_RELEASE_LKGM",
         "swarming": {},
         "test": "ozone_unittests",
         "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
@@ -1181,7 +1181,7 @@
         "args": [],
         "cros_board": "octopus",
         "cros_img": "octopus-release/R101-14588.23.0",
-        "name": "ozone_unittests_OCTOPUS_RELEASE_DEV",
+        "name": "ozone_unittests OCTOPUS_RELEASE_DEV",
         "swarming": {},
         "test": "ozone_unittests",
         "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
@@ -1191,7 +1191,7 @@
         "args": [],
         "cros_board": "octopus",
         "cros_img": "octopus-release/R100-14526.43.0",
-        "name": "ozone_unittests_OCTOPUS_RELEASE_BETA",
+        "name": "ozone_unittests OCTOPUS_RELEASE_BETA",
         "swarming": {},
         "test": "ozone_unittests",
         "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
@@ -1201,7 +1201,7 @@
         "args": [],
         "cros_board": "octopus",
         "cros_img": "octopus-release/R100-14526.57.0",
-        "name": "ozone_unittests_OCTOPUS_RELEASE_STABLE",
+        "name": "ozone_unittests OCTOPUS_RELEASE_STABLE",
         "swarming": {},
         "test": "ozone_unittests",
         "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
@@ -1219,7 +1219,7 @@
         "args": [],
         "cros_board": "strongbad",
         "cros_img": "strongbad-release/R102-14658.0.0",
-        "name": "lacros_all_tast_tests_STRONGBAD_RELEASE_LKGM",
+        "name": "lacros_all_tast_tests STRONGBAD_RELEASE_LKGM",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
         "test": "lacros_all_tast_tests",
@@ -1230,7 +1230,7 @@
         "args": [],
         "cros_board": "strongbad",
         "cros_img": "strongbad-release/R101-14588.23.0",
-        "name": "lacros_all_tast_tests_strongbad_RELEASE_DEV",
+        "name": "lacros_all_tast_tests strongbad_RELEASE_DEV",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
         "test": "lacros_all_tast_tests",
@@ -1241,7 +1241,7 @@
         "args": [],
         "cros_board": "strongbad",
         "cros_img": "strongbad-release/R100-14526.28.0",
-        "name": "lacros_all_tast_tests_STRONGBAD_RELEASE_BETA",
+        "name": "lacros_all_tast_tests STRONGBAD_RELEASE_BETA",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
         "test": "lacros_all_tast_tests",
@@ -1252,7 +1252,7 @@
         "args": [],
         "cros_board": "strongbad",
         "cros_img": "strongbad-release/R99-14469.59.0",
-        "name": "lacros_all_tast_tests_STRONGBAD_RELEASE_STABLE",
+        "name": "lacros_all_tast_tests STRONGBAD_RELEASE_STABLE",
         "swarming": {},
         "tast_expr": "(\"group:mainline\" && \"dep:lacros\" && !informational)",
         "test": "lacros_all_tast_tests",
@@ -1263,7 +1263,7 @@
         "args": [],
         "cros_board": "strongbad",
         "cros_img": "strongbad-release/R102-14658.0.0",
-        "name": "ozone_unittests_STRONGBAD_RELEASE_LKGM",
+        "name": "ozone_unittests STRONGBAD_RELEASE_LKGM",
         "swarming": {},
         "test": "ozone_unittests",
         "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
@@ -1273,7 +1273,7 @@
         "args": [],
         "cros_board": "strongbad",
         "cros_img": "strongbad-release/R101-14588.23.0",
-        "name": "ozone_unittests_strongbad_RELEASE_DEV",
+        "name": "ozone_unittests strongbad_RELEASE_DEV",
         "swarming": {},
         "test": "ozone_unittests",
         "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
@@ -1283,7 +1283,7 @@
         "args": [],
         "cros_board": "strongbad",
         "cros_img": "strongbad-release/R100-14526.28.0",
-        "name": "ozone_unittests_STRONGBAD_RELEASE_BETA",
+        "name": "ozone_unittests STRONGBAD_RELEASE_BETA",
         "swarming": {},
         "test": "ozone_unittests",
         "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
@@ -1293,7 +1293,7 @@
         "args": [],
         "cros_board": "strongbad",
         "cros_img": "strongbad-release/R99-14469.59.0",
-        "name": "ozone_unittests_STRONGBAD_RELEASE_STABLE",
+        "name": "ozone_unittests STRONGBAD_RELEASE_STABLE",
         "swarming": {},
         "test": "ozone_unittests",
         "test_id_prefix": "ninja://ui/ozone:ozone_unittests/",
@@ -1303,7 +1303,7 @@
         "args": [],
         "cros_board": "strongbad",
         "cros_img": "strongbad-release/R102-14658.0.0",
-        "name": "viz_unittests_STRONGBAD_RELEASE_LKGM",
+        "name": "viz_unittests STRONGBAD_RELEASE_LKGM",
         "swarming": {},
         "test": "viz_unittests",
         "test_id_prefix": "ninja://components/viz:viz_unittests/",
@@ -1313,7 +1313,7 @@
         "args": [],
         "cros_board": "strongbad",
         "cros_img": "strongbad-release/R101-14588.23.0",
-        "name": "viz_unittests_strongbad_RELEASE_DEV",
+        "name": "viz_unittests strongbad_RELEASE_DEV",
         "swarming": {},
         "test": "viz_unittests",
         "test_id_prefix": "ninja://components/viz:viz_unittests/",
@@ -1323,7 +1323,7 @@
         "args": [],
         "cros_board": "strongbad",
         "cros_img": "strongbad-release/R100-14526.28.0",
-        "name": "viz_unittests_STRONGBAD_RELEASE_BETA",
+        "name": "viz_unittests STRONGBAD_RELEASE_BETA",
         "swarming": {},
         "test": "viz_unittests",
         "test_id_prefix": "ninja://components/viz:viz_unittests/",
@@ -1333,7 +1333,7 @@
         "args": [],
         "cros_board": "strongbad",
         "cros_img": "strongbad-release/R99-14469.59.0",
-        "name": "viz_unittests_STRONGBAD_RELEASE_STABLE",
+        "name": "viz_unittests STRONGBAD_RELEASE_STABLE",
         "swarming": {},
         "test": "viz_unittests",
         "test_id_prefix": "ninja://components/viz:viz_unittests/",
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 4cd88cb6..e7a241e 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -148,13 +148,13 @@
       },
     },
   },
-  'aura_unittests_amd64-generic': {
+  'aura_unittests amd64-generic': {
     'remove_from': [
       # TODO(crbug.com/1204231): Re-enable.
       'lacros-amd64-generic-rel',
     ]
   },
-  'aura_unittests_eve': {
+  'aura_unittests eve': {
     'remove_from': [
       # TODO(crbug.com/1204231): Re-enable.
       'lacros-amd64-generic-rel',
@@ -2065,14 +2065,14 @@
       },
     },
   },
-  'interactive_ui_tests_amd64-generic': {
+  'interactive_ui_tests amd64-generic': {
     'remove_from': [
       # TODO(crbug.com/1204231): Re-enable.
       'lacros-amd64-generic-rel',
       'lacros-amd64-generic-rel-fyi',
     ]
   },
-  'interactive_ui_tests_eve': {
+  'interactive_ui_tests eve': {
     'remove_from': [
       # TODO(crbug.com/1204231): Re-enable.
       'lacros-amd64-generic-rel',
@@ -3216,11 +3216,6 @@
       },
     },
   },
-  'variations_smoke_tests': {
-    'remove_from': [
-      'mac-chrome', # https://crbug.com/1312393
-    ],
-  },
   'video_decode_accelerator_gl_unittest': {
     'remove_from': [
       # Windows Intel doesn't have the GL extensions to support this test.
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 54212dc..1737fbac 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -24,7 +24,7 @@
     'args': [
       '--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter',
     ],
-    'identifier': 'Lacros plus ToT ash',
+    'identifier': 'on ToT ash',
   },
   'LACROS_VERSION_SKEW_CANARY': {
     'args': [
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 538a9f0..e4c48b0 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -5574,6 +5574,20 @@
           'all'
         ],
       },
+      'Simple Chrome Builder reclient staging': {
+        # Copied from
+        # https://source.chromium.org/chromium/chromium/src/+/main:testing/buildbot/waterfalls.pyl;l=1567;drc=e8a03fce50115b247a6032f8ed922b6db62f11f6
+        'additional_compile_targets': [
+          'chromiumos_preflight',
+        ],
+      },
+      'Simple Chrome Builder reclient test': {
+        # Copied from
+        # https://source.chromium.org/chromium/chromium/src/+/main:testing/buildbot/waterfalls.pyl;l=1567;drc=e8a03fce50115b247a6032f8ed922b6db62f11f6
+        'additional_compile_targets': [
+          'chromiumos_preflight',
+        ],
+      },
     },
   },
   {
diff --git a/testing/scripts/run_finch_smoke_tests_android.py b/testing/scripts/run_finch_smoke_tests_android.py
index c3117110..7404317 100755
--- a/testing/scripts/run_finch_smoke_tests_android.py
+++ b/testing/scripts/run_finch_smoke_tests_android.py
@@ -88,6 +88,8 @@
     super(FinchTestCase, self).__init__()
     self._device = device
     self.parse_args()
+    self.output_directory = os.path.join(SRC_DIR, 'out', self.options.target)
+    self.mojo_js_directory = os.path.join(self.output_directory, 'gen')
     self.browser_package_name = apk_helper.GetPackageName(
         self.options.browser_apk)
     self.browser_activity_name = (self.options.browser_activity_name or
@@ -107,6 +109,10 @@
   def product_name(cls):
     raise NotImplementedError
 
+  @classmethod
+  def wpt_product_name(cls):
+    raise NotImplementedError
+
   @property
   def tests(self):
     return [
@@ -158,8 +164,23 @@
   @property
   def rest_args(self):
     rest_args = super(FinchTestCase, self).rest_args
+    # Update the output directory to the default if it's not set.
+    self.maybe_set_default_isolated_script_test_output()
 
+    # Here we add all of the arguments required to run WPT tests on Android.
     rest_args.extend([
+        os.path.join(SRC_DIR, 'third_party', 'wpt_tools', 'wpt', 'wpt')])
+
+    # By default, WPT will treat unexpected passes as errors, so we disable
+    # that to be consistent with Chromium CI.
+    rest_args.extend(['--no-fail-on-unexpected-pass'])
+
+    # vpython has packages needed by wpt, so force it to skip the setup
+    rest_args.extend(['--venv=' + SRC_DIR, '--skip-venv-setup'])
+
+    rest_args.extend(['run',
+      self.wpt_product_name(),
+      '--tests=' + wpt_common.TESTS_ROOT_DIR,
       '--device-serial',
       self._device.serial,
       '--webdriver-binary',
@@ -169,6 +190,11 @@
       '--package-name',
       self.browser_package_name,
       '--keep-app-data-directory',
+      '--no-pause-after-test',
+      '--no-capture-stdio',
+      '--no-manifest-download',
+      '--enable-mojojs',
+      '--mojojs-path=' + self.mojo_js_directory,
     ])
 
     for binary_arg in self.browser_command_line_args():
@@ -177,10 +203,18 @@
     for test in self.tests:
       rest_args.extend(['--include', test])
 
+    if self.options.verbose >= 3:
+      rest_args.extend(['--log-mach=-', '--log-mach-level=debug',
+                        '--log-mach-verbose'])
+
+    if self.options.verbose >= 4:
+      rest_args.extend(['--webdriver-arg=--verbose',
+                        '--webdriver-arg="--log-path=-"'])
+
     return rest_args
 
   @classmethod
-  def add_common_arguments(cls, parser):
+  def add_extra_arguments(cls, parser):
     parser.add_argument('--test-case',
                         choices=TEST_CASES.keys(),
                         # TODO(rmhasan): Remove default values after
@@ -208,6 +242,10 @@
     parser.add_argument('--browser-activity-name',
                         action='store',
                         help='Browser activity name')
+    parser.add_argument('--target',
+                        action='store',
+                        default='Release',
+                        help='Build configuration')
     parser.add_argument('--fake-variations-channel',
                         action='store',
                         default='stable',
@@ -215,10 +253,9 @@
                         help='Finch seed release channel')
 
     add_emulator_args(parser)
-
-  def add_extra_arguments(self, parser):
-    super(FinchTestCase, self).add_extra_arguments(parser)
-    self.add_common_arguments(parser)
+    script_common.AddDeviceArguments(parser)
+    script_common.AddEnvironmentArguments(parser)
+    logging_common.AddLoggingArguments(parser)
 
   @contextlib.contextmanager
   def _install_apks(self):
@@ -517,21 +554,13 @@
        for p in [ChromeFinchTestCase, WebViewFinchTestCase,
                  WebLayerFinchTestCase]})
 
-  # Unfortunately, there's a circular dependency between the parser made
-  # available from `FinchTestCase.add_extra_arguments` and the selection of the
-  # correct test case. The workaround is a second parser used in `main` only
-  # that shares some arguments with the script adapter parser. The second parser
-  # handles --help, so not all arguments are documented. Important arguments
-  # added by the script adapter are re-added here for visibility.
   parser = argparse.ArgumentParser()
-  FinchTestCase.add_common_arguments(parser)
+
+  FinchTestCase.add_extra_arguments(parser)
   parser.add_argument(
         '--isolated-script-test-output', type=str,
         required=False,
         help='path to write test results JSON object to')
-  script_common.AddDeviceArguments(parser)
-  script_common.AddEnvironmentArguments(parser)
-  logging_common.AddLoggingArguments(parser)
   options, _ = parser.parse_known_args(args)
 
   with get_device(options) as device, \
diff --git a/testing/scripts/run_variations_smoke_tests.py b/testing/scripts/run_variations_smoke_tests.py
index 4618f17..5d170af 100755
--- a/testing/scripts/run_variations_smoke_tests.py
+++ b/testing/scripts/run_variations_smoke_tests.py
@@ -255,7 +255,10 @@
     if not _confirm_new_seed_downloaded(user_data_dir, path_chromedriver,
                                         chrome_options):
       logging.error('Failed to fetch variations seed on initial run')
-      return 1
+      # For MacOS, there is sometime the test fail to download seed on initial
+      # run (crbug/1312393)
+      if _get_platform() != 'mac':
+        return 1
 
     # Inject the test seed.
     # This is a path as fallback when |seed_helper.load_test_seed_from_file()|
diff --git a/testing/scripts/run_wpt_tests.py b/testing/scripts/run_wpt_tests.py
index 5989c00..8980be4 100755
--- a/testing/scripts/run_wpt_tests.py
+++ b/testing/scripts/run_wpt_tests.py
@@ -44,6 +44,7 @@
     OUT_DIR, "Chromium.app", "Contents", "MacOS", "Chromium")
 CHROMEDRIVER_BINARY = os.path.join(OUT_DIR, "chromedriver")
 
+MOJO_JS_PATH = os.path.join(OUT_DIR, "gen")
 
 class WPTTestAdapter(wpt_common.BaseWptScriptAdapter):
 
@@ -51,6 +52,9 @@
     def rest_args(self):
         rest_args = super(WPTTestAdapter, self).rest_args
 
+        # Update the output directory to the default if it's not set.
+        self.maybe_set_default_isolated_script_test_output()
+
         chrome = CHROME_BINARY.format(self.options.target)
         chromedriver = CHROMEDRIVER_BINARY.format(self.options.target)
         if self.port.host.platform.is_win():
@@ -61,6 +65,12 @@
 
         # Here we add all of the arguments required to run WPT tests on Chrome.
         rest_args.extend([
+            self.wpt_binary,
+            "--venv=" + SRC_DIR,
+            "--skip-venv-setup",
+            "run",
+            "chrome"
+        ] + self.options.test_list + [
             "--binary=" + chrome,
             "--binary-arg=--host-resolver-rules="
                 "MAP nonexistent.*.test ~NOTFOUND, MAP *.test 127.0.0.1",
@@ -71,9 +81,15 @@
             "--webdriver-binary=" + chromedriver,
             "--webdriver-arg=--enable-chrome-logs",
             "--headless",
+            "--no-capture-stdio",
+            "--no-manifest-download",
+            "--no-pause-after-test",
             # Exclude webdriver tests for now. They are run separately on the CI
             "--exclude=webdriver",
             "--exclude=infrastructure/webdriver",
+            # By default, WPT will treat unexpected passes as errors, so we
+            # disable that to be consistent with Chromium CI.
+            "--no-fail-on-unexpected-pass",
             "--metadata", WPT_METADATA_OUTPUT_DIR.format(self.options.target),
             # By specifying metadata above, WPT will try to find manifest in the
             # metadata directory. So here we point it back to the correct path
@@ -85,38 +101,47 @@
             # update the manifest in cast it's stale.
             #"--no-manifest-update",
             "--manifest", WPT_WORKING_COPY_MANIFEST.format(self.options.target),
+            # (crbug.com/1023835) The flags below are temporary to aid debugging
+            "--log-mach=-",
+            "--log-mach-verbose",
             # See if multi-processing affects timeouts.
             # TODO(lpz): Consider removing --processes and compute automatically
             # from multiprocessing.cpu_count()
             "--processes=" + self.options.child_processes,
+            "--mojojs-path=" + MOJO_JS_PATH.format(self.options.target),
+            "--tests=" + wpt_common.TESTS_ROOT_DIR,
+            "--repeat=" + str(self.options.repeat),
         ])
 
-        tests = list(self.options.test_list)
         if self.options.test_filter:
-          tests.extend(self.options.test_filter.split(":"))
-        for test_prefix in tests:
-          rest_args.extend([
+          for pattern in self.options.test_filter.split(":"):
+            rest_args.extend([
               "--include",
-              self.path_finder.strip_wpt_path(test_prefix),
-          ])
+              wpt_common.strip_wpt_root_prefix(pattern),
+            ])
 
         return rest_args
 
     def add_extra_arguments(self, parser):
-        super(WPTTestAdapter, self).add_extra_arguments(parser)
+        target_help = "Specify the target build subdirectory under src/out/"
+        parser.add_argument("-t", "--target", dest="target", default="Release",
+                            help=target_help)
         child_processes_help = "Number of drivers to run in parallel"
         parser.add_argument("-j", "--child-processes", dest="child_processes",
                             default="1", help=child_processes_help)
+        parser.add_argument("--repeat", "--gtest_repeat", type=int, default=1,
+                            help="Number of times to run the tests")
         parser.add_argument("--test-filter", "--gtest_filter",
                             help="Colon-separated list of test names "
                                  "(URL prefixes)")
+        # TODO(crbug/1306222): wptrunner currently cannot rerun individual
+        # failed tests, so this flag is unused.
+        parser.add_argument("--test-launcher-retry-limit", type=int, default=0,
+                            help="Maximum number of times to rerun "
+                                 "a failed test")
         parser.add_argument("test_list", nargs="*",
                             help="List of tests or test directories to run")
 
-    @classmethod
-    def wpt_product_name(cls):
-        return 'chrome'
-
     def do_pre_test_run_tasks(self):
         # Copy the checked-in manifest to the temporary working directory
         shutil.copy(WPT_CHECKED_IN_MANIFEST,
diff --git a/testing/scripts/wpt_android_lib.py b/testing/scripts/wpt_android_lib.py
index 95bfedf..21c6df43 100644
--- a/testing/scripts/wpt_android_lib.py
+++ b/testing/scripts/wpt_android_lib.py
@@ -77,6 +77,16 @@
     # Arguments from add_extra_argumentsparse were added so
     # its safe to parse the arguments and set self._options
     self.parse_args()
+    self.output_directory = os.path.join(SRC_DIR, 'out', self.options.target)
+    self.mojo_js_directory = os.path.join(self.output_directory, 'gen')
+
+  def _wpt_report(self):
+    env = os.environ.copy()
+    if 'GTEST_SHARD_INDEX' in env:
+      shard_index = int(env['GTEST_SHARD_INDEX'])
+      return 'wpt_reports_%s_%02d.json' % (self.options.product, shard_index)
+    else:
+      return 'wpt_reports_%s.json' % self.options.product
 
   def get_version_provider_package_name(self):
     """Get the name of a package containing the product's version.
@@ -108,7 +118,23 @@
   def rest_args(self):
     rest_args = super(WPTAndroidAdapter, self).rest_args
 
-    rest_args.extend([
+    # Update the output directory to the default if it's not set.
+    self.maybe_set_default_isolated_script_test_output()
+
+    # Here we add all of the arguments required to run WPT tests on Android.
+    rest_args.extend([self.wpt_binary])
+
+    # By default, WPT will treat unexpected passes as errors, so we disable
+    # that to be consistent with Chromium CI.
+    rest_args.extend(['--no-fail-on-unexpected-pass'])
+    if self.options.default_exclude:
+      rest_args.extend(['--default-exclude'])
+
+    # vpython has packages needed by wpt, so force it to skip the setup
+    rest_args.extend(['--venv=' + SRC_DIR, '--skip-venv-setup'])
+
+    rest_args.extend(['run',
+      '--tests=' + wpt_common.TESTS_ROOT_DIR,
       '--webdriver-binary',
       self.options.webdriver_binary,
       '--symbols-path',
@@ -116,16 +142,22 @@
       '--stackwalk-binary',
       TOMBSTONE_PARSER,
       '--headless',
+      '--no-pause-after-test',
+      '--no-capture-stdio',
+      '--no-manifest-download',
       # Exclude webdriver tests for now.
       "--exclude=webdriver",
       "--exclude=infrastructure/webdriver",
       '--binary-arg=--enable-blink-features=MojoJS,MojoJSTest',
       '--binary-arg=--enable-blink-test-features',
       '--binary-arg=--disable-field-trial-config',
+      '--enable-mojojs',
+      '--mojojs-path=' + self.mojo_js_directory,
       '--binary-arg=--enable-features=DownloadService<DownloadServiceStudy',
       '--binary-arg=--force-fieldtrials=DownloadServiceStudy/Enabled',
       '--binary-arg=--force-fieldtrial-params=DownloadServiceStudy.Enabled:'
       'start_up_delay_ms/0',
+      '--repeat=' + str(self.options.repeat),
     ])
 
     for device in self._devices:
@@ -136,6 +168,21 @@
     if self._metadata_dir:
       rest_args.extend(['--metadata', self._metadata_dir])
 
+    if self.options.verbose >= 3:
+      rest_args.extend(['--log-mach=-', '--log-mach-level=debug',
+                        '--log-mach-verbose'])
+
+    if self.options.verbose >= 4:
+      rest_args.extend(['--webdriver-arg=--verbose',
+                        '--webdriver-arg="--log-path=-"'])
+
+    if self.options.log_wptreport:
+      wpt_output = self.options.isolated_script_test_output
+      self.wptreport = os.path.join(os.path.dirname(wpt_output),
+                                    self._wpt_report())
+      rest_args.extend(['--log-wptreport',
+                        self.wptreport])
+
     version = self.get_version()
     if version:
       rest_args.extend(['--browser-version', version])
@@ -144,7 +191,7 @@
       for pattern in self.options.test_filter.split(':'):
         rest_args.extend([
           '--include',
-          self.path_finder.strip_wpt_path(pattern),
+          wpt_common.strip_wpt_root_prefix(pattern),
         ])
 
     rest_args.extend(self.pass_through_wpt_args)
@@ -203,8 +250,6 @@
     self._metadata_dir = None
 
   def add_extra_arguments(self, parser):
-    super(WPTAndroidAdapter, self).add_extra_arguments(parser)
-
     # TODO: |pass_through_args| are broke and need to be supplied by way of
     # --binary-arg".
     class BinaryPassThroughArgs(PassThroughArgs):
@@ -214,6 +259,9 @@
 
     # Add this so that product argument does not go in self._rest_args
     # when self.parse_args() is called
+    parser.add_argument('--target', '-t', default='Release',
+                        help='Specify the target build subdirectory under'
+                        ' src/out/.')
     parser.add_argument('--product', help=argparse.SUPPRESS)
     parser.add_argument('--webdriver-binary', required=True,
                         help='Path of the webdriver binary.  It needs to have'
@@ -227,20 +275,35 @@
     parser.add_argument('--ignore-browser-specific-expectations',
                         action='store_true', default=False,
                         help='Ignore browser specific expectation files.')
+    parser.add_argument('--verbose', '-v', action='count', default=0,
+                        help='Verbosity level.')
+    parser.add_argument('--repeat', '--gtest_repeat', type=int, default=1,
+                        help='Number of times to run the tests.')
     parser.add_argument('--test-filter', '--gtest_filter',
                         help='Colon-separated list of test names '
                              '(URL prefixes)')
+    # TODO(crbug/1306222): wptrunner currently cannot rerun individual failed
+    # tests, so this flag is unused.
+    parser.add_argument('--test-launcher-retry-limit', type=int, default=0,
+                        help='Maximum number of times to rerun a failed test')
     parser.add_argument('--include', metavar='TEST_OR_DIR',
                         action=WPTPassThroughArgs,
                         help='Test(s) to run, defaults to run all tests.')
     parser.add_argument('--include-file',
                         action=WPTPassThroughArgs,
                         help='A file listing test(s) to run')
+    parser.add_argument('--default-exclude', action='store_true', default=False,
+                        help="Only run the tests explicitly given in arguments."
+                             "No tests will run if the list is empty, and the "
+                             "program will exit with status code 0.")
     parser.add_argument('--list-tests', action=WPTPassThroughArgs, nargs=0,
                         help="Don't run any tests, just print out a list of"
                         ' tests that would be run.')
     parser.add_argument('--webdriver-arg', action=WPTPassThroughArgs,
                         help='WebDriver args.')
+    parser.add_argument('--log-wptreport',
+                        action='store_true', default=False,
+                        help="Generates a test report in JSON format.")
     parser.add_argument('--log-raw', metavar='RAW_REPORT_FILE',
                         action=WPTPassThroughArgs,
                         help="Log raw report.")
@@ -307,12 +370,9 @@
     args = super(WPTWeblayerAdapter, self).rest_args
     args.append('--test-type=testharness')
     args.extend(['--package-name', self.WEBLAYER_SHELL_PKG])
+    args.append(ANDROID_WEBLAYER)
     return args
 
-  @classmethod
-  def wpt_product_name(cls):
-    return ANDROID_WEBLAYER
-
 
 class WPTWebviewAdapter(WPTAndroidAdapter):
 
@@ -370,12 +430,9 @@
   def rest_args(self):
     args = super(WPTWebviewAdapter, self).rest_args
     args.extend(['--package-name', self.system_webview_shell_pkg])
+    args.append(ANDROID_WEBVIEW)
     return args
 
-  @classmethod
-  def wpt_product_name(cls):
-    return ANDROID_WEBVIEW
-
 
 class WPTClankAdapter(WPTAndroidAdapter):
 
@@ -411,12 +468,10 @@
       logger.info("Using Chrome apk's default package %s." %
                   self.options.chrome_package_name)
     args.extend(['--package-name', self.options.chrome_package_name])
+    # add the product postional argument
+    args.append(CHROME_ANDROID)
     return args
 
-  @classmethod
-  def wpt_product_name(cls):
-    return CHROME_ANDROID
-
 
 def add_emulator_args(parser):
   parser.add_argument(
diff --git a/testing/scripts/wpt_common.py b/testing/scripts/wpt_common.py
index 02905466..20f2be0 100644
--- a/testing/scripts/wpt_common.py
+++ b/testing/scripts/wpt_common.py
@@ -15,6 +15,8 @@
 TYP_DIR = os.path.join(CATAPULT_DIR, 'third_party', 'typ')
 WEB_TESTS_DIR = os.path.normpath(
     os.path.join(BLINK_TOOLS_DIR, os.pardir, 'web_tests'))
+_WPT_ROOT_FRAGMENT = posixpath.join('external', 'wpt', '')
+TESTS_ROOT_DIR = os.path.join(WEB_TESTS_DIR, 'external', 'wpt')
 
 if BLINK_TOOLS_DIR not in sys.path:
     sys.path.append(BLINK_TOOLS_DIR)
@@ -23,7 +25,23 @@
     sys.path.append(TYP_DIR)
 
 from blinkpy.common.host import Host
-from blinkpy.common.path_finder import PathFinder
+
+
+def strip_wpt_root_prefix(path):
+    """Remove a redundant prefix from a WPT path.
+
+    ResultDB identifies WPTs as web tests with the prefix "external/wpt", but
+    wptrunner expects paths relative to the WPT root, which already ends in
+    "external/wpt". This function transforms a general web test path into a
+    WPT path.
+
+    WPT paths are always POSIX-style.
+    """
+    if path.startswith(_WPT_ROOT_FRAGMENT):
+        return posixpath.relpath(path, _WPT_ROOT_FRAGMENT)
+    # Path is absolute or does not start with the prefix.
+    # Assume the path already points to a valid WPT and pass through.
+    return path
 
 
 class BaseWptScriptAdapter(common.BaseIsolatedScriptArgsAdapter):
@@ -37,7 +55,6 @@
         if not host:
             host = Host()
         self.fs = host.filesystem
-        self.path_finder = PathFinder(self.fs)
         self.port = host.port_factory.get()
         # Path to the output of the test run. Comes from the args passed to the
         # run, parsed after this constructor. Can be overwritten by tests.
@@ -46,63 +63,7 @@
         self.layout_test_results_subdir = 'layout-test-results'
         default_wpt_binary = os.path.join(
             common.SRC_DIR, "third_party", "wpt_tools", "wpt", "wpt")
-        self.wpt_binary = os.environ.get("WPT_BINARY", default_wpt_binary)
-
-    @property
-    def wpt_root_dir(self):
-        return self.path_finder.path_from_web_tests(
-            self.path_finder.wpt_prefix())
-
-    @property
-    def output_directory(self):
-        return self.path_finder.path_from_chromium_base('out',
-                                                        self.options.target)
-
-    @property
-    def mojo_js_directory(self):
-        return self.fs.join(self.output_directory, 'gen')
-
-    def add_extra_arguments(self, parser):
-        parser.add_argument(
-            '-t',
-            '--target',
-            default='Release',
-            help='target build subdirectory under //src/out')
-        parser.add_argument(
-            '--repeat',
-            '--gtest_repeat',
-            type=int,
-            default=1,
-            help='number of times to run the tests')
-        # TODO(crbug/1306222): wptrunner currently cannot rerun individual
-        # failed tests, so this flag is accepted but not used.
-        parser.add_argument(
-            '--test-launcher-retry-limit',
-            metavar='LIMIT',
-            type=int,
-            default=0,
-            help='maximum number of times to rerun a failed test')
-        parser.add_argument(
-            '--default-exclude',
-            action='store_true',
-            help=('only run the tests explicitly given in arguments '
-                  '(can run no tests, which will exit with code 0)'))
-        parser.add_argument(
-            '--log-wptreport',
-            nargs='?',
-            const=self._default_wpt_report(),
-            help=('log a wptreport in JSON to the output directory'
-                  ' (default filename: %(const)s)'))
-        parser.add_argument(
-            '--dry-run',
-            action='store_true',
-            help='do not upload results to ResultDB')
-        parser.add_argument(
-            '-v',
-            '--verbose',
-            action='count',
-            default=0,
-            help='increase verbosity')
+        self.wpt_binary = os.environ.get("WPT_BINARY") or default_wpt_binary
 
     def maybe_set_default_isolated_script_test_output(self):
         if self.options.isolated_script_test_output:
@@ -126,60 +87,6 @@
                 # tests across many shards.
                 '--chunk-type=hash']
 
-    def parse_args(self, args=None):
-        super(BaseWptScriptAdapter, self).parse_args(args)
-        # Update the output directory to the default if it's not set.
-        # We cannot provide a CLI arg default because the path depends on
-        # --target.
-        self.maybe_set_default_isolated_script_test_output()
-        if self.options.log_wptreport:
-            wpt_output = self.options.isolated_script_test_output
-            self.wptreport = self.fs.join(
-                self.fs.dirname(wpt_output),
-                self.options.log_wptreport)
-
-    @property
-    def rest_args(self):
-        rest_args = super(BaseWptScriptAdapter, self).rest_args
-
-        rest_args.extend([
-            self.wpt_binary,
-            # By default, wpt will treat unexpected passes as errors, so we
-            # disable that to be consistent with Chromium CI.
-            '--no-fail-on-unexpected-pass',
-            # Use virtualenv packages installed by vpython, not wpt.
-            '--venv=%s' % self.path_finder.chromium_base(),
-            '--skip-venv-setup',
-            'run',
-            self.wpt_product_name(),
-            '--no-pause-after-test',
-            '--no-capture-stdio',
-            '--no-manifest-download',
-            '--tests=%s' % self.wpt_root_dir,
-            '--mojojs-path=%s' % self.mojo_js_directory,
-            '--repeat=%d' % self.options.repeat,
-        ])
-
-        if self.options.default_exclude:
-            rest_args.extend(['--default-exclude'])
-
-        if self.wptreport:
-            rest_args.extend(['--log-wptreport', self.wptreport])
-
-        if self.options.verbose >= 3:
-            rest_args.extend([
-                '--log-mach=-',
-                '--log-mach-level=debug',
-                '--log-mach-verbose',
-            ])
-        if self.options.verbose >= 4:
-            rest_args.extend([
-                '--webdriver-arg=--verbose',
-                '--webdriver-arg="--log-path=-"',
-            ])
-
-        return rest_args
-
     def do_post_test_run_tasks(self):
         if not self.wpt_output and self.options:
             self.wpt_output = self.options.isolated_script_test_output
@@ -196,19 +103,6 @@
             '--wpt-results',
             self.wpt_output,
         ]
-        if self.options.dry_run:
-            command.extend(['--dry-run'])
         if self.wptreport:
             command.extend(['--wpt-report', self.wptreport])
         common.run_command(command)
-
-    @classmethod
-    def wpt_product_name(cls):
-        raise NotImplementedError
-
-    def _default_wpt_report(self):
-        product = self.wpt_product_name()
-        shard_index = os.environ.get('GTEST_SHARD_INDEX')
-        if shard_index is not None:
-            return 'wpt_reports_%s_%02d.json' % (product, int(shard_index))
-        return 'wpt_reports_%s.json' % product
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 4587f6a..247b973 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -699,28 +699,6 @@
             ]
         }
     ],
-    "AutofillDisplaceRemovedForms": [
-        {
-            "platforms": [
-                "android",
-                "android_webview",
-                "chromeos",
-                "chromeos_lacros",
-                "ios",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "AutofillDisplaceRemovedForms"
-                    ]
-                }
-            ]
-        }
-    ],
     "AutofillEnableAugmentedPhoneCountryCode": [
         {
             "platforms": [
@@ -6272,6 +6250,25 @@
             ]
         }
     ],
+    "ScrollUnification": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "ScrollUnification"
+                    ]
+                }
+            ]
+        }
+    ],
     "SendTabToSelfV2": [
         {
             "platforms": [
@@ -8018,9 +8015,9 @@
                 "chromeos",
                 "chromeos_lacros",
                 "linux",
-                "ios",
                 "android",
-                "android_weblayer"
+                "android_weblayer",
+                "android_webview"
             ],
             "experiments": [
                 {
diff --git a/third_party/blink/renderer/bindings/core/v8/callback_invoke_helper.cc b/third_party/blink/renderer/bindings/core/v8/callback_invoke_helper.cc
index 4c85825a..eb3c94f 100644
--- a/third_party/blink/renderer/bindings/core/v8/callback_invoke_helper.cc
+++ b/third_party/blink/renderer/bindings/core/v8/callback_invoke_helper.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/bindings/core/v8/callback_invoke_helper.h"
 
+#include "third_party/blink/renderer/bindings/core/v8/v8_script_runner.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/platform/bindings/callback_function_base.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/custom/v8_custom_xpath_ns_resolver.cc b/third_party/blink/renderer/bindings/core/v8/custom/v8_custom_xpath_ns_resolver.cc
index d185271c..0eddd1a 100644
--- a/third_party/blink/renderer/bindings/core/v8/custom/v8_custom_xpath_ns_resolver.cc
+++ b/third_party/blink/renderer/bindings/core/v8/custom/v8_custom_xpath_ns_resolver.cc
@@ -31,11 +31,14 @@
 
 #include "third_party/blink/renderer/bindings/core/v8/script_controller.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_script_runner.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_string_resource.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/frame/frame_console.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
+#include "third_party/blink/renderer/platform/bindings/v8_binding_macros.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
diff --git a/third_party/blink/renderer/bindings/core/v8/custom/v8_dev_tools_host_custom.cc b/third_party/blink/renderer/bindings/core/v8/custom/v8_dev_tools_host_custom.cc
index 6b5772d..1b58cf4 100644
--- a/third_party/blink/renderer/bindings/core/v8/custom/v8_dev_tools_host_custom.cc
+++ b/third_party/blink/renderer/bindings/core/v8/custom/v8_dev_tools_host_custom.cc
@@ -37,12 +37,14 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_html_document.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_mouse_event.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_string_resource.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_window.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/html/html_document.h"
 #include "third_party/blink/renderer/core/inspector/dev_tools_host.h"
 #include "third_party/blink/renderer/core/inspector/inspector_frontend_client.h"
+#include "third_party/blink/renderer/platform/bindings/v8_binding_macros.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/bindings/core/v8/custom/v8_html_all_collection_custom.cc b/third_party/blink/renderer/bindings/core/v8/custom/v8_html_all_collection_custom.cc
index 9de28f0..9215acb 100644
--- a/third_party/blink/renderer/bindings/core/v8/custom/v8_html_all_collection_custom.cc
+++ b/third_party/blink/renderer/bindings/core/v8/custom/v8_html_all_collection_custom.cc
@@ -31,8 +31,10 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_html_all_collection.h"
 
 #include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_string_resource.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_union_element_htmlcollection.h"
 #include "third_party/blink/renderer/core/html/html_all_collection.h"
+#include "third_party/blink/renderer/platform/bindings/v8_binding_macros.h"
 #include "third_party/blink/renderer/platform/bindings/v8_set_return_value.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/bindings/core/v8/dictionary_helper_for_core.cc b/third_party/blink/renderer/bindings/core/v8/dictionary_helper_for_core.cc
index a7698554..bf9b96d 100644
--- a/third_party/blink/renderer/bindings/core/v8/dictionary_helper_for_core.cc
+++ b/third_party/blink/renderer/bindings/core/v8/dictionary_helper_for_core.cc
@@ -30,12 +30,14 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_element.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_message_port.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_string_resource.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_text_track.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_window.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/html/track/text_track.h"
 #include "third_party/blink/renderer/core/html/track/track_base.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
+#include "third_party/blink/renderer/platform/bindings/v8_binding_macros.h"
 #include "third_party/blink/renderer/platform/wtf/math_extras.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/bindings/core/v8/script_iterator.cc b/third_party/blink/renderer/bindings/core/v8/script_iterator.cc
index 18648cb9..e77194a 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_iterator.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_iterator.cc
@@ -6,6 +6,7 @@
 
 #include "third_party/blink/renderer/bindings/core/v8/script_controller.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_script_runner.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_string_resource.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.cc b/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.cc
index be9a6d4..ee3bd61 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.cc
@@ -39,6 +39,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_event_target.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_html_link_element.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_object_builder.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_script_runner.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_window.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_worker_global_scope.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_worklet_global_scope.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h b/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h
index 167ae1ce..2804a51 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h
+++ b/third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h
@@ -36,10 +36,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/native_value_traits.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/bindings/core/v8/to_v8_for_core.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_script_runner.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_string_resource.h"
 #include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/core/dom/node.h"
 #include "third_party/blink/renderer/core/typed_arrays/array_buffer_view_helpers.h"
 #include "third_party/blink/renderer/platform/bindings/dom_data_store.h"
 #include "third_party/blink/renderer/platform/bindings/dom_wrapper_world.h"
@@ -47,9 +44,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/bindings/v8_binding.h"
-#include "third_party/blink/renderer/platform/bindings/v8_binding_macros.h"
 #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
-#include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
 #include "third_party/blink/renderer/platform/bindings/v8_value_cache.h"
 #include "third_party/blink/renderer/platform/heap/heap_traits.h"
 #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
diff --git a/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h b/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h
index 800862727..9c2f265 100644
--- a/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h
+++ b/third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h
@@ -39,6 +39,7 @@
 
 namespace blink {
 
+class KURL;
 class WorkerOrWorkletGlobalScope;
 
 class CORE_EXPORT WorkerOrWorkletScriptController final
diff --git a/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules.cc b/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules.cc
index 820bf3ca..361a039 100644
--- a/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules.cc
+++ b/third_party/blink/renderer/bindings/modules/v8/v8_binding_for_modules.cc
@@ -34,6 +34,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_blob.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_dom_string_list.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_file.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_string_resource.h"
 #include "third_party/blink/renderer/bindings/modules/v8/to_v8_for_modules.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_idb_cursor.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_idb_cursor_with_value.h"
diff --git a/third_party/blink/renderer/core/css/font_face_set.h b/third_party/blink/renderer/core/css/font_face_set.h
index ea4e2c0..6a335431 100644
--- a/third_party/blink/renderer/core/css/font_face_set.h
+++ b/third_party/blink/renderer/core/css/font_face_set.h
@@ -23,6 +23,7 @@
 
 namespace blink {
 
+class Font;
 class FontFaceCache;
 
 using FontFaceSetIterable = SetlikeIterable<Member<FontFace>, FontFace>;
diff --git a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
index be84aa2..836fd27 100644
--- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -576,10 +576,7 @@
       style.SetIsFlexOrGridItem();
   }
 
-  if (style.Display() == EDisplay::kBlock && !style.IsFloating())
-    return;
-
-  if (style.Display() == EDisplay::kContents)
+  if (style.Display() == EDisplay::kBlock)
     return;
 
   // FIXME: Don't support this mutation for pseudo styles like first-letter or
@@ -603,21 +600,6 @@
     style.SetTextOrientation(layout_parent_style.GetTextOrientation());
     style.UpdateFontOrientation();
   }
-
-  if (layout_parent_style.IsDisplayFlexibleOrGridBox()) {
-    // We want to count vertical percentage paddings/margins on flex items
-    // because our current behavior is different from the spec and we want to
-    // gather compatibility data.
-    if (style.PaddingBefore().IsPercentOrCalc() ||
-        style.PaddingAfter().IsPercentOrCalc()) {
-      UseCounter::Count(document,
-                        WebFeature::kFlexboxPercentagePaddingVertical);
-    }
-    if (style.MarginBefore().IsPercentOrCalc() ||
-        style.MarginAfter().IsPercentOrCalc()) {
-      UseCounter::Count(document, WebFeature::kFlexboxPercentageMarginVertical);
-    }
-  }
 }
 
 bool StyleAdjuster::IsEditableElement(Element* element,
diff --git a/third_party/blink/renderer/core/events/error_event.cc b/third_party/blink/renderer/core/events/error_event.cc
index 1cfb07f..9ad5431a 100644
--- a/third_party/blink/renderer/core/events/error_event.cc
+++ b/third_party/blink/renderer/core/events/error_event.cc
@@ -33,6 +33,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_error_event_init.h"
 #include "third_party/blink/renderer/core/event_interface_names.h"
+#include "third_party/blink/renderer/core/event_type_names.h"
 #include "v8/include/v8.h"
 
 namespace blink {
diff --git a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
index 078a9400..fab974e7 100644
--- a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
@@ -589,7 +589,7 @@
                         WebFeature::kPopupDoesNotExceedOwnerWindowBounds);
     } else {
       WebFeature feature =
-          document.GetFrame()->IsMainFrame()
+          document.GetFrame()->IsOutermostMainFrame()
               ? WebFeature::kPopupExceedsOwnerWindowBounds
               : WebFeature::kPopupExceedsOwnerWindowBoundsForIframe;
       UseCounter::Count(document, feature);
diff --git a/third_party/blink/renderer/core/html/html_embed_element.cc b/third_party/blink/renderer/core/html/html_embed_element.cc
index 5aed23d..bf786a3 100644
--- a/third_party/blink/renderer/core/html/html_embed_element.cc
+++ b/third_party/blink/renderer/core/html/html_embed_element.cc
@@ -79,15 +79,10 @@
     const AtomicString& value,
     MutableCSSPropertyValueSet* style) {
   if (name == html_names::kHiddenAttr) {
-    if (EqualIgnoringASCIICase(value, "yes") ||
-        EqualIgnoringASCIICase(value, "true")) {
-      AddPropertyToPresentationAttributeStyle(
-          style, CSSPropertyID::kWidth, 0,
-          CSSPrimitiveValue::UnitType::kPixels);
-      AddPropertyToPresentationAttributeStyle(
-          style, CSSPropertyID::kHeight, 0,
-          CSSPrimitiveValue::UnitType::kPixels);
-    }
+    AddPropertyToPresentationAttributeStyle(
+        style, CSSPropertyID::kWidth, 0, CSSPrimitiveValue::UnitType::kPixels);
+    AddPropertyToPresentationAttributeStyle(
+        style, CSSPropertyID::kHeight, 0, CSSPrimitiveValue::UnitType::kPixels);
   } else {
     HTMLPlugInElement::CollectStyleForPresentationAttribute(name, value, style);
   }
diff --git a/third_party/blink/renderer/core/layout/layout_embedded_content.cc b/third_party/blink/renderer/core/layout/layout_embedded_content.cc
index 1e3b81b..00c6cee 100644
--- a/third_party/blink/renderer/core/layout/layout_embedded_content.cc
+++ b/third_party/blink/renderer/core/layout/layout_embedded_content.cc
@@ -285,7 +285,12 @@
 PhysicalRect LayoutEmbeddedContent::ReplacedContentRect() const {
   NOT_DESTROYED();
   PhysicalRect content_rect = PhysicalContentBoxRect();
+
   // IFrames set as the root scroller should get their size from their parent.
+  // When scrolling starts so as to hide the URL bar, IFRAME wouldn't resize to
+  // match the now expanded size of the viewport until the scrolling stops. This
+  // makes sure the |ReplacedContentRect| matches the expanded viewport even
+  // before IFRAME resizes, for clipping to work correctly.
   if (ChildFrameView() && View() && IsEffectiveRootScroller()) {
     content_rect.offset = PhysicalOffset();
     content_rect.size = View()->ViewRect().size;
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc
index dbf39c7..2cbe51f 100644
--- a/third_party/blink/renderer/core/layout/layout_inline.cc
+++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -43,6 +43,7 @@
 #include "third_party/blink/renderer/core/layout/ng/layout_ng_block_flow.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_outline_utils.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h"
+#include "third_party/blink/renderer/core/layout/text_autosizer.h"
 #include "third_party/blink/renderer/core/page/page.h"
 #include "third_party/blink/renderer/core/paint/box_painter.h"
 #include "third_party/blink/renderer/core/paint/inline_painter.h"
@@ -117,6 +118,9 @@
     SetContinuation(nullptr);
   }
 
+  if (TextAutosizer* text_autosizer = GetDocument().GetTextAutosizer())
+    text_autosizer->Destroy(this);
+
   if (!DocumentBeingDestroyed()) {
     if (FirstLineBox()) {
       // If line boxes are contained inside a root, that means we're an inline.
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
index dc5430f..320896a4 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -543,11 +543,14 @@
   // - A child changed scrollbars causing our size to change (shrink-to-fit).
   //
   // Skip this part if side-effects aren't allowed, though. Calling
-  // ClearLayoutResults() when in this state is forbidden.
+  // ClearLayoutResults() when in this state is forbidden. Also skip it if we
+  // are resuming layout after a fragmentainer break. Changing the intrinsic
+  // inline-size halfway through layout of a node doesn't make sense.
   NGBoxStrut scrollbars_after = ComputeScrollbars(constraint_space, *this);
   if ((scrollbars_before != scrollbars_after ||
        inline_size_before != fragment_geometry->border_box_size.inline_size) &&
-      !NGDisableSideEffectsScope::IsDisabled()) {
+      !NGDisableSideEffectsScope::IsDisabled() &&
+      !IsResumingLayout(break_token)) {
     bool freeze_horizontal = false, freeze_vertical = false;
     // If we're in a measure pass, freeze both scrollbars right away, to avoid
     // quadratic time complexity for deeply nested flexboxes.
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_container.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_container.cc
index 5a2b781c..f1e763b 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_container.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_container.cc
@@ -180,7 +180,7 @@
   if (is_invalidating_)
     return;
   LocalSVGResource* resource = ResourceForContainer(*this);
-  if (!resource)
+  if (!resource || resource->Target() != GetElement())
     return;
   // Remove modes for which invalidations have already been
   // performed. If no modes remain we are done.
diff --git a/third_party/blink/renderer/core/layout/svg/transformed_hit_test_location.cc b/third_party/blink/renderer/core/layout/svg/transformed_hit_test_location.cc
index 86bf790..a8369d4 100644
--- a/third_party/blink/renderer/core/layout/svg/transformed_hit_test_location.cc
+++ b/third_party/blink/renderer/core/layout/svg/transformed_hit_test_location.cc
@@ -24,12 +24,17 @@
     storage.emplace(transformed_point,
                     inverse.MapQuad(location.TransformedRect()));
   } else {
-    // Specify |bounding_box| argument even if |location| is not rect-based.
-    // Without it, HitTestLocation would have 1x1 bounding box, and it would
-    // be mapped to NxN screen pixels if scaling factor is N.
-    storage.emplace(transformed_point,
-                    PhysicalRect::EnclosingRect(
-                        inverse.MapRect(gfx::RectF(location.BoundingBox()))));
+    gfx::RectF mapped_rect =
+        inverse.MapRect(gfx::RectF(location.BoundingBox()));
+    if (mapped_rect.width() < 1 || mapped_rect.height() < 1) {
+      // Specify |bounding_box| argument even if |location| is not rect-based.
+      // Without it, HitTestLocation would have 1x1 bounding box, and it would
+      // be mapped to NxN screen pixels if scaling factor is N.
+      storage.emplace(transformed_point,
+                      PhysicalRect::EnclosingRect(mapped_rect));
+    } else {
+      storage.emplace(transformed_point);
+    }
   }
   return &*storage;
 }
diff --git a/third_party/blink/renderer/core/layout/text_autosizer.cc b/third_party/blink/renderer/core/layout/text_autosizer.cc
index 930368c4..ccfaff0e 100644
--- a/third_party/blink/renderer/core/layout/text_autosizer.cc
+++ b/third_party/blink/renderer/core/layout/text_autosizer.cc
@@ -297,15 +297,23 @@
     MarkSuperclusterForConsistencyCheck(parent);
 }
 
-void TextAutosizer::Destroy(LayoutBlock* block) {
+void TextAutosizer::Destroy(LayoutObject* layout_object) {
   if (!page_info_.setting_enabled_ && !fingerprint_mapper_.HasFingerprints())
     return;
 
 #if DCHECK_IS_ON()
-  DCHECK(!blocks_that_have_begun_layout_.Contains(block));
+  if (layout_object->IsLayoutBlock()) {
+    DCHECK(!blocks_that_have_begun_layout_.Contains(
+        To<LayoutBlock>(layout_object)));
+  }
 #endif
 
-  if (fingerprint_mapper_.Remove(block) && first_block_to_begin_layout_) {
+  bool result = fingerprint_mapper_.Remove(layout_object);
+
+  if (layout_object->IsLayoutBlock())
+    return;
+
+  if (result && first_block_to_begin_layout_) {
     // LayoutBlock with a fingerprint was destroyed during layout.
     // Clear the cluster stack and the supercluster map to avoid stale pointers.
     // Speculative fix for http://crbug.com/369485.
diff --git a/third_party/blink/renderer/core/layout/text_autosizer.h b/third_party/blink/renderer/core/layout/text_autosizer.h
index 320c273..85d5be7 100644
--- a/third_party/blink/renderer/core/layout/text_autosizer.h
+++ b/third_party/blink/renderer/core/layout/text_autosizer.h
@@ -95,7 +95,7 @@
   void UpdatePageInfo();
   void Record(LayoutBlock*);
   void Record(LayoutText*);
-  void Destroy(LayoutBlock*);
+  void Destroy(LayoutObject*);
 
   bool PageNeedsAutosizing() const;
 
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index 86852fd..3027de7 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -2356,9 +2356,7 @@
   RecordConsoleMessagesForCommit();
 
   // Clear the user activation state.
-  // TODO(crbug.com/736415): Clear this bit unconditionally for all frames.
-  if (frame_->IsMainFrame())
-    frame_->ClearUserActivation();
+  frame_->ClearUserActivation();
 
   // The DocumentLoader was flagged as activated if it needs to notify the frame
   // that it was activated before navigation. Update the frame state based on
diff --git a/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc b/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc
index d6176b5..24aab71 100644
--- a/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc
+++ b/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc
@@ -366,7 +366,7 @@
   EXPECT_EQ(1u, events.size());
   EXPECT_EQ("loading", events[0]->category);
 
-  EXPECT_TRUE(events[0]->HasArg("frame"));
+  EXPECT_TRUE(events[0]->HasStringArg("frame"));
 
   ASSERT_TRUE(events[0]->HasDictArg("data"));
   base::Value::Dict arg_dict = events[0]->GetKnownArgAsDict("data");
@@ -415,7 +415,7 @@
   EXPECT_EQ(1u, events.size());
   EXPECT_EQ("loading", events[0]->category);
 
-  EXPECT_TRUE(events[0]->HasArg("frame"));
+  EXPECT_TRUE(events[0]->HasStringArg("frame"));
 
   ASSERT_TRUE(events[0]->HasDictArg("data"));
   base::Value::Dict arg_dict = events[0]->GetKnownArgAsDict("data");
@@ -459,7 +459,7 @@
   EXPECT_EQ(1u, events.size());
 
   EXPECT_EQ("loading", events[0]->category);
-  EXPECT_TRUE(events[0]->HasArg("frame"));
+  EXPECT_TRUE(events[0]->HasStringArg("frame"));
   ASSERT_TRUE(events[0]->HasDictArg("data"));
   base::Value::Dict arg_dict = events[0]->GetKnownArgAsDict("data");
   EXPECT_EQ(arg_dict.FindInt("candidateIndex").value_or(-1), 1);
diff --git a/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc b/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc
index 462589d..106fbb4 100644
--- a/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc
+++ b/third_party/blink/renderer/core/paint/text_paint_timing_detector_test.cc
@@ -295,7 +295,7 @@
   EXPECT_EQ(1u, events.size());
   EXPECT_EQ("loading", events[0]->category);
 
-  EXPECT_TRUE(events[0]->HasArg("frame"));
+  EXPECT_TRUE(events[0]->HasStringArg("frame"));
 
   ASSERT_TRUE(events[0]->HasDictArg("data"));
   base::Value::Dict arg_dict = events[0]->GetKnownArgAsDict("data");
@@ -343,7 +343,7 @@
   EXPECT_EQ(1u, events.size());
   EXPECT_EQ("loading", events[0]->category);
 
-  EXPECT_TRUE(events[0]->HasArg("frame"));
+  EXPECT_TRUE(events[0]->HasStringArg("frame"));
 
   ASSERT_TRUE(events[0]->HasDictArg("data"));
   base::Value::Dict arg_dict = events[0]->GetKnownArgAsDict("data");
diff --git a/third_party/blink/renderer/core/probe/core_probes.pidl b/third_party/blink/renderer/core/probe/core_probes.pidl
index ffcb92f..00c3a26 100644
--- a/third_party/blink/renderer/core/probe/core_probes.pidl
+++ b/third_party/blink/renderer/core/probe/core_probes.pidl
@@ -53,6 +53,7 @@
 
 interface CoreProbes {
 
+  class ClassicScript;
   class ConsoleMessage;
   class FontCustomPlatformData;
   class FontFace;
diff --git a/third_party/blink/renderer/core/style/computed_style_diff_functions.json5 b/third_party/blink/renderer/core/style/computed_style_diff_functions.json5
index c194866..2e56a9b 100644
--- a/third_party/blink/renderer/core/style/computed_style_diff_functions.json5
+++ b/third_party/blink/renderer/core/style/computed_style_diff_functions.json5
@@ -100,7 +100,7 @@
                 "BaselineShiftType", "baseline-shift", "dominant-baseline",
                 "CssDominantBaseline", "text-anchor",
                 "stroke-width", "stroke-miterlimit", "stroke-linecap", "stroke-linejoin",
-                "marker-end", "marker-mid", "marker-start", "scrollbar-width"],
+                "marker-end", "marker-mid", "marker-start", "scrollbar-width", "object-view-box"],
         methods_to_diff: [
           {
             method: "BorderLeftWidth()",
@@ -249,7 +249,7 @@
         fields_to_diff: ["-webkit-user-modify", "user-select", "image-rendering",
                 "column-rule-style", "column-rule-width", "column-rule-color",
                 "-internal-visited-column-rule-color",
-                "-webkit-user-drag", "object-fit", "object-fit", "object-position", "object-view-box",
+                "-webkit-user-drag", "object-fit", "object-fit", "object-position",
                 "mix-blend-mode", "isolation", "Mask", "MaskBoxImage", "mask", "mask-type",
                 "stop-color", "stop-opacity", "flood-color", "flood-opacity",
                 "lighting-color", "shape-rendering", "clip-rule", "fill-rule",
diff --git a/third_party/blink/renderer/core/timing/window_performance_test.cc b/third_party/blink/renderer/core/timing/window_performance_test.cc
index 1856df3c..76f0ef13 100644
--- a/third_party/blink/renderer/core/timing/window_performance_test.cc
+++ b/third_party/blink/renderer/core/timing/window_performance_test.cc
@@ -909,7 +909,7 @@
   analyzer->FindEvents(q, &events);
   EXPECT_EQ(1u, events.size());
   EXPECT_EQ("loading", events[0]->category);
-  EXPECT_TRUE(events[0]->HasArg("frame"));
+  EXPECT_TRUE(events[0]->HasStringArg("frame"));
 
   ASSERT_TRUE(events[0]->HasDictArg("data"));
   base::Value::Dict arg_dict = events[0]->GetKnownArgAsDict("data");
diff --git a/third_party/blink/renderer/modules/peerconnection/fake_rtc_rtp_transceiver_impl.cc b/third_party/blink/renderer/modules/peerconnection/fake_rtc_rtp_transceiver_impl.cc
index 83aaed0..8dbac9b 100644
--- a/third_party/blink/renderer/modules/peerconnection/fake_rtc_rtp_transceiver_impl.cc
+++ b/third_party/blink/renderer/modules/peerconnection/fake_rtc_rtp_transceiver_impl.cc
@@ -13,13 +13,12 @@
 MediaStreamComponent* CreateMediaStreamComponent(
     const std::string& id,
     scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-  auto* source = MakeGarbageCollected<MediaStreamSource>(
-      String::FromUTF8(id), MediaStreamSource::kTypeAudio,
-      String::FromUTF8("audio_track"), false);
   auto audio_source = std::make_unique<blink::MediaStreamAudioSource>(
       std::move(task_runner), true /* is_local_source */);
   auto* audio_source_ptr = audio_source.get();
-  source->SetPlatformSource(std::move(audio_source));
+  auto* source = MakeGarbageCollected<MediaStreamSource>(
+      String::FromUTF8(id), MediaStreamSource::kTypeAudio,
+      String::FromUTF8("audio_track"), false, std::move(audio_source));
 
   auto* component =
       MakeGarbageCollected<MediaStreamComponent>(source->Id(), source);
diff --git a/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source_test.cc b/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source_test.cc
index 444489e..bcfbdcf 100644
--- a/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/media_stream_remote_video_source_test.cc
@@ -103,12 +103,13 @@
             CrossThreadUnretained(&waitable_event))));
     waitable_event.Wait();
 
-    remote_source_ =
-        new MediaStreamRemoteVideoSourceUnderTest(std::move(track_observer));
+    auto remote_source =
+        std::make_unique<MediaStreamRemoteVideoSourceUnderTest>(
+            std::move(track_observer));
+    remote_source_ = remote_source.get();
     source_ = MakeGarbageCollected<MediaStreamSource>(
         "dummy_source_id", MediaStreamSource::kTypeVideo, "dummy_source_name",
-        true /* remote */);
-    source_->SetPlatformSource(base::WrapUnique(remote_source_));
+        true /* remote */, std::move(remote_source));
   }
 
   void TearDown() override {
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc
index c85ed936..069b9594 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler_test.cc
@@ -364,12 +364,19 @@
         String::FromUTF8("audio_track"), false /* remote */,
         std::move(processed_audio_source));
 
-    auto* video_source = MakeGarbageCollected<MediaStreamSource>(
-        video_track_label, MediaStreamSource::kTypeVideo,
-        String::FromUTF8("video_track"), false /* remote */);
     auto native_video_source = std::make_unique<MockMediaStreamVideoSource>();
     auto* native_video_source_ptr = native_video_source.get();
-    video_source->SetPlatformSource(std::move(native_video_source));
+
+    // Dropping the MediaStreamSource reference here is ok, as
+    // native_video_source will have a weak pointer to it as Owner(), which is
+    // picked up by the MediaStreamComponent created with CreateVideoTrack()
+    // below.
+    // TODO(https://crbug.com/1302689): Fix this crazy lifecycle jumping back
+    // and forth between GCed and non-GCed objects...
+    MakeGarbageCollected<MediaStreamSource>(
+        video_track_label, MediaStreamSource::kTypeVideo,
+        String::FromUTF8("video_track"), false /* remote */,
+        std::move(native_video_source));
 
     HeapVector<Member<MediaStreamComponent>> audio_components(
         static_cast<size_t>(1));
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender_impl_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender_impl_test.cc
index fbc0685f..0c786f0 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender_impl_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender_impl_test.cc
@@ -68,13 +68,12 @@
   }
 
   MediaStreamComponent* CreateTrack(const std::string& id) {
-    auto* source = MakeGarbageCollected<MediaStreamSource>(
-        String::FromUTF8(id), MediaStreamSource::kTypeAudio,
-        String::FromUTF8("local_audio_track"), false);
     auto audio_source = std::make_unique<MediaStreamAudioSource>(
         blink::scheduler::GetSingleThreadTaskRunnerForTesting(), true);
     auto* audio_source_ptr = audio_source.get();
-    source->SetPlatformSource(std::move(audio_source));
+    auto* source = MakeGarbageCollected<MediaStreamSource>(
+        String::FromUTF8(id), MediaStreamSource::kTypeAudio,
+        String::FromUTF8("local_audio_track"), false, std::move(audio_source));
 
     auto* component =
         MakeGarbageCollected<MediaStreamComponent>(source->Id(), source);
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver_impl_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver_impl_test.cc
index 66dc3d8..fec9d58 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver_impl_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver_impl_test.cc
@@ -153,14 +153,12 @@
 
  protected:
   MediaStreamComponent* CreateLocalTrack(const std::string& id) {
-    auto* source = MakeGarbageCollected<MediaStreamSource>(
-        String::FromUTF8(id), MediaStreamSource::kTypeAudio,
-        String::FromUTF8("local_audio_track"), false);
     auto audio_source = std::make_unique<MediaStreamAudioSource>(
         scheduler::GetSingleThreadTaskRunnerForTesting(), true);
     auto* audio_source_ptr = audio_source.get();
-    // Takes ownership of |audio_source|.
-    source->SetPlatformSource(std::move(audio_source));
+    auto* source = MakeGarbageCollected<MediaStreamSource>(
+        String::FromUTF8(id), MediaStreamSource::kTypeAudio,
+        String::FromUTF8("local_audio_track"), false, std::move(audio_source));
 
     auto* component =
         MakeGarbageCollected<MediaStreamComponent>(source->Id(), source);
diff --git a/third_party/blink/renderer/modules/peerconnection/transceiver_state_surfacer_test.cc b/third_party/blink/renderer/modules/peerconnection/transceiver_state_surfacer_test.cc
index dbd721de..0c535e8 100644
--- a/third_party/blink/renderer/modules/peerconnection/transceiver_state_surfacer_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/transceiver_state_surfacer_test.cc
@@ -228,13 +228,12 @@
 
  private:
   MediaStreamComponent* CreateLocalTrack(const std::string& id) {
-    auto* source = MakeGarbageCollected<MediaStreamSource>(
-        String::FromUTF8(id), MediaStreamSource::kTypeAudio,
-        String::FromUTF8("local_audio_track"), false);
     auto audio_source = std::make_unique<MediaStreamAudioSource>(
         scheduler::GetSingleThreadTaskRunnerForTesting(), true);
     auto* audio_source_ptr = audio_source.get();
-    source->SetPlatformSource(std::move(audio_source));
+    auto* source = MakeGarbageCollected<MediaStreamSource>(
+        String::FromUTF8(id), MediaStreamSource::kTypeAudio,
+        String::FromUTF8("local_audio_track"), false, std::move(audio_source));
 
     auto* component =
         MakeGarbageCollected<MediaStreamComponent>(source->Id(), source);
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map_test.cc b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map_test.cc
index 2f820e45..03e9c27 100644
--- a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map_test.cc
@@ -40,17 +40,16 @@
   }
 
   MediaStreamComponent* CreateLocalTrack(const std::string& id) {
+    auto audio_source = std::make_unique<MediaStreamAudioSource>(
+        scheduler::GetSingleThreadTaskRunnerForTesting(), true);
+    MediaStreamAudioSource* audio_source_ptr = audio_source.get();
     auto* source = MakeGarbageCollected<MediaStreamSource>(
         String::FromUTF8(id), MediaStreamSource::kTypeAudio,
-        String::FromUTF8("local_audio_track"), false);
-    MediaStreamAudioSource* audio_source = new MediaStreamAudioSource(
-        scheduler::GetSingleThreadTaskRunnerForTesting(), true);
-    // Takes ownership of |audio_source|.
-    source->SetPlatformSource(base::WrapUnique(audio_source));
+        String::FromUTF8("local_audio_track"), false, std::move(audio_source));
 
     auto* component =
         MakeGarbageCollected<MediaStreamComponent>(source->Id(), source);
-    audio_source->ConnectToTrack(component);
+    audio_source_ptr->ConnectToTrack(component);
     return component;
   }
 
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_test.cc b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_test.cc
index 2087b822..edd0c61e1 100644
--- a/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_test.cc
@@ -45,13 +45,12 @@
   }
 
   MediaStreamComponent* CreateLocalAudioTrack() {
-    auto* source = MakeGarbageCollected<MediaStreamSource>(
-        String::FromUTF8("local_audio_id"), MediaStreamSource::kTypeAudio,
-        String::FromUTF8("local_audio_track"), false);
     auto audio_source = std::make_unique<MediaStreamAudioSource>(
         scheduler::GetSingleThreadTaskRunnerForTesting(), true);
     auto* audio_source_ptr = audio_source.get();
-    source->SetPlatformSource(std::move(audio_source));
+    auto* source = MakeGarbageCollected<MediaStreamSource>(
+        String::FromUTF8("local_audio_id"), MediaStreamSource::kTypeAudio,
+        String::FromUTF8("local_audio_track"), false, std::move(audio_source));
 
     auto* component =
         MakeGarbageCollected<MediaStreamComponent>(source->Id(), source);
@@ -60,12 +59,16 @@
   }
 
   MediaStreamComponent* CreateLocalVideoTrack() {
-    auto* source = MakeGarbageCollected<MediaStreamSource>(
-        String::FromUTF8("local_video_id"), MediaStreamSource::kTypeVideo,
-        String::FromUTF8("local_video_track"), false);
     auto video_source = std::make_unique<MockMediaStreamVideoSource>();
     auto* video_source_ptr = video_source.get();
-    source->SetPlatformSource(std::move(video_source));
+    // Dropping the MediaStreamSource reference here is ok, as video_source will
+    // have a weak pointer to it as Owner(), which is picked up by the
+    // MediaStreamComponent created with CreateVideoTrack() below.
+    // TODO(https://crbug.com/1302689): Fix this crazy lifecycle jumping back
+    // and forth between GCed and non-GCed objects...
+    MakeGarbageCollected<MediaStreamSource>(
+        String::FromUTF8("local_video_id"), MediaStreamSource::kTypeVideo,
+        String::FromUTF8("local_video_track"), false, std::move(video_source));
 
     return MediaStreamVideoTrack::CreateVideoTrack(
         video_source_ptr,
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_set_description_observer_test.cc b/third_party/blink/renderer/modules/peerconnection/webrtc_set_description_observer_test.cc
index d3d57db..02a1faa 100644
--- a/third_party/blink/renderer/modules/peerconnection/webrtc_set_description_observer_test.cc
+++ b/third_party/blink/renderer/modules/peerconnection/webrtc_set_description_observer_test.cc
@@ -239,13 +239,12 @@
   void TearDown() override { blink::WebHeap::CollectAllGarbageForTesting(); }
 
   MediaStreamComponent* CreateLocalTrack(const std::string& id) {
-    auto* source = MakeGarbageCollected<MediaStreamSource>(
-        String::FromUTF8(id), MediaStreamSource::kTypeAudio,
-        String::FromUTF8("local_audio_track"), false);
     auto audio_source = std::make_unique<MediaStreamAudioSource>(
         blink::scheduler::GetSingleThreadTaskRunnerForTesting(), true);
     auto* audio_source_ptr = audio_source.get();
-    source->SetPlatformSource(std::move(audio_source));
+    auto* source = MakeGarbageCollected<MediaStreamSource>(
+        String::FromUTF8(id), MediaStreamSource::kTypeAudio,
+        String::FromUTF8("local_audio_track"), false, std::move(audio_source));
 
     auto* component =
         MakeGarbageCollected<MediaStreamComponent>(source->Id(), source);
diff --git a/third_party/blink/renderer/modules/xr/xr_depth_manager.cc b/third_party/blink/renderer/modules/xr/xr_depth_manager.cc
index 7b4ce3f0..178316d 100644
--- a/third_party/blink/renderer/modules/xr/xr_depth_manager.cc
+++ b/third_party/blink/renderer/modules/xr/xr_depth_manager.cc
@@ -9,6 +9,8 @@
 #include "base/trace_event/trace_event.h"
 #include "third_party/blink/renderer/modules/xr/xr_cpu_depth_information.h"
 #include "third_party/blink/renderer/modules/xr/xr_session.h"
+#include "third_party/blink/renderer/platform/bindings/exception_code.h"
+#include "third_party/blink/renderer/platform/bindings/exception_state.h"
 
 namespace {
 
diff --git a/third_party/blink/renderer/modules/xr/xr_hit_test_result.cc b/third_party/blink/renderer/modules/xr/xr_hit_test_result.cc
index d4fe39f..ab8173e 100644
--- a/third_party/blink/renderer/modules/xr/xr_hit_test_result.cc
+++ b/third_party/blink/renderer/modules/xr/xr_hit_test_result.cc
@@ -11,6 +11,8 @@
 #include "third_party/blink/renderer/modules/xr/xr_rigid_transform.h"
 #include "third_party/blink/renderer/modules/xr/xr_session.h"
 #include "third_party/blink/renderer/modules/xr/xr_space.h"
+#include "third_party/blink/renderer/platform/bindings/exception_code.h"
+#include "third_party/blink/renderer/platform/bindings/exception_state.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/modules/xr/xr_session.h b/third_party/blink/renderer/modules/xr/xr_session.h
index 9e16c0b6..64adb27 100644
--- a/third_party/blink/renderer/modules/xr/xr_session.h
+++ b/third_party/blink/renderer/modules/xr/xr_session.h
@@ -15,13 +15,9 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_xr_light_probe_init.h"
 #include "third_party/blink/renderer/core/dom/events/event_target.h"
-#include "third_party/blink/renderer/core/html/html_element.h"
-#include "third_party/blink/renderer/core/typed_arrays/array_buffer_view_helpers.h"
-#include "third_party/blink/renderer/core/typed_arrays/dom_typed_array.h"
 #include "third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.h"
 #include "third_party/blink/renderer/modules/xr/xr_input_source.h"
 #include "third_party/blink/renderer/modules/xr/xr_input_source_array.h"
-#include "third_party/blink/renderer/modules/xr/xr_reference_space.h"
 #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_map.h"
 #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
diff --git a/third_party/blink/renderer/modules/xr/xr_view.cc b/third_party/blink/renderer/modules/xr/xr_view.cc
index 11249e6..855fd844 100644
--- a/third_party/blink/renderer/modules/xr/xr_view.cc
+++ b/third_party/blink/renderer/modules/xr/xr_view.cc
@@ -2,8 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#define _USE_MATH_DEFINES  // For VC++ to get M_PI. This has to be first.
+
 #include "third_party/blink/renderer/modules/xr/xr_view.h"
 
+#include <cmath>
+
 #include "base/cxx17_backports.h"
 #include "third_party/blink/renderer/modules/xr/xr_camera.h"
 #include "third_party/blink/renderer/modules/xr/xr_frame.h"
diff --git a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc
index ed6c0a4..9107e0d1 100644
--- a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc
+++ b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc
@@ -33,6 +33,7 @@
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/default_tick_clock.h"
 #include "base/trace_event/trace_event.h"
+#include "components/crash/core/common/crash_key.h"
 #include "gin/public/v8_idle_task_runner.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/web/blink.h"
@@ -422,6 +423,11 @@
 }
 
 void ReportV8OOMError(const char* location, bool is_js_heap) {
+  if (location) {
+    static crash_reporter::CrashKeyString<64> location_key("v8-oom-location");
+    location_key.Set(location);
+  }
+
   LOG(ERROR) << "V8 " << (is_js_heap ? "javascript" : "process") << " OOM: ("
              << location << ").";
   OOM_CRASH(0);
diff --git a/third_party/blink/renderer/platform/fonts/font_selector.h b/third_party/blink/renderer/platform/fonts/font_selector.h
index 5813628..ac0ebee2 100644
--- a/third_party/blink/renderer/platform/fonts/font_selector.h
+++ b/third_party/blink/renderer/platform/fonts/font_selector.h
@@ -30,8 +30,8 @@
 #include "third_party/blink/renderer/platform/fonts/font_cache_client.h"
 #include "third_party/blink/renderer/platform/fonts/font_fallback_priority.h"
 #include "third_party/blink/renderer/platform/fonts/font_invalidation_reason.h"
-#include "third_party/blink/renderer/platform/fonts/font_matching_metrics.h"
-#include "third_party/blink/renderer/platform/fonts/segmented_font_data.h"
+#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
+#include "third_party/blink/renderer/platform/heap/member.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/wtf/forward.h"
 #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
@@ -40,12 +40,14 @@
 
 class ExecutionContext;
 class FontData;
+class FontDataForRangeSet;
 class FontDescription;
 class FontFaceCache;
 class FontFallbackMap;
 class FontFamily;
 class FontSelectorClient;
 class GenericFontFamilySettings;
+class SimpleFontData;
 class UseCounter;
 
 class PLATFORM_EXPORT FontSelector : public FontCacheClient {
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_results_processor.py b/third_party/blink/tools/blinkpy/w3c/wpt_results_processor.py
index a5bec07..f1c5864 100644
--- a/third_party/blink/tools/blinkpy/w3c/wpt_results_processor.py
+++ b/third_party/blink/tools/blinkpy/w3c/wpt_results_processor.py
@@ -266,6 +266,7 @@
         test_file_subpath = self.wpt_manifest.file_path_for_test_url(wpt_name)
         if test_file_subpath:
             expected_path = self.fs.join(self.web_tests_dir,
+                                         self.path_finder.wpt_prefix(),
                                          test_file_subpath + extension)
             if self.fs.exists(expected_path):
                 return expected_path
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_results_processor_unittest.py b/third_party/blink/tools/blinkpy/w3c/wpt_results_processor_unittest.py
index 60d543b..fc08f419 100644
--- a/third_party/blink/tools/blinkpy/w3c/wpt_results_processor_unittest.py
+++ b/third_party/blink/tools/blinkpy/w3c/wpt_results_processor_unittest.py
@@ -503,8 +503,8 @@
         self._create_json_output(json_dict)
         # Also create a checked-in metadata file for this test
         self.fs.write_text_file(
-            self.fs.join(self.processor.web_tests_dir, 'test.html.ini'),
-            'test.html checked-in metadata')
+            self.fs.join(self.processor.web_tests_dir, 'external', 'wpt',
+                         'test.html.ini'), 'test.html checked-in metadata')
 
         self.processor.process_wpt_results(OUTPUT_JSON_FILENAME)
         written_files = self.fs.written_files
@@ -578,7 +578,8 @@
         # matches the test *file* name, not the test name (which includes the
         # variant).
         self.fs.write_text_file(
-            self.fs.join(self.processor.web_tests_dir, "variant.html.ini"),
+            self.fs.join(self.processor.web_tests_dir, 'external', 'wpt',
+                         'variant.html.ini'),
             "variant.html checked-in metadata")
 
         self.processor.process_wpt_results(OUTPUT_JSON_FILENAME)
@@ -640,8 +641,8 @@
         # matches the test *file* name, not the test name (which includes test
         # scope).
         self.fs.write_text_file(
-            self.fs.join(self.processor.web_tests_dir,
-                         "dir/multiglob.https.any.js.ini"),
+            self.fs.join(self.processor.web_tests_dir, 'external', 'wpt',
+                         'dir/multiglob.https.any.js.ini'),
             "dir/multiglob checked-in metadata")
 
         self.processor.process_wpt_results(OUTPUT_JSON_FILENAME)
diff --git a/third_party/blink/web_tests/PRESUBMIT.py b/third_party/blink/web_tests/PRESUBMIT.py
index 9ca8f8fd..4edd4a37 100644
--- a/third_party/blink/web_tests/PRESUBMIT.py
+++ b/third_party/blink/web_tests/PRESUBMIT.py
@@ -10,6 +10,7 @@
 
 import filecmp
 import inspect
+import os
 import sys
 
 USE_PYTHON3 = True
@@ -30,16 +31,32 @@
     checker_path = input_api.os_path.join(input_api.PresubmitLocalPath(),
         '..', 'tools', 'check_testharness_expected_pass.py')
 
-    args = [input_api.python_executable, checker_path]
-    args.extend(baseline_files)
-    _, errs = input_api.subprocess.Popen(
-        args,
-        stdout=input_api.subprocess.PIPE,
-        stderr=input_api.subprocess.PIPE,
-        universal_newlines=True).communicate()
-    if errs:
-        return [output_api.PresubmitError(errs)]
-    return []
+    # When running git cl presubmit --all this presubmit may be asked to check
+    # ~19,000 files, leading to a command line that is over 2,000,000 characters.
+    # This goes past the Windows 8191 character cmd.exe limit and causes cryptic
+    # failures. To avoid these we break the command up into smaller pieces. The
+    # non-Windows limit is chosen so that the code that splits up commands will
+    # get some exercise on other platforms.
+    # Depending on how long the command is on Windows the error may be:
+    #     The command line is too long.
+    # Or it may be:
+    #     OSError: Execution failed with error: [WinError 206] The filename or
+    #     extension is too long.
+    # I suspect that the latter error comes from CreateProcess hitting its 32768
+    # character limit.
+    files_per_command = 25 if input_api.is_windows else 1000
+    results = []
+    for i in range(0, len(baseline_files), files_per_command):
+        args = [input_api.python_executable, checker_path]
+        args.extend(baseline_files[i:i + files_per_command])
+        _, errs = input_api.subprocess.Popen(
+            args,
+            stdout=input_api.subprocess.PIPE,
+            stderr=input_api.subprocess.PIPE,
+            universal_newlines=True).communicate()
+        if errs:
+            results.append(output_api.PresubmitError(errs))
+    return results
 
 
 def _TestharnessGenericBaselinesToCheck(input_api):
@@ -197,7 +214,6 @@
 def _CheckForExtraVirtualBaselines(input_api, output_api):
     """Checks that expectations in virtual test suites are for virtual test suites that exist
     """
-
     os_path = input_api.os_path
 
     local_dir = os_path.relpath(
@@ -224,14 +240,19 @@
     if not check_all and len(check_files) == 0:
         return []
 
+    # The rest of this test fails on Windows because win32pipe is not available
+    # and other errors.
+    if os.name == 'nt':
+        return []
+
     from blinkpy.common.host import Host
     port_factory = Host().port_factory
     known_virtual_suites = set()
     for port_name in port_factory.all_port_names():
         known_virtual_suites.update([
-            suite.full_prefix[8:-1] for suite in port_factory.get(
-                port_name).virtual_test_suites()
-    ])
+            suite.full_prefix[8:-1]
+            for suite in port_factory.get(port_name).virtual_test_suites()
+        ])
     known_virtual_suites = list(known_virtual_suites)
 
     results = []
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index b7d31a9..bcf29f3 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -3331,6 +3331,12 @@
 crbug.com/626703 [ Win ] virtual/partitioned-cookies/http/tests/inspector-protocol/network/disabled-cache-navigation.js [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 [ Mac11-arm64 ] external/wpt/fetch/private-network-access/nested-worker.https.window.html [ Timeout ]
+crbug.com/626703 [ Mac10.12 ] external/wpt/html/cross-origin-opener-policy/header-parsing.https.html [ Timeout ]
+crbug.com/626703 [ Mac10.12 ] external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/property-opener-set.https.html [ Timeout ]
+crbug.com/626703 [ Mac10.12 ] virtual/document-transition/wpt_internal/document-transition/new-content-container-writing-modes.html [ Timeout ]
+crbug.com/626703 [ Mac10.12 ] virtual/no-alloc-direct-call/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-drawImage-ImageBitmap-cloned.html [ Timeout ]
+crbug.com/626703 [ Mac10.12 ] virtual/split-http-cache/external/wpt/signed-exchange/reporting/sxg-reporting-navigation-cert_fetch_error-downgraded.tentative.html [ Timeout ]
 crbug.com/626703 [ Mac11-arm64 ] external/wpt/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-meter-background-attachment-001.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/css/css-ui/compute-kind-widget-generated/kind-of-widget-fallback-meter-background-clip-001.html [ Failure ]
@@ -5063,8 +5069,7 @@
 crbug.com/854538 [ Win7 ] http/tests/security/contentSecurityPolicy/1.1/form-action-src-default-ignored-with-redirect.html [ Skip ]
 
 # User Activation
-crbug.com/736415 crbug.com/1066190 external/wpt/html/user-activation/navigation-state-reset-crossorigin.sub.tentative.html [ Failure Timeout ]
-crbug.com/736415 external/wpt/html/user-activation/navigation-state-reset-sameorigin.tentative.html [ Failure ]
+crbug.com/1066190 external/wpt/html/user-activation/navigation-state-reset-crossorigin.sub.tentative.html [ Failure Timeout ]
 
 # Sheriff 2018-07-05
 crbug.com/861682 [ Win ] external/wpt/css/mediaqueries/device-aspect-ratio-003.html [ Failure Pass ]
@@ -7701,7 +7706,7 @@
 # Scroll Unification known issues (go/su-web-tests) for enabling in test:
 crbug.com/1311431 [ Mac ] fast/scroll-behavior/overscroll-behavior.html [ Failure Pass ]
 crbug.com/1248231 fast/events/touch/touch-latched-scroll-node-removed.html [ Failure Pass ]
-crbug.com/1248231 fast/events/wheel/wheel-latched-scroll-node-removed.html [ Failure Timeout Pass ]
+crbug.com/1248231 fast/events/wheel/wheel-latched-scroll-node-removed.html [ Failure Pass Timeout ]
 crbug.com/1311731 [ Linux ] fast/events/touch/gesture/touch-gesture-scroll-input-field.html [ Failure Pass ]
 crbug.com/1311731 [ Win ] fast/events/touch/gesture/touch-gesture-scroll-input-field.html [ Failure Pass ]
 crbug.com/1248581 fast/scrolling/resize-corner-tracking-touch.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/PRESUBMIT.py b/third_party/blink/web_tests/external/PRESUBMIT.py
index 01306dd..473de608 100644
--- a/third_party/blink/web_tests/external/PRESUBMIT.py
+++ b/third_party/blink/web_tests/external/PRESUBMIT.py
@@ -56,25 +56,42 @@
     if not paths_in_wpt:
         return []
 
-    args = [
-        python3_command(input_api),
-        linter_path,
-        'lint',
-        '--repo-root=%s' % wpt_path,
-        '--ignore-glob=*-expected.txt',
-        '--ignore-glob=*DIR_METADATA',
-        '--ignore-glob=*OWNERS',
-    ] + paths_in_wpt
+    # When running git cl presubmit --all this presubmit may be asked to check
+    # ~65,000 files, leading to a command line that is over 7,000,000 characters.
+    # This goes past the Windows 8191 character cmd.exe limit and causes cryptic
+    # failures. To avoid these we break the command up into smaller pieces. The
+    # non-Windows limit is chosen so that the code that splits up commands will
+    # get some exercise on other platforms.
+    # Depending on how long the command is on Windows the error may be:
+    #     The command line is too long.
+    # Or it may be:
+    #     OSError: Execution failed with error: [WinError 206] The filename or
+    #     extension is too long.
+    # I suspect that the latter error comes from CreateProcess hitting its 32768
+    # character limit.
+    files_per_command = 25 if input_api.is_windows else 1000
+    results = []
+    for i in range(0, len(paths_in_wpt), files_per_command):
+        args = [
+            python3_command(input_api),
+            linter_path,
+            'lint',
+            '--repo-root=%s' % wpt_path,
+            '--ignore-glob=*-expected.txt',
+            '--ignore-glob=*DIR_METADATA',
+            '--ignore-glob=*OWNERS',
+        ] + paths_in_wpt[i:i + files_per_command]
 
-    proc = input_api.subprocess.Popen(
-        args,
-        stdout=input_api.subprocess.PIPE,
-        stderr=input_api.subprocess.PIPE)
-    stdout, stderr = proc.communicate()
+        proc = input_api.subprocess.Popen(args,
+                                          stdout=input_api.subprocess.PIPE,
+                                          stderr=input_api.subprocess.PIPE)
+        stdout, stderr = proc.communicate()
 
-    if proc.returncode != 0:
-        return [output_api.PresubmitError('wpt lint failed:', long_text=stdout + stderr)]
-    return []
+        if proc.returncode != 0:
+            results.append(
+                output_api.PresubmitError('wpt lint failed:',
+                                          long_text=stdout + stderr))
+    return results
 
 
 def _DontModifyIDLFiles(input_api, output_api):
diff --git a/third_party/blink/web_tests/external/Version b/third_party/blink/web_tests/external/Version
index 5fe8821..61c1a7e 100644
--- a/third_party/blink/web_tests/external/Version
+++ b/third_party/blink/web_tests/external/Version
@@ -1 +1 @@
-Version: bc351be47b742e2d306907de797f6dd56093f092
+Version: b42310489d080ec6e4f30e950059887e8e05a637
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index bfa6a38..f2f43a2e 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -148957,7 +148957,7 @@
       ]
      ],
      "block-ruby-001.html": [
-      "f6a058807c48dc5c0cfe056a95355f3d234ac0ad",
+      "0602116aacae5187176de06d865b584cbf9bc0b8",
       [
        null,
        [
@@ -278333,7 +278333,7 @@
       []
      ],
      "block-ruby-001-ref.html": [
-      "b8d851fb532107b8d3e7fd792438295577b6ac23",
+      "076a2f01cfba8693e633b15dfd50e0946fe8167d",
       []
      ],
      "block-ruby-002-ref.html": [
@@ -294371,7 +294371,7 @@
       []
      ],
      "testharness.md": [
-      "57cbd33ea0b35c39af321bafca75a56d8728797a",
+      "2a13c4c7f1101d16adfa3aba8c20d1fd2c0c330c",
       []
      ],
      "tools.md": [
@@ -299562,6 +299562,10 @@
      ]
     },
     "range": {
+     "general.any.serviceworker-expected.txt": [
+      "61126fdaf3eaaebfbee0d435c749a4920f489a81",
+      []
+     ],
      "general.window-expected.txt": [
       "d15469b170082ed0d182f611184954647d90379a",
       []
@@ -299572,7 +299576,7 @@
        []
       ],
       "long-wav.py": [
-       "be7df7b83d8723ffd8c977d3f4b5c42a23d7918a",
+       "acfc81a71809dc3867a956872e6d65e23ad4d58d",
        []
       ],
       "partial-script.py": [
@@ -310036,7 +310040,7 @@
        ]
       },
       "structured-cloning-error-stack-optional.sub.window-expected.txt": [
-       "c939958ba0335696671453638f8803501a25b0b1",
+       "bdda3adea39bd4b931d43ad525cfb94a3a1d8e3f",
        []
       ]
      },
@@ -326888,7 +326892,7 @@
      []
     ],
     "testharness.js": [
-     "a6f48e1f943b9952a8fbe5d882278c2cfb86baba",
+     "2c5df32b8c73c8cc4b1c0e0f3bec406fef345e72",
      []
     ],
     "testharness.js.headers": [
@@ -390476,7 +390480,7 @@
        ]
       ],
       "table-width-redistribution-fixed-padding.html": [
-       "57843d5eb6e845b95bcab53c6dd3b24fc71be7ae",
+       "097ddacfc3139105f0d80689e0c03ac722a00aeb",
        [
         null,
         {}
@@ -433833,7 +433837,7 @@
     },
     "range": {
      "general.any.js": [
-      "80791c3847eac7501191b44e541d85f5b8f293b7",
+      "3c4669ad0bbc1c3f10bca384194cd75dd54aa171",
       [
        "fetch/range/general.any.html",
        {
@@ -433844,6 +433848,10 @@
          ],
          [
           "script",
+          "/common/get-host-info.sub.js"
+         ],
+         [
+          "script",
           "/common/utils.js"
          ]
         ]
@@ -433859,6 +433867,10 @@
          ],
          [
           "script",
+          "/common/get-host-info.sub.js"
+         ],
+         [
+          "script",
           "/common/utils.js"
          ]
         ]
@@ -433874,6 +433886,10 @@
          ],
          [
           "script",
+          "/common/get-host-info.sub.js"
+         ],
+         [
+          "script",
           "/common/utils.js"
          ]
         ]
@@ -433889,6 +433905,10 @@
          ],
          [
           "script",
+          "/common/get-host-info.sub.js"
+         ],
+         [
+          "script",
           "/common/utils.js"
          ]
         ]
@@ -473257,7 +473277,7 @@
         ]
        ],
        "focus-after-close.html": [
-        "7061c34e4e45252bc3a325b104fdbae07be36004",
+        "d66d45527a7e39fa96ee11d9a331bcc2109aeb37",
         [
          null,
          {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/fit-content-with-spanner-and-auto-scrollbar-sibling.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/fit-content-with-spanner-and-auto-scrollbar-sibling.html
new file mode 100644
index 0000000..105da39
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/crashtests/fit-content-with-spanner-and-auto-scrollbar-sibling.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1308960">
+<div style="columns:2; width:100px;">
+  <div style="width:min-content;">
+    <div style="column-span:all;"></div>
+    <div style="height:50px; overflow:auto;">
+      <div style="width:100px; height:100px;"></div>
+    </div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-001-ref.html
index b8d851f..076a2f0 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-001-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-001-ref.html
@@ -8,6 +8,17 @@
 <title>CSS Ruby Reference: basic 'block ruby' layout.</title>
 <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
 <style>
+@font-face
+{
+  font-family: "mplus-1p-regular";
+  src: url("/fonts/mplus-1p-regular.woff") format("woff");
+}
+
+html
+{
+  font-family: "mplus-1p-regular";
+}
+
 .b { background: lightblue; }
 .mbp {
   margin: 1px 3px 5px 7px;
@@ -25,13 +36,13 @@
   display: ruby-base-container;
   unicode-bidi: isolate;
 }
-.w { white-space: nowrap; width:2.5em; }
+.w { white-space: nowrap; width:2.5em; margin: 1em 0em; }
 </style>
-A<div class=b><ruby>べ<rt>る</rt></ruby></div>B
+A<div class="b"><ruby>べ<rt>る</rt></ruby></div>B
 A<div class="mbp b"><ruby>べ<rt>る</rt></ruby></div>B
-<div class=columns>A<div class="mbp b"><ruby>べ<rt>る</rt> べ<rt>る</rt>  べ<rt>る</rt> べ<rt>る</rt> べ<rt>る</rt></ruby></div>B</div>
-<div style="width:2.5em; border:1px solid; text-align: center">
-    <p><div class="w b"><ruby><rb>一<rb>二<rb>三<rb>四<rb>五<rb>六<rb>七<rb>八</ruby></div></p>
-    <p><div class="w b"><ruby><rbc>一</rbc><rbc>二</rbc><rbc>三</rbc><rbc>四</rbc><rbc>五</rbc><rbc>六</rbc><rbc>七</rbc><rbc>八</rbc></ruby></div></p>
+<div class="columns">A<div class="mbp b"><ruby>べ<rt>る</rt> べ<rt>る</rt>  べ<rt>る</rt> べ<rt>る</rt> べ<rt>る</rt></ruby></div>B</div>
+<div style="width:2.5em; border:1px solid;">
+    <div class="w b"><ruby><rb>一<rb>二<rb>三<rb>四<rb>五<rb>六<rb>七<rb>八</ruby></div>
+    <div class="w b"><ruby><rbc>一</rbc><rbc>二</rbc><rbc>三</rbc><rbc>四</rbc><rbc>五</rbc><rbc>六</rbc><rbc>七</rbc><rbc>八</rbc></ruby></div>
 </div>
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-001.html b/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-001.html
index f6a0588..0602116a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-ruby/block-ruby-001.html
@@ -11,6 +11,17 @@
 <link rel="help" href="https://drafts.csswg.org/css-ruby-1/#ruby-layout">
 <link rel="match" href="block-ruby-001-ref.html">
 <style>
+@font-face
+{
+  font-family: "mplus-1p-regular";
+  src: url("/fonts/mplus-1p-regular.woff") format("woff");
+}
+
+html
+{
+  font-family: "mplus-1p-regular";
+}
+
 ruby { display: block ruby; background: lightblue; }
 .mbp {
   margin: 1px 3px 5px 7px;
@@ -30,10 +41,10 @@
 }
 </style>
 A<ruby>べ<rt>る</rt></ruby>B
-A<ruby class=mbp>べ<rt>る</rt></ruby>B
-<div class=columns>A<ruby class=mbp>べ<rt>る</rt> べ<rt>る</rt>  べ<rt>る</rt> べ<rt>る</rt> べ<rt>る</rt></ruby>B</div>
-<div style="width:2.5em; border:1px solid; text-align: center">
-    <p><ruby><rb>一<rb>二<rb>三<rb>四<rb>五<rb>六<rb>七<rb>八</ruby></p>
-    <p><ruby><rbc>一</rbc><rbc>二</rbc><rbc>三</rbc><rbc>四</rbc><rbc>五</rbc><rbc>六</rbc><rbc>七</rbc><rbc>八</rbc></ruby></p>
+A<ruby class="mbp">べ<rt>る</rt></ruby>B
+<div class="columns">A<ruby class=mbp>べ<rt>る</rt> べ<rt>る</rt>  べ<rt>る</rt> べ<rt>る</rt> べ<rt>る</rt></ruby>B</div>
+<div style="width:2.5em; border:1px solid;">
+    <ruby style="margin: 1em 0em;"><rb>一<rb>二<rb>三<rb>四<rb>五<rb>六<rb>七<rb>八</ruby>
+    <ruby style="margin: 1em 0em;"><rbc>一</rbc><rbc>二</rbc><rbc>三</rbc><rbc>四</rbc><rbc>五</rbc><rbc>六</rbc><rbc>七</rbc><rbc>八</rbc></ruby>
 </div>
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/docs/writing-tests/testharness.md b/third_party/blink/web_tests/external/wpt/docs/writing-tests/testharness.md
index 57cbd33e..2a13c4c7 100644
--- a/third_party/blink/web_tests/external/wpt/docs/writing-tests/testharness.md
+++ b/third_party/blink/web_tests/external/wpt/docs/writing-tests/testharness.md
@@ -167,6 +167,9 @@
 * `jsshell`: to be run in a JavaScript shell, without access to the DOM
   (currently only supported in SpiderMonkey, and skipped in wptrunner)
 * `worker`: shorthand for the dedicated, shared, and service worker scopes
+* `shadowrealm`: runs the test code in a
+  [ShadowRealm](https://github.com/tc39/proposal-shadowrealm) context hosted in
+  an ordinary Window context; to be run at <code><var>x</var>.any.shadowrealm.html</code>
 
 To check if your test is run from a window or worker you can use the following two methods that will
 be made available by the framework:
diff --git a/third_party/blink/web_tests/external/wpt/fetch/range/general.any.js b/third_party/blink/web_tests/external/wpt/fetch/range/general.any.js
index 80791c3..3c4669ad 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/range/general.any.js
+++ b/third_party/blink/web_tests/external/wpt/fetch/range/general.any.js
@@ -1,4 +1,5 @@
 // META: global=window,worker
+// META: script=/common/get-host-info.sub.js
 // META: script=/common/utils.js
 
 // Helpers that return headers objects with a particular guard
@@ -89,3 +90,47 @@
     assert_equals(await response.json(), 'identity', `Expect identity accept-encoding if range header is ${JSON.stringify(rangeHeader)}`);
   }
 }, `Fetch with range header will be sent with Accept-Encoding: identity`);
+
+promise_test(async () => {
+  const wavURL = new URL(get_host_info().HTTP_REMOTE_ORIGIN + '/fetch/range/resources/long-wav.py');
+  const stashTakeURL = new URL('resources/stash-take.py', location);
+
+  function changeToken() {
+    const stashToken = token();
+    wavURL.searchParams.set('accept-encoding-key', stashToken);
+    stashTakeURL.searchParams.set('key', stashToken);
+  }
+
+  const rangeHeaders = [
+    'bytes=10-9',
+    'bytes=-0',
+    'bytes=0000000000000000000000000000000000000000000000000000000000011-0000000000000000000000000000000000000000000000000000000000111',
+  ];
+
+  for (const rangeHeader of rangeHeaders) {
+    changeToken();
+    await fetch(wavURL, { headers: { Range : rangeHeader} }).then(() => { throw "loaded with range header " + rangeHeader }, () => { });
+  }
+}, `Cross Origin Fetch with non safe range header`);
+
+promise_test(async () => {
+  const wavURL = new URL(get_host_info().HTTP_REMOTE_ORIGIN + '/fetch/range/resources/long-wav.py');
+  const stashTakeURL = new URL('resources/stash-take.py', location);
+
+  function changeToken() {
+    const stashToken = token();
+    wavURL.searchParams.set('accept-encoding-key', stashToken);
+    stashTakeURL.searchParams.set('key', stashToken);
+  }
+
+  const rangeHeaders = [
+    'bytes=0-10',
+    'bytes=0-',
+    'bytes=00000000000000000000000000000000000000000000000000000000011-00000000000000000000000000000000000000000000000000000000000111',
+  ];
+
+  for (const rangeHeader of rangeHeaders) {
+    changeToken();
+    await fetch(wavURL, { headers: { Range: rangeHeader } }).then(() => { }, () => { throw "failed load with range header " + rangeHeader });
+  }
+}, `Cross Origin Fetch with safe range header`);
diff --git a/third_party/blink/web_tests/external/wpt/fetch/range/general.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/range/general.any.serviceworker-expected.txt
new file mode 100644
index 0000000..61126fd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/range/general.any.serviceworker-expected.txt
@@ -0,0 +1,10 @@
+This is a testharness.js-based test.
+PASS Range header setting allowed for guard type: none
+PASS Range header setting allowed for guard type: response
+PASS Range header setting allowed for guard type: request
+PASS Privileged header not allowed for guard type: request-no-cors
+PASS Fetch with range header will be sent with Accept-Encoding: identity
+PASS Cross Origin Fetch with non safe range header
+FAIL Cross Origin Fetch with safe range header promise_test: Unhandled rejection with value: "failed load with range header bytes=0-10"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/fetch/range/resources/long-wav.py b/third_party/blink/web_tests/external/wpt/fetch/range/resources/long-wav.py
index be7df7b..acfc81a 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/range/resources/long-wav.py
+++ b/third_party/blink/web_tests/external/wpt/fetch/range/resources/long-wav.py
@@ -46,9 +46,15 @@
 
 
 def main(request, response):
+    if request.method == u"OPTIONS":
+        response.status = (404, b"Not Found")
+        response.headers.set(b"Content-Type", b"text/plain")
+        return b"Preflight not accepted"
+
     response.headers.set(b"Content-Type", b"audio/wav")
     response.headers.set(b"Accept-Ranges", b"bytes")
     response.headers.set(b"Cache-Control", b"no-cache")
+    response.headers.set(b"Access-Control-Allow-Origin", request.headers.get(b'Origin', b''))
 
     range_header = request.headers.get(b'Range', b'')
     range_header_match = range_header and re.search(r'^bytes=(\d*)-(\d*)$', isomorphic_decode(range_header))
diff --git a/third_party/blink/web_tests/external/wpt/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window-expected.txt b/third_party/blink/web_tests/external/wpt/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window-expected.txt
index c939958..bdda3ade 100644
--- a/third_party/blink/web_tests/external/wpt/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window-expected.txt
@@ -7,7 +7,7 @@
 PASS JS-engine-created TypeError (cross-site iframe)
 PASS web API-created TypeError (worker)
 PASS web API-created TypeError (cross-site iframe)
-FAIL web API-created DOMException (worker) assert_equals: expected (string) "Error: Failed to execute 'createElement' on 'Document': The tag name provided ('') is not a valid name.\n    at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:33:14\n    at Test.<anonymous> (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:41:19)\n    at Test.step (http://web-platform.test:8001/resources/testharness.js:2534:25)\n    at async_test (http://web-platform.test:8001/resources/testharness.js:620:34)\n    at stackTests (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:40:3)\n    at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:31:1" but got (undefined) undefined
-FAIL web API-created DOMException (cross-site iframe) assert_equals: expected (string) "Error: Failed to execute 'createElement' on 'Document': The tag name provided ('') is not a valid name.\n    at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:33:14\n    at Test.<anonymous> (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:60:19)\n    at Test.step (http://web-platform.test:8001/resources/testharness.js:2534:25)\n    at async_test (http://web-platform.test:8001/resources/testharness.js:620:34)\n    at stackTests (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:57:3)\n    at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:31:1" but got (undefined) undefined
+FAIL web API-created DOMException (worker) assert_equals: expected (string) "Error: Failed to execute 'createElement' on 'Document': The tag name provided ('') is not a valid name.\n    at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:33:14\n    at Test.<anonymous> (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:41:19)\n    at Test.step (http://web-platform.test:8001/resources/testharness.js:2592:25)\n    at async_test (http://web-platform.test:8001/resources/testharness.js:678:34)\n    at stackTests (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:40:3)\n    at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:31:1" but got (undefined) undefined
+FAIL web API-created DOMException (cross-site iframe) assert_equals: expected (string) "Error: Failed to execute 'createElement' on 'Document': The tag name provided ('') is not a valid name.\n    at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:33:14\n    at Test.<anonymous> (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:60:19)\n    at Test.step (http://web-platform.test:8001/resources/testharness.js:2592:25)\n    at async_test (http://web-platform.test:8001/resources/testharness.js:678:34)\n    at stackTests (http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:57:3)\n    at http://web-platform.test:8001/html/infrastructure/safe-passing-of-structured-data/structured-cloning-error-stack-optional.sub.window.js:31:1" but got (undefined) undefined
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-embed-element/embed-hidden-attribute-ref.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-embed-element/embed-hidden-attribute-ref.html
new file mode 100644
index 0000000..4b3d0fe
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-embed-element/embed-hidden-attribute-ref.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<title>The hidden global presentation attribute within the embed element</title>
+
+This embed should be visible (green box):
+<embed src='../../../../images/green-256x256.png' type='image/png'></embed>
+
+These should not be visible (no red):
+
+<style>
+  embed {
+    display:block;
+  }
+</style>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-embed-element/embed-hidden-attribute.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-embed-element/embed-hidden-attribute.html
new file mode 100644
index 0000000..18d3897d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-embed-element/embed-hidden-attribute.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<title>The hidden global presentation attribute within the embed element</title>
+<link rel="author" href="mailto:masonf@chromium.org">
+<link rel=match  href="embed-hidden-attribute-ref.html">
+
+This embed should be visible (green box):
+<embed src='../../../../images/green-256x256.png' type='image/png'></embed>
+
+These should not be visible (no red):
+<embed hidden          src='../../../../images/fail.gif' type='image/png'></embed>
+<embed hidden=""       src='../../../../images/fail.gif' type='image/png'></embed>
+<embed hidden="hidden" src='../../../../images/fail.gif' type='image/png'></embed>
+<embed hidden="true"   src='../../../../images/fail.gif' type='image/png'></embed>
+<embed hidden="yes"    src='../../../../images/fail.gif' type='image/png'></embed>
+
+<style>
+embed {
+  display:block;
+}
+</style>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/focus-after-close.html b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/focus-after-close.html
index 7061c34..d66d455 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/focus-after-close.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/interactive-elements/the-dialog-element/focus-after-close.html
@@ -160,13 +160,17 @@
 }
 
 // Test moving the focus doesn't scroll the viewport
-function test_move_focus_dont_scroll_viewport(showModal) {
+async function test_move_focus_dont_scroll_viewport(showModal) {
   const outViewPortButton = document.createElement("button");
   outViewPortButton.style.top = (window.innerHeight + 10).toString() + "px";
   outViewPortButton.style.position = "absolute";
   document.body.appendChild(outViewPortButton);
 
-  outViewPortButton.focus();
+  await new Promise(resolve => {
+    document.addEventListener("scroll", () => step_timeout(resolve, 0));
+    outViewPortButton.focus();
+  });
+
   // Since the outViewPortButton is focused, so the viewport should be
   // scrolled to it
   assert_true(document.documentElement.scrollTop > 0 );
@@ -217,9 +221,9 @@
   test_move_to_shadow_host(false);
 }, "Focus should be moved to the shadow DOM host if the previouly focused element is a shadow DOM node");
 
-test(() => {
-  test_move_focus_dont_scroll_viewport(true);
-  test_move_focus_dont_scroll_viewport(false);
+promise_test(async () => {
+  await test_move_focus_dont_scroll_viewport(true);
+  await test_move_focus_dont_scroll_viewport(false);
 }, "Focus should not scroll if the previously focused element is outside the viewport");
 </script>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/resources/testharness.js b/third_party/blink/web_tests/external/wpt/resources/testharness.js
index a6f48e1f9..2c5df32b 100644
--- a/third_party/blink/web_tests/external/wpt/resources/testharness.js
+++ b/third_party/blink/web_tests/external/wpt/resources/testharness.js
@@ -425,6 +425,53 @@
     };
 
     /*
+     * Shadow realms.
+     * https://github.com/tc39/proposal-shadowrealm
+     *
+     * This class is used as the test_environment when testharness is running
+     * inside a shadow realm.
+     */
+    function ShadowRealmTestEnvironment() {
+        WorkerTestEnvironment.call(this);
+        this.all_loaded = false;
+        this.on_loaded_callback = null;
+    }
+
+    ShadowRealmTestEnvironment.prototype = Object.create(WorkerTestEnvironment.prototype);
+
+    /**
+     * Signal to the test environment that the tests are ready and the on-loaded
+     * callback should be run.
+     *
+     * Shadow realms are not *really* a DOM context: they have no `onload` or similar
+     * event for us to use to set up the test environment; so, instead, this method
+     * is manually triggered from the incubating realm
+     *
+     * @param {Function} message_destination - a function that receives JSON-serializable
+     * data to send to the incubating realm, in the same format as used by RemoteContext
+     */
+    ShadowRealmTestEnvironment.prototype.begin = function(message_destination) {
+        if (this.all_loaded) {
+            throw new Error("Tried to start a shadow realm test environment after it has already started");
+        }
+        var fakeMessagePort = {};
+        fakeMessagePort.postMessage = message_destination;
+        this._add_message_port(fakeMessagePort);
+        this.all_loaded = true;
+        if (this.on_loaded_callback) {
+            this.on_loaded_callback();
+        }
+    };
+
+    ShadowRealmTestEnvironment.prototype.add_on_loaded_callback = function(callback) {
+        if (this.all_loaded) {
+            callback();
+        } else {
+            this.on_loaded_callback = callback;
+        }
+    };
+
+    /*
      * JavaScript shells.
      *
      * This class is used as the test_environment when testharness is running
@@ -488,6 +535,17 @@
             global_scope instanceof WorkerGlobalScope) {
             return new DedicatedWorkerTestEnvironment();
         }
+        /* Shadow realm global objects are _ordinary_ objects (i.e. their prototype is
+         * Object) so we don't have a nice `instanceof` test to use; instead, we
+         * can look for the presence of web APIs that wouldn't be available in
+         * environments not listed above:
+         *
+         * As long as, within the shadow realm, we load the testharness before
+         * other libraries, this won't have any false positives, even in e.g. node
+         */
+        if ('AbortController' in global_scope) {
+            return new ShadowRealmTestEnvironment();
+        }
 
         return new ShellTestEnvironment();
     }
@@ -3786,6 +3844,45 @@
     expose(fetch_tests_from_window, 'fetch_tests_from_window');
 
     /**
+     * Get test results from a shadow realm and include them in the current test.
+     *
+     * @param {ShadowRealm} realm - A shadow realm also running the test harness
+     * @returns {Promise} - A promise that's resolved once all the remote tests are complete.
+     */
+    function fetch_tests_from_shadow_realm(realm) {
+        var chan = new MessageChannel();
+        function receiveMessage(msg_json) {
+            chan.port1.postMessage(JSON.parse(msg_json));
+        }
+        var done = tests.fetch_tests_from_worker(chan.port2);
+        realm.evaluate("begin_shadow_realm_tests")(receiveMessage);
+        chan.port2.start();
+        return done;
+    }
+    expose(fetch_tests_from_shadow_realm, 'fetch_tests_from_shadow_realm');
+
+    /**
+     * Begin running tests in this shadow realm test harness.
+     *
+     * To be called after all tests have been loaded; it is an error to call
+     * this more than once or in a non-Shadow Realm environment
+     *
+     * @param {Function} postMessage - A function to send test updates to the
+     * incubating realm-- accepts JSON-encoded messages in the format used by
+     * RemoteContext
+     */
+    function begin_shadow_realm_tests(postMessage) {
+        if (!(test_environment instanceof ShadowRealmTestEnvironment)) {
+            throw new Error("beign_shadow_realm_tests called in non-Shadow Realm environment");
+        }
+
+        test_environment.begin(function (msg) {
+            postMessage(JSON.stringify(msg));
+        });
+    }
+    expose(begin_shadow_realm_tests, 'begin_shadow_realm_tests');
+
+    /**
      * Timeout the tests.
      *
      * This only has an effect when ``explict_timeout`` has been set
@@ -3963,7 +4060,7 @@
 
     Output.prototype.show_status = function() {
         if (this.phase < this.STARTED) {
-            this.init();
+            this.init({});
         }
         if (!this.enabled || this.phase === this.COMPLETE) {
             return;
diff --git a/third_party/blink/web_tests/svg/hittest/text-small-font-size.html b/third_party/blink/web_tests/svg/hittest/text-small-font-size.html
index 86ae026..dec5550 100644
--- a/third_party/blink/web_tests/svg/hittest/text-small-font-size.html
+++ b/third_party/blink/web_tests/svg/hittest/text-small-font-size.html
@@ -17,6 +17,337 @@
   <g transform="matrix(50,0,0,50,-400,-800)">
     <text x="9.4" y="17.80">SELECT</text>
   </g>
+
+  <!-- crbug.com/1295031 -->
+  <g transform="scale(200) translate(0, 0.6)">
+    <rect width="1135800" height="578250" fill="transparent"></rect>
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+    <g transform="scale(0.9589912023158114)">
+      
+    <g transform='translate(100, 0) scale(1)'>
+        <rect class='rect' width='500' height='600' fill="yellow"></rect>
+        <text id='fifth' class='fifth test_text' transform='translate(0, 200) scale(10)' font-size="12">foo</text>
+    </g>
+       
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+    </g>
+  </g>
 </svg>
 <script>
 // The text bouding box in the document is (70,26) - (550,106).
@@ -47,4 +378,15 @@
     assert_equals(document.elementFromPoint(point.x, point.y), svgRoot, point.x + ',' + point.y);
   });
 });
+
+test(() => {
+  let textElement = document.querySelectorAll('text')[1];
+  let background = document.querySelector('rect');
+  // Should not hit <text>.
+  [
+    { x: 1, y: 200 },
+  ].forEach(function(point) {
+    assert_equals(document.elementFromPoint(point.x, point.y), background, point.x + ',' + point.y);
+  });
+}, 'crbug.com/1295031');
 </script>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-images/object-view-box-property-changed-ref.html b/third_party/blink/web_tests/wpt_internal/css/css-images/object-view-box-property-changed-ref.html
new file mode 100644
index 0000000..b304650b6d
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-images/object-view-box-property-changed-ref.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<title>Changing CSS object-view-box should trigger relayout : ref</title>
+<link rel="author" href="mailto:khushalsagar@chromium.org">
+
+<style>
+div {
+  margin: 5px;
+}
+
+.container_view_box_subset {
+  width: 50px;
+  height: 50px;
+  overflow: clip;
+  display: inline-block;
+}
+.view_box_subset {
+  position: relative;
+  top: -50px;
+}
+</style>
+<div class="container_view_box_subset">
+  <img class="view_box_subset" src="support/exif-orientation-6-ru.jpg"></img>
+</div>
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-images/object-view-box-property-changed.html b/third_party/blink/web_tests/wpt_internal/css/css-images/object-view-box-property-changed.html
new file mode 100644
index 0000000..00b959da
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/css/css-images/object-view-box-property-changed.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html class=reftest-wait>
+<title>Changing CSS object-view-box should trigger relayout</title>
+<link rel="author" href="mailto:khushalsagar@chromium.org">
+<link rel="match" href="object-view-box-property-changed-ref.html">
+
+<script src="/common/reftest-wait.js"></script>
+<script src="/common/rendering-utils.js"></script>
+
+<style>
+.view_box_subset {
+  object-fit: fill;
+  margin: 5px;
+}
+</style>
+
+<body>
+<img class="view_box_subset" src="support/exif-orientation-6-ru.jpg"></img>
+</body>
+
+<script>
+async function runTest(image) {
+  // Wait for at least one frame to ensure changing object-view-box triggers a
+  // relayout.
+  await waitForAtLeastOneFrame();
+  image.style.objectViewBox = "inset(50px 0px 0px 0px)";
+  await waitForAtLeastOneFrame();
+  requestAnimationFrame(takeScreenshot);
+}
+
+let image = document.getElementsByTagName("img")[0];
+image.onload = runTest(image);
+</script>
diff --git a/third_party/zlib/gzwrite.c b/third_party/zlib/gzwrite.c
index 3560193b..52381332 100644
--- a/third_party/zlib/gzwrite.c
+++ b/third_party/zlib/gzwrite.c
@@ -349,9 +349,9 @@
 }
 
 /* -- see zlib.h -- */
-int ZEXPORT gzputs(file, str)
+int ZEXPORT gzputs(file, s)
     gzFile file;
-    const char *str;
+    const char *s;
 {
     z_size_t len, put;
     gz_statep state;
@@ -366,12 +366,12 @@
         return -1;
 
     /* write string */
-    len = strlen(str);
+    len = strlen(s);
     if ((int)len < 0 || (unsigned)len != len) {
         gz_error(state, Z_STREAM_ERROR, "string length does not fit in int");
         return -1;
     }
-    put = gz_write(state, str, len);
+    put = gz_write(state, s, len);
     return put < len ? -1 : (int)len;
 }
 
@@ -444,7 +444,7 @@
         strm->avail_in = state->size;
         if (gz_comp(state, Z_NO_FLUSH) == -1)
             return state->err;
-        memcpy(state->in, state->in + state->size, left);
+        memmove(state->in, state->in + state->size, left);
         strm->next_in = state->in;
         strm->avail_in = left;
     }
@@ -543,7 +543,7 @@
         strm->avail_in = state->size;
         if (gz_comp(state, Z_NO_FLUSH) == -1)
             return state->err;
-        memcpy(state->in, state->in + state->size, left);
+        memmove(state->in, state->in + state->size, left);
         strm->next_in = state->in;
         strm->avail_in = left;
     }
diff --git a/third_party/zlib/trees.c b/third_party/zlib/trees.c
index 5f89d05..decaeb7 100644
--- a/third_party/zlib/trees.c
+++ b/third_party/zlib/trees.c
@@ -149,7 +149,7 @@
 local void compress_block OF((deflate_state *s, const ct_data *ltree,
                               const ct_data *dtree));
 local int  detect_data_type OF((deflate_state *s));
-local unsigned bi_reverse OF((unsigned value, int length));
+local unsigned bi_reverse OF((unsigned code, int len));
 local void bi_windup      OF((deflate_state *s));
 local void bi_flush       OF((deflate_state *s));
 
@@ -870,7 +870,8 @@
     bi_windup(s);        /* align on byte boundary */
     put_short(s, (ush)stored_len);
     put_short(s, (ush)~stored_len);
-    zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len);
+    if (stored_len)
+        zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len);
     s->pending += stored_len;
 #ifdef ZLIB_DEBUG
     s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
diff --git a/third_party/zlib/zlib.h b/third_party/zlib/zlib.h
index 35e829b..044b4c0 100644
--- a/third_party/zlib/zlib.h
+++ b/third_party/zlib/zlib.h
@@ -1740,7 +1740,7 @@
      if (crc != original_crc) error();
 */
 
-ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf,
+ZEXTERN uLong ZEXPORT crc32_z OF((uLong crc, const Bytef *buf,
                                   z_size_t len));
 /*
      Same as crc32(), but with a size_t length.
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index 90f73805..2ceac0b 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -35,8 +35,8 @@
 # https://chromium.googlesource.com/chromium/src/+/main/docs/updating_clang.md
 # Reverting problematic clang rolls is safe, though.
 # This is the output of `git describe` and is usable as a commit-ish.
-CLANG_REVISION = 'llvmorg-15-init-3677-g8133778d'
-CLANG_SUB_REVISION = 7
+CLANG_REVISION = 'llvmorg-15-init-5937-g23b3df56'
+CLANG_SUB_REVISION = 1
 
 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION)
 RELEASE_VERSION = '15.0.0'
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 4651643..a377d254 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -67,7 +67,7 @@
       'mac-official': 'official_optimize_goma',
       'win32-official': 'x86_official_optimize_goma',
       'win32-archive-rel': 'release_bot_x86_minimal_symbols_enable_archive_compression',
-      'win32-archive-dbg': 'debug_bot_x86',
+      'win32-archive-dbg': 'debug_bot_x86_reclient',
       'win32-archive-tagged': 'x86_official_optimize_goma',
       'win-archive-rel': 'release_bot_minimal_symbols_enable_archive_compression_reclient',
       'win-archive-dbg': 'debug_bot_reclient',
@@ -142,9 +142,9 @@
       'linux-angle-builder': 'angle_deqp_release_trybot_reclient',
       'linux-angle-chromium-builder': 'gpu_tests_release_trybot_minimal_symbols_reclient',
       'mac-angle-chromium-builder': 'gpu_tests_release_trybot_minimal_symbols',
-      'win-angle-chromium-x64-builder': 'gpu_tests_release_trybot_minimal_symbols',
+      'win-angle-chromium-x64-builder': 'gpu_tests_release_trybot_minimal_symbols_reclient',
       'win-angle-chromium-x86-builder': 'gpu_tests_release_bot_dcheck_always_on_x86',
-      'win-angle-x64-builder': 'angle_deqp_release_trybot',
+      'win-angle-x64-builder': 'angle_deqp_release_trybot_reclient',
     },
 
     'chromium.chromiumos': {
@@ -394,9 +394,9 @@
       'mac-upload-perfetto': 'release_bot_perfetto_zlib',
       'Win ASan Release Media (reclient shadow)': 'asan_fuzzer_v8_heap_chrome_with_codecs_release_bot_reclient',
       'Win ASan Release (reclient shadow)': 'asan_fuzzer_v8_heap_release_bot_reclient',
-      'win-annotator-rel': 'release_bot',
+      'win-annotator-rel': 'release_bot_reclient',
       'win-celab-builder-rel': 'release_bot_minimal_symbols',
-      'win-backuprefptr-x86-fyi-rel': 'release_trybot_backuprefptr_x86',
+      'win-backuprefptr-x86-fyi-rel': 'release_trybot_backuprefptr_x86_reclient',
       'win-backuprefptr-x64-fyi-rel': 'release_trybot_backuprefptr_x64',
       'win-pixel-builder-rel': 'release_bot',
       'win-upload-perfetto': 'release_bot_perfetto_zlib',
@@ -478,7 +478,7 @@
       'GPU Mac Builder (dbg)': 'gpu_tests_debug_bot',
       'GPU Linux Builder': 'gpu_tests_release_trybot_minimal_symbols_reclient',
       'GPU Linux Builder (dbg)': 'gpu_tests_debug_bot_reclient',
-      'GPU Win x64 Builder': 'gpu_tests_release_bot_dcheck_always_on_resource_allowlisting',
+      'GPU Win x64 Builder': 'gpu_tests_release_bot_dcheck_always_on_resource_allowlisting_reclient',
       'GPU Win x64 Builder Code Coverage': 'gpu_tests_release_trybot_resource_allowlisting_code_coverage',
       'GPU Win x64 Builder (dbg)': 'gpu_tests_debug_bot_reclient',
       'Android Release (Nexus 5X)': 'gpu_tests_android_release_bot_dcheck_always_on_arm64_fastbuild_reclient',
@@ -577,7 +577,7 @@
       'WebKit Linux MSAN': 'msan_release_bot_blink_reclient',
       'android-asan': 'android_clang_asan_release_bot_reclient',
       'linux-ubsan-vptr': 'ubsan_vptr_release_bot_reclient',
-      'win-asan': 'asan_clang_fuzzer_static_v8_heap_minimal_symbols_release',
+      'win-asan': 'asan_clang_fuzzer_static_v8_heap_minimal_symbols_release_reclient',
     },
 
     'chromium.mojo': {
@@ -627,8 +627,8 @@
       'Linux Builder reclient test': 'gpu_tests_release_bot_reclient',
       'Win x64 Builder reclient staging': 'gpu_tests_release_bot_minimal_symbols_reclient',
       'Win x64 Builder reclient test': 'gpu_tests_release_bot_minimal_symbols_reclient',
-      'Simple Chrome Builder reclient staging': 'chromeos_arm-generic_reclient',
-      'Simple Chrome Builder reclient test': 'chromeos_arm-generic_reclient',
+      'Simple Chrome Builder reclient staging': 'chromeos_amd64-generic_use_fake_dbus_clients_reclient',
+      'Simple Chrome Builder reclient test': 'chromeos_amd64-generic_use_fake_dbus_clients_reclient',
     },
 
     'chromium.rust': {
@@ -644,12 +644,12 @@
       'linux-swangle-tot-swiftshader-x64': 'angle_deqp_release_trybot_reclient',
       'linux-swangle-x64': 'angle_deqp_release_trybot_reclient',
       'mac-swangle-chromium-x64': 'gpu_tests_release_trybot_minimal_symbols',
-      'win-swangle-chromium-x86': 'gpu_tests_release_trybot_minimal_symbol_x86_resource_allowlisting',
+      'win-swangle-chromium-x86': 'gpu_tests_release_trybot_minimal_symbol_x86_resource_allowlisting_reclient',
       'win-swangle-tot-angle-x64': 'angle_deqp_release_trybot',
-      'win-swangle-tot-angle-x86': 'angle_deqp_release_bot_dcheck_always_on_x86',
-      'win-swangle-tot-swiftshader-x64': 'angle_deqp_release_trybot',
+      'win-swangle-tot-angle-x86': 'angle_deqp_release_bot_dcheck_always_on_x86_reclient',
+      'win-swangle-tot-swiftshader-x64': 'angle_deqp_release_trybot_reclient',
       'win-swangle-tot-swiftshader-x86': 'angle_deqp_release_bot_dcheck_always_on_x86',
-      'win-swangle-x64': 'angle_deqp_release_trybot',
+      'win-swangle-x64': 'angle_deqp_release_trybot_reclient',
       'win-swangle-x86': 'angle_deqp_release_bot_dcheck_always_on_x86',
     },
 
@@ -717,9 +717,9 @@
       'mac-updater-builder-dbg': 'updater_debug_bot',
       'mac-updater-builder-rel': 'updater_release_bot',
       'win-updater-builder-dbg': 'updater_debug_bot',
-      'win-updater-builder-rel': 'updater_release_bot',
+      'win-updater-builder-rel': 'updater_release_bot_reclient',
       'win32-updater-builder-dbg': 'updater_debug_bot_x86',
-      'win32-updater-builder-rel': 'updater_release_bot_x86',
+      'win32-updater-builder-rel': 'updater_release_bot_x86_reclient',
     },
 
     # TODO(crbug.com/818301): This group is going away.
@@ -756,7 +756,7 @@
       # Windows bots take too long to link w/ full symbols and time out.
       'Win Builder': 'gpu_tests_release_bot_x86_no_symbols_reclient',
       'Win Builder (dbg)': 'gpu_tests_debug_bot_x86_no_symbols_reclient',
-      'Win x64 Builder': 'gpu_tests_release_bot_minimal_symbols',
+      'Win x64 Builder': 'gpu_tests_release_bot_minimal_symbols_reclient',
       'Win x64 Builder Code Coverage': 'gpu_tests_release_bot_minimal_symbols_code_coverage',
       'Win x64 Builder (dbg)': 'gpu_tests_debug_bot_reclient',
       'Windows deterministic': 'release_bot_x86_minimal_symbols',
@@ -1733,6 +1733,10 @@
       'angle_deqp_tests', 'shared_release_bot_dcheck_always_on', 'x86',
     ],
 
+    'angle_deqp_release_bot_dcheck_always_on_x86_reclient': [
+      'angle_deqp_tests', 'shared_release_bot_dcheck_always_on_reclient', 'x86',
+    ],
+
     'angle_deqp_release_trybot': [
       'angle_deqp_tests', 'shared_release_bot_dcheck_always_on',
     ],
@@ -1778,6 +1782,10 @@
       'asan', 'fuzzer', 'static', 'v8_heap', 'minimal_symbols', 'release_bot',
     ],
 
+    'asan_clang_fuzzer_static_v8_heap_minimal_symbols_release_reclient': [
+      'asan', 'fuzzer', 'static', 'v8_heap', 'minimal_symbols', 'release_bot_reclient',
+    ],
+
     'asan_clang_fuzzer_static_v8_heap_minimal_symbols_release_tot': [
       'asan', 'clang_tot', 'fuzzer', 'static', 'v8_heap', 'minimal_symbols', 'release',
     ],
@@ -1986,10 +1994,6 @@
       'chromeos_device', 'arm-generic',
     ],
 
-    'chromeos_arm-generic_reclient': [
-      'chromeos_device_reclient', 'arm-generic',
-    ],
-
     'chromeos_arm64-generic_dchecks': [
       'chromeos_device', 'arm64-generic', 'dcheck_always_on',
     ],
@@ -2340,6 +2344,10 @@
       'debug_bot', 'x86',
     ],
 
+    'debug_bot_x86_reclient': [
+      'debug_bot_reclient', 'x86',
+    ],
+
     'debug_bot_x86_no_com_init_hooks_with_codecs': [
       'debug_bot', 'x86', 'no_com_init_hooks', 'chrome_with_codecs'
     ],
@@ -2595,8 +2603,8 @@
       'gpu_tests', 'release_trybot', 'mbi_mode_per_site_instance'
     ],
 
-    'gpu_tests_release_bot_dcheck_always_on_resource_allowlisting': [
-      'gpu_tests', 'release_trybot_minimal_symbols', 'resource_allowlisting',
+    'gpu_tests_release_bot_dcheck_always_on_resource_allowlisting_reclient': [
+      'gpu_tests', 'release_trybot_minimal_symbols_reclient', 'resource_allowlisting',
     ],
 
     'gpu_tests_release_trybot_resource_allowlisting': [
@@ -2635,6 +2643,10 @@
       'gpu_tests', 'release_trybot_minimal_symbols', 'x86', 'resource_allowlisting',
     ],
 
+    'gpu_tests_release_trybot_minimal_symbol_x86_resource_allowlisting_reclient': [
+      'gpu_tests', 'release_trybot_minimal_symbols_reclient', 'x86', 'resource_allowlisting',
+    ],
+
     'gpu_tests_release_trybot_no_symbols_mac_code_coverage': [
       'gpu_tests', 'release_trybot', 'no_symbols',
       'use_clang_coverage', 'partial_code_coverage_instrumentation'
@@ -3065,8 +3077,12 @@
       'updater_on_win_mac', 'release_bot',
     ],
 
-    'updater_release_bot_x86': [
-      'updater_on_win_mac', 'release_bot', 'x86',
+    'updater_release_bot_reclient': [
+      'updater_on_win_mac', 'release_bot_reclient',
+    ],
+
+    'updater_release_bot_x86_reclient': [
+      'updater_on_win_mac', 'release_bot_reclient', 'x86',
     ],
 
     'updater_release_trybot': [
@@ -3240,8 +3256,8 @@
       'release_trybot', 'disable_nacl',
     ],
 
-    'release_trybot_backuprefptr_x86': [
-      'release_trybot_minimal_symbols', 'backuprefptr', 'x86',
+    'release_trybot_backuprefptr_x86_reclient': [
+      'release_trybot_minimal_symbols_reclient', 'backuprefptr', 'x86',
     ],
 
     'release_trybot_backuprefptr_x64': [
diff --git a/tools/mb/mb_config_expectations/chromium.angle.json b/tools/mb/mb_config_expectations/chromium.angle.json
index c5fa390..653176d 100644
--- a/tools/mb/mb_config_expectations/chromium.angle.json
+++ b/tools/mb/mb_config_expectations/chromium.angle.json
@@ -97,7 +97,8 @@
       "is_debug": false,
       "proprietary_codecs": true,
       "symbol_level": 1,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "win-angle-chromium-x86-builder": {
@@ -119,7 +120,8 @@
       "is_component_build": true,
       "is_debug": false,
       "symbol_level": 1,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   }
 }
\ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json
index be54fbe3..e445461 100644
--- a/tools/mb/mb_config_expectations/chromium.fyi.json
+++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -1310,7 +1310,8 @@
       "dcheck_always_on": false,
       "is_component_build": false,
       "is_debug": false,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "win-backuprefptr-x64-fyi-rel": {
@@ -1336,7 +1337,8 @@
       "target_cpu": "x86",
       "use_allocator": "partition",
       "use_backup_ref_ptr": true,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "win-celab-builder-rel": {
diff --git a/tools/mb/mb_config_expectations/chromium.gpu.json b/tools/mb/mb_config_expectations/chromium.gpu.json
index 7e3c776..bbf4071 100644
--- a/tools/mb/mb_config_expectations/chromium.gpu.json
+++ b/tools/mb/mb_config_expectations/chromium.gpu.json
@@ -69,7 +69,8 @@
       "is_debug": false,
       "proprietary_codecs": true,
       "symbol_level": 1,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "GPU Win x64 Builder (dbg)": {
diff --git a/tools/mb/mb_config_expectations/chromium.json b/tools/mb/mb_config_expectations/chromium.json
index 0a7436ed..76b0e841 100644
--- a/tools/mb/mb_config_expectations/chromium.json
+++ b/tools/mb/mb_config_expectations/chromium.json
@@ -164,7 +164,8 @@
       "is_debug": true,
       "symbol_level": 1,
       "target_cpu": "x86",
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "win32-archive-rel": {
diff --git a/tools/mb/mb_config_expectations/chromium.memory.json b/tools/mb/mb_config_expectations/chromium.memory.json
index 62976b0..059e9671 100644
--- a/tools/mb/mb_config_expectations/chromium.memory.json
+++ b/tools/mb/mb_config_expectations/chromium.memory.json
@@ -153,7 +153,8 @@
       "is_component_build": false,
       "is_debug": false,
       "symbol_level": 1,
-      "use_goma": true,
+      "use_rbe": true,
+      "use_remoteexec": true,
       "v8_enable_verify_heap": true
     }
   }
diff --git a/tools/mb/mb_config_expectations/chromium.reclient.fyi.json b/tools/mb/mb_config_expectations/chromium.reclient.fyi.json
index ab83bd2..f5c9360 100644
--- a/tools/mb/mb_config_expectations/chromium.reclient.fyi.json
+++ b/tools/mb/mb_config_expectations/chromium.reclient.fyi.json
@@ -22,22 +22,24 @@
     }
   },
   "Simple Chrome Builder reclient staging": {
-    "args_file": "//build/args/chromeos/arm-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-vm.gni",
     "gn_args": {
       "dcheck_always_on": false,
       "is_chromeos_device": true,
       "ozone_platform_headless": true,
       "use_rbe": true,
+      "use_real_dbus_clients": false,
       "use_remoteexec": true
     }
   },
   "Simple Chrome Builder reclient test": {
-    "args_file": "//build/args/chromeos/arm-generic.gni",
+    "args_file": "//build/args/chromeos/amd64-generic-vm.gni",
     "gn_args": {
       "dcheck_always_on": false,
       "is_chromeos_device": true,
       "ozone_platform_headless": true,
       "use_rbe": true,
+      "use_real_dbus_clients": false,
       "use_remoteexec": true
     }
   },
diff --git a/tools/mb/mb_config_expectations/chromium.swangle.json b/tools/mb/mb_config_expectations/chromium.swangle.json
index ab7c0e3..a8d999f 100644
--- a/tools/mb/mb_config_expectations/chromium.swangle.json
+++ b/tools/mb/mb_config_expectations/chromium.swangle.json
@@ -65,7 +65,8 @@
       "proprietary_codecs": true,
       "symbol_level": 1,
       "target_cpu": "x86",
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "win-swangle-tot-angle-x64": {
@@ -86,7 +87,8 @@
       "is_debug": false,
       "symbol_level": 1,
       "target_cpu": "x86",
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "win-swangle-tot-swiftshader-x64": {
@@ -96,7 +98,8 @@
       "is_component_build": true,
       "is_debug": false,
       "symbol_level": 1,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "win-swangle-tot-swiftshader-x86": {
@@ -117,7 +120,8 @@
       "is_component_build": true,
       "is_debug": false,
       "symbol_level": 1,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "win-swangle-x86": {
diff --git a/tools/mb/mb_config_expectations/chromium.updater.json b/tools/mb/mb_config_expectations/chromium.updater.json
index 8b94373..cfdc550 100644
--- a/tools/mb/mb_config_expectations/chromium.updater.json
+++ b/tools/mb/mb_config_expectations/chromium.updater.json
@@ -32,7 +32,8 @@
       "enable_chromium_updater": true,
       "is_component_build": false,
       "is_debug": false,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "win32-updater-builder-dbg": {
@@ -52,7 +53,8 @@
       "is_component_build": false,
       "is_debug": false,
       "target_cpu": "x86",
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   }
 }
\ No newline at end of file
diff --git a/tools/mb/mb_config_expectations/chromium.win.json b/tools/mb/mb_config_expectations/chromium.win.json
index 52fed2a7..cd051043 100644
--- a/tools/mb/mb_config_expectations/chromium.win.json
+++ b/tools/mb/mb_config_expectations/chromium.win.json
@@ -32,7 +32,8 @@
       "is_debug": false,
       "proprietary_codecs": true,
       "symbol_level": 1,
-      "use_goma": true
+      "use_rbe": true,
+      "use_remoteexec": true
     }
   },
   "Win x64 Builder (dbg)": {
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index d7e1178..1482a69 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -54361,7 +54361,6 @@
   <int value="-474322576" label="disable-quick-unlock-pin"/>
   <int value="-473087416" label="DragTabsInTabletMode:enabled"/>
   <int value="-473052940" label="ContextualSearchLegacyHttpPolicy:enabled"/>
-  <int value="-472655983" label="AutofillDisplaceRemovedForms:enabled"/>
   <int value="-472477695" label="AutofillSaveCardImprovedUserConsent:enabled"/>
   <int value="-472014137" label="HomepageTile:disabled"/>
   <int value="-472013317" label="WebRTC-H264WithOpenH264FFmpeg:disabled"/>
@@ -54438,7 +54437,6 @@
   <int value="-415186532" label="AndroidSiteSettingsUIRefresh:enabled"/>
   <int value="-414900505" label="ScrollCapture:enabled"/>
   <int value="-413562235" label="MessagesForAndroidUpdatePassword:disabled"/>
-  <int value="-413273557" label="EcheSWAInBackground:disabled"/>
   <int value="-412736561" label="EnableZeroStateMixedTypesRanker:enabled"/>
   <int value="-412645531" label="AutofillTokenPrefixMatching:enabled"/>
   <int value="-410852857" label="ImprovedA2HS:disabled"/>
@@ -57443,7 +57441,6 @@
   <int value="1670161209" label="ClickToOpenPDFPlaceholder:enabled"/>
   <int value="1670799163" label="ChromeHomeShowGoogleGWhenUrlCleared:enabled"/>
   <int value="1671021713" label="AutofillImportDynamicForms:disabled"/>
-  <int value="1671384669" label="EcheSWAInBackground:enabled"/>
   <int value="1671985641" label="WebViewVulkan:enabled"/>
   <int value="1673185316" label="EarlyCodeCache:enabled"/>
   <int value="1673427566" label="ChromeHomeExpandButton:disabled"/>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml
index 1019505..325b6260 100644
--- a/tools/metrics/histograms/metadata/autofill/histograms.xml
+++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -1073,7 +1073,10 @@
 
 <histogram
     name="Autofill.ExtractNewForms.ShallowEqualityDiffersFromDeepEquality"
-    enum="FormDataEquality" expires_after="2022-09-30">
+    enum="FormDataEquality" expires_after="M102">
+  <obsolete>
+    The experiment has been launched in 04/2022.
+  </obsolete>
   <owner>evih@google.com</owner>
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -1233,8 +1236,10 @@
   </summary>
 </histogram>
 
-<histogram name="Autofill.FormCacheSize" units="forms"
-    expires_after="2022-07-31">
+<histogram name="Autofill.FormCacheSize" units="forms" expires_after="M102">
+  <obsolete>
+    The experiment has been launched in 04/2022.
+  </obsolete>
   <owner>evih@google.com</owner>
   <owner>schwering@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/compositing/histograms.xml b/tools/metrics/histograms/metadata/compositing/histograms.xml
index 7c51c15..8c64f0e3 100644
--- a/tools/metrics/histograms/metadata/compositing/histograms.xml
+++ b/tools/metrics/histograms/metadata/compositing/histograms.xml
@@ -318,6 +318,16 @@
   </summary>
 </histogram>
 
+<histogram name="Compositing.Display.DrmOverlayManager.FirstTestPageFlipPassed"
+    enum="Boolean" expires_after="2022-11-30">
+  <owner>khaslett@chromium.org</owner>
+  <owner>kylechar@chromium.org</owner>
+  <summary>
+    Logged zero or more times per frame, whether the first call to
+    HardwareDisplayController.TestPageFlip succeeded.
+  </summary>
+</histogram>
+
 <histogram name="Compositing.Display.DrmOverlayManager.TestPageFlipCount"
     units="units" expires_after="2022-06-30">
   <owner>khaslett@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/download/histograms.xml b/tools/metrics/histograms/metadata/download/histograms.xml
index db8dfb46..0c275b5 100644
--- a/tools/metrics/histograms/metadata/download/histograms.xml
+++ b/tools/metrics/histograms/metadata/download/histograms.xml
@@ -1102,11 +1102,11 @@
   <owner>chrome-safebrowsing-alerts@chromium.org</owner>
   <summary>
     This histogram is used to record the different actions and events associated
-    with the download shelf context menu on Linux, MacOS, and Windows.
-    Specifically, it records when the dropdown button was clicked as well when
-    DownloadCommands were enabled or executed. Each action or enable event is
-    only emitted once; as a result, it is safe to compute a ratio by dividing
-    enabled events by clicked events.
+    with the download shelf context menu on Linux, MacOS, and Windows. The menu
+    may also be shown on the download bubble. Specifically, it records when the
+    dropdown button was clicked as well when DownloadCommands were enabled or
+    executed. Each action or enable event is only emitted once; as a result, it
+    is safe to compute a ratio by dividing enabled events by clicked events.
   </summary>
 </histogram>
 
@@ -1124,10 +1124,11 @@
   <owner>drubery@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@chromium.org</owner>
   <summary>
-    A download warning was shown in the shelf. Note that some downloads may not
-    be shown on the shelf, e.g., if chrome://downloads is already open when the
-    download completes, or if an extension is using the downloads API. Grouped
-    by the type of danger. This histogram is logged on ChromeOS since M93.
+    A download warning was shown in the shelf/bubble. Note that some downloads
+    may not be shown on the shelf, e.g., if a download is not new, is transient,
+    or if the shelf is disabled by an extension using the Downloads API.
+    Similarly, the bubble also does not show transient downloads. Grouped by the
+    type of danger. This histogram is logged on ChromeOS since M93.
 
     This metric is used to populate a dashboard on go/crsb-site.
   </summary>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index 33c3323..0f51110 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -3495,6 +3495,21 @@
   </summary>
 </histogram>
 
+<histogram name="Conversions.SourceEligibleDataHostLifeTime" units="ms"
+    expires_after="2022-09-25">
+  <owner>linnan@chromium.org</owner>
+  <owner>johnidel@chromium.org</owner>
+  <owner>measurement-api-dev+metrics@google.com</owner>
+  <summary>
+    Records the time between the registration and completion of a data host that
+    is eligible to register a source. For trigger data hosts, the completion
+    time is when the trigger data is available for the data host. For source
+    data hosts, the completion time is after the final source data is available
+    for the data host. This can be used as an upper bound to determine the
+    amount of delay a trigger event may receive.
+  </summary>
+</histogram>
+
 <histogram name="Conversions.Storage.ClearDataWithFilterDuration" units="ms"
     expires_after="M105">
   <owner>johnidel@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/quota/histograms.xml b/tools/metrics/histograms/metadata/quota/histograms.xml
index 01b1eaf..b1f9246 100644
--- a/tools/metrics/histograms/metadata/quota/histograms.xml
+++ b/tools/metrics/histograms/metadata/quota/histograms.xml
@@ -143,7 +143,7 @@
 </histogram>
 
 <histogram name="Quota.NumberOfEvictedBucketsPerRound" units="units"
-    expires_after="2022-05-18">
+    expires_after="2023-04-04">
   <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>Number of evicted buckets per round.</summary>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 13cb24a..16bca9f 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -14,7 +14,7 @@
         },
         "mac": {
             "hash": "1cc3804e2587c96cce23081fad407b0c121480fb",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/da3eb18b5c1cdaab87292750c2c3dc4138b58874/trace_processor_shell"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/0a92a9dffef63341c1b7f214f67616cb2d9148cd/trace_processor_shell"
         },
         "mac_arm64": {
             "hash": "c0397e87456ad6c6a7aa0133e5b81c97adbab4ab",
@@ -22,7 +22,7 @@
         },
         "linux": {
             "hash": "9c2b871933160686f0e7c8d1d1f252f403655e7d",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/8933edf7ded6d06c0b0b57c5ce9aa47a8ac9e09b/trace_processor_shell"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/0a92a9dffef63341c1b7f214f67616cb2d9148cd/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/web_dev_style/js_checker.py b/tools/web_dev_style/js_checker.py
index 2fcf464..976ec1f2 100644
--- a/tools/web_dev_style/js_checker.py
+++ b/tools/web_dev_style/js_checker.py
@@ -79,9 +79,12 @@
     args += affected_js_files_paths
 
     from . import eslint
-    output = eslint.Run(os_path=os_path, args=args)
 
-    return [self.output_api.PresubmitError(output)] if output else []
+    try:
+      output = eslint.Run(os_path=os_path, args=args)
+    except RuntimeError as err:
+      return [self.output_api.PresubmitError(str(err))]
+    return []
 
   def VariableNameCheck(self, i, line):
     """See the style guide. http://goo.gl/eQiXVW"""
diff --git a/tools/web_dev_style/js_checker_eslint_test.py b/tools/web_dev_style/js_checker_eslint_test.py
index f20a1ea..6f7dc08 100755
--- a/tools/web_dev_style/js_checker_eslint_test.py
+++ b/tools/web_dev_style/js_checker_eslint_test.py
@@ -38,17 +38,16 @@
 
     checker = js_checker.JSChecker(input_api, MockOutputApi())
 
-    try:
-      # ESLint JSON warnings come from stdout without error return.
-      output = checker.RunEsLintChecks(input_api.AffectedFiles(),
-                                       format='json')[0]
-      json_error = str(output)
-    except RuntimeError as err:
-      # Extract ESLint's JSON error output from the error message.
-      message = str(err)
-      json_error = message[message.index('['):]
+    output = checker.RunEsLintChecks(input_api.AffectedFiles(),
+                                     format='json')[0]
 
-    return json.loads(json_error)[0].get('messages')
+    # Extract ESLint's error from the PresubmitError. This is added in
+    # third_party/node/node.py.
+    search_token = '\' failed\n'
+    json_start_index = output.message.index(search_token)
+    json_error_str = output.message[json_start_index + len(search_token):]
+    # ESLint's errors are in JSON format.
+    return json.loads(json_error_str)[0].get('messages')
 
   def _assertError(self, results, rule_id, line):
     self.assertEqual(1, len(results))
diff --git a/ui/gfx/render_text.cc b/ui/gfx/render_text.cc
index 865e05d6..62fbeb6 100644
--- a/ui/gfx/render_text.cc
+++ b/ui/gfx/render_text.cc
@@ -1238,7 +1238,11 @@
 }
 
 void RenderText::SetDisplayOffset(Vector2d offset) {
-  const int extra_content = GetContentWidth() - display_rect_.width();
+  // Use ClampedNumeric for extra content, as it can otherwise overflow during
+  // later operations if GetContentWidth() returns INT_MAX and
+  // display_rect_.width() is 0.
+  const base::ClampedNumeric<int> extra_content =
+      base::ClampedNumeric<int>(GetContentWidth()) - display_rect_.width();
   const int cursor_width = cursor_enabled_ ? 1 : 0;
 
   int min_offset = 0;
diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc
index 9e73b9c..57b5656 100644
--- a/ui/gfx/render_text_unittest.cc
+++ b/ui/gfx/render_text_unittest.cc
@@ -8562,7 +8562,7 @@
 #endif
 
 // This test case is a unit test version of the clusterfuzz issue found in
-// crbug.com/1298286. It fixes removes integer-overflow undefined behavior.
+// crbug.com/1298286, an integer-overflow undefined behavior.
 TEST_F(RenderTextTest, Clusterfuzz_Issue_1298286) {
   gfx::FontList::SetDefaultFontDescription("Arial, Times New Roman, 15px");
 
@@ -8591,4 +8591,29 @@
   EXPECT_EQ(0, substring_bounds[0].x());
 }
 
+// This test case is a unit test version of the clusterfuzz issue found in
+// crbug.com/1299054, an integer-overflow undefined behavior.
+TEST_F(RenderTextTest, Clusterfuzz_Issue_1299054) {
+  gfx::FontList::SetDefaultFontDescription("Arial, Times New Roman, 15px");
+
+  gfx::FontList font_list;
+  gfx::Rect field(-1334808765, font_list.GetHeight());
+
+  std::unique_ptr<gfx::RenderText> render_text =
+      gfx::RenderText::CreateRenderText();
+  render_text->SetFontList(font_list);
+  render_text->SetHorizontalAlignment(ALIGN_CENTER);
+  render_text->SetDirectionalityMode(DIRECTIONALITY_FROM_TEXT);
+  render_text->SetText(u"s:");
+  render_text->SetDisplayRect(field);
+  render_text->SetCursorEnabled(false);
+
+  gfx::test::RenderTextTestApi render_text_test_api(render_text.get());
+  render_text_test_api.SetGlyphWidth(1778384896);
+
+  const Vector2d& offset = render_text->GetUpdatedDisplayOffset();
+  EXPECT_EQ(0, offset.x());
+  EXPECT_EQ(0, offset.y());
+}
+
 }  // namespace gfx
diff --git a/ui/gtk/gtk_ui.cc b/ui/gtk/gtk_ui.cc
index eb424eb..c037fa8d 100644
--- a/ui/gtk/gtk_ui.cc
+++ b/ui/gtk/gtk_ui.cc
@@ -502,10 +502,13 @@
 }
 
 ui::NativeTheme* GtkUi::GetNativeTheme(aura::Window* window) const {
-  return (use_system_theme_callback_.is_null() ||
-          use_system_theme_callback_.Run(window))
-             ? native_theme_
-             : ui::NativeTheme::GetInstanceForNativeUi();
+  return GetNativeTheme(use_system_theme_callback_.is_null() ||
+                        use_system_theme_callback_.Run(window));
+}
+
+ui::NativeTheme* GtkUi::GetNativeTheme(bool use_system_theme) const {
+  return use_system_theme ? native_theme_
+                          : ui::NativeTheme::GetInstanceForNativeUi();
 }
 
 void GtkUi::SetUseSystemThemeCallback(UseSystemThemeCallback callback) {
diff --git a/ui/gtk/gtk_ui.h b/ui/gtk/gtk_ui.h
index a6ae2d4e..8e609b8 100644
--- a/ui/gtk/gtk_ui.h
+++ b/ui/gtk/gtk_ui.h
@@ -82,6 +82,7 @@
   SkColor GetInactiveSelectionFgColor() const override;
   base::TimeDelta GetCursorBlinkInterval() const override;
   ui::NativeTheme* GetNativeTheme(aura::Window* window) const override;
+  ui::NativeTheme* GetNativeTheme(bool use_system_theme) const override;
   void SetUseSystemThemeCallback(UseSystemThemeCallback callback) override;
   bool GetDefaultUsesSystemTheme() const override;
   gfx::Image GetIconForContentType(const std::string& content_type,
diff --git a/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc b/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc
index 6e339c7..a94d256 100644
--- a/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc
+++ b/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc
@@ -89,6 +89,19 @@
 
 DrmOverlayValidator::~DrmOverlayValidator() {}
 
+DrmOverlayPlane DrmOverlayValidator::MakeOverlayPlane(
+    const OverlaySurfaceCandidate& param,
+    std::vector<scoped_refptr<DrmFramebuffer>>& reusable_buffers,
+    size_t& total_allocated_memory_size) {
+  scoped_refptr<DrmFramebuffer> buffer = GetBufferForPageFlipTest(
+      window_, param, &reusable_buffers, &total_allocated_memory_size);
+
+  return DrmOverlayPlane(buffer, param.plane_z_order, param.transform,
+                         gfx::ToNearestRect(param.display_rect),
+                         param.crop_rect, !param.is_opaque,
+                         /*gpu_fence=*/nullptr);
+}
+
 OverlayStatusList DrmOverlayValidator::TestPageFlip(
     const OverlaySurfaceCandidateList& params,
     const DrmOverlayPlaneList& last_used_planes) {
@@ -96,8 +109,9 @@
   HardwareDisplayController* controller = window_->GetController();
   if (!controller) {
     // The controller is not yet installed.
-    for (auto& param : returns)
-      param = OVERLAY_STATUS_NOT;
+    for (auto& status : returns) {
+      status = OVERLAY_STATUS_NOT;
+    }
 
     return returns;
   }
@@ -106,55 +120,77 @@
   std::vector<scoped_refptr<DrmFramebuffer>> reusable_buffers;
   scoped_refptr<DrmDevice> drm = controller->GetDrmDevice();
 
-  for (const auto& plane : last_used_planes)
+  for (const auto& plane : last_used_planes) {
     reusable_buffers.push_back(plane.buffer);
+  }
 
   size_t total_allocated_memory_size = 0;
-  int test_page_flip_count = 0;
 
+  std::vector<size_t> plane_indices;
   for (size_t i = 0; i < params.size(); ++i) {
-    if (!params[i].overlay_handled) {
+    auto& param = params[i];
+    // Skip candidates that have already been disqualified.
+    if (!param.overlay_handled) {
       returns[i] = OVERLAY_STATUS_NOT;
       continue;
     }
 
-    scoped_refptr<DrmFramebuffer> buffer = GetBufferForPageFlipTest(
-        window_, params[i], &reusable_buffers, &total_allocated_memory_size);
-
-    DrmOverlayPlane plane(buffer, params[i].plane_z_order, params[i].transform,
-                          gfx::ToNearestRect(params[i].display_rect),
-                          params[i].crop_rect, !params[i].is_opaque,
-                          /*gpu_fence=*/nullptr);
-    test_list.push_back(std::move(plane));
-
-    bool result = false;
-    if (buffer) {
-      test_page_flip_count++;
-      base::ElapsedTimer timer;
-
-      result = controller->TestPageFlip(test_list);
-
-      auto time = timer.Elapsed();
-      static constexpr base::TimeDelta kMinTime = base::Microseconds(1);
-      static constexpr base::TimeDelta kMaxTime = base::Milliseconds(10);
-      static constexpr int kTimeBuckets = 50;
-      UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
-          "Compositing.Display.DrmOverlayManager.TestPageFlipUs", time,
-          kMinTime, kMaxTime, kTimeBuckets);
-    }
-
-    if (result) {
-      returns[i] = OVERLAY_STATUS_ABLE;
-    } else {
-      // If test failed here, platform cannot support this configuration
-      // with current combination of layers. This is usually the case when this
-      // plane has requested post processing capability which needs additional
-      // hardware resources and they might be already in use by other planes.
-      // For example this plane has requested scaling capabilities and all
-      // available scalars are already in use by other planes.
+    DrmOverlayPlane plane =
+        MakeOverlayPlane(param, reusable_buffers, total_allocated_memory_size);
+    if (!plane.buffer) {
       returns[i] = OVERLAY_STATUS_NOT;
-      test_list.pop_back();
+      continue;
     }
+
+    test_list.push_back(std::move(plane));
+    // We need to save the indices because we're skipping some planes.
+    plane_indices.push_back(i);
+  }
+
+  int test_page_flip_count = 0;
+
+  // Test the whole list, then gradually remove the last plane and retest until
+  // we have success, or no more planes to test.
+  while (!test_list.empty()) {
+    test_page_flip_count++;
+    base::ElapsedTimer timer;
+
+    bool test_result = controller->TestPageFlip(test_list);
+
+    auto time = timer.Elapsed();
+    static constexpr base::TimeDelta kMinTime = base::Microseconds(1);
+    static constexpr base::TimeDelta kMaxTime = base::Milliseconds(10);
+    static constexpr int kTimeBuckets = 50;
+    UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
+        "Compositing.Display.DrmOverlayManager.TestPageFlipUs", time, kMinTime,
+        kMaxTime, kTimeBuckets);
+
+    if (test_page_flip_count == 1) {
+      UMA_HISTOGRAM_BOOLEAN(
+          "Compositing.Display.DrmOverlayManager.FirstTestPageFlipPassed",
+          test_result);
+    }
+
+    if (test_result) {
+      break;
+    }
+
+    // If test failed here, platform cannot support this configuration
+    // with current combination of layers. This is usually the case when this
+    // plane has requested post processing capability which needs additional
+    // hardware resources and they might be already in use by other planes.
+    // For example this plane has requested scaling capabilities and all
+    // available scalars are already in use by other planes.
+
+    // Drop the last plane from the test list and set it to OVERLAY_STATUS_NOT.
+    returns[plane_indices.back()] = OVERLAY_STATUS_NOT;
+    plane_indices.pop_back();
+    test_list.pop_back();
+  }
+
+  // Set OVERLAY_STATUS_ABLE for all planes left in the test_list.
+  for (size_t index : plane_indices) {
+    returns[index] = OVERLAY_STATUS_ABLE;
   }
 
   UMA_HISTOGRAM_MEMORY_KB(
diff --git a/ui/ozone/platform/drm/gpu/drm_overlay_validator.h b/ui/ozone/platform/drm/gpu/drm_overlay_validator.h
index 5b410997..b7ccb7e 100644
--- a/ui/ozone/platform/drm/gpu/drm_overlay_validator.h
+++ b/ui/ozone/platform/drm/gpu/drm_overlay_validator.h
@@ -5,6 +5,8 @@
 #ifndef UI_OZONE_PLATFORM_DRM_GPU_DRM_OVERLAY_VALIDATOR_H_
 #define UI_OZONE_PLATFORM_DRM_GPU_DRM_OVERLAY_VALIDATOR_H_
 
+#include <vector>
+
 #include "base/containers/lru_cache.h"
 #include "ui/ozone/platform/drm/gpu/drm_overlay_plane.h"
 #include "ui/ozone/public/overlay_surface_candidate.h"
@@ -22,13 +24,23 @@
 
   ~DrmOverlayValidator();
 
-  // Tests if configurations |params| are compatible with |window_| and finds
+  // Tests if configurations of |params| are compatible with |window_| and finds
   // which of these configurations can be promoted to Overlay composition
-  // without failing the page flip. It expects |params| to be sorted by z_order.
+  // without failing the page flip.
+  // If the complete list of planes fails we will remove planes from the end of
+  // the test list one at a time. This means that |params| should always have
+  // the primary plane at the beginning of the list, and the rest should be
+  // sorted based on expected power gain, so less impactful planes are dropped
+  // first.
   OverlayStatusList TestPageFlip(const OverlaySurfaceCandidateList& params,
                                  const DrmOverlayPlaneList& last_used_planes);
 
  private:
+  DrmOverlayPlane MakeOverlayPlane(
+      const OverlaySurfaceCandidate& param,
+      std::vector<scoped_refptr<DrmFramebuffer>>& reusable_buffers,
+      size_t& total_allocated_memory_size);
+
   DrmWindow* const window_;  // Not owned.
 };
 
diff --git a/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc b/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
index 46aba3b..5a84f956 100644
--- a/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
+++ b/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
@@ -27,6 +27,7 @@
 #include "ui/ozone/platform/drm/gpu/hardware_display_controller.h"
 #include "ui/ozone/platform/drm/gpu/mock_drm_device.h"
 #include "ui/ozone/platform/drm/gpu/screen_manager.h"
+#include "ui/ozone/public/overlay_surface_candidate.h"
 
 namespace {
 
@@ -594,3 +595,100 @@
   for (const auto& param : returns)
     EXPECT_EQ(param, ui::OVERLAY_STATUS_ABLE);
 }
+
+class TestAtOnceDrmOverlayValidatorTest
+    : public DrmOverlayValidatorTest,
+      public testing::WithParamInterface<bool> {};
+
+TEST_F(DrmOverlayValidatorTest, FourCandidates_OneCommit) {
+  // Four planes.
+  CrtcState crtc_state = {.planes = {{.formats = {DRM_FORMAT_XRGB8888}},
+                                     {.formats = {DRM_FORMAT_XRGB8888}},
+                                     {.formats = {DRM_FORMAT_XRGB8888}},
+                                     {.formats = {DRM_FORMAT_XRGB8888}}}};
+  InitDrmStatesAndControllers({crtc_state});
+  int setup_commits = drm_->get_commit_count();
+
+  // Add two more overlay candidates.
+  auto param3 = overlay_params_.back();
+  auto param4 = overlay_params_.back();
+  overlay_params_.push_back(param3);
+  overlay_params_.push_back(param4);
+
+  std::vector<ui::OverlayStatus> returns = overlay_validator_->TestPageFlip(
+      overlay_params_, ui::DrmOverlayPlaneList());
+
+  // All planes promoted.
+  ASSERT_EQ(4u, returns.size());
+  EXPECT_EQ(returns[0], ui::OVERLAY_STATUS_ABLE);
+  EXPECT_EQ(returns[1], ui::OVERLAY_STATUS_ABLE);
+  EXPECT_EQ(returns[2], ui::OVERLAY_STATUS_ABLE);
+  EXPECT_EQ(returns[3], ui::OVERLAY_STATUS_ABLE);
+  // Only 1 commit was necessary.
+  EXPECT_EQ(drm_->get_commit_count() - setup_commits, 1);
+}
+
+TEST_F(DrmOverlayValidatorTest, FourCandidatesTwoPlanes_MoreThanOneCommit) {
+  // Only two planes.
+  CrtcState crtc_state = {.planes = {{.formats = {DRM_FORMAT_XRGB8888}},
+                                     {.formats = {DRM_FORMAT_XRGB8888}}}};
+  InitDrmStatesAndControllers({crtc_state});
+  int setup_commits = drm_->get_commit_count();
+
+  // Add two more overlay candidates.
+  auto param3 = overlay_params_.back();
+  auto param4 = overlay_params_.back();
+  overlay_params_.push_back(param3);
+  overlay_params_.push_back(param4);
+
+  std::vector<ui::OverlayStatus> returns = overlay_validator_->TestPageFlip(
+      overlay_params_, ui::DrmOverlayPlaneList());
+
+  // All planes promoted.
+  ASSERT_EQ(4u, returns.size());
+  EXPECT_EQ(returns[0], ui::OVERLAY_STATUS_ABLE);
+  EXPECT_EQ(returns[1], ui::OVERLAY_STATUS_ABLE);
+  EXPECT_EQ(returns[2], ui::OVERLAY_STATUS_NOT);
+  EXPECT_EQ(returns[3], ui::OVERLAY_STATUS_NOT);
+  // First attempted with all 4 planes, then 3, then 2.
+  EXPECT_EQ(drm_->get_commit_count() - setup_commits, 3);
+}
+
+TEST_F(DrmOverlayValidatorTest, TwoOfSixIgnored_OneCommit) {
+  // Six planes.
+  CrtcState crtc_state = {.planes = {{.formats = {DRM_FORMAT_XRGB8888}},
+                                     {.formats = {DRM_FORMAT_XRGB8888}},
+                                     {.formats = {DRM_FORMAT_XRGB8888}},
+                                     {.formats = {DRM_FORMAT_XRGB8888}},
+                                     {.formats = {DRM_FORMAT_XRGB8888}},
+                                     {.formats = {DRM_FORMAT_XRGB8888}}}};
+  InitDrmStatesAndControllers({crtc_state});
+  int setup_commits = drm_->get_commit_count();
+
+  auto param3 = overlay_params_.back();
+  auto param4 = overlay_params_.back();
+  auto param5 = overlay_params_.back();
+  auto param6 = overlay_params_.back();
+  // Candidate 3 and 5 are already disqualified.
+  param3.overlay_handled = false;
+  param5.overlay_handled = false;
+  overlay_params_.push_back(param3);
+  overlay_params_.push_back(param4);
+  overlay_params_.push_back(param5);
+  overlay_params_.push_back(param6);
+
+  std::vector<ui::OverlayStatus> returns = overlay_validator_->TestPageFlip(
+      overlay_params_, ui::DrmOverlayPlaneList());
+
+  ASSERT_EQ(6u, returns.size());
+  // Third and Fifth candidate were ignored.
+  EXPECT_EQ(returns[0], ui::OVERLAY_STATUS_ABLE);
+  EXPECT_EQ(returns[1], ui::OVERLAY_STATUS_ABLE);
+  EXPECT_EQ(returns[2], ui::OVERLAY_STATUS_NOT);
+  EXPECT_EQ(returns[3], ui::OVERLAY_STATUS_ABLE);
+  EXPECT_EQ(returns[4], ui::OVERLAY_STATUS_NOT);
+  EXPECT_EQ(returns[5], ui::OVERLAY_STATUS_ABLE);
+  // Only 1 commit was needed because the two unpromoted candidates were
+  // excluded before testing.
+  EXPECT_EQ(drm_->get_commit_count() - setup_commits, 1);
+}
diff --git a/ui/views/linux_ui/linux_ui.h b/ui/views/linux_ui/linux_ui.h
index e9b1f8a9..5f312e01 100644
--- a/ui/views/linux_ui/linux_ui.h
+++ b/ui/views/linux_ui/linux_ui.h
@@ -113,10 +113,12 @@
   virtual SkColor GetInactiveSelectionFgColor() const = 0;
   virtual base::TimeDelta GetCursorBlinkInterval() const = 0;
 
-  // Returns a NativeTheme that will provide system colors and draw system
-  // style widgets.
+  // Returns the NativeTheme that reflects the theme used by `window`.
   virtual ui::NativeTheme* GetNativeTheme(aura::Window* window) const = 0;
 
+  // Returns the classic or system NativeTheme depending on `use_system_theme`.
+  virtual ui::NativeTheme* GetNativeTheme(bool use_system_theme) const = 0;
+
   // Sets a callback that determines whether to use the system theme.
   virtual void SetUseSystemThemeCallback(UseSystemThemeCallback callback) = 0;
 
diff --git a/ui/webui/resources/BUILD.gn b/ui/webui/resources/BUILD.gn
index 5cc4aca8..3fc4c19b 100644
--- a/ui/webui/resources/BUILD.gn
+++ b/ui/webui/resources/BUILD.gn
@@ -172,8 +172,6 @@
   "cr_elements/cr_search_field/cr_search_field_behavior.d.ts",
   "cr_elements/cr_search_field/cr_search_field.d.ts",
   "cr_elements/cr_toggle/cr_toggle.m.d.ts",
-  "cr_elements/cr_toolbar/cr_toolbar.d.ts",
-  "cr_elements/cr_toolbar/cr_toolbar_search_field.d.ts",
   "cr_elements/find_shortcut_behavior.d.ts",
   "cr_elements/policy/cr_policy_indicator_behavior.m.d.ts",
   "cr_elements/policy/cr_policy_indicator.m.d.ts",
@@ -281,7 +279,9 @@
       "cr_elements/cr_tabs/cr_tabs.ts",
       "cr_elements/cr_toast/cr_toast.ts",
       "cr_elements/cr_toast/cr_toast_manager.ts",
+      "cr_elements/cr_toolbar/cr_toolbar_search_field.ts",
       "cr_elements/cr_toolbar/cr_toolbar_selection_overlay.ts",
+      "cr_elements/cr_toolbar/cr_toolbar.ts",
       "cr_elements/cr_view_manager/cr_view_manager.ts",
       "cr_elements/find_shortcut_mixin.ts",
       "cr_elements/mouse_hoverable_mixin.ts",
diff --git a/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.ts b/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.ts
index 7f38da6..78287ac7 100644
--- a/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.ts
+++ b/ui/webui/resources/cr_components/certificate_manager/ca_trust_edit_dialog.ts
@@ -104,6 +104,9 @@
           this.$.dialog.close();
         },
         error => {
+          if (error === null) {
+            return;
+          }
           this.$.dialog.close();
           this.dispatchEvent(new CustomEvent('certificates-error', {
             bubbles: true,
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.ts b/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.ts
index cd6bab7..17920f1 100644
--- a/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.ts
+++ b/ui/webui/resources/cr_components/certificate_manager/certificate_delete_confirmation_dialog.ts
@@ -100,6 +100,9 @@
               this.$.dialog.close();
             },
             error => {
+              if (error === null) {
+                return;
+              }
               this.$.dialog.close();
               this.dispatchEvent(new CustomEvent('certificates-error', {
                 bubbles: true,
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_list.ts b/ui/webui/resources/cr_components/certificate_manager/certificate_list.ts
index f2385da..e0e339be 100644
--- a/ui/webui/resources/cr_components/certificate_manager/certificate_list.ts
+++ b/ui/webui/resources/cr_components/certificate_manager/certificate_list.ts
@@ -118,8 +118,9 @@
       anchor: HTMLElement,
       error: CertificatesError|CertificatesImportError|null) {
     if (error === null) {
-      // Nothing to do here. Null indicates that the user clicked "cancel" on
-      // a native file chooser dialog.
+      // Nothing to do here. Null indicates that the user clicked "cancel" on a
+      // native file chooser dialog or that the request was ignored by the
+      // handler due to being received while another was still being processed.
       return;
     }
 
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_manager.html b/ui/webui/resources/cr_components/certificate_manager/certificate_manager.html
index c7f7d68..5003f3e 100644
--- a/ui/webui/resources/cr_components/certificate_manager/certificate_manager.html
+++ b/ui/webui/resources/cr_components/certificate_manager/certificate_manager.html
@@ -37,7 +37,7 @@
             certificate-type="[[certificateTypeEnum_.PERSONAL]]"
             import-allowed="[[clientImportAllowed]]">
         </certificate-list>
-<if expr="chromeos">
+<if expr="chromeos_ash">
         <certificate-provisioning-list></certificate-provisioning-list>
 </if>
       </div>
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_manager.ts b/ui/webui/resources/cr_components/certificate_manager/certificate_manager.ts
index 28b7d0a..9cb5f8a7 100644
--- a/ui/webui/resources/cr_components/certificate_manager/certificate_manager.ts
+++ b/ui/webui/resources/cr_components/certificate_manager/certificate_manager.ts
@@ -14,7 +14,7 @@
 import './certificate_password_decryption_dialog.js';
 import './certificate_password_encryption_dialog.js';
 import './certificates_error_dialog.js';
-// <if expr="chromeos">
+// <if expr="chromeos_ash">
 import './certificate_provisioning_list.js';
 // </if>
 
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_manager_types.ts b/ui/webui/resources/cr_components/certificate_manager/certificate_manager_types.ts
index 8efb772c..eafa981 100644
--- a/ui/webui/resources/cr_components/certificate_manager/certificate_manager_types.ts
+++ b/ui/webui/resources/cr_components/certificate_manager/certificate_manager_types.ts
@@ -7,7 +7,7 @@
  */
 
 // clang-format off
-// <if expr="chromeos">
+// <if expr="chromeos_ash">
 import {CertificateProvisioningProcess} from './certificate_provisioning_browser_proxy.js';
 // </if>
 import {CertificatesError, CertificatesImportError,CertificateSubnode, CertificateType, NewCertificateSubNode} from './certificates_browser_proxy.js';
@@ -47,7 +47,7 @@
  */
 export const CertificateActionEvent = 'certificate-action';
 
-// <if expr="chromeos">
+// <if expr="chromeos_ash">
 /**
  * The payload of the 'certificate-provisioning-view-details-action' event.
  */
@@ -69,7 +69,7 @@
   interface HTMLElementEventMap {
     'certificates-error': CustomEvent<CertificatesErrorEventDetail>;
     'certificate-action': CustomEvent<CertificateActionEventDetail>;
-    // <if expr="chromeos">
+    // <if expr="chromeos_ash">
     'certificate-provisioning-view-details-action':
         CustomEvent<CertificateProvisioningActionEventDetail>;
     // </if>
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.ts b/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.ts
index f4b7c95..c42db59 100644
--- a/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.ts
+++ b/ui/webui/resources/cr_components/certificate_manager/certificate_password_decryption_dialog.ts
@@ -67,6 +67,9 @@
               this.$.dialog.close();
             },
             error => {
+              if (error === null) {
+                return;
+              }
               this.$.dialog.close();
               this.dispatchEvent(new CustomEvent('certificates-error', {
                 bubbles: true,
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.ts b/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.ts
index bda1143..bf89a12a 100644
--- a/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.ts
+++ b/ui/webui/resources/cr_components/certificate_manager/certificate_password_encryption_dialog.ts
@@ -74,6 +74,9 @@
               this.$.dialog.close();
             },
             error => {
+              if (error === null) {
+                return;
+              }
               this.$.dialog.close();
               this.dispatchEvent(new CustomEvent('certificates-error', {
                 bubbles: true,
diff --git a/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.ts b/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.ts
index a9653fb..03f073a 100644
--- a/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.ts
+++ b/ui/webui/resources/cr_components/certificate_manager/certificate_subentry.ts
@@ -76,8 +76,9 @@
    */
   private onRejected_(error: CertificatesError|null) {
     if (error === null) {
-      // Nothing to do here. Null indicates that the user clicked "cancel" on
-      // the native file chooser dialog.
+      // Nothing to do here. Null indicates that the user clicked "cancel" on a
+      // native file chooser dialog or that the request was ignored by the
+      // handler due to being received while another was still being processed.
       return;
     }
 
diff --git a/ui/webui/resources/cr_components/managed_footnote/managed_footnote.ts b/ui/webui/resources/cr_components/managed_footnote/managed_footnote.ts
index ec533b4..9b63fa3 100644
--- a/ui/webui/resources/cr_components/managed_footnote/managed_footnote.ts
+++ b/ui/webui/resources/cr_components/managed_footnote/managed_footnote.ts
@@ -72,7 +72,7 @@
 
   /** @return Message to display to the user. */
   private getManagementString_(): string {
-    // <if expr="chromeos">
+    // <if expr="chromeos_ash">
     if (this.showDeviceInfo) {
       return this.i18nAdvanced('deviceManagedByOrg');
     }
diff --git a/ui/webui/resources/cr_elements/BUILD.gn b/ui/webui/resources/cr_elements/BUILD.gn
index 8a68d6f5..5824aff 100644
--- a/ui/webui/resources/cr_elements/BUILD.gn
+++ b/ui/webui/resources/cr_elements/BUILD.gn
@@ -173,8 +173,6 @@
     "cr_scrollable_behavior.m.js",
     "cr_search_field/cr_search_field.js",
     "cr_toggle/cr_toggle.m.js",
-    "cr_toolbar/cr_toolbar.js",
-    "cr_toolbar/cr_toolbar_search_field.js",
     "hidden_style_css.m.js",
     "icons.m.js",
     "md_select_css.m.js",
@@ -218,7 +216,9 @@
     "cr_tabs/cr_tabs.ts",
     "cr_toast/cr_toast.ts",
     "cr_toast/cr_toast_manager.ts",
+    "cr_toolbar/cr_toolbar_search_field.ts",
     "cr_toolbar/cr_toolbar_selection_overlay.ts",
+    "cr_toolbar/cr_toolbar.ts",
     "cr_view_manager/cr_view_manager.ts",
     "mwb_element_shared_style.ts",
     "mwb_shared_icons.ts",
@@ -261,7 +261,6 @@
     "cr_radio_group:closure_compile_module",
     "cr_search_field:closure_compile_module",
     "cr_toggle:closure_compile_module",
-    "cr_toolbar:closure_compile_module",
     "policy:closure_compile_module",
   ]
 
diff --git a/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html b/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html
index 087a2ad5..7d3109a 100644
--- a/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html
+++ b/ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html
@@ -151,7 +151,7 @@
     </style>
     <!-- TODO(crbug/1139958): Remove "not chromeos" block when chromeVox issue is fixed-->
     <!--Update both "not chromeos" and "chromeos" blocks if either changes-->
-<if expr="not chromeos">
+<if expr="not chromeos_ash">
     <dialog id="dialog" on-close="onNativeDialogClose_"
         on-cancel="onNativeDialogCancel_" part="dialog"
         aria-labelledby="title">
@@ -177,7 +177,7 @@
       </div>
     </dialog>
 </if>
-<if expr="chromeos">
+<if expr="chromeos_ash">
     <dialog id="dialog" on-close="onNativeDialogClose_"
         on-cancel="onNativeDialogCancel_" part="dialog">
     <!-- This wrapper is necessary, such that the "pulse" animation is not
diff --git a/ui/webui/resources/cr_elements/cr_fingerprint/BUILD.gn b/ui/webui/resources/cr_elements/cr_fingerprint/BUILD.gn
index d16e38bb..b274ec3 100644
--- a/ui/webui/resources/cr_elements/cr_fingerprint/BUILD.gn
+++ b/ui/webui/resources/cr_elements/cr_fingerprint/BUILD.gn
@@ -11,7 +11,10 @@
 }
 
 js_library("cr_fingerprint_progress_arc") {
-  deps = [ "../cr_lottie:cr_lottie" ]
+  deps = [
+    "../cr_lottie:cr_lottie",
+    "//third_party/polymer/v1_0/components-chromium/iron-icon:iron-icon-extracted",
+  ]
 }
 
 group("polymer3_elements") {
@@ -42,6 +45,7 @@
   sources = [ "$root_gen_dir/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.m.js" ]
   deps = [
     "../cr_lottie:cr_lottie.m",
+    "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
   ]
   extra_deps = [ ":cr_fingerprint_progress_arc_module" ]
diff --git a/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_icon.html b/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_icon.html
index 51f3543..7b7be357 100644
--- a/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_icon.html
+++ b/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_icon.html
@@ -4,19 +4,30 @@
 <iron-iconset-svg name="cr-fingerprint-icon" size="32">
   <svg>
     <defs>
-      <g id="enrollment-done" viewBox="0 0 93 104">
-        <path fill="#3E82F1" d="M75.346031,12.4513714 C65.426031,7.33637143 56.8487739,5.16637143 46.5674024,5.16637143 C36.3374024,5.16637143 26.6237739,7.595 17.7896596,12.4513714 C16.5487739,13.1227429 14.9987739,12.6577429 14.276031,11.4177429 C13.6046596,10.1777429 14.0696596,8.57637143 15.3096596,7.905 C24.9196596,2.68637143 35.4596596,0 46.5674024,0 C57.5732882,0 67.1824024,2.42774286 77.7232882,7.85274286 C79.0146596,8.525 79.4796596,10.075 78.8074024,11.315 C78.3424024,12.245 77.4646596,12.7613714 76.5346596,12.7613714 C76.121031,12.7613714 75.7074024,12.6577429 75.346031,12.4513714 Z">
+      <g id="fingerprint-scanned-dark" viewBox="0 0 93 104">
+        <path fill="#669df6" d="M75.346031,12.4513714 C65.426031,7.33637143 56.8487739,5.16637143 46.5674024,5.16637143 C36.3374024,5.16637143 26.6237739,7.595 17.7896596,12.4513714 C16.5487739,13.1227429 14.9987739,12.6577429 14.276031,11.4177429 C13.6046596,10.1777429 14.0696596,8.57637143 15.3096596,7.905 C24.9196596,2.68637143 35.4596596,0 46.5674024,0 C57.5732882,0 67.1824024,2.42774286 77.7232882,7.85274286 C79.0146596,8.525 79.4796596,10.075 78.8074024,11.315 C78.3424024,12.245 77.4646596,12.7613714 76.5346596,12.7613714 C76.121031,12.7613714 75.7074024,12.6577429 75.346031,12.4513714 Z">
         </path>
-        <path fill="#32A753" d="M1.10147387,39.4213714 C-0.0871547017,38.595 -0.344897559,36.9927429 0.480588155,35.805 C5.59647387,28.5713714 12.1055882,22.8877429 19.8555882,18.91 C36.0801024,10.54 56.8492167,10.4877429 73.1242167,18.8577429 C80.8742167,22.8363714 87.3851024,28.4677429 92.4992167,35.65 C93.3264739,36.7863714 93.0678453,38.44 91.8801024,39.2663714 C90.6914739,40.0927429 89.0892167,39.835 88.2628453,38.6463714 C83.6128453,32.1363714 77.7228453,27.0213714 70.7478453,23.4563714 C55.9192167,15.8613714 36.9578453,15.8613714 22.1805882,23.5077429 C15.1551024,27.125 9.26421673,32.2913714 4.61421673,38.8013714 C4.20147387,39.525 3.42647387,39.8863714 2.59921673,39.8863714 C2.0828453,39.8863714 1.56647387,39.7313714 1.10147387,39.4213714 Z">
+        <path fill="#5bb974" d="M1.10147387,39.4213714 C-0.0871547017,38.595 -0.344897559,36.9927429 0.480588155,35.805 C5.59647387,28.5713714 12.1055882,22.8877429 19.8555882,18.91 C36.0801024,10.54 56.8492167,10.4877429 73.1242167,18.8577429 C80.8742167,22.8363714 87.3851024,28.4677429 92.4992167,35.65 C93.3264739,36.7863714 93.0678453,38.44 91.8801024,39.2663714 C90.6914739,40.0927429 89.0892167,39.835 88.2628453,38.6463714 C83.6128453,32.1363714 77.7228453,27.0213714 70.7478453,23.4563714 C55.9192167,15.8613714 36.9578453,15.8613714 22.1805882,23.5077429 C15.1551024,27.125 9.26421673,32.2913714 4.61421673,38.8013714 C4.20147387,39.525 3.42647387,39.8863714 2.59921673,39.8863714 C2.0828453,39.8863714 1.56647387,39.7313714 1.10147387,39.4213714 Z">
         </path>
-        <path fill="#F9BB00" d="M33.0827567,101.473097 C28.5877567,96.9780971 26.1600139,94.0844686 22.6977567,87.8330971 C19.1327567,81.4780971 17.2727567,73.7280971 17.2727567,65.4094686 C17.2727567,50.0644686 30.3963853,37.5617257 46.5163853,37.5617257 C62.6354996,37.5617257 75.7600139,50.0644686 75.7600139,65.4094686 C75.7600139,66.8567257 74.6227567,67.9930971 73.1763853,67.9930971 C71.7300139,67.9930971 70.5927567,66.8567257 70.5927567,65.4094686 C70.5927567,52.9067257 59.7941282,42.7280971 46.5163853,42.7280971 C33.2377567,42.7280971 22.4391282,52.9067257 22.4391282,65.4094686 C22.4391282,72.8494686 24.0927567,79.7217257 27.2441282,85.3017257 C30.5513853,91.2430971 32.8241282,93.7744686 36.8027567,97.8044686 C37.7850139,98.8380971 37.7850139,100.439469 36.8027567,101.473097 C36.2350139,101.989469 35.5627567,102.248097 34.8913853,102.248097 C34.2191282,102.248097 33.5477567,101.989469 33.0827567,101.473097 Z">
+        <path fill="#fcc934" d="M33.0827567,101.473097 C28.5877567,96.9780971 26.1600139,94.0844686 22.6977567,87.8330971 C19.1327567,81.4780971 17.2727567,73.7280971 17.2727567,65.4094686 C17.2727567,50.0644686 30.3963853,37.5617257 46.5163853,37.5617257 C62.6354996,37.5617257 75.7600139,50.0644686 75.7600139,65.4094686 C75.7600139,66.8567257 74.6227567,67.9930971 73.1763853,67.9930971 C71.7300139,67.9930971 70.5927567,66.8567257 70.5927567,65.4094686 C70.5927567,52.9067257 59.7941282,42.7280971 46.5163853,42.7280971 C33.2377567,42.7280971 22.4391282,52.9067257 22.4391282,65.4094686 C22.4391282,72.8494686 24.0927567,79.7217257 27.2441282,85.3017257 C30.5513853,91.2430971 32.8241282,93.7744686 36.8027567,97.8044686 C37.7850139,98.8380971 37.7850139,100.439469 36.8027567,101.473097 C36.2350139,101.989469 35.5627567,102.248097 34.8913853,102.248097 C34.2191282,102.248097 33.5477567,101.989469 33.0827567,101.473097 Z">
         </path>
-        <path fill="#E74133" d="M55.9193939,88.0911057 C48.221651,82.8733629 43.6230224,74.3997343 43.6230224,65.4097343 C43.6230224,63.9633629 44.7593939,62.8261057 46.2057653,62.8261057 C47.6530224,62.8261057 48.7893939,63.9633629 48.7893939,65.4097343 C48.7893939,72.6947343 52.5093939,79.5661057 58.8130224,83.8033629 C62.4807653,86.2833629 66.7693939,87.4711057 71.9357653,87.4711057 C73.1757653,87.4711057 75.2421367,87.3161057 77.3093939,86.9547343 C78.7052796,86.6961057 80.0480224,87.6261057 80.3057653,89.0733629 C80.5643939,90.4683629 79.6343939,91.8111057 78.1880224,92.0697343 C75.2421367,92.6383629 72.6593939,92.6897343 71.9357653,92.6897343 C65.7880224,92.6897343 60.3630224,91.1397343 55.9193939,88.0911057 Z">
+        <path fill="#ea4335" d="M55.9193939,88.0911057 C48.221651,82.8733629 43.6230224,74.3997343 43.6230224,65.4097343 C43.6230224,63.9633629 44.7593939,62.8261057 46.2057653,62.8261057 C47.6530224,62.8261057 48.7893939,63.9633629 48.7893939,65.4097343 C48.7893939,72.6947343 52.5093939,79.5661057 58.8130224,83.8033629 C62.4807653,86.2833629 66.7693939,87.4711057 71.9357653,87.4711057 C73.1757653,87.4711057 75.2421367,87.3161057 77.3093939,86.9547343 C78.7052796,86.6961057 80.0480224,87.6261057 80.3057653,89.0733629 C80.5643939,90.4683629 79.6343939,91.8111057 78.1880224,92.0697343 C75.2421367,92.6383629 72.6593939,92.6897343 71.9357653,92.6897343 C65.7880224,92.6897343 60.3630224,91.1397343 55.9193939,88.0911057 Z">
         </path>
-        <path fill="#3E82F1" d="M60.8797482,103.229557 C52.6647482,100.955929 47.2911196,97.9081857 41.6597482,92.3795571 C34.4261196,85.1981857 30.4483767,75.6395571 30.4483767,65.4095571 C30.4483767,57.0395571 37.5783767,50.2195571 46.3611196,50.2195571 C55.1447482,50.2195571 62.2738624,57.0395571 62.2738624,65.4095571 C62.2738624,70.9381857 67.0797482,75.4331857 73.0211196,75.4331857 C78.962491,75.4331857 83.767491,70.9381857 83.767491,65.4095571 C83.767491,45.9309286 66.9761196,30.1218143 46.3097482,30.1218143 C31.6361196,30.1218143 18.2033767,38.2845571 12.157491,50.9431857 C10.142491,55.1281857 9.10974816,60.0359286 9.10974816,65.4095571 C9.10974816,69.4395571 9.47111958,75.7945571 12.5711196,84.0609286 C13.087491,85.4045571 12.4161196,86.9031857 11.0733767,87.3681857 C9.72974816,87.8845571 8.23111958,87.1609286 7.76611958,85.8695571 C5.23474816,79.1018143 3.99474816,72.3845571 3.99474816,65.4095571 C3.99474816,59.2095571 5.18249101,53.5781857 7.50749101,48.6695571 C14.3797482,34.2545571 29.6211196,24.9031857 46.3097482,24.9031857 C69.817491,24.9031857 88.9347482,43.0381857 88.9347482,65.3581857 C88.9347482,73.7281857 81.8047482,80.5481857 73.0211196,80.5481857 C64.237491,80.5481857 57.107491,73.7281857 57.107491,65.3581857 C57.107491,59.8295571 52.3033767,55.3345571 46.3611196,55.3345571 C40.4197482,55.3345571 35.6147482,59.8295571 35.6147482,65.3581857 C35.6147482,74.1931857 39.0238624,82.4595571 45.2761196,88.6595571 C50.1847482,93.5168143 54.8861196,96.2031857 62.1711196,98.2181857 C63.5661196,98.5795571 64.3411196,100.026814 63.9797482,101.369557 C63.7211196,102.558186 62.6361196,103.333186 61.5511196,103.333186 C61.3447482,103.333186 61.0861196,103.280929 60.8797482,103.229557 Z">
+        <path fill="#669df6" d="M60.8797482,103.229557 C52.6647482,100.955929 47.2911196,97.9081857 41.6597482,92.3795571 C34.4261196,85.1981857 30.4483767,75.6395571 30.4483767,65.4095571 C30.4483767,57.0395571 37.5783767,50.2195571 46.3611196,50.2195571 C55.1447482,50.2195571 62.2738624,57.0395571 62.2738624,65.4095571 C62.2738624,70.9381857 67.0797482,75.4331857 73.0211196,75.4331857 C78.962491,75.4331857 83.767491,70.9381857 83.767491,65.4095571 C83.767491,45.9309286 66.9761196,30.1218143 46.3097482,30.1218143 C31.6361196,30.1218143 18.2033767,38.2845571 12.157491,50.9431857 C10.142491,55.1281857 9.10974816,60.0359286 9.10974816,65.4095571 C9.10974816,69.4395571 9.47111958,75.7945571 12.5711196,84.0609286 C13.087491,85.4045571 12.4161196,86.9031857 11.0733767,87.3681857 C9.72974816,87.8845571 8.23111958,87.1609286 7.76611958,85.8695571 C5.23474816,79.1018143 3.99474816,72.3845571 3.99474816,65.4095571 C3.99474816,59.2095571 5.18249101,53.5781857 7.50749101,48.6695571 C14.3797482,34.2545571 29.6211196,24.9031857 46.3097482,24.9031857 C69.817491,24.9031857 88.9347482,43.0381857 88.9347482,65.3581857 C88.9347482,73.7281857 81.8047482,80.5481857 73.0211196,80.5481857 C64.237491,80.5481857 57.107491,73.7281857 57.107491,65.3581857 C57.107491,59.8295571 52.3033767,55.3345571 46.3611196,55.3345571 C40.4197482,55.3345571 35.6147482,59.8295571 35.6147482,65.3581857 C35.6147482,74.1931857 39.0238624,82.4595571 45.2761196,88.6595571 C50.1847482,93.5168143 54.8861196,96.2031857 62.1711196,98.2181857 C63.5661196,98.5795571 64.3411196,100.026814 63.9797482,101.369557 C63.7211196,102.558186 62.6361196,103.333186 61.5511196,103.333186 C61.3447482,103.333186 61.0861196,103.280929 60.8797482,103.229557 Z">
+        </path>
+      </g>
+      <g id="fingerprint-scanned-light" viewBox="0 0 93 104">
+        <path fill="#4285f4" d="M75.346031,12.4513714 C65.426031,7.33637143 56.8487739,5.16637143 46.5674024,5.16637143 C36.3374024,5.16637143 26.6237739,7.595 17.7896596,12.4513714 C16.5487739,13.1227429 14.9987739,12.6577429 14.276031,11.4177429 C13.6046596,10.1777429 14.0696596,8.57637143 15.3096596,7.905 C24.9196596,2.68637143 35.4596596,0 46.5674024,0 C57.5732882,0 67.1824024,2.42774286 77.7232882,7.85274286 C79.0146596,8.525 79.4796596,10.075 78.8074024,11.315 C78.3424024,12.245 77.4646596,12.7613714 76.5346596,12.7613714 C76.121031,12.7613714 75.7074024,12.6577429 75.346031,12.4513714 Z">
+        </path>
+        <path fill="#34a853" d="M1.10147387,39.4213714 C-0.0871547017,38.595 -0.344897559,36.9927429 0.480588155,35.805 C5.59647387,28.5713714 12.1055882,22.8877429 19.8555882,18.91 C36.0801024,10.54 56.8492167,10.4877429 73.1242167,18.8577429 C80.8742167,22.8363714 87.3851024,28.4677429 92.4992167,35.65 C93.3264739,36.7863714 93.0678453,38.44 91.8801024,39.2663714 C90.6914739,40.0927429 89.0892167,39.835 88.2628453,38.6463714 C83.6128453,32.1363714 77.7228453,27.0213714 70.7478453,23.4563714 C55.9192167,15.8613714 36.9578453,15.8613714 22.1805882,23.5077429 C15.1551024,27.125 9.26421673,32.2913714 4.61421673,38.8013714 C4.20147387,39.525 3.42647387,39.8863714 2.59921673,39.8863714 C2.0828453,39.8863714 1.56647387,39.7313714 1.10147387,39.4213714 Z">
+        </path>
+        <path fill="#fbbc04" d="M33.0827567,101.473097 C28.5877567,96.9780971 26.1600139,94.0844686 22.6977567,87.8330971 C19.1327567,81.4780971 17.2727567,73.7280971 17.2727567,65.4094686 C17.2727567,50.0644686 30.3963853,37.5617257 46.5163853,37.5617257 C62.6354996,37.5617257 75.7600139,50.0644686 75.7600139,65.4094686 C75.7600139,66.8567257 74.6227567,67.9930971 73.1763853,67.9930971 C71.7300139,67.9930971 70.5927567,66.8567257 70.5927567,65.4094686 C70.5927567,52.9067257 59.7941282,42.7280971 46.5163853,42.7280971 C33.2377567,42.7280971 22.4391282,52.9067257 22.4391282,65.4094686 C22.4391282,72.8494686 24.0927567,79.7217257 27.2441282,85.3017257 C30.5513853,91.2430971 32.8241282,93.7744686 36.8027567,97.8044686 C37.7850139,98.8380971 37.7850139,100.439469 36.8027567,101.473097 C36.2350139,101.989469 35.5627567,102.248097 34.8913853,102.248097 C34.2191282,102.248097 33.5477567,101.989469 33.0827567,101.473097 Z">
+        </path>
+        <path fill="#ea4335" d="M55.9193939,88.0911057 C48.221651,82.8733629 43.6230224,74.3997343 43.6230224,65.4097343 C43.6230224,63.9633629 44.7593939,62.8261057 46.2057653,62.8261057 C47.6530224,62.8261057 48.7893939,63.9633629 48.7893939,65.4097343 C48.7893939,72.6947343 52.5093939,79.5661057 58.8130224,83.8033629 C62.4807653,86.2833629 66.7693939,87.4711057 71.9357653,87.4711057 C73.1757653,87.4711057 75.2421367,87.3161057 77.3093939,86.9547343 C78.7052796,86.6961057 80.0480224,87.6261057 80.3057653,89.0733629 C80.5643939,90.4683629 79.6343939,91.8111057 78.1880224,92.0697343 C75.2421367,92.6383629 72.6593939,92.6897343 71.9357653,92.6897343 C65.7880224,92.6897343 60.3630224,91.1397343 55.9193939,88.0911057 Z">
+        </path>
+        <path fill="#4285f4" d="M60.8797482,103.229557 C52.6647482,100.955929 47.2911196,97.9081857 41.6597482,92.3795571 C34.4261196,85.1981857 30.4483767,75.6395571 30.4483767,65.4095571 C30.4483767,57.0395571 37.5783767,50.2195571 46.3611196,50.2195571 C55.1447482,50.2195571 62.2738624,57.0395571 62.2738624,65.4095571 C62.2738624,70.9381857 67.0797482,75.4331857 73.0211196,75.4331857 C78.962491,75.4331857 83.767491,70.9381857 83.767491,65.4095571 C83.767491,45.9309286 66.9761196,30.1218143 46.3097482,30.1218143 C31.6361196,30.1218143 18.2033767,38.2845571 12.157491,50.9431857 C10.142491,55.1281857 9.10974816,60.0359286 9.10974816,65.4095571 C9.10974816,69.4395571 9.47111958,75.7945571 12.5711196,84.0609286 C13.087491,85.4045571 12.4161196,86.9031857 11.0733767,87.3681857 C9.72974816,87.8845571 8.23111958,87.1609286 7.76611958,85.8695571 C5.23474816,79.1018143 3.99474816,72.3845571 3.99474816,65.4095571 C3.99474816,59.2095571 5.18249101,53.5781857 7.50749101,48.6695571 C14.3797482,34.2545571 29.6211196,24.9031857 46.3097482,24.9031857 C69.817491,24.9031857 88.9347482,43.0381857 88.9347482,65.3581857 C88.9347482,73.7281857 81.8047482,80.5481857 73.0211196,80.5481857 C64.237491,80.5481857 57.107491,73.7281857 57.107491,65.3581857 C57.107491,59.8295571 52.3033767,55.3345571 46.3611196,55.3345571 C40.4197482,55.3345571 35.6147482,59.8295571 35.6147482,65.3581857 C35.6147482,74.1931857 39.0238624,82.4595571 45.2761196,88.6595571 C50.1847482,93.5168143 54.8861196,96.2031857 62.1711196,98.2181857 C63.5661196,98.5795571 64.3411196,100.026814 63.9797482,101.369557 C63.7211196,102.558186 62.6361196,103.333186 61.5511196,103.333186 C61.3447482,103.333186 61.0861196,103.280929 60.8797482,103.229557 Z">
         </path>
       </g>
     </defs>
   </svg>
 </iron-iconset-svg>
-
diff --git a/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html b/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html
index e618f0f..a83d498 100644
--- a/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html
+++ b/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.html
@@ -1,3 +1,4 @@
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-media-query/iron-media-query.html">
 <link rel="import" href="../../html/polymer.html">
 <link rel="import" href="cr_fingerprint_icon.html">
@@ -26,7 +27,7 @@
         position: absolute;
       }
 
-      #enrollmentDone {
+      #fingerprintScanned {
         position: absolute;
       }
     </style>
@@ -39,9 +40,7 @@
       <cr-lottie id="scanningAnimation" aria-hidden="true"
           autoplay="[[autoplay]]">
       </cr-lottie>
-      <iron-icon id="enrollmentDone" icon="cr-fingerprint-icon:enrollment-done"
-          hidden>
-      </iron-icon>
+      <iron-icon id="fingerprintScanned" hidden></iron-icon>
     </div>
   </template>
   <script src="cr_fingerprint_progress_arc.js"></script>
diff --git a/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js b/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js
index 694fed7..bd1a0a9 100644
--- a/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js
+++ b/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.js
@@ -2,6 +2,22 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+/**
+ * The dark-mode fingerprint icon displayed temporarily each time a user scans
+ * their fingerprint and persistently once the enrollment process is complete.
+ * @type {string}
+ */
+/* #export */ const FINGERPRINT_SCANNED_ICON_DARK =
+    'cr-fingerprint-icon:fingerprint-scanned-dark';
+
+/**
+ * The light-mode fingerprint icon displayed temporarily each time a user scans
+ * their fingerprint and persistently once the enrollment process is complete.
+ * @type {string}
+ */
+/* #export */ const FINGERPRINT_SCANNED_ICON_LIGHT =
+    'cr-fingerprint-icon:fingerprint-scanned-light';
+
 /** @type {string} */
 /* #export */ const FINGERPRINT_TICK_DARK_URL =
     'chrome://theme/IDR_FINGERPRINT_COMPLETE_TICK_DARK';
@@ -10,7 +26,6 @@
 /* #export */ const FINGERPRINT_TICK_LIGHT_URL =
     'chrome://theme/IDR_FINGERPRINT_COMPLETE_TICK';
 
-
 /**
  * The dark-mode color of the progress circle background: Google Grey 700.
  * @type {string}
@@ -175,11 +190,13 @@
     this.clearCanvas_();
     this.drawProgressCircle_(this.progressPercentDrawn_);
     this.updateAnimationAsset_();
+    this.updateIconAsset_();
   },
 
   /** @override */
   attached() {
     this.scale_ = this.circleRadius / DEFAULT_PROGRESS_CIRCLE_RADIUS;
+    this.updateIconAsset_();
     this.updateImages_();
   },
 
@@ -193,7 +210,7 @@
     this.isComplete_ = false;
     // Draw an empty background for the progress circle.
     this.drawProgressCircle_(/** currentPercent = */ 0);
-    this.$.enrollmentDone.hidden = true;
+    this.$.fingerprintScanned.hidden = true;
 
     const scanningAnimation =
         /** @type {CrLottieElement|HTMLElement} */ (this.$.scanningAnimation);
@@ -345,6 +362,18 @@
         'chrome://theme/IDR_FINGERPRINT_ICON_ANIMATION';
   },
 
+  /**
+   * Updates the fingerprint-scanned icon based on whether dark mode is enabled.
+   * @private
+   */
+  updateIconAsset_() {
+    const fingerprintScanned =
+        /** @type {IronIconElement} */ (this.$.fingerprintScanned);
+    fingerprintScanned.icon = this.isDarkModeActive_ ?
+        FINGERPRINT_SCANNED_ICON_DARK :
+        FINGERPRINT_SCANNED_ICON_LIGHT;
+  },
+
   /*
    * Cleans up any pending animation update created by setInterval().
    * @private
@@ -372,7 +401,7 @@
     scanningAnimation.classList.remove('translucent');
     this.updateAnimationAsset_();
     this.resizeCheckMark_(scanningAnimation);
-    this.$.enrollmentDone.hidden = false;
+    this.$.fingerprintScanned.hidden = false;
   },
 
   /**
@@ -380,9 +409,9 @@
    * @private
    */
   animateScanProgress_() {
-    this.$.enrollmentDone.hidden = false;
+    this.$.fingerprintScanned.hidden = false;
     this.updateTimerId_ = window.setTimeout(() => {
-      this.$.enrollmentDone.hidden = true;
+      this.$.fingerprintScanned.hidden = true;
     }, FINGERPRINT_SCAN_SUCCESS_MS);
   },
 
@@ -404,7 +433,7 @@
     this.resizeAndCenterIcon_(
         /** @type {!HTMLElement} */ (this.$.scanningAnimation));
     this.resizeAndCenterIcon_(
-        /** @type {!HTMLElement} */ (this.$.enrollmentDone));
+        /** @type {!HTMLElement} */ (this.$.fingerprintScanned));
   },
 
   /**
diff --git a/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.m.d.ts b/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.m.d.ts
index 9f00c9c..520df02 100644
--- a/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.m.d.ts
+++ b/ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc.m.d.ts
@@ -3,8 +3,11 @@
 // found in the LICENSE file.
 
 import {CrLottieElement} from 'chrome://resources/cr_elements/cr_lottie/cr_lottie.m.js';
+import {IronIconElement} from 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import {LegacyElementMixin} from 'chrome://resources/polymer/v3_0/polymer/lib/legacy/legacy-element-mixin.js';
 
+export const FINGERPRINT_SCANNED_ICON_DARK: string;
+export const FINGERPRINT_SCANNED_ICON_LIGHT: string;
 export const FINGERPRINT_TICK_DARK_URL: string;
 export const FINGERPRINT_TICK_LIGHT_URL: string;
 export const PROGRESS_CIRCLE_BACKGROUND_COLOR_DARK: string;
@@ -24,6 +27,7 @@
   isComplete(): boolean;
   $: {
     canvas: HTMLCanvasElement,
+    fingerprintScanned: IronIconElement,
     scanningAnimation: CrLottieElement,
   };
 }
diff --git a/ui/webui/resources/cr_elements/cr_search_field/cr_search_field_behavior.js b/ui/webui/resources/cr_elements/cr_search_field/cr_search_field_behavior.js
index 344b979bc..5b3387c7 100644
--- a/ui/webui/resources/cr_elements/cr_search_field/cr_search_field_behavior.js
+++ b/ui/webui/resources/cr_elements/cr_search_field/cr_search_field_behavior.js
@@ -9,11 +9,13 @@
  */
 export const CrSearchFieldBehavior = {
   properties: {
+    // Prompt text to display in the search field.
     label: {
       type: String,
       value: '',
     },
 
+    // Tooltip to display on the clear search button.
     clearLabel: {
       type: String,
       value: '',
@@ -48,10 +50,10 @@
   /**
    * Sets the value of the search field.
    * @param {string} value
-   * @param {boolean=} opt_noEvent Whether to prevent a 'search-changed' event
+   * @param {boolean=} noEvent Whether to prevent a 'search-changed' event
    *     firing for this change.
    */
-  setValue(value, opt_noEvent) {
+  setValue(value, noEvent) {
     const updated = this.updateEffectiveValue_(value);
     this.getSearchInput().value = this.effectiveValue_;
     if (!updated) {
@@ -64,7 +66,7 @@
     }
 
     this.onSearchTermInput();
-    if (!opt_noEvent) {
+    if (!noEvent) {
       this.fire('search-changed', this.effectiveValue_);
     }
   },
@@ -162,10 +164,10 @@
 
   /**
    * @param {string} value
-   * @param {boolean=} opt_noEvent Whether to prevent a 'search-changed' event
+   * @param {boolean=} noEvent Whether to prevent a 'search-changed' event
    *     firing for this change.
    */
-  setValue(value, opt_noEvent) {}
+  setValue(value, noEvent) {}
 
   onSearchTermSearch() {}
 
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn b/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn
index 394060d..df19a03 100644
--- a/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn
+++ b/ui/webui/resources/cr_elements/cr_toolbar/BUILD.gn
@@ -2,35 +2,12 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//third_party/closure_compiler/compile_js.gni")
 import("//tools/polymer/html_to_js.gni")
 
 html_to_js("web_components") {
   js_files = [
-    "cr_toolbar.js",
-    "cr_toolbar_search_field.js",
+    "cr_toolbar.ts",
+    "cr_toolbar_search_field.ts",
     "cr_toolbar_selection_overlay.ts",
   ]
 }
-
-js_type_check("closure_compile_module") {
-  is_polymer3 = true
-  deps = [
-    ":cr_toolbar",
-    ":cr_toolbar_search_field",
-  ]
-}
-
-js_library("cr_toolbar") {
-  deps = [
-    ":cr_toolbar_search_field",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-}
-
-js_library("cr_toolbar_search_field") {
-  deps = [
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field_behavior",
-  ]
-}
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.d.ts b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.d.ts
deleted file mode 100644
index 5d55c667..0000000
--- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.d.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {CrToolbarSearchFieldElement} from './cr_toolbar_search_field.js';
-
-interface CrToolbarElement extends HTMLElement {
-  alwaysShowLogo: boolean;
-  autofocus: boolean;
-  clearLabel: string;
-  menuLabel: string;
-  narrow: boolean;
-  narrowThreshold: number;
-  pageName: string;
-  searchPrompt: string;
-  showMenu: boolean;
-  showSearch: boolean;
-  spinnerActive: string;
-
-  focusMenuButton(): void;
-  getSearchField(): CrToolbarSearchFieldElement;
-  isMenuFocused(): boolean;
-}
-
-export {CrToolbarElement};
-
-declare global {
-  interface HTMLElementTagNameMap {
-    'cr-toolbar': CrToolbarElement;
-  }
-}
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.js b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.ts
similarity index 75%
rename from ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.js
rename to ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.ts
index 78c370d..ea35a01 100644
--- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.js
+++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.ts
@@ -8,11 +8,18 @@
 import '../icons.m.js';
 import '../shared_vars_css.m.js';
 import '//resources/polymer/v3_0/iron-media-query/iron-media-query.js';
+import './cr_toolbar_search_field.js';
 
 import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {CrToolbarSearchFieldElement} from './cr_toolbar_search_field.js';
 
+export interface CrToolbarElement {
+  $: {
+    search: CrToolbarSearchFieldElement,
+  };
+}
+
 export class CrToolbarElement extends PolymerElement {
   static get is() {
     return 'cr-toolbar';
@@ -76,7 +83,6 @@
         reflectToAttribute: true,
       },
 
-      /** @private */
       showingSearch_: {
         type: Boolean,
         reflectToAttribute: true,
@@ -84,13 +90,24 @@
     };
   }
 
-  /** @return {!CrToolbarSearchFieldElement} */
-  getSearchField() {
-    return /** @type {!CrToolbarSearchFieldElement} */ (this.$.search);
+  pageName: string;
+  searchPrompt: string;
+  clearLabel: string;
+  menuLabel: string;
+  spinnerActive: boolean;
+  showMenu: boolean;
+  showSearch: boolean;
+  override autofocus: boolean;
+  narrow: boolean;
+  narrowThreshold: number;
+  alwaysShowLogo: boolean;
+  private showingSearch_: boolean;
+
+  getSearchField(): CrToolbarSearchFieldElement {
+    return this.$.search;
   }
 
-  /** @private */
-  onMenuTap_() {
+  private onMenuTap_() {
     this.dispatchEvent(new CustomEvent(
         'cr-toolbar-menu-tap', {bubbles: true, composed: true}));
   }
@@ -99,17 +116,23 @@
     requestAnimationFrame(() => {
       // Wait for next animation frame in case dom-if has not applied yet and
       // added the menu button.
-      const menuButton = this.shadowRoot.querySelector('#menuButton');
+      const menuButton =
+          this.shadowRoot!.querySelector<HTMLElement>('#menuButton');
       if (menuButton) {
         menuButton.focus();
       }
     });
   }
 
-  /** @return {boolean} */
-  isMenuFocused() {
-    return Boolean(this.shadowRoot.activeElement) &&
-        this.shadowRoot.activeElement.id === 'menuButton';
+  isMenuFocused(): boolean {
+    return !!this.shadowRoot!.activeElement &&
+        this.shadowRoot!.activeElement.id === 'menuButton';
+  }
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'cr-toolbar': CrToolbarElement;
   }
 }
 
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.d.ts b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.d.ts
deleted file mode 100644
index ad25d4d..0000000
--- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.d.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2021 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {LegacyElementMixin} from 'chrome://resources/polymer/v3_0/polymer/lib/legacy/legacy-element-mixin.js';
-
-import {CrSearchFieldBehavior} from '../cr_search_field/cr_search_field_behavior.js';
-
-interface CrToolbarSearchFieldElement extends CrSearchFieldBehavior,
-                                              LegacyElementMixin, HTMLElement {
-  $: {
-    searchInput: HTMLInputElement,
-  };
-  narrow: boolean;
-  showingSearch: boolean;
-  autofocus: boolean;
-  label: string;
-  clearLabel: string;
-  spinnerActive: boolean;
-
-  getSearchInput(): HTMLInputElement;
-  isSearchFocused(): boolean;
-  showAndFocus(): void;
-  onSearchTermInput(): void;
-}
-
-export {CrToolbarSearchFieldElement};
-
-declare global {
-  interface HTMLElementTagNameMap {
-    'cr-toolbar-search-field': CrToolbarSearchFieldElement;
-  }
-}
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.ts
similarity index 62%
rename from ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js
rename to ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.ts
index ab80f76..8e2a5e67 100644
--- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js
+++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field.ts
@@ -9,19 +9,22 @@
 import '../shared_vars_css.m.js';
 import '//resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js';
 
-import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {DomIf, html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {CrSearchFieldBehavior, CrSearchFieldBehaviorInterface} from '../cr_search_field/cr_search_field_behavior.js';
+import {CrSearchFieldBehavior} from '../cr_search_field/cr_search_field_behavior.js';
 
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {CrSearchFieldBehaviorInterface}
- */
+export interface CrToolbarSearchFieldElement {
+  $: {
+    searchInput: HTMLInputElement,
+    spinnerTemplate: DomIf,
+  };
+}
+
 const CrToolbarSearchFieldElementBase =
-    mixinBehaviors(CrSearchFieldBehavior, PolymerElement);
+    mixinBehaviors(CrSearchFieldBehavior, PolymerElement) as
+    {new (): PolymerElement & CrSearchFieldBehavior};
 
-/** @polymer */
+
 export class CrToolbarSearchFieldElement extends
     CrToolbarSearchFieldElementBase {
   static get is() {
@@ -53,41 +56,37 @@
         reflectToAttribute: true,
       },
 
-      // Prompt text to display in the search field.
-      label: String,
-
-      // Tooltip to display on the clear search button.
-      clearLabel: String,
-
       // When true, show a loading spinner to indicate that the backend is
       // processing the search. Will only show if the search field is open.
       spinnerActive: {type: Boolean, reflectToAttribute: true},
 
-      /** @private */
       isSpinnerShown_: {
         type: Boolean,
         computed: 'computeIsSpinnerShown_(spinnerActive, showingSearch)'
       },
 
-      /** @private */
       searchFocused_: {type: Boolean, value: false},
     };
   }
 
-  /** @override */
-  ready() {
+  narrow: boolean;
+  showingSearch: boolean;
+  override autofocus: boolean;
+  spinnerActive: boolean;
+  private isSpinnerShown_: boolean;
+  private searchFocused_: boolean;
+
+  override ready() {
     super.ready();
 
     this.addEventListener('click', e => this.showSearch_(e));
   }
 
-  /** @return {!HTMLInputElement} */
-  getSearchInput() {
-    return /** @type {!HTMLInputElement} */ (this.$.searchInput);
+  override getSearchInput(): HTMLInputElement {
+    return this.$.searchInput;
   }
 
-  /** @return {boolean} */
-  isSearchFocused() {
+  isSearchFocused(): boolean {
     return this.searchFocused_;
   }
 
@@ -96,45 +95,29 @@
     this.focus_();
   }
 
-  onSearchTermInput() {
-    CrSearchFieldBehavior.onSearchTermInput.call(this);
+  override onSearchTermInput() {
+    super.onSearchTermInput();
     this.showingSearch = this.hasSearchText || this.isSearchFocused();
   }
 
-  /** @private */
-  onSearchIconClicked_() {
+  private onSearchIconClicked_() {
     this.dispatchEvent(new CustomEvent(
         'search-icon-clicked', {bubbles: true, composed: true}));
   }
 
-  /** @private */
-  focus_() {
+  private focus_() {
     this.getSearchInput().focus();
   }
 
-  /**
-   * @param {boolean} narrow
-   * @return {number}
-   * @private
-   */
-  computeIconTabIndex_(narrow) {
+  private computeIconTabIndex_(narrow: boolean): number {
     return narrow && !this.hasSearchText ? 0 : -1;
   }
 
-  /**
-   * @param {boolean} narrow
-   * @return {string}
-   * @private
-   */
-  computeIconAriaHidden_(narrow) {
+  private computeIconAriaHidden_(narrow: boolean): string {
     return Boolean(!narrow || this.hasSearchText).toString();
   }
 
-  /**
-   * @return {boolean}
-   * @private
-   */
-  computeIsSpinnerShown_() {
+  private computeIsSpinnerShown_(): boolean {
     const showSpinner = this.spinnerActive && this.showingSearch;
     if (showSpinner) {
       this.$.spinnerTemplate.if = true;
@@ -142,52 +125,36 @@
     return showSpinner;
   }
 
-  /** @private */
-  onInputFocus_() {
+  private onInputFocus_() {
     this.searchFocused_ = true;
   }
 
-  /** @private */
-  onInputBlur_() {
+  private onInputBlur_() {
     this.searchFocused_ = false;
     if (!this.hasSearchText) {
       this.showingSearch = false;
     }
   }
 
-  /** @private */
-  onSearchTermKeydown_(e) {
+  private onSearchTermKeydown_(e: KeyboardEvent) {
     if (e.key === 'Escape') {
       this.showingSearch = false;
     }
   }
 
-  /**
-   * @param {Event} e
-   * @private
-   */
-  showSearch_(e) {
-    if (e.target !== this.shadowRoot.querySelector('#clearSearch')) {
+  private showSearch_(e: Event) {
+    if (e.target !== this.shadowRoot!.querySelector('#clearSearch')) {
       this.showingSearch = true;
     }
   }
 
-  /**
-   * @param {Event} e
-   * @private
-   */
-  clearSearch_(e) {
+  private clearSearch_() {
     this.setValue('');
     this.focus_();
     this.spinnerActive = false;
   }
 
-  /**
-   * @param {boolean} current
-   * @param {boolean|undefined} previous
-   * @private
-   */
-  showingSearchChanged_(current, previous) {
+  private showingSearchChanged_(_current: boolean, previous?: boolean) {
     // Prevent unnecessary 'search-changed' event from firing on startup.
     if (previous === undefined) {
       return;
@@ -203,5 +170,11 @@
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    'cr-toolbar-search-field': CrToolbarSearchFieldElement;
+  }
+}
+
 customElements.define(
     CrToolbarSearchFieldElement.is, CrToolbarSearchFieldElement);
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field_externs.js b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field_externs.js
new file mode 100644
index 0000000..a30b85b
--- /dev/null
+++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar_search_field_externs.js
@@ -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.
+
+/* Minimal externs file provided for places in the code that
+ * still use JavaScript instead of TypeScript.
+ * @externs
+ */
+
+/** @interface */
+function CrSearchFieldBehaviorInterface() {}
+
+/**
+ * @param {string} value
+ * @param {boolean=} noEvent
+ */
+CrSearchFieldBehaviorInterface.prototype.setValue = function(value, noEvent) {};
+
+/**
+ * @constructor
+ * @extends {HTMLElement}
+ * @implements {CrSearchFieldBehaviorInterface}
+ */
+function CrToolbarSearchFieldElement() {}
+
+/** @return {!HTMLInputElement} */
+CrToolbarSearchFieldElement.prototype.getSearchInput = function() {};
+
+CrToolbarSearchFieldElement.prototype.showAndFocus = function() {};
+
+/** @return {boolean} */
+CrToolbarSearchFieldElement.prototype.isSearchFocused = function() {};
diff --git a/ui/webui/resources/cr_elements/icons.html b/ui/webui/resources/cr_elements/icons.html
index a97aae1..aee974d 100644
--- a/ui/webui/resources/cr_elements/icons.html
+++ b/ui/webui/resources/cr_elements/icons.html
@@ -30,7 +30,7 @@
       <g id="menu">
         <path d="M2 4h16v2H2zM2 9h16v2H2zM2 14h16v2H2z"></path>
       </g>
-      <if expr="chromeos">
+      <if expr="chromeos_ash">
         <g id="banner-warning">
           <path fill-rule="evenodd" clip-rule="evenodd"
             d="M9.13177 1.50386C9.51566 0.832046 10.4844 0.832046 10.8683 1.50386L18.8683 15.5039C19.2492 16.1705 18.7678 17 18 17H2.00001C1.23219 17 0.750823 16.1705 1.13177 15.5039L9.13177 1.50386ZM10 4.01556L3.72321 15H16.2768L10 4.01556ZM9 11H11V7H9V11ZM11 14H9V12H11V14Z">
@@ -80,7 +80,7 @@
       <g id="arrow-right">
         <path d="M10 7l5 5-5 5z"></path>
       </g>
-      <if expr="chromeos">
+      <if expr="chromeos_ash">
         <g id="bluetooth">
           <path
             d="M17.71 7.71L12 2h-1v7.59L6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 11 14.41V22h1l5.71-5.71-4.3-4.29 4.3-4.29zM13 5.83l1.88 1.88L13 9.59V5.83zm1.88 10.46L13 18.17v-3.76l1.88 1.88z">
@@ -160,7 +160,7 @@
       <g id="file-download">
         <path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"></path>
       </g>
-      <if expr="chromeos">
+      <if expr="chromeos_ash">
         <g id="folder-filled">
           <path d="M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"></path>
         </g>
@@ -233,7 +233,7 @@
           d="M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm0 10.99h7c-.53 4.12-3.28 7.79-7 8.94V12H5V6.3l7-3.11v8.8z">
         </path>
       </g>
-      <if expr="chromeos">
+      <if expr="chromeos_ash">
         <g id="sim-card-alert">
           <path
             d="M18 2h-8L4.02 8 4 20c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-5 15h-2v-2h2v2zm0-4h-2V8h2v5z">
diff --git a/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js b/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js
index 337252f..8ae242b 100644
--- a/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js
+++ b/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js
@@ -123,11 +123,11 @@
    * @param {!CrPolicyIndicatorType} type
    * @param {string} name The name associated with the indicator. See
    *     chrome.settingsPrivate.PrefObject.controlledByName
-   * @param {boolean=} opt_matches For RECOMMENDED only, whether the indicator
+   * @param {boolean=} matches For RECOMMENDED only, whether the indicator
    *     value matches the recommended value.
    * @return {string} The tooltip text for |type|.
    */
-  getIndicatorTooltip(type, name, opt_matches) {
+  getIndicatorTooltip(type, name, matches) {
     if (!window['CrPolicyStrings']) {
       return '';
     }  // Tooltips may not be defined, e.g. in OOBE.
@@ -148,9 +148,8 @@
       case CrPolicyIndicatorType.DEVICE_POLICY:
         return CrPolicyStrings.controlledSettingPolicy;
       case CrPolicyIndicatorType.RECOMMENDED:
-        return opt_matches ?
-            CrPolicyStrings.controlledSettingRecommendedMatches :
-            CrPolicyStrings.controlledSettingRecommendedDiffers;
+        return matches ? CrPolicyStrings.controlledSettingRecommendedMatches :
+                         CrPolicyStrings.controlledSettingRecommendedDiffers;
       case CrPolicyIndicatorType.PARENT:
         return CrPolicyStrings.controlledSettingParent;
       case CrPolicyIndicatorType.CHILD_RESTRICTION:
diff --git a/ui/webui/resources/js/assert.js b/ui/webui/resources/js/assert.js
index dc3be72..9fbbbe9 100644
--- a/ui/webui/resources/js/assert.js
+++ b/ui/webui/resources/js/assert.js
@@ -61,26 +61,26 @@
  * This code should only be hit in the case of serious programmer error or
  * unexpected input.
  *
- * @param {string=} opt_message A message to show when this is hit.
+ * @param {string=} message A message to show when this is hit.
  * @closurePrimitive {asserts.fail}
  */
-/* #export */ function assertNotReached(opt_message) {
-  assert(false, opt_message || 'Unreachable code hit');
+/* #export */ function assertNotReached(message) {
+  assert(false, message || 'Unreachable code hit');
 }
 
 /**
  * @param {*} value The value to check.
  * @param {function(new: T, ...)} type A user-defined constructor.
- * @param {string=} opt_message A message to show when this is hit.
+ * @param {string=} message A message to show when this is hit.
  * @return {T}
  * @template T
  */
-/* #export */ function assertInstanceof(value, type, opt_message) {
+/* #export */ function assertInstanceof(value, type, message) {
   // We don't use assert immediately here so that we avoid constructing an error
   // message if we don't have to.
   if (!(value instanceof type)) {
     assertNotReached(
-        opt_message ||
+        message ||
         'Value ' + value + ' is not a[n] ' + (type.name || typeof type));
   }
   return value;
diff --git a/ui/webui/resources/js/cr.js b/ui/webui/resources/js/cr.js
index e20029db..feaf427 100644
--- a/ui/webui/resources/js/cr.js
+++ b/ui/webui/resources/js/cr.js
@@ -126,11 +126,11 @@
    *     for.
    * @param {PropertyKind} kind The kind of property we are getting the
    *     setter for.
-   * @param {function(*, *):void=} opt_setHook A function to run after the
+   * @param {function(*, *):void=} setHook A function to run after the
    *     property is set, but before the propertyChange event is fired.
    * @return {function(*):void} The function to use as a setter.
    */
-  function getSetter(name, kind, opt_setHook) {
+  function getSetter(name, kind, setHook) {
     let attributeName;
     switch (kind) {
       case PropertyKind.JS:
@@ -139,8 +139,8 @@
           const oldValue = this[name];
           if (value !== oldValue) {
             this[privateName] = value;
-            if (opt_setHook) {
-              opt_setHook.call(this, value, oldValue);
+            if (setHook) {
+              setHook.call(this, value, oldValue);
             }
             dispatchPropertyChange(this, name, value, oldValue);
           }
@@ -156,8 +156,8 @@
             } else {
               this.setAttribute(attributeName, value);
             }
-            if (opt_setHook) {
-              opt_setHook.call(this, value, oldValue);
+            if (setHook) {
+              setHook.call(this, value, oldValue);
             }
             dispatchPropertyChange(this, name, value, oldValue);
           }
@@ -173,8 +173,8 @@
             } else {
               this.removeAttribute(attributeName);
             }
-            if (opt_setHook) {
-              opt_setHook.call(this, value, oldValue);
+            if (setHook) {
+              setHook.call(this, value, oldValue);
             }
             dispatchPropertyChange(this, name, value, oldValue);
           }
@@ -191,16 +191,14 @@
    * Object.defineProperty(). When the setter changes the value a property
    * change event with the type {@code name + 'Change'} is fired.
    * @param {string} name The name of the property.
-   * @param {PropertyKind=} opt_kind What kind of underlying storage to use.
-   * @param {function(*, *):void=} opt_setHook A function to run after the
+   * @param {PropertyKind=} kind What kind of underlying storage to use.
+   * @param {function(*, *):void=} setHook A function to run after the
    *     property is set, but before the propertyChange event is fired.
    */
-  function getPropertyDescriptor(name, opt_kind, opt_setHook) {
-    const kind = /** @type {PropertyKind} */ (opt_kind || PropertyKind.JS);
-
+  function getPropertyDescriptor(name, kind = PropertyKind.JS, setHook) {
     const desc = {
       get: getGetter(name, kind),
-      set: getSetter(name, kind, opt_setHook),
+      set: getSetter(name, kind, setHook),
     };
     return desc;
   }
@@ -221,17 +219,16 @@
    * Dispatches a simple event on an event target.
    * @param {!EventTarget} target The event target to dispatch the event on.
    * @param {string} type The type of the event.
-   * @param {boolean=} opt_bubbles Whether the event bubbles or not.
-   * @param {boolean=} opt_cancelable Whether the default action of the event
+   * @param {boolean=} bubbles Whether the event bubbles or not.
+   * @param {boolean=} cancelable Whether the default action of the event
    *     can be prevented. Default is true.
    * @return {boolean} If any of the listeners called {@code preventDefault}
    *     during the dispatch this will return false.
    */
-  function dispatchSimpleEvent(target, type, opt_bubbles, opt_cancelable) {
-    const e = new Event(type, {
-      bubbles: opt_bubbles,
-      cancelable: opt_cancelable === undefined || opt_cancelable
-    });
+  function dispatchSimpleEvent(target, type, bubbles, cancelable) {
+    const e = new Event(
+        type,
+        {bubbles: bubbles, cancelable: cancelable === undefined || cancelable});
     return target.dispatchEvent(e);
   }
 
@@ -424,7 +421,7 @@
       let returnValue = false;
       // TODO(https://crbug.com/1118190): grit conditionals do not work in many
       // WebUI tests.
-      // <if expr="chromeos">
+      // <if expr="chromeos_ash">
       returnValue = true;
       // </if>
       return returnValue;
@@ -435,7 +432,7 @@
       let returnValue = false;
       // TODO(https://crbug.com/1118190): grit conditionals do not work in many
       // WebUI tests.
-      // <if expr="lacros">
+      // <if expr="chromeos_lacros">
       returnValue = true;
       // </if>
       return returnValue;
diff --git a/ui/webui/resources/js/cr.m.js b/ui/webui/resources/js/cr.m.js
index 89fc368a..4d77234 100644
--- a/ui/webui/resources/js/cr.m.js
+++ b/ui/webui/resources/js/cr.m.js
@@ -32,17 +32,16 @@
  * Dispatches a simple event on an event target.
  * @param {!EventTarget} target The event target to dispatch the event on.
  * @param {string} type The type of the event.
- * @param {boolean=} opt_bubbles Whether the event bubbles or not.
- * @param {boolean=} opt_cancelable Whether the default action of the event
+ * @param {boolean=} bubbles Whether the event bubbles or not.
+ * @param {boolean=} cancelable Whether the default action of the event
  *     can be prevented. Default is true.
  * @return {boolean} If any of the listeners called {@code preventDefault}
  *     during the dispatch this will return false.
  */
-export function dispatchSimpleEvent(target, type, opt_bubbles, opt_cancelable) {
-  const e = new Event(type, {
-    bubbles: opt_bubbles,
-    cancelable: opt_cancelable === undefined || opt_cancelable
-  });
+export function dispatchSimpleEvent(target, type, bubbles, cancelable) {
+  const e = new Event(
+      type,
+      {bubbles: bubbles, cancelable: cancelable === undefined || cancelable});
   return target.dispatchEvent(e);
 }
 
@@ -204,7 +203,7 @@
 /** Whether this is the ChromeOS/ash web browser. */
 export const isChromeOS = (() => {
   let returnValue = false;
-  // <if expr="chromeos">
+  // <if expr="chromeos_ash">
   returnValue = true;
   // </if>
   return returnValue;
@@ -213,7 +212,7 @@
 /** Whether this is the ChromeOS/Lacros web browser. */
 export const isLacros = (() => {
   let returnValue = false;
-  // <if expr="lacros">
+  // <if expr="chromeos_lacros">
   returnValue = true;
   // </if>
   return returnValue;
@@ -302,11 +301,11 @@
  *     for.
  * @param {PropertyKind} kind The kind of property we are getting the
  *     setter for.
- * @param {function(*, *):void=} opt_setHook A function to run after the
+ * @param {function(*, *):void=} setHook A function to run after the
  *     property is set, but before the propertyChange event is fired.
  * @return {function(*):void} The function to use as a setter.
  */
-function getSetter(name, kind, opt_setHook) {
+function getSetter(name, kind, setHook) {
   let attributeName;
   switch (kind) {
     case PropertyKind.JS:
@@ -315,8 +314,8 @@
         const oldValue = this[name];
         if (value !== oldValue) {
           this[privateName] = value;
-          if (opt_setHook) {
-            opt_setHook.call(this, value, oldValue);
+          if (setHook) {
+            setHook.call(this, value, oldValue);
           }
           dispatchPropertyChange(this, name, value, oldValue);
         }
@@ -332,8 +331,8 @@
           } else {
             this.setAttribute(attributeName, value);
           }
-          if (opt_setHook) {
-            opt_setHook.call(this, value, oldValue);
+          if (setHook) {
+            setHook.call(this, value, oldValue);
           }
           dispatchPropertyChange(this, name, value, oldValue);
         }
@@ -349,8 +348,8 @@
           } else {
             this.removeAttribute(attributeName);
           }
-          if (opt_setHook) {
-            opt_setHook.call(this, value, oldValue);
+          if (setHook) {
+            setHook.call(this, value, oldValue);
           }
           dispatchPropertyChange(this, name, value, oldValue);
         }
@@ -365,15 +364,13 @@
  * Object.defineProperty(). When the setter changes the value a property change
  * event with the type {@code name + 'Change'} is fired.
  * @param {string} name The name of the property.
- * @param {PropertyKind=} opt_kind What kind of underlying storage to use.
- * @param {function(?, ?):void=} opt_setHook A function to run after the
+ * @param {PropertyKind=} kind What kind of underlying storage to use.
+ * @param {function(?, ?):void=} setHook A function to run after the
  *     property is set, but before the propertyChange event is fired.
  */
-export function getPropertyDescriptor(name, opt_kind, opt_setHook) {
-  const kind = /** @type {PropertyKind} */ (opt_kind || PropertyKind.JS);
-
+export function getPropertyDescriptor(name, kind = PropertyKind.JS, setHook) {
   return {
     get: getGetter(name, kind),
-    set: getSetter(name, kind, opt_setHook),
+    set: getSetter(name, kind, setHook),
   };
 }
diff --git a/ui/webui/resources/js/event_tracker.js b/ui/webui/resources/js/event_tracker.js
index 58bf1df..bc4a384 100644
--- a/ui/webui/resources/js/event_tracker.js
+++ b/ui/webui/resources/js/event_tracker.js
@@ -32,10 +32,9 @@
      * @param {!EventTarget} target The DOM target to add a listener to.
      * @param {string} eventType The type of event to subscribe to.
      * @param {EventListener|Function} listener The listener to add.
-     * @param {boolean=} opt_capture Whether to invoke during the capture phase.
+     * @param {boolean=} capture Whether to invoke during the capture phase.
      */
-    add(target, eventType, listener, opt_capture) {
-      const capture = !!opt_capture;
+    add(target, eventType, listener, capture = false) {
       const h = {
         target: target,
         eventType: eventType,
diff --git a/ui/webui/resources/js/i18n_behavior.js b/ui/webui/resources/js/i18n_behavior.js
index a22bd41..82ecf25 100644
--- a/ui/webui/resources/js/i18n_behavior.js
+++ b/ui/webui/resources/js/i18n_behavior.js
@@ -17,7 +17,7 @@
 
 /** @polymerBehavior */
 /* #export */ const I18nBehavior = {
-  // <if expr="chromeos">
+  // <if expr="chromeos_ash">
   // Dynamic locale changes are only relevant in ChromeOS OOBE/Login flows.
   // On other platforms Chrome process is restarted upon locale changes.
   // TODO(crbug.com/955194): move it to OobeI18nBehavior.
@@ -46,12 +46,12 @@
    * Returns a translated string where $1 to $9 are replaced by the given
    * values.
    * @param {string} id The ID of the string to translate.
-   * @param {...string} var_args Values to replace the placeholders $1 to $9
+   * @param {...string} varArgs Values to replace the placeholders $1 to $9
    *     in the string.
    * @return {string} A translated, substituted string.
    * @private
    */
-  i18nRaw_(id, var_args) {
+  i18nRaw_(id, varArgs) {
     return arguments.length === 1 ?
         loadTimeData.getString(id) :
         loadTimeData.getStringF.apply(loadTimeData, arguments);
@@ -63,11 +63,11 @@
    * Use with Polymer bindings that are *not* inner-h-t-m-l.
    * NOTE: This is not related to $i18n{foo} in HTML, see file overview.
    * @param {string} id The ID of the string to translate.
-   * @param {...string|number} var_args Values to replace the placeholders $1
+   * @param {...string|number} varArgs Values to replace the placeholders $1
    *     to $9 in the string.
    * @return {string} A translated, sanitized, substituted string.
    */
-  i18n(id, var_args) {
+  i18n(id, varArgs) {
     const rawString = this.i18nRaw_.apply(this, arguments);
     return parseHtmlSubset('<b>' + rawString + '</b>').firstChild.textContent;
   },
@@ -93,26 +93,26 @@
    * updates when |this.locale| changes.
    * @param {string} locale The UI language used.
    * @param {string} id The ID of the string to translate.
-   * @param {...string} var_args Values to replace the placeholders $1 to $9
+   * @param {...string} varArgs Values to replace the placeholders $1 to $9
    *     in the string.
    * @return {string} A translated, sanitized, substituted string.
    */
-  i18nDynamic(locale, id, var_args) {
+  i18nDynamic(locale, id, varArgs) {
     return this.i18n.apply(this, Array.prototype.slice.call(arguments, 1));
   },
 
   /**
-   * Similar to 'i18nDynamic', but var_args valus are interpreted as keys in
+   * Similar to 'i18nDynamic', but varArgs valus are interpreted as keys in
    * loadTimeData. This allows generation of strings that take other localized
    * strings as parameters.
    * @param {string} locale The UI language used.
    * @param {string} id The ID of the string to translate.
-   * @param {...string} var_args Values to replace the placeholders $1 to $9
+   * @param {...string} varArgs Values to replace the placeholders $1 to $9
    *     in the string. Values are interpreted as strings IDs if found in the
    *     list of localized strings.
    * @return {string} A translated, sanitized, substituted string.
    */
-  i18nRecursive(locale, id, var_args) {
+  i18nRecursive(locale, id, varArgs) {
     let args = Array.prototype.slice.call(arguments, 2);
     if (args.length > 0) {
       // Try to replace IDs with localized values.
@@ -137,22 +137,22 @@
 /** @interface */
 /* #export */ class I18nBehaviorInterface {
   constructor() {
-    // <if expr="chromeos">
+    // <if expr="chromeos_ash">
     /** @type {string} */
     this.locale;
     // </if>
   }
 
-  // <if expr="chromeos">
+  // <if expr="chromeos_ash">
   i18nUpdateLocale() {}
   // </if>
 
   /**
    * @param {string} id
-   * @param {...string|number} var_args
+   * @param {...string|number} varArgs
    * @return {string}
    */
-  i18n(id, var_args) {}
+  i18n(id, varArgs) {}
 
   /**
    * @param {string} id
@@ -164,18 +164,18 @@
   /**
    * @param {string} locale
    * @param {string} id
-   * @param {...string} var_args
+   * @param {...string} varArgs
    * @return {string}
    */
-  i18nDynamic(locale, id, var_args) {}
+  i18nDynamic(locale, id, varArgs) {}
 
   /**
    * @param {string} locale
    * @param {string} id
-   * @param {...string} var_args
+   * @param {...string} varArgs
    * @return {string}
    */
-  i18nRecursive(locale, id, var_args) {}
+  i18nRecursive(locale, id, varArgs) {}
 
   /**
    * @param {string} id
diff --git a/ui/webui/resources/js/i18n_behavior.m.d.ts b/ui/webui/resources/js/i18n_behavior.m.d.ts
index 1b74389..52fec9b 100644
--- a/ui/webui/resources/js/i18n_behavior.m.d.ts
+++ b/ui/webui/resources/js/i18n_behavior.m.d.ts
@@ -7,10 +7,10 @@
 export interface I18nBehavior {
   locale: string|null|undefined;
   i18nUpdateLocale(): void;
-  i18n(id: string, ...var_args: Array<string|number>): string;
+  i18n(id: string, ...varArgs: Array<string|number>): string;
   i18nAdvanced(id: string, opts?: SanitizeInnerHtmlOpts): string;
-  i18nDynamic(locale: string, id: string, ...var_args: string[]): string;
-  i18nRecursive(locale: string, id: string, ...var_args: string[]): string;
+  i18nDynamic(locale: string, id: string, ...varArgs: string[]): string;
+  i18nRecursive(locale: string, id: string, ...varArgs: string[]): string;
   i18nExists(id: string): boolean;
 }
 
diff --git a/ui/webui/resources/js/i18n_mixin.ts b/ui/webui/resources/js/i18n_mixin.ts
index e785d1a2..bb0276ec 100644
--- a/ui/webui/resources/js/i18n_mixin.ts
+++ b/ui/webui/resources/js/i18n_mixin.ts
@@ -25,14 +25,13 @@
          * Returns a translated string where $1 to $9 are replaced by the given
          * values.
          * @param id The ID of the string to translate.
-         * @param var_args Values to replace the placeholders $1 to $9 in the
+         * @param varArgs Values to replace the placeholders $1 to $9 in the
          *     string.
          * @return A translated, substituted string.
          */
-        private i18nRaw_(id: string, ...var_args: Array<string|number>) {
-          return var_args.length === 0 ?
-              loadTimeData.getString(id) :
-              loadTimeData.getStringF(id, ...var_args);
+        private i18nRaw_(id: string, ...varArgs: Array<string|number>) {
+          return varArgs.length === 0 ? loadTimeData.getString(id) :
+                                        loadTimeData.getStringF(id, ...varArgs);
         }
 
         /**
@@ -41,12 +40,12 @@
          * Use with Polymer bindings that are *not* inner-h-t-m-l.
          * NOTE: This is not related to $i18n{foo} in HTML, see file overview.
          * @param id The ID of the string to translate.
-         * @param var_args Values to replace the placeholders $1 to $9 in the
+         * @param varArgs Values to replace the placeholders $1 to $9 in the
          *     string.
          * @return A translated, sanitized, substituted string.
          */
-        i18n(id: string, ...var_args: Array<string|number>) {
-          const rawString = this.i18nRaw_(id, ...var_args);
+        i18n(id: string, ...varArgs: Array<string|number>) {
+          const rawString = this.i18nRaw_(id, ...varArgs);
           return parseHtmlSubset(`<b>${rawString}</b>`).firstChild!.textContent!
               ;
         }
@@ -70,27 +69,27 @@
          * updates when the locale changes.
          * @param locale The UI language used.
          * @param id The ID of the string to translate.
-         * @param var_args Values to replace the placeholders $1 to $9 in the
+         * @param varArgs Values to replace the placeholders $1 to $9 in the
          *     string.
          * @return A translated, sanitized, substituted string.
          */
-        i18nDynamic(_locale: string, id: string, ...var_args: string[]) {
-          return this.i18n(id, ...var_args);
+        i18nDynamic(_locale: string, id: string, ...varArgs: string[]) {
+          return this.i18n(id, ...varArgs);
         }
 
         /**
-         * Similar to 'i18nDynamic', but var_args valus are interpreted as keys
+         * Similar to 'i18nDynamic', but varArgs valus are interpreted as keys
          * in loadTimeData. This allows generation of strings that take other
          * localized strings as parameters.
          * @param locale The UI language used.
          * @param id The ID of the string to translate.
-         * @param var_args Values to replace the placeholders $1 to $9
+         * @param varArgs Values to replace the placeholders $1 to $9
          *     in the string. Values are interpreted as strings IDs if found in
          * the list of localized strings.
          * @return A translated, sanitized, substituted string.
          */
-        i18nRecursive(locale: string, id: string, ...var_args: string[]) {
-          let args = var_args;
+        i18nRecursive(locale: string, id: string, ...varArgs: string[]) {
+          let args = varArgs;
           if (args.length > 0) {
             // Try to replace IDs with localized values.
             args = args.map(str => {
@@ -112,9 +111,9 @@
     });
 
 export interface I18nMixinInterface {
-  i18n(id: string, ...var_args: Array<string|number>): string;
+  i18n(id: string, ...varArgs: Array<string|number>): string;
   i18nAdvanced(id: string, opts?: SanitizeInnerHtmlOpts): string;
-  i18nDynamic(locale: string, id: string, ...var_args: string[]): string;
-  i18nRecursive(locale: string, id: string, ...var_args: string[]): string;
+  i18nDynamic(locale: string, id: string, ...varArgs: string[]): string;
+  i18nRecursive(locale: string, id: string, ...varArgs: string[]): string;
   i18nExists(id: string): boolean;
 }
diff --git a/ui/webui/resources/js/parse_html_subset.js b/ui/webui/resources/js/parse_html_subset.js
index 7a2f257f..0bfd091 100644
--- a/ui/webui/resources/js/parse_html_subset.js
+++ b/ui/webui/resources/js/parse_html_subset.js
@@ -30,8 +30,8 @@
  * Parses a very small subset of HTML. This ensures that insecure HTML /
  * javascript cannot be injected into WebUI.
  * @param {string} s The string to parse.
- * @param {!Array<string>=} opt_extraTags Optional extra allowed tags.
- * @param {!Array<string>=} opt_extraAttrs
+ * @param {!Array<string>=} extraTags Optional extra allowed tags.
+ * @param {!Array<string>=} extraAttrs
  *     Optional extra allowed attributes (all tags are run through these).
  * @throws {Error} In case of non supported markup.
  * @return {DocumentFragment} A document fragment containing the DOM tree.
@@ -168,10 +168,9 @@
     }
   }
 
-  return function(s, opt_extraTags, opt_extraAttrs) {
-    const tags = opt_extraTags ? mergeTags(opt_extraTags) : allowedTags;
-    const attrs =
-        opt_extraAttrs ? mergeAttrs(opt_extraAttrs) : allowedAttributes;
+  return function(s, extraTags, extraAttrs) {
+    const tags = extraTags ? mergeTags(extraTags) : allowedTags;
+    const attrs = extraAttrs ? mergeAttrs(extraAttrs) : allowedAttributes;
 
     const doc = document.implementation.createHTMLDocument('');
     const r = doc.createRange();
diff --git a/ui/webui/resources/js/post_message_api_server.js b/ui/webui/resources/js/post_message_api_server.js
index c1ddd91..449901e0 100644
--- a/ui/webui/resources/js/post_message_api_server.js
+++ b/ui/webui/resources/js/post_message_api_server.js
@@ -29,7 +29,7 @@
      * taken place yet.
      * @private {number}
      */
-    this.initialization_timeout_id_ = 0;
+    this.initializationTimeoutId_ = 0;
 
     /**
      * Indicates how many attempts have been made to initialize the channel.
@@ -81,7 +81,7 @@
 
       // Set timeout to check if initialization message has been received using
       // exponential backoff.
-      this.initialization_timeout_id_ = setTimeout(
+      this.initializationTimeoutId_ = setTimeout(
           () => {
             // If the timeout id is non-zero, that indicates that initialization
             // hasn't succeeded yet, so  try to initialize again.
@@ -127,12 +127,12 @@
     }
 
     if (event.data === 'init') {
-      if (this.initialization_timeout_id_) {
+      if (this.initializationTimeoutId_) {
         // Cancel the current init timeout, and signal to the initialization
         // polling process that we have received an init message from the guest
         // content, so it doesn't reschedule the timer.
-        clearTimeout(this.initialization_timeout_id_);
-        this.initialization_timeout_id_ = 0;
+        clearTimeout(this.initializationTimeoutId_);
+        this.initializationTimeoutId_ = 0;
       }
 
       this.isInitialized_ = true;
diff --git a/ui/webui/resources/js/util.js b/ui/webui/resources/js/util.js
index c661205..6e4649b 100644
--- a/ui/webui/resources/js/util.js
+++ b/ui/webui/resources/js/util.js
@@ -45,7 +45,7 @@
   return a;
 }
 
-// <if expr="chromeos">
+// <if expr="chromeos_ash">
 /**
  * DEPRECATED (if using Polymer): Use Polymer.IronA11yAnnouncer instead.
  * TODO(crbug.com/985410): Replace all existing usages and remove this function.
@@ -101,24 +101,24 @@
 /**
  * Disables text selection and dragging, with optional callbacks to specify
  * overrides.
- * @param {function(Event):boolean=} opt_allowSelectStart Unless this function
+ * @param {function(Event):boolean=} allowSelectStart Unless this function
  *    is defined and returns true, the onselectionstart event will be
  *    suppressed.
- * @param {function(Event):boolean=} opt_allowDragStart Unless this function
+ * @param {function(Event):boolean=} allowDragStart Unless this function
  *    is defined and returns true, the ondragstart event will be suppressed.
  */
 /* #export */ function disableTextSelectAndDrag(
-    opt_allowSelectStart, opt_allowDragStart) {
+    allowSelectStart, allowDragStart) {
   // Disable text selection.
   document.onselectstart = function(e) {
-    if (!(opt_allowSelectStart && opt_allowSelectStart.call(this, e))) {
+    if (!(allowSelectStart && allowSelectStart.call(this, e))) {
       e.preventDefault();
     }
   };
 
   // Disable dragging.
   document.ondragstart = function(e) {
-    if (!(opt_allowDragStart && opt_allowDragStart.call(this, e))) {
+    if (!(allowDragStart && allowDragStart.call(this, e))) {
       e.preventDefault();
     }
   };
@@ -149,12 +149,12 @@
  * just calling querySelector and not checking the result because this lets us
  * satisfy the JSCompiler type system.
  * @param {string} selectors CSS selectors to query the element.
- * @param {(!Document|!DocumentFragment|!Element)=} opt_context An optional
+ * @param {(!Document|!DocumentFragment|!Element)=} context An optional
  *     context object for querySelector.
  * @return {!HTMLElement} the Element.
  */
-/* #export */ function queryRequiredElement(selectors, opt_context) {
-  const element = (opt_context || document).querySelector(selectors);
+/* #export */ function queryRequiredElement(selectors, context) {
+  const element = (context || document).querySelector(selectors);
   return assertInstanceof(
       element, HTMLElement, 'Missing required element: ' + selectors);
 }
@@ -193,17 +193,17 @@
  * or when no paint happens during the animation). This function sets up
  * a timer and emulate the event if it is not fired when the timer expires.
  * @param {!HTMLElement} el The element to watch for transitionend.
- * @param {number=} opt_timeOut The maximum wait time in milliseconds for the
+ * @param {number=} timeOut The maximum wait time in milliseconds for the
  *     transitionend to happen. If not specified, it is fetched from |el|
  *     using the transitionDuration style value.
  */
-/* #export */ function ensureTransitionEndEvent(el, opt_timeOut) {
-  if (opt_timeOut === undefined) {
+/* #export */ function ensureTransitionEndEvent(el, timeOut) {
+  if (timeOut === undefined) {
     const style = getComputedStyle(el);
-    opt_timeOut = parseFloat(style.transitionDuration) * 1000;
+    timeOut = parseFloat(style.transitionDuration) * 1000;
 
     // Give an additional 50ms buffer for the animation to complete.
-    opt_timeOut += 50;
+    timeOut += 50;
   }
 
   let fired = false;
@@ -215,7 +215,7 @@
     if (!fired) {
       cr.dispatchSimpleEvent(el, 'transitionend', true);
     }
-  }, opt_timeOut);
+  }, timeOut);
 }
 
 /**
diff --git a/ui/webui/resources/webui_resources.grd b/ui/webui/resources/webui_resources.grd
index 7ac7bf0f..320246c 100644
--- a/ui/webui/resources/webui_resources.grd
+++ b/ui/webui/resources/webui_resources.grd
@@ -13,7 +13,7 @@
   </outputs>
   <release seq="1">
     <includes>
-      <if expr="chromeos">
+      <if expr="chromeos_ash">
         <include name="IDR_WEBUI_CROS_COLORS_CSS"
                  file="${root_gen_dir}/ui/chromeos/styles/cros_styles.css"
                  resource_path="chromeos/colors/cros_styles.css"
@@ -37,7 +37,7 @@
       <structure name="IDR_WEBUI_CSS_WIDGETS_CSS"
                  file="css/widgets.css" type="chrome_html"
                  flattenhtml="true" />
-      <if expr="chromeos">
+      <if expr="chromeos_ash">
         <structure name="IDR_WEBUI_CSS_OVERLAY_CSS"
                    file="css/overlay.css" type="chrome_html"
                    flattenhtml="true" />