diff --git a/AUTHORS b/AUTHORS
index 46b733a..38d1cd1c 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -919,6 +919,7 @@
 Sherry Mou <wenjinm@amazon.com>
 Shez Baig <sbaig1@bloomberg.net>
 Shigeki Ohtsu <shigeki.ohtsu@gmail.com>
+Shicheng Wang <wangshicheng@xiaomi.com>
 Shiliu Wang <aofdwsl@gmail.com>
 Shiliu Wang <shiliu.wang@intel.com>
 Shilpa Shri <shilpa.shri@samsung.com>
@@ -953,6 +954,7 @@
 Stephen Searles <stephen.searles@gmail.com>
 Stephen Sigwart <ssigwart@gmail.com>
 Steve Sanders <steve@zanderz.com>
+Steven Cohen <peragwin@gmail.com>
 Steven Pennington <spenn@engr.uvic.ca>
 Steven Roussey <sroussey@gmail.com>
 Subrahmanya Praveen Munukutla <sataya.m@samsung.com>
diff --git a/DEPS b/DEPS
index cfb218fd..78f8850c 100644
--- a/DEPS
+++ b/DEPS
@@ -171,7 +171,7 @@
   # luci-go CIPD package version.
   # Make sure the revision is uploaded by infra-packagers builder.
   # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console
-  'luci_go': 'git_revision:56ae79476e3caf14da59d75118408aa778637936',
+  'luci_go': 'git_revision:b022173f8069cf8001d4cf2a87ce7c5f0eae220f',
 
   # This can be overridden, e.g. with custom_vars, to build clang from HEAD
   # instead of downloading the prebuilt pinned revision.
@@ -195,7 +195,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': '10f019c5068f9ff070c16e3571209012c78826e3',
+  'skia_revision': 'e7b08e4876fb1877fde4deb4d676031d1c54299a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -207,7 +207,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'adc250c38976277a15bd91605d06e1613bfdac86',
+  'angle_revision': '38ddebf9a771aef3a906667595354c7a564edf31',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -258,7 +258,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'ac60992d41b7007e9c6c4329e5bbfc02c912f314',
+  'catapult_revision': 'd84b21c3f04c3164609854d566514084bcca1da4',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -266,7 +266,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': '580a4b1d52b65febb22c804a036d972898026b86',
+  'devtools_frontend_revision': 'e794555edb6fe7cd872ea43c25c415e941669b58',
   # 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.
@@ -302,11 +302,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'spv_tools_revision': 'c6e6597c4f51be9b72eac6fc083383942cdbcd99',
+  'spv_tools_revision': '8bc27a1cfbc19a9fb0cf244fab693ad8909659e5',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'spv_headers_revision': '979924c8bc839e4cb1b69d03d48398551f369ce7',
+  'spv_headers_revision': '3fdabd0da2932c276b25b9b4a988ba134eba1aa6',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -318,7 +318,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '0a4342793e0e31ed36e59d2eef36817c82ede555',
+  'dawn_revision': '076a4e58205dfa2bcf5e33cc8718aa4799d46735',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -357,7 +357,7 @@
   'ukey2_revision': '0275885d8e6038c39b8a8ca55e75d1d4d1727f47',
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'tint_revision': '88f0ae369fef96b6118e1c99a8e97f9ff0a79e8f',
+  'tint_revision': 'f18d737b4e9318a1817126852edb6cc596ff1f5e',
 
   # TODO(crbug.com/941824): The values below need to be kept in sync
   # between //DEPS and //buildtools/DEPS, so if you're updating one,
@@ -545,7 +545,7 @@
   },
 
   'src/ios/third_party/material_components_ios/src': {
-      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '8dac13ae51e05e60b394ac81dffa40cfcfd05bec',
+      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '6e52d049a67499ca83c2b3094a4979e12cb06f7d',
       'condition': 'checkout_ios',
   },
 
@@ -1248,7 +1248,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f8ccdc63a188fd977953864bab7490eac9f9852f',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '23c5b63d1c68730cf0a6bb2a904dbd67f288508c',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1537,7 +1537,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@d24a19d429243e3ae7fa087b2c1ed9b9cf921863',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@171aaf4db08f1c4a372cc3d81e445f22467074bc',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/ash/app_list/views/assistant/assistant_privacy_info_view.cc b/ash/app_list/views/assistant/assistant_privacy_info_view.cc
index 084d6ff..1d0e407a 100644
--- a/ash/app_list/views/assistant/assistant_privacy_info_view.cc
+++ b/ash/app_list/views/assistant/assistant_privacy_info_view.cc
@@ -22,18 +22,12 @@
 
 AssistantPrivacyInfoView::~AssistantPrivacyInfoView() = default;
 
-void AssistantPrivacyInfoView::ButtonPressed(views::Button* sender,
-                                             const ui::Event& event) {
-  if (!IsCloseButton(sender))
-    return;
-
+void AssistantPrivacyInfoView::CloseButtonPressed() {
   view_delegate_->MarkAssistantPrivacyInfoDismissed();
   search_result_page_view_->OnPrivacyInfoViewCloseButtonPressed();
 }
 
-void AssistantPrivacyInfoView::StyledLabelLinkClicked(views::StyledLabel* label,
-                                                      const gfx::Range& range,
-                                                      int event_flags) {
+void AssistantPrivacyInfoView::LinkClicked() {
   constexpr char url[] = "https://support.google.com/chromebook?p=assistant";
   AssistantController::Get()->OpenUrl(
       assistant::util::CreateLocalizedGURL(url));
diff --git a/ash/app_list/views/assistant/assistant_privacy_info_view.h b/ash/app_list/views/assistant/assistant_privacy_info_view.h
index dcc879f..7d0fa1aa 100644
--- a/ash/app_list/views/assistant/assistant_privacy_info_view.h
+++ b/ash/app_list/views/assistant/assistant_privacy_info_view.h
@@ -23,13 +23,9 @@
   AssistantPrivacyInfoView& operator=(const AssistantPrivacyInfoView&) = delete;
   ~AssistantPrivacyInfoView() override;
 
-  // views::ButtonListener:
-  void ButtonPressed(views::Button* sender, const ui::Event& event) override;
-
-  // views::StyledLabelListener:
-  void StyledLabelLinkClicked(views::StyledLabel* label,
-                              const gfx::Range& range,
-                              int event_flags) override;
+  // PrivacyInfoView:
+  void CloseButtonPressed() override;
+  void LinkClicked() override;
 
  private:
   AppListViewDelegate* const view_delegate_;
diff --git a/ash/app_list/views/privacy_info_view.cc b/ash/app_list/views/privacy_info_view.cc
index d12233ab..e446d0c 100644
--- a/ash/app_list/views/privacy_info_view.cc
+++ b/ash/app_list/views/privacy_info_view.cc
@@ -87,6 +87,31 @@
   }
 }
 
+void PrivacyInfoView::OnKeyEvent(ui::KeyEvent* event) {
+  switch (event->key_code()) {
+    case ui::VKEY_RETURN:
+      // TODO(crbug.com/1079169): Update this once the text view and close
+      // button can be selected separately.
+      LinkClicked();
+      break;
+    default:
+      break;
+  }
+}
+
+void PrivacyInfoView::ButtonPressed(views::Button* sender,
+                                    const ui::Event& event) {
+  if (sender == close_button_)
+    CloseButtonPressed();
+}
+
+void PrivacyInfoView::StyledLabelLinkClicked(views::StyledLabel* label,
+                                             const gfx::Range& range,
+                                             int event_flags) {
+  if (label == text_view_)
+    LinkClicked();
+}
+
 void PrivacyInfoView::InitLayout() {
   auto* layout_manager = SetLayoutManager(std::make_unique<views::BoxLayout>(
       views::BoxLayout::Orientation::kHorizontal,
@@ -171,8 +196,4 @@
   close_button_ = AddChildView(std::move(close_button));
 }
 
-bool PrivacyInfoView::IsCloseButton(views::Button* button) const {
-  return button == close_button_;
-}
-
 }  // namespace ash
diff --git a/ash/app_list/views/privacy_info_view.h b/ash/app_list/views/privacy_info_view.h
index 5a06554..69518e2 100644
--- a/ash/app_list/views/privacy_info_view.h
+++ b/ash/app_list/views/privacy_info_view.h
@@ -31,18 +31,28 @@
   // ui::EventHandler:
   void OnMouseEvent(ui::MouseEvent* event) override;
   void OnGestureEvent(ui::GestureEvent* event) override;
+  void OnKeyEvent(ui::KeyEvent* event) override;
+
+  // views::ButtonListener:
+  void ButtonPressed(views::Button* sender, const ui::Event& event) override;
+
+  // views::StyledLabelListener:
+  void StyledLabelLinkClicked(views::StyledLabel* label,
+                              const gfx::Range& range,
+                              int event_flags) override;
 
  protected:
   PrivacyInfoView(int info_string_id, int link_string_id);
 
-  bool IsCloseButton(views::Button* button) const;
-
  private:
   void InitLayout();
   void InitInfoIcon();
   void InitText();
   void InitCloseButton();
 
+  virtual void LinkClicked() = 0;
+  virtual void CloseButtonPressed() = 0;
+
   views::ImageView* info_icon_ = nullptr;       // Owned by view hierarchy.
   views::StyledLabel* text_view_ = nullptr;     // Owned by view hierarchy.
   views::ImageButton* close_button_ = nullptr;  // Owned by view hierarchy.
diff --git a/ash/app_list/views/suggested_content_info_view.cc b/ash/app_list/views/suggested_content_info_view.cc
index 1a284c69..96c87d63 100644
--- a/ash/app_list/views/suggested_content_info_view.cc
+++ b/ash/app_list/views/suggested_content_info_view.cc
@@ -22,18 +22,12 @@
 
 SuggestedContentInfoView::~SuggestedContentInfoView() = default;
 
-void SuggestedContentInfoView::ButtonPressed(views::Button* sender,
-                                             const ui::Event& event) {
-  if (!IsCloseButton(sender))
-    return;
-
+void SuggestedContentInfoView::CloseButtonPressed() {
   view_delegate_->MarkSuggestedContentInfoDismissed();
   search_result_page_view_->OnPrivacyInfoViewCloseButtonPressed();
 }
 
-void SuggestedContentInfoView::StyledLabelLinkClicked(views::StyledLabel* label,
-                                                      const gfx::Range& range,
-                                                      int event_flags) {
+void SuggestedContentInfoView::LinkClicked() {
   view_delegate_->MarkSuggestedContentInfoDismissed();
   constexpr char url[] = "chrome://os-settings/osPrivacy";
   NewWindowDelegate::GetInstance()->NewTabWithUrl(
diff --git a/ash/app_list/views/suggested_content_info_view.h b/ash/app_list/views/suggested_content_info_view.h
index 6f691744b..90bc4cb 100644
--- a/ash/app_list/views/suggested_content_info_view.h
+++ b/ash/app_list/views/suggested_content_info_view.h
@@ -23,13 +23,9 @@
   SuggestedContentInfoView& operator=(const SuggestedContentInfoView&) = delete;
   ~SuggestedContentInfoView() override;
 
-  // views::ButtonListener:
-  void ButtonPressed(views::Button* sender, const ui::Event& event) override;
-
-  // views::StyledLabelListener:
-  void StyledLabelLinkClicked(views::StyledLabel* label,
-                              const gfx::Range& range,
-                              int event_flags) override;
+  // PrivacyInfoView:
+  void CloseButtonPressed() override;
+  void LinkClicked() override;
 
  private:
   AppListViewDelegate* const view_delegate_;
diff --git a/ash/login/ui/login_password_view.cc b/ash/login/ui/login_password_view.cc
index 7c3a873..7fb1859 100644
--- a/ash/login/ui/login_password_view.cc
+++ b/ash/login/ui/login_password_view.cc
@@ -108,7 +108,7 @@
 
 // Hides the password after a short delay for security reasons.
 constexpr base::TimeDelta kHidePasswordAfterDelay =
-    base::TimeDelta::FromSeconds(3);
+    base::TimeDelta::FromSeconds(5);
 
 constexpr const char kLoginPasswordViewName[] = "LoginPasswordView";
 
@@ -742,11 +742,12 @@
   if (!is_display_password_feature_enabled_)
     return;
 
-  // Only reset the timer if the display password feature is enabled.
+  // If the password is currently revealed.
+  if (textfield_->GetTextInputType() == ui::TEXT_INPUT_TYPE_NULL)
+    hide_password_timer_->Reset();
+  // The feature could be enabled on the device but disabled for this user by policy.
   if (display_password_button_->GetVisible())
     clear_password_timer_->Reset();
-  // For UX purposes, hide back the password when the user is typing.
-  HidePassword(false /*chromevox_exception*/);
   display_password_button_->SetEnabled(!new_contents.empty());
 }
 
diff --git a/ash/login/ui/login_password_view_test.cc b/ash/login/ui/login_password_view_test.cc
index ade00b9..c2021048 100644
--- a/ash/login/ui/login_password_view_test.cc
+++ b/ash/login/ui/login_password_view_test.cc
@@ -326,12 +326,15 @@
             ui::TEXT_INPUT_TYPE_PASSWORD);
 }
 
-// Verifies that the password textfield hides back when the content changes.
-TEST_F(LoginPasswordViewTestFeatureEnabled, PasswordHidesAfterTyping) {
+// Verifies that the password textfield remains in the same visibility state
+// when the content changes.
+TEST_F(LoginPasswordViewTestFeatureEnabled,
+       ContentChangesDoNotImpactPasswordVisibility) {
   LoginPasswordView::TestApi test_api(view_);
   ui::test::EventGenerator* generator = GetEventGenerator();
 
-  // Show the password.
+  // Type to enable the display password button and click on it to display the
+  // password.
   EXPECT_EQ(test_api.textfield()->GetTextInputType(),
             ui::TEXT_INPUT_TYPE_PASSWORD);
   generator->PressKey(ui::KeyboardCode::VKEY_A, ui::EF_NONE);
@@ -340,18 +343,22 @@
   generator->ClickLeftButton();
   EXPECT_EQ(test_api.textfield()->GetTextInputType(), ui::TEXT_INPUT_TYPE_NULL);
 
-  // Type and check if the password textfield hides back.
+  // Type manually and programmatically, and check if the password textfield
+  // remains visible.
   generator->PressKey(ui::KeyboardCode::VKEY_A, ui::EF_NONE);
-  EXPECT_EQ(test_api.textfield()->GetTextInputType(),
-            ui::TEXT_INPUT_TYPE_PASSWORD);
+  EXPECT_EQ(test_api.textfield()->GetTextInputType(), ui::TEXT_INPUT_TYPE_NULL);
+  test_api.textfield()->InsertText(base::ASCIIToUTF16("test"));
+  EXPECT_EQ(test_api.textfield()->GetTextInputType(), ui::TEXT_INPUT_TYPE_NULL);
 
-  // Click again to show the password.
+  // Click again on the display password button to hide the password.
   generator->MoveMouseTo(
       test_api.display_password_button()->GetBoundsInScreen().CenterPoint());
   generator->ClickLeftButton();
-  EXPECT_EQ(test_api.textfield()->GetTextInputType(), ui::TEXT_INPUT_TYPE_NULL);
+  EXPECT_EQ(test_api.textfield()->GetTextInputType(),
+            ui::TEXT_INPUT_TYPE_PASSWORD);
 
-  // Modifies the content programmatically and check it is still triggered.
+  // Type manually and programmatically, and check if the password textfield
+  // remains invisible.
   test_api.textfield()->InsertText(base::ASCIIToUTF16("test"));
   EXPECT_EQ(test_api.textfield()->GetTextInputType(),
             ui::TEXT_INPUT_TYPE_PASSWORD);
diff --git a/ash/metrics/demo_session_metrics_recorder.cc b/ash/metrics/demo_session_metrics_recorder.cc
index d4f7bf82..0c3cd2b 100644
--- a/ash/metrics/demo_session_metrics_recorder.cc
+++ b/ash/metrics/demo_session_metrics_recorder.cc
@@ -79,7 +79,7 @@
     return DemoModeApp::kGoogleSheetsChromeApp;
   if (app_id == extension_misc::kGoogleSlidesDemoAppId)
     return DemoModeApp::kGoogleSlidesChromeApp;
-  if (app_id == kHelpAppId || app_id == extension_misc::kGeniusAppId)
+  if (app_id == kHelpAppId)
     return DemoModeApp::kGetHelp;
   if (app_id == extension_misc::kGoogleKeepAppId)
     return DemoModeApp::kGoogleKeepChromeApp;
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 177a64d..7b710206 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-0.20200804.2.1
+0.20200805.0.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 5ef6316..9aec3cca 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-0.20200804.1.1
+0.20200805.1.1
diff --git a/chrome/VERSION b/chrome/VERSION
index 88eb593..bcd55c7 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=86
 MINOR=0
-BUILD=4224
+BUILD=4225
 PATCH=0
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index e97643a6..e546cdc 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -67,6 +67,7 @@
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkBridgeTest.java",
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkEditTest.java",
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkModelTest.java",
+  "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedPromoRenderTest.java",
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java",
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java",
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedPromoRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedPromoRenderTest.java
new file mode 100644
index 0000000..21af90e8
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedPromoRenderTest.java
@@ -0,0 +1,110 @@
+// 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.
+
+package org.chromium.chrome.browser.bookmarks;
+
+import static org.mockito.MockitoAnnotations.initMocks;
+
+import android.view.View;
+
+import androidx.test.filters.MediumTest;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.DisableIf;
+import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.browser.signin.SigninActivityLauncher;
+import org.chromium.chrome.test.ChromeActivityTestRule;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.BookmarkTestRule;
+import org.chromium.chrome.test.util.ChromeRenderTestRule;
+import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule;
+import org.chromium.components.signin.ProfileDataSource;
+import org.chromium.components.signin.test.util.FakeProfileDataSource;
+import org.chromium.ui.test.util.UiDisableIf;
+
+import java.io.IOException;
+
+/**
+ * Tests for the personalized signin promo on the Bookmarks page.
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@DisableIf.Device(type = {UiDisableIf.TABLET})
+public class BookmarkPersonalizedPromoRenderTest {
+    // FakeProfileDataSource is required to create the ProfileDataCache entry with sync_off badge
+    // for Sync promo.
+    private final AccountManagerTestRule mAccountManagerTestRule =
+            new AccountManagerTestRule(new FakeProfileDataSource());
+
+    private final ChromeActivityTestRule<ChromeActivity> mActivityTestRule =
+            new ChromeActivityTestRule<>(ChromeActivity.class);
+
+    private final BookmarkTestRule mBookmarkTestRule = new BookmarkTestRule();
+
+    // Bookmarks need the FakeAccountManagerFacade initialized in AccountManagerTestRule.
+    @Rule
+    public final RuleChain chain = RuleChain.outerRule(mAccountManagerTestRule)
+                                           .around(mActivityTestRule)
+                                           .around(mBookmarkTestRule);
+
+    @Rule
+    public final ChromeRenderTestRule mRenderTestRule =
+            ChromeRenderTestRule.Builder.withPublicCorpus().build();
+
+    @Mock
+    private SigninActivityLauncher mMockSigninActivityLauncher;
+
+    @Before
+    public void setUp() {
+        initMocks(this);
+        mAccountManagerTestRule.addAccount(new ProfileDataSource.ProfileData(
+                "test@gmail.com", null, "Full Name", "Given Name"));
+        SigninActivityLauncher.setLauncherForTest(mMockSigninActivityLauncher);
+        mActivityTestRule.startMainActivityOnBlankPage();
+    }
+
+    @After
+    public void tearDown() {
+        SigninActivityLauncher.setLauncherForTest(null);
+        BookmarkPromoHeader.forcePromoStateForTests(null);
+    }
+
+    @Test
+    @MediumTest
+    @Feature("RenderTest")
+    public void testPersonalizedSigninPromoInBookmarkPage() throws IOException {
+        BookmarkPromoHeader.forcePromoStateForTests(
+                BookmarkPromoHeader.PromoState.PROMO_SIGNIN_PERSONALIZED);
+        mBookmarkTestRule.showBookmarkManager(mActivityTestRule.getActivity());
+        mRenderTestRule.render(getPersonalizedPromoView(), "bookmark_personalized_signin_promo");
+    }
+
+    @Test
+    @MediumTest
+    @Feature("RenderTest")
+    public void testPersonalizedSyncPromoInBookmarkPage() throws Exception {
+        BookmarkPromoHeader.forcePromoStateForTests(
+                BookmarkPromoHeader.PromoState.PROMO_SYNC_PERSONALIZED);
+        mBookmarkTestRule.showBookmarkManager(mActivityTestRule.getActivity());
+        mRenderTestRule.render(getPersonalizedPromoView(), "bookmark_personalized_sync_promo");
+    }
+
+    private View getPersonalizedPromoView() {
+        BookmarkActivity bookmarkActivity = mBookmarkTestRule.getBookmarkActivity();
+        Assert.assertNotNull("BookmarkActivity should not be null", bookmarkActivity);
+        return bookmarkActivity.findViewById(R.id.signin_promo_view_container);
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
index 44df2a0..cf4f1fcf 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
@@ -25,7 +25,6 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
@@ -62,7 +61,6 @@
         ContentSwitches.HOST_RESOLVER_RULES + "=MAP * 127.0.0.1"})
 @Features.
 EnableFeatures(ContentSettingsFeatureList.IMPROVED_COOKIE_CONTROLS_FOR_THIRD_PARTY_COOKIE_BLOCKING)
-@DisabledTest(message = "crbug.com/1112985")
 public class PageInfoViewTest {
     @Rule
     public ChromeActivityTestRule<ChromeActivity> mActivityTestRule =
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index efbd567b..fe0f0d49 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -817,6 +817,26 @@
     Please retry. If you see this error again please contact your support representative.
   </message>
 
+  <!-- Strings for family link notice screen -->
+  <message name="IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_TITLE" desc="Title of the screen which tells user they can add parental control later.">
+    Add parental controls after setup
+  </message>
+  <message name="IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_NEW_ACCOUNT_SUBTITLE" desc="Title of the screen which tells user they can add parental control later after they create a new account for their child.">
+    For older children, you can add parental controls once you finish setup. You'll find information on parental controls in the Explore app.
+  </message>
+  <message name="IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_EXISTING_ACCOUNT_SUBTITLE" desc="Title of the screen which tells user they can add parental control later after they sign in with an existing account for their child.">
+    You child's account isn't set up for Family Link parental controls. You can add parental controls once you finish setup. You'll find information on parental controls in the Explore app.
+  </message>
+  <message name="IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_NOT_ELIGIBLE_TITLE" desc="Title of the screen which tells user the account is not eligible for parental controls.">
+    This account isn't eligible for parental controls
+  </message>
+  <message name="IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_NOT_ELIGIBLE_SUBTITLE" desc="Subtitle of the screen which tells user the account is not eligible for parental controls.">
+    <ph name="USER_EMAIL">$1<ex>john.doe@example.com</ex></ph> is already being managed by <ph name="DOMAIN">$2<ex>google.com</ex></ph>. To use parental controls with a different Google Account, sign out after setup, then select "Add person" on the sign-in screen.
+  </message>
+  <message name="IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_CONTINUE_BUTTON" desc="Continue button on family link notice screen.">
+    Continue
+  </message>
+
   <message name="IDS_LOGIN_SYNC_CONSENT_SCREEN_TITLE" desc="The title of the dialog that welcomes the user on the first log in, and explains Chrome Sync and privacy options.">
     You're signed in!
   </message>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_CONTINUE_BUTTON.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_CONTINUE_BUTTON.png.sha1
new file mode 100644
index 0000000..44801804
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_CONTINUE_BUTTON.png.sha1
@@ -0,0 +1 @@
+7bb528c314aa924743a2c5404665cf445771a320
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_EXISTING_ACCOUNT_SUBTITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_EXISTING_ACCOUNT_SUBTITLE.png.sha1
new file mode 100644
index 0000000..b81290655
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_EXISTING_ACCOUNT_SUBTITLE.png.sha1
@@ -0,0 +1 @@
+e78dd58b4c53c91c852ed277869ab500a1c9f061
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_NEW_ACCOUNT_SUBTITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_NEW_ACCOUNT_SUBTITLE.png.sha1
new file mode 100644
index 0000000..44801804
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_NEW_ACCOUNT_SUBTITLE.png.sha1
@@ -0,0 +1 @@
+7bb528c314aa924743a2c5404665cf445771a320
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_NOT_ELIGIBLE_SUBTITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_NOT_ELIGIBLE_SUBTITLE.png.sha1
new file mode 100644
index 0000000..8814e13
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_NOT_ELIGIBLE_SUBTITLE.png.sha1
@@ -0,0 +1 @@
+d111e3e5c937afe8a7aad81260009a2fccd5a552
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_NOT_ELIGIBLE_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_NOT_ELIGIBLE_TITLE.png.sha1
new file mode 100644
index 0000000..8814e13
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_NOT_ELIGIBLE_TITLE.png.sha1
@@ -0,0 +1 @@
+d111e3e5c937afe8a7aad81260009a2fccd5a552
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_TITLE.png.sha1
new file mode 100644
index 0000000..44801804
--- /dev/null
+++ b/chrome/app/chromeos_strings_grdp/IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_TITLE.png.sha1
@@ -0,0 +1 @@
+7bb528c314aa924743a2c5404665cf445771a320
\ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index e5f410b9..ea32c54 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -8844,18 +8844,6 @@
       <message name="IDS_GEOLOCATION_ALLOWED_TOOLTIP" desc="Location bar icon tooltip text when a page is allowed to use geolocation.">
         This page is tracking your location.
       </message>
-      <message name="IDS_GEOLOCATION" desc="Description text next to the location icon inside the pop-up bubble which describes that the location permission is blocked on an OS level.">
-          Location
-      </message>
-      <if expr="is_macosx">
-        <message name="IDS_GEOLOCATION_TURNED_OFF_IN_MACOS" desc="Title for the geolocation bubble that is used when a site requests geolocation, but geolocation is blocked on an OS level in macOS.">
-          Location is turned off in Mac System Preferences
-        </message>
-        <message name="IDS_GEOLOCATION_TURNED_OFF" desc="Description text in the omnibox icon showing when location permission is blocked on an OS level in macOS.">
-          Location turned off
-        </message>
-      </if>
-
       <message name="IDS_GEOLOCATION_BLOCKED_TOOLTIP" desc="Location bar icon tooltip text when a page is blocked from using geolocation.">
         This page has been blocked from tracking your location.
       </message>
diff --git a/chrome/app/generated_resources_grd/IDS_GEOLOCATION.png.sha1 b/chrome/app/generated_resources_grd/IDS_GEOLOCATION.png.sha1
deleted file mode 100644
index 7ef79c9..0000000
--- a/chrome/app/generated_resources_grd/IDS_GEOLOCATION.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-95bc21d8855e06ce645fa4ed8ab6dfc52461b924
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_GEOLOCATION_TURNED_OFF.png.sha1 b/chrome/app/generated_resources_grd/IDS_GEOLOCATION_TURNED_OFF.png.sha1
deleted file mode 100644
index 4999a540..0000000
--- a/chrome/app/generated_resources_grd/IDS_GEOLOCATION_TURNED_OFF.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-3285fa7133dcfe15000f1db4df2d95e9a1ea8b25
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_GEOLOCATION_TURNED_OFF_IN_MACOS.png.sha1 b/chrome/app/generated_resources_grd/IDS_GEOLOCATION_TURNED_OFF_IN_MACOS.png.sha1
deleted file mode 100644
index 179f709..0000000
--- a/chrome/app/generated_resources_grd/IDS_GEOLOCATION_TURNED_OFF_IN_MACOS.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-5351ffbbaf3426e78a940fe478a35a9313d721dd
\ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index ea60005..c7ed1f0 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1293,18 +1293,10 @@
     "prerender/isolated/isolated_prerender_url_loader_interceptor.h",
     "prerender/isolated/prefetched_mainframe_response_container.cc",
     "prerender/isolated/prefetched_mainframe_response_container.h",
-    "prerender/prerender_contents.cc",
-    "prerender/prerender_contents.h",
-    "prerender/prerender_field_trial.cc",
-    "prerender/prerender_field_trial.h",
-    "prerender/prerender_handle.cc",
-    "prerender/prerender_handle.h",
     "prerender/prerender_link_manager.cc",
     "prerender/prerender_link_manager.h",
     "prerender/prerender_link_manager_factory.cc",
     "prerender/prerender_link_manager_factory.h",
-    "prerender/prerender_manager.cc",
-    "prerender/prerender_manager.h",
     "prerender/prerender_manager_factory.cc",
     "prerender/prerender_manager_factory.h",
     "prerender/prerender_processor_impl.cc",
@@ -1804,13 +1796,6 @@
   libs = []
   ldflags = []
 
-  if (is_mac) {
-    sources += [
-      "geolocation/geolocation_system_permission_mac.h",
-      "geolocation/geolocation_system_permission_mac.mm",
-    ]
-  }
-
   allow_circular_includes_from = [
     "//chrome/browser/ui",
     "//chrome/browser/ui/webui/bluetooth_internals",
@@ -4389,7 +4374,6 @@
       "Accelerate.framework",
       "AudioUnit.framework",
       "AVFoundation.framework",
-      "CoreLocation.framework",
       "DiskArbitration.framework",
       "IOKit.framework",
       "ImageCaptureCore.framework",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 4ebfb5e1..4427ee3 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -44,7 +44,6 @@
 #include "chrome/browser/predictors/loading_predictor_config.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_features.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_params.h"
-#include "chrome/browser/prerender/prerender_field_trial.h"
 #include "chrome/browser/resource_coordinator/tab_manager_features.h"
 #include "chrome/browser/search/ntp_features.h"
 #include "chrome/browser/sharing/click_to_call/feature.h"
@@ -108,6 +107,7 @@
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "components/payments/core/features.h"
 #include "components/policy/core/common/features.h"
+#include "components/prerender/browser/prerender_field_trial.h"
 #include "components/previews/core/previews_features.h"
 #include "components/previews/core/previews_switches.h"
 #include "components/query_tiles/switches.h"
@@ -5752,9 +5752,6 @@
     {"os-settings-deep-linking", flag_descriptions::kOsSettingsDeepLinkingName,
      flag_descriptions::kOsSettingsDeepLinkingDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::features::kOsSettingsDeepLinking)},
-    {"help-app", flag_descriptions::kHelpAppName,
-     flag_descriptions::kHelpAppDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(chromeos::features::kHelpAppV2)},
     {"help-app-release-notes", flag_descriptions::kHelpAppReleaseNotesName,
      flag_descriptions::kHelpAppReleaseNotesDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::features::kHelpAppReleaseNotes)},
diff --git a/chrome/browser/android/tab_android.cc b/chrome/browser/android/tab_android.cc
index 8ff3141..759f8d5 100644
--- a/chrome/browser/android/tab_android.cc
+++ b/chrome/browser/android/tab_android.cc
@@ -27,7 +27,6 @@
 #include "chrome/browser/browser_about_handler.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/infobars/infobar_service.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_android.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -43,6 +42,7 @@
 #include "chrome/browser/ui/tab_contents/core_tab_helper.h"
 #include "chrome/browser/ui/tab_helpers.h"
 #include "chrome/common/url_constants.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/sessions/content/session_tab_helper.h"
 #include "components/url_formatter/url_fixer.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/android/tab_web_contents_delegate_android.cc b/chrome/browser/android/tab_web_contents_delegate_android.cc
index 8741fb43..572504f 100644
--- a/chrome/browser/android/tab_web_contents_delegate_android.cc
+++ b/chrome/browser/android/tab_web_contents_delegate_android.cc
@@ -37,7 +37,6 @@
 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/picture_in_picture/picture_in_picture_window_manager.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer.h"
@@ -67,6 +66,7 @@
 #include "components/javascript_dialogs/tab_modal_dialog_manager.h"
 #include "components/navigation_interception/intercept_navigation_delegate.h"
 #include "components/paint_preview/buildflags/buildflags.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/security_state/content/content_utils.h"
 #include "content/public/browser/file_select_listener.h"
 #include "content/public/browser/navigation_entry.h"
diff --git a/chrome/browser/apps/app_service/app_icon_source.cc b/chrome/browser/apps/app_service/app_icon_source.cc
index 952388d..aedc534 100644
--- a/chrome/browser/apps/app_service/app_icon_source.cc
+++ b/chrome/browser/apps/app_service/app_icon_source.cc
@@ -95,10 +95,6 @@
 
   apps::AppServiceProxy* app_service_proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile_);
-  if (!app_service_proxy) {
-    LoadDefaultImage(std::move(callback));
-    return;
-  }
 
   const apps::mojom::AppType app_type =
       app_service_proxy->AppRegistryCache().GetAppType(app_id);
diff --git a/chrome/browser/apps/app_service/app_service_metrics.cc b/chrome/browser/apps/app_service/app_service_metrics.cc
index 6ef52c22..cbac677f 100644
--- a/chrome/browser/apps/app_service/app_service_metrics.cc
+++ b/chrome/browser/apps/app_service/app_service_metrics.cc
@@ -178,8 +178,6 @@
     RecordDefaultAppLaunch(DefaultAppName::kCalculator, launch_source);
   else if (app_id == extension_misc::kTextEditorAppId)
     RecordDefaultAppLaunch(DefaultAppName::kText, launch_source);
-  else if (app_id == extension_misc::kGeniusAppId)
-    RecordDefaultAppLaunch(DefaultAppName::kGetHelp, launch_source);
   else if (app_id == file_manager::kGalleryAppId)
     RecordDefaultAppLaunch(DefaultAppName::kGallery, launch_source);
   else if (app_id == file_manager::kVideoPlayerAppId)
diff --git a/chrome/browser/apps/app_service/app_service_proxy.cc b/chrome/browser/apps/app_service/app_service_proxy.cc
index ac24f79..955b4d0 100644
--- a/chrome/browser/apps/app_service/app_service_proxy.cc
+++ b/chrome/browser/apps/app_service/app_service_proxy.cc
@@ -529,18 +529,17 @@
         if (apps_util::IntentMatchesFilter(intent, filter)) {
           AppIdAndActivityName app_id_and_activity;
           app_id_and_activity.app_id = update.AppId();
-          if (base::FeatureList::IsEnabled(features::kIntentHandlingSharing) &&
-              filter->activity_name.has_value()) {
-            std::string activity_name = filter->activity_name.value();
-            if (activity_name.empty()) {
-              activity_name = update.Name();
-            }
-            if (base::Contains(existing_activities, activity_name)) {
-              continue;
-            }
-            existing_activities.insert(activity_name);
-            app_id_and_activity.activity_name = activity_name;
+          std::string activity_name;
+          if (filter->activity_name && !filter->activity_name.value().empty()) {
+            activity_name = filter->activity_name.value();
+          } else {
+            activity_name = update.Name();
           }
+          if (base::Contains(existing_activities, activity_name)) {
+            continue;
+          }
+          existing_activities.insert(activity_name);
+          app_id_and_activity.activity_name = activity_name;
           app_id_and_activities.push_back(app_id_and_activity);
         }
       }
diff --git a/chrome/browser/apps/app_service/app_service_proxy.h b/chrome/browser/apps/app_service/app_service_proxy.h
index 7a74803..0a523418 100644
--- a/chrome/browser/apps/app_service/app_service_proxy.h
+++ b/chrome/browser/apps/app_service/app_service_proxy.h
@@ -67,8 +67,9 @@
 // proxy for a given Profile, and therefore share its caches.
 // Observe AppRegistryCache to delete the preferred app on app removed.
 //
-// On Chrome OS, an instance is created for the lock screen apps profile, but
-// not for the signin profile.
+// On all platforms, there is no instance for incognito profiles.
+// On Chrome OS, an instance is created for the guest session profile and the
+// lock screen apps profile, but not for the signin profile.
 //
 // See components/services/app_service/README.md.
 class AppServiceProxy : public KeyedService,
diff --git a/chrome/browser/apps/app_service/app_service_proxy_factory.cc b/chrome/browser/apps/app_service/app_service_proxy_factory.cc
index 9aed48c..e1dbd0a1 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_factory.cc
+++ b/chrome/browser/apps/app_service/app_service_proxy_factory.cc
@@ -25,17 +25,38 @@
 namespace apps {
 
 // static
+bool AppServiceProxyFactory::IsAppServiceAvailableForProfile(Profile* profile) {
+  if (!profile || profile->IsSystemProfile()) {
+    return false;
+  }
+
+  // There is no AppServiceProxy for incognito profiles as they are ephemeral
+  // and have no apps persisted inside them.
+  //
+  // A common pattern in incognito is to implicitly fall back to the associated
+  // real profile. We do not do that here to avoid unintentionally leaking a
+  // user's browsing data from incognito to an app. Clients of the App Service
+  // should explicitly decide when it is and isn't appropriate to use the
+  // associated real profile and pass that to this method.
+#if defined(OS_CHROMEOS)
+  // An exception on Chrome OS is the guest profile, which is incognito, but
+  // can have apps within it.
+  return (!chromeos::ProfileHelper::IsSigninProfile(profile) &&
+          (!profile->IsOffTheRecord() || profile->IsGuestSession()));
+#else
+  return !profile->IsOffTheRecord();
+#endif
+}
+
+// static
 AppServiceProxy* AppServiceProxyFactory::GetForProfile(Profile* profile) {
-  // TODO: decide the right behaviour in incognito (non-guest) profiles:
-  //   - return nullptr (means we need to null check the service at call sites
-  //     OR ensure it's never accessed from an incognito profile),
-  //   - return the service attached to the Profile that the incognito profile
-  //     is branched from (i.e. "inherit" the parent service),
-  //   - return a temporary service just for the incognito session (probably
-  //     the least sensible option).
-  return static_cast<AppServiceProxy*>(
+  DCHECK(IsAppServiceAvailableForProfile(profile));
+
+  auto* proxy = static_cast<AppServiceProxy*>(
       AppServiceProxyFactory::GetInstance()->GetServiceForBrowserContext(
           profile, true /* create */));
+  DCHECK_NE(nullptr, proxy);
+  return proxy;
 }
 
 // static
diff --git a/chrome/browser/apps/app_service/app_service_proxy_factory.h b/chrome/browser/apps/app_service/app_service_proxy_factory.h
index a9e1649..686bd29 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_factory.h
+++ b/chrome/browser/apps/app_service/app_service_proxy_factory.h
@@ -18,6 +18,8 @@
 // Singleton that owns all AppServiceProxy's and associates them with Profile.
 class AppServiceProxyFactory : public BrowserContextKeyedServiceFactory {
  public:
+  static bool IsAppServiceAvailableForProfile(Profile* profile);
+
   static AppServiceProxy* GetForProfile(Profile* profile);
 
   static AppServiceProxyFactory* GetInstance();
diff --git a/chrome/browser/apps/app_service/app_service_test.cc b/chrome/browser/apps/app_service/app_service_test.cc
index b19cc6c..e9211ca 100644
--- a/chrome/browser/apps/app_service/app_service_test.cc
+++ b/chrome/browser/apps/app_service/app_service_test.cc
@@ -22,7 +22,6 @@
 void AppServiceTest::SetUp(Profile* profile) {
   profile_ = profile;
   app_service_proxy_ = apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(app_service_proxy_);
   app_service_proxy_->ReInitializeForTesting(profile);
 
   // Allow async callbacks to run.
@@ -32,7 +31,6 @@
 void AppServiceTest::UninstallAllApps(Profile* profile) {
   AppServiceProxy* app_service_proxy_ =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(app_service_proxy_);
   std::vector<apps::mojom::AppPtr> apps;
   app_service_proxy_->AppRegistryCache().ForEachApp(
       [&apps](const apps::AppUpdate& update) {
diff --git a/chrome/browser/apps/app_service/arc_apps.cc b/chrome/browser/apps/app_service/arc_apps.cc
index 7d207ce..ec152a1 100644
--- a/chrome/browser/apps/app_service/arc_apps.cc
+++ b/chrome/browser/apps/app_service/arc_apps.cc
@@ -197,6 +197,10 @@
       user_interaction_type =
           arc::UserInteractionType::APP_STARTED_FROM_OMNIBOX;
       break;
+    case apps::mojom::LaunchSource::kFromSharesheet:
+      user_interaction_type =
+          arc::UserInteractionType::APP_STARTED_FROM_SHARESHEET;
+      break;
     default:
       NOTREACHED();
       return base::nullopt;
diff --git a/chrome/browser/apps/app_service/menu_util.cc b/chrome/browser/apps/app_service/menu_util.cc
index 0db0c08..212c72c 100644
--- a/chrome/browser/apps/app_service/menu_util.cc
+++ b/chrome/browser/apps/app_service/menu_util.cc
@@ -118,12 +118,7 @@
 
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy);
-  if (proxy->InstanceRegistry().GetWindows(app_id).empty()) {
-    return true;
-  }
-
-  return false;
+  return proxy->InstanceRegistry().GetWindows(app_id).empty();
 }
 
 bool ShouldAddCloseItem(const std::string& app_id,
@@ -135,12 +130,7 @@
 
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy);
-  if (proxy->InstanceRegistry().GetWindows(app_id).empty()) {
-    return false;
-  }
-
-  return true;
+  return !proxy->InstanceRegistry().GetWindows(app_id).empty();
 }
 
 void PopulateRadioItemFromMojoMenuItems(
diff --git a/chrome/browser/apps/app_service/remote_apps.cc b/chrome/browser/apps/app_service/remote_apps.cc
index 17b3e83..33779cd 100644
--- a/chrome/browser/apps/app_service/remote_apps.cc
+++ b/chrome/browser/apps/app_service/remote_apps.cc
@@ -18,9 +18,6 @@
     : profile_(profile), delegate_(delegate) {
   DCHECK(delegate);
   AppServiceProxy* proxy = AppServiceProxyFactory::GetForProfile(profile_);
-  if (!proxy) {
-    return;
-  }
 
   mojo::Remote<mojom::AppService>& app_service = proxy->AppService();
   if (!app_service.is_bound()) {
diff --git a/chrome/browser/apps/intent_helper/apps_navigation_throttle.cc b/chrome/browser/apps/intent_helper/apps_navigation_throttle.cc
index 4fcccfb..fb00d45f 100644
--- a/chrome/browser/apps/intent_helper/apps_navigation_throttle.cc
+++ b/chrome/browser/apps/intent_helper/apps_navigation_throttle.cc
@@ -16,7 +16,6 @@
 #include "chrome/browser/apps/intent_helper/intent_picker_auto_display_service.h"
 #include "chrome/browser/apps/intent_helper/page_transition_util.h"
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
@@ -30,6 +29,7 @@
 #include "chrome/browser/web_applications/components/web_app_tab_helper_base.h"
 #include "chrome/common/chrome_features.h"
 #include "components/page_load_metrics/browser/page_load_metrics_util.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_handle.h"
diff --git a/chrome/browser/apps/platform_apps/BUILD.gn b/chrome/browser/apps/platform_apps/BUILD.gn
index 00bf725..1208c1a 100644
--- a/chrome/browser/apps/platform_apps/BUILD.gn
+++ b/chrome/browser/apps/platform_apps/BUILD.gn
@@ -56,6 +56,7 @@
     "//components/keyed_service/content",
     "//components/navigation_interception",
     "//components/pref_registry",
+    "//components/prerender/browser",
     "//content/public/browser",
     "//content/public/common",
     "//extensions/browser",
diff --git a/chrome/browser/apps/platform_apps/platform_app_navigation_redirector.cc b/chrome/browser/apps/platform_apps/platform_app_navigation_redirector.cc
index e30a336..e4f559c 100644
--- a/chrome/browser/apps/platform_apps/platform_app_navigation_redirector.cc
+++ b/chrome/browser/apps/platform_apps/platform_app_navigation_redirector.cc
@@ -8,12 +8,12 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/common/extensions/api/url_handlers/url_handlers_parser.h"
 #include "components/navigation_interception/intercept_navigation_throttle.h"
 #include "components/navigation_interception/navigation_params.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/browser_process_platform_part_mac.h b/chrome/browser/browser_process_platform_part_mac.h
index 62e567e..4d9d239 100644
--- a/chrome/browser/browser_process_platform_part_mac.h
+++ b/chrome/browser/browser_process_platform_part_mac.h
@@ -11,7 +11,6 @@
 #include "base/macros.h"
 #include "chrome/browser/apps/app_shim/app_shim_listener.h"
 #include "chrome/browser/browser_process_platform_part_base.h"
-#include "chrome/browser/geolocation/geolocation_system_permission_mac.h"
 
 namespace apps {
 class AppShimManager;
@@ -29,11 +28,6 @@
 
   AppShimListener* app_shim_listener();
   apps::AppShimManager* app_shim_manager();
-  GeolocationSystemPermissionManager* location_permission_manager();
-
- protected:
-  std::unique_ptr<GeolocationSystemPermissionManager>
-      location_permission_manager_;
 
  private:
   std::unique_ptr<apps::AppShimManager> app_shim_manager_;
diff --git a/chrome/browser/browser_process_platform_part_mac.mm b/chrome/browser/browser_process_platform_part_mac.mm
index 4fa8809..547ffd1b 100644
--- a/chrome/browser/browser_process_platform_part_mac.mm
+++ b/chrome/browser/browser_process_platform_part_mac.mm
@@ -65,8 +65,6 @@
   app_shim_manager_ = std::make_unique<apps::AppShimManager>(
       std::move(app_shim_manager_delegate));
 
-  location_permission_manager_ = GeolocationSystemPermissionManager::Create();
-
   // AppShimListener can not simply be reset, otherwise destroying the old
   // domain socket will cause the just-created socket to be unlinked.
   DCHECK(!app_shim_listener_.get());
@@ -80,8 +78,3 @@
 AppShimListener* BrowserProcessPlatformPart::app_shim_listener() {
   return app_shim_listener_.get();
 }
-
-GeolocationSystemPermissionManager*
-BrowserProcessPlatformPart::location_permission_manager() {
-  return location_permission_manager_.get();
-}
diff --git a/chrome/browser/browser_switcher/browser_switcher_navigation_throttle.cc b/chrome/browser/browser_switcher/browser_switcher_navigation_throttle.cc
index 20c626ae..a074a817 100644
--- a/chrome/browser/browser_switcher/browser_switcher_navigation_throttle.cc
+++ b/chrome/browser/browser_switcher/browser_switcher_navigation_throttle.cc
@@ -14,11 +14,11 @@
 #include "chrome/browser/browser_switcher/browser_switcher_service_factory.h"
 #include "chrome/browser/browser_switcher/browser_switcher_sitelist.h"
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/webui_url_constants.h"
 #include "components/navigation_interception/intercept_navigation_throttle.h"
 #include "components/navigation_interception/navigation_params.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
index 70c3fc35..0984c08a 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
@@ -96,6 +96,14 @@
 #include "chrome/browser/media/library_cdm_test_helper.h"
 #endif  // BUILDFLAG(ENABLE_LIBRARY_CDMS)
 
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/browser_process_platform_part.h"
+#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/chromeos/policy/system_proxy_manager.h"
+#include "chromeos/dbus/system_proxy/system_proxy_client.h"
+#endif  // defined(OS_CHROMEOS)
+
 using content::BrowserThread;
 using content::BrowsingDataFilterBuilder;
 
@@ -1495,6 +1503,26 @@
   }
 }
 
+#if defined(OS_CHROMEOS)
+// Test that removing passwords, when System-proxy is enabled on Chrome OS,
+// sends a request to System-proxy to clear the cached user credentials.
+IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverBrowserTest,
+                       SystemProxyClearsUserCredentials) {
+  g_browser_process->platform_part()
+      ->browser_policy_connector_chromeos()
+      ->GetSystemProxyManager()
+      ->SetSystemProxyEnabledForTest(true);
+  EXPECT_EQ(0, chromeos::SystemProxyClient::Get()
+                   ->GetTestInterface()
+                   ->GetClearUserCredentialsCount());
+  RemoveAndWait(ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PASSWORDS);
+
+  EXPECT_EQ(1, chromeos::SystemProxyClient::Get()
+                   ->GetTestInterface()
+                   ->GetClearUserCredentialsCount());
+}
+#endif  // defined(OS_CHROMEOS)
+
 // Some storage backend use a different code path for full deletions and
 // partial deletions, so we need to test both.
 INSTANTIATE_TEST_SUITE_P(All,
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
index 3026ebe..fcdc1368 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -61,7 +61,6 @@
 #include "chrome/browser/password_manager/password_store_factory.h"
 #include "chrome/browser/permissions/adaptive_quiet_notification_permission_ui_enabler.h"
 #include "chrome/browser/permissions/permission_decision_auto_blocker_factory.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/previews/previews_service.h"
 #include "chrome/browser/previews/previews_service_factory.h"
@@ -105,6 +104,7 @@
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "components/permissions/permission_decision_auto_blocker.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/previews/content/previews_ui_service.h"
 #include "components/site_isolation/pref_names.h"
 #include "components/web_cache/browser/web_cache_manager.h"
@@ -152,6 +152,10 @@
 #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
 #if defined(OS_CHROMEOS)
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/browser_process_platform_part.h"
+#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/chromeos/policy/system_proxy_manager.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chromeos/cryptohome/cryptohome_parameters.h"
 #include "chromeos/dbus/constants/attestation_constants.h"
@@ -895,6 +899,22 @@
         ->ClearHttpAuthCache(delete_begin_,
                              CreateTaskCompletionClosureForMojo(
                                  TracingDataType::kHttpAuthCache));
+#if defined(OS_CHROMEOS)
+    policy::SystemProxyManager* system_proxy_manager =
+        g_browser_process->platform_part()
+            ->browser_policy_connector_chromeos()
+            ->GetSystemProxyManager();
+    if (system_proxy_manager) {
+      // Sends a request to the System-proxy daemon to clear the proxy user
+      // credentials. System-proxy retrieves proxy username and password from
+      // the NetworkService, but not the creation time of the credentials. The
+      // |ClearUserCredentials| request will remove all the cached proxy
+      // credentials. If credentials prior to |delete_begin_| are removed from
+      // System-proxy, the daemon will send a D-Bus request to Chrome to fetch
+      // them from the NetworkService when needed.
+      system_proxy_manager->ClearUserCredentials();
+    }
+#endif  // defined(OS_CHROMEOS)
 
 #if defined(OS_MAC)
     device::fido::mac::TouchIdCredentialStore(
diff --git a/chrome/browser/chrome_browser_field_trials_desktop.cc b/chrome/browser/chrome_browser_field_trials_desktop.cc
index f5910748..367d76c 100644
--- a/chrome/browser/chrome_browser_field_trials_desktop.cc
+++ b/chrome/browser/chrome_browser_field_trials_desktop.cc
@@ -11,14 +11,13 @@
 #include "base/feature_list.h"
 #include "base/metrics/field_trial.h"
 #include "base/metrics/field_trial_params.h"
-#include "chrome/browser/prerender/prerender_field_trial.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
 #include "components/metrics/persistent_system_profile.h"
+#include "components/prerender/browser/prerender_field_trial.h"
 #include "components/variations/variations_associated_data.h"
 #include "content/public/common/content_switches.h"
 
-
 namespace chrome {
 
 namespace {
diff --git a/chrome/browser/chrome_browser_field_trials_mobile.cc b/chrome/browser/chrome_browser_field_trials_mobile.cc
index fba54a6..b31bc21 100644
--- a/chrome/browser/chrome_browser_field_trials_mobile.cc
+++ b/chrome/browser/chrome_browser_field_trials_mobile.cc
@@ -8,7 +8,7 @@
 #include "chrome/browser/browser_process.h"
 
 #if defined(OS_ANDROID)
-#include "chrome/browser/prerender/prerender_field_trial.h"
+#include "components/prerender/browser/prerender_field_trial.h"
 #endif
 
 namespace chrome {
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index 3074a26..dff7470 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -22,7 +22,6 @@
 #include "chrome/browser/predictors/network_hints_handler_impl.h"
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
 #include "chrome/browser/prerender/chrome_prerender_processor_impl_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/prerender/prerender_processor_impl.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ssl/insecure_sensitive_input_driver_factory.h"
@@ -51,6 +50,7 @@
 #include "components/performance_manager/embedder/binders.h"
 #include "components/performance_manager/public/performance_manager.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "components/safe_browsing/buildflags.h"
 #include "components/security_state/content/content_utils.h"
 #include "components/security_state/core/security_state.h"
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 9cfb76d..34a8539 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -96,7 +96,6 @@
 #include "chrome/browser/prerender/isolated/isolated_prerender_service.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_service_factory.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/previews/previews_content_util.h"
 #include "chrome/browser/previews/previews_service.h"
@@ -233,6 +232,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
 #include "components/prerender//common/prerender_url_loader_throttle.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/prerender/common/prerender_final_status.h"
 #include "components/prerender/common/prerender_types.mojom.h"
 #include "components/prerender/common/prerender_util.h"
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 24ee219..fdfefcd 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -888,8 +888,8 @@
     "child_accounts/time_limits/app_time_limit_interface.h",
     "child_accounts/time_limits/app_time_limit_utils.cc",
     "child_accounts/time_limits/app_time_limit_utils.h",
-    "child_accounts/time_limits/app_time_limits_whitelist_policy_wrapper.cc",
-    "child_accounts/time_limits/app_time_limits_whitelist_policy_wrapper.h",
+    "child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.cc",
+    "child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.h",
     "child_accounts/time_limits/app_time_notification_delegate.h",
     "child_accounts/time_limits/app_time_policy_helpers.cc",
     "child_accounts/time_limits/app_time_policy_helpers.h",
@@ -2800,6 +2800,7 @@
   deps = [
     ":chromeos",
     "//base",
+    "//dbus",
   ]
 }
 
@@ -3039,10 +3040,10 @@
     "child_accounts/time_limits/app_activity_registry_unittest.cc",
     "child_accounts/time_limits/app_service_wrapper_unittest.cc",
     "child_accounts/time_limits/app_time_controller_unittest.cc",
+    "child_accounts/time_limits/app_time_limits_allowlist_policy_test_utils.cc",
+    "child_accounts/time_limits/app_time_limits_allowlist_policy_test_utils.h",
     "child_accounts/time_limits/app_time_limits_policy_builder.cc",
     "child_accounts/time_limits/app_time_limits_policy_builder.h",
-    "child_accounts/time_limits/app_time_limits_whitelist_policy_test_utils.cc",
-    "child_accounts/time_limits/app_time_limits_whitelist_policy_test_utils.h",
     "child_accounts/time_limits/app_time_test_utils.cc",
     "child_accounts/time_limits/app_time_test_utils.h",
     "child_accounts/time_limits/app_types_unittest.cc",
diff --git a/chrome/browser/chromeos/android_sms/android_sms_app_manager_impl.cc b/chrome/browser/chromeos/android_sms/android_sms_app_manager_impl.cc
index 118b1dae..3c03087 100644
--- a/chrome/browser/chromeos/android_sms/android_sms_app_manager_impl.cc
+++ b/chrome/browser/chromeos/android_sms/android_sms_app_manager_impl.cc
@@ -48,7 +48,6 @@
                                                     const std::string& app_id) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy);
   proxy->Launch(
       app_id,
       apps::GetEventFlags(apps::mojom::LaunchContainer::kLaunchContainerWindow,
diff --git a/chrome/browser/chromeos/apps/intent_helper/common_apps_navigation_throttle.cc b/chrome/browser/chromeos/apps/intent_helper/common_apps_navigation_throttle.cc
index 61a2b0b..80a2231 100644
--- a/chrome/browser/chromeos/apps/intent_helper/common_apps_navigation_throttle.cc
+++ b/chrome/browser/chromeos/apps/intent_helper/common_apps_navigation_throttle.cc
@@ -114,9 +114,6 @@
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
 
-  if (!proxy)
-    return;
-
   if (should_persist)
     proxy->AddPreferredApp(launch_name, url);
 
@@ -182,9 +179,6 @@
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
 
-  if (!proxy)
-    return apps;
-
   std::vector<std::string> app_ids = proxy->GetAppIdsForUrl(url);
 
   for (const std::string& app_id : app_ids) {
@@ -228,9 +222,6 @@
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
 
-  if (!proxy)
-    return false;
-
   std::vector<std::string> app_ids = proxy->GetAppIdsForUrl(url);
 
   if (app_ids.empty())
diff --git a/chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge_unittest.cc b/chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge_unittest.cc
index cbfc90f..9b47ba8 100644
--- a/chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge_unittest.cc
+++ b/chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge_unittest.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/chromeos/arc/test/test_arc_session_manager.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/session_manager/fake_session_manager_client.h"
 #include "components/arc/arc_prefs.h"
 #include "components/arc/arc_service_manager.h"
@@ -33,14 +34,18 @@
   ArcBootPhaseMonitorBridgeTest()
       : scoped_user_manager_(
             std::make_unique<chromeos::FakeChromeUserManager>()),
-        arc_service_manager_(std::make_unique<ArcServiceManager>()),
-        arc_session_manager_(
-            CreateTestArcSessionManager(std::make_unique<ArcSessionRunner>(
-                base::BindRepeating(FakeArcSession::Create)))),
-        testing_profile_(std::make_unique<TestingProfile>()),
         record_uma_counter_(0) {
+    // Need to initialize DBusThreadManager before ArcSessionManager's
+    // constructor calls DBusThreadManager::Get().
+    chromeos::DBusThreadManager::Initialize();
     chromeos::SessionManagerClient::InitializeFakeInMemory();
 
+    arc_service_manager_ = std::make_unique<ArcServiceManager>();
+    arc_session_manager_ = CreateTestArcSessionManager(
+      std::make_unique<ArcSessionRunner>(
+      base::BindRepeating(FakeArcSession::Create)));
+    testing_profile_ = std::make_unique<TestingProfile>();
+
     SetArcAvailableCommandLineForTesting(
         base::CommandLine::ForCurrentProcess());
 
@@ -58,7 +63,11 @@
 
   ~ArcBootPhaseMonitorBridgeTest() override {
     boot_phase_monitor_bridge_->Shutdown();
+    testing_profile_.reset();
+    arc_session_manager_.reset();
+    arc_service_manager_.reset();
     chromeos::SessionManagerClient::Shutdown();
+    chromeos::DBusThreadManager::Shutdown();
   }
 
  protected:
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc b/chrome/browser/chromeos/arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc
index bb9d31e1..afc6ebb2 100644
--- a/chrome/browser/chromeos/arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc
+++ b/chrome/browser/chromeos/arc/instance_throttle/arc_boot_phase_throttle_observer_unittest.cc
@@ -10,8 +10,10 @@
 #include "base/values.h"
 #include "chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h"
 #include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/test/test_arc_session_manager.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/arc/arc_prefs.h"
 #include "components/arc/arc_service_manager.h"
 #include "components/arc/arc_util.h"
@@ -27,16 +29,20 @@
  public:
   ArcBootPhaseThrottleObserverTest()
       : scoped_user_manager_(
-            std::make_unique<chromeos::FakeChromeUserManager>()),
-        arc_session_manager_(
-            std::make_unique<ArcSessionRunner>(
-                base::Bind(FakeArcSession::Create)),
-            std::make_unique<AdbSideloadingAvailabilityDelegateImpl>()) {
+            std::make_unique<chromeos::FakeChromeUserManager>()) {
+    // Need to initialize DBusThreadManager before ArcSessionManager's
+    // constructor calls DBusThreadManager::Get().
+    chromeos::DBusThreadManager::Initialize();
+    arc_session_manager_ =
+        CreateTestArcSessionManager(std::make_unique<ArcSessionRunner>(
+            base::BindRepeating(FakeArcSession::Create)));
+    testing_profile_ = std::make_unique<TestingProfile>();
+
     // Setup and login profile
     SetArcAvailableCommandLineForTesting(
         base::CommandLine::ForCurrentProcess());
-    const AccountId account_id(
-        AccountId::FromUserEmailGaiaId(profile()->GetProfileUserName(), ""));
+    const AccountId account_id(AccountId::FromUserEmailGaiaId(
+        testing_profile_->GetProfileUserName(), ""));
     auto* user_manager = static_cast<chromeos::FakeChromeUserManager*>(
         user_manager::UserManager::Get());
     user_manager->AddUser(account_id);
@@ -45,32 +51,38 @@
     // By default, ARC is not started for opt-in.
     arc_session_manager()->set_directly_started_for_testing(true);
 
-    ArcBootPhaseMonitorBridge::GetForBrowserContextForTesting(profile());
+    ArcBootPhaseMonitorBridge::GetForBrowserContextForTesting(
+        testing_profile_.get());
     observer()->StartObserving(
-        profile(),
+        testing_profile_.get(),
         ArcBootPhaseThrottleObserver::ObserverStateChangedCallback());
   }
 
-  void TearDown() override { observer()->StopObserving(); }
+  void TearDown() override {
+    observer()->StopObserving();
+    testing_profile_.reset();
+    arc_session_manager_.reset();
+    chromeos::DBusThreadManager::Shutdown();
+  }
 
  protected:
   sync_preferences::TestingPrefServiceSyncable* GetPrefs() {
-    return testing_profile_.GetTestingPrefService();
+    return testing_profile_->GetTestingPrefService();
   }
 
   ArcBootPhaseThrottleObserver* observer() { return &observer_; }
 
-  TestingProfile* profile() { return &testing_profile_; }
-
-  ArcSessionManager* arc_session_manager() { return &arc_session_manager_; }
+  ArcSessionManager* arc_session_manager() {
+    return arc_session_manager_.get();
+  }
 
  private:
   content::BrowserTaskEnvironment task_environment_;
   user_manager::ScopedUserManager scoped_user_manager_;
   ArcServiceManager arc_service_manager_;
-  ArcSessionManager arc_session_manager_;
+  std::unique_ptr<ArcSessionManager> arc_session_manager_;
   ArcBootPhaseThrottleObserver observer_;
-  TestingProfile testing_profile_;
+  std::unique_ptr<TestingProfile> testing_profile_;
 
   DISALLOW_COPY_AND_ASSIGN(ArcBootPhaseThrottleObserverTest);
 };
diff --git a/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle_unittest.cc b/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle_unittest.cc
index a0029e2a..1d97a3e7 100644
--- a/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle_unittest.cc
+++ b/chrome/browser/chromeos/arc/instance_throttle/arc_instance_throttle_unittest.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/chromeos/arc/test/test_arc_session_manager.h"
 #include "chrome/browser/chromeos/throttle_observer.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/arc/arc_prefs.h"
 #include "components/arc/arc_service_manager.h"
 #include "components/arc/arc_util.h"
@@ -29,13 +30,17 @@
 class ArcInstanceThrottleTest : public testing::Test {
  public:
   ArcInstanceThrottleTest()
-      : arc_service_manager_(std::make_unique<ArcServiceManager>()),
-        arc_session_manager_(
-            CreateTestArcSessionManager(std::make_unique<ArcSessionRunner>(
-                base::BindRepeating(FakeArcSession::Create)))),
-        testing_profile_(std::make_unique<TestingProfile>()),
-        disable_cpu_restriction_counter_(0),
+      : disable_cpu_restriction_counter_(0),
         enable_cpu_restriction_counter_(0) {
+    // Need to initialize DBusThreadManager before ArcSessionManager's
+    // constructor calls DBusThreadManager::Get().
+    chromeos::DBusThreadManager::Initialize();
+    arc_service_manager_ = std::make_unique<ArcServiceManager>();
+    arc_session_manager_ =
+        CreateTestArcSessionManager(std::make_unique<ArcSessionRunner>(
+            base::BindRepeating(FakeArcSession::Create)));
+    testing_profile_ = std::make_unique<TestingProfile>();
+
     SetArcAvailableCommandLineForTesting(
         base::CommandLine::ForCurrentProcess());
 
@@ -48,6 +53,13 @@
         std::make_unique<TestDelegateImpl>(this));
   }
 
+  ~ArcInstanceThrottleTest() override {
+    testing_profile_.reset();
+    arc_session_manager_.reset();
+    arc_service_manager_.reset();
+    chromeos::DBusThreadManager::Shutdown();
+  }
+
  protected:
   sync_preferences::TestingPrefServiceSyncable* GetPrefs() {
     return testing_profile_->GetTestingPrefService();
diff --git a/chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc b/chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc
index b92c4cf..7353c38 100644
--- a/chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc
+++ b/chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/notifications/notification_display_service_tester.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/arc/arc_prefs.h"
 #include "components/arc/arc_service_manager.h"
 #include "components/arc/arc_util.h"
@@ -42,6 +43,9 @@
             std::make_unique<chromeos::FakeChromeUserManager>()) {}
 
   void SetUp() override {
+    // Need to initialize DBusThreadManager before ArcSessionManager's
+    // constructor calls DBusThreadManager::Get().
+    chromeos::DBusThreadManager::Initialize();
     SetArcAvailableCommandLineForTesting(
         base::CommandLine::ForCurrentProcess());
     ArcSessionManager::SetUiEnabledForTesting(false);
@@ -76,6 +80,7 @@
     BrowserWithTestWindowTest::TearDown();
     arc_session_manager_.reset();
     arc_service_manager_.reset();
+    chromeos::DBusThreadManager::Shutdown();
   }
 
   chromeos::FakeChromeUserManager* GetFakeUserManager() {
diff --git a/chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler_unittest.cc b/chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler_unittest.cc
index 1d48d9e..f12090c 100644
--- a/chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler_unittest.cc
+++ b/chrome/browser/chromeos/arc/session/arc_play_store_enabled_preference_handler_unittest.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
 #include "chromeos/dbus/upstart/upstart_client.h"
 #include "components/arc/arc_prefs.h"
@@ -54,6 +55,9 @@
             std::make_unique<chromeos::FakeChromeUserManager>()) {}
 
   void SetUp() override {
+    // Need to initialize DBusThreadManager before ArcSessionManager's
+    // constructor calls DBusThreadManager::Get().
+    chromeos::DBusThreadManager::Initialize();
     chromeos::SessionManagerClient::InitializeFakeInMemory();
     chromeos::UpstartClient::InitializeFake();
 
@@ -95,6 +99,7 @@
     profile_.reset();
     chromeos::UpstartClient::Shutdown();
     chromeos::SessionManagerClient::Shutdown();
+    chromeos::DBusThreadManager::Shutdown();
   }
 
   TestingProfile* profile() const { return profile_.get(); }
diff --git a/chrome/browser/chromeos/arc/session/arc_session_manager.cc b/chrome/browser/chromeos/arc/session/arc_session_manager.cc
index 1c777ab..30f0597 100644
--- a/chrome/browser/chromeos/arc/session/arc_session_manager.cc
+++ b/chrome/browser/chromeos/arc/session/arc_session_manager.cc
@@ -462,11 +462,15 @@
   if (chromeos::SessionManagerClient::Get())
     chromeos::SessionManagerClient::Get()->AddObserver(this);
   ResetStabilityMetrics();
+  chromeos::DBusThreadManager::Get()->GetConciergeClient()->AddVmObserver(this);
 }
 
 ArcSessionManager::~ArcSessionManager() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
+  chromeos::DBusThreadManager::Get()->GetConciergeClient()->RemoveVmObserver(
+      this);
+
   if (chromeos::SessionManagerClient::Get())
     chromeos::SessionManagerClient::Get()->RemoveObserver(this);
 
@@ -963,6 +967,25 @@
   return playstore_launcher_.get();
 }
 
+void ArcSessionManager::OnVmStarted(
+    const vm_tools::concierge::VmStartedSignal& vm_signal) {
+  // When an ARCVM starts, store the vm info.
+  if (vm_signal.name() == kArcVmName)
+    vm_info_ = vm_signal.vm_info();
+}
+
+void ArcSessionManager::OnVmStopped(
+    const vm_tools::concierge::VmStoppedSignal& vm_signal) {
+  // When an ARCVM stops, clear the stored vm info.
+  if (vm_signal.name() == kArcVmName)
+    vm_info_ = base::nullopt;
+}
+
+const base::Optional<vm_tools::concierge::VmInfo>&
+ArcSessionManager::GetVmInfo() const {
+  return vm_info_;
+}
+
 bool ArcSessionManager::RequestEnableImpl() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(profile_);
diff --git a/chrome/browser/chromeos/arc/session/arc_session_manager.h b/chrome/browser/chromeos/arc/session/arc_session_manager.h
index 1e3afe52..ff6fbf9 100644
--- a/chrome/browser/chromeos/arc/session/arc_session_manager.h
+++ b/chrome/browser/chromeos/arc/session/arc_session_manager.h
@@ -20,6 +20,7 @@
 #include "chrome/browser/chromeos/arc/session/adb_sideloading_availability_delegate_impl.h"
 #include "chrome/browser/chromeos/arc/session/arc_session_manager_observer.h"
 #include "chrome/browser/chromeos/policy/android_management_client.h"
+#include "chromeos/dbus/concierge_client.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
 #include "components/arc/mojom/auth.mojom.h"
 #include "components/arc/session/arc_session_runner.h"
@@ -47,7 +48,8 @@
 // This class is responsible for handing stages of ARC life-cycle.
 class ArcSessionManager : public ArcSessionRunner::Observer,
                           public ArcSupportHost::ErrorDelegate,
-                          public chromeos::SessionManagerClient::Observer {
+                          public chromeos::SessionManagerClient::Observer,
+                          public chromeos::ConciergeClient::VmObserver {
  public:
   // Represents each State of ARC session.
   // NOT_INITIALIZED: represents the state that the Profile is not yet ready
@@ -282,6 +284,16 @@
     property_files_dest_dir_ = property_files_dest_dir;
   }
 
+  // chromeos::ConciergeClient::VmObserver overrides.
+  void OnVmStarted(
+      const vm_tools::concierge::VmStartedSignal& vm_signal) override;
+  void OnVmStopped(
+      const vm_tools::concierge::VmStoppedSignal& vm_signal) override;
+
+  // Getter for |vm_info_|.
+  // If ARCVM is not running, return base::nullopt.
+  const base::Optional<vm_tools::concierge::VmInfo>& GetVmInfo() const;
+
  private:
   // Reports statuses of OptIn flow to UMA.
   class ScopedOptInFlowTracker;
@@ -417,6 +429,8 @@
   base::FilePath property_files_source_dir_;
   base::FilePath property_files_dest_dir_;
 
+  base::Optional<vm_tools::concierge::VmInfo> vm_info_;
+
   // Must be the last member.
   base::WeakPtrFactory<ArcSessionManager> weak_ptr_factory_{this};
 
diff --git a/chrome/browser/chromeos/arc/session/arc_session_manager_unittest.cc b/chrome/browser/chromeos/arc/session/arc_session_manager_unittest.cc
index 6d9d19c..e5c23544 100644
--- a/chrome/browser/chromeos/arc/session/arc_session_manager_unittest.cc
+++ b/chrome/browser/chromeos/arc/session/arc_session_manager_unittest.cc
@@ -46,6 +46,7 @@
 #include "chrome/test/base/testing_profile.h"
 #include "chromeos/constants/chromeos_switches.h"
 #include "chromeos/dbus/cryptohome/fake_cryptohome_client.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/power/power_manager_client.h"
 #include "chromeos/dbus/session_manager/session_manager_client.h"
 #include "chromeos/dbus/upstart/upstart_client.h"
@@ -127,6 +128,9 @@
   ArcSessionManagerInLoginScreenTest()
       : user_manager_enabler_(
             std::make_unique<chromeos::FakeChromeUserManager>()) {
+    // Need to initialize DBusThreadManager before ArcSessionManager's
+    // constructor calls DBusThreadManager::Get().
+    chromeos::DBusThreadManager::Initialize();
     chromeos::SessionManagerClient::InitializeFakeInMemory();
 
     ArcSessionManager::SetUiEnabledForTesting(false);
@@ -143,6 +147,7 @@
     arc_session_manager_.reset();
     arc_service_manager_.reset();
     chromeos::SessionManagerClient::Shutdown();
+    chromeos::DBusThreadManager::Shutdown();
   }
 
  protected:
@@ -202,6 +207,7 @@
   ~ArcSessionManagerTestBase() override = default;
 
   void SetUp() override {
+    chromeos::DBusThreadManager::Initialize();
     chromeos::PowerManagerClient::InitializeFake();
     chromeos::SessionManagerClient::InitializeFakeInMemory();
     chromeos::UpstartClient::InitializeFake();
@@ -235,6 +241,7 @@
     chromeos::UpstartClient::Shutdown();
     chromeos::SessionManagerClient::Shutdown();
     chromeos::PowerManagerClient::Shutdown();
+    chromeos::DBusThreadManager::Shutdown();
   }
 
   chromeos::FakeChromeUserManager* GetFakeUserManager() const {
@@ -981,6 +988,60 @@
   arc_session_manager()->Shutdown();
 }
 
+// Tests that |vm_info| is initialized with base::nullopt.
+TEST_F(ArcSessionManagerTest, GetVmInfo_InitialValue) {
+  const auto& vm_info = arc_session_manager()->GetVmInfo();
+  EXPECT_EQ(base::nullopt, vm_info);
+}
+
+// Tests that |vm_info| is updated with that from VmStartedSignal.
+TEST_F(ArcSessionManagerTest, GetVmInfo_WithVmStarted) {
+  vm_tools::concierge::VmStartedSignal vm_signal;
+  vm_signal.set_name(kArcVmName);
+  vm_signal.mutable_vm_info()->set_seneschal_server_handle(1000UL);
+  arc_session_manager()->OnVmStarted(vm_signal);
+
+  const auto& vm_info = arc_session_manager()->GetVmInfo();
+  ASSERT_NE(base::nullopt, vm_info);
+  EXPECT_EQ(1000UL, vm_info->seneschal_server_handle());
+}
+
+// Tests that |vm_info| remains as base::nullopt after VM stops.
+TEST_F(ArcSessionManagerTest, GetVmInfo_WithVmStopped) {
+  vm_tools::concierge::VmStoppedSignal vm_signal;
+  vm_signal.set_name(kArcVmName);
+  arc_session_manager()->OnVmStopped(vm_signal);
+
+  const auto& vm_info = arc_session_manager()->GetVmInfo();
+  EXPECT_EQ(base::nullopt, vm_info);
+}
+
+// Tests that |vm_info| is reset to base::nullopt after VM starts and stops.
+TEST_F(ArcSessionManagerTest, GetVmInfo_WithVmStarted_ThenStopped) {
+  vm_tools::concierge::VmStartedSignal start_signal;
+  start_signal.set_name(kArcVmName);
+  start_signal.mutable_vm_info()->set_seneschal_server_handle(1000UL);
+  arc_session_manager()->OnVmStarted(start_signal);
+
+  vm_tools::concierge::VmStoppedSignal stop_signal;
+  stop_signal.set_name(kArcVmName);
+  arc_session_manager()->OnVmStopped(stop_signal);
+
+  const auto& vm_info = arc_session_manager()->GetVmInfo();
+  EXPECT_EQ(base::nullopt, vm_info);
+}
+
+// Tests that |vm_info| is not updated with non-ARCVM VmStartedSignal.
+TEST_F(ArcSessionManagerTest, GetVmInfo_WithNonVmStarted) {
+  vm_tools::concierge::VmStartedSignal non_vm_signal;
+  non_vm_signal.set_name("non-ARCVM");
+  non_vm_signal.mutable_vm_info()->set_seneschal_server_handle(1000UL);
+  arc_session_manager()->OnVmStarted(non_vm_signal);
+
+  const auto& vm_info = arc_session_manager()->GetVmInfo();
+  EXPECT_EQ(base::nullopt, vm_info);
+}
+
 class ArcSessionManagerArcAlwaysStartTest : public ArcSessionManagerTest {
  public:
   ArcSessionManagerArcAlwaysStartTest() = default;
diff --git a/chrome/browser/chromeos/child_accounts/child_user_service.cc b/chrome/browser/chromeos/child_accounts/child_user_service.cc
index 78daf35..bf5d7eb 100644
--- a/chrome/browser/chromeos/child_accounts/child_user_service.cc
+++ b/chrome/browser/chromeos/child_accounts/child_user_service.cc
@@ -114,18 +114,18 @@
   return app_time_controller_->web_time_enforcer()->blocked();
 }
 
-bool ChildUserService::WebTimeLimitWhitelistedURL(const GURL& url) const {
+bool ChildUserService::WebTimeLimitAllowlistedURL(const GURL& url) const {
   if (!app_time_controller_)
     return false;
   DCHECK(app_time_controller_->web_time_enforcer());
-  return app_time_controller_->web_time_enforcer()->IsURLWhitelisted(url);
+  return app_time_controller_->web_time_enforcer()->IsURLAllowlisted(url);
 }
 
-bool ChildUserService::AppTimeLimitWhitelistedApp(
+bool ChildUserService::AppTimeLimitAllowlistedApp(
     const app_time::AppId& app_id) const {
   if (!app_time_controller_)
     return false;
-  return app_time_controller_->app_registry()->IsWhitelistedApp(app_id);
+  return app_time_controller_->app_registry()->IsAllowlistedApp(app_id);
 }
 
 base::TimeDelta ChildUserService::GetWebTimeLimit() const {
diff --git a/chrome/browser/chromeos/child_accounts/child_user_service.h b/chrome/browser/chromeos/child_accounts/child_user_service.h
index ed65be1..76b89f8 100644
--- a/chrome/browser/chromeos/child_accounts/child_user_service.h
+++ b/chrome/browser/chromeos/child_accounts/child_user_service.h
@@ -81,13 +81,13 @@
   bool WebTimeLimitReached() const;
 
   // Returns whether given |url| can be used without any time restrictions.
-  // Viewing of whitelisted |url| does not count towards usage web time.
+  // Viewing of allowlisted |url| does not count towards usage web time.
   // Always returns false if per-app times limits feature is disabled.
-  bool WebTimeLimitWhitelistedURL(const GURL& url) const;
+  bool WebTimeLimitAllowlistedURL(const GURL& url) const;
 
   // Returns whether the application with id |app_id| can be used without any
   // time restrictions.
-  bool AppTimeLimitWhitelistedApp(const app_time::AppId& app_id) const;
+  bool AppTimeLimitAllowlistedApp(const app_time::AppId& app_id) const;
 
   // Returns time limit set for using the web on a given day.
   // Should only be called if |features::kPerAppTimeLimits| and
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc
index 255cf72..65926aac 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.cc
@@ -11,7 +11,7 @@
 #include "base/time/default_tick_clock.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limit_utils.h"
-#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_wrapper.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_time_notification_delegate.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/persisted_app_info.h"
@@ -329,7 +329,7 @@
   return activity_registry_.at(app_id).activity.is_active();
 }
 
-bool AppActivityRegistry::IsWhitelistedApp(const AppId& app_id) const {
+bool AppActivityRegistry::IsAllowlistedApp(const AppId& app_id) const {
   DCHECK(base::Contains(activity_registry_, app_id));
   return GetAppState(app_id) == AppState::kAlwaysAvailable;
 }
@@ -536,10 +536,10 @@
   if (!did_change && (IsAppAvailable(app_id) || app_limit.has_value()))
     return updated;
 
-  if (IsWhitelistedApp(app_id)) {
+  if (IsAllowlistedApp(app_id)) {
     if (app_limit.has_value()) {
       VLOG(1) << "Tried to set time limit for " << app_id
-              << " which is whitelisted.";
+              << " which is allowlisted.";
     }
 
     details.limit = base::nullopt;
@@ -567,7 +567,7 @@
   return updated;
 }
 
-void AppActivityRegistry::SetAppWhitelisted(const AppId& app_id) {
+void AppActivityRegistry::SetAppAllowlisted(const AppId& app_id) {
   if (!base::Contains(activity_registry_, app_id))
     return;
   SetAppState(app_id, AppState::kAlwaysAvailable);
@@ -602,10 +602,10 @@
   SetAppInactive(chrome_app_id, timestamp);
 }
 
-void AppActivityRegistry::OnTimeLimitWhitelistChanged(
-    const AppTimeLimitsWhitelistPolicyWrapper& wrapper) {
-  std::vector<AppId> whitelisted_apps = wrapper.GetWhitelistAppList();
-  for (const AppId& app : whitelisted_apps) {
+void AppActivityRegistry::OnTimeLimitAllowlistChanged(
+    const AppTimeLimitsAllowlistPolicyWrapper& wrapper) {
+  std::vector<AppId> allowlisted_apps = wrapper.GetAllowlistAppList();
+  for (const AppId& app : allowlisted_apps) {
     if (!base::Contains(activity_registry_, app))
       continue;
 
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h
index 71f3e8c..ee916d3 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h
@@ -32,7 +32,7 @@
 namespace chromeos {
 namespace app_time {
 
-class AppTimeLimitsWhitelistPolicyWrapper;
+class AppTimeLimitsAllowlistPolicyWrapper;
 class AppTimeNotificationDelegate;
 class PersistedAppInfo;
 
@@ -107,7 +107,7 @@
   bool IsAppBlocked(const AppId& app_id) const;
   bool IsAppTimeLimitReached(const AppId& app_id) const;
   bool IsAppActive(const AppId& app_id) const;
-  bool IsWhitelistedApp(const AppId& app_id) const;
+  bool IsAllowlistedApp(const AppId& app_id) const;
 
   // Manages AppStateObservers.
   void AddAppStateObserver(AppStateObserver* observer);
@@ -159,7 +159,7 @@
                    const base::Optional<AppLimit>& app_limit);
 
   // Sets the app identified with |app_id| as being always available.
-  void SetAppWhitelisted(const AppId& app_id);
+  void SetAppAllowlisted(const AppId& app_id);
 
   // Reset time has been reached at |timestamp|.
   void OnResetTimeReached(base::Time timestamp);
@@ -168,9 +168,9 @@
   void OnChromeAppActivityChanged(ChromeAppActivityState state,
                                   base::Time timestamp);
 
-  // Whitelisted applications changed. Called by AppTimeController.
-  void OnTimeLimitWhitelistChanged(
-      const AppTimeLimitsWhitelistPolicyWrapper& wrapper);
+  // Allowlisted applications changed. Called by AppTimeController.
+  void OnTimeLimitAllowlistChanged(
+      const AppTimeLimitsAllowlistPolicyWrapper& wrapper);
 
   // Saves app activity into user preference.
   void SaveAppActivity();
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc
index 2e8538758..58b3420d 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry_unittest.cc
@@ -13,8 +13,8 @@
 #include "base/time/time.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limit_utils.h"
-#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_test_utils.h"
-#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_wrapper.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_test_utils.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_time_notification_delegate.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_types.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/persisted_app_info.h"
@@ -586,31 +586,31 @@
             *registry_test().GetTimeLeft(kApp1));
 }
 
-TEST_F(AppActivityRegistryTest, RemoveLimitsFromWhitelistedApps) {
+TEST_F(AppActivityRegistryTest, RemoveLimitsFromAllowlistedApps) {
   // Set initial limit.
   const AppLimit limit(AppRestriction::kTimeLimit,
                        base::TimeDelta::FromMinutes(5), base::Time::Now());
   SetAppLimit(kApp1, limit);
   SetAppLimit(kApp2, limit);
 
-  AppTimeLimitsWhitelistPolicyBuilder builder;
+  AppTimeLimitsAllowlistPolicyBuilder builder;
   builder.SetUp();
-  builder.AppendToWhitelistAppList(kApp1);
+  builder.AppendToAllowlistAppList(kApp1);
 
-  AppTimeLimitsWhitelistPolicyWrapper wrapper(&builder.value());
-  registry().OnTimeLimitWhitelistChanged(wrapper);
+  AppTimeLimitsAllowlistPolicyWrapper wrapper(&builder.value());
+  registry().OnTimeLimitAllowlistChanged(wrapper);
 
   EXPECT_FALSE(registry_test().GetAppLimit(kApp1));
   EXPECT_EQ(limit.daily_limit(), *registry().GetTimeLimit(kApp2));
   EXPECT_EQ(registry().GetAppState(kApp1), AppState::kAlwaysAvailable);
 }
 
-TEST_F(AppActivityRegistryTest, WhitelistedAppsNoLimits) {
-  AppTimeLimitsWhitelistPolicyBuilder builder;
+TEST_F(AppActivityRegistryTest, AllowlistedAppsNoLimits) {
+  AppTimeLimitsAllowlistPolicyBuilder builder;
   builder.SetUp();
-  builder.AppendToWhitelistAppList(kApp1);
-  AppTimeLimitsWhitelistPolicyWrapper wrapper(&builder.value());
-  registry().OnTimeLimitWhitelistChanged(wrapper);
+  builder.AppendToAllowlistAppList(kApp1);
+  AppTimeLimitsAllowlistPolicyWrapper wrapper(&builder.value());
+  registry().OnTimeLimitAllowlistChanged(wrapper);
 
   // Set initial limit.
   const AppLimit limit(AppRestriction::kTimeLimit,
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.cc
index 10023a3..7a542ec9 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.cc
@@ -170,7 +170,6 @@
     const {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile_);
-  DCHECK(proxy);
   const std::string app_service_id = AppServiceIdFromAppId(app_id, profile_);
   DCHECK(!app_service_id.empty());
 
@@ -298,24 +297,17 @@
 }
 
 apps::AppServiceProxy* AppServiceWrapper::GetAppProxy() {
-  apps::AppServiceProxy* proxy =
-      apps::AppServiceProxyFactory::GetForProfile(profile_);
-  DCHECK(proxy);
-  return proxy;
+  return apps::AppServiceProxyFactory::GetForProfile(profile_);
 }
 
 apps::AppRegistryCache& AppServiceWrapper::GetAppCache() const {
-  apps::AppServiceProxy* proxy =
-      apps::AppServiceProxyFactory::GetForProfile(profile_);
-  DCHECK(proxy);
-  return proxy->AppRegistryCache();
+  return apps::AppServiceProxyFactory::GetForProfile(profile_)
+      ->AppRegistryCache();
 }
 
 apps::InstanceRegistry& AppServiceWrapper::GetInstanceRegistry() const {
-  apps::AppServiceProxy* proxy =
-      apps::AppServiceProxyFactory::GetForProfile(profile_);
-  DCHECK(proxy);
-  return proxy->InstanceRegistry();
+  return apps::AppServiceProxyFactory::GetForProfile(profile_)
+      ->InstanceRegistry();
 }
 
 bool AppServiceWrapper::ShouldIncludeApp(const AppId& app_id) const {
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc
index 5ac023e..8355345 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.cc
@@ -19,7 +19,7 @@
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limit_utils.h"
-#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_wrapper.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_types.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/web_time_activity_provider.h"
@@ -213,7 +213,7 @@
 void AppTimeController::RegisterProfilePrefs(PrefRegistrySimple* registry) {
   registry->RegisterInt64Pref(prefs::kPerAppTimeLimitsLastResetTime, 0);
   registry->RegisterDictionaryPref(prefs::kPerAppTimeLimitsPolicy);
-  registry->RegisterDictionaryPref(prefs::kPerAppTimeLimitsWhitelistPolicy);
+  registry->RegisterDictionaryPref(prefs::kPerAppTimeLimitsAllowlistPolicy);
 }
 
 AppTimeController::AppTimeController(Profile* profile)
@@ -233,7 +233,7 @@
 
   PrefService* pref_service = profile->GetPrefs();
   RegisterProfilePrefObservers(pref_service);
-  TimeLimitsWhitelistPolicyUpdated(prefs::kPerAppTimeLimitsWhitelistPolicy);
+  TimeLimitsAllowlistPolicyUpdated(prefs::kPerAppTimeLimitsAllowlistPolicy);
   TimeLimitsPolicyUpdated(prefs::kPerAppTimeLimitsPolicy);
 
   // Restore the last reset time. If reset time has have been crossed, triggers
@@ -287,7 +287,7 @@
     system_clock_client->RemoveObserver(this);
 }
 
-bool AppTimeController::IsExtensionWhitelisted(
+bool AppTimeController::IsExtensionAllowlisted(
     const std::string& extension_id) const {
   return true;
 }
@@ -329,8 +329,8 @@
       base::BindRepeating(&AppTimeController::TimeLimitsPolicyUpdated,
                           base::Unretained(this)));
   pref_registrar_->Add(
-      prefs::kPerAppTimeLimitsWhitelistPolicy,
-      base::BindRepeating(&AppTimeController::TimeLimitsWhitelistPolicyUpdated,
+      prefs::kPerAppTimeLimitsAllowlistPolicy,
+      base::BindRepeating(&AppTimeController::TimeLimitsAllowlistPolicyUpdated,
                           base::Unretained(this)));
 }
 
@@ -381,20 +381,20 @@
   }
 }
 
-void AppTimeController::TimeLimitsWhitelistPolicyUpdated(
+void AppTimeController::TimeLimitsAllowlistPolicyUpdated(
     const std::string& pref_name) {
-  DCHECK_EQ(pref_name, prefs::kPerAppTimeLimitsWhitelistPolicy);
+  DCHECK_EQ(pref_name, prefs::kPerAppTimeLimitsAllowlistPolicy);
 
   const base::DictionaryValue* policy = pref_registrar_->prefs()->GetDictionary(
-      prefs::kPerAppTimeLimitsWhitelistPolicy);
+      prefs::kPerAppTimeLimitsAllowlistPolicy);
 
   // Figure out a way to avoid cloning
-  AppTimeLimitsWhitelistPolicyWrapper wrapper(policy);
+  AppTimeLimitsAllowlistPolicyWrapper wrapper(policy);
 
-  app_registry_->OnTimeLimitWhitelistChanged(wrapper);
+  app_registry_->OnTimeLimitAllowlistChanged(wrapper);
 
   if (web_time_enforcer_)
-    web_time_enforcer_->OnTimeLimitWhitelistChanged(wrapper);
+    web_time_enforcer_->OnTimeLimitAllowlistChanged(wrapper);
 }
 
 void AppTimeController::ShowAppTimeLimitNotification(
@@ -443,14 +443,14 @@
   if (!WebTimeLimitEnforcer::IsEnabled() && IsWebAppOrExtension(app_id))
     return;
 
-  const base::Value* whitelist_policy = pref_registrar_->prefs()->GetDictionary(
-      prefs::kPerAppTimeLimitsWhitelistPolicy);
-  if (whitelist_policy && whitelist_policy->is_dict()) {
-    AppTimeLimitsWhitelistPolicyWrapper wrapper(whitelist_policy);
-    if (base::Contains(wrapper.GetWhitelistAppList(), app_id))
-      app_registry_->SetAppWhitelisted(app_id);
+  const base::Value* allowlist_policy = pref_registrar_->prefs()->GetDictionary(
+      prefs::kPerAppTimeLimitsAllowlistPolicy);
+  if (allowlist_policy && allowlist_policy->is_dict()) {
+    AppTimeLimitsAllowlistPolicyWrapper wrapper(allowlist_policy);
+    if (base::Contains(wrapper.GetAllowlistAppList(), app_id))
+      app_registry_->SetAppAllowlisted(app_id);
   } else {
-    LOG(WARNING) << " Invalid PerAppTimeLimitWhitelist policy";
+    LOG(WARNING) << " Invalid PerAppTimeLimitAllowlist policy";
   }
 
   const base::Value* policy =
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h b/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h
index 4e463dd..ce00e29 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h
@@ -78,7 +78,7 @@
   AppTimeController& operator=(const AppTimeController&) = delete;
   ~AppTimeController() override;
 
-  bool IsExtensionWhitelisted(const std::string& extension_id) const;
+  bool IsExtensionAllowlisted(const std::string& extension_id) const;
 
   // Returns current time limit for the app identified by |app_service_id| and
   // |app_type|.Will return nullopt if there is no limit set or app is not
@@ -132,7 +132,7 @@
  private:
   void RegisterProfilePrefObservers(PrefService* pref_service);
   void TimeLimitsPolicyUpdated(const std::string& pref_name);
-  void TimeLimitsWhitelistPolicyUpdated(const std::string& pref_name);
+  void TimeLimitsAllowlistPolicyUpdated(const std::string& pref_name);
 
   base::Time GetNextResetTime() const;
 
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_test_utils.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_test_utils.cc
similarity index 75%
rename from chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_test_utils.cc
rename to chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_test_utils.cc
index 7860a78..337fb2f 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_test_utils.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_test_utils.cc
@@ -1,39 +1,39 @@
 // Copyright 2019 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_test_utils.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_test_utils.h"
 
-#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_wrapper.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_time_policy_helpers.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_types.h"
 
 namespace chromeos {
 namespace app_time {
 
-AppTimeLimitsWhitelistPolicyBuilder::AppTimeLimitsWhitelistPolicyBuilder() =
+AppTimeLimitsAllowlistPolicyBuilder::AppTimeLimitsAllowlistPolicyBuilder() =
     default;
 
-AppTimeLimitsWhitelistPolicyBuilder::~AppTimeLimitsWhitelistPolicyBuilder() =
+AppTimeLimitsAllowlistPolicyBuilder::~AppTimeLimitsAllowlistPolicyBuilder() =
     default;
 
-void AppTimeLimitsWhitelistPolicyBuilder::SetUp() {
+void AppTimeLimitsAllowlistPolicyBuilder::SetUp() {
   value_ = base::Value(base::Value::Type::DICTIONARY);
   value_.SetKey(policy::kUrlList, base::Value(base::Value::Type::LIST));
   value_.SetKey(policy::kAppList, base::Value(base::Value::Type::LIST));
 }
 
-void AppTimeLimitsWhitelistPolicyBuilder::Clear() {
+void AppTimeLimitsAllowlistPolicyBuilder::Clear() {
   base::DictionaryValue* dict_value;
   value_.GetAsDictionary(&dict_value);
   dict_value->Clear();
 }
 
-void AppTimeLimitsWhitelistPolicyBuilder::AppendToWhitelistUrlList(
+void AppTimeLimitsAllowlistPolicyBuilder::AppendToAllowlistUrlList(
     const std::string& scheme) {
   AppendToList(policy::kUrlList, base::Value(scheme));
 }
 
-void AppTimeLimitsWhitelistPolicyBuilder::AppendToWhitelistAppList(
+void AppTimeLimitsAllowlistPolicyBuilder::AppendToAllowlistAppList(
     const AppId& app_id) {
   base::Value value_to_append(base::Value::Type::DICTIONARY);
   value_to_append.SetKey(policy::kAppId, base::Value(app_id.app_id()));
@@ -43,7 +43,7 @@
   AppendToList(policy::kAppList, std::move(value_to_append));
 }
 
-void AppTimeLimitsWhitelistPolicyBuilder::AppendToList(const std::string& key,
+void AppTimeLimitsAllowlistPolicyBuilder::AppendToList(const std::string& key,
                                                        base::Value value) {
   base::Value* list = value_.FindListKey(key);
   DCHECK(list);
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_test_utils.h b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_test_utils.h
new file mode 100644
index 0000000..0e4c175
--- /dev/null
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_test_utils.h
@@ -0,0 +1,43 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TIME_LIMITS_ALLOWLIST_POLICY_TEST_UTILS_H_
+#define CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TIME_LIMITS_ALLOWLIST_POLICY_TEST_UTILS_H_
+
+#include <string>
+
+#include "base/values.h"
+
+namespace chromeos {
+namespace app_time {
+
+class AppId;
+
+class AppTimeLimitsAllowlistPolicyBuilder {
+ public:
+  AppTimeLimitsAllowlistPolicyBuilder();
+  ~AppTimeLimitsAllowlistPolicyBuilder();
+
+  AppTimeLimitsAllowlistPolicyBuilder(
+      const AppTimeLimitsAllowlistPolicyBuilder&) = delete;
+  AppTimeLimitsAllowlistPolicyBuilder& operator=(
+      const AppTimeLimitsAllowlistPolicyBuilder&) = delete;
+
+  void SetUp();
+  void Clear();
+  void AppendToAllowlistUrlList(const std::string& scheme);
+  void AppendToAllowlistAppList(const AppId& app_id);
+
+  const base::Value& value() const { return value_; }
+
+ private:
+  void AppendToList(const std::string& key, base::Value value);
+
+  base::Value value_;
+};
+
+}  // namespace app_time
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TIME_LIMITS_ALLOWLIST_POLICY_TEST_UTILS_H_
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_wrapper.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.cc
similarity index 76%
rename from chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_wrapper.cc
rename to chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.cc
index 1e6d6cb3..dbe0449 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_wrapper.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.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 "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_wrapper.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.h"
 
 #include "base/logging.h"
 #include "base/optional.h"
@@ -12,27 +12,27 @@
 namespace chromeos {
 namespace app_time {
 
-AppTimeLimitsWhitelistPolicyWrapper::AppTimeLimitsWhitelistPolicyWrapper(
+AppTimeLimitsAllowlistPolicyWrapper::AppTimeLimitsAllowlistPolicyWrapper(
     const base::Value* value)
     : value_(value) {}
 
-AppTimeLimitsWhitelistPolicyWrapper::~AppTimeLimitsWhitelistPolicyWrapper() =
+AppTimeLimitsAllowlistPolicyWrapper::~AppTimeLimitsAllowlistPolicyWrapper() =
     default;
 
 std::vector<std::string>
-AppTimeLimitsWhitelistPolicyWrapper::GetWhitelistURLList() const {
+AppTimeLimitsAllowlistPolicyWrapper::GetAllowlistURLList() const {
   std::vector<std::string> return_value;
 
   const base::Value* list = value_->FindListKey(policy::kUrlList);
   if (!list) {
-    VLOG(1) << "Invalid whitelist URL list provided.";
+    VLOG(1) << "Invalid allowlist URL list provided.";
     return return_value;
   }
 
   base::Value::ConstListView list_view = list->GetList();
   for (const base::Value& value : list_view) {
     if (!value.is_string()) {
-      VLOG(1) << "Whitelist URL is not a string.";
+      VLOG(1) << "Allowlist URL is not a string.";
       continue;
     }
     return_value.push_back(value.GetString());
@@ -40,13 +40,13 @@
   return return_value;
 }
 
-std::vector<AppId> AppTimeLimitsWhitelistPolicyWrapper::GetWhitelistAppList()
+std::vector<AppId> AppTimeLimitsAllowlistPolicyWrapper::GetAllowlistAppList()
     const {
   std::vector<AppId> return_value;
 
   const base::Value* app_list = value_->FindListKey(policy::kAppList);
   if (!app_list) {
-    VLOG(1) << "Invalid whitelist application list.";
+    VLOG(1) << "Invalid allowlist application list.";
     return return_value;
   }
 
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.h b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.h
new file mode 100644
index 0000000..5433839
--- /dev/null
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.h
@@ -0,0 +1,39 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TIME_LIMITS_ALLOWLIST_POLICY_WRAPPER_H_
+#define CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TIME_LIMITS_ALLOWLIST_POLICY_WRAPPER_H_
+
+#include <string>
+#include <vector>
+
+#include "base/values.h"
+
+namespace chromeos {
+namespace app_time {
+
+class AppId;
+
+class AppTimeLimitsAllowlistPolicyWrapper {
+ public:
+  explicit AppTimeLimitsAllowlistPolicyWrapper(const base::Value* value);
+  ~AppTimeLimitsAllowlistPolicyWrapper();
+
+  // Delete copy constructor and copy assign operator.
+  AppTimeLimitsAllowlistPolicyWrapper(
+      const AppTimeLimitsAllowlistPolicyWrapper&) = delete;
+  AppTimeLimitsAllowlistPolicyWrapper& operator=(
+      const AppTimeLimitsAllowlistPolicyWrapper&) = delete;
+
+  std::vector<std::string> GetAllowlistURLList() const;
+  std::vector<AppId> GetAllowlistAppList() const;
+
+ private:
+  const base::Value* value_;
+};
+
+}  // namespace app_time
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TIME_LIMITS_ALLOWLIST_POLICY_WRAPPER_H_
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_test_utils.h b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_test_utils.h
deleted file mode 100644
index ffe404d..0000000
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_test_utils.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TIME_LIMITS_WHITELIST_POLICY_TEST_UTILS_H_
-#define CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TIME_LIMITS_WHITELIST_POLICY_TEST_UTILS_H_
-
-#include <string>
-
-#include "base/values.h"
-
-namespace chromeos {
-namespace app_time {
-
-class AppId;
-
-class AppTimeLimitsWhitelistPolicyBuilder {
- public:
-  AppTimeLimitsWhitelistPolicyBuilder();
-  ~AppTimeLimitsWhitelistPolicyBuilder();
-
-  AppTimeLimitsWhitelistPolicyBuilder(
-      const AppTimeLimitsWhitelistPolicyBuilder&) = delete;
-  AppTimeLimitsWhitelistPolicyBuilder& operator=(
-      const AppTimeLimitsWhitelistPolicyBuilder&) = delete;
-
-  void SetUp();
-  void Clear();
-  void AppendToWhitelistUrlList(const std::string& scheme);
-  void AppendToWhitelistAppList(const AppId& app_id);
-
-  const base::Value& value() const { return value_; }
-
- private:
-  void AppendToList(const std::string& key, base::Value value);
-
-  base::Value value_;
-};
-
-}  // namespace app_time
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TIME_LIMITS_WHITELIST_POLICY_TEST_UTILS_H_
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_wrapper.h b/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_wrapper.h
deleted file mode 100644
index 569fc74a..0000000
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_wrapper.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TIME_LIMITS_WHITELIST_POLICY_WRAPPER_H_
-#define CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TIME_LIMITS_WHITELIST_POLICY_WRAPPER_H_
-
-#include <string>
-#include <vector>
-
-#include "base/values.h"
-
-namespace chromeos {
-namespace app_time {
-
-class AppId;
-
-class AppTimeLimitsWhitelistPolicyWrapper {
- public:
-  explicit AppTimeLimitsWhitelistPolicyWrapper(const base::Value* value);
-  ~AppTimeLimitsWhitelistPolicyWrapper();
-
-  // Delete copy constructor and copy assign operator.
-  AppTimeLimitsWhitelistPolicyWrapper(
-      const AppTimeLimitsWhitelistPolicyWrapper&) = delete;
-  AppTimeLimitsWhitelistPolicyWrapper& operator=(
-      const AppTimeLimitsWhitelistPolicyWrapper&) = delete;
-
-  std::vector<std::string> GetWhitelistURLList() const;
-  std::vector<AppId> GetWhitelistAppList() const;
-
- private:
-  const base::Value* value_;
-};
-
-}  // namespace app_time
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TIME_LIMITS_WHITELIST_POLICY_WRAPPER_H_
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_types.h b/chrome/browser/chromeos/child_accounts/time_limits/app_types.h
index 749aa67c..7d7c64e 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/app_types.h
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_types.h
@@ -67,11 +67,11 @@
 
 enum class ChromeAppActivityState {
   // The browser is active and hosts urls in its active tab which are not
-  // whitelisted.
+  // allowlisted.
   kActive,
 
-  // Same as |kActive| except the urls the browser hosts are whitelisted.
-  kActiveWhitelisted,
+  // Same as |kActive| except the urls the browser hosts are allowlisted.
+  kActiveAllowlisted,
 
   // The browser window is not active.
   kInactive,
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/web_time_activity_provider.cc b/chrome/browser/chromeos/child_accounts/time_limits/web_time_activity_provider.cc
index 668d1cb3..63c94519 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/web_time_activity_provider.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/web_time_activity_provider.cc
@@ -203,7 +203,7 @@
 ChromeAppActivityState
 WebTimeActivityProvider::CalculateChromeAppActivityState() const {
   int active_count = 0;
-  int active_whitelisted_count = 0;
+  int active_allowlisted_count = 0;
 
   for (const Browser* browser : active_browsers_) {
     const content::WebContents* contents =
@@ -218,9 +218,9 @@
     // If |observer| is not instantiated, that means that
     // WebTimeNavigationObserver::MaybeCreateForWebContents didn't create it.
     // This means that WebTimeLimitEnforcer::IsEnabled returned false.
-    // Mark it as active whitelisted.
+    // Mark it as active allowlisted.
     if (!observer) {
-      active_whitelisted_count++;
+      active_allowlisted_count++;
       continue;
     }
 
@@ -235,8 +235,8 @@
       continue;
 
     WebTimeLimitEnforcer* enforcer = app_time_controller_->web_time_enforcer();
-    if (info->is_error || enforcer->IsURLWhitelisted(info->url)) {
-      active_whitelisted_count++;
+    if (info->is_error || enforcer->IsURLAllowlisted(info->url)) {
+      active_allowlisted_count++;
       continue;
     }
 
@@ -245,8 +245,8 @@
 
   if (active_count > 0)
     return ChromeAppActivityState::kActive;
-  if (active_whitelisted_count > 0)
-    return ChromeAppActivityState::kActiveWhitelisted;
+  if (active_allowlisted_count > 0)
+    return ChromeAppActivityState::kActiveAllowlisted;
   return ChromeAppActivityState::kInactive;
 }
 
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/web_time_calculation_browsertest.cc b/chrome/browser/chromeos/child_accounts/time_limits/web_time_calculation_browsertest.cc
index 37e02c23..00ba565 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/web_time_calculation_browsertest.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/web_time_calculation_browsertest.cc
@@ -17,7 +17,7 @@
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_activity_registry.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limit_utils.h"
-#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_test_utils.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_test_utils.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/web_time_navigation_observer.h"
 #include "chrome/browser/chromeos/login/test/scoped_policy_update.h"
@@ -64,7 +64,7 @@
   void SetUpOnMainThread() override;
   void TearDown() override;
 
-  void WhitelistUrlRegx(const std::string& url);
+  void AllowlistUrlRegx(const std::string& url);
   Browser* DetachTabToNewBrowser(Browser* browser, int tab_index);
   content::WebContents* Navigate(Browser* browser,
                                  const std::string& url_in,
@@ -79,7 +79,7 @@
 
   base::test::ScopedFeatureList scoped_feature_list_;
 
-  chromeos::app_time::AppTimeLimitsWhitelistPolicyBuilder builder_;
+  chromeos::app_time::AppTimeLimitsAllowlistPolicyBuilder builder_;
 
   chromeos::LoggedInUserMixin logged_in_user_mixin_{
       &mixin_host_, chromeos::LoggedInUserMixin::LogInType::kChild,
@@ -123,8 +123,8 @@
   MixinBasedInProcessBrowserTest::TearDown();
 }
 
-void WebTimeCalculationBrowserTest::WhitelistUrlRegx(const std::string& url) {
-  builder_.AppendToWhitelistUrlList(url);
+void WebTimeCalculationBrowserTest::AllowlistUrlRegx(const std::string& url) {
+  builder_.AppendToAllowlistUrlList(url);
   UpdatePolicy();
 }
 
@@ -165,7 +165,7 @@
   logged_in_user_mixin_.GetUserPolicyMixin()
       ->RequestPolicyUpdate()
       ->policy_payload()
-      ->mutable_perapptimelimitswhitelist()
+      ->mutable_perapptimelimitsallowlist()
       ->set_value(policy_value);
 
   logged_in_user_mixin_.GetUserPolicyTestHelper()->RefreshPolicyAndWait(
@@ -173,7 +173,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(WebTimeCalculationBrowserTest, TabSelectionChanges) {
-  WhitelistUrlRegx(kExampleHost1);
+  AllowlistUrlRegx(kExampleHost1);
 
   Navigate(browser(), kExampleHost1, WindowOpenDisposition::CURRENT_TAB);
 
@@ -184,7 +184,7 @@
             GetChromeAppActivityState());
 
   browser()->tab_strip_model()->ActivateTabAt(0);
-  EXPECT_EQ(chromeos::app_time::ChromeAppActivityState::kActiveWhitelisted,
+  EXPECT_EQ(chromeos::app_time::ChromeAppActivityState::kActiveAllowlisted,
             GetChromeAppActivityState());
 
   bool destroyed = browser()->tab_strip_model()->CloseWebContentsAt(
@@ -198,7 +198,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(WebTimeCalculationBrowserTest, TabDetached) {
-  WhitelistUrlRegx(kExampleHost1);
+  AllowlistUrlRegx(kExampleHost1);
 
   Navigate(browser(), kExampleHost1, WindowOpenDisposition::CURRENT_TAB);
 
@@ -207,7 +207,7 @@
 
   browser()->tab_strip_model()->ActivateTabAt(0);
 
-  EXPECT_EQ(chromeos::app_time::ChromeAppActivityState::kActiveWhitelisted,
+  EXPECT_EQ(chromeos::app_time::ChromeAppActivityState::kActiveAllowlisted,
             GetChromeAppActivityState());
 
   Browser* new_browser = DetachTabToNewBrowser(browser(), 1);
@@ -215,13 +215,13 @@
   EXPECT_EQ(chromeos::app_time::ChromeAppActivityState::kActive,
             GetChromeAppActivityState());
 
-  // Now we have two browser windows. One hosting a whitelisted url and the
-  // other hosting a non whitelisted url.
+  // Now we have two browser windows. One hosting a allowlisted url and the
+  // other hosting a non allowlisted url.
   EXPECT_TRUE(new_browser->tab_strip_model()->CloseWebContentsAt(
       0, TabStripModel::CloseTypes::CLOSE_USER_GESTURE));
   base::RunLoop().RunUntilIdle();
 
-  EXPECT_EQ(chromeos::app_time::ChromeAppActivityState::kActiveWhitelisted,
+  EXPECT_EQ(chromeos::app_time::ChromeAppActivityState::kActiveAllowlisted,
             GetChromeAppActivityState());
 
   EXPECT_TRUE(browser()->tab_strip_model()->CloseWebContentsAt(
@@ -233,4 +233,4 @@
 }
 
 // TODO(yilkal): Write test to check that going to a URL in the current tab of
-// the first browser will result in chrome being active or active whitelisted.
+// the first browser will result in chrome being active or active allowlisted.
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer.cc b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer.cc
index bff2db0..b8f2c62b 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer.cc
@@ -10,7 +10,7 @@
 #include "base/stl_util.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h"
-#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_wrapper.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_types.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_list.h"
@@ -55,9 +55,9 @@
   ReloadAllWebContents();
 }
 
-void WebTimeLimitEnforcer::OnTimeLimitWhitelistChanged(
-    const AppTimeLimitsWhitelistPolicyWrapper& wrapper) {
-  std::vector<std::string> whitelisted_urls = wrapper.GetWhitelistURLList();
+void WebTimeLimitEnforcer::OnTimeLimitAllowlistChanged(
+    const AppTimeLimitsAllowlistPolicyWrapper& wrapper) {
+  std::vector<std::string> allowlisted_urls = wrapper.GetAllowlistURLList();
 
   // clean up |url_matcher_|;
   url_matcher_ = std::make_unique<url_matcher::URLMatcher>();
@@ -65,7 +65,7 @@
   url_matcher::URLMatcherConditionSet::Vector condition_set_vector;
   auto* condition_factory = url_matcher_->condition_factory();
   int id = 0;
-  for (const auto& url : whitelisted_urls) {
+  for (const auto& url : allowlisted_urls) {
     url_matcher::URLMatcherCondition condition =
         condition_factory->CreateURLMatchesCondition(url);
 
@@ -82,7 +82,7 @@
   ReloadAllWebContents();
 }
 
-bool WebTimeLimitEnforcer::IsURLWhitelisted(const GURL& url) const {
+bool WebTimeLimitEnforcer::IsURLAllowlisted(const GURL& url) const {
   // Block everything if |scheme_filter_| and |domain_matcher_| are not
   // instantiated yet.
   if (!url_matcher_)
@@ -93,7 +93,7 @@
     effective_url = url;
 
   if (web_app::IsValidExtensionUrl(effective_url))
-    return app_time_controller_->IsExtensionWhitelisted(effective_url.host());
+    return app_time_controller_->IsExtensionAllowlisted(effective_url.host());
 
   auto matching_set_size = url_matcher_->MatchURL(effective_url).size();
   return matching_set_size > 0;
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer.h b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer.h
index a152a23..f2b3f816 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer.h
+++ b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer.h
@@ -20,7 +20,7 @@
 namespace chromeos {
 namespace app_time {
 
-class AppTimeLimitsWhitelistPolicyWrapper;
+class AppTimeLimitsAllowlistPolicyWrapper;
 class AppTimeController;
 
 class WebTimeLimitEnforcer {
@@ -39,10 +39,10 @@
   // observer pattern has been set up for this.
   void OnWebTimeLimitReached(base::TimeDelta time_limit);
   void OnWebTimeLimitEnded();
-  void OnTimeLimitWhitelistChanged(
-      const AppTimeLimitsWhitelistPolicyWrapper& value);
+  void OnTimeLimitAllowlistChanged(
+      const AppTimeLimitsAllowlistPolicyWrapper& value);
 
-  bool IsURLWhitelisted(const GURL& url) const;
+  bool IsURLAllowlisted(const GURL& url) const;
 
   bool blocked() const { return chrome_blocked_; }
   base::TimeDelta time_limit() const { return time_limit_; }
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer_browsertest.cc b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer_browsertest.cc
index 70f80d9..0e667a0 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer_browsertest.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer_browsertest.cc
@@ -14,7 +14,7 @@
 #include "chrome/browser/chromeos/child_accounts/child_user_service.h"
 #include "chrome/browser/chromeos/child_accounts/child_user_service_factory.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h"
-#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_test_utils.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_test_utils.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_types.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/web_time_navigation_observer.h"
@@ -92,19 +92,19 @@
   void TearDown() override;
   void SetUpOnMainThread() override;
   bool IsErrorPageBeingShownInWebContents(content::WebContents* tab);
-  void WhitelistUrlRegx(const std::string& host);
-  void WhitelistApp(const chromeos::app_time::AppId& app_id);
+  void AllowlistUrlRegx(const std::string& host);
+  void AllowlistApp(const chromeos::app_time::AppId& app_id);
   void BlockWeb();
   chromeos::app_time::WebTimeLimitEnforcer* GetWebTimeLimitEnforcer();
   content::WebContents* InstallAndLaunchWebApp(const GURL& url,
-                                               bool whitelisted_app);
+                                               bool allowlisted_app);
 
  private:
   void UpdatePolicy();
 
   base::test::ScopedFeatureList scoped_feature_list_;
 
-  chromeos::app_time::AppTimeLimitsWhitelistPolicyBuilder builder_;
+  chromeos::app_time::AppTimeLimitsAllowlistPolicyBuilder builder_;
 
   chromeos::LoggedInUserMixin logged_in_user_mixin_{
       &mixin_host_, chromeos::LoggedInUserMixin::LogInType::kChild,
@@ -153,15 +153,15 @@
   return value;
 }
 
-void WebTimeLimitEnforcerThrottleTest::WhitelistUrlRegx(
+void WebTimeLimitEnforcerThrottleTest::AllowlistUrlRegx(
     const std::string& url) {
-  builder_.AppendToWhitelistUrlList(url);
+  builder_.AppendToAllowlistUrlList(url);
   UpdatePolicy();
 }
 
-void WebTimeLimitEnforcerThrottleTest::WhitelistApp(
+void WebTimeLimitEnforcerThrottleTest::AllowlistApp(
     const chromeos::app_time::AppId& app_id) {
-  builder_.AppendToWhitelistAppList(app_id);
+  builder_.AppendToAllowlistAppList(app_id);
   UpdatePolicy();
 }
 
@@ -184,7 +184,7 @@
 
 content::WebContents* WebTimeLimitEnforcerThrottleTest::InstallAndLaunchWebApp(
     const GURL& url,
-    bool whitelisted_app) {
+    bool allowlisted_app) {
   auto web_app_info = std::make_unique<WebApplicationInfo>();
   web_app_info->title = base::UTF8ToUTF16(url.host());
   web_app_info->description = base::UTF8ToUTF16("Web app");
@@ -194,8 +194,8 @@
   web_app::AppId app_id =
       web_app::InstallWebApp(browser()->profile(), std::move(web_app_info));
 
-  if (whitelisted_app)
-    WhitelistApp(chromeos::app_time::AppId(apps::mojom::AppType::kWeb, app_id));
+  if (allowlisted_app)
+    AllowlistApp(chromeos::app_time::AppId(apps::mojom::AppType::kWeb, app_id));
   base::RunLoop().RunUntilIdle();
 
   // Add a tab to |browser()| and return the newly added WebContents.
@@ -212,7 +212,7 @@
   logged_in_user_mixin_.GetUserPolicyMixin()
       ->RequestPolicyUpdate()
       ->policy_payload()
-      ->mutable_perapptimelimitswhitelist()
+      ->mutable_perapptimelimitsallowlist()
       ->set_value(policy_value);
 
   const user_manager::UserManager* const user_manager =
@@ -292,10 +292,10 @@
 }
 
 IN_PROC_BROWSER_TEST_F(WebTimeLimitEnforcerThrottleTest,
-                       WhitelistedURLNotBlocked) {
+                       AllowlistedURLNotBlocked) {
   GURL url = embedded_test_server()->GetURL(kExampleHost,
                                             "/supervised_user/simple.html");
-  WhitelistUrlRegx(kExampleHost);
+  AllowlistUrlRegx(kExampleHost);
 
   // Alright let's block the browser.
   BlockWeb();
@@ -311,7 +311,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(WebTimeLimitEnforcerThrottleTest,
-                       BlockedURLAddedToWhitelist) {
+                       BlockedURLAddedToAllowlist) {
   GURL url = embedded_test_server()->GetURL(kExampleHost,
                                             "/supervised_user/simple.html");
 
@@ -329,14 +329,14 @@
 
   LoadFinishedWaiter waiter(web_contents, url);
 
-  WhitelistUrlRegx(kExampleHost);
+  AllowlistUrlRegx(kExampleHost);
   waiter.Wait();
 
   EXPECT_FALSE(IsErrorPageBeingShownInWebContents(web_contents));
 }
 
 IN_PROC_BROWSER_TEST_F(WebTimeLimitEnforcerThrottleTest,
-                       WhitelistedSchemesNotBlockedHttp) {
+                       AllowlistedSchemesNotBlockedHttp) {
   GURL url = embedded_test_server()->GetURL(kExampleHost,
                                             "/supervised_user/simple.html");
 
@@ -350,16 +350,16 @@
   auto* web_contents = params.navigated_or_inserted_contents;
   EXPECT_TRUE(IsErrorPageBeingShownInWebContents(web_contents));
 
-  // Whitelist the http scheme and ensure that the page is not
+  // Allowlist the http scheme and ensure that the page is not
   // blocked
   LoadFinishedWaiter waiter(web_contents, url);
-  WhitelistUrlRegx("http://*");
+  AllowlistUrlRegx("http://*");
   waiter.Wait();
   EXPECT_FALSE(IsErrorPageBeingShownInWebContents(web_contents));
 }
 
 IN_PROC_BROWSER_TEST_F(WebTimeLimitEnforcerThrottleTest,
-                       WhitelistedSchemesNotBlockedChrome) {
+                       AllowlistedSchemesNotBlockedChrome) {
   GURL url = GURL("chrome://version");
 
   BlockWeb();
@@ -372,16 +372,16 @@
   auto* web_contents = params.navigated_or_inserted_contents;
   EXPECT_TRUE(IsErrorPageBeingShownInWebContents(web_contents));
 
-  // Whitelist the chrome scheme and ensure that the page is not
+  // Allowlist the chrome scheme and ensure that the page is not
   // blocked.
   LoadFinishedWaiter waiter(web_contents, url);
-  WhitelistUrlRegx("chrome://*");
+  AllowlistUrlRegx("chrome://*");
   waiter.Wait();
   EXPECT_FALSE(IsErrorPageBeingShownInWebContents(web_contents));
 }
 
 IN_PROC_BROWSER_TEST_F(WebTimeLimitEnforcerThrottleTest,
-                       WhitelistedWebAppInTabNotBlocked) {
+                       AllowlistedWebAppInTabNotBlocked) {
   GURL web_app_url1 = embedded_test_server()->GetURL(
       kExampleHost, "/supervised_user/simple.html");
   GURL web_app_url2 = embedded_test_server()->GetURL(
@@ -390,9 +390,9 @@
       kExampleHost3, "/supervised_user/simple.html");
 
   content::WebContents* web_contents1 =
-      InstallAndLaunchWebApp(web_app_url1, /* whitelist */ true);
+      InstallAndLaunchWebApp(web_app_url1, /* allowlist */ true);
   content::WebContents* web_contents2 =
-      InstallAndLaunchWebApp(web_app_url2, /* whitelist */ false);
+      InstallAndLaunchWebApp(web_app_url2, /* allowlist */ false);
 
   NavigateParams params(browser(), normal_url,
                         ui::PageTransition::PAGE_TRANSITION_LINK);
@@ -440,7 +440,7 @@
 IN_PROC_BROWSER_TEST_F(WebTimeLimitEnforcerThrottleTest, EnsureQueryIsCleared) {
   GURL whitelsited_url = embedded_test_server()->GetURL(
       kExampleHost, "/supervised_user/simple.html");
-  WhitelistUrlRegx(kExampleHost);
+  AllowlistUrlRegx(kExampleHost);
   BlockWeb();
 
   GURL url = embedded_test_server()->GetURL(kExampleHost2,
@@ -464,5 +464,5 @@
   EXPECT_TRUE(IsErrorPageBeingShownInWebContents(web_contents));
 }
 
-// TODO(yilkal): Add WhitelistedSchemeNotBlocked test for  chrome://settings
+// TODO(yilkal): Add AllowlistedSchemeNotBlocked test for  chrome://settings
 // TODO(yilkal): Add test for blocked web contents without browser window.
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.cc b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.cc
index 0cda69c..c4591d2 100644
--- a/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.cc
+++ b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.cc
@@ -42,23 +42,23 @@
   return child_user_service->WebTimeLimitReached();
 }
 
-bool IsURLWhitelisted(const GURL& url, content::BrowserContext* context) {
+bool IsURLAllowlisted(const GURL& url, content::BrowserContext* context) {
   auto* child_user_service =
       ChildUserServiceFactory::GetForBrowserContext(context);
   if (!child_user_service)
     return false;
 
-  return child_user_service->WebTimeLimitWhitelistedURL(url);
+  return child_user_service->WebTimeLimitAllowlistedURL(url);
 }
 
-bool IsWebAppWhitelisted(const std::string& app_id_string,
+bool IsWebAppAllowlisted(const std::string& app_id_string,
                          content::BrowserContext* context) {
   const chromeos::app_time::AppId app_id(apps::mojom::AppType::kWeb,
                                          app_id_string);
   auto* child_user_service =
       ChildUserServiceFactory::GetForBrowserContext(context);
   DCHECK(child_user_service);
-  return child_user_service->AppTimeLimitWhitelistedApp(app_id);
+  return child_user_service->AppTimeLimitAllowlistedApp(app_id);
 }
 
 base::TimeDelta GetWebTimeLimit(content::BrowserContext* context) {
@@ -138,7 +138,7 @@
       navigation_handle()->GetWebContents()->GetBrowserContext();
 
   if (!IsWebBlocked(browser_context) ||
-      IsURLWhitelisted(navigation_handle()->GetURL(), browser_context)) {
+      IsURLAllowlisted(navigation_handle()->GetURL(), browser_context)) {
     return NavigationThrottle::PROCEED;
   }
 
@@ -199,8 +199,8 @@
   if (is_windowed)
     return PROCEED;
 
-  //  Don't throttle whitelisted applications.
-  if (IsWebAppWhitelisted(web_app_helper->GetAppId(), browser_context))
+  //  Don't throttle allowlisted applications.
+  if (IsWebAppAllowlisted(web_app_helper->GetAppId(), browser_context))
     return PROCEED;
 
   Profile* profile = Profile::FromBrowserContext(browser_context);
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
index 76c0a49..a67fbb6 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -2847,9 +2847,6 @@
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
 
-  if (!proxy)
-    return RespondNow(Error("App Service not available"));
-
   std::vector<api::autotest_private::App> installed_apps;
   proxy->AppRegistryCache().ForEachApp([&installed_apps](
                                            const apps::AppUpdate& update) {
diff --git a/chrome/browser/chromeos/extensions/default_app_order.cc b/chrome/browser/chromeos/extensions/default_app_order.cc
index 6b11aff..c1f5d20 100644
--- a/chrome/browser/chromeos/extensions/default_app_order.cc
+++ b/chrome/browser/chromeos/extensions/default_app_order.cc
@@ -77,7 +77,6 @@
     default_web_apps::kOsSettingsAppId,
     ash::kInternalAppIdDiscover,
     default_web_apps::kHelpAppId,
-    extension_misc::kGeniusAppId,
     extension_misc::kCalculatorAppId,
     default_web_apps::kCanvasAppId,
     extension_misc::kTextEditorAppId,
diff --git a/chrome/browser/chromeos/file_manager/app_service_file_tasks.cc b/chrome/browser/chromeos/file_manager/app_service_file_tasks.cc
index a997457..b22ac55 100644
--- a/chrome/browser/chromeos/file_manager/app_service_file_tasks.cc
+++ b/chrome/browser/chromeos/file_manager/app_service_file_tasks.cc
@@ -68,12 +68,12 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK_EQ(entries.size(), file_urls.size());
 
+  if (!apps::AppServiceProxyFactory::IsAppServiceAvailableForProfile(profile))
+    return;
+
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
 
-  if (!proxy)
-    return;
-
   std::vector<std::string> mime_types;
   for (auto& entry : entries)
     mime_types.push_back(entry.mime_type);
@@ -115,12 +115,12 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK_EQ(file_system_urls.size(), mime_types.size());
 
+  if (!apps::AppServiceProxyFactory::IsAppServiceAvailableForProfile(profile))
+    return;
+
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
 
-  if (!proxy)
-    return;
-
   constexpr auto launch_source = apps::mojom::LaunchSource::kFromFileManager;
   constexpr auto launch_container =
       apps::mojom::LaunchContainer::kLaunchContainerWindow;
diff --git a/chrome/browser/chromeos/file_manager/web_file_tasks.cc b/chrome/browser/chromeos/file_manager/web_file_tasks.cc
index c45d569..3ed2085 100644
--- a/chrome/browser/chromeos/file_manager/web_file_tasks.cc
+++ b/chrome/browser/chromeos/file_manager/web_file_tasks.cc
@@ -144,7 +144,6 @@
 
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy);
   proxy->LaunchAppWithFiles(
       task.app_id, launch_container,
       apps::GetEventFlags(apps::mojom::LaunchContainer::kLaunchContainerTab,
diff --git a/chrome/browser/chromeos/first_run/first_run.cc b/chrome/browser/chromeos/first_run/first_run.cc
index 2f1b8798..71b9a97 100644
--- a/chrome/browser/chromeos/first_run/first_run.cc
+++ b/chrome/browser/chromeos/first_run/first_run.cc
@@ -55,7 +55,6 @@
 void LaunchApp(Profile* profile, std::string app_id) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy);
 
   proxy->Launch(app_id, ui::EventFlags::EF_NONE,
                 apps::mojom::LaunchSource::kFromChromeInternal,
@@ -201,12 +200,7 @@
 }
 
 void LaunchHelpApp(Profile* profile) {
-  if (base::FeatureList::IsEnabled(chromeos::features::kHelpAppV2)) {
-    AppLauncher::LaunchHelpAfterSWALoad(profile);
-    return;
-  }
-
-  LaunchApp(profile, extension_misc::kGeniusAppId);
+  AppLauncher::LaunchHelpAfterSWALoad(profile);
 }
 
 void LaunchTutorial() {
diff --git a/chrome/browser/chromeos/guest_os/guest_os_share_path.cc b/chrome/browser/chromeos/guest_os/guest_os_share_path.cc
index 5358124..f0aafef 100644
--- a/chrome/browser/chromeos/guest_os/guest_os_share_path.cc
+++ b/chrome/browser/chromeos/guest_os/guest_os_share_path.cc
@@ -9,6 +9,7 @@
 #include "base/files/file_util.h"
 #include "base/optional.h"
 #include "base/task/thread_pool.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
 #include "chrome/browser/chromeos/crostini/crostini_manager.h"
 #include "chrome/browser/chromeos/crostini/crostini_util.h"
 #include "chrome/browser/chromeos/drive/drive_integration_service.h"
@@ -23,6 +24,7 @@
 #include "chromeos/dbus/concierge/concierge_service.pb.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/seneschal_client.h"
+#include "components/arc/arc_util.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
 #include "content/public/browser/browser_task_traits.h"
@@ -329,6 +331,15 @@
     request.set_handle(
         plugin_vm::PluginVmManagerFactory::GetForProfile(profile_)
             ->seneschal_server_handle());
+  } else if (vm_name == arc::kArcVmName) {
+    const auto& vm_info = arc::ArcSessionManager::Get()->GetVmInfo();
+    if (!vm_info) {
+      LOG(WARNING) << "ARCVM not running, cannot share paths";
+      std::move(callback).Run(base::FilePath(), false,
+                              "ARCVM not running, cannot share paths");
+      return;
+    }
+    request.set_handle(vm_info->seneschal_server_handle());
   } else {
     // Restart VM if not currently running.
     auto* crostini_manager = crostini::CrostiniManager::GetForProfile(profile_);
@@ -366,6 +377,14 @@
     request.set_handle(
         plugin_vm::PluginVmManagerFactory::GetForProfile(profile_)
             ->seneschal_server_handle());
+  } else if (vm_name == arc::kArcVmName) {
+    const auto& vm_info = arc::ArcSessionManager::Get()->GetVmInfo();
+    if (!vm_info) {
+      LOG(WARNING) << "ARCVM not running, cannot unshare paths";
+      std::move(callback).Run(true, "ARCVM not running, cannot unshare paths");
+      return;
+    }
+    request.set_handle(vm_info->seneschal_server_handle());
   } else {
     auto* crostini_manager = crostini::CrostiniManager::GetForProfile(profile_);
     base::Optional<crostini::VmInfo> vm_info =
diff --git a/chrome/browser/chromeos/guest_os/guest_os_share_path_unittest.cc b/chrome/browser/chromeos/guest_os/guest_os_share_path_unittest.cc
index 25f276b..0e15c174 100644
--- a/chrome/browser/chromeos/guest_os/guest_os_share_path_unittest.cc
+++ b/chrome/browser/chromeos/guest_os/guest_os_share_path_unittest.cc
@@ -9,6 +9,8 @@
 #include "base/files/file_util.h"
 #include "base/run_loop.h"
 #include "base/test/scoped_feature_list.h"
+#include "chrome/browser/chromeos/arc/session/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/test/test_arc_session_manager.h"
 #include "chrome/browser/chromeos/crostini/crostini_manager.h"
 #include "chrome/browser/chromeos/crostini/crostini_pref_names.h"
 #include "chrome/browser/chromeos/crostini/crostini_util.h"
@@ -31,6 +33,9 @@
 #include "chromeos/dbus/seneschal/seneschal_service.pb.h"
 #include "chromeos/disks/disk_mount_manager.h"
 #include "components/account_id/account_id.h"
+#include "components/arc/arc_util.h"
+#include "components/arc/session/arc_session_runner.h"
+#include "components/arc/test/fake_arc_session.h"
 #include "components/drive/drive_pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
@@ -261,9 +266,15 @@
 
     g_browser_process->platform_part()
         ->InitializeSchedulerConfigurationManager();
+
+    // Create ArcSessionManager for ARCVM testing.
+    arc_session_manager_ = arc::CreateTestArcSessionManager(
+        std::make_unique<arc::ArcSessionRunner>(
+            base::BindRepeating(arc::FakeArcSession::Create)));
   }
 
   void TearDown() override {
+    arc_session_manager_.reset();
     g_browser_process->platform_part()->ShutdownSchedulerConfigurationManager();
     // Shutdown GuestOsSharePath to schedule FilePathWatchers to be destroyed,
     // then run thread bundle to ensure they are.
@@ -299,6 +310,7 @@
   base::test::ScopedFeatureList features_;
   std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
   AccountId account_id_;
+  std::unique_ptr<arc::ArcSessionManager> arc_session_manager_;
 
  private:
   std::unique_ptr<ScopedTestingLocalState> local_state_;
@@ -356,6 +368,28 @@
   run_loop()->Run();
 }
 
+// Tests that ARCVM can share path.
+TEST_F(GuestOsSharePathTest, SuccessArcvm) {
+  SetUpVolume();
+
+  // Set up VmInfo in |arc_session_manager_| to simulate a running ARCVM.
+  vm_tools::concierge::VmStartedSignal start_signal;
+  start_signal.set_name(arc::kArcVmName);
+  start_signal.mutable_vm_info()->set_seneschal_server_handle(1000UL);
+  arc_session_manager_->OnVmStarted(start_signal);
+
+  guest_os_share_path_->SharePath(
+      arc::kArcVmName, drivefs_.Append("root").Append("ArcvmTest"), PERSIST_NO,
+      base::BindOnce(&GuestOsSharePathTest::SharePathCallback,
+                     base::Unretained(this), arc::kArcVmName, Persist::NO,
+                     SeneschalClientCalled::YES,
+                     &vm_tools::seneschal::SharePathRequest::DRIVEFS_MY_DRIVE,
+                     "ArcvmTest", Success::YES, ""));
+  // Also validate the seneschal server handle.
+  EXPECT_EQ(1000UL, fake_seneschal_client_->last_share_path_request().handle());
+  run_loop()->Run();
+}
+
 TEST_F(GuestOsSharePathTest, SuccessDriveFsMyDrive) {
   SetUpVolume();
   guest_os_share_path_->SharePath(
@@ -756,6 +790,30 @@
   run_loop()->Run();
 }
 
+// Tests that it cannot unshare path when ARCVM is not running.
+TEST_F(GuestOsSharePathTest, UnsharePathArcvmNotRunning) {
+  SetUpVolume();
+  DictionaryPrefUpdate update(profile()->GetPrefs(),
+                              prefs::kGuestOSPathsSharedToVms);
+  base::DictionaryValue* shared_paths = update.Get();
+  base::Value vms(base::Value::Type::LIST);
+  vms.Append(base::Value(arc::kArcVmName));
+  shared_paths->SetKey(shared_path_.value(), std::move(vms));
+
+  // Remove VmInfo from |arc_session_manager_| to simulate a stopped ARCVM.
+  vm_tools::concierge::VmStoppedSignal stop_signal;
+  stop_signal.set_name(arc::kArcVmName);
+  arc_session_manager_->OnVmStopped(stop_signal);
+
+  guest_os_share_path_->UnsharePath(
+      arc::kArcVmName, shared_path_, true,
+      base::BindOnce(&GuestOsSharePathTest::UnsharePathCallback,
+                     base::Unretained(this), shared_path_, Persist::NO,
+                     SeneschalClientCalled::NO, "", Success::YES,
+                     "ARCVM not running, cannot unshare paths"));
+  run_loop()->Run();
+}
+
 TEST_F(GuestOsSharePathTest, UnsharePathInvalidPath) {
   SetUpVolume();
   base::FilePath invalid("invalid/path");
diff --git a/chrome/browser/chromeos/input_method/assistive_window_controller.cc b/chrome/browser/chromeos/input_method/assistive_window_controller.cc
index c061a556..5aff7d9 100644
--- a/chrome/browser/chromeos/input_method/assistive_window_controller.cc
+++ b/chrome/browser/chromeos/input_method/assistive_window_controller.cc
@@ -137,11 +137,15 @@
     suggestion_window_view_->GetWidget()->Close();
 }
 
-void AssistiveWindowController::SetBounds(const gfx::Rect& cursor_bounds) {
+void AssistiveWindowController::SetBounds(const Bounds& bounds) {
+  bounds_ = bounds;
+  // Sets suggestion_window_view_'s bounds here for most up-to-date cursor
+  // position. This is different from UndoWindow because UndoWindow gets cursors
+  // position before showing.
+  // TODO(crbug/1112982): Investigate getting bounds to suggester before sending
+  // show suggestion request.
   if (suggestion_window_view_ && confirmed_length_ == 0)
-    suggestion_window_view_->SetAnchorRect(cursor_bounds);
-  if (undo_window_)
-    undo_window_->SetBounds(cursor_bounds);
+    suggestion_window_view_->SetAnchorRect(bounds.caret);
 }
 
 void AssistiveWindowController::FocusStateChanged() {
@@ -205,7 +209,14 @@
     case ui::ime::AssistiveWindowType::kUndoWindow:
       if (!undo_window_)
         InitUndoWindow();
-      window.visible ? undo_window_->Show() : undo_window_->Hide();
+      if (window.visible) {
+        undo_window_->SetAnchorRect(bounds_.autocorrect.IsEmpty()
+                                        ? bounds_.caret 
+                                        : bounds_.autocorrect);
+        undo_window_->Show();
+      } else {
+        undo_window_->Hide();
+      }
       break;
     case ui::ime::AssistiveWindowType::kEmojiSuggestion:
     case ui::ime::AssistiveWindowType::kPersonalInfoSuggestion:
diff --git a/chrome/browser/chromeos/input_method/assistive_window_controller.h b/chrome/browser/chromeos/input_method/assistive_window_controller.h
index 97e5889..3827bfc3 100644
--- a/chrome/browser/chromeos/input_method/assistive_window_controller.h
+++ b/chrome/browser/chromeos/input_method/assistive_window_controller.h
@@ -69,7 +69,7 @@
 
  private:
   // IMEAssistiveWindowHandlerInterface implementation.
-  void SetBounds(const gfx::Rect& cursor_bounds) override;
+  void SetBounds(const Bounds& bounds) override;
   void SetAssistiveWindowProperties(
       const AssistiveWindowProperties& window) override;
   void ShowSuggestion(const ui::ime::SuggestionDetails& details) override;
@@ -99,6 +99,7 @@
   ui::ime::UndoWindow* undo_window_ = nullptr;
   base::string16 suggestion_text_;
   size_t confirmed_length_ = 0;
+  Bounds bounds_;
 
   DISALLOW_COPY_AND_ASSIGN(AssistiveWindowController);
 };
diff --git a/chrome/browser/chromeos/input_method/assistive_window_controller_unittest.cc b/chrome/browser/chromeos/input_method/assistive_window_controller_unittest.cc
index fe90b10..bd3c6367 100644
--- a/chrome/browser/chromeos/input_method/assistive_window_controller_unittest.cc
+++ b/chrome/browser/chromeos/input_method/assistive_window_controller_unittest.cc
@@ -117,9 +117,12 @@
       ui::IMEBridge::Get()->GetAssistiveWindowHandler()->GetConfirmedLength());
 
   gfx::Rect current_bounds = suggestion_view->GetAnchorRect();
-  gfx::Rect new_bounds(current_bounds.width() + 1, current_bounds.height());
-  ui::IMEBridge::Get()->GetAssistiveWindowHandler()->SetBounds(new_bounds);
-  EXPECT_EQ(new_bounds, suggestion_view->GetAnchorRect());
+  gfx::Rect new_caret_bounds(current_bounds.width() + 1,
+                             current_bounds.height());
+  Bounds bounds;
+  bounds.caret = new_caret_bounds;
+  ui::IMEBridge::Get()->GetAssistiveWindowHandler()->SetBounds(bounds);
+  EXPECT_EQ(new_caret_bounds, suggestion_view->GetAnchorRect());
 }
 
 TEST_F(AssistiveWindowControllerTest,
@@ -136,8 +139,11 @@
       ui::IMEBridge::Get()->GetAssistiveWindowHandler()->GetConfirmedLength());
 
   gfx::Rect current_bounds = suggestion_view->GetAnchorRect();
-  gfx::Rect new_bounds(current_bounds.width() + 1, current_bounds.height());
-  ui::IMEBridge::Get()->GetAssistiveWindowHandler()->SetBounds(new_bounds);
+  gfx::Rect new_caret_bounds(current_bounds.width() + 1,
+                             current_bounds.height());
+  Bounds bounds;
+  bounds.caret = new_caret_bounds;
+  ui::IMEBridge::Get()->GetAssistiveWindowHandler()->SetBounds(bounds);
   EXPECT_EQ(current_bounds, suggestion_view->GetAnchorRect());
 }
 
@@ -166,12 +172,36 @@
       ->GetAssistiveWindowHandler()
       ->SetAssistiveWindowProperties(properties);
 
-  gfx::Rect new_bounds(current_bounds.width() + 1, current_bounds.height());
-  ui::IMEBridge::Get()->GetAssistiveWindowHandler()->SetBounds(new_bounds);
-  EXPECT_EQ(new_bounds,
+  gfx::Rect new_caret_bounds(current_bounds.width() + 1,
+                             current_bounds.height());
+  Bounds bounds;
+  bounds.caret = new_caret_bounds;
+  ui::IMEBridge::Get()->GetAssistiveWindowHandler()->SetBounds(bounds);
+  EXPECT_EQ(new_caret_bounds,
             controller_->GetSuggestionWindowViewForTesting()->GetAnchorRect());
 }
 
+TEST_F(AssistiveWindowControllerTest, SetsUndoWindowAnchorRectCorrectly) {
+  gfx::Rect autocorrect_bounds(1, 1);
+  gfx::Rect caret_bounds(2, 2);
+
+  Bounds bounds;
+  bounds.caret = caret_bounds;
+  bounds.autocorrect = autocorrect_bounds;
+  ui::IMEBridge::Get()->GetAssistiveWindowHandler()->SetBounds(bounds);
+
+  AssistiveWindowProperties window;
+  window.type = ui::ime::AssistiveWindowType::kUndoWindow;
+  window.visible = true;
+  ui::IMEBridge::Get()
+      ->GetAssistiveWindowHandler()
+      ->SetAssistiveWindowProperties(window);
+
+  ASSERT_TRUE(controller_->GetUndoWindowForTesting() != nullptr);
+  EXPECT_EQ(autocorrect_bounds,
+            controller_->GetUndoWindowForTesting()->GetAnchorRect());
+}
+
 TEST_F(AssistiveWindowControllerTest,
        AnnouncesWhenSetButtonHighlightedInEmojiWindowHasAnnounceString) {
   profile_->GetPrefs()->SetBoolean(
diff --git a/chrome/browser/chromeos/input_method/native_input_method_engine_browsertest.cc b/chrome/browser/chromeos/input_method/native_input_method_engine_browsertest.cc
index d9e1638..0c6ad14 100644
--- a/chrome/browser/chromeos/input_method/native_input_method_engine_browsertest.cc
+++ b/chrome/browser/chromeos/input_method/native_input_method_engine_browsertest.cc
@@ -333,6 +333,8 @@
 
 IN_PROC_BROWSER_TEST_F(NativeInputMethodEngineTest, SuggestUserEmail) {
   base::HistogramTester histogram_tester;
+  histogram_tester.ExpectTotalCount(
+      "InputMethod.Assistive.TimeToAccept.PersonalInfo", 0);
 
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfileIfExists(profile_);
@@ -355,6 +357,8 @@
   histogram_tester.ExpectUniqueSample("InputMethod.Assistive.Coverage",
                                       chromeos::AssistiveType::kPersonalEmail,
                                       1);
+  histogram_tester.ExpectTotalCount(
+      "InputMethod.Assistive.TimeToAccept.PersonalInfo", 0);
 
   DispatchKeyPress(ui::VKEY_DOWN, false);
   DispatchKeyPress(ui::VKEY_RETURN, false);
@@ -364,12 +368,17 @@
   histogram_tester.ExpectUniqueSample("InputMethod.Assistive.Success",
                                       chromeos::AssistiveType::kPersonalEmail,
                                       1);
+  histogram_tester.ExpectTotalCount(
+      "InputMethod.Assistive.TimeToAccept.PersonalInfo", 1);
 
   SetFocus(nullptr);
 }
 
-IN_PROC_BROWSER_TEST_F(NativeInputMethodEngineTest, DismissSuggestion) {
+IN_PROC_BROWSER_TEST_F(NativeInputMethodEngineTest,
+                       DismissPersonalInfoSuggestion) {
   base::HistogramTester histogram_tester;
+  histogram_tester.ExpectTotalCount(
+      "InputMethod.Assistive.TimeToDismiss.PersonalInfo", 0);
 
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfileIfExists(profile_);
@@ -386,6 +395,8 @@
 
   helper.GetTextInputClient()->InsertText(prefix_text);
   helper.WaitForSurroundingTextChanged(prefix_text);
+  histogram_tester.ExpectTotalCount(
+      "InputMethod.Assistive.TimeToDismiss.PersonalInfo", 0);
 
   DispatchKeyPress(ui::VKEY_ESCAPE, false);
   // This down and enter should make no effect.
@@ -398,6 +409,8 @@
   histogram_tester.ExpectUniqueSample("InputMethod.Assistive.Success",
                                       chromeos::AssistiveType::kPersonalEmail,
                                       0);
+  histogram_tester.ExpectTotalCount(
+      "InputMethod.Assistive.TimeToDismiss.PersonalInfo", 1);
 
   SetFocus(nullptr);
 }
diff --git a/chrome/browser/chromeos/input_method/personal_info_suggester.cc b/chrome/browser/chromeos/input_method/personal_info_suggester.cc
index b3fbb26..9002c0e 100644
--- a/chrome/browser/chromeos/input_method/personal_info_suggester.cc
+++ b/chrome/browser/chromeos/input_method/personal_info_suggester.cc
@@ -7,6 +7,7 @@
 #include "chrome/browser/extensions/api/input_ime/input_ime_api.h"
 
 #include "ash/public/cpp/ash_pref_names.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/no_destructor.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
@@ -67,6 +68,17 @@
            autofill::ServerFieldType::ADDRESS_HOME_COUNTRY}};
   return *homeAddressTypes;
 }
+
+void RecordTimeToAccept(base::TimeDelta delta) {
+  base::UmaHistogramTimes("InputMethod.Assistive.TimeToAccept.PersonalInfo",
+                          delta);
+}
+
+void RecordTimeToDismiss(base::TimeDelta delta) {
+  base::UmaHistogramTimes("InputMethod.Assistive.TimeToDismiss.PersonalInfo",
+                          delta);
+}
+
 }  // namespace
 
 TtsHandler::TtsHandler(Profile* profile) : profile_(profile) {}
@@ -332,6 +344,7 @@
   if (suggestion_shown_) {
     first_shown_ = false;
   } else {
+    session_start_ = base::TimeTicks::Now();
     first_shown_ = true;
     IncrementPrefValueTilCapped(kPersonalInfoSuggesterShowSettingCount,
                                 kMaxShowSettingCount);
@@ -381,6 +394,7 @@
     return false;
   }
 
+  RecordTimeToAccept(base::TimeTicks::Now() - session_start_);
   IncrementPrefValueTilCapped(kPersonalInfoSuggesterAcceptanceCount,
                               kMaxAcceptanceCount);
   suggestion_shown_ = false;
@@ -392,11 +406,13 @@
 
 void PersonalInfoSuggester::DismissSuggestion() {
   std::string error;
-  suggestion_shown_ = false;
   suggestion_handler_->DismissSuggestion(context_id_, &error);
   if (!error.empty()) {
     LOG(ERROR) << "Failed to dismiss suggestion. " << error;
+    return;
   }
+  suggestion_shown_ = false;
+  RecordTimeToDismiss(base::TimeTicks::Now() - session_start_);
 }
 
 void PersonalInfoSuggester::SetButtonHighlighted(
diff --git a/chrome/browser/chromeos/input_method/personal_info_suggester.h b/chrome/browser/chromeos/input_method/personal_info_suggester.h
index fabe7bb..9c0f5fab 100644
--- a/chrome/browser/chromeos/input_method/personal_info_suggester.h
+++ b/chrome/browser/chromeos/input_method/personal_info_suggester.h
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "base/optional.h"
+#include "base/time/time.h"
 #include "chrome/browser/chromeos/input_method/input_method_engine_base.h"
 #include "chrome/browser/chromeos/input_method/suggester.h"
 #include "chrome/browser/chromeos/input_method/suggestion_enums.h"
@@ -130,6 +131,8 @@
   int highlighted_index_;
   ui::ime::AssistiveWindowButton suggestion_button_;
   ui::ime::AssistiveWindowButton settings_button_;
+
+  base::TimeTicks session_start_;
 };
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/input_method/personal_info_suggester_unittest.cc b/chrome/browser/chromeos/input_method/personal_info_suggester_unittest.cc
index 740a0aa..f565b4b 100644
--- a/chrome/browser/chromeos/input_method/personal_info_suggester_unittest.cc
+++ b/chrome/browser/chromeos/input_method/personal_info_suggester_unittest.cc
@@ -7,6 +7,7 @@
 #include "ash/public/cpp/ash_pref_names.h"
 #include "base/guid.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "chrome/browser/chromeos/input_method/ui/suggestion_details.h"
 #include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h"
 #include "chrome/test/base/testing_profile.h"
@@ -562,4 +563,34 @@
       ui::ime::ButtonId::kSmartInputsSettingLink);
 }
 
+TEST_F(PersonalInfoSuggesterTest, RecordsTimeToAccept) {
+  base::HistogramTester histogram_tester;
+  histogram_tester.ExpectTotalCount(
+      "InputMethod.Assistive.TimeToAccept.PersonalInfo", 0);
+
+  profile_->set_profile_name(base::UTF16ToUTF8(email_));
+
+  EXPECT_TRUE(suggester_->Suggest(base::UTF8ToUTF16("my email is ")));
+
+  // Press "Down" to choose and accept the suggestion.
+  SendKeyboardEvent("Down");
+  SendKeyboardEvent("Enter");
+  histogram_tester.ExpectTotalCount(
+      "InputMethod.Assistive.TimeToAccept.PersonalInfo", 1);
+}
+
+TEST_F(PersonalInfoSuggesterTest, RecordsTimeToDismiss) {
+  base::HistogramTester histogram_tester;
+  histogram_tester.ExpectTotalCount(
+      "InputMethod.Assistive.TimeToAccept.PersonalInfo", 0);
+
+  profile_->set_profile_name(base::UTF16ToUTF8(email_));
+
+  EXPECT_TRUE(suggester_->Suggest(base::UTF8ToUTF16("my email is ")));
+  // Press "Esc" to dismiss.
+  SendKeyboardEvent("Esc");
+  histogram_tester.ExpectTotalCount(
+      "InputMethod.Assistive.TimeToDismiss.PersonalInfo", 1);
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc
index 54fb42a8..4ab9322 100644
--- a/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc
+++ b/chrome/browser/chromeos/lock_screen_apps/app_manager_impl_unittest.cc
@@ -31,6 +31,7 @@
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/arc/arc_service_manager.h"
 #include "components/arc/session/arc_session.h"
 #include "content/public/test/browser_task_environment.h"
@@ -142,6 +143,9 @@
   ~LockScreenAppManagerImplTest() override = default;
 
   void SetUp() override {
+    // Need to initialize DBusThreadManager before ArcSessionManager's
+    // constructor calls DBusThreadManager::Get().
+    chromeos::DBusThreadManager::Initialize();
     // Initialize command line so chromeos::NoteTakingHelper thinks note taking
     // on lock screen is enabled.
     command_line_ = std::make_unique<base::test::ScopedCommandLine>();
@@ -177,8 +181,11 @@
     // destruction.
     app_manager_.reset();
 
+    lock_screen_profile_creator_.reset();
     chromeos::NoteTakingHelper::Shutdown();
+    arc_session_manager_.reset();
     extensions::ExtensionSystem::Get(profile())->Shutdown();
+    chromeos::DBusThreadManager::Shutdown();
   }
 
   void InitExtensionSystem(Profile* profile) {
diff --git a/chrome/browser/chromeos/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc b/chrome/browser/chromeos/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc
index eeab6c6..40434dbd6 100644
--- a/chrome/browser/chromeos/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc
+++ b/chrome/browser/chromeos/lock_screen_apps/lock_screen_profile_creator_impl_unittest.cc
@@ -30,6 +30,7 @@
 #include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/arc/arc_service_manager.h"
 #include "components/arc/session/arc_session.h"
 #include "components/crx_file/id_util.h"
@@ -214,6 +215,9 @@
   ~LockScreenProfileCreatorImplTest() override {}
 
   void SetUp() override {
+    // Need to initialize DBusThreadManager before ArcSessionManager's
+    // constructor calls DBusThreadManager::Get().
+    chromeos::DBusThreadManager::Initialize();
     base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
         extensions::switches::kAllowlistedExtensionID,
         crx_file::id_util::GenerateId("test_app"));
@@ -239,8 +243,11 @@
   }
 
   void TearDown() override {
+    lock_screen_profile_creator_.reset();
+    arc_session_manager_.reset();
     chromeos::NoteTakingHelper::Shutdown();
     TestingBrowserProcess::GetGlobal()->SetProfileManager(nullptr);
+    chromeos::DBusThreadManager::Shutdown();
   }
 
   UnittestProfileManager* profile_manager() { return profile_manager_; }
diff --git a/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc b/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
index 3d995c8..802ed840 100644
--- a/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
+++ b/chrome/browser/chromeos/lock_screen_apps/state_controller_unittest.cc
@@ -38,6 +38,7 @@
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/power/fake_power_manager_client.h"
 #include "chromeos/dbus/power_manager/suspend.pb.h"
 #include "components/arc/arc_service_manager.h"
@@ -383,6 +384,10 @@
   ~LockScreenAppStateTest() override = default;
 
   void SetUp() override {
+    // Need to initialize DBusThreadManager before ArcSessionManager's
+    // constructor calls DBusThreadManager::Get().
+    chromeos::DBusThreadManager::Initialize();
+
     command_line_ = std::make_unique<base::test::ScopedCommandLine>();
     command_line_->GetProcessCommandLine()->InitFromArgv({""});
     SetUpCommandLine(command_line_->GetProcessCommandLine());
@@ -433,18 +438,19 @@
   }
 
   void TearDown() override {
-    extensions::ExtensionSystem::Get(profile())->Shutdown();
-
     state_controller_->RemoveObserver(&observer_);
     state_controller_->Shutdown();
-    chromeos::NoteTakingHelper::Shutdown();
-
-    session_manager_.reset();
+    focus_cycler_delegate_.reset();
     app_manager_ = nullptr;
     lock_screen_profile_creator_ = nullptr;
+    extensions::ExtensionSystem::Get(profile())->Shutdown();
+    chromeos::NoteTakingHelper::Shutdown();
+    arc_session_manager_.reset();
+    session_manager_.reset();
     app_window_.reset();
     BrowserWithTestWindowTest::TearDown();
-    focus_cycler_delegate_.reset();
+    command_line_.reset();
+    chromeos::DBusThreadManager::Shutdown();
   }
 
   TestingProfile* CreateProfile() override {
diff --git a/chrome/browser/chromeos/login/demo_mode/demo_session.cc b/chrome/browser/chromeos/login/demo_mode/demo_session.cc
index fe7850e..928033f 100644
--- a/chrome/browser/chromeos/login/demo_mode/demo_session.cc
+++ b/chrome/browser/chromeos/login/demo_mode/demo_session.cc
@@ -343,8 +343,7 @@
   if (!IsDeviceInDemoMode())
     return true;
   return app_id != GetScreensaverAppId() &&
-         app_id != extensions::kWebStoreAppId &&
-         app_id != extension_misc::kGeniusAppId;
+         app_id != extensions::kWebStoreAppId;
 }
 
 // static
diff --git a/chrome/browser/chromeos/login/screens/family_link_notice_browsertest.cc b/chrome/browser/chromeos/login/screens/family_link_notice_browsertest.cc
index 3328274..d8d7a55 100644
--- a/chrome/browser/chromeos/login/screens/family_link_notice_browsertest.cc
+++ b/chrome/browser/chromeos/login/screens/family_link_notice_browsertest.cc
@@ -14,10 +14,13 @@
 #include "chrome/browser/chromeos/login/test/user_policy_mixin.h"
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
 #include "chrome/browser/chromeos/login/wizard_controller.h"
+#include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h"
+#include "chrome/common/pref_names.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "chromeos/login/auth/stub_authenticator_builder.h"
+#include "components/prefs/pref_service.h"
 #include "content/public/test/browser_test.h"
 
 namespace chromeos {
@@ -48,21 +51,22 @@
     OobeBaseTest::SetUpOnMainThread();
   }
 
-  void SetUpInProcessBrowserTestFixture() override {
-    // Child users require a user policy, set up an empty one so the user can
-    // get through login.
-    ASSERT_TRUE(user_policy_mixin_.RequestPolicyUpdate());
-    OobeBaseTest::SetUpInProcessBrowserTestFixture();
-  }
-
   void LoginAsRegularUser() {
     login_manager_mixin_.LoginAsNewRegularUser();
     OobeScreenExitWaiter(GaiaView::kScreenId).Wait();
   }
 
-  void LoginAsChildUser() {
-    login_manager_mixin_.LoginAsNewChildUser();
-    OobeScreenExitWaiter(GaiaView::kScreenId).Wait();
+  void ExpectHelpAppPrefValue(bool expected) {
+    WizardController::default_controller()->PrepareFirstRunPrefs();
+    bool value = ProfileManager::GetActiveUserProfile()->GetPrefs()->GetBoolean(
+        prefs::kHelpAppShouldShowParentalControl);
+    EXPECT_EQ(value, expected);
+  }
+
+  void ClickContinueButtonOnFamilyLinkScreen() {
+    test::OobeJS().ExpectVisiblePath(kFamilyLinkDialog);
+    test::OobeJS().ExpectVisiblePath(kContinueButton);
+    test::OobeJS().TapOnPath(kContinueButton);
   }
 
   void WaitForScreenExit() {
@@ -75,6 +79,9 @@
 
   base::Optional<FamilyLinkNoticeScreen::Result> screen_result_;
 
+ protected:
+  LoginManagerMixin login_manager_mixin_{&mixin_host_, {}, &fake_gaia_};
+
  private:
   void HandleScreenExit(FamilyLinkNoticeScreen::Result result) {
     ASSERT_FALSE(screen_exited_);
@@ -90,12 +97,6 @@
   FamilyLinkNoticeScreen::ScreenExitCallback original_callback_;
 
   FakeGaiaMixin fake_gaia_{&mixin_host_, embedded_test_server()};
-  LoginManagerMixin login_manager_mixin_{&mixin_host_, {}, &fake_gaia_};
-  LocalPolicyTestServerMixin policy_server_mixin_{&mixin_host_};
-  UserPolicyMixin user_policy_mixin_{
-      &mixin_host_,
-      AccountId::FromUserEmailGaiaId(test::kTestEmail, test::kTestGaiaId),
-      &policy_server_mixin_};
 
   base::test::ScopedFeatureList feature_list_;
 };
@@ -109,6 +110,7 @@
   LoginAsRegularUser();
   WaitForScreenExit();
   EXPECT_EQ(screen_result_.value(), FamilyLinkNoticeScreen::Result::SKIPPED);
+  ExpectHelpAppPrefValue(false);
 }
 
 // Verify user should see family link notice screen when selecting to sign in
@@ -119,27 +121,49 @@
       ->sign_in_as_child = true;
   LoginAsRegularUser();
   OobeScreenWaiter(FamilyLinkNoticeView::kScreenId).Wait();
-  test::OobeJS().ExpectVisiblePath(kFamilyLinkDialog);
-  test::OobeJS().ExpectVisiblePath(kContinueButton);
-  test::OobeJS().TapOnPath(kContinueButton);
+  ClickContinueButtonOnFamilyLinkScreen();
   WaitForScreenExit();
   EXPECT_EQ(screen_result_.value(), FamilyLinkNoticeScreen::Result::DONE);
+  ExpectHelpAppPrefValue(true);
 }
 
+class FamilyLinkNoticeScreenChildTest : public FamilyLinkNoticeScreenTest {
+ public:
+  void SetUpInProcessBrowserTestFixture() override {
+    // Child users require a user policy, set up an empty one so the user can
+    // get through login.
+    ASSERT_TRUE(user_policy_mixin_.RequestPolicyUpdate());
+    OobeBaseTest::SetUpInProcessBrowserTestFixture();
+  }
+
+  void LoginAsChildUser() {
+    login_manager_mixin_.LoginAsNewChildUser();
+    OobeScreenExitWaiter(GaiaView::kScreenId).Wait();
+  }
+
+ private:
+  LocalPolicyTestServerMixin policy_server_mixin_{&mixin_host_};
+  UserPolicyMixin user_policy_mixin_{
+      &mixin_host_,
+      AccountId::FromUserEmailGaiaId(test::kTestEmail, test::kTestGaiaId),
+      &policy_server_mixin_};
+};
+
 // Verify child account user should not see family link notice screen after log
 // in.
-IN_PROC_BROWSER_TEST_F(FamilyLinkNoticeScreenTest, ChildAccount) {
+IN_PROC_BROWSER_TEST_F(FamilyLinkNoticeScreenChildTest, ChildAccount) {
   WizardController::default_controller()
       ->get_wizard_context_for_testing()
       ->sign_in_as_child = true;
   LoginAsChildUser();
   WaitForScreenExit();
   EXPECT_EQ(screen_result_.value(), FamilyLinkNoticeScreen::Result::SKIPPED);
+  ExpectHelpAppPrefValue(false);
 }
 
 // Verify child account user should not see family link notice screen after log
 // in if not selecting sign in as child.
-IN_PROC_BROWSER_TEST_F(FamilyLinkNoticeScreenTest,
+IN_PROC_BROWSER_TEST_F(FamilyLinkNoticeScreenChildTest,
                        ChildAccountSignInAsRegular) {
   WizardController::default_controller()
       ->get_wizard_context_for_testing()
@@ -147,6 +171,33 @@
   LoginAsChildUser();
   WaitForScreenExit();
   EXPECT_EQ(screen_result_.value(), FamilyLinkNoticeScreen::Result::SKIPPED);
+  ExpectHelpAppPrefValue(false);
+}
+
+class FamilyLinkNoticeScreenManagedTest : public FamilyLinkNoticeScreenTest {
+ public:
+  void LoginAsManagedUser() {
+    user_policy_mixin_.RequestPolicyUpdate();
+    login_manager_mixin_.LoginWithDefaultContext(test_user_);
+    OobeScreenExitWaiter(GaiaView::kScreenId).Wait();
+  }
+
+ private:
+  const LoginManagerMixin::TestUserInfo test_user_{
+      AccountId::FromUserEmailGaiaId("user@example.com", "1111")};
+  UserPolicyMixin user_policy_mixin_{&mixin_host_, test_user_.account_id};
+};
+
+IN_PROC_BROWSER_TEST_F(FamilyLinkNoticeScreenManagedTest, ManagedAccount) {
+  WizardController::default_controller()
+      ->get_wizard_context_for_testing()
+      ->sign_in_as_child = true;
+  LoginAsManagedUser();
+  OobeScreenWaiter(FamilyLinkNoticeView::kScreenId).Wait();
+  ClickContinueButtonOnFamilyLinkScreen();
+  WaitForScreenExit();
+  EXPECT_EQ(screen_result_.value(), FamilyLinkNoticeScreen::Result::DONE);
+  ExpectHelpAppPrefValue(false);
 }
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/screens/family_link_notice_screen.cc b/chrome/browser/chromeos/login/screens/family_link_notice_screen.cc
index 3226bb0..ea8d0a3 100644
--- a/chrome/browser/chromeos/login/screens/family_link_notice_screen.cc
+++ b/chrome/browser/chromeos/login/screens/family_link_notice_screen.cc
@@ -4,10 +4,15 @@
 
 #include "chrome/browser/chromeos/login/screens/family_link_notice_screen.h"
 
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/chromeos/login/wizard_context.h"
+#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.h"
 #include "chromeos/constants/chromeos_features.h"
+#include "components/user_manager/user_manager.h"
 
 namespace {
 constexpr char kUserActionContinue[] = "continue";
@@ -45,9 +50,6 @@
 }
 
 bool FamilyLinkNoticeScreen::MaybeSkip(WizardContext* context) {
-  // TODO(crbug.com/1101318): check difference between profile->IsChild(),
-  // user_manager->GetActiveUser()->IsChild() and
-  // user_manager->GetActiveUser()->GetType()
   if (features::IsChildSpecificSigninEnabled() && context->sign_in_as_child &&
       !ProfileManager::GetActiveUserProfile()->IsChild()) {
     return false;
@@ -57,8 +59,20 @@
 }
 
 void FamilyLinkNoticeScreen::ShowImpl() {
-  if (view_)
-    view_->Show();
+  if (!view_)
+    return;
+  Profile* profile = ProfileManager::GetActiveUserProfile();
+  if (profile->GetProfilePolicyConnector()->IsManaged() &&
+      !profile->IsChild()) {
+    policy::BrowserPolicyConnectorChromeOS* connector =
+        g_browser_process->platform_part()->browser_policy_connector_chromeos();
+    view_->SetDomain(connector->GetEnterpriseDisplayDomain());
+    view_->SetDisplayEmail(
+        user_manager::UserManager::Get()->GetActiveUser()->GetDisplayEmail());
+  } else {
+    view_->SetIsNewGaiaAccount(context()->is_child_gaia_account_new);
+  }
+  view_->Show();
 }
 
 void FamilyLinkNoticeScreen::HideImpl() {}
diff --git a/chrome/browser/chromeos/login/wizard_context.h b/chrome/browser/chromeos/login/wizard_context.h
index 50e80f05..80d58a9c0 100644
--- a/chrome/browser/chromeos/login/wizard_context.h
+++ b/chrome/browser/chromeos/login/wizard_context.h
@@ -35,6 +35,10 @@
   // Indicates that user selects to sign in or create a new account for a child.
   bool sign_in_as_child = false;
 
+  // Indicates whether user creates a new gaia account when set up the device
+  // for a child.
+  bool is_child_gaia_account_new = false;
+
   // Whether the enrollment screen should be skipped when enrollment isn't
   // mandatory so that the normal gaia login is shown. Set by WizardController
   // SkipToLoginForTesting and checked on EnrollmentScreen::MaybeSkip
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index 678eb9b..62a5d68 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -1821,14 +1821,10 @@
 void WizardController::PrepareFirstRunPrefs() {
   // Showoff starts in parallel to OOBE onboarding. We need to store the prefs
   // early to make sure showoff has the correct data when launched.
-
-  // TODO(crbug.com/1101318): check difference between profile->IsChild(),
-  // user_manager->GetActiveUser()->IsChild() and
-  // user_manager->GetActiveUser()->GetType()
-
   Profile* profile = ProfileManager::GetActiveUserProfile();
   bool shouldShowParentalControl =
-      wizard_context_->sign_in_as_child && !profile->IsChild();
+      wizard_context_->sign_in_as_child && !profile->IsChild() &&
+      !profile->GetProfilePolicyConnector()->IsManaged();
   profile->GetPrefs()->SetBoolean(prefs::kHelpAppShouldShowParentalControl,
                                   shouldShowParentalControl);
 }
diff --git a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
index 9413137a..c43da22 100644
--- a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
@@ -1805,6 +1805,18 @@
       }
     }
   }
+
+  if (policy.has_device_show_low_disk_space_notification()) {
+    const em::DeviceShowLowDiskSpaceNotificationProto& container(
+        policy.device_show_low_disk_space_notification());
+    if (container.has_device_show_low_disk_space_notification()) {
+      policies->Set(
+          key::kDeviceShowLowDiskSpaceNotification, POLICY_LEVEL_MANDATORY,
+          POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
+          base::Value(container.device_show_low_disk_space_notification()),
+          nullptr);
+    }
+  }
 }
 
 }  // namespace
diff --git a/chrome/browser/chromeos/policy/lock_to_single_user_manager_unittest.cc b/chrome/browser/chromeos/policy/lock_to_single_user_manager_unittest.cc
index 5a0dadf..8693a69 100644
--- a/chrome/browser/chromeos/policy/lock_to_single_user_manager_unittest.cc
+++ b/chrome/browser/chromeos/policy/lock_to_single_user_manager_unittest.cc
@@ -37,6 +37,12 @@
   ~LockToSingleUserManagerTest() override = default;
 
   void SetUp() override {
+    // This setter will initialize DBusThreadManager.
+    // This is required before ArcSessionManager's constructor calls
+    // DBusThreadManager::Get().
+    auto dbus_thread_manager_setter =
+        chromeos::DBusThreadManager::GetSetterForTesting();
+
     arc::SetArcAvailableCommandLineForTesting(
         base::CommandLine::ForCurrentProcess());
     chromeos::LoginState::Initialize();
@@ -54,20 +60,19 @@
 
     arc_service_manager_->set_browser_context(profile());
 
-    auto setter = chromeos::DBusThreadManager::GetSetterForTesting();
     fake_concierge_client_ = new chromeos::FakeConciergeClient();
-    setter->SetConciergeClient(base::WrapUnique(fake_concierge_client_));
+    dbus_thread_manager_setter->SetConciergeClient(
+        base::WrapUnique(fake_concierge_client_));
   }
 
   void TearDown() override {
-    lock_to_single_user_manager_.reset();
-
     arc_session_manager_->Shutdown();
+    arc_session_manager_.reset();
     arc_service_manager_->set_browser_context(nullptr);
+    arc_service_manager_.reset();
 
     BrowserWithTestWindowTest::TearDown();
-    arc_session_manager_.reset();
-    arc_service_manager_.reset();
+    lock_to_single_user_manager_.reset();
 
     chromeos::CryptohomeClient::Shutdown();
     chromeos::LoginState::Shutdown();
diff --git a/chrome/browser/chromeos/policy/status_collector/app_info_generator.cc b/chrome/browser/chromeos/policy/status_collector/app_info_generator.cc
index f93ac339..a315df2 100644
--- a/chrome/browser/chromeos/policy/status_collector/app_info_generator.cc
+++ b/chrome/browser/chromeos/policy/status_collector/app_info_generator.cc
@@ -148,16 +148,15 @@
 }
 
 void AppInfoGenerator::OnAffiliatedLogin(Profile* profile) {
-  apps::AppServiceProxy* app_service_proxy =
-      apps::AppServiceProxyFactory::GetForProfile(profile);
-  if (app_service_proxy) {
-    provider_ = std::make_unique<AppInfoGenerator::AppInfoProvider>(profile);
-    provider_->activity_storage.PruneActivityPeriods(
-        clock_.Now(), max_stored_past_activity_interval_);
-  } else {
-    VLOG(1) << "Is incognito profile. Will not track usage.";
+  if (!apps::AppServiceProxyFactory::IsAppServiceAvailableForProfile(profile)) {
+    VLOG(1) << "No apps available. Will not track usage.";
+    return;
   }
 
+  provider_ = std::make_unique<AppInfoGenerator::AppInfoProvider>(profile);
+  provider_->activity_storage.PruneActivityPeriods(
+      clock_.Now(), max_stored_past_activity_interval_);
+
   if (should_report_) {
     provider_->app_service_proxy.InstanceRegistry().AddObserver(this);
   }
diff --git a/chrome/browser/chromeos/policy/system_proxy_manager.cc b/chrome/browser/chromeos/policy/system_proxy_manager.cc
index da1efdd..1fc7c4b 100644
--- a/chrome/browser/chromeos/policy/system_proxy_manager.cc
+++ b/chrome/browser/chromeos/policy/system_proxy_manager.cc
@@ -90,6 +90,16 @@
   profile_pref_change_registrar_->RemoveAll();
   profile_pref_change_registrar_.reset();
 }
+void SystemProxyManager::ClearUserCredentials() {
+  if (!system_proxy_enabled_) {
+    return;
+  }
+
+  system_proxy::ClearUserCredentialsRequest request;
+  chromeos::SystemProxyClient::Get()->ClearUserCredentials(
+      request, base::BindOnce(&SystemProxyManager::OnClearUserCredentials,
+                              weak_factory_.GetWeakPtr()));
+}
 
 void SystemProxyManager::OnSystemProxySettingsPolicyChanged() {
   chromeos::CrosSettingsProvider::TrustedStatus status =
@@ -176,6 +186,10 @@
                               weak_factory_.GetWeakPtr()));
 }
 
+void SystemProxyManager::SetSystemProxyEnabledForTest(bool enabled) {
+  system_proxy_enabled_ = enabled;
+}
+
 void SystemProxyManager::SetSystemServicesProxyUrlForTest(
     const std::string& local_proxy_url) {
   system_proxy_enabled_ = true;
@@ -199,6 +213,15 @@
   }
 }
 
+void SystemProxyManager::OnClearUserCredentials(
+    const system_proxy::ClearUserCredentialsResponse& response) {
+  if (response.has_error_message() && !response.error_message().empty()) {
+    NET_LOG(ERROR) << "Failed to clear user credentials: "
+                   << kSystemProxyService
+                   << ", error: " << response.error_message();
+  }
+}
+
 void SystemProxyManager::OnWorkerActive(
     const system_proxy::WorkerActiveSignalDetails& details) {
   if (details.traffic_origin() == system_proxy::TrafficOrigin::SYSTEM) {
diff --git a/chrome/browser/chromeos/policy/system_proxy_manager.h b/chrome/browser/chromeos/policy/system_proxy_manager.h
index 078920a6..efc53ff 100644
--- a/chrome/browser/chromeos/policy/system_proxy_manager.h
+++ b/chrome/browser/chromeos/policy/system_proxy_manager.h
@@ -50,13 +50,21 @@
   std::string SystemServicesProxyPacString() const;
   void StartObservingPrimaryProfilePrefs(Profile* profile);
   void StopObservingPrimaryProfilePrefs();
+  // If System-proxy is enabled, it will send a request via D-Bus to clear the
+  // user's proxy credentials cached by the local proxy workers. System-proxy
+  // requests proxy credentials from the browser by sending an
+  // |AuthenticationRequired| D-Bus signal.
+  void ClearUserCredentials();
 
+  void SetSystemProxyEnabledForTest(bool enabled);
   void SetSystemServicesProxyUrlForTest(const std::string& local_proxy_url);
 
  private:
   void OnSetAuthenticationDetails(
       const system_proxy::SetAuthenticationDetailsResponse& response);
   void OnDaemonShutDown(const system_proxy::ShutDownResponse& response);
+  void OnClearUserCredentials(
+      const system_proxy::ClearUserCredentialsResponse& response);
 
   void OnKerberosEnabledChanged();
   void OnKerberosAccountChanged();
diff --git a/chrome/browser/chromeos/profiles/profile_helper.cc b/chrome/browser/chromeos/profiles/profile_helper.cc
index 4281265..955ccd46 100644
--- a/chrome/browser/chromeos/profiles/profile_helper.cc
+++ b/chrome/browser/chromeos/profiles/profile_helper.cc
@@ -54,7 +54,6 @@
 const char* kNonRiskyExtensionsIdsHashes[] = {
     "E24F1786D842E91E74C27929B0B3715A4689A473",  // Gnubby component extension
     "6F9E349A0561C78A0D3F41496FE521C5151C7F71",  // Gnubby app
-    "8EBDF73405D0B84CEABB8C7513C9B9FA9F1DC2CE",  // Genius app (help)
     "06BE211D5F014BAB34BC22D9DDA09C63A81D828E",  // Chrome OS XKB
     "3F50C3A83839D9C76334BCE81CDEC06174F266AF",  // Virtual Keyboard
     "2F47B526FA71F44816618C41EC55E5EE9543FDCC",  // Braille Keyboard
diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc
index aec9ca22..cf20b70 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider.cc
@@ -86,6 +86,7 @@
     kDeviceLoginScreenSystemInfoEnforced,
     kDeviceMinimumVersion,
     kDeviceMinimumVersionAueMessage,
+    kDeviceShowLowDiskSpaceNotification,
     kDeviceShowNumericKeyboardForPassword,
     kDeviceOffHours,
     kDeviceOwner,
@@ -997,6 +998,22 @@
                                  base::Value(container.mode()));
     }
   }
+
+  // Default value of the policy in case it's missing.
+  bool show_low_disk_space_notification = true;
+  // Disable the notification by default for enrolled devices.
+  if (InstallAttributes::Get()->IsEnterpriseManaged())
+    show_low_disk_space_notification = false;
+  if (policy.has_device_show_low_disk_space_notification()) {
+    const em::DeviceShowLowDiskSpaceNotificationProto& container(
+        policy.device_show_low_disk_space_notification());
+    if (container.has_device_show_low_disk_space_notification()) {
+      show_low_disk_space_notification =
+          container.device_show_low_disk_space_notification();
+    }
+  }
+  new_values_cache->SetBoolean(kDeviceShowLowDiskSpaceNotification,
+                               show_low_disk_space_notification);
 }
 
 void DecodeLogUploadPolicies(const em::ChromeDeviceSettingsProto& policy,
diff --git a/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc b/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
index efc3911c..8af71e0e 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider_unittest.cc
@@ -399,6 +399,27 @@
     VerifyPolicyValue(policy_key, &list);
   }
 
+  // Helper routine clear the ShowLowDiskSpaceNotification policy.
+  void ClearDeviceShowLowDiskSpaceNotification() {
+    device_policy_->payload().clear_device_show_low_disk_space_notification();
+    BuildAndInstallDevicePolicy();
+  }
+
+  // Helper routine set the ShowLowDiskSpaceNotification policy.
+  void SetDeviceShowLowDiskSpaceNotification(bool show) {
+    em::DeviceShowLowDiskSpaceNotificationProto* proto =
+        device_policy_->payload()
+            .mutable_device_show_low_disk_space_notification();
+    proto->set_device_show_low_disk_space_notification(show);
+    BuildAndInstallDevicePolicy();
+  }
+
+  void VerifyDeviceShowLowDiskSpaceNotification(bool expected) {
+    const base::Value expected_value(expected);
+    EXPECT_EQ(expected_value,
+              *provider_->Get(kDeviceShowLowDiskSpaceNotification));
+  }
+
   ScopedTestingLocalState local_state_;
 
   std::unique_ptr<DeviceSettingsProvider> provider_;
@@ -1123,4 +1144,30 @@
   VerifyDevicePrinterList(kDevicePrintersAllowlist, values);
 }
 
+TEST_F(DeviceSettingsProviderTest,
+       DeviceShowLowDiskSpaceNotificationDefaultTrue) {
+  ClearDeviceShowLowDiskSpaceNotification();
+  // Missing policy should default to showing the low disk space
+  // notification for consumer devices.
+  VerifyDeviceShowLowDiskSpaceNotification(true);
+}
+
+TEST_F(DeviceSettingsProviderTestEnterprise,
+       DeviceShowLowDiskSpaceNotificationDefaultFalse) {
+  ClearDeviceShowLowDiskSpaceNotification();
+  // Missing policy should default to suppressing the low disk space
+  // notification for enrolled devices by default.
+  VerifyDeviceShowLowDiskSpaceNotification(false);
+}
+
+TEST_F(DeviceSettingsProviderTestEnterprise,
+       DeviceShowLowDiskSpaceNotification) {
+  // Showing the low disk space notification can be controlled by policy.
+  SetDeviceShowLowDiskSpaceNotification(true);
+  VerifyDeviceShowLowDiskSpaceNotification(true);
+
+  SetDeviceShowLowDiskSpaceNotification(false);
+  VerifyDeviceShowLowDiskSpaceNotification(false);
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/ui/low_disk_notification.cc b/chrome/browser/chromeos/ui/low_disk_notification.cc
index f036de78..06902860 100644
--- a/chrome/browser/chromeos/ui/low_disk_notification.cc
+++ b/chrome/browser/chromeos/ui/low_disk_notification.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
+#include "chrome/browser/chromeos/settings/cros_settings.h"
 #include "chrome/browser/notifications/system_notification_helper.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/settings_window_manager_chromeos.h"
@@ -22,6 +23,7 @@
 #include "chrome/grit/generated_resources.h"
 #include "chromeos/dbus/cryptohome/cryptohome_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/settings/cros_settings_names.h"
 #include "components/user_manager/user_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -56,11 +58,18 @@
 
 void LowDiskNotification::LowDiskSpace(uint64_t free_disk_bytes) {
   DCHECK(thread_checker_.CalledOnValidThread());
+
+  bool show_low_disk_space_notification = true;
+  if (!chromeos::CrosSettings::Get()->GetBoolean(
+          chromeos::kDeviceShowLowDiskSpaceNotification,
+          &show_low_disk_space_notification)) {
+    DVLOG(1) << "DeviceShowLowDiskSpaceNotification not set, "
+                "defaulting to showing the notification.";
+  }
+
   // We suppress the low-space notifications when there are multiple users on an
-  // enterprise managed device. crbug.com/656788.
-  if (g_browser_process->platform_part()
-          ->browser_policy_connector_chromeos()
-          ->IsEnterpriseManaged() &&
+  // enterprise managed device based on policy configuration.
+  if (!show_low_disk_space_notification &&
       user_manager::UserManager::Get()->GetUsers().size() > 1) {
     LOG(WARNING) << "Device is low on disk space, but the notification was "
                  << "suppressed on a managed device.";
diff --git a/chrome/browser/chromeos/ui/low_disk_notification_unittest.cc b/chrome/browser/chromeos/ui/low_disk_notification_unittest.cc
index eee45cc..b1b37457 100644
--- a/chrome/browser/chromeos/ui/low_disk_notification_unittest.cc
+++ b/chrome/browser/chromeos/ui/low_disk_notification_unittest.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind.h"
 #include "base/time/time.h"
+#include "chrome/browser/chromeos/settings/cros_settings.h"
 #include "chrome/browser/notifications/notification_display_service_tester.h"
 #include "chrome/browser/notifications/system_notification_helper.h"
 #include "chrome/grit/generated_resources.h"
@@ -18,6 +19,9 @@
 #include "chrome/test/base/testing_profile_manager.h"
 #include "chromeos/dbus/cryptohome/fake_cryptohome_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/settings/cros_settings_names.h"
+#include "components/user_manager/fake_user_manager.h"
+#include "components/user_manager/scoped_user_manager.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/message_center/public/cpp/notification.h"
@@ -34,20 +38,29 @@
 
 class LowDiskNotificationTest : public BrowserWithTestWindowTest {
  public:
-  LowDiskNotificationTest() {}
-  ~LowDiskNotificationTest() override {}
+  LowDiskNotificationTest() = default;
+  ~LowDiskNotificationTest() override = default;
 
   void SetUp() override {
     BrowserWithTestWindowTest::SetUp();
     CryptohomeClient::InitializeFake();
 
+    GetCrosSettingsHelper()->ReplaceDeviceSettingsProviderWithStub();
+    GetCrosSettingsHelper()->SetBoolean(
+        chromeos::kDeviceShowLowDiskSpaceNotification, true);
+
+    auto user_manager = std::make_unique<user_manager::FakeUserManager>();
+    user_manager_ = user_manager.get();
+    scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>(
+        std::move(user_manager));
+
     TestingBrowserProcess::GetGlobal()->SetSystemNotificationHelper(
         std::make_unique<SystemNotificationHelper>());
     tester_ = std::make_unique<NotificationDisplayServiceTester>(
         nullptr /* profile */);
     tester_->SetNotificationAddedClosure(base::BindRepeating(
         &LowDiskNotificationTest::OnNotificationAdded, base::Unretained(this)));
-    low_disk_notification_.reset(new LowDiskNotification());
+    low_disk_notification_ = std::make_unique<LowDiskNotification>();
     notification_count_ = 0;
   }
 
@@ -69,6 +82,8 @@
   void OnNotificationAdded() { notification_count_++; }
 
  protected:
+  user_manager::FakeUserManager* user_manager_ = nullptr;
+  std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
   std::unique_ptr<NotificationDisplayServiceTester> tester_;
   std::unique_ptr<LowDiskNotification> low_disk_notification_;
   int notification_count_;
@@ -116,4 +131,29 @@
   EXPECT_EQ(1, notification_count_);
 }
 
+TEST_F(LowDiskNotificationTest, ShowForMultipleUsersWhenEnrolled) {
+  user_manager_->AddUser(
+      AccountId::FromUserEmailGaiaId("test_user1@example.com", "1234567891"));
+  user_manager_->AddUser(
+      AccountId::FromUserEmailGaiaId("test_user2@example.com", "1234567892"));
+
+  SetNotificationThrottlingInterval(-1);
+  low_disk_notification_->LowDiskSpace(kHighNotification);
+  EXPECT_EQ(1, notification_count_);
+}
+
+TEST_F(LowDiskNotificationTest, SupressedForMultipleUsersWhenEnrolled) {
+  user_manager_->AddUser(
+      AccountId::FromUserEmailGaiaId("test_user1@example.com", "1234567891"));
+  user_manager_->AddUser(
+      AccountId::FromUserEmailGaiaId("test_user2@example.com", "1234567892"));
+
+  GetCrosSettingsHelper()->SetBoolean(
+      chromeos::kDeviceShowLowDiskSpaceNotification, false);
+
+  SetNotificationThrottlingInterval(-1);
+  low_disk_notification_->LowDiskSpace(kHighNotification);
+  EXPECT_EQ(0, notification_count_);
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/usb/cros_usb_detector.cc b/chrome/browser/chromeos/usb/cros_usb_detector.cc
index 2cc1b35..a536c58 100644
--- a/chrome/browser/chromeos/usb/cros_usb_detector.cc
+++ b/chrome/browser/chromeos/usb/cros_usb_detector.cc
@@ -268,6 +268,7 @@
   g_cros_usb_detector = this;
   guest_os_classes_blocked_.emplace_back(
       UsbFilterByClassCode(USB_CLASS_PHYSICAL));
+  guest_os_classes_blocked_.emplace_back(UsbFilterByClassCode(USB_CLASS_HUB));
   guest_os_classes_blocked_.emplace_back(UsbFilterByClassCode(USB_CLASS_HID));
   guest_os_classes_blocked_.emplace_back(
       UsbFilterByClassCode(USB_CLASS_PRINTER));
@@ -281,6 +282,8 @@
   guest_os_classes_without_notif_.emplace_back(
       UsbFilterByClassCode(USB_CLASS_VIDEO));
   guest_os_classes_without_notif_.emplace_back(
+      UsbFilterByClassCode(USB_CLASS_BILLBOARD));
+  guest_os_classes_without_notif_.emplace_back(
       UsbFilterByClassCode(USB_CLASS_PERSONAL_HEALTHCARE));
 
   // If a device has an adb interface, we always allow it.
@@ -372,7 +375,8 @@
   if ((GetFilteredInterfacesMask(guest_os_classes_without_notif_, device_info) &
        allowed_interfaces_mask) != 0) {
     VLOG(1) << "At least one notifiable interface found for device";
-    return true;
+    // Only notify if no interfaces were suppressed.
+    return GetUsbInterfaceBaseMask(device_info) == allowed_interfaces_mask;
   }
   return false;
 }
diff --git a/chrome/browser/chromeos/web_applications/chrome_help_app_ui_delegate.cc b/chrome/browser/chromeos/web_applications/chrome_help_app_ui_delegate.cc
index 5f80938..5f20eab4 100644
--- a/chrome/browser/chromeos/web_applications/chrome_help_app_ui_delegate.cc
+++ b/chrome/browser/chromeos/web_applications/chrome_help_app_ui_delegate.cc
@@ -50,7 +50,6 @@
 
 void ChromeHelpAppUIDelegate::PopulateLoadTimeData(
     content::WebUIDataSource* source) {
-  source->AddLocalizedString("getHelpName", IDS_GENIUS_APP_NAME);
   source->AddString("appLocale", g_browser_process->GetApplicationLocale());
   // Add strings that can be pulled in.
   source->AddString("boardName", base::SysInfo::GetLsbReleaseBoard());
diff --git a/chrome/browser/chromeos/web_applications/help_app_integration_browsertest.cc b/chrome/browser/chromeos/web_applications/help_app_integration_browsertest.cc
index 7e70165c54..66a28a23 100644
--- a/chrome/browser/chromeos/web_applications/help_app_integration_browsertest.cc
+++ b/chrome/browser/chromeos/web_applications/help_app_integration_browsertest.cc
@@ -7,35 +7,27 @@
 
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/metrics/user_action_tester.h"
-#include "base/test/scoped_feature_list.h"
 #include "chrome/browser/apps/app_service/app_launch_params.h"
 #include "chrome/browser/apps/app_service/app_service_proxy.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/chromeos/web_applications/system_web_app_integration_test.h"
 #include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/browser/web_applications/system_web_app_manager.h"
 #include "chrome/browser/web_applications/system_web_app_manager_browsertest.h"
 #include "chromeos/components/help_app_ui/url_constants.h"
 #include "chromeos/components/web_applications/test/sandboxed_web_ui_test_base.h"
-#include "chromeos/constants/chromeos_features.h"
 #include "content/public/test/browser_test.h"
+#include "content/public/test/test_navigation_observer.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/display/screen.h"
 #include "ui/display/types/display_constants.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 
-class HelpAppIntegrationTest : public SystemWebAppIntegrationTest {
- public:
-  HelpAppIntegrationTest() {
-    scoped_feature_list_.InitWithFeatures({chromeos::features::kHelpAppV2}, {});
-  }
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
+using HelpAppIntegrationTest = SystemWebAppIntegrationTest;
 
 // Test that the Help App installs and launches correctly. Runs some spot
 // checks on the manifest.
@@ -118,6 +110,32 @@
       chrome::ShowHelp(incognito_browser, chrome::HELP_SOURCE_KEYBOARD));
 }
 
+// Test that the Help App does a navigation on launch even when it was already
+// open with the same URL.
+IN_PROC_BROWSER_TEST_P(HelpAppIntegrationTest, HelpAppV2NavigateOnRelaunch) {
+  WaitForTestSystemAppInstall();
+
+  // There should initially be a single browser window.
+  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
+
+  Browser* browser;
+  content::WebContents* web_contents =
+      LaunchApp(web_app::SystemAppType::HELP, &browser);
+
+  // There should be two browser windows, one regular and one for the newly
+  // opened app.
+  EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
+
+  content::TestNavigationObserver navigation_observer(web_contents);
+  LaunchAppWithoutWaiting(web_app::SystemAppType::HELP);
+  // If no navigation happens, then this test will time out due to the wait.
+  navigation_observer.Wait();
+
+  // LaunchApp should navigate the existing window and not open any new windows.
+  EXPECT_EQ(browser, chrome::FindLastActive());
+  EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
+}
+
 INSTANTIATE_TEST_SUITE_P(All,
                          HelpAppIntegrationTest,
                          ::testing::Values(web_app::ProviderType::kBookmarkApps,
diff --git a/chrome/browser/engagement/site_engagement_helper.cc b/chrome/browser/engagement/site_engagement_helper.cc
index 68204cbc..ff9df91 100644
--- a/chrome/browser/engagement/site_engagement_helper.cc
+++ b/chrome/browser/engagement/site_engagement_helper.cc
@@ -11,8 +11,8 @@
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/profiles/profile.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
 
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn
index 155ffa6..68e902a 100644
--- a/chrome/browser/extensions/BUILD.gn
+++ b/chrome/browser/extensions/BUILD.gn
@@ -822,6 +822,7 @@
     "//components/policy:generated",
     "//components/policy/core/browser",
     "//components/pref_registry",
+    "//components/prerender/browser",
     "//components/proxy_config",
     "//components/rappor",
     "//components/resources",
diff --git a/chrome/browser/extensions/activity_log/activity_log.cc b/chrome/browser/extensions/activity_log/activity_log.cc
index 21b3913f..168e74d 100644
--- a/chrome/browser/extensions/activity_log/activity_log.cc
+++ b/chrome/browser/extensions/activity_log/activity_log.cc
@@ -27,7 +27,6 @@
 #include "chrome/browser/extensions/activity_log/fullstream_ui_policy.h"
 #include "chrome/browser/extensions/api/activity_log_private/activity_log_private_api.h"
 #include "chrome/browser/extensions/extension_tab_util.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -35,6 +34,7 @@
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/sync_preferences/pref_service_syncable.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/extensions/activity_log/activity_log_unittest.cc b/chrome/browser/extensions/activity_log/activity_log_unittest.cc
index 8a4c9334..c19fabfd 100644
--- a/chrome/browser/extensions/activity_log/activity_log_unittest.cc
+++ b/chrome/browser/extensions/activity_log/activity_log_unittest.cc
@@ -18,14 +18,14 @@
 #include "chrome/browser/extensions/activity_log/activity_log_task_runner.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/test_extension_system.h"
-#include "chrome/browser/prerender/prerender_handle.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/prerender/prerender_test_utils.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/prerender/browser/prerender_handle.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_task_environment.h"
 #include "extensions/browser/extension_registry.h"
diff --git a/chrome/browser/extensions/api/streams_private/streams_private_api.cc b/chrome/browser/extensions/api/streams_private/streams_private_api.cc
index 4b26fec..3cc8dfd2 100644
--- a/chrome/browser/extensions/api/streams_private/streams_private_api.cc
+++ b/chrome/browser/extensions/api/streams_private/streams_private_api.cc
@@ -8,7 +8,7 @@
 
 #include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "components/sessions/core/session_id.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_frame_host.h"
diff --git a/chrome/browser/extensions/component_loader.cc b/chrome/browser/extensions/component_loader.cc
index 5389869dc..e5913c6a 100644
--- a/chrome/browser/extensions/component_loader.cc
+++ b/chrome/browser/extensions/component_loader.cc
@@ -37,6 +37,7 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/content_switches.h"
 #include "extensions/browser/extension_file_task_runner.h"
+#include "extensions/browser/extension_prefs.h"
 #include "extensions/browser/extension_system.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
@@ -512,7 +513,11 @@
   }
 
 #if defined(OS_CHROMEOS) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
-  if (!base::FeatureList::IsEnabled(chromeos::features::kHelpAppV2)) {
+  // TODO(b/159863346): Delete this entirely around M88 when it has has a chance
+  // to be cleaned up.
+  if (extensions::ExtensionPrefs::Get(profile_)
+          ->ShouldInstallObsoleteComponentExtension(
+              extension_misc::kGeniusAppId)) {
     // Since this is a v2 Chrome app it has a background page.
     AddWithNameAndDescription(
         IDR_GENIUS_APP_MANIFEST,
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 082ca13..5526ac3 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -134,6 +134,12 @@
     "dliochdbjfkdbacpmhlcpmleaejidimm"   // Google Cast (Beta)
 };
 
+// IDs of component extensions that have been obsoleted and need to be
+// uninstalled.
+const char* const kObsoleteComponentExtensionIds[] = {
+    "ljoammodoonkhnehlncldjelhidljdpi"  // Genius
+};
+
 void ReportExtensionDisabledRemotely(bool is_currently_enabled,
                                      ExtensionUpdateCheckDataKey reason) {
   // Report that the extension is newly disabled due to malware.
@@ -1273,6 +1279,8 @@
                   [](base::RepeatingClosure callback) { callback.Run(); },
                   external_updates_finished_callback_);
     updater()->CheckNow(std::move(params));
+  } else if (external_updates_finished_callback_) {
+    external_updates_finished_callback_.Run();
   }
 
   // Uninstall all the unclaimed extensions.
@@ -2351,6 +2359,16 @@
       UninstallExtension(extension_id, UNINSTALL_REASON_MIGRATED, nullptr);
     }
   }
+
+  for (const std::string& extension_id : kObsoleteComponentExtensionIds) {
+    auto* extension = installed_extensions->GetByID(extension_id);
+    if (extension) {
+      UninstallExtension(extension_id, UNINSTALL_REASON_COMPONENT_REMOVED,
+                         nullptr);
+      extension_prefs_->MarkObsoleteComponentExtensionAsRemoved(
+          extension->id(), extension->location());
+    }
+  }
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h
index c5922244..c6afc7b7 100644
--- a/chrome/browser/extensions/extension_service.h
+++ b/chrome/browser/extensions/extension_service.h
@@ -659,8 +659,9 @@
   bool update_once_all_providers_are_ready_ = false;
 
   // A callback to be called when all external providers are ready and their
-  // extensions have been installed. Normally this is a null callback, but
-  // is used in external provider related tests.
+  // extensions have been installed. This happens on initial load and whenever
+  // a new entry is found. Normally this is a null callback, but is used in
+  // external provider related tests.
   // TODO(mxnguyen): Change |external_updates_finished_callback_| to
   // OnceClosure.
   base::Closure external_updates_finished_callback_;
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index 10c2da6..edd0744 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -36,6 +36,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind_test_util.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
 #include "base/values.h"
 #include "base/version.h"
@@ -60,6 +61,7 @@
 #include "chrome/browser/extensions/external_policy_loader.h"
 #include "chrome/browser/extensions/external_pref_loader.h"
 #include "chrome/browser/extensions/external_provider_impl.h"
+#include "chrome/browser/extensions/external_testing_loader.h"
 #include "chrome/browser/extensions/fake_safe_browsing_database_manager.h"
 #include "chrome/browser/extensions/installed_loader.h"
 #include "chrome/browser/extensions/load_error_reporter.h"
@@ -78,6 +80,7 @@
 #include "chrome/browser/ui/global_error/global_error_service.h"
 #include "chrome/browser/ui/global_error/global_error_service_factory.h"
 #include "chrome/browser/ui/global_error/global_error_waiter.h"
+#include "chrome/browser/web_applications/components/external_app_install_features.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
@@ -193,6 +196,7 @@
 const char permissions_blocklist[] = "noffkehfcaggllbcojjbopcmlhcnhcdn";
 const char cast_stable[] = "boadgeojelhgndaghljhdicfkmllpafd";
 const char cast_beta[] = "dliochdbjfkdbacpmhlcpmleaejidimm";
+const char genius_app[] = "ljoammodoonkhnehlncldjelhidljdpi";
 const char kPrefBlocklist[] = "blacklist";
 
 struct BubbleErrorsTestData {
@@ -297,39 +301,6 @@
 
 }  // namespace
 
-// A simplified version of ExternalPrefLoader that loads the dictionary
-// from json data specified in a string.
-class ExternalTestingLoader : public ExternalLoader {
- public:
-  ExternalTestingLoader(const std::string& json_data,
-                        const base::FilePath& fake_base_path)
-      : fake_base_path_(fake_base_path) {
-    DCHECK_CURRENTLY_ON(BrowserThread::UI);
-    JSONStringValueDeserializer deserializer(json_data);
-    base::FilePath fake_json_path = fake_base_path.AppendASCII("fake.json");
-    testing_prefs_ = ExternalPrefLoader::ExtractExtensionPrefs(&deserializer,
-                                                               fake_json_path);
-  }
-
-  // ExternalLoader:
-  const base::FilePath GetBaseCrxFilePath() override { return fake_base_path_; }
-
-  void StartLoading() override {
-    DCHECK_CURRENTLY_ON(BrowserThread::UI);
-    LoadFinished(testing_prefs_->CreateDeepCopy());
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<ExternalLoader>;
-
-  ~ExternalTestingLoader() override {}
-
-  base::FilePath fake_base_path_;
-  std::unique_ptr<base::DictionaryValue> testing_prefs_;
-
-  DISALLOW_COPY_AND_ASSIGN(ExternalTestingLoader);
-};
-
 class MockProviderVisitor : public ExternalProviderInterface::VisitorInterface {
  public:
   // The provider will return |fake_base_path| from
@@ -470,6 +441,7 @@
   }
 
   Profile* profile() { return profile_.get(); }
+  const ExternalProviderImpl& provider() const { return *provider_; }
 
  protected:
   std::unique_ptr<ExternalProviderImpl> provider_;
@@ -5967,6 +5939,30 @@
     EXPECT_EQ(2, visitor.Visit(json_data));
   }
 
+  // Test web_app_migration_flag.
+  {
+    json_data = R"(
+      {
+        "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa": {
+          "external_crx": "RandomExtension.crx",
+          "external_version": "1.0",
+          "web_app_migration_flag": "TestFeature"
+        }
+      })";
+
+    {
+      base::AutoReset<bool> testing_scope =
+          web_app::SetExternalAppInstallFeatureAlwaysEnabledForTesting();
+      EXPECT_EQ(0, visitor.Visit(json_data));
+      visitor.provider().HasExtension("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
+    }
+
+    {
+      EXPECT_EQ(1, visitor.Visit(json_data));
+      visitor.provider().HasExtension("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
+    }
+  }
+
   // Test keep_if_present.
   json_data =
       "{"
@@ -7680,6 +7676,70 @@
   EXPECT_FALSE(registry()->GetInstalledExtension(cast_stable));
 }
 
+// Tests that component extensions that have been migrated can be uninstalled.
+TEST_F(ExtensionServiceTest, UninstallMigratedComponentExtensions) {
+  InitializeEmptyExtensionServiceWithTestingPrefs();
+  ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
+  ASSERT_TRUE(prefs->ShouldInstallObsoleteComponentExtension(genius_app));
+
+  scoped_refptr<const Extension> genius_extension =
+      ExtensionBuilder("genius")
+          .SetID(genius_app)
+          .SetLocation(Manifest::INTERNAL)
+          .Build();
+  service()->AddComponentExtension(genius_extension.get());
+  ASSERT_TRUE(registry()->enabled_extensions().Contains(genius_app));
+
+  service()->UninstallMigratedExtensionsForTest();
+  EXPECT_FALSE(registry()->GetInstalledExtension(genius_app));
+  EXPECT_FALSE(prefs->ShouldInstallObsoleteComponentExtension(genius_app));
+}
+
+// Tests that component extensions that are not marked as obsolete will not be
+// uninstalled.
+TEST_F(ExtensionServiceTest, UninstallMigratedExtensionsKeepsGoodComponents) {
+  InitializeEmptyExtensionServiceWithTestingPrefs();
+  ExtensionPrefs* prefs = ExtensionPrefs::Get(profile());
+
+  scoped_refptr<const Extension> good_extension =
+      ExtensionBuilder("good")
+          .SetID(good0)
+          .SetLocation(Manifest::INTERNAL)
+          .Build();
+  service()->AddComponentExtension(good_extension.get());
+  ASSERT_TRUE(registry()->enabled_extensions().Contains(good0));
+
+  service()->UninstallMigratedExtensionsForTest();
+  // Because good0 is not a migrated component extension it should still be
+  // currently installed, and should continue to be installed in the future.
+  EXPECT_TRUE(registry()->GetInstalledExtension(good0));
+  EXPECT_TRUE(prefs->ShouldInstallObsoleteComponentExtension(good0));
+}
+
+// Tests that repeat calls to UninstallMigratedExtensions doesn't crash/fail.
+TEST_F(ExtensionServiceTest, UninstallMigratedExtensionsMultipleCalls) {
+  InitializeEmptyExtensionServiceWithTestingPrefs();
+
+  scoped_refptr<const Extension> cast_extension =
+      ExtensionBuilder("stable")
+          .SetID(cast_stable)
+          .SetLocation(Manifest::INTERNAL)
+          .Build();
+  scoped_refptr<const Extension> genius_extension =
+      ExtensionBuilder("genius")
+          .SetID(genius_app)
+          .SetLocation(Manifest::INTERNAL)
+          .Build();
+  service()->AddExtension(cast_extension.get());
+  service()->AddComponentExtension(genius_extension.get());
+
+  service()->UninstallMigratedExtensionsForTest();
+  service()->UninstallMigratedExtensionsForTest();
+  service()->UninstallMigratedExtensionsForTest();
+  EXPECT_FALSE(registry()->GetInstalledExtension(cast_stable));
+  EXPECT_FALSE(registry()->GetInstalledExtension(genius_app));
+}
+
 // Tests the case of a user installing a non-policy extension (e.g. through the
 // webstore), and that extension later becoming required by policy.
 // Regression test for https://crbug.com/894184.
diff --git a/chrome/browser/extensions/external_provider_impl.cc b/chrome/browser/extensions/external_provider_impl.cc
index 1bd3272..8a643ed 100644
--- a/chrome/browser/extensions/external_provider_impl.cc
+++ b/chrome/browser/extensions/external_provider_impl.cc
@@ -34,6 +34,7 @@
 #include "chrome/browser/extensions/forced_extensions/install_stage_tracker.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/web_applications/components/external_app_install_features.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/extensions/extension_constants.h"
@@ -107,6 +108,8 @@
 const char ExternalProviderImpl::kIsFromWebstore[] = "is_from_webstore";
 const char ExternalProviderImpl::kKeepIfPresent[] = "keep_if_present";
 const char ExternalProviderImpl::kWasInstalledByOem[] = "was_installed_by_oem";
+const char ExternalProviderImpl::kWebAppMigrationFlag[] =
+    "web_app_migration_flag";
 const char ExternalProviderImpl::kSupportedLocales[] = "supported_locales";
 const char ExternalProviderImpl::kMayBeUntrusted[] = "may_be_untrusted";
 const char ExternalProviderImpl::kMinProfileCreatedByVersion[] =
@@ -346,9 +349,19 @@
         is_from_webstore) {
       creation_flags |= Extension::FROM_WEBSTORE;
     }
-    bool keep_if_present = false;
-    if (extension->GetBoolean(kKeepIfPresent, &keep_if_present) &&
-        keep_if_present) {
+
+    // If the extension is in a web app migration treat it as "keep_if_present"
+    // so it can get uninstalled by WebAppUiManager::UninstallAndReplace() once
+    // the replacement web app has installed and migrated over user preferences.
+    // TODO(crbug.com/1099150): Remove this field after migration is complete.
+    const std::string* web_app_migration_flag =
+        extension->FindStringPath(kWebAppMigrationFlag);
+    bool is_migrating_to_web_app =
+        web_app_migration_flag &&
+        web_app::IsExternalAppInstallFeatureEnabled(*web_app_migration_flag);
+    bool keep_if_present =
+        extension->FindBoolPath(kKeepIfPresent).value_or(false);
+    if (keep_if_present || is_migrating_to_web_app) {
       ExtensionRegistry* extension_registry = ExtensionRegistry::Get(profile_);
       const Extension* extension =
           extension_registry ? extension_registry->GetExtensionById(
@@ -365,6 +378,7 @@
         continue;
       }
     }
+
     bool was_installed_by_oem = false;
     if (extension->GetBoolean(kWasInstalledByOem, &was_installed_by_oem) &&
         was_installed_by_oem) {
diff --git a/chrome/browser/extensions/external_provider_impl.h b/chrome/browser/extensions/external_provider_impl.h
index adb652fa..9d28886 100644
--- a/chrome/browser/extensions/external_provider_impl.h
+++ b/chrome/browser/extensions/external_provider_impl.h
@@ -81,6 +81,7 @@
   static const char kKeepIfPresent[];
   static const char kSupportedLocales[];
   static const char kWasInstalledByOem[];
+  static const char kWebAppMigrationFlag[];
   static const char kMayBeUntrusted[];
   static const char kMinProfileCreatedByVersion[];
   static const char kDoNotInstallForEnterprise[];
diff --git a/chrome/browser/extensions/external_provider_impl_unittest.cc b/chrome/browser/extensions/external_provider_impl_unittest.cc
index baa092f..03dc7798 100644
--- a/chrome/browser/extensions/external_provider_impl_unittest.cc
+++ b/chrome/browser/extensions/external_provider_impl_unittest.cc
@@ -23,7 +23,9 @@
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_service_test_base.h"
+#include "chrome/browser/extensions/external_testing_loader.h"
 #include "chrome/browser/extensions/updater/extension_updater.h"
+#include "chrome/browser/web_applications/components/external_app_install_features.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/extensions/extension_constants.h"
@@ -57,8 +59,26 @@
 
 namespace {
 
-const char kManifestPath[] = "/update_manifest";
-const char kAppPath[] = "/app.crx";
+struct TestServerExtension {
+  const char* update_path;
+  const char* app_id;
+  const char* app_path;
+  const char* version;
+  const char* crx_path;
+};
+
+constexpr const TestServerExtension kInAppPaymentsApp{
+    "/update_manifest", extension_misc::kInAppPaymentsSupportAppId,
+    "/dummyiap.crx", "1.0.0.4", "extensions/dummyiap.crx"};
+
+constexpr const TestServerExtension kGoodApp{
+    "/update_good", "ldnnhddmnhbkjipkidpdiheffobcpfmf", "/good.crx", "1.0.0.0",
+    "extensions/good.crx"};
+
+constexpr const TestServerExtension kTestServerExtensions[] = {
+    kInAppPaymentsApp,
+    kGoodApp,
+};
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
 const char kExternalAppId[] = "kekdneafjmhmndejhmbcadfiiofngffo";
@@ -76,8 +96,7 @@
   ExternalProviderImplTest() {}
   ~ExternalProviderImplTest() override {}
 
-  void InitServiceWithExternalProviders(
-      const base::Optional<bool> block_external = base::nullopt) {
+  void InitService() {
 #if defined(OS_CHROMEOS)
     user_manager::ScopedUserManager scoped_user_manager(
         std::make_unique<chromeos::FakeChromeUserManager>());
@@ -91,6 +110,11 @@
     // the webstore, ignoring the url we pass to kAppsGalleryUpdateURL, which
     // would cause the external updates to never finish install.
     profile_->GetPrefs()->SetString(prefs::kDefaultApps, "");
+  }
+
+  void InitServiceWithExternalProviders(
+      const base::Optional<bool> block_external = base::nullopt) {
+    InitService();
 
     if (block_external.has_value())
       SetExternalExtensionsBlockedByPolicy(block_external.value());
@@ -155,47 +179,59 @@
     test_extension_cache_.reset(new ExtensionCacheFake());
 
     extension_test_util::SetGalleryUpdateURL(
-        test_server_->GetURL(kManifestPath));
+        test_server_->GetURL(kInAppPaymentsApp.update_path));
   }
 
+  void AwaitCheckForExternalUpdates() {
+    base::RunLoop run_loop;
+    service_->set_external_updates_finished_callback_for_test(
+        run_loop.QuitWhenIdleClosure());
+    service_->CheckForExternalUpdates();
+    run_loop.Run();
+  }
+
+ protected:
+  std::unique_ptr<net::test_server::EmbeddedTestServer> test_server_;
+
  private:
   std::unique_ptr<net::test_server::HttpResponse> HandleRequest(
       const net::test_server::HttpRequest& request) {
     GURL url = test_server_->GetURL(request.relative_url);
-    if (url.path() == kManifestPath) {
-      auto response = std::make_unique<net::test_server::BasicHttpResponse>();
-      response->set_code(net::HTTP_OK);
-      response->set_content(base::StringPrintf(
-          "<?xml version='1.0' encoding='UTF-8'?>\n"
-          "<gupdate xmlns='http://www.google.com/update2/response' "
-              "protocol='2.0'>\n"
-          "  <app appid='%s'>\n"
-          "    <updatecheck codebase='%s' version='1.0' />\n"
-          "  </app>\n"
-          "</gupdate>",
-          extension_misc::kInAppPaymentsSupportAppId,
-          test_server_->GetURL(kAppPath).spec().c_str()));
-      response->set_content_type("text/xml");
-      return std::move(response);
-    }
-    if (url.path() == kAppPath) {
-      base::FilePath test_data_dir;
-      base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
-      std::string contents;
-      base::ReadFileToString(
-          test_data_dir.AppendASCII("extensions/dummyiap.crx"),
-          &contents);
-      auto response = std::make_unique<net::test_server::BasicHttpResponse>();
-      response->set_code(net::HTTP_OK);
-      response->set_content(contents);
-      return std::move(response);
+    for (const TestServerExtension& test_extension : kTestServerExtensions) {
+      if (url.path() == test_extension.update_path) {
+        auto response = std::make_unique<net::test_server::BasicHttpResponse>();
+        response->set_code(net::HTTP_OK);
+        response->set_content(base::StringPrintf(
+            "<?xml version='1.0' encoding='UTF-8'?>\n"
+            "<gupdate xmlns='http://www.google.com/update2/response' "
+            "protocol='2.0'>\n"
+            "  <app appid='%s'>\n"
+            "    <updatecheck codebase='%s' version='%s' />\n"
+            "  </app>\n"
+            "</gupdate>",
+            test_extension.app_id,
+            test_server_->GetURL(test_extension.app_path).spec().c_str(),
+            test_extension.version));
+        response->set_content_type("text/xml");
+        return std::move(response);
+      }
+      if (url.path() == test_extension.app_path) {
+        base::FilePath test_data_dir;
+        base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
+        std::string contents;
+        base::ReadFileToString(
+            test_data_dir.AppendASCII(test_extension.crx_path), &contents);
+        auto response = std::make_unique<net::test_server::BasicHttpResponse>();
+        response->set_code(net::HTTP_OK);
+        response->set_content(contents);
+        return std::move(response);
+      }
     }
 
     return nullptr;
   }
 
   std::unique_ptr<base::ScopedPathOverride> external_externsions_overrides_;
-  std::unique_ptr<net::test_server::EmbeddedTestServer> test_server_;
   std::unique_ptr<ExtensionCacheFake> test_extension_cache_;
 
 #if defined(OS_CHROMEOS)
@@ -216,31 +252,20 @@
 }  // namespace
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-// https://crbug.com/1083959
-TEST_F(ExternalProviderImplTest, DISABLED_InAppPayments) {
+TEST_F(ExternalProviderImplTest, InAppPayments) {
   InitServiceWithExternalProviders();
 
-  base::RunLoop run_loop;
-  service_->set_external_updates_finished_callback_for_test(
-      run_loop.QuitWhenIdleClosure());
-  service_->CheckForExternalUpdates();
-  run_loop.Run();
+  AwaitCheckForExternalUpdates();
 
-  EXPECT_TRUE(registry()->GetInstalledExtension(
-      extension_misc::kInAppPaymentsSupportAppId));
-  EXPECT_TRUE(service_->IsExtensionEnabled(
-      extension_misc::kInAppPaymentsSupportAppId));
+  EXPECT_TRUE(registry()->GetInstalledExtension(kInAppPaymentsApp.app_id));
+  EXPECT_TRUE(service_->IsExtensionEnabled(kInAppPaymentsApp.app_id));
 }
 
 TEST_F(ExternalProviderImplTest, BlockedExternalUserProviders) {
   OverrideExternalExtensionsPath();
   InitServiceWithExternalProviders(true);
 
-  base::RunLoop run_loop;
-  service_->set_external_updates_finished_callback_for_test(
-      run_loop.QuitWhenIdleClosure());
-  service_->CheckForExternalUpdates();
-  run_loop.Run();
+  AwaitCheckForExternalUpdates();
 
   EXPECT_FALSE(registry()->GetInstalledExtension(kExternalAppId));
 }
@@ -249,14 +274,54 @@
   OverrideExternalExtensionsPath();
   InitServiceWithExternalProviders(false);
 
-  base::RunLoop run_loop;
-  service_->set_external_updates_finished_callback_for_test(
-      run_loop.QuitWhenIdleClosure());
-  service_->CheckForExternalUpdates();
-  run_loop.Run();
+  AwaitCheckForExternalUpdates();
 
   EXPECT_TRUE(registry()->GetInstalledExtension(kExternalAppId));
 }
 #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 
+TEST_F(ExternalProviderImplTest, WebAppMigrationFlag) {
+  InitService();
+
+  const std::string json = base::StringPrintf(
+      R"(
+        {
+          "%s": {
+            "external_update_url": "%s",
+            "web_app_migration_flag": "TestFeature"
+          }
+        }
+      )",
+      kGoodApp.app_id,
+      test_server_->GetURL(kGoodApp.update_path).spec().c_str());
+  service_->AddProviderForTesting(std::make_unique<ExternalProviderImpl>(
+      service_,
+      base::MakeRefCounted<ExternalTestingLoader>(
+          json, base::FilePath(FILE_PATH_LITERAL("//absolute/path"))),
+      profile_.get(), Manifest::EXTERNAL_PREF, Manifest::EXTERNAL_PREF_DOWNLOAD,
+      Extension::NO_FLAGS));
+
+  // App is not installed, we should not install if the flag is enabled.
+  {
+    base::AutoReset<bool> testing_scope =
+        web_app::SetExternalAppInstallFeatureAlwaysEnabledForTesting();
+    AwaitCheckForExternalUpdates();
+    EXPECT_FALSE(registry()->GetInstalledExtension(kGoodApp.app_id));
+  }
+
+  // Disable the flag to install the app.
+  {
+    AwaitCheckForExternalUpdates();
+    EXPECT_TRUE(registry()->GetInstalledExtension(kGoodApp.app_id));
+  }
+
+  // App is now installed, we should not uninstall if the flag is enabled.
+  {
+    base::AutoReset<bool> testing_scope =
+        web_app::SetExternalAppInstallFeatureAlwaysEnabledForTesting();
+    AwaitCheckForExternalUpdates();
+    EXPECT_TRUE(registry()->GetInstalledExtension(kGoodApp.app_id));
+  }
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/external_testing_loader.cc b/chrome/browser/extensions/external_testing_loader.cc
new file mode 100644
index 0000000..ae4c35ec
--- /dev/null
+++ b/chrome/browser/extensions/external_testing_loader.cc
@@ -0,0 +1,36 @@
+// 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/extensions/external_testing_loader.h"
+
+#include "base/json/json_string_value_serializer.h"
+#include "base/values.h"
+#include "chrome/browser/extensions/external_pref_loader.h"
+#include "content/public/browser/browser_thread.h"
+
+namespace extensions {
+
+ExternalTestingLoader::ExternalTestingLoader(
+    const std::string& json_data,
+    const base::FilePath& fake_base_path)
+    : fake_base_path_(fake_base_path) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  JSONStringValueDeserializer deserializer(json_data);
+  base::FilePath fake_json_path = fake_base_path.AppendASCII("fake.json");
+  testing_prefs_ =
+      ExternalPrefLoader::ExtractExtensionPrefs(&deserializer, fake_json_path);
+}
+
+const base::FilePath ExternalTestingLoader::GetBaseCrxFilePath() {
+  return fake_base_path_;
+}
+
+void ExternalTestingLoader::StartLoading() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  LoadFinished(testing_prefs_->CreateDeepCopy());
+}
+
+ExternalTestingLoader::~ExternalTestingLoader() = default;
+
+}  // namespace extensions
diff --git a/chrome/browser/extensions/external_testing_loader.h b/chrome/browser/extensions/external_testing_loader.h
new file mode 100644
index 0000000..d7093ca
--- /dev/null
+++ b/chrome/browser/extensions/external_testing_loader.h
@@ -0,0 +1,45 @@
+// 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_EXTENSIONS_EXTERNAL_TESTING_LOADER_H_
+#define CHROME_BROWSER_EXTENSIONS_EXTERNAL_TESTING_LOADER_H_
+
+#include <memory>
+
+#include "base/files/file_path.h"
+#include "base/memory/ref_counted.h"
+#include "chrome/browser/extensions/external_loader.h"
+
+namespace base {
+class DictionaryValue;
+}
+
+namespace extensions {
+
+// A simplified version of ExternalPrefLoader that loads the dictionary
+// from json data specified in a string.
+class ExternalTestingLoader : public ExternalLoader {
+ public:
+  ExternalTestingLoader(const std::string& json_data,
+                        const base::FilePath& fake_base_path);
+  ExternalTestingLoader(const ExternalTestingLoader&) = delete;
+  ExternalTestingLoader& operator=(const ExternalTestingLoader&) = delete;
+
+  // ExternalLoader:
+  const base::FilePath GetBaseCrxFilePath() override;
+
+  void StartLoading() override;
+
+ private:
+  friend class base::RefCountedThreadSafe<ExternalLoader>;
+
+  ~ExternalTestingLoader() override;
+
+  base::FilePath fake_base_path_;
+  std::unique_ptr<base::DictionaryValue> testing_prefs_;
+};
+
+}  // namespace extensions
+
+#endif  // CHROME_BROWSER_EXTENSIONS_EXTERNAL_TESTING_LOADER_H_
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 5711b2ec..202bf00f 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1203,6 +1203,11 @@
     "expiry_milestone": 87
   },
   {
+    "name": "enable-autofill-password-reauth-ios",
+    "owners": [ "javierrobles", "bling-flags" ],
+    "expiry_milestone": 90
+  },
+  {
     "name": "enable-autofill-refresh-style",
     "owners": [ "tmartino@chromium.org" ],
     "expiry_milestone": 78
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 7c8cc58..0492393 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -3954,10 +3954,6 @@
 const char kGaiaActionButtonsDescription[] =
     "Enable primary/secondary action button on Gaia login screen.";
 
-const char kHelpAppName[] = "Help App";
-const char kHelpAppDescription[] =
-    "Enables the chrome://help-app System Web App (SWA)";
-
 const char kHelpAppReleaseNotesName[] = "Help App Release Notes";
 const char kHelpAppReleaseNotesDescription[] =
     "Enables release notes in the help app";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 03e8ff1..43b84ee 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -2298,9 +2298,6 @@
 extern const char kGaiaActionButtonsName[];
 extern const char kGaiaActionButtonsDescription[];
 
-extern const char kHelpAppName[];
-extern const char kHelpAppDescription[];
-
 extern const char kHelpAppReleaseNotesName[];
 extern const char kHelpAppReleaseNotesDescription[];
 
diff --git a/chrome/browser/geolocation/geolocation_system_permission_mac.h b/chrome/browser/geolocation/geolocation_system_permission_mac.h
deleted file mode 100644
index 62db6fc5..0000000
--- a/chrome/browser/geolocation/geolocation_system_permission_mac.h
+++ /dev/null
@@ -1,27 +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_GEOLOCATION_GEOLOCATION_SYSTEM_PERMISSION_MAC_H_
-#define CHROME_BROWSER_GEOLOCATION_GEOLOCATION_SYSTEM_PERMISSION_MAC_H_
-
-#import <memory>
-
-// System permission state.
-enum class SystemPermissionStatus {
-  kNotDetermined = 0,
-  kDenied = 1,
-  kAllowed = 2,
-  kMaxValue = kAllowed
-};
-
-// This class is owned by the browser process and keeps track of the macOS
-// location permissions for the browser.
-class GeolocationSystemPermissionManager {
- public:
-  virtual ~GeolocationSystemPermissionManager();
-  static std::unique_ptr<GeolocationSystemPermissionManager> Create();
-  virtual SystemPermissionStatus GetSystemPermission() = 0;
-};
-
-#endif  // CHROME_BROWSER_GEOLOCATION_GEOLOCATION_SYSTEM_PERMISSION_MAC_H_
\ No newline at end of file
diff --git a/chrome/browser/geolocation/geolocation_system_permission_mac.mm b/chrome/browser/geolocation/geolocation_system_permission_mac.mm
deleted file mode 100644
index 10575531..0000000
--- a/chrome/browser/geolocation/geolocation_system_permission_mac.mm
+++ /dev/null
@@ -1,115 +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.
-
-#import <CoreLocation/CoreLocation.h>
-
-#include "base/mac/scoped_nsobject.h"
-#include "chrome/browser/geolocation/geolocation_system_permission_mac.h"
-#include "chrome/browser/ui/browser_list.h"
-#include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/ui/location_bar/location_bar.h"
-
-class SystemGeolocationPermissionsManagerImpl;
-
-@interface SystemGeolocationPermissionsDelegate
-    : NSObject <CLLocationManagerDelegate> {
-  bool _permissionReceived;
-  bool _hasPermission;
-  base::WeakPtr<SystemGeolocationPermissionsManagerImpl> _manager;
-}
-
-- (id)initWithManager:
-    (base::WeakPtr<SystemGeolocationPermissionsManagerImpl>)manager;
-
-// CLLocationManagerDelegate
-- (void)locationManager:(CLLocationManager*)manager
-    didChangeAuthorizationStatus:(CLAuthorizationStatus)status;
-- (bool)hasPermission;
-- (bool)permissionReceived;
-@end
-
-class SystemGeolocationPermissionsManagerImpl
-    : public GeolocationSystemPermissionManager {
- public:
-  SystemGeolocationPermissionsManagerImpl() {
-    location_manager_.reset([[CLLocationManager alloc] init]);
-    delegate_.reset([[SystemGeolocationPermissionsDelegate alloc]
-        initWithManager:weak_ptr_factory_.GetWeakPtr()]);
-    location_manager_.get().delegate = delegate_;
-  }
-
-  ~SystemGeolocationPermissionsManagerImpl() override = default;
-
-  void PermissionUpdated() {
-    for (Browser* browser : *BrowserList::GetInstance()) {
-      LocationBar* location_bar = browser->window()->GetLocationBar();
-      if (location_bar)
-        location_bar->UpdateContentSettingsIcons();
-    }
-  }
-
-  SystemPermissionStatus GetSystemPermission() override {
-    if (![delegate_ permissionReceived])
-      return SystemPermissionStatus::kNotDetermined;
-
-    if ([delegate_ hasPermission])
-      return SystemPermissionStatus::kAllowed;
-
-    return SystemPermissionStatus::kDenied;
-  }
-
- private:
-  base::scoped_nsobject<SystemGeolocationPermissionsDelegate> delegate_;
-  base::scoped_nsobject<CLLocationManager> location_manager_;
-  base::WeakPtrFactory<SystemGeolocationPermissionsManagerImpl>
-      weak_ptr_factory_{this};
-};
-
-// static
-std::unique_ptr<GeolocationSystemPermissionManager>
-GeolocationSystemPermissionManager::Create() {
-  return std::make_unique<SystemGeolocationPermissionsManagerImpl>();
-}
-
-GeolocationSystemPermissionManager::~GeolocationSystemPermissionManager() =
-    default;
-
-@implementation SystemGeolocationPermissionsDelegate
-
-- (id)initWithManager:
-    (base::WeakPtr<SystemGeolocationPermissionsManagerImpl>)Manager {
-  if (self = [super init]) {
-    _permissionReceived = false;
-    _hasPermission = false;
-    _manager = Manager;
-  }
-  return self;
-}
-
-- (void)locationManager:(CLLocationManager*)manager
-    didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
-  _permissionReceived = true;
-  if (@available(macOS 10.12.0, *)) {
-    if (status == kCLAuthorizationStatusAuthorizedAlways)
-      _hasPermission = true;
-    else
-      _hasPermission = false;
-  } else {
-    if (status == kCLAuthorizationStatusAuthorized)
-      _hasPermission = true;
-    else
-      _hasPermission = false;
-  }
-  _manager->PermissionUpdated();
-}
-
-- (bool)hasPermission {
-  return _hasPermission;
-}
-
-- (bool)permissionReceived {
-  return _permissionReceived;
-}
-
-@end
\ No newline at end of file
diff --git a/chrome/browser/lifetime/browser_close_manager_browsertest.cc b/chrome/browser/lifetime/browser_close_manager_browsertest.cc
index c10a04d..4d32ce3 100644
--- a/chrome/browser/lifetime/browser_close_manager_browsertest.cc
+++ b/chrome/browser/lifetime/browser_close_manager_browsertest.cc
@@ -767,7 +767,7 @@
   // This page has beforeunload handler already.
   EXPECT_TRUE(browser2->tab_strip_model()
                   ->GetWebContentsAt(0)
-                  ->NeedToFireBeforeUnloadOrUnload());
+                  ->NeedToFireBeforeUnloadOrUnloadEvents());
   // This page doesn't have beforeunload handler. Yet.
   ui_test_utils::NavigateToURLWithDisposition(
       browser2, embedded_test_server()->GetURL("/title2.html"),
@@ -777,7 +777,7 @@
       browser2->tab_strip_model()->GetWebContentsAt(1)));
   EXPECT_FALSE(browser2->tab_strip_model()
                    ->GetWebContentsAt(1)
-                   ->NeedToFireBeforeUnloadOrUnload());
+                   ->NeedToFireBeforeUnloadOrUnloadEvents());
   EXPECT_EQ(2, browser2->tab_strip_model()->count());
 
   PrepareForDialog(browser2);
@@ -800,7 +800,7 @@
       "function(event) { event.returnValue = 'Foo'; });"));
   EXPECT_TRUE(browser2->tab_strip_model()
                   ->GetWebContentsAt(1)
-                  ->NeedToFireBeforeUnloadOrUnload());
+                  ->NeedToFireBeforeUnloadOrUnloadEvents());
   // Accept closing the first tab.
   ASSERT_NO_FATAL_FAILURE(AcceptClose());
   // Just to be sure accepting a dialog doesn't have asynchronous tasks
diff --git a/chrome/browser/lookalikes/lookalike_url_navigation_throttle.cc b/chrome/browser/lookalikes/lookalike_url_navigation_throttle.cc
index 2f4db69..fcf2f6a 100644
--- a/chrome/browser/lookalikes/lookalike_url_navigation_throttle.cc
+++ b/chrome/browser/lookalikes/lookalike_url_navigation_throttle.cc
@@ -23,13 +23,13 @@
 #include "chrome/browser/lookalikes/lookalike_url_service.h"
 #include "chrome/browser/lookalikes/lookalike_url_tab_storage.h"
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/reputation/safety_tips_config.h"
 #include "chrome/common/chrome_features.h"
 #include "components/lookalikes/core/features.h"
 #include "components/lookalikes/core/lookalike_url_ui_util.h"
 #include "components/lookalikes/core/lookalike_url_util.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "components/security_interstitials/content/security_interstitial_tab_helper.h"
 #include "components/ukm/content/source_url_recorder.h"
 #include "components/url_formatter/spoof_checks/top_domains/top500_domains.h"
diff --git a/chrome/browser/media/media_engagement_browsertest.cc b/chrome/browser/media/media_engagement_browsertest.cc
index 6906af0..b0cc20c 100644
--- a/chrome/browser/media/media_engagement_browsertest.cc
+++ b/chrome/browser/media/media_engagement_browsertest.cc
@@ -18,8 +18,6 @@
 #include "chrome/browser/media/media_engagement_preloaded_list.h"
 #include "chrome/browser/media/media_engagement_service.h"
 #include "chrome/browser/prefs/session_startup_pref.h"
-#include "chrome/browser/prerender/prerender_handle.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/prerender/prerender_test_utils.h"
 #include "chrome/browser/profiles/profile.h"
@@ -35,6 +33,8 @@
 #include "components/component_updater/component_updater_service.h"
 #include "components/keep_alive_registry/keep_alive_types.h"
 #include "components/keep_alive_registry/scoped_keep_alive.h"
+#include "components/prerender/browser/prerender_handle.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/prerender/common/prerender_final_status.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/test/browser_test.h"
diff --git a/chrome/browser/media/media_engagement_service.cc b/chrome/browser/media/media_engagement_service.cc
index bf12369..a12ae5a5 100644
--- a/chrome/browser/media/media_engagement_service.cc
+++ b/chrome/browser/media/media_engagement_service.cc
@@ -16,13 +16,13 @@
 #include "chrome/browser/media/media_engagement_score.h"
 #include "chrome/browser/media/media_engagement_service_factory.h"
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/content_settings/core/common/content_settings.h"
 #include "components/history/core/browser/history_service.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "content/public/browser/web_contents.h"
 #include "media/base/media_switches.h"
 #include "url/origin.h"
diff --git a/chrome/browser/navigation_predictor/navigation_predictor.cc b/chrome/browser/navigation_predictor/navigation_predictor.cc
index 495bb165..c532ddf4 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor.cc
+++ b/chrome/browser/navigation_predictor/navigation_predictor.cc
@@ -17,10 +17,10 @@
 #include "base/system/sys_info.h"
 #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service.h"
 #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service_factory.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/search_engines/template_url_service.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/site_instance.h"
diff --git a/chrome/browser/navigation_predictor/navigation_predictor.h b/chrome/browser/navigation_predictor/navigation_predictor.h
index f286fae4..ca9c196 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor.h
+++ b/chrome/browser/navigation_predictor/navigation_predictor.h
@@ -15,7 +15,7 @@
 #include "base/optional.h"
 #include "base/sequence_checker.h"
 #include "base/time/time.h"
-#include "chrome/browser/prerender/prerender_handle.h"
+#include "components/prerender/browser/prerender_handle.h"
 #include "content/public/browser/visibility.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
diff --git a/chrome/browser/navigation_predictor/navigation_predictor_browsertest.cc b/chrome/browser/navigation_predictor/navigation_predictor_browsertest.cc
index 9963bca..cdbb03c 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor_browsertest.cc
+++ b/chrome/browser/navigation_predictor/navigation_predictor_browsertest.cc
@@ -11,7 +11,6 @@
 #include "chrome/browser/navigation_predictor/navigation_predictor.h"
 #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service.h"
 #include "chrome/browser/navigation_predictor/navigation_predictor_keyed_service_factory.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/browser/subresource_filter/subresource_filter_browser_test_harness.h"
@@ -21,6 +20,7 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/search_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "content/public/test/browser_test.h"
diff --git a/chrome/browser/net/net_export_helper.cc b/chrome/browser/net/net_export_helper.cc
index e86c3aa..d3b42a60 100644
--- a/chrome/browser/net/net_export_helper.cc
+++ b/chrome/browser/net/net_export_helper.cc
@@ -5,9 +5,9 @@
 #include "chrome/browser/net/net_export_helper.h"
 
 #include "base/values.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "extensions/buildflags/buildflags.h"
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.cc
index ab8ce73..6e3a91f 100644
--- a/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.cc
+++ b/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.cc
@@ -13,7 +13,6 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/content_settings/cookie_settings_factory.h"
 #include "chrome/browser/engagement/site_engagement_service.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
@@ -27,6 +26,7 @@
 #include "components/page_load_metrics/browser/page_load_metrics_util.h"
 #include "components/page_load_metrics/browser/protocol_util.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/prerender/common/prerender_final_status.h"
 #include "components/prerender/common/prerender_origin.h"
 #include "components/search_engines/template_url_service.h"
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
index 6943d0a..2b3200a9 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_browsertest.cc
@@ -31,8 +31,6 @@
 #include "chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/page_load_metrics_initialize.h"
 #include "chrome/browser/prefs/session_startup_pref.h"
-#include "chrome/browser/prerender/prerender_handle.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/prerender/prerender_test_utils.h"
 #include "chrome/browser/profiles/profile.h"
@@ -59,7 +57,9 @@
 #include "components/page_load_metrics/browser/page_load_metrics_test_waiter.h"
 #include "components/page_load_metrics/browser/page_load_tracker.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_handle.h"
 #include "components/prerender/browser/prerender_histograms.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/prerender/common/prerender_origin.h"
 #include "components/sessions/content/content_test_helper.h"
 #include "components/sessions/core/serialized_navigation_entry.h"
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc b/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
index b435bc67..3b123e9 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
@@ -39,12 +39,12 @@
 #include "chrome/browser/page_load_metrics/observers/third_party_metrics_observer.h"
 #include "chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.h"
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search/search.h"
 #include "components/page_load_metrics/browser/metrics_web_contents_observer.h"
 #include "components/page_load_metrics/browser/page_load_metrics_embedder_base.h"
 #include "components/page_load_metrics/browser/page_load_tracker.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "components/rappor/rappor_service_impl.h"
 #include "content/public/browser/web_contents.h"
 #include "extensions/buildflags/buildflags.h"
diff --git a/chrome/browser/password_check/android/BUILD.gn b/chrome/browser/password_check/android/BUILD.gn
index 683dce8e..a2fe649 100644
--- a/chrome/browser/password_check/android/BUILD.gn
+++ b/chrome/browser/password_check/android/BUILD.gn
@@ -71,12 +71,15 @@
 
   deps = [
     ":public_ui_java",
+    "internal:internal_factory_java",
     "internal:internal_java",
     "internal:public_ui_factory_java",
     "//base:base_java",
     "//base:base_junit_test_support",
+    "//chrome/browser/flags:java",
     "//chrome/browser/password_check/android:password_check_java_enums",
     "//chrome/browser/password_check/android:public_java",
+    "//chrome/test/android:chrome_java_test_support",
     "//third_party/hamcrest:hamcrest_java",
     "//third_party/junit",
     "//ui/android:ui_full_java",
diff --git a/chrome/browser/password_check/android/internal/java/res/layout/password_check_compromised_credential_with_script_item.xml b/chrome/browser/password_check/android/internal/java/res/layout/password_check_compromised_credential_with_script_item.xml
index 4982258..de7fb8e 100644
--- a/chrome/browser/password_check/android/internal/java/res/layout/password_check_compromised_credential_with_script_item.xml
+++ b/chrome/browser/password_check/android/internal/java/res/layout/password_check_compromised_credential_with_script_item.xml
@@ -46,7 +46,7 @@
             android:layout_marginTop="@dimen/compromised_credential_row_button_margin_top"
             android:layout_height="wrap_content"
             android:layout_width="wrap_content"
-            android:text="@string/password_check_credential_row_change_button_with_script_caption"
+            android:text="@string/password_check_credential_row_change_button_caption"
             android:drawablePadding="3dp"
             android:drawableStart="@drawable/ic_autofill_assistant_white_24dp"
             style="@style/FilledButton.Flat" />
@@ -64,7 +64,7 @@
             android:layout_marginTop="@dimen/compromised_credential_row_button_margin_top"
             android:layout_height="wrap_content"
             android:layout_width="wrap_content"
-            android:text="@string/password_check_credential_row_change_button_caption"
+            android:text="@string/password_check_credential_row_change_manually_button_caption"
             style="@style/TextButton"/>
 
     </LinearLayout>
diff --git a/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckBridge.java b/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckBridge.java
index 965dbb2..4fa763d 100644
--- a/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckBridge.java
+++ b/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckBridge.java
@@ -24,8 +24,10 @@
          * @param originUrl Origin of the compromised credential.
          * @param username Username for the compromised credential.
          * @param password Password of the compromised credential.
+         * @param hasScript True iff a script can be applied to the compromised credential.
          */
-        void onCompromisedCredentialFound(String originUrl, String username, String password);
+        void onCompromisedCredentialFound(
+                String originUrl, String username, String password, boolean hasScript);
 
         /**
          * Called when the compromised credentials found in a previous check are read from disk.
@@ -54,8 +56,10 @@
     }
 
     // TODO(crbug.com/1102025): Add call from native.
-    void onCompromisedCredentialFound(String originUrl, String username, String password) {
-        mPasswordCheckObserver.onCompromisedCredentialFound(originUrl, username, password);
+    void onCompromisedCredentialFound(
+            String originUrl, String username, String password, boolean hasScript) {
+        mPasswordCheckObserver.onCompromisedCredentialFound(
+                originUrl, username, password, hasScript);
     }
 
     // TODO(crbug.com/1102025): Add call from native.
diff --git a/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckCoordinator.java b/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckCoordinator.java
index e78deaf..2267c28 100644
--- a/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckCoordinator.java
+++ b/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckCoordinator.java
@@ -22,6 +22,7 @@
  */
 class PasswordCheckCoordinator implements PasswordCheckComponentUi, LifecycleObserver {
     private final PasswordCheckFragmentView mFragmentView;
+    private final PasswordCheckMediator mMediator = new PasswordCheckMediator();
     private PropertyModel mModel;
 
     /**
@@ -60,9 +61,8 @@
         // In the rare case of a restarted activity, don't recreate the model and mediator.
         if (mModel == null) {
             mModel = PasswordCheckProperties.createDefaultModel();
-            PasswordCheckMediator mediator = new PasswordCheckMediator();
             PasswordCheckCoordinator.setUpModelChangeProcessors(mModel, mFragmentView);
-            mediator.initialize(mModel, PasswordCheckFactory.getOrCreate());
+            mMediator.initialize(mModel, PasswordCheckFactory.getOrCreate());
         }
     }
 
@@ -81,6 +81,7 @@
 
     @Override
     public void destroy() {
+        mMediator.destroy();
         PasswordCheckFactory.destroy();
     }
 
diff --git a/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckImpl.java b/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckImpl.java
index 779a9e8d..bb0bff04 100644
--- a/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckImpl.java
+++ b/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckImpl.java
@@ -44,8 +44,11 @@
     }
 
     @Override
-    public void onCompromisedCredentialFound(String originUrl, String username, String password) {
-        // TODO(crbug.com/1106726): Broadcast to registered observers.
+    public void onCompromisedCredentialFound(
+            String originUrl, String username, String password, boolean hasScript) {
+        for (Observer obs : mObserverList) {
+            obs.onCompromisedCredentialFound(originUrl, username, password, hasScript);
+        }
     }
 
     @Override
@@ -98,6 +101,14 @@
     }
 
     @Override
+    public CompromisedCredential[] getCompromisedCredentials() {
+        CompromisedCredential[] credentials =
+                new CompromisedCredential[getCompromisedCredentialsCount()];
+        mPasswordCheckBridge.getCompromisedCredentials(credentials);
+        return credentials;
+    }
+
+    @Override
     public int getSavedPasswordsCount() {
         return mPasswordCheckBridge.getSavedPasswordsCount();
     }
diff --git a/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckMediator.java b/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckMediator.java
index fe63908b3..0c56a0d 100644
--- a/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckMediator.java
+++ b/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckMediator.java
@@ -13,25 +13,31 @@
 import org.chromium.ui.modelutil.MVCListAdapter.ListItem;
 import org.chromium.ui.modelutil.PropertyModel;
 
-import java.util.List;
-
 /**
  * Contains the logic for the PasswordCheck component. It sets the state of the model and reacts to
  * events like clicks.
  */
-class PasswordCheckMediator implements PasswordCheckCoordinator.CredentialEventHandler {
+class PasswordCheckMediator
+        implements PasswordCheckCoordinator.CredentialEventHandler, PasswordCheck.Observer {
     private PropertyModel mModel;
     private PasswordCheckComponentUi.Delegate mDelegate;
 
     void initialize(PropertyModel model, PasswordCheckComponentUi.Delegate delegate) {
         mModel = model;
         mDelegate = delegate;
+        getPasswordCheck().addObserver(this, true);
     }
 
-    void onCompromisedCredentialsAvailable(List<CompromisedCredential> credentials) {
+    void destroy() {
+        getPasswordCheck().removeObserver(this);
+    }
+
+    @Override
+    public void onCompromisedCredentialsFetchCompleted() {
+        CompromisedCredential[] credentials = getPasswordCheck().getCompromisedCredentials();
         assert credentials != null;
         ListModel<ListItem> items = mModel.get(ITEMS);
-        assert items.size() == 1;
+        assert items.size() >= 1 : "Needs to initialize list with header before adding items!";
 
         for (CompromisedCredential credential : credentials) {
             items.add(new ListItem(credential.hasScript()
@@ -46,7 +52,11 @@
         }
     }
 
-    void onPasswordCheckStatusChanged(@PasswordCheckUIStatus int status) {
+    @Override
+    public void onSavedPasswordsFetchCompleted() {}
+
+    @Override
+    public void onPasswordCheckStatusChanged(@PasswordCheckUIStatus int status) {
         ListModel<ListItem> items = mModel.get(ITEMS);
         if (items.size() == 0) {
             items.add(new ListItem(PasswordCheckProperties.ItemType.HEADER,
@@ -59,6 +69,27 @@
     }
 
     @Override
+    public void onCompromisedCredentialFound(
+            String originUrl, String username, String password, boolean hasScript) {
+        assert originUrl != null;
+        assert username != null;
+        assert password != null;
+        ListModel<ListItem> items = mModel.get(ITEMS);
+        assert items.size() >= 1 : "Needs to initialize list with header before adding items!";
+
+        CompromisedCredential credential =
+                new CompromisedCredential(originUrl, username, password, false, hasScript);
+        items.add(new ListItem(credential.hasScript()
+                        ? PasswordCheckProperties.ItemType.COMPROMISED_CREDENTIAL_WITH_SCRIPT
+                        : PasswordCheckProperties.ItemType.COMPROMISED_CREDENTIAL,
+                new PropertyModel
+                        .Builder(PasswordCheckProperties.CompromisedCredentialProperties.ALL_KEYS)
+                        .with(COMPROMISED_CREDENTIAL, credential)
+                        .with(CREDENTIAL_HANDLER, this)
+                        .build()));
+    }
+
+    @Override
     public void onRemove(CompromisedCredential credential) {
         mDelegate.removeCredential(credential);
     }
@@ -72,4 +103,10 @@
     public void onChangePasswordWithScriptButtonClick(CompromisedCredential credential) {
         // TODO(crbug.com/1086109): Implement the action for the button.
     }
+
+    private PasswordCheck getPasswordCheck() {
+        PasswordCheck passwordCheck = PasswordCheckFactory.getOrCreate();
+        assert passwordCheck != null : "Password Check UI component needs native counterpart!";
+        return passwordCheck;
+    }
 }
diff --git a/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings.grd b/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings.grd
index a5a305e..2e1364f4 100644
--- a/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings.grd
+++ b/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings.grd
@@ -172,11 +172,11 @@
   <release allow_pseudo="false" seq="1">
     <messages fallback_to_english="true">
       <!-- Password Check -->
-      <message name="IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_BUTTON_CAPTION" desc="Caption for the button that links to a site where the user can change a compromised credential.">
+      <message name="IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_BUTTON_CAPTION" desc="Caption for the primary button in the list of compromised credentials.">
         Change password
       </message>
-      <message name="IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_BUTTON_WITH_SCRIPT_CAPTION" desc="Caption for the button that starts a script that changes a compromised credential.">
-        Change password automatically
+      <message name="IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_MANUALLY_BUTTON_CAPTION" desc="Caption for the secondary button in the list of compromised credentials.">
+        Change manually
       </message>
       <message name="IDS_PASSWORD_CHECK_CREDENTIAL_ROW_REASON_LEAKED" desc="Small description explaining that a credential is compromised because it was part of a data breach.">
         Found in data breach
diff --git a/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings_grd/IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_BUTTON_CAPTION.png.sha1 b/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings_grd/IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_BUTTON_CAPTION.png.sha1
index 32e161a4..9b21525 100644
--- a/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings_grd/IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_BUTTON_CAPTION.png.sha1
+++ b/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings_grd/IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_BUTTON_CAPTION.png.sha1
@@ -1 +1 @@
-662ab4bd4aec81ac0ef54848efad843452a0a601
\ No newline at end of file
+df1bef149012e65d706ee2324b4dbf0ae78eb74c
\ No newline at end of file
diff --git a/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings_grd/IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_BUTTON_WITH_SCRIPT_CAPTION.png.sha1 b/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings_grd/IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_BUTTON_WITH_SCRIPT_CAPTION.png.sha1
deleted file mode 100644
index 353e7a92..0000000
--- a/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings_grd/IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_BUTTON_WITH_SCRIPT_CAPTION.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-68c54c7c1d83797946c4652935284033a9ed10be
\ No newline at end of file
diff --git a/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings_grd/IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_MANUALLY_BUTTON_CAPTION.png.sha1 b/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings_grd/IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_MANUALLY_BUTTON_CAPTION.png.sha1
new file mode 100644
index 0000000..9b21525
--- /dev/null
+++ b/chrome/browser/password_check/android/internal/java/strings/android_password_check_strings_grd/IDS_PASSWORD_CHECK_CREDENTIAL_ROW_CHANGE_MANUALLY_BUTTON_CAPTION.png.sha1
@@ -0,0 +1 @@
+df1bef149012e65d706ee2324b4dbf0ae78eb74c
\ No newline at end of file
diff --git a/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/CompromisedCredential.java b/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/CompromisedCredential.java
index b23793b..0b0e060 100644
--- a/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/CompromisedCredential.java
+++ b/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/CompromisedCredential.java
@@ -58,6 +58,14 @@
     }
 
     @Override
+    public String toString() {
+        return "CompromisedCredential{"
+                + "username='" + mUsername + '\'' + ", password='" + mPassword + '\''
+                + ", originUrl='" + mOriginUrl + '\'' + ", phished=" + mPhished
+                + ", hasScript=" + mHasScript + '}';
+    }
+
+    @Override
     public int hashCode() {
         return Objects.hash(mUsername, mPassword, mOriginUrl, mPhished, mHasScript);
     }
diff --git a/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/PasswordCheck.java b/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/PasswordCheck.java
index b1c3bda..cd23530 100644
--- a/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/PasswordCheck.java
+++ b/chrome/browser/password_check/android/java/src/org/chromium/chrome/browser/password_check/PasswordCheck.java
@@ -16,21 +16,31 @@
     interface Observer {
         /**
          * Gets invoked when the compromised credentials are fetched from the disk.
-         * After this call, {@link getCompromisedCredentialsCount} returns a valid value.
+         * After this call, {@link #getCompromisedCredentialsCount} returns a valid value.
          */
         void onCompromisedCredentialsFetchCompleted();
 
         /**
          * Gets invoked when the saved passwords are fetched from the disk.
-         * After this call, {@link getSavedPasswordsCount} returns a valid value.
+         * After this call, {@link #getSavedPasswordsCount} returns a valid value.
          */
         void onSavedPasswordsFetchCompleted();
 
         /**
          * Gets invoked once the password check stops running.
-         * @param status A {@link CheckStatus} enum value.
+         * @param status A {@link PasswordCheckUIStatus} enum value.
          */
         void onPasswordCheckStatusChanged(@PasswordCheckUIStatus int status);
+
+        /**
+         * Invoked whenever a running check finds another compromised credential.
+         * @param originUrl The origin of the newly found compromised credential.
+         * @param username The username of the newly found compromised credential.
+         * @param password The password of the newly found compromised credential.
+         * @param hasScript True iff a script can be applied to the newly found credential.
+         */
+        void onCompromisedCredentialFound(
+                String originUrl, String username, String password, boolean hasScript);
     }
 
     /**
@@ -48,9 +58,9 @@
     /**
      * Adds a new observer to the list of observers
      * @param obs An {@link Observer} implementation instance.
-     * @param callImmediatelyIfReady Invokes {@link onCompromisedCredentialsFetchCompleted} and
-     *   {@link onSavedPasswordsFetchCompleted} on the observer if the corresponding data is already
-     *   fetched when this is true.
+     * @param callImmediatelyIfReady Invokes {@link Observer#onCompromisedCredentialsFetchCompleted}
+     *   and {@link Observer#onSavedPasswordsFetchCompleted} on the observer if the corresponding
+     *   data is already fetched when this is true.
      */
     void addObserver(Observer obs, boolean callImmediatelyIfReady);
 
@@ -62,13 +72,21 @@
 
     /**
      * @return The latest available number of compromised passwords. If this is invoked before
-     * {@link onCompromisedCredentialsFetchCompleted}, the returned value is likely invalid.
+     * {@link Observer#onCompromisedCredentialsFetchCompleted}, the returned value is likely
+     * invalid.
      */
     int getCompromisedCredentialsCount();
 
     /**
+     * @return The latest available compromised passwords. If this is invoked before
+     * {@link Observer#onCompromisedCredentialsFetchCompleted}, the returned array is likely
+     * incomplete.
+     */
+    CompromisedCredential[] getCompromisedCredentials();
+
+    /**
      * @return The latest available number of all saved passwords. If this is invoked before
-     * {@link onSavedPasswordsFetchCompleted}, the returned value is likely invalid.
+     * {@link Observer#onSavedPasswordsFetchCompleted}, the returned value is likely invalid.
      */
     int getSavedPasswordsCount();
 
diff --git a/chrome/browser/password_check/android/javatests/src/org/chromium/chrome/browser/password_check/PasswordCheckViewTest.java b/chrome/browser/password_check/android/javatests/src/org/chromium/chrome/browser/password_check/PasswordCheckViewTest.java
index f75fd9f6..41fbac1 100644
--- a/chrome/browser/password_check/android/javatests/src/org/chromium/chrome/browser/password_check/PasswordCheckViewTest.java
+++ b/chrome/browser/password_check/android/javatests/src/org/chromium/chrome/browser/password_check/PasswordCheckViewTest.java
@@ -174,8 +174,7 @@
         // Change button with script.
         assertNotNull(getCredentialChangeButtonWithScriptAt(0));
         assertThat(getCredentialChangeButtonWithScriptAt(0).getText(),
-                is(getString(
-                        R.string.password_check_credential_row_change_button_with_script_caption)));
+                is(getString(R.string.password_check_credential_row_change_button_caption)));
 
         // Explanation for change button with script.
         assertNotNull(getCredentialChangeButtonWithScriptExplanationAt(0));
@@ -185,7 +184,8 @@
         // Change button without script.
         assertNotNull(getCredentialChangeButtonAt(0));
         assertThat(getCredentialChangeButtonAt(0).getText(),
-                is(getString(R.string.password_check_credential_row_change_button_caption)));
+                is(getString(
+                        R.string.password_check_credential_row_change_manually_button_caption)));
     }
 
     @Test
diff --git a/chrome/browser/password_check/android/junit/src/org/chromium/chrome/browser/password_check/PasswordCheckControllerTest.java b/chrome/browser/password_check/android/junit/src/org/chromium/chrome/browser/password_check/PasswordCheckControllerTest.java
index 4e3749c..661e66da 100644
--- a/chrome/browser/password_check/android/junit/src/org/chromium/chrome/browser/password_check/PasswordCheckControllerTest.java
+++ b/chrome/browser/password_check/android/junit/src/org/chromium/chrome/browser/password_check/PasswordCheckControllerTest.java
@@ -4,11 +4,13 @@
 
 package org.chromium.chrome.browser.password_check;
 
+import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import static org.chromium.chrome.browser.password_check.PasswordCheckProperties.CompromisedCredentialProperties.COMPROMISED_CREDENTIAL;
 import static org.chromium.chrome.browser.password_check.PasswordCheckProperties.CompromisedCredentialProperties.CREDENTIAL_HANDLER;
@@ -17,57 +19,102 @@
 import static org.chromium.chrome.browser.password_check.PasswordCheckUIStatus.IDLE;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.password_check.PasswordCheckProperties.ItemType;
+import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.ui.modelutil.ListModel;
 import org.chromium.ui.modelutil.MVCListAdapter;
 import org.chromium.ui.modelutil.PropertyModel;
 
-import java.util.Collections;
-
 /**
  * Controller tests verify that the PasswordCheck controller modifies the model if the API is used
  * properly.
  */
 @RunWith(BaseRobolectricTestRunner.class)
+@EnableFeatures(ChromeFeatureList.PASSWORD_CHECK)
 public class PasswordCheckControllerTest {
     private static final CompromisedCredential ANA =
             new CompromisedCredential("https://m.a.xyz/", "Ana", "password", false, false);
     private static final CompromisedCredential BOB =
-            new CompromisedCredential("https://www.b.ch/", "Baub", "DoneSth", true, false);
+            new CompromisedCredential("https://www.b.ch/", "Baub", "DoneSth", false, true);
+
+    @Rule
+    public TestRule mFeaturesProcessorRule = new Features.JUnitProcessor();
 
     @Mock
     private PasswordCheckComponentUi.Delegate mDelegate;
+    @Mock
+    private PasswordCheck mPasswordCheck;
 
-    private final PasswordCheckMediator mMediator = new PasswordCheckMediator();
-    private final PropertyModel mModel = PasswordCheckProperties.createDefaultModel();
+    // DO NOT INITIALIZE HERE! The objects would be shared here which leaks state between tests.
+    private PasswordCheckMediator mMediator;
+    private PropertyModel mModel;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
+        mModel = PasswordCheckProperties.createDefaultModel();
+        mMediator = new PasswordCheckMediator();
+        PasswordCheckFactory.setPasswordCheckForTesting(mPasswordCheck);
         mMediator.initialize(mModel, mDelegate);
     }
 
     @Test
     public void testCreatesValidDefaultModel() {
+        verify(mPasswordCheck).addObserver(mMediator, true);
         assertNotNull(mModel.get(ITEMS));
     }
 
     @Test
-    public void testCreatesHeaderAndEntryForCredentials() {
+    public void testAddsAndRemovesFromObserverList() {
+        mMediator.destroy();
+        verify(mPasswordCheck).removeObserver(mMediator);
+    }
+
+    @Test
+    public void testCreatesHeaderForStatus() {
         mMediator.onPasswordCheckStatusChanged(IDLE);
-        mMediator.onCompromisedCredentialsAvailable(Collections.singletonList(ANA));
         ListModel<MVCListAdapter.ListItem> itemList = mModel.get(ITEMS);
         assertThat(itemList.get(0).type, is(ItemType.HEADER));
         assertThat(itemList.get(0).model.get(CHECK_STATUS), is(IDLE));
-        assertThat(itemList.get(1).type, is(ItemType.COMPROMISED_CREDENTIAL));
-        assertThat(itemList.get(1).model.get(COMPROMISED_CREDENTIAL), is(ANA));
-        assertThat(itemList.get(1).model.get(CREDENTIAL_HANDLER), is(mMediator));
+    }
+
+    @Test
+    public void testCreatesEntryForExistingCredentials() {
+        when(mPasswordCheck.getCompromisedCredentials())
+                .thenReturn(new CompromisedCredential[] {ANA});
+
+        mMediator.onPasswordCheckStatusChanged(IDLE);
+        mMediator.onCompromisedCredentialsFetchCompleted();
+
+        assertThat(mModel.get(ITEMS).get(1).type, is(ItemType.COMPROMISED_CREDENTIAL));
+        assertThat(mModel.get(ITEMS).get(1).model.get(COMPROMISED_CREDENTIAL), equalTo(ANA));
+        assertThat(mModel.get(ITEMS).get(1).model.get(CREDENTIAL_HANDLER), is(mMediator));
+    }
+
+    @Test
+    public void testAppendsEntryForNewlyFoundCredentials() {
+        when(mPasswordCheck.getCompromisedCredentials())
+                .thenReturn(new CompromisedCredential[] {ANA});
+        mMediator.onPasswordCheckStatusChanged(IDLE);
+        mMediator.onCompromisedCredentialsFetchCompleted();
+        assertThat(mModel.get(ITEMS).size(), is(2)); // Header + existing credentials.
+
+        mMediator.onCompromisedCredentialFound(
+                BOB.getOriginUrl(), BOB.getUsername(), BOB.getPassword(), BOB.hasScript());
+
+        assertThat(mModel.get(ITEMS).get(2).type, is(ItemType.COMPROMISED_CREDENTIAL_WITH_SCRIPT));
+        assertThat(mModel.get(ITEMS).get(2).model.get(COMPROMISED_CREDENTIAL), equalTo(BOB));
+        assertThat(mModel.get(ITEMS).get(2).model.get(CREDENTIAL_HANDLER), is(mMediator));
     }
 
     @Test
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc
index b5c44b7..aad896cf 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -28,7 +28,6 @@
 #include "chrome/browser/password_manager/chrome_biometric_authenticator.h"
 #include "chrome/browser/password_manager/field_info_manager_factory.h"
 #include "chrome/browser/password_manager/password_store_factory.h"
-#include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/chrome_password_protection_service.h"
 #include "chrome/browser/safe_browsing/user_interaction_observer.h"
@@ -68,6 +67,7 @@
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "components/password_manager/core/common/password_manager_pref_names.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "components/safe_browsing/buildflags.h"
 #include "components/sessions/content/content_record_password_state.h"
 #include "components/signin/public/base/signin_metrics.h"
@@ -168,6 +168,10 @@
 void AddToWidgetInputEventObservers(
     content::RenderWidgetHost* widget_host,
     content::RenderWidgetHost::InputEventObserver* observer) {
+  // TODO(https://crbug.com/1104919): Remove this logging.
+  VLOG(1) << __FUNCTION__ << ": widget_host: " << widget_host
+          << "; observer: " << observer;
+
   // Since Widget API doesn't allow to check whether the observer is already
   // added, the observer is removed and added again, to ensure that it is added
   // only once.
@@ -183,6 +187,10 @@
 void RemoveFromWidgetInputEventObservers(
     content::RenderWidgetHost* widget_host,
     content::RenderWidgetHost::InputEventObserver* observer) {
+  // TODO(https://crbug.com/1104919): Remove this logging.
+  VLOG(1) << __FUNCTION__ << ": widget_host: " << widget_host
+          << "; observer: " << observer;
+
   if (!widget_host)
     return;
 
@@ -1198,6 +1206,10 @@
   password_reuse_detection_manager_.DidNavigateMainFrame(GetLastCommittedURL());
 #endif  // defined(SYNC_PASSWORD_REUSE_DETECTION_ENABLED)
 
+  // TODO(https://crbug.com/1104919): Remove this logging.
+  VLOG(1) << __FUNCTION__ << ": this: " << this;
+  VLOG(1) << "wc: " << web_contents();
+  VLOG(1) << "wc->GetRenderViewHost(): " << web_contents()->GetRenderViewHost();
   AddToWidgetInputEventObservers(
       web_contents()->GetRenderViewHost()->GetWidget(), this);
 #if defined(OS_ANDROID)
@@ -1221,12 +1233,22 @@
   content_credential_manager_.DisconnectBinding();
 
   DCHECK(web_contents()->GetRenderViewHost());
+
+  // TODO(https://crbug.com/1104919): Remove this logging.
+  VLOG(1) << __FUNCTION__ << ": this: " << this;
+  VLOG(1) << "wc: " << web_contents();
+  VLOG(1) << "wc->GetRenderViewHost(): " << web_contents()->GetRenderViewHost();
   RemoveFromWidgetInputEventObservers(
       web_contents()->GetRenderViewHost()->GetWidget(), this);
 }
 
 #if !defined(OS_ANDROID)
 void ChromePasswordManagerClient::OnPaste() {
+  // TODO(https://crbug.com/1104919): Remove this logging.
+  VLOG(1) << __FUNCTION__ << ": this: " << this;
+  VLOG(1) << "wc: " << web_contents();
+  VLOG(1) << "wc->GetRenderViewHost(): " << web_contents()->GetRenderViewHost();
+
   ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
   base::string16 text;
   clipboard->ReadText(ui::ClipboardBuffer::kCopyPaste, /* data_dst = */ nullptr,
@@ -1238,6 +1260,11 @@
 
 void ChromePasswordManagerClient::RenderFrameCreated(
     content::RenderFrameHost* render_frame_host) {
+  // TODO(https://crbug.com/1104919): Remove this logging.
+  VLOG(1) << __FUNCTION__ << ": this: " << this;
+  VLOG(1) << "; rfh: " << render_frame_host;
+  VLOG(1) << "; rfh->GetView(): " << render_frame_host->GetView();
+
   // TODO(drubery): We should handle input events on subframes separately, so
   // that we can accurately report that the password was reused on a subframe.
   // Currently any password reuse for this WebContents will report password
@@ -1248,6 +1275,11 @@
 
 void ChromePasswordManagerClient::RenderFrameDeleted(
     content::RenderFrameHost* render_frame_host) {
+  // TODO(https://crbug.com/1104919): Remove this logging.
+  VLOG(1) << __FUNCTION__ << ": this: " << this
+          << "; rfh: " << render_frame_host
+          << "; rfh->GetView(): " << render_frame_host->GetView();
+
   if (!render_frame_host->GetView())
     return;
   RemoveFromWidgetInputEventObservers(
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 524d291..961aae6 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -1764,11 +1764,19 @@
       SCHEMA_ALLOW_UNKNOWN,
       SimpleSchemaValidatingPolicyHandler::RECOMMENDED_PROHIBITED,
       SimpleSchemaValidatingPolicyHandler::MANDATORY_ALLOWED));
-  handlers->AddHandler(std::make_unique<SimpleSchemaValidatingPolicyHandler>(
-      key::kPerAppTimeLimitsWhitelist, prefs::kPerAppTimeLimitsWhitelistPolicy,
-      chrome_schema, SCHEMA_ALLOW_UNKNOWN,
-      SimpleSchemaValidatingPolicyHandler::RECOMMENDED_PROHIBITED,
-      SimpleSchemaValidatingPolicyHandler::MANDATORY_ALLOWED));
+  handlers->AddHandler(std::make_unique<policy::SimpleDeprecatingPolicyHandler>(
+      std::make_unique<SimpleSchemaValidatingPolicyHandler>(
+          key::kPerAppTimeLimitsWhitelist,
+          prefs::kPerAppTimeLimitsAllowlistPolicy, chrome_schema,
+          SCHEMA_ALLOW_UNKNOWN,
+          SimpleSchemaValidatingPolicyHandler::RECOMMENDED_PROHIBITED,
+          SimpleSchemaValidatingPolicyHandler::MANDATORY_ALLOWED),
+      std::make_unique<SimpleSchemaValidatingPolicyHandler>(
+          key::kPerAppTimeLimitsAllowlist,
+          prefs::kPerAppTimeLimitsAllowlistPolicy, chrome_schema,
+          SCHEMA_ALLOW_UNKNOWN,
+          SimpleSchemaValidatingPolicyHandler::RECOMMENDED_PROHIBITED,
+          SimpleSchemaValidatingPolicyHandler::MANDATORY_ALLOWED)));
   handlers->AddHandler(
       std::make_unique<EcryptfsMigrationStrategyPolicyHandler>());
   handlers->AddHandler(std::make_unique<SimpleSchemaValidatingPolicyHandler>(
diff --git a/chrome/browser/predictors/autocomplete_action_predictor.cc b/chrome/browser/predictors/autocomplete_action_predictor.cc
index 0afe2e5f..ee94940 100644
--- a/chrome/browser/predictors/autocomplete_action_predictor.cc
+++ b/chrome/browser/predictors/autocomplete_action_predictor.cc
@@ -20,9 +20,6 @@
 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
 #include "chrome/browser/predictors/predictor_database.h"
 #include "chrome/browser/predictors/predictor_database_factory.h"
-#include "chrome/browser/prerender/prerender_field_trial.h"
-#include "chrome/browser/prerender/prerender_handle.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/history/core/browser/in_memory_database.h"
@@ -30,6 +27,9 @@
 #include "components/omnibox/browser/autocomplete_result.h"
 #include "components/omnibox/browser/omnibox_log.h"
 #include "components/omnibox/browser/omnibox_popup_model.h"
+#include "components/prerender/browser/prerender_field_trial.h"
+#include "components/prerender/browser/prerender_handle.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_details.h"
 #include "content/public/browser/notification_service.h"
diff --git a/chrome/browser/predictors/autocomplete_action_predictor_unittest.cc b/chrome/browser/predictors/autocomplete_action_predictor_unittest.cc
index 48bddee70..be6432d 100644
--- a/chrome/browser/predictors/autocomplete_action_predictor_unittest.cc
+++ b/chrome/browser/predictors/autocomplete_action_predictor_unittest.cc
@@ -21,8 +21,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
 #include "chrome/browser/history/history_service_factory.h"
-#include "chrome/browser/prerender/prerender_field_trial.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_test_utils.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/test/base/testing_profile.h"
@@ -31,6 +29,8 @@
 #include "components/history/core/browser/url_database.h"
 #include "components/omnibox/browser/autocomplete_match.h"
 #include "components/omnibox/browser/autocomplete_result.h"
+#include "components/prerender/browser/prerender_field_trial.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
diff --git a/chrome/browser/predictors/loading_predictor_browsertest.cc b/chrome/browser/predictors/loading_predictor_browsertest.cc
index a984d00..203ddb74 100644
--- a/chrome/browser/predictors/loading_predictor_browsertest.cc
+++ b/chrome/browser/predictors/loading_predictor_browsertest.cc
@@ -32,8 +32,6 @@
 #include "chrome/browser/predictors/preconnect_manager.h"
 #include "chrome/browser/predictors/predictors_enums.h"
 #include "chrome/browser/predictors/predictors_features.h"
-#include "chrome/browser/prerender/prerender_handle.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
@@ -42,6 +40,8 @@
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/optimization_guide/optimization_guide_features.h"
 #include "components/optimization_guide/proto/hints.pb.h"
+#include "components/prerender/browser/prerender_handle.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_handle.h"
diff --git a/chrome/browser/predictors/loading_predictor_tab_helper.cc b/chrome/browser/predictors/loading_predictor_tab_helper.cc
index a9c2e91..4af17b2 100644
--- a/chrome/browser/predictors/loading_predictor_tab_helper.cc
+++ b/chrome/browser/predictors/loading_predictor_tab_helper.cc
@@ -14,11 +14,11 @@
 #include "chrome/browser/predictors/loading_predictor_factory.h"
 #include "chrome/browser/predictors/predictors_enums.h"
 #include "chrome/browser/predictors/predictors_features.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/optimization_guide/optimization_guide_decider.h"
 #include "components/optimization_guide/proto/hints.pb.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/render_frame_host.h"
diff --git a/chrome/browser/prerender/chrome_prerender_contents_delegate.cc b/chrome/browser/prerender/chrome_prerender_contents_delegate.cc
index cb5204c..fe2a4e0 100644
--- a/chrome/browser/prerender/chrome_prerender_contents_delegate.cc
+++ b/chrome/browser/prerender/chrome_prerender_contents_delegate.cc
@@ -5,13 +5,13 @@
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
 
 #include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/prerender/prerender_contents.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/task_manager/web_contents_tags.h"
 #include "chrome/browser/ui/tab_helpers.h"
 #include "chrome/common/chrome_render_frame.mojom.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "components/prerender/browser/prerender_histograms.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/browser/web_contents.h"
 
 namespace prerender {
diff --git a/chrome/browser/prerender/external_prerender_handler_android.cc b/chrome/browser/prerender/external_prerender_handler_android.cc
index 70ce3b05..761c6b6 100644
--- a/chrome/browser/prerender/external_prerender_handler_android.cc
+++ b/chrome/browser/prerender/external_prerender_handler_android.cc
@@ -10,11 +10,11 @@
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/android/chrome_jni_headers/ExternalPrerenderHandler_jni.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/prerender/prerender_handle.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_android.h"
+#include "components/prerender/browser/prerender_handle.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/browser/web_contents.h"
 
 using base::android::ConvertJavaStringToUTF16;
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_browsertest.cc b/chrome/browser/prerender/isolated/isolated_prerender_browsertest.cc
index 1e50903..7455deb 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_browsertest.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_browsertest.cc
@@ -36,8 +36,6 @@
 #include "chrome/browser/prerender/isolated/isolated_prerender_tab_helper.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_test_utils.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.h"
-#include "chrome/browser/prerender/prerender_handle.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ssl/certificate_reporting_test_utils.h"
@@ -57,6 +55,8 @@
 #include "components/data_reduction_proxy/proto/client_config.pb.h"
 #include "components/language/core/browser/pref_names.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_handle.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/prerender/common/prerender_final_status.h"
 #include "components/security_interstitials/content/security_interstitial_tab_helper.h"
 #include "components/security_interstitials/content/ssl_blocking_page.h"
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_subresource_manager.h b/chrome/browser/prerender/isolated/isolated_prerender_subresource_manager.h
index 6cfa269..7d5a34e 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_subresource_manager.h
+++ b/chrome/browser/prerender/isolated/isolated_prerender_subresource_manager.h
@@ -13,7 +13,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
-#include "chrome/browser/prerender/prerender_handle.h"
+#include "components/prerender/browser/prerender_handle.h"
 #include "content/public/browser/content_browser_client.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_tab_helper.cc b/chrome/browser/prerender/isolated/isolated_prerender_tab_helper.cc
index d5f192b..128c0c55 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_tab_helper.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_tab_helper.cc
@@ -25,7 +25,6 @@
 #include "chrome/browser/prerender/isolated/isolated_prerender_service.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_service_factory.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_subresource_manager.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
@@ -33,6 +32,7 @@
 #include "components/language/core/browser/pref_names.h"
 #include "components/page_load_metrics/browser/metrics_web_contents_observer.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/search_engines/template_url_service.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/navigation_handle.h"
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.cc b/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.cc
index 7e3640e7..c96668f 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor.cc
@@ -19,10 +19,10 @@
 #include "chrome/browser/prerender/isolated/isolated_prerender_subresource_manager.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_url_loader.h"
 #include "chrome/browser/prerender/isolated/prefetched_mainframe_response_container.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor_unittest.cc b/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor_unittest.cc
index 0840fd22..4a250fd 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor_unittest.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_url_loader_interceptor_unittest.cc
@@ -11,11 +11,11 @@
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/prerender/isolated/isolated_prerender_features.h"
 #include "chrome/browser/prerender/isolated/prefetched_mainframe_response_container.h"
-#include "chrome/browser/prerender/prerender_handle.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.h"
+#include "components/prerender/browser/prerender_handle.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/browser/web_contents.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h"
diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc
index e72823ad..08f01aa 100644
--- a/chrome/browser/prerender/prerender_contents.cc
+++ b/chrome/browser/prerender/prerender_contents.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 "chrome/browser/prerender/prerender_contents.h"
+#include "components/prerender/browser/prerender_contents.h"
 
 #include <stddef.h>
 
@@ -15,8 +15,8 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
 #include "build/build_config.h"
-#include "chrome/browser/prerender/prerender_manager.h"
-#include "components/prerender/browser/prerender_contents_delegate.h"
+#include "chrome/browser/prerender/prerender_contents_delegate.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/prerender/common/prerender_final_status.h"
 #include "components/prerender/common/prerender_util.h"
 #include "components/prerender/common/render_frame_prerender_messages.mojom.h"
diff --git a/chrome/browser/prerender/prerender_link_manager.cc b/chrome/browser/prerender/prerender_link_manager.cc
index 9609a08..f104b80 100644
--- a/chrome/browser/prerender/prerender_link_manager.cc
+++ b/chrome/browser/prerender/prerender_link_manager.cc
@@ -13,9 +13,9 @@
 
 #include "base/metrics/field_trial.h"
 #include "base/metrics/histogram_macros.h"
-#include "chrome/browser/prerender/prerender_contents.h"
-#include "chrome/browser/prerender/prerender_handle.h"
-#include "chrome/browser/prerender/prerender_manager.h"
+#include "components/prerender/browser/prerender_contents.h"
+#include "components/prerender/browser/prerender_handle.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/session_storage_namespace.h"
diff --git a/chrome/browser/prerender/prerender_link_manager.h b/chrome/browser/prerender/prerender_link_manager.h
index 559d0f5..c6c16f9 100644
--- a/chrome/browser/prerender/prerender_link_manager.h
+++ b/chrome/browser/prerender/prerender_link_manager.h
@@ -14,8 +14,8 @@
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/time/time.h"
-#include "chrome/browser/prerender/prerender_handle.h"
 #include "components/keyed_service/core/keyed_service.h"
+#include "components/prerender/browser/prerender_handle.h"
 #include "third_party/blink/public/mojom/prerender/prerender.mojom.h"
 #include "url/gurl.h"
 #include "url/origin.h"
diff --git a/chrome/browser/prerender/prerender_link_manager_factory.cc b/chrome/browser/prerender/prerender_link_manager_factory.cc
index af4f801..f872afa 100644
--- a/chrome/browser/prerender/prerender_link_manager_factory.cc
+++ b/chrome/browser/prerender/prerender_link_manager_factory.cc
@@ -5,11 +5,11 @@
 #include "chrome/browser/prerender/prerender_link_manager_factory.h"
 
 #include "chrome/browser/prerender/prerender_link_manager.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/prerender/browser/prerender_manager.h"
 
 namespace prerender {
 
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index 48a0a8b..daa9d77 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.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 "chrome/browser/prerender/prerender_manager.h"
+#include "components/prerender/browser/prerender_manager.h"
 
 #include <stddef.h>
 
@@ -31,13 +31,18 @@
 #include "base/time/time.h"
 #include "base/timer/elapsed_timer.h"
 #include "base/values.h"
-#include "chrome/browser/prerender/prerender_contents.h"
-#include "chrome/browser/prerender/prerender_field_trial.h"
-#include "chrome/browser/prerender/prerender_handle.h"
+#include "chrome/browser/net/prediction_options.h"
+#include "chrome/browser/predictors/loading_predictor.h"
+#include "chrome/browser/predictors/loading_predictor_factory.h"
+#include "chrome/browser/prerender/prerender_manager_delegate.h"
+#include "chrome/browser/prerender/prerender_tab_helper.h"
+#include "chrome/browser/profiles/profile.h"
 #include "components/content_settings/core/browser/cookie_settings.h"
+#include "components/prerender/browser/prerender_contents.h"
+#include "components/prerender/browser/prerender_field_trial.h"
+#include "components/prerender/browser/prerender_handle.h"
 #include "components/prerender/browser/prerender_histograms.h"
 #include "components/prerender/browser/prerender_history.h"
-#include "components/prerender/browser/prerender_manager_delegate.h"
 #include "components/prerender/browser/prerender_util.h"
 #include "components/prerender/common/prerender_final_status.h"
 #include "components/prerender/common/prerender_types.mojom.h"
@@ -57,6 +62,7 @@
 #include "third_party/blink/public/common/prerender/prerender_rel_type.h"
 #include "ui/gfx/geometry/rect.h"
 
+using chrome_browser_net::NetworkPredictionStatus;
 using content::BrowserThread;
 using content::RenderViewHost;
 using content::SessionStorageNamespace;
@@ -133,9 +139,9 @@
 };
 
 PrerenderManager::PrerenderManager(
-    content::BrowserContext* browser_context,
+    Profile* profile,
     std::unique_ptr<PrerenderManagerDelegate> delegate)
-    : browser_context_(browser_context),
+    : profile_(profile),
       delegate_(std::move(delegate)),
       prerender_contents_factory_(PrerenderContents::CreateFactory()),
       prerender_history_(std::make_unique<PrerenderHistory>(kHistoryLength)),
@@ -162,7 +168,7 @@
 void PrerenderManager::Shutdown() {
   DestroyAllContents(FINAL_STATUS_PROFILE_DESTROYED);
   on_close_web_contents_deleters_.clear();
-  browser_context_ = nullptr;
+  profile_ = nullptr;
 
   DCHECK(active_prerenders_.empty());
 }
@@ -404,9 +410,14 @@
   auto dict_value = std::make_unique<base::DictionaryValue>();
   dict_value->Set("history", prerender_history_->CopyEntriesAsValue());
   dict_value->Set("active", GetActivePrerendersAsValue());
-  dict_value->SetBoolean("enabled", delegate_->IsPredictionEnabled());
-  dict_value->SetString("disabled_note",
-                        delegate_->GetReasonForDisablingPrediction());
+  dict_value->SetBoolean(
+      "enabled", GetPredictionStatus() == NetworkPredictionStatus::ENABLED);
+  std::string disabled_note;
+  if (GetPredictionStatus() == NetworkPredictionStatus::DISABLED_ALWAYS)
+    disabled_note = "Disabled by user setting";
+  if (GetPredictionStatus() == NetworkPredictionStatus::DISABLED_DUE_TO_NETWORK)
+    disabled_note = "Disabled on cellular connection by default";
+  dict_value->SetString("disabled_note", disabled_note);
   // If prerender is disabled via a flag this method is not even called.
   std::string enabled_note;
   dict_value->SetString("enabled_note", enabled_note);
@@ -543,9 +554,11 @@
     return nullptr;
   }
 
-  if (!delegate_->IsPredictionEnabled(origin)) {
+  NetworkPredictionStatus prerendering_status =
+      GetPredictionStatusForOrigin(origin);
+  if (prerendering_status != NetworkPredictionStatus::ENABLED) {
     FinalStatus final_status =
-        delegate_->IsPredictionDisabledDueToNetwork(origin)
+        prerendering_status == NetworkPredictionStatus::DISABLED_DUE_TO_NETWORK
             ? FINAL_STATUS_CELLULAR_NETWORK
             : FINAL_STATUS_PRERENDERING_DISABLED;
     SkipPrerenderContentsAndMaybePreconnect(url, origin, final_status);
@@ -583,8 +596,8 @@
   // TODO(ppi): Check whether there are usually enough render processes
   // available on Android. If not, kill an existing renderers so that we can
   // create a new one.
-  if (content::RenderProcessHost::ShouldTryToUseExistingProcessHost(
-          browser_context_, url) &&
+  if (content::RenderProcessHost::ShouldTryToUseExistingProcessHost(profile_,
+                                                                    url) &&
       !content::RenderProcessHost::run_renderer_in_process()) {
     SkipPrerenderContentsAndMaybePreconnect(url, origin,
                                             FINAL_STATUS_TOO_MANY_PROCESSES);
@@ -781,8 +794,8 @@
     Origin origin) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   return base::WrapUnique(prerender_contents_factory_->CreatePrerenderContents(
-      delegate_->GetPrerenderContentsDelegate(), this, browser_context_, url,
-      referrer, initiator_origin, origin));
+      delegate_->GetPrerenderContentsDelegate(), this, profile_, url, referrer,
+      initiator_origin, origin));
 }
 
 void PrerenderManager::SortActivePrerenders() {
@@ -974,13 +987,49 @@
                                                   int64_t prerender_bytes) {
   if (!IsNoStatePrefetchEnabled())
     return;
-  int64_t recent_browser_context_bytes =
-      browser_context_network_bytes_ -
-      last_recorded_browser_context_network_bytes_;
-  last_recorded_browser_context_network_bytes_ = browser_context_network_bytes_;
-  DCHECK_GE(recent_browser_context_bytes, 0);
+  int64_t recent_profile_bytes =
+      profile_network_bytes_ - last_recorded_profile_network_bytes_;
+  last_recorded_profile_network_bytes_ = profile_network_bytes_;
+  DCHECK_GE(recent_profile_bytes, 0);
   histograms_->RecordNetworkBytesConsumed(origin, prerender_bytes,
-                                          recent_browser_context_bytes);
+                                          recent_profile_bytes);
+}
+
+NetworkPredictionStatus PrerenderManager::GetPredictionStatus() const {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  return chrome_browser_net::CanPrefetchAndPrerenderUI(profile_->GetPrefs());
+}
+
+NetworkPredictionStatus PrerenderManager::GetPredictionStatusForOrigin(
+    Origin origin) const {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  // <link rel=prerender> origins ignore the network state and the privacy
+  // settings. Web developers should be able prefetch with all possible privacy
+  // settings and with all possible network types. This would avoid web devs
+  // coming up with creative ways to prefetch in cases they are not allowed to
+  // do so.
+  if (origin == ORIGIN_LINK_REL_PRERENDER_SAMEDOMAIN ||
+      origin == ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN) {
+    return NetworkPredictionStatus::ENABLED;
+  }
+
+  // Prerendering forced for cellular networks still prevents navigation with
+  // the DISABLED_ALWAYS selected via privacy settings.
+  NetworkPredictionStatus prediction_status =
+      chrome_browser_net::CanPrefetchAndPrerenderUI(profile_->GetPrefs());
+  if (origin == ORIGIN_EXTERNAL_REQUEST_FORCED_PRERENDER &&
+      prediction_status == NetworkPredictionStatus::DISABLED_DUE_TO_NETWORK) {
+    return NetworkPredictionStatus::ENABLED;
+  }
+  return prediction_status;
+}
+
+void PrerenderManager::AddProfileNetworkBytesIfEnabled(int64_t bytes) {
+  DCHECK_GE(bytes, 0);
+  if (GetPredictionStatus() == NetworkPredictionStatus::ENABLED &&
+      IsNoStatePrefetchEnabled())
+    profile_network_bytes_ += bytes;
 }
 
 void PrerenderManager::AddPrerenderProcessHost(
diff --git a/chrome/browser/prerender/prerender_manager_factory.cc b/chrome/browser/prerender/prerender_manager_factory.cc
index 087372a8..26387cc 100644
--- a/chrome/browser/prerender/prerender_manager_factory.cc
+++ b/chrome/browser/prerender/prerender_manager_factory.cc
@@ -8,11 +8,11 @@
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/predictors/predictor_database_factory.h"
 #include "chrome/browser/prerender/chrome_prerender_manager_delegate.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "extensions/buildflags/buildflags.h"
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc b/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
index afe48a8c..8dbca04a 100644
--- a/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
+++ b/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
@@ -24,8 +24,6 @@
 #include "chrome/browser/history/history_test_utils.h"
 #include "chrome/browser/predictors/autocomplete_action_predictor.h"
 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
-#include "chrome/browser/prerender/prerender_handle.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/prerender/prerender_test_utils.h"
 #include "chrome/browser/profiles/profile.h"
@@ -44,6 +42,8 @@
 #include "components/omnibox/browser/omnibox_edit_model.h"
 #include "components/omnibox/browser/omnibox_view.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_handle.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/browser/appcache_service.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/prerender/prerender_tab_helper.cc b/chrome/browser/prerender/prerender_tab_helper.cc
index 6a87099..c36373b 100644
--- a/chrome/browser/prerender/prerender_tab_helper.cc
+++ b/chrome/browser/prerender/prerender_tab_helper.cc
@@ -7,9 +7,9 @@
 #include "base/bind.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/time/time.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/prerender/prerender_test_utils.cc b/chrome/browser/prerender/prerender_test_utils.cc
index 0ac1a9b..0e997c7 100644
--- a/chrome/browser/prerender/prerender_test_utils.cc
+++ b/chrome/browser/prerender/prerender_test_utils.cc
@@ -16,7 +16,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
@@ -25,6 +24,7 @@
 #include "chrome/grit/generated_resources.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/safe_browsing/core/db/v4_protocol_manager_util.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/render_view_host.h"
diff --git a/chrome/browser/prerender/prerender_test_utils.h b/chrome/browser/prerender/prerender_test_utils.h
index 3a9cb80..d898d5f 100644
--- a/chrome/browser/prerender/prerender_test_utils.h
+++ b/chrome/browser/prerender/prerender_test_utils.h
@@ -21,11 +21,11 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "chrome/browser/external_protocol/external_protocol_handler.h"
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/safe_browsing/test_safe_browsing_service.h"
 #include "chrome/test/base/in_process_browser_test.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "components/prerender/browser/prerender_contents_delegate.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/safe_browsing/core/db/test_database_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_widget_host_observer.h"
diff --git a/chrome/browser/prerender/prerender_unittest.cc b/chrome/browser/prerender/prerender_unittest.cc
index b9ef96d8..4f2bc360 100644
--- a/chrome/browser/prerender/prerender_unittest.cc
+++ b/chrome/browser/prerender/prerender_unittest.cc
@@ -28,11 +28,7 @@
 #include "chrome/browser/predictors/loading_predictor_factory.h"
 #include "chrome/browser/predictors/loading_test_util.h"
 #include "chrome/browser/prerender/chrome_prerender_manager_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
-#include "chrome/browser/prerender/prerender_field_trial.h"
-#include "chrome/browser/prerender/prerender_handle.h"
 #include "chrome/browser/prerender/prerender_link_manager.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_test_utils.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
@@ -41,6 +37,10 @@
 #include "chrome/test/base/testing_profile.h"
 #include "components/content_settings/core/common/pref_names.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_contents.h"
+#include "components/prerender/browser/prerender_field_trial.h"
+#include "components/prerender/browser/prerender_handle.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/prerender/common/prerender_origin.h"
 #include "components/prerender/common/prerender_types.mojom.h"
 #include "components/prerender/common/prerender_util.h"
diff --git a/chrome/browser/previews/lazyload_browsertest.cc b/chrome/browser/previews/lazyload_browsertest.cc
index 638f675..0440381 100644
--- a/chrome/browser/previews/lazyload_browsertest.cc
+++ b/chrome/browser/previews/lazyload_browsertest.cc
@@ -9,8 +9,6 @@
 #include "build/build_config.h"
 #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings.h"
 #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
-#include "chrome/browser/prerender/prerender_handle.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/prerender/prerender_test_utils.h"
 #include "chrome/browser/profiles/profile.h"
@@ -19,6 +17,8 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/data_use_measurement/core/data_use_user_data.h"
+#include "components/prerender/browser/prerender_handle.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/prerender/common/prerender_final_status.h"
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index 7b1ef11..6bc07b6 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -1313,8 +1313,7 @@
 
 void RenderViewContextMenu::AppendOpenInWebAppLinkItems() {
   Profile* const profile = Profile::FromBrowserContext(browser_context_);
-  auto* app_service = apps::AppServiceProxyFactory::GetForProfile(profile);
-  if (!app_service || !app_service->BrowserAppLauncher())
+  if (!apps::AppServiceProxyFactory::IsAppServiceAvailableForProfile(profile))
     return;
 
   base::Optional<web_app::AppId> app_id =
diff --git a/chrome/browser/renderer_host/chrome_navigation_ui_data.cc b/chrome/browser/renderer_host/chrome_navigation_ui_data.cc
index a71c780..21fce9e 100644
--- a/chrome/browser/renderer_host/chrome_navigation_ui_data.cc
+++ b/chrome/browser/renderer_host/chrome_navigation_ui_data.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/renderer_host/chrome_navigation_ui_data.h"
 
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "components/prerender/browser/prerender_histograms.h"
 #include "content/public/browser/navigation_handle.h"
 #include "extensions/buildflags/buildflags.h"
diff --git a/chrome/browser/resource_coordinator/background_tab_navigation_throttle.cc b/chrome/browser/resource_coordinator/background_tab_navigation_throttle.cc
index 9b9c1b1..b3b8e0d 100644
--- a/chrome/browser/resource_coordinator/background_tab_navigation_throttle.cc
+++ b/chrome/browser/resource_coordinator/background_tab_navigation_throttle.cc
@@ -6,13 +6,13 @@
 
 #include "base/feature_list.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/resource_coordinator/tab_manager.h"
 #include "chrome/browser/resource_coordinator/tab_manager_features.h"
 #include "chrome/browser/search/search.h"
 #include "chrome/browser/ui/tab_ui_helper.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
 
diff --git a/chrome/browser/resource_coordinator/discard_before_unload_helper.cc b/chrome/browser/resource_coordinator/discard_before_unload_helper.cc
index d481b9e..74f7f69 100644
--- a/chrome/browser/resource_coordinator/discard_before_unload_helper.cc
+++ b/chrome/browser/resource_coordinator/discard_before_unload_helper.cc
@@ -74,10 +74,10 @@
       self_(this),
       callback_(std::move(callback)) {
   DCHECK(!callback_.is_null());
-  // NOTE: Ideally this would call NeedToFireBeforeUnloadOrUnload and entirely
-  // skip on the dispatch if there are no unload handlers installed.
-  // Unfortunately, NeedToFireBeforeUnloadOrUnload doesn't check the main
-  // frame, so this doesn't quite work. See this related bug for more
+  // NOTE: Ideally this would call NeedToFireBeforeUnloadOrUnloadEvents and
+  // entirely skip on the dispatch if there are no unload handlers installed.
+  // Unfortunately, NeedToFireBeforeUnloadOrUnloadEvents doesn't check the
+  // main frame, so this doesn't quite work. See this related bug for more
   // information: crbug.com/869956
   web_contents()->DispatchBeforeUnload(true /* auto_cancel */);
 }
diff --git a/chrome/browser/resource_coordinator/discard_before_unload_helper_browsertest.cc b/chrome/browser/resource_coordinator/discard_before_unload_helper_browsertest.cc
index c76c807..742e466b7 100644
--- a/chrome/browser/resource_coordinator/discard_before_unload_helper_browsertest.cc
+++ b/chrome/browser/resource_coordinator/discard_before_unload_helper_browsertest.cc
@@ -53,7 +53,8 @@
     HasBeforeUnloadHandler(wc, std::move(callback));
 
     // The callback should not be invoked synchronously. In a world where
-    // NeedToFireBeforeUnloadOrUnload works properly this expectation changes.
+    // NeedToFireBeforeUnloadOrUnloadEvents works properly this expectation
+    // changes.
     ASSERT_FALSE(callback_invoked);
 
     // Run the loop until we process the callback.
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc b/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc
index 94e36de..92f9632f 100644
--- a/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc
+++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit.cc
@@ -460,7 +460,7 @@
     LifecycleUnitDiscardReason discard_reason) {
   UMA_HISTOGRAM_BOOLEAN(
       "TabManager.Discarding.DiscardedTabHasBeforeUnloadHandler",
-      web_contents()->NeedToFireBeforeUnloadOrUnload());
+      web_contents()->NeedToFireBeforeUnloadOrUnloadEvents());
 
   content::WebContents* const old_contents = web_contents();
   content::WebContents::CreateParams create_params(tab_strip_model_->profile());
diff --git a/chrome/browser/resource_coordinator/tab_load_tracker.cc b/chrome/browser/resource_coordinator/tab_load_tracker.cc
index d3baf1a..5fb797f2 100644
--- a/chrome/browser/resource_coordinator/tab_load_tracker.cc
+++ b/chrome/browser/resource_coordinator/tab_load_tracker.cc
@@ -10,8 +10,8 @@
 #include "base/stl_util.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/resource_coordinator/resource_coordinator_parts.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/web_contents.h"
diff --git a/chrome/browser/resource_coordinator/tab_load_tracker_unittest.cc b/chrome/browser/resource_coordinator/tab_load_tracker_unittest.cc
index e309957..5d7adcf 100644
--- a/chrome/browser/resource_coordinator/tab_load_tracker_unittest.cc
+++ b/chrome/browser/resource_coordinator/tab_load_tracker_unittest.cc
@@ -9,12 +9,12 @@
 
 #include "base/process/kill.h"
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/prerender/prerender_handle.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/prerender/prerender_test_utils.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/prerender/browser/prerender_handle.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/test/mock_render_process_host.h"
 #include "content/public/test/navigation_simulator.h"
diff --git a/chrome/browser/resources/chromeos/login/family_link_notice.html b/chrome/browser/resources/chromeos/login/family_link_notice.html
index 2a1de28..30381e0 100644
--- a/chrome/browser/resources/chromeos/login/family_link_notice.html
+++ b/chrome/browser/resources/chromeos/login/family_link_notice.html
@@ -9,18 +9,20 @@
 <dom-module id="family-link-notice">
   <template>
     <style include="oobe-dialog-host"></style>
-    <oobe-dialog id="familyLinkDialog" role="dialog" has-buttons
-        title-key="familyLinkDialogTitle"
-        subtitle-key="familyLinkDialogSubtitle">
+    <oobe-dialog id="familyLinkDialog" role="dialog" has-buttons>
       <!-- TODO(crbug.com/1101318): replace with correct icon -->
       <hd-iron-icon slot="oobe-icon"
           icon1x="oobe-32:enterprise" icon2x="oobe-64:enterprise">
       </hd-iron-icon>
+      <h1 slot="title">[[getDialogTitle_(locale, email_, domain_)]]</h1>
+      <div slot="subtitle">
+        [[getDialogSubtitle_(locale, isNewGaiaAccount_, email_, domain_)]]
+      </div>
       <div slot="footer" class="flex layout vertical center center-justified">
         <!-- TODO(crbug.com/1101318): replace with correct image -->
         <img srcset="images/illustration_complete_1x.png 1x,
             images/illustration_complete_2x.png 2x" class="oobe-illustration"
-            alt$="[[i18nDynamic(locale, 'oobePackagedLicenseTitle')]]">
+            alt$="[[i18nDynamic(locale, 'familyLinkDialogTitle')]]">
       </div>
       <div slot="bottom-buttons" class="layout horizontal end-justified">
         <oobe-next-button id="continueButton"
diff --git a/chrome/browser/resources/chromeos/login/family_link_notice.js b/chrome/browser/resources/chromeos/login/family_link_notice.js
index bed159be..ff5ee06 100644
--- a/chrome/browser/resources/chromeos/login/family_link_notice.js
+++ b/chrome/browser/resources/chromeos/login/family_link_notice.js
@@ -11,7 +11,39 @@
 
   behaviors: [OobeI18nBehavior, OobeDialogHostBehavior, LoginScreenBehavior],
 
-  properties: {},
+  EXTERNAL_API: [
+    'setDisplayEmail',
+    'setDomain',
+    'setIsNewGaiaAccount',
+  ],
+
+  properties: {
+
+    /**
+     * If the gaia account is newly created
+     */
+    isNewGaiaAccount_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /**
+     * The email address to be displayed
+     */
+    email_: {
+      type: String,
+      value: '',
+    },
+
+    /**
+     * The enterprise domain to be displayed
+     */
+    domain_: {
+      type: String,
+      value: '',
+    },
+
+  },
 
   ready() {
     this.initializeLoginScreen('FamilyLinkNoticeScreen', {
@@ -27,6 +59,64 @@
   },
 
   /**
+   * Sets email address.
+   * @param {string} email
+   */
+  setDisplayEmail(email) {
+    this.email_ = email;
+  },
+
+  /**
+   * Sets enterprise domain.
+   * @param {string} domain
+   */
+  setDomain(domain) {
+    this.domain_ = domain;
+  },
+
+  /**
+   * Sets if the gaia account is newly created.
+   * @param {boolean} isNewGaiaAccount
+   */
+  setIsNewGaiaAccount(isNewGaiaAccount) {
+    this.isNewGaiaAccount_ = isNewGaiaAccount;
+  },
+
+  /**
+   * Returns the title of the dialog based on if account is managed. Account is
+   * managed when email or domain field is not empty and we show parental
+   * controls is not eligible.
+   *
+   * @private
+   */
+  getDialogTitle_(locale, email, domain) {
+    if (email || domain) {
+      return this.i18n('familyLinkDialogNotEligibleTitle');
+    } else {
+      return this.i18n('familyLinkDialogTitle');
+    }
+  },
+
+  /**
+   * Formats and returns the subtitle of the dialog based on if account is
+   * managed or if account is newly created. Account is managed when email or
+   * domain field is not empty and we show parental controls is not eligible.
+   *
+   * @private
+   */
+  getDialogSubtitle_(locale, isNewGaiaAccount, email, domain) {
+    if (email || domain) {
+      return this.i18n('familyLinkDialogNotEligibleSubtitle', email, domain);
+    } else {
+      if (isNewGaiaAccount) {
+        return this.i18n('familyLinkDialogNewGaiaAccountSubtitle');
+      } else {
+        return this.i18n('familyLinkDialogExistingGaiaAccountSubtitle');
+      }
+    }
+  },
+
+  /**
    * On-tap event handler for Continue button.
    *
    * @private
diff --git a/chrome/browser/resources/nearby_share/BUILD.gn b/chrome/browser/resources/nearby_share/BUILD.gn
index 5a5d1fd9..3535929a 100644
--- a/chrome/browser/resources/nearby_share/BUILD.gn
+++ b/chrome/browser/resources/nearby_share/BUILD.gn
@@ -50,6 +50,7 @@
   deps = [
     ":nearby_device_icon",
     "//chrome/browser/ui/webui/nearby_share:mojom_js_library_for_compile",
+    "//third_party/polymer/v3_0/components-chromium/iron-icon",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
   ]
 }
@@ -68,6 +69,7 @@
     ":nearby_device",
     ":nearby_preview",
     "//chrome/browser/ui/webui/nearby_share:mojom_js_library_for_compile",
+    "//third_party/polymer/v3_0/components-chromium/iron-list",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
     "//ui/webui/resources/cr_elements/cr_button:cr_button.m",
     "//ui/webui/resources/js:assert.m",
diff --git a/chrome/browser/resources/nearby_share/icons.html b/chrome/browser/resources/nearby_share/icons.html
index 4d4b9e0..019a3e8 100644
--- a/chrome/browser/resources/nearby_share/icons.html
+++ b/chrome/browser/resources/nearby_share/icons.html
@@ -1,6 +1,9 @@
 <iron-iconset-svg name="nearby-share" size="24">
   <svg>
     <defs>
+      <!-- Nearby Share icons -->
+      <g id="done"><path d="M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z"></path></g>
+
       <!--
       These icons are copied from Polymer's iron-icons and kept in sorted order.
       See http://goo.gl/Y1OdAq for instructions on adding additional icons.
diff --git a/chrome/browser/resources/nearby_share/nearby_device.html b/chrome/browser/resources/nearby_share/nearby_device.html
index b297346..71de158 100644
--- a/chrome/browser/resources/nearby_share/nearby_device.html
+++ b/chrome/browser/resources/nearby_share/nearby_device.html
@@ -13,6 +13,31 @@
     padding-inline-start: 9px;
   }
 
+  :host(:focus) {
+    border-color: rgb(95, 99, 104);
+    outline: none;
+  }
+
+  :host([is-selected]) {
+    border-color: rgb(66, 133, 244);
+  }
+
+  :host([is-selected]) > #done {
+    display: flex;
+  }
+
+  :host([is-selected]) > #name {
+    color: rgb(26, 115, 232);
+  }
+
+  #done {
+    color: rgb(26, 115, 232);
+    display: none;
+    flex-shrink: 0;
+    height: 17px;
+    width: 17px;
+  }
+
   #icon {
     --nearby-device-icon-size: 15px;
     flex-shrink: 0;
@@ -36,3 +61,4 @@
 <nearby-device-icon id="icon" share-target="[[shareTarget]]">
 </nearby-device-icon>
 <div id="name">[[shareTarget.name]]</div>
+<iron-icon id="done" icon="nearby-share:done"></iron-icon>
diff --git a/chrome/browser/resources/nearby_share/nearby_device.js b/chrome/browser/resources/nearby_share/nearby_device.js
index 82706d9..13e560b 100644
--- a/chrome/browser/resources/nearby_share/nearby_device.js
+++ b/chrome/browser/resources/nearby_share/nearby_device.js
@@ -8,6 +8,8 @@
 
 import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
 import 'chrome://resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-lite.js';
+import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
+import './icons.js';
 import './nearby_device_icon.js';
 import './nearby_share_target_types.mojom-lite.js';
 import './nearby_share.mojom-lite.js';
@@ -29,5 +31,14 @@
       type: Object,
       value: null,
     },
+
+    /**
+     * Whether this share target is selected.
+     * @type {boolean}
+     */
+    isSelected: {
+      type: Boolean,
+      reflectToAttribute: true,
+    },
   },
 });
diff --git a/chrome/browser/resources/nearby_share/nearby_discovery_page.html b/chrome/browser/resources/nearby_share/nearby_discovery_page.html
index 4b72a75..6c57f3e05 100644
--- a/chrome/browser/resources/nearby_share/nearby_discovery_page.html
+++ b/chrome/browser/resources/nearby_share/nearby_discovery_page.html
@@ -23,7 +23,7 @@
     overflow: hidden;
   }
 
-  #device-list {
+  #deviceList {
     overflow: auto;
     padding-inline-end:  var(--nearby-page-space-large-inline);
     padding-inline-start:  var(--nearby-page-space-large-inline);
@@ -91,11 +91,18 @@
 
     <div id="process-row">
       <nearby-preview title="Doggo.jpg"></nearby-preview>
-      <div id="device-list">
-        <template is="dom-repeat" items="[[shareTargets_]]">
-          <nearby-device share-target="[[item]]"></nearby-device>
+      <iron-list items="[[shareTargets_]]" id="deviceList"
+          selected-item="{{selectedShareTarget}}"
+          on-selected-item-changed="onSelectedShareTargetChanged_"
+          aria-rowcount$="[[shareTargets_.length]]" preserve-focus
+          selection-enabled>
+        <template>
+          <nearby-device tabindex$="[[tabIndex]]" share-target="[[item]]"
+              is-selected="[[isShareTargetSelected_(
+                               item, selectedShareTarget)]]">
+          </nearby-device>
         </template>
-      </div>
+      </iron-list>
     </div>
 
     <div id="help">
@@ -110,7 +117,8 @@
     <cr-button class="cancel-button">
       Cancel
     </cr-button>
-    <cr-button id="next-button" class="action-button" on-click="onNextTap_">
+    <cr-button id="next-button" class="action-button" on-click="onNextTap_"
+        disabled="[[!selectedShareTarget]]">
       Next
     </cr-button>
   </div>
diff --git a/chrome/browser/resources/nearby_share/nearby_discovery_page.js b/chrome/browser/resources/nearby_share/nearby_discovery_page.js
index 70bfbd5..62cea75 100644
--- a/chrome/browser/resources/nearby_share/nearby_discovery_page.js
+++ b/chrome/browser/resources/nearby_share/nearby_discovery_page.js
@@ -10,6 +10,7 @@
 import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
 import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
 import 'chrome://resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-lite.js';
+import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 import './nearby_device.js';
 import './nearby_preview.js';
 import './nearby_share_target_types.mojom-lite.js';
@@ -90,11 +91,12 @@
   /** @private {Array<number>} */
   listenerIds_: null,
 
-  /**
-   * @type {Map<!string,!nearbyShare.mojom.ShareTarget>}
-   */
+  /** @private {Map<!string,!nearbyShare.mojom.ShareTarget>} */
   shareTargetMap_: null,
 
+  /** @private {?nearbyShare.mojom.ShareTarget} */
+  lastSelectedShareTarget_: null,
+
   /** @override */
   attached() {
     // TODO(knollr): Remove this once prototyping is done.
@@ -158,6 +160,7 @@
           (target) => tokensEqual(target.id, shareTarget.id));
       assert(index !== -1);
       this.splice('shareTargets_', index, 1, shareTarget);
+      this.updateSelectedShareTarget_(shareTarget.id, shareTarget);
     }
     this.shareTargetMap_.set(shareTargetId, shareTarget);
   },
@@ -172,14 +175,15 @@
     assert(index !== -1);
     this.splice('shareTargets_', index, 1);
     this.shareTargetMap_.delete(tokenToString(shareTarget.id));
+    this.updateSelectedShareTarget_(shareTarget.id, /*shareTarget=*/ null);
   },
 
   /** @private */
   onNextTap_() {
-    // TODO(knollr): Allow user to select share target and remove this.
-    this.selectedShareTarget = this.shareTargets_[0];
+    if (!this.selectedShareTarget) {
+      return;
+    }
 
-    assert(this.selectedShareTarget);
     getDiscoveryManager()
         .selectShareTarget(this.selectedShareTarget.id)
         .then(response => {
@@ -198,4 +202,37 @@
           }
         });
   },
+
+  /** @private */
+  onSelectedShareTargetChanged_() {
+    // <iron-list> causes |this.$.deviceList.selectedItem| to be null if tapped
+    // a second time. Manually reselect the last item to preserve selection.
+    if (!this.$.deviceList.selectedItem && this.lastSelectedShareTarget_) {
+      this.$.deviceList.selectItem(this.lastSelectedShareTarget_);
+    }
+    this.lastSelectedShareTarget_ = this.$.deviceList.selectedItem;
+  },
+
+  /**
+   * @param {!nearbyShare.mojom.ShareTarget} shareTarget
+   * @return {boolean}
+   * @private
+   */
+  isShareTargetSelected_(shareTarget) {
+    return this.selectedShareTarget === shareTarget;
+  },
+
+  /**
+   * Updates the selected share tagrget to |shareTarget| if its id matches |id|.
+   * @param {!mojoBase.mojom.UnguessableToken} id
+   * @param {?nearbyShare.mojom.ShareTarget} shareTarget
+   * @private
+   */
+  updateSelectedShareTarget_(id, shareTarget) {
+    if (this.selectedShareTarget &&
+        tokensEqual(this.selectedShareTarget.id, id)) {
+      this.lastSelectedShareTarget_ = shareTarget;
+      this.selectedShareTarget = shareTarget;
+    }
+  }
 });
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn
index 6f3187a..c5530b87b6 100644
--- a/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -62,8 +62,15 @@
   optimize_webui("build_polymer3") {
     host = "os-settings"
     input = rebase_path("$target_gen_dir/$unpak_folder_v3", root_build_dir)
-    js_out_files = [ "os_settings.rollup.js" ]
-    js_module_in_files = [ "chromeos/os_settings.js" ]
+    js_module_in_files = [
+      "chromeos/os_settings.js",
+      "chromeos/lazy_load.js",
+    ]
+    js_out_files = [
+      "os_settings.rollup.js",
+      "lazy_load.rollup.js",
+      "shared.rollup.js",
+    ]
 
     deps = [
       ":unpak_v3",
diff --git a/chrome/browser/resources/settings/chromeos/ensure_lazy_loaded.html b/chrome/browser/resources/settings/chromeos/ensure_lazy_loaded.html
new file mode 100644
index 0000000..0c665f4b
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/ensure_lazy_loaded.html
@@ -0,0 +1 @@
+<!-- This file is used only for Polymer 3 autogeneration. -->
diff --git a/chrome/browser/resources/settings/chromeos/ensure_lazy_loaded.m.js b/chrome/browser/resources/settings/chromeos/ensure_lazy_loaded.m.js
new file mode 100644
index 0000000..5e9a4fb
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/ensure_lazy_loaded.m.js
@@ -0,0 +1,22 @@
+// 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.
+
+let lazyLoadPromise = null;
+
+/** @return {!Promise<void>} Resolves when the lazy load module is imported. */
+export function ensureLazyLoadedOs() {
+  if (!lazyLoadPromise) {
+    const script = document.createElement('script');
+    script.type = 'module';
+    script.src = './lazy_load.js';
+    document.body.appendChild(script);
+
+    lazyLoadPromise = Promise.all([
+      'os-settings-powerwash-dialog',
+      'os-settings-privacy-page',
+      'os-settings-reset-page',
+    ].map(name => customElements.whenDefined(name)));
+  }
+  return lazyLoadPromise;
+}
diff --git a/chrome/browser/resources/settings/chromeos/lazy_load.js b/chrome/browser/resources/settings/chromeos/lazy_load.js
new file mode 100644
index 0000000..f800dde
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/lazy_load.js
@@ -0,0 +1,20 @@
+// 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.
+
+// Uncomment as these modules are migrated to Polymer 3.
+// import './date_time_page/date_time_page.m.js';
+// import './os_a11y_page/os_a11y_page.m.js';
+// import './os_files_page/os_files_page.m.js';
+import './os_languages_page/input_method_options_page.m.js';
+import './os_languages_page/os_languages_page.m.js';
+import './os_languages_page/os_languages_section.m.js';
+import './os_languages_page/smart_inputs_page.m.js';
+// import './os_printing_page/os_printing_page.m.js';
+import './os_privacy_page/os_privacy_page.m.js';
+import './os_reset_page/os_reset_page.m.js';
+import './os_reset_page/os_powerwash_dialog.m.js';
+import './os_reset_page/os_reset_page.m.js';
+
+export {LanguagesBrowserProxy, LanguagesBrowserProxyImpl} from '../languages_page/languages_browser_proxy.m.js';
+export {OsResetBrowserProxyImpl} from './os_reset_page/os_reset_browser_proxy.m.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
index 127005b..c31a1090e 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
@@ -15,6 +15,7 @@
     ":os_add_languages_dialog",
     ":os_languages_page",
     ":os_languages_section",
+    ":smart_inputs_page",
     "../../languages_page:languages",
     "../../languages_page:languages_browser_proxy",
     "../../languages_page:languages_types",
@@ -96,32 +97,39 @@
   ]
 }
 
-# TODO: Uncomment as the Polymer3 migration makes progress.
+js_library("smart_inputs_page") {
+  deps = [
+    "../../prefs:prefs_behavior",
+    "//ui/webui/resources/js:load_time_data",
+  ]
+}
+
 js_type_check("closure_compile_module") {
   is_polymer3 = true
   deps = [
-    #    ":input_method_options_page.m",
-    #    ":input_method_util.m",
+    ":input_method_options_page.m",
+    ":input_method_util.m",
     ":languages_metrics_proxy.m",
-    #    ":manage_input_methods_page.m",
-    #    ":os_add_languages_dialog.m",
-    #    ":os_languages_page.m",
-    #    ":os_languages_section.m"
+    ":manage_input_methods_page.m",
+    ":os_add_languages_dialog.m",
+    ":os_languages_page.m",
+    ":os_languages_section.m",
+    ":smart_inputs_page.m",
   ]
 }
 
 js_library("input_method_util.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_util.m.js" ]
-  deps = [
-    # TODO: Fill those in.
-  ]
+  deps = [ "//ui/webui/resources/js:cr.m" ]
   extra_deps = [ ":modulize" ]
 }
 
 js_library("input_method_options_page.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.m.js" ]
   deps = [
-    # TODO: Fill those in.
+    ":input_method_util.m",
+    "../../prefs:prefs.m",
+    "//ui/webui/resources/js:i18n_behavior.m",
   ]
   extra_deps = [ ":input_method_options_page_module" ]
 }
@@ -135,16 +143,18 @@
 
 js_library("manage_input_methods_page.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/manage_input_methods_page.m.js" ]
-  deps = [
-    # TODO: Fill those in.
-  ]
+  deps = [ "//ui/webui/resources/js:cr.m" ]
   extra_deps = [ ":manage_input_methods_page_module" ]
 }
 
 js_library("os_add_languages_dialog.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/os_add_languages_dialog.m.js" ]
   deps = [
-    # TODO: Fill those in.
+    "../../languages_page:languages.m",
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/cr_elements:cr_scrollable_behavior.m",
+    "//ui/webui/resources/cr_elements/cr_search_field:cr_search_field.m",
+    "//ui/webui/resources/js:find_shortcut_behavior.m",
   ]
   extra_deps = [ ":os_add_languages_dialog_module" ]
 }
@@ -152,7 +162,21 @@
 js_library("os_languages_page.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.m.js" ]
   deps = [
-    # TODO: Fill those in.
+    ":input_method_util.m",
+    ":languages_metrics_proxy.m",
+    "..:metrics_recorder.m",
+    "..:os_route.m",
+    "../..:i18n_setup",
+    "../..:lifetime_browser_proxy.m",
+    "../..:router.m",
+    "../localized_link:localized_link.m",
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/cr_elements/cr_action_menu:cr_action_menu.m",
+    "//ui/webui/resources/cr_elements/cr_expand_button:cr_expand_button.m",
+    "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render.m",
+    "//ui/webui/resources/js:assert.m",
+    "//ui/webui/resources/js:cr.m",
+    "//ui/webui/resources/js/cr/ui:focus_without_ink.m",
   ]
   extra_deps = [ ":os_languages_page_module" ]
 }
@@ -160,11 +184,31 @@
 js_library("os_languages_section.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.m.js" ]
   deps = [
-    # TODO: Fill those in.
+    ":input_method_options_page.m",
+    ":manage_input_methods_page.m",
+    ":os_languages_page.m",
+    "..:os_route.m",
+    "../..:router.m",
+    "../../languages_page:languages.m",
+    "../../settings_page:settings_animated_pages.m",
+    "../../settings_page:settings_subpage.m",
+    "//ui/webui/resources/js:assert.m",
+    "//ui/webui/resources/js:cr.m",
+    "//ui/webui/resources/js:load_time_data.m",
+    "//ui/webui/resources/js/cr/ui:focus_without_ink.m",
   ]
   extra_deps = [ ":os_languages_section_module" ]
 }
 
+js_library("smart_inputs_page.m") {
+  sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.m.js" ]
+  deps = [
+    "../../prefs:prefs_behavior.m",
+    "//ui/webui/resources/js:load_time_data.m",
+  ]
+  extra_deps = [ ":smart_inputs_page_module" ]
+}
+
 import("//tools/polymer/polymer.gni")
 
 group("polymer3_elements") {
@@ -175,6 +219,9 @@
     ":os_add_languages_dialog_module",
     ":os_languages_page_module",
     ":os_languages_section_module",
+    ":smart_inputs_page_module",
+    "../../languages_page:languages_module",
+    "../../languages_page:modulize",
   ]
 }
 
@@ -182,30 +229,54 @@
   js_file = "manage_input_methods_page.js"
   html_file = "manage_input_methods_page.html"
   html_type = "dom-module"
+  migrated_imports = settings_migrated_imports
+  namespace_rewrites = os_settings_namespace_rewrites
+  auto_imports = os_settings_auto_imports
 }
 
 polymer_modulizer("os_add_languages_dialog") {
   js_file = "os_add_languages_dialog.js"
   html_file = "os_add_languages_dialog.html"
   html_type = "dom-module"
+  migrated_imports = settings_migrated_imports
+  namespace_rewrites = os_settings_namespace_rewrites
+  auto_imports = os_settings_auto_imports
 }
 
 polymer_modulizer("os_languages_page") {
   js_file = "os_languages_page.js"
   html_file = "os_languages_page.html"
   html_type = "dom-module"
+  migrated_imports = settings_migrated_imports
+  namespace_rewrites = os_settings_namespace_rewrites
+  auto_imports = os_settings_auto_imports
 }
 
 polymer_modulizer("os_languages_section") {
   js_file = "os_languages_section.js"
   html_file = "os_languages_section.html"
   html_type = "dom-module"
+  migrated_imports = settings_migrated_imports
+  namespace_rewrites = os_settings_namespace_rewrites
+  auto_imports = os_settings_auto_imports
 }
 
 polymer_modulizer("input_method_options_page") {
   js_file = "input_method_options_page.js"
   html_file = "input_method_options_page.html"
   html_type = "dom-module"
+  migrated_imports = settings_migrated_imports
+  namespace_rewrites = os_settings_namespace_rewrites
+  auto_imports = os_settings_auto_imports
+}
+
+polymer_modulizer("smart_inputs_page") {
+  js_file = "smart_inputs_page.js"
+  html_file = "smart_inputs_page.html"
+  html_type = "dom-module"
+  migrated_imports = settings_migrated_imports
+  namespace_rewrites = os_settings_namespace_rewrites
+  auto_imports = os_settings_auto_imports
 }
 
 js_modulizer("modulize") {
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.html b/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.html
index 4e39ef9..24fe4c5 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.html
@@ -2,7 +2,11 @@
 
 <link rel="import" href="chrome://resources/cr_elements/md_select_css.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
+<link rel="import" href="chrome://resources/html/assert.html">
+<link rel="import" href="chrome://resources/html/i18n_behavior.html">
 <link rel="import" href="input_method_util.html">
+<link rel="import" href="../os_route.html">
+<link rel="import" href="../../router.html">
 <link rel="import" href="../../settings_shared_css.html">
 <link rel="import" href="../../prefs/prefs_behavior.html">
 
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_util.js b/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_util.js
index fb0b1abf..e89348e 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_util.js
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_util.js
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// #import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
+
 /**
  * @fileoverview constants related to input method options.
  */
@@ -10,7 +12,7 @@
    * The prefix string shared by all first party input method ID.
    * @private @const
    */
-  const FIRST_PARTY_INPUT_METHOD_ID_PREFIX =
+  /* #export */ const FIRST_PARTY_INPUT_METHOD_ID_PREFIX =
       '_comp_ime_jkghodnilhceideoidjikpgommlajknk';
 
   /**
@@ -44,7 +46,7 @@
    *
    * @enum {string}
    */
-  const OptionType = {
+  /* #export */ const OptionType = {
     EDIT_USER_DICT: 'editUserDict',
     ENABLE_COMPLETION: 'enableCompletion',
     ENABLE_DOUBLE_SPACE_PERIOD: 'enableDoubleSpacePeriod',
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.html b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.html
index caed8f8..ee7f5b2 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.html
@@ -14,19 +14,16 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_action_menu/cr_action_menu.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
 <link rel="import" href="chrome://resources/cr_elements/policy/cr_policy_pref_indicator.html">
-<link rel="import" href="chrome://resources/cr_elements/icons.html">
 <link rel="import" href="input_method_util.html">
 <link rel="import" href="languages_metrics_proxy.html">
 <link rel="import" href="os_add_languages_dialog.html">
 <link rel="import" href="../localized_link/localized_link.html">
-<link rel="import" href="../../controls/controlled_radio_button.html">
-<link rel="import" href="../../controls/settings_radio_group.html">
 <link rel="import" href="../../controls/settings_toggle_button.html">
 <link rel="import" href="../../lifetime_browser_proxy.html">
 <link rel="import" href="../../prefs/prefs_behavior.html">
 <link rel="import" href="../os_route.html">
+<link rel="import" href="../../i18n_setup.html">
 <link rel="import" href="../../router.html">
 <link rel="import" href="../../settings_shared_css.html">
 <link rel="import" href="../../settings_vars_css.html">
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni
index 0b07244..b55d70e7 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings.gni
+++ b/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -10,55 +10,73 @@
 os_settings_namespace_rewrites = settings_namespace_rewrites +
                                  cr_components_chromeos_namespace_rewrites +
                                  cr_elements_chromeos_namespace_rewrites + [
+                                   "// #polymer3 |",
                                    "parental_controls.ParentalControlsBrowserProxy|ParentalControlsBrowserProxy",
                                    "settings.AccountManagerBrowserProxy|AccountManagerBrowserProxy",
                                    "settings.AmbientModeBrowserProxy|AmbientModeBrowserProxy",
                                    "settings.ChangePictureBrowserProxy|ChangePictureBrowserProxy",
                                    "settings.DefaultImage|DefaultImage",
+                                   "settings.FingerprintAttempt|FingerprintAttempt",
+                                   "settings.FingerprintBrowserProxy|FingerprintBrowserProxy",
+                                   "settings.FingerprintInfo|FingerprintInfo",
+                                   "settings.FingerprintResultType|FingerprintResultType",
+                                   "settings.FingerprintScan|FingerprintScan",
+                                   "settings.FingerprintSetupStep|FingerprintSetupStep",
+                                   "settings.input_method_util.generateOptions|generateOptions",
+                                   "settings.input_method_util.getFirstPartyInputMethodEngineId|getFirstPartyInputMethodEngineId",
+                                   "settings.input_method_util.getOptionLabelName|getOptionLabelName",
+                                   "settings.input_method_util.getOptionMenuItems|getOptionMenuItems",
+                                   "settings.input_method_util.getOptionUiType|getOptionUiType",
+                                   "settings.input_method_util.getOptionUrl|getOptionUrl",
+                                   "settings.input_method_util.hasOptionsPageInSettings|hasOptionsPageInSettings",
+                                   "settings.input_method_util.InputToolCode|InputToolCode",
+                                   "settings.input_method_util.isNumberValue|isNumberValue",
+                                   "settings.input_method_util.OPTION_DEFAULT|OPTION_DEFAULT",
+                                   "settings.input_method_util.OptionType|OptionType",
+                                   "settings.input_method_util.UiType|UiType",
+                                   "settings.KerberosAccount|KerberosAccount",
                                    "settings.KerberosAccountsBrowserProxy|KerberosAccountsBrowserProxy",
-                                   "settings.KerberosErrorType|KerberosErrorType",
                                    "settings.KerberosConfigErrorCode|KerberosConfigErrorCode",
+                                   "settings.KerberosErrorType|KerberosErrorType",
+                                   "settings.kMenuCloseDelay|kMenuCloseDelay",
+                                   "settings.LanguagesMetricsProxy|LanguagesMetricsProxy",
+                                   "settings.LanguagesPageInteraction|LanguagesPageInteraction",
                                    "settings.MultiDeviceBrowserProxy|MultiDeviceBrowserProxy",
-                                   "settings.MultiDeviceSettingsMode|MultiDeviceSettingsMode",
                                    "settings.MultiDeviceFeature|MultiDeviceFeature",
                                    "settings.MultiDeviceFeatureState|MultiDeviceFeatureState",
                                    "settings.MultiDevicePageContentData|MultiDevicePageContentData",
-                                   "settings.LanguagesMetricsProxy|LanguagesMetricsProxy",
-                                   "settings.LanguagesPageInteraction|LanguagesPageInteraction",
+                                   "settings.MultiDeviceSettingsMode|MultiDeviceSettingsMode",
                                    "settings.OsResetBrowserProxy|OsResetBrowserProxy",
-                                   "settings.RouteObserverBehavior|RouteObserverBehavior",
-                                   "settings.Route|Route",
-                                   "settings.routes|routes",
-                                   "settings.recordSettingChange|recordSettingChange",
-                                   "settings.SmartLockSignInEnabledState|SmartLockSignInEnabledState",
-                                   "settings.WallpaperBrowserProxy|WallpaperBrowserProxy",
-                                   "settings.FingerprintBrowserProxy|FingerprintBrowserProxy",
-                                   "settings.FingerprintResultType|FingerprintResultType",
-                                   "settings.recordLockScreenProgress|recordLockScreenProgress",
                                    "settings.OsSyncBrowserProxy|OsSyncBrowserProxy",
-                                   "settings.FingerprintInfo|FingerprintInfo",
-                                   "settings.FingerprintSetupStep|FingerprintSetupStep",
-                                   "settings.FingerprintAttempt|FingerprintAttempt",
-                                   "settings.FingerprintScan|FingerprintScan",
-                                   "settings.KerberosAccount|KerberosAccount",
                                    "settings.OsSyncPrefs|OsSyncPrefs",
+                                   "settings.recordLockScreenProgress|recordLockScreenProgress",
+                                   "settings.recordSettingChange|recordSettingChange",
+                                   "settings.Route|Route",
+                                   "settings.RouteObserverBehavior|RouteObserverBehavior",
+                                   "settings.Router|Router",
+                                   "settings.routes|routes",
+                                   "settings.SmartLockSignInEnabledState|SmartLockSignInEnabledState",
                                    "settings.ValidateKerberosConfigResult|ValidateKerberosConfigResult",
+                                   "settings.WallpaperBrowserProxy|WallpaperBrowserProxy",
                                  ]
 
 os_settings_auto_imports = settings_auto_imports +
                            cr_components_chromeos_auto_imports +
                            cr_elements_chromeos_auto_imports + [
-                             "chrome/browser/resources/settings/chromeos/ambient_mode_page/constants.html|AmbientModeTopicSource,AmbientModeSettings",
                              "chrome/browser/resources/settings/chromeos/ambient_mode_page/ambient_mode_browser_proxy.html|AmbientModeBrowserProxy,AmbientModeBrowserProxyImpl",
+                             "chrome/browser/resources/settings/chromeos/ambient_mode_page/constants.html|AmbientModeTopicSource,AmbientModeSettings",
                              "chrome/browser/resources/settings/chromeos/deep_linking_behavior.html|DeepLinkingBehavior",
                              "chrome/browser/resources/settings/chromeos/metrics_recorder.html|recordSettingChange",
+                             "chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_browser_proxy.html|MultiDeviceBrowserProxy,MultiDeviceBrowserProxyImpl",
                              "chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_constants.html|MultiDeviceSettingsMode,MultiDeviceFeature,MultiDeviceFeatureState,MultiDevicePageContentData,SmartLockSignInEnabledState",
                              "chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_behavior.html|MultiDeviceFeatureBehavior",
                              "chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_browser_proxy.html|MultiDeviceBrowserProxy,MultiDeviceBrowserProxyImpl",
-                             "chrome/browser/resources/settings/chromeos/os_people_page/kerberos_accounts_browser_proxy.html|KerberosAccount,KerberosAccountsBrowserProxyImpl,KerberosAccountsBrowserProxy,KerberosErrorType,KerberosConfigErrorCode,ValidateKerberosConfigResult",
-                             "chrome/browser/resources/settings/chromeos/os_people_page/os_sync_browser_proxy.html|OsSyncBrowserProxy,OsSyncBrowserProxyImpl,OsSyncPrefs",
-                             "chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.html|LockScreenUnlockType,LockStateBehaviorImpl,LockStateBehavior",
+                             "chrome/browser/resources/settings/chromeos/os_languages_page/input_method_util.html|generateOptions,getFirstPartyInputMethodEngineId,getOptionLabelName,getOptionMenuItems,getOptionUiType,getOptionUrl,hasOptionsPageInSettings,InputToolCode,isNumberValue,OPTION_DEFAULT,OptionType,UiType",
+                             "chrome/browser/resources/settings/chromeos/os_languages_page/languages_metrics_proxy.html|LanguagesMetricsProxy, LanguagesMetricsProxyImpl, LanguagesPageInteraction",
                              "chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_browser_proxy.html|FingerprintInfo,FingerprintBrowserProxy,FingerprintResultType,FingerprintBrowserProxyImpl,FingerprintAttempt,FingerprintScan",
+                             "chrome/browser/resources/settings/chromeos/os_people_page/kerberos_accounts_browser_proxy.html|KerberosAccount,KerberosAccountsBrowserProxyImpl,KerberosAccountsBrowserProxy,KerberosErrorType,KerberosConfigErrorCode,ValidateKerberosConfigResult",
+                             "chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.html|LockScreenUnlockType,LockStateBehaviorImpl,LockStateBehavior",
+                             "chrome/browser/resources/settings/chromeos/os_people_page/os_sync_browser_proxy.html|OsSyncBrowserProxy,OsSyncBrowserProxyImpl,OsSyncPrefs",
                              "chrome/browser/resources/settings/chromeos/os_page_visibility.html|OSPageVisibility",
                              "chrome/browser/resources/settings/chromeos/os_reset_page/os_reset_browser_proxy.html|OsResetBrowserProxy,OsResetBrowserProxyImpl",
                              "chrome/browser/resources/settings/chromeos/os_route.html|routes",
@@ -74,9 +92,10 @@
                              "chrome/browser/resources/settings/people_page/sync_browser_proxy.html|SyncBrowserProxyImpl,SyncBrowserProxy,StatusAction,SyncStatus",
                              "chrome/browser/resources/settings/route.html|routes",
                              "chrome/browser/resources/settings/router.html|Router,Route,RouteObserverBehavior",
-                             "ui/webui/resources/html/polymer.html|Polymer,html,flush, afterNextRender",
-                             "ui/webui/resources/html/icon.html|getImage",
+                             "ui/webui/resources/html/assert.html|assert,assertNotReached",
                              "ui/webui/resources/html/cr.html|sendWithPromise",
+                             "ui/webui/resources/html/icon.html|getImage",
+                             "ui/webui/resources/html/polymer.html|afterNextRender,Polymer,html,flush",
                            ]
 
 os_settings_migrated_imports = settings_migrated_imports
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.js b/chrome/browser/resources/settings/chromeos/os_settings.js
index 070cb54..574cfb8 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings.js
+++ b/chrome/browser/resources/settings/chromeos/os_settings.js
@@ -3,8 +3,6 @@
 // found in the LICENSE file.
 
 import './ambient_mode_page/ambient_mode_page.m.js';
-import './os_reset_page/os_powerwash_dialog.m.js';
-import './os_reset_page/os_reset_page.m.js';
 import './localized_link/localized_link.m.js';
 import './bluetooth_page/bluetooth_page.m.js';
 import './bluetooth_page/bluetooth_subpage.m.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn
index a17d599..9a3f7f9 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_settings_page/BUILD.gn
@@ -10,6 +10,7 @@
   deps = [
     ":main_page_behavior",
     ":os_settings_page",
+    ":settings_idle_load",
   ]
 }
 
@@ -37,12 +38,18 @@
   externs_list = [ "$externs_path/pending.js" ]
 }
 
+js_library("settings_idle_load") {
+  deps = [ "//ui/webui/resources/js:assert" ]
+  externs_list = [ "$externs_path/pending_polymer.js" ]
+}
+
 # TODO: Uncomment as the Polymer3 migration makes progress.
 js_type_check("closure_compile_module") {
   is_polymer3 = true
   deps = [
     #    ":os_settings_page.m",
     ":main_page_behavior.m",
+    ":settings_idle_load.m",
   ]
 }
 
@@ -66,12 +73,22 @@
   extra_deps = [ ":modulize" ]
 }
 
+js_library("settings_idle_load.m") {
+  sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/os_settings_page/settings_idle_load.m.js" ]
+  deps = [
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/js:assert.m",
+  ]
+  extra_deps = [ ":settings_idle_load_module" ]
+}
+
 import("//tools/polymer/polymer.gni")
 
 group("polymer3_elements") {
   public_deps = [
     ":modulize",
     ":os_settings_page_module",
+    ":settings_idle_load_module",
   ]
 }
 
@@ -81,6 +98,20 @@
   html_type = "dom-module"
 }
 
+polymer_modulizer("settings_idle_load") {
+  js_file = "settings_idle_load.js"
+  html_file = "settings_idle_load.html"
+  html_type = "dom-module"
+  migrated_imports = os_settings_migrated_imports
+  auto_imports = [
+    "chrome/browser/resources/settings/chromeos/ensure_lazy_loaded.html|ensureLazyLoaded",
+    "ui/webui/resources/html/assert.html|assert",
+    "ui/webui/resources/html/polymer.html|Polymer,html,templatize,TemplateInstanceBase",
+  ]
+  namespace_rewrites = os_settings_namespace_rewrites +
+                       [ "Polymer.Templatize.templatize|templatize" ]
+}
+
 js_modulizer("modulize") {
   input_files = [ "main_page_behavior.js" ]
   namespace_rewrites = os_settings_namespace_rewrites
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/main_page_behavior.js b/chrome/browser/resources/settings/chromeos/os_settings_page/main_page_behavior.js
index 447ad653..334a9df 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_page/main_page_behavior.js
+++ b/chrome/browser/resources/settings/chromeos/os_settings_page/main_page_behavior.js
@@ -5,6 +5,7 @@
 // clang-format off
 // #import {assert} from 'chrome://resources/js/assert.m.js';
 // #import {beforeNextRender} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// #import {ensureLazyLoaded} from '../ensure_lazy_loaded.m.js';
 // #import {Route, Router, MinimumRoutes} from '../../router.m.js';
 // clang-format on
 
@@ -200,9 +201,8 @@
       /* #ignore */ Polymer.importHref(
           /* #ignore */ '/chromeos/lazy_load.html', () => {});
 
-      // TODO(jonmann): Implement lazy loading in Polymer 3.
       // Polymer 3 codepath, do not delete next line comment.
-      // #polymer3 // ensureLazyLoaded();
+      // #polymer3 ensureLazyLoaded();
 
       this.ensureSectionForRoute_(route).then(section => {
         section.classList.add('expanded');
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html
index 8f2694c..41b508d 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.html
@@ -6,6 +6,7 @@
 <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html">
 <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
 <link rel="import" href="main_page_behavior.html">
+<link rel="import" href="settings_idle_load.html">
 <link rel="import" href="../os_a11y_page/os_a11y_page.html">
 <link rel="import" href="../os_apps_page/android_apps_browser_proxy.html">
 <link rel="import" href="../os_apps_page/os_apps_page.html">
@@ -13,7 +14,6 @@
 <link rel="import" href="../os_privacy_page/os_privacy_page.html">
 <link rel="import" href="../os_search_page/os_search_page.html">
 <link rel="import" href="../personalization_page/personalization_page.html">
-<link rel="import" href="../../controls/settings_idle_load.html">
 <link rel="import" href="../../settings_page/settings_section.html">
 <link rel="import" href="../../settings_page_css.html">
 <link rel="import" href="../bluetooth_page/bluetooth_page.html">
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/settings_idle_load.html b/chrome/browser/resources/settings/chromeos/os_settings_page/settings_idle_load.html
new file mode 100644
index 0000000..b7b2b0a
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_settings_page/settings_idle_load.html
@@ -0,0 +1,11 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="chrome://resources/html/assert.html">
+
+<link rel="import" href="../ensure_lazy_loaded.html">
+
+<dom-module id="settings-idle-load">
+  <template>
+    <slot></slot>
+  </template>
+  <script src="settings_idle_load.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/settings_idle_load.js b/chrome/browser/resources/settings/chromeos/os_settings_page/settings_idle_load.js
new file mode 100644
index 0000000..ee1a1670
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/os_settings_page/settings_idle_load.js
@@ -0,0 +1,106 @@
+// 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.
+
+/**
+ * @fileoverview
+ * settings-idle-load is a simple variant of dom-if designed for lazy
+ * loading and rendering of elements that are accessed imperatively. A URL is
+ * given that holds the elements to be loaded lazily.
+ */
+Polymer({
+  is: 'settings-idle-load',
+
+  properties: {
+    /**
+     * If specified, it will be loaded via an HTML import before stamping the
+     * template.
+     */
+    url: String,
+  },
+
+  /** @private {?Element} */
+  child_: null,
+
+  /** @private {?Element|?TemplateInstanceBase} */
+  instance_: null,
+
+  /** @private {number} */
+  idleCallback_: 0,
+
+  /** @override */
+  attached() {
+    this.idleCallback_ = requestIdleCallback(() => {
+      this.get();
+    });
+  },
+
+  /** @override */
+  detached() {
+    // No-op if callback already fired.
+    cancelIdleCallback(this.idleCallback_);
+  },
+
+  /**
+   * @param {!function():!Promise} requestFn Requests the lazy module.
+   * @return {!Promise<!Element>} Resolves with the stamped child element after
+   *     the lazy module has been loaded.
+   */
+  requestLazyModule_(requestFn) {
+    return new Promise((resolve, reject) => {
+      requestFn().then(() => {
+        const template =
+            /** @type {!HTMLTemplateElement} */ (this.getContentChildren()[0]);
+        const TemplateClass = Polymer.Templatize.templatize(template, this, {
+          mutableData: false,
+          forwardHostProp: this._forwardHostPropV2,
+        });
+
+        this.instance_ = new TemplateClass();
+
+        assert(!this.child_);
+        this.child_ = this.instance_.root.firstElementChild;
+
+        this.parentNode.insertBefore(this.instance_.root, this);
+        resolve(this.child_);
+
+        this.fire('lazy-loaded');
+      }, reject);
+    });
+  },
+
+  /**
+   * @return {!Promise<Element>} Child element which has been stamped into the
+   *     DOM tree.
+   */
+  get() {
+    if (this.loading_) {
+      return this.loading_;
+    }
+
+    // clang-format off
+    // Polymer 2 codepath
+    /* #ignore */ const requestLazyModuleFn = () => {
+      /* #ignore */ return new Promise((resolve, reject) => {
+        /* #ignore */ this.importHref(this.url, resolve, reject, true);
+      /* #ignore */ });
+    /* #ignore */ };
+    // clang-format on
+
+    // Polymer 3 codepath, do not delete next line comment.
+    // #polymer3 const requestLazyModuleFn = ensureLazyLoaded;
+
+    this.loading_ = this.requestLazyModule_(requestLazyModuleFn);
+    return this.loading_;
+  },
+
+  /**
+   * @param {string} prop
+   * @param {Object} value
+   */
+  _forwardHostPropV2(prop, value) {
+    if (this.instance_) {
+      this.instance_.forwardHostProp(prop, value);
+    }
+  },
+});
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_resources_v3.grdp b/chrome/browser/resources/settings/chromeos/os_settings_resources_v3.grdp
index c020c33..88b9f0f 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_resources_v3.grdp
+++ b/chrome/browser/resources/settings/chromeos/os_settings_resources_v3.grdp
@@ -67,6 +67,58 @@
            use_base_dir="false"
            compress="false"
            type="BINDATA" />
+  <include name="IDR_OS_SETTINGS_LANGUAGES_PAGE_LANGUAGES_BROWSER_PROXY_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/languages_page/languages_browser_proxy.m.js"
+           use_base_dir="false"
+           compress="false"
+           preprocess="true"
+           type="BINDATA" />
+  <include name="IDR_OS_SETTINGS_LANGUAGES_PAGE_LANGUAGES_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/languages_page/languages.m.js"
+           use_base_dir="false"
+           compress="false"
+           preprocess="true"
+           type="BINDATA" />
+  <include name="IDR_OS_SETTINGS_LANGUAGES_PAGE_OS_ADD_LANGUAGES_DIALOG_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/chromeos/os_languages_page/os_add_languages_dialog.m.js"
+           use_base_dir="false"
+           compress="false"
+           type="BINDATA" />
+  <include name="IDR_OS_SETTINGS_LANGUAGES_PAGE_OS_INPUT_METHOD_OPTIONS_PAGE_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.m.js"
+           use_base_dir="false"
+           compress="false"
+           type="BINDATA" />
+  <include name="IDR_OS_SETTINGS_LANGUAGES_PAGE_OS_INPUT_METHOD_UTIL_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_util.m.js"
+           use_base_dir="false"
+           compress="false"
+           type="BINDATA" />
+  <include name="IDR_OS_SETTINGS_LANGUAGES_PAGE_OS_MANAGE_INPUT_METHODS_PAGE_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/chromeos/os_languages_page/manage_input_methods_page.m.js"
+           use_base_dir="false"
+           compress="false"
+           type="BINDATA" />
+  <include name="IDR_OS_SETTINGS_LANGUAGES_PAGE_LANGUAGES_METRICS_PROXY_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/chromeos/os_languages_page/languages_metrics_proxy.m.js"
+           use_base_dir="false"
+           compress="false"
+           type="BINDATA" />
+  <include name="IDR_OS_SETTINGS_LANGUAGES_PAGE_OS_LANGUAGES_PAGE_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page.m.js"
+           use_base_dir="false"
+           compress="false"
+           type="BINDATA" />
+  <include name="IDR_OS_SETTINGS_LANGUAGES_PAGE_OS_LANGUAGES_SECTION_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.m.js"
+           use_base_dir="false"
+           compress="false"
+           type="BINDATA" />
+  <include name="IDR_OS_SETTINGS_LANGUAGES_PAGE_SMART_INPUTS_PAGE_M_JS"
+           file="${root_gen_dir}/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.m.js"
+           use_base_dir="false"
+           compress="false"
+           type="BINDATA" />
   <include name="IDR_OS_SETTINGS_PEOPLE_PAGE_ACCOUNT_MANAGER_BROWSER_PROXY_M_JS"
            file="${root_gen_dir}/chrome/browser/resources/settings/people_page/account_manager_browser_proxy.m.js"
            use_base_dir="false"
@@ -452,6 +504,14 @@
            file="i18n_setup.js"
            compress="false"
            type="BINDATA" />
+  <include name="IDR_OS_SETTINGS_ENSURE_LAZY_LOADED_JS"
+          file="chromeos/ensure_lazy_loaded.m.js"
+          preprocess="true"
+          compress="false" type="BINDATA" />
+  <include name="IDR_OS_SETTINGS_LAZY_LOAD_V3_JS"
+           file="chromeos/lazy_load.js"
+           compress="false"
+           type="BINDATA" />
   <include name="IDR_OS_SETTINGS_OS_SETTINGS_V3_HTML"
            file="chromeos/os_settings_v3.html"
            compress="false"
diff --git a/chrome/browser/resources/settings/controls/settings_idle_load.js b/chrome/browser/resources/settings/controls/settings_idle_load.js
index 3098c24..2746802c 100644
--- a/chrome/browser/resources/settings/controls/settings_idle_load.js
+++ b/chrome/browser/resources/settings/controls/settings_idle_load.js
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// TODO(dpapad): Complete Polymer 3 migration of this file.
+
 /**
  * @fileoverview
  * settings-idle-load is a simple variant of dom-if designed for lazy
diff --git a/chrome/browser/resources/settings/os_settings_resources.grd b/chrome/browser/resources/settings/os_settings_resources.grd
index d065fa6..84697691 100644
--- a/chrome/browser/resources/settings/os_settings_resources.grd
+++ b/chrome/browser/resources/settings/os_settings_resources.grd
@@ -362,7 +362,7 @@
                  file="chromeos/os_settings_page/os_settings_page.html"
                  compress="false" type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_ENSURE_LAZY_LOADED_HTML"
-                 file="ensure_lazy_loaded.html"
+                 file="chromeos/ensure_lazy_loaded.html"
                  compress="false" type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_EXTENSION_CONTROL_BROWSER_PROXY_JS"
                  file="extension_control_browser_proxy.js"
@@ -492,12 +492,6 @@
       <structure name="IDR_OS_SETTINGS_CONTROLS_RADIO_GROUP_JS"
                  file="controls/settings_radio_group.js"
                  compress="false" type="chrome_html" />
-      <structure name="IDR_OS_SETTINGS_CONTROLS_SETTINGS_IDLE_LOAD_HTML"
-                 file="controls/settings_idle_load.html"
-                 compress="false" type="chrome_html" />
-      <structure name="IDR_OS_SETTINGS_CONTROLS_SETTINGS_IDLE_LOAD_JS"
-                 file="controls/settings_idle_load.js"
-                 compress="false" type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_CONTROLS_SLIDER_HTML"
                  file="controls/settings_slider.html"
                  compress="false" type="chrome_html" />
@@ -639,6 +633,12 @@
                  file="chromeos/os_settings_icons_css.html"
                  flattenhtml="true"
                  compress="false" type="chrome_html" />
+      <structure name="IDR_OS_SETTINGS_OS_SETTINGS_PAGE_SETTINGS_IDLE_LOAD_HTML"
+                 file="chromeos/os_settings_page/settings_idle_load.html"
+                 compress="false" type="chrome_html" />
+      <structure name="IDR_OS_SETTINGS_OS_SETTINGS_PAGE_SETTINGS_IDLE_LOAD_JS"
+                 file="chromeos/os_settings_page/settings_idle_load.js"
+                 compress="false" type="chrome_html" />
       <structure name="IDR_OS_SETTINGS_POWERWASH_DIALOG_HTML"
                  file="chromeos/os_reset_page/os_powerwash_dialog.html"
                  compress="false" type="chrome_html" />
diff --git a/chrome/browser/resources/settings/os_settings_resources_vulcanized.grd b/chrome/browser/resources/settings/os_settings_resources_vulcanized.grd
index e36fc1ee3..07f8b8d 100644
--- a/chrome/browser/resources/settings/os_settings_resources_vulcanized.grd
+++ b/chrome/browser/resources/settings/os_settings_resources_vulcanized.grd
@@ -90,6 +90,16 @@
       <include name="IDR_OS_SETTINGS_OS_SETTINGS_V3_HTML"
                file="chromeos/os_settings_v3.html"
                type="BINDATA" />
+      <include name="IDR_OS_SETTINGS_LAZY_LOAD_ROLLUP_JS"
+               file="${root_gen_dir}\chrome\browser\resources\settings\chromeos\lazy_load.rollup.js"
+               preprocess="true"
+               type="BINDATA"
+               use_base_dir="false" />
+      <include name="IDR_OS_SETTINGS_SHARED_ROLLUP_JS"
+               file="${root_gen_dir}\chrome\browser\resources\settings\chromeos\shared.rollup.js"
+               preprocess="true"
+               type="BINDATA"
+               use_base_dir="false" />
     </includes>
   </release>
 </grit>
diff --git a/chrome/browser/resources/signin/profile_picker/manage_profiles_browser_proxy.js b/chrome/browser/resources/signin/profile_picker/manage_profiles_browser_proxy.js
index 8c10d78..ad46615 100644
--- a/chrome/browser/resources/signin/profile_picker/manage_profiles_browser_proxy.js
+++ b/chrome/browser/resources/signin/profile_picker/manage_profiles_browser_proxy.js
@@ -50,6 +50,9 @@
    * suggested theme info, once it has been retrieved.
    */
   getNewProfileSuggestedThemeInfo() {}
+
+  /** Loads Google sign in page.*/
+  loadSignInProfileCreationFlow() {}
 }
 
 /** @implements {ManageProfilesBrowserProxy} */
@@ -73,6 +76,11 @@
   getNewProfileSuggestedThemeInfo() {
     return sendWithPromise('getNewProfileSuggestedThemeInfo');
   }
+
+  /** @override */
+  loadSignInProfileCreationFlow() {
+    chrome.send('loadSignInProfileCreationFlow');
+  }
 }
 
 addSingletonGetter(ManageProfilesBrowserProxyImpl);
diff --git a/chrome/browser/resources/signin/profile_picker/navigation_behavior.js b/chrome/browser/resources/signin/profile_picker/navigation_behavior.js
index 2abd1c4..7bc103a 100644
--- a/chrome/browser/resources/signin/profile_picker/navigation_behavior.js
+++ b/chrome/browser/resources/signin/profile_picker/navigation_behavior.js
@@ -84,14 +84,7 @@
  */
 export function navigateTo(route) {
   assert([Routes.MAIN, Routes.NEW_PROFILE].includes(route));
-  history.pushState(
-      {
-        route: route,
-        step: computeStep(route),
-        isFirst: false,
-      },
-      '', route === Routes.MAIN ? '/' : `/${route}`);
-  notifyObservers();
+  navigateToStep(route, computeStep(route));
 }
 
 /**
@@ -113,7 +106,14 @@
  * @param {string} step
  */
 export function navigateToStep(route, step) {
-  // TODO(crbug.com/1063856): Add implementation.
+  history.pushState(
+      {
+        route: route,
+        step: step,
+        isFirst: false,
+      },
+      '', route === Routes.MAIN ? '/' : `/${route}`);
+  notifyObservers();
 }
 
 /** @polymerBehavior */
diff --git a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.html b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.html
index ba3186fd..2e48da48 100644
--- a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.html
+++ b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/profile_type_choice.html
@@ -34,6 +34,19 @@
     width: 100%;
   }
 
+  #bannerContainer > img {
+    --avatar-size: 100px;
+    border: 2px solid var(--md-background-color);
+    border-radius: 50%;
+    bottom: calc(var(--avatar-size)/-2);
+    height: var(--avatar-size);
+    left: 0;
+    margin: auto;
+    position: absolute;
+    right: 0;
+    width: var(--avatar-size);
+  }
+
   #notNowButton {
     background: none;
     border: none;
@@ -65,6 +78,7 @@
         on-click="onTapBack_" aria-label="$i18n{backButtonLabel}">
     </cr-icon-button>
     <div id="banner"></div>
+    <img src="chrome://theme/IDR_PROFILE_AVATAR_PLACEHOLDER_LARGE">
 </div>
 <div class="title-container">
   <h2>$i18n{profileTypeChoiceTitle}</h2>
diff --git a/chrome/browser/resources/signin/profile_picker/profile_picker_app.js b/chrome/browser/resources/signin/profile_picker/profile_picker_app.js
index 53be0df..2f41a02 100644
--- a/chrome/browser/resources/signin/profile_picker/profile_picker_app.js
+++ b/chrome/browser/resources/signin/profile_picker/profile_picker_app.js
@@ -11,7 +11,7 @@
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {AutogeneratedThemeColorInfo, ManageProfilesBrowserProxy, ManageProfilesBrowserProxyImpl} from './manage_profiles_browser_proxy.js';
-import {NavigationBehavior, Routes} from './navigation_behavior.js';
+import {NavigationBehavior, ProfileCreationSteps, Routes} from './navigation_behavior.js';
 import {ensureLazyLoaded} from './profile_creation_flow/ensure_lazy_loaded.js';
 
 Polymer({
@@ -50,6 +50,11 @@
    * @private
    */
   onRouteChange(route, step) {
+    if (step == ProfileCreationSteps.LOAD_SIGNIN) {
+      this.manageProfilesBrowserProxy_.loadSignInProfileCreationFlow();
+      return;
+    }
+
     const setStep = () => {
       this.$.viewManager.switchView(step, 'fade-in', 'no-animation');
     };
diff --git a/chrome/browser/safe_browsing/delayed_warning_navigation_throttle.cc b/chrome/browser/safe_browsing/delayed_warning_navigation_throttle.cc
index c5b6cf5..6425999 100644
--- a/chrome/browser/safe_browsing/delayed_warning_navigation_throttle.cc
+++ b/chrome/browser/safe_browsing/delayed_warning_navigation_throttle.cc
@@ -6,8 +6,8 @@
 
 #include "base/feature_list.h"
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/safe_browsing/user_interaction_observer.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "components/safe_browsing/core/features.h"
 #include "content/public/browser/navigation_handle.h"
 
diff --git a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
index 093cbce..17abf5c 100644
--- a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
@@ -45,7 +45,6 @@
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/extensions/browsertest_util.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/safe_browsing/client_side_detection_service.h"
@@ -64,6 +63,7 @@
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/safe_browsing/buildflags.h"
 #include "components/safe_browsing/core/db/database_manager.h"
 #include "components/safe_browsing/core/db/metadata.pb.h"
diff --git a/chrome/browser/safe_browsing/ui_manager.cc b/chrome/browser/safe_browsing/ui_manager.cc
index 210d7af..b3bce9df 100644
--- a/chrome/browser/safe_browsing/ui_manager.cc
+++ b/chrome/browser/safe_browsing/ui_manager.cc
@@ -15,7 +15,6 @@
 #include "chrome/browser/interstitials/enterprise_util.h"
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/safe_browsing_blocking_page.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
@@ -24,6 +23,7 @@
 #include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "components/safe_browsing/content/browser/threat_details.h"
 #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
 #include "components/safe_browsing/core/features.h"
diff --git a/chrome/browser/safe_browsing/url_checker_delegate_impl.cc b/chrome/browser/safe_browsing/url_checker_delegate_impl.cc
index 4b84751..a602bb0 100644
--- a/chrome/browser/safe_browsing/url_checker_delegate_impl.cc
+++ b/chrome/browser/safe_browsing/url_checker_delegate_impl.cc
@@ -8,11 +8,11 @@
 #include "base/feature_list.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_io_data.h"
 #include "chrome/browser/safe_browsing/ui_manager.h"
 #include "chrome/browser/safe_browsing/user_interaction_observer.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "components/prerender/common/prerender_final_status.h"
 #include "components/safe_browsing/buildflags.h"
 #include "components/safe_browsing/content/triggers/suspicious_site_trigger.h"
diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc
index a0deb60..780ea02 100644
--- a/chrome/browser/sessions/session_restore_browsertest.cc
+++ b/chrome/browser/sessions/session_restore_browsertest.cc
@@ -1139,12 +1139,17 @@
 
 IN_PROC_BROWSER_TEST_F(SessionRestoreTest, StartupPagesWithOnlyNtp) {
   ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
+  content::WebContentsDestroyedWatcher original_tab_destroyed_watcher(
+      browser()->tab_strip_model()->GetWebContentsAt(0));
+
   SessionStartupPref pref(SessionStartupPref::URLS);
   pref.urls.push_back(url1_);
   pref.urls.push_back(url2_);
   SessionStartupPref::SetStartupPref(browser()->profile(), pref);
 
   SessionRestore::OpenStartupPagesAfterCrash(browser());
+  // Wait until the original tab finished closing.
+  original_tab_destroyed_watcher.Wait();
 
   ASSERT_EQ(1u, active_browser_list_->size());
   ASSERT_EQ(2, browser()->tab_strip_model()->count());
@@ -1755,6 +1760,8 @@
   ASSERT_EQ(0, new_browser->tab_strip_model()->active_index());
   // Use the existing tab to navigate to the NTP.
   ui_test_utils::NavigateToURL(new_browser, GURL(chrome::kChromeUINewTabURL));
+  content::WebContentsDestroyedWatcher existing_tab_destroyed_watcher(
+      new_browser->tab_strip_model()->GetWebContentsAt(0));
 
   // Restore the session again, clobbering the existing tab.
   SessionRestore::RestoreSession(
@@ -1762,6 +1769,9 @@
       SessionRestore::CLOBBER_CURRENT_TAB | SessionRestore::SYNCHRONOUS,
       std::vector<GURL>());
 
+  // Wait until the existing tab finished closing.
+  existing_tab_destroyed_watcher.Wait();
+
   // 2 tabs should have been restored, with the existing tab clobbered, giving
   // us a total of 2 tabs.
   ASSERT_EQ(2, new_browser->tab_strip_model()->count());
diff --git a/chrome/browser/sharesheet/sharesheet_service.cc b/chrome/browser/sharesheet/sharesheet_service.cc
index 72884e4f..64e50d8 100644
--- a/chrome/browser/sharesheet/sharesheet_service.cc
+++ b/chrome/browser/sharesheet/sharesheet_service.cc
@@ -30,7 +30,6 @@
 SharesheetService::SharesheetService(Profile* profile)
     : sharesheet_action_cache_(std::make_unique<SharesheetActionCache>()),
       app_service_proxy_(apps::AppServiceProxyFactory::GetForProfile(profile)) {
-  DCHECK(app_service_proxy_);
 }
 
 SharesheetService::~SharesheetService() = default;
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_observer.cc b/chrome/browser/supervised_user/supervised_user_navigation_observer.cc
index f9789673..7995c78 100644
--- a/chrome/browser/supervised_user/supervised_user_navigation_observer.cc
+++ b/chrome/browser/supervised_user/supervised_user_navigation_observer.cc
@@ -86,7 +86,7 @@
 }
 
 void SupervisedUserNavigationObserver::DidFinishNavigation(
-    content::NavigationHandle* navigation_handle) {
+      content::NavigationHandle* navigation_handle) {
   if (!navigation_handle->HasCommitted())
     return;
 
@@ -108,15 +108,13 @@
     auto* render_frame_host = web_contents()->GetMainFrame();
     int process_id = render_frame_host->GetProcess()->GetID();
     int routing_id = render_frame_host->GetRoutingID();
-    bool skip_manual_parent_filter =
-        url_filter_->ShouldSkipParentManualAllowlistFiltering(web_contents());
+
     url_filter_->GetFilteringBehaviorForURLWithAsyncChecks(
         web_contents()->GetLastCommittedURL(),
         base::BindOnce(
             &SupervisedUserNavigationObserver::URLFilterCheckCallback,
             weak_ptr_factory_.GetWeakPtr(), navigation_handle->GetURL(),
-            process_id, routing_id),
-        skip_manual_parent_filter);
+            process_id, routing_id));
   }
 }
 
@@ -151,15 +149,13 @@
   auto* main_frame = web_contents()->GetMainFrame();
   int main_frame_process_id = main_frame->GetProcess()->GetID();
   int routing_id = main_frame->GetRoutingID();
-  bool skip_manual_parent_filter =
-      url_filter_->ShouldSkipParentManualAllowlistFiltering(web_contents());
+
   url_filter_->GetFilteringBehaviorForURLWithAsyncChecks(
       web_contents()->GetLastCommittedURL(),
       base::BindOnce(&SupervisedUserNavigationObserver::URLFilterCheckCallback,
                      weak_ptr_factory_.GetWeakPtr(),
                      web_contents()->GetLastCommittedURL(),
-                     main_frame_process_id, routing_id),
-      skip_manual_parent_filter);
+                     main_frame_process_id, routing_id));
 
   MaybeUpdateRequestedHosts();
 
@@ -291,15 +287,13 @@
     return;
 
   const GURL& last_committed_url = render_frame_host->GetLastCommittedURL();
-  bool skip_manual_parent_filter =
-      url_filter_->ShouldSkipParentManualAllowlistFiltering(web_contents());
+
   url_filter_->GetFilteringBehaviorForURLWithAsyncChecks(
       web_contents()->GetLastCommittedURL(),
       base::BindOnce(&SupervisedUserNavigationObserver::URLFilterCheckCallback,
                      weak_ptr_factory_.GetWeakPtr(), last_committed_url,
                      render_frame_host->GetProcess()->GetID(),
-                     render_frame_host->GetRoutingID()),
-      skip_manual_parent_filter);
+                     render_frame_host->GetRoutingID()));
 }
 
 void SupervisedUserNavigationObserver::GoBack() {
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_throttle.cc b/chrome/browser/supervised_user/supervised_user_navigation_throttle.cc
index f81ae72..f053afec 100644
--- a/chrome/browser/supervised_user/supervised_user_navigation_throttle.cc
+++ b/chrome/browser/supervised_user/supervised_user_navigation_throttle.cc
@@ -158,15 +158,9 @@
   deferred_ = false;
   DCHECK_EQ(SupervisedUserURLFilter::INVALID, behavior_);
   GURL url = navigation_handle()->GetURL();
-
-  bool skip_manual_parent_filter =
-      url_filter_->ShouldSkipParentManualAllowlistFiltering(
-          navigation_handle()->GetWebContents()->GetOutermostWebContents());
   bool got_result = url_filter_->GetFilteringBehaviorForURLWithAsyncChecks(
-      url,
-      base::BindOnce(&SupervisedUserNavigationThrottle::OnCheckDone,
-                     weak_ptr_factory_.GetWeakPtr(), url),
-      skip_manual_parent_filter);
+      url, base::BindOnce(&SupervisedUserNavigationThrottle::OnCheckDone,
+                          weak_ptr_factory_.GetWeakPtr(), url));
   DCHECK_EQ(got_result, behavior_ != SupervisedUserURLFilter::INVALID);
   // If we got a "not blocked" result synchronously, don't defer.
   deferred_ = !got_result || (behavior_ == SupervisedUserURLFilter::BLOCK);
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc b/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc
index 2e397037..6561fc0 100644
--- a/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc
+++ b/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc
@@ -26,9 +26,7 @@
 #include "chrome/browser/supervised_user/supervised_user_url_filter.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/common/webui_url_constants.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
@@ -235,36 +233,6 @@
   EXPECT_TRUE(loaded2);
 }
 
-IN_PROC_BROWSER_TEST_F(SupervisedUserNavigationThrottleTest,
-                       AllowEDUCoexistenceInnerWebContents) {
-  BlockHost(kExampleHost2);
-  GURL manually_blocked_url = embedded_test_server()->GetURL(
-      kExampleHost2, "/supervised_user/with_iframes.html");
-
-  ui_test_utils::NavigateToURL(browser(),
-                               GURL(chrome::kChromeUIEDUCoexistenceLoginURL));
-  // Get the top level WebContents.
-  content::WebContents* contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  EXPECT_EQ(contents->GetURL(), GURL(chrome::kChromeUIEDUCoexistenceLoginURL));
-
-  // Get the inner WebContents.
-  std::vector<content::WebContents*> inner_web_contents =
-      contents->GetInnerWebContents();
-  EXPECT_EQ(inner_web_contents.size(), 1u);
-
-  content::WebContents* webview_element = inner_web_contents[0];
-  NavigationFinishedWaiter waiter(webview_element, manually_blocked_url);
-  webview_element->GetController().LoadURLWithParams(
-      NavigationController::LoadURLParams(manually_blocked_url));
-  waiter.Wait();
-
-  // Make sure that there is no error page in the inner web content.
-  EXPECT_NE(
-      webview_element->GetController().GetLastCommittedEntry()->GetPageType(),
-      content::PAGE_TYPE_ERROR);
-}
-
 class SupervisedUserIframeFilterTest
     : public SupervisedUserNavigationThrottleTest {
  protected:
diff --git a/chrome/browser/supervised_user/supervised_user_service.cc b/chrome/browser/supervised_user/supervised_user_service.cc
index 7cb7b09d..544f0b2 100644
--- a/chrome/browser/supervised_user/supervised_user_service.cc
+++ b/chrome/browser/supervised_user/supervised_user_service.cc
@@ -583,7 +583,6 @@
   SupervisedUserURLFilter::FilteringBehavior behavior =
       SupervisedUserURLFilter::BehaviorFromInt(behavior_value);
   url_filter_.SetDefaultFilteringBehavior(behavior);
-  UpdateAsyncUrlChecker();
 
   for (SupervisedUserServiceObserver& observer : observer_list_)
     observer.OnURLFilterChanged();
@@ -604,19 +603,8 @@
     // Do nothing - we'll check the setting again when the load finishes.
   }
 
-  UpdateAsyncUrlChecker();
-}
-
-void SupervisedUserService::UpdateAsyncUrlChecker() {
-  int behavior_value = profile_->GetPrefs()->GetInteger(
-      prefs::kDefaultSupervisedUserFilteringBehavior);
-  SupervisedUserURLFilter::FilteringBehavior behavior =
-      SupervisedUserURLFilter::BehaviorFromInt(behavior_value);
-
   bool use_online_check =
-      supervised_users::IsSafeSitesOnlineCheckEnabled(profile_) ||
-      behavior == SupervisedUserURLFilter::FilteringBehavior::BLOCK;
-
+      supervised_users::IsSafeSitesOnlineCheckEnabled(profile_);
   if (use_online_check != url_filter_.HasAsyncURLChecker()) {
     if (use_online_check) {
       url_filter_.InitAsyncURLChecker(
diff --git a/chrome/browser/supervised_user/supervised_user_service.h b/chrome/browser/supervised_user/supervised_user_service.h
index f1cb977..8bae30f5 100644
--- a/chrome/browser/supervised_user/supervised_user_service.h
+++ b/chrome/browser/supervised_user/supervised_user_service.h
@@ -333,8 +333,6 @@
 
   void OnSafeSitesSettingChanged();
 
-  void UpdateAsyncUrlChecker();
-
   void OnSiteListsChanged(
       const std::vector<scoped_refptr<SupervisedUserSiteList>>& site_lists);
 
diff --git a/chrome/browser/supervised_user/supervised_user_url_filter.cc b/chrome/browser/supervised_user/supervised_user_url_filter.cc
index 34708684..eb3e4417 100644
--- a/chrome/browser/supervised_user/supervised_user_url_filter.cc
+++ b/chrome/browser/supervised_user/supervised_user_url_filter.cc
@@ -18,7 +18,6 @@
 #include "base/macros.h"
 #include "base/no_destructor.h"
 #include "base/stl_util.h"
-#include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -29,13 +28,11 @@
 #include "chrome/browser/supervised_user/kids_management_url_checker_client.h"
 #include "chrome/browser/supervised_user/supervised_user_blacklist.h"
 #include "chrome/common/chrome_features.h"
-#include "chrome/common/webui_url_constants.h"
 #include "components/policy/core/browser/url_util.h"
 #include "components/url_formatter/url_formatter.h"
 #include "components/url_matcher/url_matcher.h"
 #include "components/variations/service/variations_service.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/browser/web_contents.h"
 #include "extensions/buildflags/buildflags.h"
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -111,9 +108,6 @@
 const char kPlayStoreHost[] = "play.google.com";
 const char kPlayTermsPath[] = "/about/play-terms";
 
-// accounts.google.com used for login:
-const char kAccountsGoogleUrl[] = "https://accounts.google.com";
-
 // This class encapsulates all the state that is required during construction of
 // a new SupervisedUserURLFilter::Contents.
 class FilterBuilder {
@@ -231,18 +225,6 @@
 }
 
 // static
-bool SupervisedUserURLFilter::ShouldSkipParentManualAllowlistFiltering(
-    content::WebContents* contents) {
-  // Note that |contents| can be an inner WebContents. Get the outer most
-  // WebContents and check if it belongs to the EDUCoexistence login flow.
-  content::WebContents* outer_most_content =
-      contents->GetOutermostWebContents();
-
-  return outer_most_content->GetURL() ==
-         GURL(chrome::kChromeUIEDUCoexistenceLoginURL);
-}
-
-// static
 SupervisedUserURLFilter::FilteringBehavior
 SupervisedUserURLFilter::BehaviorFromInt(int behavior_value) {
   DCHECK_GE(behavior_value, ALLOW);
@@ -362,12 +344,10 @@
   }
 #endif
 
-  // Allow navigations to whitelisted origins (currently families.google.com and
-  // accounts.google.com).
+  // Allow navigations to whitelisted origins (currently families.google.com).
   static const base::NoDestructor<base::flat_set<GURL>> kWhitelistedOrigins(
       base::flat_set<GURL>({GURL(kFamiliesUrl).GetOrigin(),
-                            GURL(kFamiliesSecureUrl).GetOrigin(),
-                            GURL(kAccountsGoogleUrl).GetOrigin()}));
+                            GURL(kFamiliesSecureUrl).GetOrigin()}));
   if (base::Contains(*kWhitelistedOrigins, effective_url.GetOrigin()))
     return ALLOW;
 
@@ -465,27 +445,17 @@
 
 bool SupervisedUserURLFilter::GetFilteringBehaviorForURLWithAsyncChecks(
     const GURL& url,
-    FilteringBehaviorCallback callback,
-    bool skip_manual_parent_filter) const {
-  if (!skip_manual_parent_filter) {
-    supervised_user_error_page::FilteringBehaviorReason reason =
-        supervised_user_error_page::DEFAULT;
-    FilteringBehavior behavior =
-        GetFilteringBehaviorForURL(url, false, &reason);
-    // Any non-default reason trumps the async checker.
-    // Also, if we're blocking anyway, then there's no need to check it.
-    if (reason != supervised_user_error_page::DEFAULT || behavior == BLOCK ||
-        !async_url_checker_) {
-      std::move(callback).Run(behavior, reason, false);
-      for (Observer& observer : observers_)
-        observer.OnURLChecked(url, behavior, reason, false);
-      return true;
-    }
-  }
-
-  if (!async_url_checker_) {
-    std::move(callback).Run(FilteringBehavior::ALLOW,
-                            supervised_user_error_page::DEFAULT, false);
+    FilteringBehaviorCallback callback) const {
+  supervised_user_error_page::FilteringBehaviorReason reason =
+      supervised_user_error_page::DEFAULT;
+  FilteringBehavior behavior = GetFilteringBehaviorForURL(url, false, &reason);
+  // Any non-default reason trumps the async checker.
+  // Also, if we're blocking anyway, then there's no need to check it.
+  if (reason != supervised_user_error_page::DEFAULT || behavior == BLOCK ||
+      !async_url_checker_) {
+    std::move(callback).Run(behavior, reason, false);
+    for (Observer& observer : observers_)
+      observer.OnURLChecked(url, behavior, reason, false);
     return true;
   }
 
@@ -641,8 +611,11 @@
     const GURL& url,
     safe_search_api::Classification classification,
     bool uncertain) const {
+  DCHECK(default_behavior_ != BLOCK);
+
   FilteringBehavior behavior =
       GetBehaviorFromSafeSearchClassification(classification);
+
   std::move(callback).Run(behavior, supervised_user_error_page::ASYNC_CHECKER,
                           uncertain);
   for (Observer& observer : observers_) {
diff --git a/chrome/browser/supervised_user/supervised_user_url_filter.h b/chrome/browser/supervised_user/supervised_user_url_filter.h
index 2871f7d..f14ead53 100644
--- a/chrome/browser/supervised_user/supervised_user_url_filter.h
+++ b/chrome/browser/supervised_user/supervised_user_url_filter.h
@@ -27,10 +27,6 @@
 class TaskRunner;
 }
 
-namespace content {
-class WebContents;
-}  // namespace content
-
 namespace network {
 class SharedURLLoaderFactory;
 }  // namespace network
@@ -79,11 +75,6 @@
   SupervisedUserURLFilter();
   ~SupervisedUserURLFilter();
 
-  // Returns true if the parental allowlist/blocklist should be skipped in
-  // |contents|. SafeSearch filtering is still applied to |contents|.
-  static bool ShouldSkipParentManualAllowlistFiltering(
-      content::WebContents* contents);
-
   static FilteringBehavior BehaviorFromInt(int behavior_value);
 
   static bool ReasonIsAutomatic(
@@ -124,13 +115,10 @@
   // Like |GetFilteringBehaviorForURL|, but also includes asynchronous checks
   // against a remote service. If the result is already determined by the
   // synchronous checks, then |callback| will be called synchronously.
-  // Returns true if |callback| was called synchronously. If
-  // |skip_manual_parent_filter| is set to true, it only uses the asynchronous
-  // safe search checks.
+  // Returns true if |callback| was called synchronously.
   bool GetFilteringBehaviorForURLWithAsyncChecks(
       const GURL& url,
-      FilteringBehaviorCallback callback,
-      bool skip_manual_parent_filter = false) const;
+      FilteringBehaviorCallback callback) const;
 
   // Gets all the whitelists that the url is part of. Returns id->name of each
   // whitelist.
diff --git a/chrome/browser/supervised_user/supervised_user_url_filter_unittest.cc b/chrome/browser/supervised_user/supervised_user_url_filter_unittest.cc
index 72533e1..df9ca707 100644
--- a/chrome/browser/supervised_user/supervised_user_url_filter_unittest.cc
+++ b/chrome/browser/supervised_user/supervised_user_url_filter_unittest.cc
@@ -73,11 +73,10 @@
   void ExpectURLCheckMatches(
       const std::string& url,
       SupervisedUserURLFilter::FilteringBehavior expected_behavior,
-      supervised_user_error_page::FilteringBehaviorReason expected_reason,
-      bool skip_manual_parent_filter = false) {
+      supervised_user_error_page::FilteringBehaviorReason expected_reason) {
     bool called_synchronously =
-        filter_.GetFilteringBehaviorForURLWithAsyncChecks(
-            GURL(url), base::DoNothing(), skip_manual_parent_filter);
+        filter_.GetFilteringBehaviorForURLWithAsyncChecks(GURL(url),
+                                                          base::DoNothing());
     ASSERT_TRUE(called_synchronously);
 
     EXPECT_EQ(behavior_, expected_behavior);
diff --git a/chrome/browser/sync/test/integration/password_manager_sync_test.cc b/chrome/browser/sync/test/integration/password_manager_sync_test.cc
index 49a0015c..1ec55fb 100644
--- a/chrome/browser/sync/test/integration/password_manager_sync_test.cc
+++ b/chrome/browser/sync/test/integration/password_manager_sync_test.cc
@@ -362,7 +362,7 @@
       test_signin_client_factory_;
 
   // A test server instance that runs on HTTPS (as opposed to the default
-  // |embedded_test_server()). This is necessary to simulate Gaia pages, which
+  // |embedded_test_server()|). This is necessary to simulate Gaia pages, which
   // must be on a secure (cryptographic) scheme.
   net::EmbeddedTestServer https_test_server_{
       net::EmbeddedTestServer::TYPE_HTTPS};
diff --git a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
index 89eb3f1..a2ccdf2 100644
--- a/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_sessions_sync_test.cc
@@ -591,10 +591,8 @@
   ExpectNavigationChain({first_url, second_url});
 }
 
-// Flaky for reasons that likely have nothing to do with the test itself. See
-// crbug.com/1043899 and crbug.com/992207.
 IN_PROC_BROWSER_TEST_F(SingleClientSessionsSyncTest,
-                       DISABLED_NavigationChainAlteredDestructively) {
+                       NavigationChainAlteredDestructively) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
   ASSERT_TRUE(CheckInitialState(0));
 
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 4a9044dd..e75127c 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -470,6 +470,7 @@
     "//components/permissions",
     "//components/policy/core/browser",
     "//components/pref_registry",
+    "//components/prerender/browser",
     "//components/previews/content",
     "//components/previews/core",
     "//components/proxy_config",
diff --git a/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc b/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
index d3874d3..d5905c2d 100644
--- a/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
+++ b/chrome/browser/ui/app_list/app_list_client_impl_browsertest.cc
@@ -132,7 +132,6 @@
 
   apps::AppServiceProxy* app_service_proxy_ =
       apps::AppServiceProxyFactory::GetForProfile(profile());
-  DCHECK(app_service_proxy_);
   app_service_proxy_->FlushMojoCallsForTesting();
 
   run_loop.RunUntilIdle();
diff --git a/chrome/browser/ui/app_list/app_list_controller_delegate.cc b/chrome/browser/ui/app_list/app_list_controller_delegate.cc
index e276c37..3ef7ee8 100644
--- a/chrome/browser/ui/app_list/app_list_controller_delegate.cc
+++ b/chrome/browser/ui/app_list/app_list_controller_delegate.cc
@@ -86,7 +86,6 @@
                                                   const std::string& app_id) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy);
   DCHECK_NE(proxy->AppRegistryCache().GetAppType(app_id),
             apps::mojom::AppType::kUnknown);
 
@@ -107,7 +106,6 @@
                                              const std::string& app_id) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy);
   proxy->Uninstall(app_id, GetAppListWindow());
 }
 
diff --git a/chrome/browser/ui/app_list/app_list_syncable_service.cc b/chrome/browser/ui/app_list/app_list_syncable_service.cc
index 73020ff8..eb38ddb 100644
--- a/chrome/browser/ui/app_list/app_list_syncable_service.cc
+++ b/chrome/browser/ui/app_list/app_list_syncable_service.cc
@@ -120,8 +120,7 @@
 bool IsUnRemovableDefaultApp(const std::string& id) {
   return id == extension_misc::kChromeAppId ||
          id == extensions::kWebStoreAppId ||
-         id == file_manager::kFileManagerAppId ||
-         id == extension_misc::kGeniusAppId;
+         id == file_manager::kFileManagerAppId;
 }
 
 void UninstallExtension(extensions::ExtensionService* service,
diff --git a/chrome/browser/ui/app_list/app_service/app_service_app_icon_loader.cc b/chrome/browser/ui/app_list/app_service/app_service_app_icon_loader.cc
index 2476c35..f64124d9 100644
--- a/chrome/browser/ui/app_list/app_service/app_service_app_icon_loader.cc
+++ b/chrome/browser/ui/app_list/app_service/app_service_app_icon_loader.cc
@@ -39,9 +39,7 @@
     : AppIconLoader(profile, resource_size_in_dip, delegate) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  if (proxy) {
-    Observe(&proxy->AppRegistryCache());
-  }
+  Observe(&proxy->AppRegistryCache());
 }
 
 AppServiceAppIconLoader::~AppServiceAppIconLoader() = default;
@@ -60,9 +58,9 @@
 
   // Support icon loading for apps registered in AppService or Crostini apps
   // with the prefix "crostini:".
-  if (proxy && (proxy->AppRegistryCache().GetAppType(app_id) !=
-                    apps::mojom::AppType::kUnknown ||
-                crostini::IsUnmatchedCrostiniShelfAppId(app_id))) {
+  if (proxy->AppRegistryCache().GetAppType(app_id) !=
+          apps::mojom::AppType::kUnknown ||
+      crostini::IsUnmatchedCrostiniShelfAppId(app_id)) {
     return true;
   }
 
@@ -129,9 +127,6 @@
                                            bool allow_placeholder_icon) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile());
-  if (!proxy) {
-    return;
-  }
 
   auto icon_type =
       (base::FeatureList::IsEnabled(features::kAppServiceAdaptiveIcon))
diff --git a/chrome/browser/ui/app_list/app_service/app_service_app_item.cc b/chrome/browser/ui/app_list/app_service/app_service_app_item.cc
index 49a7604..9c71e42 100644
--- a/chrome/browser/ui/app_list/app_service/app_service_app_item.cc
+++ b/chrome/browser/ui/app_list/app_service/app_service_app_item.cc
@@ -81,8 +81,7 @@
   // when AppService Instance feature is done.
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile());
-  if (!proxy)
-    return;
+
   bool is_active_app = false;
   proxy->AppRegistryCache().ForOneApp(
       id(), [&is_active_app](const apps::AppUpdate& update) {
@@ -131,26 +130,23 @@
                                apps::mojom::LaunchSource launch_source) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile());
-  if (proxy) {
-    proxy->Launch(id(), event_flags, launch_source,
-                  GetController()->GetAppListDisplayId());
-  }
+  proxy->Launch(id(), event_flags, launch_source,
+                GetController()->GetAppListDisplayId());
 }
 
 void AppServiceAppItem::CallLoadIcon(bool allow_placeholder_icon) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile());
-  if (proxy) {
-    auto icon_type =
-        (base::FeatureList::IsEnabled(features::kAppServiceAdaptiveIcon))
-            ? apps::mojom::IconType::kStandard
-            : apps::mojom::IconType::kUncompressed;
-    proxy->LoadIcon(app_type_, id(), icon_type,
-                    ash::AppListConfig::instance().grid_icon_dimension(),
-                    allow_placeholder_icon,
-                    base::BindOnce(&AppServiceAppItem::OnLoadIcon,
-                                   weak_ptr_factory_.GetWeakPtr()));
-  }
+
+  auto icon_type =
+      (base::FeatureList::IsEnabled(features::kAppServiceAdaptiveIcon))
+          ? apps::mojom::IconType::kStandard
+          : apps::mojom::IconType::kUncompressed;
+  proxy->LoadIcon(app_type_, id(), icon_type,
+                  ash::AppListConfig::instance().grid_icon_dimension(),
+                  allow_placeholder_icon,
+                  base::BindOnce(&AppServiceAppItem::OnLoadIcon,
+                                 weak_ptr_factory_.GetWeakPtr()));
 }
 
 void AppServiceAppItem::OnLoadIcon(apps::mojom::IconValuePtr icon_value) {
diff --git a/chrome/browser/ui/app_list/app_service/app_service_app_model_builder.cc b/chrome/browser/ui/app_list/app_service/app_service_app_model_builder.cc
index d07b023..192bdcec 100644
--- a/chrome/browser/ui/app_list/app_service/app_service_app_model_builder.cc
+++ b/chrome/browser/ui/app_list/app_service/app_service_app_model_builder.cc
@@ -81,15 +81,9 @@
 void AppServiceAppModelBuilder::BuildModel() {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile());
-  if (proxy) {
-    proxy->AppRegistryCache().ForEachApp(
-        [this](const apps::AppUpdate& update) { OnAppUpdate(update); });
-    Observe(&proxy->AppRegistryCache());
-  } else {
-    // TODO(crbug.com/826982): do we want apps in incognito mode? See the TODO
-    // in AppServiceProxyFactory::GetForProfile about whether
-    // apps::AppServiceProxy::Get should return nullptr for incognito profiles.
-  }
+  proxy->AppRegistryCache().ForEachApp(
+      [this](const apps::AppUpdate& update) { OnAppUpdate(update); });
+  Observe(&proxy->AppRegistryCache());
 
   if (model_updater()) {
     crostini_folder_observer_ = std::make_unique<CrostiniFolderObserver>(this);
diff --git a/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc b/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc
index 8d2925a9..48857e1 100644
--- a/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc
+++ b/chrome/browser/ui/app_list/app_service/app_service_app_model_builder_unittest.cc
@@ -126,7 +126,6 @@
                 FakeAppListModelUpdater* model_updater) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy);
   proxy->FlushMojoCallsForTesting();
   proxy->AppRegistryCache().ForEachApp(
       [&model_updater, &app_type](const apps::AppUpdate& update) {
diff --git a/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc b/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc
index 14f11b65..534185c 100644
--- a/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc
+++ b/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc
@@ -69,7 +69,6 @@
     : AppContextMenu(delegate, profile, app_id, controller) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy);
   proxy->AppRegistryCache().ForOneApp(
       app_id, [this](const apps::AppUpdate& update) {
         app_type_ =
@@ -84,7 +83,6 @@
 void AppServiceContextMenu::GetMenuModel(GetMenuModelCallback callback) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile());
-  DCHECK(proxy);
   if (proxy->AppRegistryCache().GetAppType(app_id()) ==
       apps::mojom::AppType::kUnknown) {
     std::move(callback).Run(nullptr);
diff --git a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
index 15bb18d0..40cf72d 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
@@ -245,7 +245,6 @@
                       bool flush) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy);
   if (flush)
     proxy->FlushMojoCallsForTesting();
   proxy->AppRegistryCache().ForEachApp(
@@ -564,7 +563,6 @@
   void FlushMojoCallsForAppService() {
     apps::AppServiceProxy* app_service_proxy_ =
         apps::AppServiceProxyFactory::GetForProfile(profile_.get());
-    DCHECK(app_service_proxy_);
     app_service_proxy_->FlushMojoCallsForTesting();
   }
 
@@ -2129,7 +2127,6 @@
   // the test result when calling AppServiceAppIconLoader to load the icon.
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile_.get());
-  DCHECK(proxy);
   apps::StubIconLoader stub_icon_loader;
   apps::IconLoader* old_icon_loader =
       proxy->OverrideInnerIconLoaderForTesting(&stub_icon_loader);
diff --git a/chrome/browser/ui/app_list/chrome_app_list_model_updater_browsertest.cc b/chrome/browser/ui/app_list/chrome_app_list_model_updater_browsertest.cc
index bb3a6a8..e0090c6 100644
--- a/chrome/browser/ui/app_list/chrome_app_list_model_updater_browsertest.cc
+++ b/chrome/browser/ui/app_list/chrome_app_list_model_updater_browsertest.cc
@@ -102,7 +102,6 @@
   // callbacks.
   Profile* profile = ProfileManager::GetActiveUserProfile();
   auto* proxy = apps::AppServiceProxyFactory::GetForProfile(profile);
-  ASSERT_TRUE(proxy);
   proxy->FlushMojoCallsForTesting();
 
   AppListClientImpl* client = AppListClientImpl::GetInstance();
diff --git a/chrome/browser/ui/app_list/search/app_search_provider.cc b/chrome/browser/ui/app_list/search/app_search_provider.cc
index 5b107d4..c23fa6ed 100644
--- a/chrome/browser/ui/app_list/search/app_search_provider.cc
+++ b/chrome/browser/ui/app_list/search/app_search_provider.cc
@@ -291,9 +291,7 @@
                     apps::IconCache::GarbageCollectionPolicy::kExplicit) {
     apps::AppServiceProxy* proxy =
         apps::AppServiceProxyFactory::GetForProfile(profile);
-    if (proxy) {
-      Observe(&proxy->AppRegistryCache());
-    }
+    Observe(&proxy->AppRegistryCache());
 
     sync_sessions::SessionSyncService* service =
         SessionSyncServiceFactory::GetInstance()->GetForProfile(profile);
@@ -313,9 +311,6 @@
   void AddApps(AppSearchProvider::Apps* apps_vector) override {
     apps::AppServiceProxy* proxy =
         apps::AppServiceProxyFactory::GetForProfile(profile());
-    if (!proxy) {
-      return;
-    }
     proxy->AppRegistryCache().ForEachApp([this, apps_vector](
                                              const apps::AppUpdate& update) {
       if ((update.Readiness() == apps::mojom::Readiness::kUninstalledByUser) ||
diff --git a/chrome/browser/ui/app_list/search/app_service_app_result.cc b/chrome/browser/ui/app_list/search/app_service_app_result.cc
index dde906c..516e4d4 100644
--- a/chrome/browser/ui/app_list/search/app_service_app_result.cc
+++ b/chrome/browser/ui/app_list/search/app_service_app_result.cc
@@ -40,21 +40,19 @@
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
 
-  if (proxy) {
-    proxy->AppRegistryCache().ForOneApp(
-        app_id, [this](const apps::AppUpdate& update) {
-          app_type_ = update.AppType();
-          is_platform_app_ =
-              update.IsPlatformApp() == apps::mojom::OptionalBool::kTrue;
-          show_in_launcher_ =
-              update.ShowInLauncher() == apps::mojom::OptionalBool::kTrue;
-        });
+  proxy->AppRegistryCache().ForOneApp(
+      app_id, [this](const apps::AppUpdate& update) {
+        app_type_ = update.AppType();
+        is_platform_app_ =
+            update.IsPlatformApp() == apps::mojom::OptionalBool::kTrue;
+        show_in_launcher_ =
+            update.ShowInLauncher() == apps::mojom::OptionalBool::kTrue;
+      });
 
-    constexpr bool allow_placeholder_icon = true;
-    CallLoadIcon(false, allow_placeholder_icon);
-    if (is_recommendation) {
-      CallLoadIcon(true, allow_placeholder_icon);
-    }
+  constexpr bool allow_placeholder_icon = true;
+  CallLoadIcon(false, allow_placeholder_icon);
+  if (is_recommendation) {
+    CallLoadIcon(true, allow_placeholder_icon);
   }
 
   switch (app_type_) {
@@ -155,8 +153,6 @@
 
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile());
-  if (!proxy)
-    return;
 
   // For Chrome apps or Web apps, if it is non-platform app, it could be
   // selecting an existing delegate for the app, so call
diff --git a/chrome/browser/ui/app_list/search/os_settings_provider.cc b/chrome/browser/ui/app_list/search/os_settings_provider.cc
index 9ab970e..0c71c28 100644
--- a/chrome/browser/ui/app_list/search/os_settings_provider.cc
+++ b/chrome/browser/ui/app_list/search/os_settings_provider.cc
@@ -49,7 +49,8 @@
 // be renumbered and numeric values should never be reused.
 enum class Error {
   kOk = 0,
-  kAppServiceUnavailable = 1,
+  // No longer used.
+  // kAppServiceUnavailable = 1,
   kNoSettingsIcon = 2,
   kSearchHandlerUnavailable = 3,
   kHierarchyEmpty = 4,
@@ -187,22 +188,17 @@
       search_results_observer_receiver_.BindNewPipeAndPassRemote());
 
   app_service_proxy_ = apps::AppServiceProxyFactory::GetForProfile(profile_);
-  if (app_service_proxy_) {
-    Observe(&app_service_proxy_->AppRegistryCache());
-    auto icon_type =
-        (base::FeatureList::IsEnabled(features::kAppServiceAdaptiveIcon))
-            ? apps::mojom::IconType::kStandard
-            : apps::mojom::IconType::kUncompressed;
-    app_service_proxy_->LoadIcon(
-        apps::mojom::AppType::kWeb,
-        chromeos::default_web_apps::kOsSettingsAppId, icon_type,
-        ash::AppListConfig::instance().search_list_icon_dimension(),
-        /*allow_placeholder_icon=*/false,
-        base::BindOnce(&OsSettingsProvider::OnLoadIcon,
-                       weak_factory_.GetWeakPtr()));
-  } else {
-    LogError(Error::kAppServiceUnavailable);
-  }
+  Observe(&app_service_proxy_->AppRegistryCache());
+  auto icon_type =
+      (base::FeatureList::IsEnabled(features::kAppServiceAdaptiveIcon))
+          ? apps::mojom::IconType::kStandard
+          : apps::mojom::IconType::kUncompressed;
+  app_service_proxy_->LoadIcon(
+      apps::mojom::AppType::kWeb, chromeos::default_web_apps::kOsSettingsAppId,
+      icon_type, ash::AppListConfig::instance().search_list_icon_dimension(),
+      /*allow_placeholder_icon=*/false,
+      base::BindOnce(&OsSettingsProvider::OnLoadIcon,
+                     weak_factory_.GetWeakPtr()));
 
   // Set parameters from Finch. Reasonable defaults are set in the header.
   accept_alternate_matches_ = base::GetFieldTrialParamByFeatureAsBool(
@@ -283,8 +279,7 @@
 void OsSettingsProvider::OnAppUpdate(const apps::AppUpdate& update) {
   // Watch the app service for updates. On an update that marks the OS settings
   // app as ready, retrieve the icon for the app to use for search results.
-  if (app_service_proxy_ &&
-      update.AppId() == chromeos::default_web_apps::kOsSettingsAppId &&
+  if (update.AppId() == chromeos::default_web_apps::kOsSettingsAppId &&
       update.ReadinessChanged() &&
       update.Readiness() == apps::mojom::Readiness::kReady) {
     auto icon_type =
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc b/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc
index 981545334..5384fdc 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.cc
@@ -24,7 +24,6 @@
 #include "chrome/browser/chromeos/file_manager/file_tasks_notifier.h"
 #include "chrome/browser/chromeos/file_manager/file_tasks_notifier_factory.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
-#include "chrome/browser/chromeos/web_applications/default_web_app_ids.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/app_list/search/chrome_search_result.h"
@@ -33,8 +32,6 @@
 #include "chrome/browser/ui/app_list/search/search_result_ranker/histogram_util.h"
 #include "chrome/browser/ui/app_list/search/search_result_ranker/ranking_item_util.h"
 #include "chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker.h"
-#include "chromeos/constants/chromeos_features.h"
-#include "extensions/common/constants.h"
 #include "url/gurl.h"
 
 namespace app_list {
@@ -247,24 +244,8 @@
     zero_state_group_ranks_ = zero_state_group_ranker_->Rank();
   }
 
-  if (app_ranker_) {
-    // The Help app is being replaced with the Discover app, and we want to keep
-    // ranking consistent by swapping the app IDs. The rename is a no-op if the
-    // Help app ID doesn't exist, so it's safe to do it several times.
-    // Unfortunately we can't do this on initialization though, as the model
-    // won't have been loaded from disk. Instead, do it on the first rank.
-    // TODO(1052154): Remove this special case after M84, to give all devices
-    // time to swap IDs.
-    if (app_ranker_->is_initialized() && !have_renamed_help_app_ &&
-        base::FeatureList::IsEnabled(chromeos::features::kHelpAppV2)) {
-      app_ranker_->RenameTarget(extension_misc::kGeniusAppId,
-                                chromeos::default_web_apps::kHelpAppId);
-      app_ranker_->SaveToDisk();
-      have_renamed_help_app_ = true;
-    }
-
+  if (app_ranker_)
     app_ranks_ = app_ranker_->Rank();
-  }
 }
 
 void SearchResultRanker::Rank(Mixer::SortedResults* results) {
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.h b/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.h
index fa24360..9600803 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.h
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/search_result_ranker.h
@@ -130,7 +130,6 @@
   // Ranks apps.
   std::unique_ptr<RecurrenceRanker> app_ranker_;
   std::map<std::string, float> app_ranks_;
-  bool have_renamed_help_app_ = false;
 
   // Testing-only closure to inform tests once a JSON config has been parsed.
   base::OnceClosure json_config_parsed_for_testing_;
diff --git a/chrome/browser/ui/ash/assistant/assistant_state_client_unittest.cc b/chrome/browser/ui/ash/assistant/assistant_state_client_unittest.cc
index 9097a3e..df81f80ae 100644
--- a/chrome/browser/ui/ash/assistant/assistant_state_client_unittest.cc
+++ b/chrome/browser/ui/ash/assistant/assistant_state_client_unittest.cc
@@ -14,6 +14,7 @@
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/test/base/chrome_ash_test_base.h"
 #include "chrome/test/base/testing_profile.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/arc/arc_util.h"
 #include "components/arc/test/fake_arc_session.h"
 #include "components/language/core/browser/pref_names.h"
@@ -29,6 +30,9 @@
   ~AssistantStateClientTest() override = default;
 
   void SetUp() override {
+    // Need to initialize DBusThreadManager before ArcSessionManager's
+    // constructor calls DBusThreadManager::Get().
+    chromeos::DBusThreadManager::Initialize();
     ChromeAshTestBase::SetUp();
 
     // Setup test profile.
@@ -57,6 +61,7 @@
     arc_session_manager_->Shutdown();
     arc_session_manager_.reset();
     ChromeAshTestBase::TearDown();
+    chromeos::DBusThreadManager::Shutdown();
   }
 
   AssistantStateClient* assistant_state_client() {
diff --git a/chrome/browser/ui/ash/chrome_new_window_client.cc b/chrome/browser/ui/ash/chrome_new_window_client.cc
index c65b856d..f2ad3c7 100644
--- a/chrome/browser/ui/ash/chrome_new_window_client.cc
+++ b/chrome/browser/ui/ash/chrome_new_window_client.cc
@@ -346,7 +346,6 @@
   Profile* const profile = ProfileManager::GetActiveUserProfile();
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy);
   proxy->AppRegistryCache().ForOneApp(
       file_manager::kFileManagerAppId, [proxy](const apps::AppUpdate& update) {
         if (update.Readiness() == apps::mojom::Readiness::kReady) {
@@ -480,7 +479,6 @@
 
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy);
   proxy->LaunchAppWithUrl(*app_id, event_flags, url,
                           apps::mojom::LaunchSource::kFromArc,
                           display::kInvalidDisplayId);
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc
index 7d9bc6e..a9407c52 100644
--- a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_controller.cc
@@ -66,7 +66,6 @@
       app_service_instance_helper_(
           std::make_unique<AppServiceInstanceRegistryHelper>(this)) {
   aura::Env::GetInstance()->AddObserver(this);
-  DCHECK(proxy_);
   Observe(&proxy_->InstanceRegistry());
 
   if (arc::IsArcAllowedForProfile(owner->profile()))
@@ -93,7 +92,6 @@
   for (auto* profile : profile_list_) {
     apps::AppServiceProxy* proxy =
         apps::AppServiceProxyFactory::GetForProfile(profile);
-    DCHECK(proxy);
     proxy->InstanceRegistry().RemoveObserver(this);
   }
 }
@@ -116,7 +114,6 @@
 void AppServiceAppWindowLauncherController::ActiveUserChanged(
     const std::string& user_email) {
   proxy_ = apps::AppServiceProxyFactory::GetForProfile(owner()->profile());
-  DCHECK(proxy_);
   // Deactivates the running app windows in InstanceRegistry for the inactive
   // user, and activates the app windows for the active user.
   for (auto* window : window_list_) {
@@ -140,7 +137,6 @@
     Profile* profile) {
   // Each users InstanceRegister needs to be observed.
   proxy_ = apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy_);
   proxy_->InstanceRegistry().AddObserver(this);
   profile_list_.push_back(profile);
 
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_item_controller.cc b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_item_controller.cc
index a87ecd6..924e088c 100644
--- a/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_item_controller.cc
+++ b/chrome/browser/ui/ash/launcher/app_service/app_service_app_window_launcher_item_controller.cc
@@ -177,7 +177,6 @@
   Profile* const profile = ChromeLauncherController::instance()->profile();
   apps::AppServiceProxy* const proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy);
   return proxy->AppRegistryCache().GetAppType(shelf_id().app_id) ==
          apps::mojom::AppType::kExtension;
 }
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_instance_registry_helper.cc b/chrome/browser/ui/ash/launcher/app_service/app_service_instance_registry_helper.cc
index 299e0d99..264f98f 100644
--- a/chrome/browser/ui/ash/launcher/app_service/app_service_instance_registry_helper.cc
+++ b/chrome/browser/ui/ash/launcher/app_service/app_service_instance_registry_helper.cc
@@ -38,7 +38,6 @@
       launcher_controller_helper_(std::make_unique<LauncherControllerHelper>(
           controller->owner()->profile())) {
   DCHECK(controller_);
-  DCHECK(proxy_);
 }
 
 AppServiceInstanceRegistryHelper::~AppServiceInstanceRegistryHelper() = default;
diff --git a/chrome/browser/ui/ash/launcher/app_service/app_service_shelf_context_menu.cc b/chrome/browser/ui/ash/launcher/app_service/app_service_shelf_context_menu.cc
index 7776e23..f4594181 100644
--- a/chrome/browser/ui/ash/launcher/app_service/app_service_shelf_context_menu.cc
+++ b/chrome/browser/ui/ash/launcher/app_service/app_service_shelf_context_menu.cc
@@ -91,7 +91,6 @@
     : ShelfContextMenu(controller, item, display_id) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(controller->profile());
-  DCHECK(proxy);
 
   if (crostini::IsUnmatchedCrostiniShelfAppId(item->id.app_id)) {
     // For Crostini app_id with the prefix "crostini:", set app_type as Unknown
@@ -113,7 +112,6 @@
 void AppServiceShelfContextMenu::GetMenuModel(GetMenuModelCallback callback) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(controller()->profile());
-  DCHECK(proxy);
   proxy->GetMenuModel(
       item().id.app_id, apps::mojom::MenuType::kShelf, display_id(),
       base::BindOnce(&AppServiceShelfContextMenu::OnGetMenuModel,
@@ -520,7 +518,6 @@
       bool show_in_launcher = false;
       apps::AppServiceProxy* proxy =
           apps::AppServiceProxyFactory::GetForProfile(controller()->profile());
-      DCHECK(proxy);
       proxy->AppRegistryCache().ForOneApp(
           item().id.app_id, [&show_in_launcher](const apps::AppUpdate& update) {
             if (update.ShowInLauncher() == apps::mojom::OptionalBool::kTrue)
diff --git a/chrome/browser/ui/ash/launcher/app_service/launcher_app_service_app_updater.cc b/chrome/browser/ui/ash/launcher/app_service/launcher_app_service_app_updater.cc
index 7c95802..9d9983b 100644
--- a/chrome/browser/ui/ash/launcher/app_service/launcher_app_service_app_updater.cc
+++ b/chrome/browser/ui/ash/launcher/app_service/launcher_app_service_app_updater.cc
@@ -16,13 +16,12 @@
     : LauncherAppUpdater(delegate, browser_context) {
   apps::AppServiceProxy* proxy = apps::AppServiceProxyFactory::GetForProfile(
       Profile::FromBrowserContext(browser_context));
-  if (proxy) {
-    proxy->AppRegistryCache().ForEachApp([this](const apps::AppUpdate& update) {
-      if (update.Readiness() == apps::mojom::Readiness::kReady)
-        this->installed_apps_.insert(update.AppId());
-    });
-    Observe(&proxy->AppRegistryCache());
-  }
+
+  proxy->AppRegistryCache().ForEachApp([this](const apps::AppUpdate& update) {
+    if (update.Readiness() == apps::mojom::Readiness::kReady)
+      this->installed_apps_.insert(update.AppId());
+  });
+  Observe(&proxy->AppRegistryCache());
 }
 
 LauncherAppServiceAppUpdater::~LauncherAppServiceAppUpdater() = default;
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
index d3eb7ca3..bc98609 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
@@ -815,10 +815,11 @@
                                                  const std::string& app_id) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
+
   // Apps that are not in the App Service may call this function.
   // E.g. extensions, apps that are using their platform specific IDs.
-  if (proxy && proxy->AppRegistryCache().GetAppType(app_id) ==
-                   apps::mojom::AppType::kUnknown) {
+  if (proxy->AppRegistryCache().GetAppType(app_id) ==
+      apps::mojom::AppType::kUnknown) {
     return;
   }
 
@@ -1056,7 +1057,6 @@
 
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile());
-  DCHECK(proxy);
 
   const std::vector<ash::ShelfID> pinned_apps =
       GetPinnedAppsFromSync(launcher_controller_helper_.get());
diff --git a/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc b/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc
index d5bc98c..f5a6c03 100644
--- a/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc
+++ b/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc
@@ -163,14 +163,12 @@
 
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  if (proxy) {
-    std::string name;
-    proxy->AppRegistryCache().ForOneApp(
-        app_id,
-        [&name](const apps::AppUpdate& update) { name = update.Name(); });
-    if (!name.empty())
-      return base::UTF8ToUTF16(name);
-  }
+
+  std::string name;
+  proxy->AppRegistryCache().ForOneApp(
+      app_id, [&name](const apps::AppUpdate& update) { name = update.Name(); });
+  if (!name.empty())
+    return base::UTF8ToUTF16(name);
 
   // Get the title for the extension which is not managed by AppService.
   extensions::ExtensionRegistry* registry =
@@ -227,7 +225,7 @@
   const std::string& app_id = id.app_id;
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile_);
-  DCHECK(proxy);
+
   // Launch apps with AppServiceProxy.Launch.
   if (proxy->AppRegistryCache().GetAppType(app_id) !=
       apps::mojom::AppType::kUnknown) {
@@ -324,8 +322,6 @@
 
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile_);
-  if (!proxy)
-    return false;
 
   bool is_valid = false;
   proxy->AppRegistryCache().ForOneApp(
diff --git a/chrome/browser/ui/ash/launcher/shelf_context_menu.cc b/chrome/browser/ui/ash/launcher/shelf_context_menu.cc
index aad2a34..430a4f7 100644
--- a/chrome/browser/ui/ash/launcher/shelf_context_menu.cc
+++ b/chrome/browser/ui/ash/launcher/shelf_context_menu.cc
@@ -38,7 +38,6 @@
 void UninstallApp(Profile* profile, const std::string& app_id) {
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy);
   if (proxy->AppRegistryCache().GetAppType(app_id) !=
       apps::mojom::AppType::kUnknown) {
     proxy->Uninstall(app_id, nullptr /* parent_window */);
@@ -69,10 +68,10 @@
 
   // AppServiceShelfContextMenu supports context menus for apps registered in
   // AppService, Arc shortcuts and Crostini apps with the prefix "crostini:".
-  if (proxy && (proxy->AppRegistryCache().GetAppType(item->id.app_id) !=
-                    apps::mojom::AppType::kUnknown ||
-                crostini::IsUnmatchedCrostiniShelfAppId(item->id.app_id) ||
-                arc::IsArcItem(controller->profile(), item->id.app_id))) {
+  if (proxy->AppRegistryCache().GetAppType(item->id.app_id) !=
+          apps::mojom::AppType::kUnknown ||
+      crostini::IsUnmatchedCrostiniShelfAppId(item->id.app_id) ||
+      arc::IsArcItem(controller->profile(), item->id.app_id)) {
     return std::make_unique<AppServiceShelfContextMenu>(controller, item,
                                                         display_id);
   }
diff --git a/chrome/browser/ui/ash/wallpaper_controller_client.cc b/chrome/browser/ui/ash/wallpaper_controller_client.cc
index 1e4463f9..9e818a3 100644
--- a/chrome/browser/ui/ash/wallpaper_controller_client.cc
+++ b/chrome/browser/ui/ash/wallpaper_controller_client.cc
@@ -485,7 +485,6 @@
   DCHECK(profile);
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
-  DCHECK(proxy);
   if (proxy->AppRegistryCache().GetAppType(
           extension_misc::kWallpaperManagerId) ==
       apps::mojom::AppType::kUnknown) {
diff --git a/chrome/browser/ui/browser_navigator.cc b/chrome/browser/ui/browser_navigator.cc
index 7a363eb..e03b55d 100644
--- a/chrome/browser/ui/browser_navigator.cc
+++ b/chrome/browser/ui/browser_navigator.cc
@@ -17,7 +17,6 @@
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/prerender/prerender_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/renderer_host/chrome_navigation_ui_data.h"
@@ -39,6 +38,7 @@
 #include "chrome/common/url_constants.h"
 #include "components/captive_portal/core/buildflags.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/browser/browser_url_handler.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/notification_service.h"
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc
index ea1da9c..4b0fa08b 100644
--- a/chrome/browser/ui/chrome_pages.cc
+++ b/chrome/browser/ui/chrome_pages.cc
@@ -204,14 +204,8 @@
   // OffTheRecord profile.
   apps::AppServiceProxy* proxy = apps::AppServiceProxyFactory::GetForProfile(
       profile->GetOriginalProfile());
-  DCHECK(proxy);
-
-  const char* app_id =
-      base::FeatureList::IsEnabled(chromeos::features::kHelpAppV2)
-          ? chromeos::default_web_apps::kHelpAppId
-          : extension_misc::kGeniusAppId;
-  proxy->Launch(app_id, ui::EventFlags::EF_NONE, app_launch_source,
-                display::kDefaultDisplayId);
+  proxy->Launch(chromeos::default_web_apps::kHelpAppId, ui::EventFlags::EF_NONE,
+                app_launch_source, display::kDefaultDisplayId);
 #else
   GURL url;
   switch (source) {
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
index cfbd26f..7180227 100644
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.cc
@@ -81,12 +81,6 @@
 #include "ui/gfx/vector_icon_types.h"
 #include "ui/resources/grit/ui_resources.h"
 
-#if defined(OS_MAC)
-#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/geolocation/geolocation_system_permission_mac.h"
-#include "chrome/browser/media/webrtc/system_media_capture_permissions_mac.h"
-#endif
-
 using base::UserMetricsAction;
 using content::WebContents;
 using content_settings::SETTING_SOURCE_NONE;
@@ -106,9 +100,6 @@
 static constexpr char kMicSettingsURI[] =
     "x-apple.systempreferences:com.apple.preference.security?Privacy_"
     "Microphone";
-static constexpr char kLocationSettingsURI[] =
-    "x-apple.systempreferences:com.apple.preference.security?Privacy_"
-    "LocationServices";
 #endif  // defined(OS_MAC)
 
 // Returns a boolean indicating whether the setting should be managed by the
@@ -599,10 +590,33 @@
 
 // ContentSettingDomainListBubbleModel -----------------------------------------
 
+class ContentSettingDomainListBubbleModel
+    : public ContentSettingSimpleBubbleModel {
+ public:
+  ContentSettingDomainListBubbleModel(Delegate* delegate,
+                                      WebContents* web_contents,
+                                      ContentSettingsType content_type);
+  ~ContentSettingDomainListBubbleModel() override {}
+
+ private:
+  void MaybeAddDomainList(const std::set<std::string>& hosts, int title_id);
+  void SetDomainsAndCustomLink();
+  void OnCustomLinkClicked() override;
+
+  DISALLOW_COPY_AND_ASSIGN(ContentSettingDomainListBubbleModel);
+};
+
 ContentSettingDomainListBubbleModel::ContentSettingDomainListBubbleModel(
     Delegate* delegate,
-    WebContents* web_contents)
-    : ContentSettingBubbleModel(delegate, web_contents) {}
+    WebContents* web_contents,
+    ContentSettingsType content_type)
+    : ContentSettingSimpleBubbleModel(delegate,
+                                      web_contents,
+                                      content_type) {
+  DCHECK_EQ(ContentSettingsType::GEOLOCATION, content_type)
+      << "SetDomains currently only supports geolocation content type";
+  SetDomainsAndCustomLink();
+}
 
 void ContentSettingDomainListBubbleModel::MaybeAddDomainList(
     const std::set<std::string>& hosts,
@@ -1446,86 +1460,6 @@
   set_selected_device(GetMediaDeviceById(selected_device_id, devices));
 }
 
-// ContentSettingGeolocationBubbleModel --------------------------------------
-
-ContentSettingGeolocationBubbleModel::ContentSettingGeolocationBubbleModel(
-    Delegate* delegate,
-    content::WebContents* web_contents)
-    : ContentSettingDomainListBubbleModel(delegate, web_contents) {
-  TabSpecificContentSettings* content_settings =
-      TabSpecificContentSettings::GetForFrame(web_contents->GetMainFrame());
-  const ContentSettingsUsagesState& usages_state =
-      content_settings->geolocation_usages_state();
-
-  if (usages_state.state_map().empty())
-    return;
-
-  usages_state.GetDetailedInfo(nullptr, &state_flags_);
-
-  // If the permission is turned off in MacOS system preferences, overwrite
-  // the bubble to enable the user to trigger the system dialog.
-  if (ShouldShowSystemGeolocationPermissions()) {
-#if defined(OS_MAC)
-    InitializeSystemGeolocationPermissionBubble();
-    return;
-#endif  // defined(OS_MAC)
-  }
-
-  SetDomainsAndCustomLink();
-}
-
-ContentSettingGeolocationBubbleModel::~ContentSettingGeolocationBubbleModel() =
-    default;
-
-void ContentSettingGeolocationBubbleModel::OnDoneButtonClicked() {
-  if (ShouldShowSystemGeolocationPermissions()) {
-#if defined(OS_MAC)
-    ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(
-        GURL(kLocationSettingsURI), web_contents());
-    return;
-#endif  // defined(OS_MAC)
-  }
-}
-
-void ContentSettingGeolocationBubbleModel::OnManageButtonClicked() {
-  if (delegate())
-    delegate()->ShowContentSettingsPage(ContentSettingsType::GEOLOCATION);
-}
-
-#if defined(OS_MAC)
-void ContentSettingGeolocationBubbleModel::
-    InitializeSystemGeolocationPermissionBubble() {
-  set_title(l10n_util::GetStringUTF16(IDS_GEOLOCATION_TURNED_OFF_IN_MACOS));
-  AddListItem(ContentSettingBubbleModel::ListItem(
-      &vector_icons::kLocationOnIcon,
-      l10n_util::GetStringUTF16(IDS_GEOLOCATION),
-      l10n_util::GetStringUTF16(IDS_TURNED_OFF), false, true, 0));
-  set_manage_text_style(ContentSettingBubbleModel::ManageTextStyle::kNone);
-  set_done_button_text(l10n_util::GetStringUTF16(IDS_OPEN_PREFERENCES_LINK));
-}
-#endif  // defined(OS_MAC)
-
-bool ContentSettingGeolocationBubbleModel::
-    ShouldShowSystemGeolocationPermissions() {
-#if defined(OS_MAC)
-  if (base::FeatureList::IsEnabled(
-          ::features::kMacCoreLocationImplementation)) {
-    GeolocationSystemPermissionManager* permission_delegate =
-        g_browser_process->platform_part()->location_permission_manager();
-    SystemPermissionStatus permission =
-        permission_delegate->GetSystemPermission();
-    return (permission != SystemPermissionStatus::kAllowed) &&
-           IsGeolocationAccessed();
-  }
-#endif
-  return false;
-}
-
-bool ContentSettingGeolocationBubbleModel::IsGeolocationAccessed() {
-  return ((state_flags_ &
-           ContentSettingsUsagesState::TABSTATE_HAS_ANY_ALLOWED) != 0);
-}
-
 // ContentSettingSubresourceFilterBubbleModel ----------------------------------
 
 ContentSettingSubresourceFilterBubbleModel::
@@ -1851,6 +1785,10 @@
     return std::make_unique<ContentSettingPopupBubbleModel>(delegate,
                                                             web_contents);
   }
+  if (content_type == ContentSettingsType::GEOLOCATION) {
+    return std::make_unique<ContentSettingDomainListBubbleModel>(
+        delegate, web_contents, content_type);
+  }
   if (content_type == ContentSettingsType::PLUGINS) {
     return std::make_unique<ContentSettingPluginBubbleModel>(delegate,
                                                              web_contents);
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model.h b/chrome/browser/ui/content_settings/content_setting_bubble_model.h
index df9c9d60..b590e11 100644
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model.h
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model.h
@@ -411,56 +411,6 @@
   DISALLOW_COPY_AND_ASSIGN(ContentSettingMediaStreamBubbleModel);
 };
 
-class ContentSettingDomainListBubbleModel : public ContentSettingBubbleModel {
- public:
-  ContentSettingDomainListBubbleModel(Delegate* delegate,
-                                      content::WebContents* web_contents);
-  ~ContentSettingDomainListBubbleModel() override = default;
-
- protected:
-  void SetDomainsAndCustomLink();
-
- private:
-  void MaybeAddDomainList(const std::set<std::string>& hosts, int title_id);
-  void OnCustomLinkClicked() override;
-
-  DISALLOW_COPY_AND_ASSIGN(ContentSettingDomainListBubbleModel);
-};
-
-// The bubble that informs users that Chrome does not have access to Location
-// and guides them to the system preferences to fix that problem if they wish.
-class ContentSettingGeolocationBubbleModel
-    : public ContentSettingDomainListBubbleModel {
- public:
-  ContentSettingGeolocationBubbleModel(Delegate* delegate,
-                                       content::WebContents* web_contents);
-
-  ContentSettingGeolocationBubbleModel(
-      const ContentSettingGeolocationBubbleModel&) = delete;
-  ContentSettingGeolocationBubbleModel& operator=(
-      const ContentSettingGeolocationBubbleModel&) = delete;
-
-  ~ContentSettingGeolocationBubbleModel() override;
-
-  // ContentSettingBubbleModel:
-  void OnManageButtonClicked() override;
-  void OnDoneButtonClicked() override;
-
- private:
-  // Initialize the bubble with the elements specific to the scenario when
-  // geolocation is disabled on the system (OS) level.
-  void InitializeSystemGeolocationPermissionBubble();
-
-  // Check if geolocation has been accessed in this context.
-  bool IsGeolocationAccessed();
-
-  // Whether or not to show the bubble UI specific to when geolocation
-  // permissions are turned off on a system level.
-  bool ShouldShowSystemGeolocationPermissions();
-
-  unsigned int state_flags_ = 0;
-};
-
 // The model of a bubble that acts as a quiet permission request prompt for
 // notifications. In contrast to other bubbles (which display the current
 // permission state after the user makes the initial decision), this is shown
diff --git a/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc b/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc
index 8b3809f..27bbd02 100644
--- a/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc
+++ b/chrome/browser/ui/content_settings/content_setting_bubble_model_unittest.cc
@@ -65,7 +65,8 @@
                               bool expect_clear_link,
                               bool expect_reload_hint) {
     std::unique_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-        new ContentSettingGeolocationBubbleModel(nullptr, web_contents()));
+        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+            NULL, web_contents(), ContentSettingsType::GEOLOCATION));
     const ContentSettingBubbleModel::BubbleContent& bubble_content =
         content_setting_bubble_model->bubble_content();
     EXPECT_TRUE(bubble_content.title.empty());
@@ -75,7 +76,7 @@
     EXPECT_NE(expect_clear_link || expect_reload_hint,
               bubble_content.custom_link.empty());
     EXPECT_EQ(expect_clear_link, bubble_content.custom_link_enabled);
-    EXPECT_TRUE(bubble_content.manage_text.empty());
+    EXPECT_FALSE(bubble_content.manage_text.empty());
   }
 
   std::string GetDefaultAudioDevice() {
@@ -871,7 +872,8 @@
   // Reset ContentSettings and embargo state by pressing on Custom Link.
   {
     std::unique_ptr<ContentSettingBubbleModel> content_setting_bubble_model(
-        new ContentSettingGeolocationBubbleModel(nullptr, web_contents()));
+        ContentSettingBubbleModel::CreateContentSettingBubbleModel(
+            nullptr, web_contents(), ContentSettingsType::GEOLOCATION));
 
     content_setting_bubble_model->OnCustomLinkClicked();
   }
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model.cc b/chrome/browser/ui/content_settings/content_setting_image_model.cc
index a551415..84a6366 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model.cc
+++ b/chrome/browser/ui/content_settings/content_setting_image_model.cc
@@ -20,7 +20,6 @@
 #include "chrome/browser/download/download_request_limiter.h"
 #include "chrome/browser/permissions/quiet_notification_permission_ui_config.h"
 #include "chrome/browser/permissions/quiet_notification_permission_ui_state.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/blocked_content/framebust_block_tab_helper.h"
 #include "chrome/browser/ui/content_settings/content_setting_image_model_states.h"
@@ -36,6 +35,7 @@
 #include "components/content_settings/core/common/features.h"
 #include "components/permissions/permission_request_manager.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/vector_icons/vector_icons.h"
 #include "content/public/browser/web_contents.h"
 #include "services/device/public/cpp/device_features.h"
@@ -48,8 +48,6 @@
 #include "ui/gfx/vector_icon_types.h"
 
 #if defined(OS_MAC)
-#include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/browser/geolocation/geolocation_system_permission_mac.h"
 #include "chrome/browser/media/webrtc/system_media_capture_permissions_mac.h"
 #endif
 
@@ -82,23 +80,14 @@
   DISALLOW_COPY_AND_ASSIGN(ContentSettingBlockedImageModel);
 };
 
-class ContentSettingGeolocationImageModel : public ContentSettingImageModel {
+class ContentSettingGeolocationImageModel
+    : public ContentSettingSimpleImageModel {
  public:
   ContentSettingGeolocationImageModel();
 
   bool UpdateAndGetVisibility(WebContents* web_contents) override;
 
-  bool IsGeolocationAccessed();
-#if defined(OS_MAC)
-  bool IsGeolocationBlockedOnASystemLevel();
-#endif  // defined(OS_MAC)
-
-  std::unique_ptr<ContentSettingBubbleModel> CreateBubbleModelImpl(
-      ContentSettingBubbleModel::Delegate* delegate,
-      WebContents* web_contents) override;
-
  private:
-  unsigned int state_flags_ = 0;
   DISALLOW_COPY_AND_ASSIGN(ContentSettingGeolocationImageModel);
 };
 
@@ -489,48 +478,27 @@
 // Geolocation -----------------------------------------------------------------
 
 ContentSettingGeolocationImageModel::ContentSettingGeolocationImageModel()
-    : ContentSettingImageModel(ImageType::GEOLOCATION) {}
+    : ContentSettingSimpleImageModel(ImageType::GEOLOCATION,
+                                     ContentSettingsType::GEOLOCATION) {}
 
 bool ContentSettingGeolocationImageModel::UpdateAndGetVisibility(
     WebContents* web_contents) {
-  set_should_auto_open_bubble(false);
   TabSpecificContentSettings* content_settings =
       TabSpecificContentSettings::GetForFrame(web_contents->GetMainFrame());
   if (!content_settings)
     return false;
-
   const ContentSettingsUsagesState& usages_state =
       content_settings->geolocation_usages_state();
   if (usages_state.state_map().empty())
     return false;
 
-  state_flags_ = 0;
-  usages_state.GetDetailedInfo(nullptr, &state_flags_);
-
-#if defined(OS_MAC)
-  if (base::FeatureList::IsEnabled(
-          ::features::kMacCoreLocationImplementation)) {
-    set_explanatory_string_id(0);
-
-    if (IsGeolocationAccessed()) {
-      if (IsGeolocationBlockedOnASystemLevel()) {
-        set_icon(vector_icons::kLocationOnIcon,
-                 vector_icons::kBlockedBadgeIcon);
-        set_tooltip(l10n_util::GetStringUTF16(IDS_GEOLOCATION_BLOCKED_TOOLTIP));
-        if (content_settings->geolocation_was_just_granted_on_site_level())
-          set_should_auto_open_bubble(true);
-        set_explanatory_string_id(IDS_GEOLOCATION_TURNED_OFF);
-      } else {
-        set_icon(vector_icons::kLocationOnIcon, gfx::kNoneIcon);
-        set_tooltip(l10n_util::GetStringUTF16(IDS_GEOLOCATION_ALLOWED_TOOLTIP));
-      }
-      return true;
-    }
-  }
-#endif  // defined(OS_MAC)
-
-  bool allowed = IsGeolocationAccessed();
-  set_icon(vector_icons::kLocationOnIcon,
+  // If any embedded site has access the allowed icon takes priority over the
+  // blocked icon.
+  unsigned int state_flags = 0;
+  usages_state.GetDetailedInfo(nullptr, &state_flags);
+  bool allowed =
+      !!(state_flags & ContentSettingsUsagesState::TABSTATE_HAS_ANY_ALLOWED);
+  set_icon(kMyLocationIcon,
            allowed ? gfx::kNoneIcon : vector_icons::kBlockedBadgeIcon);
   set_tooltip(l10n_util::GetStringUTF16(allowed
                                             ? IDS_GEOLOCATION_ALLOWED_TOOLTIP
@@ -538,30 +506,6 @@
   return true;
 }
 
-bool ContentSettingGeolocationImageModel::IsGeolocationAccessed() {
-  return (state_flags_ &
-          ContentSettingsUsagesState::TABSTATE_HAS_ANY_ALLOWED) != 0;
-}
-
-#if defined(OS_MAC)
-bool ContentSettingGeolocationImageModel::IsGeolocationBlockedOnASystemLevel() {
-  GeolocationSystemPermissionManager* permission_manager =
-      g_browser_process->platform_part()->location_permission_manager();
-  SystemPermissionStatus permission = permission_manager->GetSystemPermission();
-
-  return permission != SystemPermissionStatus::kAllowed;
-}
-
-#endif  // defined(OS_MAC)
-
-std::unique_ptr<ContentSettingBubbleModel>
-ContentSettingGeolocationImageModel::CreateBubbleModelImpl(
-    ContentSettingBubbleModel::Delegate* delegate,
-    WebContents* web_contents) {
-  return std::make_unique<ContentSettingGeolocationBubbleModel>(delegate,
-                                                                web_contents);
-}
-
 // Protocol handlers -----------------------------------------------------------
 
 ContentSettingRPHImageModel::ContentSettingRPHImageModel()
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model_browsertest.cc b/chrome/browser/ui/content_settings/content_setting_image_model_browsertest.cc
index 779a1840..914d8add 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model_browsertest.cc
+++ b/chrome/browser/ui/content_settings/content_setting_image_model_browsertest.cc
@@ -52,6 +52,7 @@
           ImageType::POPUPS,
           ImageType::MIXEDSCRIPT,
           ImageType::PPAPI_BROKER,
+          ImageType::GEOLOCATION,
           ImageType::PROTOCOL_HANDLERS,
           ImageType::MIDI_SYSEX,
       };
diff --git a/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc b/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc
index e32ec29..d871b538 100644
--- a/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc
+++ b/chrome/browser/ui/content_settings/content_setting_image_model_unittest.cc
@@ -16,7 +16,6 @@
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/content_settings/tab_specific_content_settings_delegate.h"
 #include "chrome/browser/permissions/quiet_notification_permission_ui_state.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/common/chrome_features.h"
@@ -24,8 +23,6 @@
 #include "chrome/grit/generated_resources.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
-#include "chrome/test/base/testing_browser_process.h"
-#include "chrome/test/base/testing_browser_process_platform_part.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/content_settings/browser/tab_specific_content_settings.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
@@ -37,6 +34,7 @@
 #include "components/permissions/permission_uma_util.h"
 #include "components/permissions/test/mock_permission_prompt_factory.h"
 #include "components/permissions/test/mock_permission_request.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "content/public/browser/cookie_access_details.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
@@ -49,10 +47,6 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/color_palette.h"
 
-#if defined(OS_MAC)
-#include "chrome/browser/geolocation/geolocation_system_permission_mac.h"
-#endif
-
 using content_settings::TabSpecificContentSettings;
 
 namespace {
@@ -119,22 +113,6 @@
   return !model.GetIcon(gfx::kPlaceholderColor).IsEmpty();
 }
 
-#if defined(OS_MAC)
-class FakeSystemGeolocationPermissionsManager
-    : public GeolocationSystemPermissionManager {
- public:
-  FakeSystemGeolocationPermissionsManager() = default;
-
-  ~FakeSystemGeolocationPermissionsManager() override = default;
-
-  SystemPermissionStatus GetSystemPermission() override { return fake_status_; }
-  void SetStatus(SystemPermissionStatus status) { fake_status_ = status; }
-
- private:
-  SystemPermissionStatus fake_status_ = SystemPermissionStatus::kAllowed;
-};
-#endif
-
 TEST_F(ContentSettingImageModelTest, Update) {
   TabSpecificContentSettings::CreateForWebContents(
       web_contents(),
@@ -285,81 +263,6 @@
             l10n_util::GetStringUTF16(IDS_SENSORS_BLOCKED_TOOLTIP));
 }
 
-#if defined(OS_MAC)
-// Test the correct ContentSettingImageModel for various permutations of site
-// and system level Geolocation permissions
-TEST_F(ContentSettingImageModelTest, GeolocationAccessPermissionsChanged) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kMacCoreLocationImplementation);
-  auto test_location_permission_manager =
-      std::make_unique<FakeSystemGeolocationPermissionsManager>();
-  FakeSystemGeolocationPermissionsManager* location_permission_manager =
-      test_location_permission_manager.get();
-  TestingBrowserProcess::GetGlobal()
-      ->GetTestPlatformPart()
-      ->SetLocationPermissionManager(
-          std::move(test_location_permission_manager));
-
-  TabSpecificContentSettings::CreateForWebContents(
-      web_contents(),
-      std::make_unique<chrome::TabSpecificContentSettingsDelegate>(
-          web_contents()));
-  GURL requesting_origin = GURL("https://www.example.com");
-  NavigateAndCommit(controller_, requesting_origin);
-  TabSpecificContentSettings* content_settings =
-      TabSpecificContentSettings::GetForFrame(web_contents()->GetMainFrame());
-  HostContentSettingsMap* settings_map =
-      HostContentSettingsMapFactory::GetForProfile(profile());
-
-  auto content_setting_image_model =
-      ContentSettingImageModel::CreateForContentType(
-          ContentSettingImageModel::ImageType::GEOLOCATION);
-  EXPECT_FALSE(content_setting_image_model->is_visible());
-  EXPECT_TRUE(content_setting_image_model->get_tooltip().empty());
-
-  settings_map->SetDefaultContentSetting(ContentSettingsType::GEOLOCATION,
-                                         CONTENT_SETTING_ALLOW);
-  content_settings->OnGeolocationPermissionSet(requesting_origin,
-                                               /*allowed=*/true);
-  content_setting_image_model->Update(web_contents());
-  EXPECT_TRUE(content_setting_image_model->is_visible());
-  EXPECT_FALSE(content_setting_image_model->get_tooltip().empty());
-  EXPECT_EQ(content_setting_image_model->get_tooltip(),
-            l10n_util::GetStringUTF16(IDS_GEOLOCATION_ALLOWED_TOOLTIP));
-  EXPECT_EQ(content_setting_image_model->explanatory_string_id(), 0);
-
-  settings_map->SetDefaultContentSetting(ContentSettingsType::GEOLOCATION,
-                                         CONTENT_SETTING_BLOCK);
-  content_settings->OnGeolocationPermissionSet(requesting_origin,
-                                               /*allowed=*/false);
-  content_setting_image_model->Update(web_contents());
-  EXPECT_TRUE(content_setting_image_model->is_visible());
-  EXPECT_TRUE(HasIcon(*content_setting_image_model));
-  EXPECT_FALSE(content_setting_image_model->get_tooltip().empty());
-  EXPECT_EQ(content_setting_image_model->get_tooltip(),
-            l10n_util::GetStringUTF16(IDS_GEOLOCATION_BLOCKED_TOOLTIP));
-  EXPECT_EQ(content_setting_image_model->explanatory_string_id(), 0);
-
-  location_permission_manager->SetStatus(SystemPermissionStatus::kDenied);
-  content_setting_image_model->Update(web_contents());
-  EXPECT_TRUE(content_setting_image_model->is_visible());
-  EXPECT_FALSE(content_setting_image_model->get_tooltip().empty());
-  EXPECT_EQ(content_setting_image_model->get_tooltip(),
-            l10n_util::GetStringUTF16(IDS_GEOLOCATION_BLOCKED_TOOLTIP));
-  EXPECT_EQ(content_setting_image_model->explanatory_string_id(), 0);
-
-  content_settings->OnGeolocationPermissionSet(requesting_origin,
-                                               /*allowed=*/true);
-  content_setting_image_model->Update(web_contents());
-  EXPECT_TRUE(content_setting_image_model->is_visible());
-  EXPECT_FALSE(content_setting_image_model->get_tooltip().empty());
-  EXPECT_EQ(content_setting_image_model->get_tooltip(),
-            l10n_util::GetStringUTF16(IDS_GEOLOCATION_BLOCKED_TOOLTIP));
-  EXPECT_EQ(content_setting_image_model->explanatory_string_id(),
-            IDS_GEOLOCATION_TURNED_OFF);
-}
-#endif
-
 // Regression test for https://crbug.com/955408
 // See also: ContentSettingBubbleModelTest.SensorAccessPermissionsChanged
 TEST_F(ContentSettingImageModelTest, SensorAccessPermissionsChanged) {
diff --git a/chrome/browser/ui/content_settings/content_setting_media_image_model_unittest.mm b/chrome/browser/ui/content_settings/content_setting_media_image_model_unittest.mm
index 20ae58aa..3198501 100644
--- a/chrome/browser/ui/content_settings/content_setting_media_image_model_unittest.mm
+++ b/chrome/browser/ui/content_settings/content_setting_media_image_model_unittest.mm
@@ -12,7 +12,6 @@
 #include "chrome/browser/content_settings/tab_specific_content_settings_delegate.h"
 #include "chrome/browser/infobars/infobar_service.h"
 #include "chrome/browser/media/webrtc/system_media_capture_permissions_mac.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/content_settings/media_authorization_wrapper_test.h"
 #include "chrome/common/chrome_features.h"
@@ -22,6 +21,7 @@
 #include "chrome/test/base/testing_profile.h"
 #include "components/content_settings/browser/tab_specific_content_settings.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/vector_icons/vector_icons.h"
 #include "content/public/test/web_contents_tester.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/ui/extensions/extension_installed_notification.cc b/chrome/browser/ui/extensions/extension_installed_notification.cc
index 5d75c58..ea7f89df 100644
--- a/chrome/browser/ui/extensions/extension_installed_notification.cc
+++ b/chrome/browser/ui/extensions/extension_installed_notification.cc
@@ -71,7 +71,6 @@
 
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile_);
-  DCHECK(proxy);
   if (proxy->AppRegistryCache().GetAppType(extension_id_) ==
       apps::mojom::AppType::kUnknown) {
     return;
diff --git a/chrome/browser/ui/intent_picker_tab_helper.cc b/chrome/browser/ui/intent_picker_tab_helper.cc
index e0f6ad6..1aa1b1ee 100644
--- a/chrome/browser/ui/intent_picker_tab_helper.cc
+++ b/chrome/browser/ui/intent_picker_tab_helper.cc
@@ -103,11 +103,6 @@
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile);
 
-  if (!proxy) {
-    std::move(callback).Run(std::move(apps));
-    return;
-  }
-
   constexpr bool allow_placeholder_icon = false;
   auto icon_type =
       (base::FeatureList::IsEnabled(features::kAppServiceAdaptiveIcon))
diff --git a/chrome/browser/ui/login/login_handler.cc b/chrome/browser/ui/login/login_handler.cc
index fb36970..116bbaa 100644
--- a/chrome/browser/ui/login/login_handler.cc
+++ b/chrome/browser/ui/login/login_handler.cc
@@ -19,12 +19,12 @@
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/prerender/chrome_prerender_contents_delegate.h"
-#include "chrome/browser/prerender/prerender_contents.h"
 #include "chrome/browser/tab_contents/tab_util.h"
 #include "chrome/common/chrome_features.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
 #include "components/password_manager/core/browser/browser_save_password_progress_logger.h"
 #include "components/password_manager/core/browser/http_auth_manager.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/url_formatter/elide_url.h"
 #include "content/public/browser/browser_task_traits.h"
diff --git a/chrome/browser/ui/login/login_handler_browsertest.cc b/chrome/browser/ui/login/login_handler_browsertest.cc
index 0def7434..8633feb2c 100644
--- a/chrome/browser/ui/login/login_handler_browsertest.cc
+++ b/chrome/browser/ui/login/login_handler_browsertest.cc
@@ -17,7 +17,6 @@
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/net/proxy_test_utils.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
@@ -29,6 +28,7 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_manager.h"
 #include "components/prerender/common/prerender_origin.h"
 #include "components/security_interstitials/content/security_interstitial_tab_helper.h"
 #include "components/security_interstitials/content/ssl_blocking_page.h"
diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_client.cc b/chrome/browser/ui/omnibox/chrome_omnibox_client.cc
index c3d9f19..aec0d77 100644
--- a/chrome/browser/ui/omnibox/chrome_omnibox_client.cc
+++ b/chrome/browser/ui/omnibox/chrome_omnibox_client.cc
@@ -33,7 +33,6 @@
 #include "chrome/browser/predictors/autocomplete_action_predictor_factory.h"
 #include "chrome/browser/predictors/loading_predictor.h"
 #include "chrome/browser/predictors/loading_predictor_factory.h"
-#include "chrome/browser/prerender/prerender_field_trial.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_metrics.h"
 #include "chrome/browser/search/search.h"
@@ -60,6 +59,7 @@
 #include "components/omnibox/browser/search_provider.h"
 #include "components/omnibox/common/omnibox_features.h"
 #include "components/prefs/pref_service.h"
+#include "components/prerender/browser/prerender_field_trial.h"
 #include "components/search/search.h"
 #include "components/search_engines/search_engines_pref_names.h"
 #include "components/search_engines/template_url_service.h"
diff --git a/chrome/browser/ui/tabs/tab_strip_model.cc b/chrome/browser/ui/tabs/tab_strip_model.cc
index 4e5178b..155570d7 100644
--- a/chrome/browser/ui/tabs/tab_strip_model.cc
+++ b/chrome/browser/ui/tabs/tab_strip_model.cc
@@ -1545,7 +1545,7 @@
 
 bool TabStripModel::ShouldRunUnloadListenerBeforeClosing(
     content::WebContents* contents) {
-  return contents->NeedToFireBeforeUnloadOrUnload() ||
+  return contents->NeedToFireBeforeUnloadOrUnloadEvents() ||
          delegate_->ShouldRunUnloadListenerBeforeClosing(contents);
 }
 
diff --git a/chrome/browser/ui/unload_controller.cc b/chrome/browser/ui/unload_controller.cc
index 0f394a9..e0395d4 100644
--- a/chrome/browser/ui/unload_controller.cc
+++ b/chrome/browser/ui/unload_controller.cc
@@ -85,11 +85,11 @@
   // handler we can fire even if the WebContents has an unload listener.
   // One case where we hit this is in a tab that has an infinite loop
   // before load.
-  if (contents->NeedToFireBeforeUnloadOrUnload()) {
+  if (contents->NeedToFireBeforeUnloadOrUnloadEvents()) {
     // If the page has unload listeners, then we tell the renderer to fire
     // them. Once they have fired, we'll get a message back saying whether
     // to proceed closing the page or not, which sends us back to this method
-    // with the NeedToFireBeforeUnloadOrUnload bit cleared.
+    // with the NeedToFireBeforeUnloadOrUnloadEvents bit cleared.
     contents->DispatchBeforeUnload(false /* auto_cancel */);
     return true;
   }
@@ -193,7 +193,7 @@
       content::WebContents* contents =
           browser_->tab_strip_model()->GetWebContentsAt(i);
       bool should_fire_beforeunload =
-          contents->NeedToFireBeforeUnloadOrUnload() ||
+          contents->NeedToFireBeforeUnloadOrUnloadEvents() ||
           DevToolsWindow::NeedsToInterceptBeforeUnload(contents);
       if (!base::Contains(tabs_needing_unload_fired_, contents) &&
           should_fire_beforeunload) {
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
index 87379e8..0deb0d7d 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
@@ -1820,7 +1820,17 @@
   if (!navigation->IsInMainFrame())
     return;
 
-  if (navigation->IsSameDocument()) {
+  // Same-document navigations should be treated with the following
+  // considerations:
+  // - If the same-document navigation was triggered by a fragment navigation,
+  // the current elision/unelision state shouldn't be altered, since it always
+  // remains in the same page, keeping location.pathname
+  // - If the same-document navigation was triggered by the use of history
+  // pushState/replaceState API, we should unelide and reset state to support
+  // the same behaviour in websites that rely on same-document navigation to
+  // render different views as if it were 'normal' navigation
+  if (navigation->IsSameDocument() &&
+      navigation->GetPreviousURL().EqualsIgnoringRef(navigation->GetURL())) {
     if (!IsURLEligibleForSimplifiedDomainEliding())
       return;
 
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc
index d6bbb28..c5c771f 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc
@@ -2362,6 +2362,43 @@
     ASSERT_TRUE(elide_animation);
     EXPECT_FALSE(elide_animation->IsAnimating());
   }
+
+  // On same-document main-frame fragment navigation, the URL should remain
+  // elided to the simplified domain.
+  {
+    content::MockNavigationHandle navigation;
+    navigation.set_is_same_document(true);
+    navigation.set_previous_url(GURL(kSimplifiedDomainDisplayUrl));
+    navigation.set_url(
+        GURL(kSimplifiedDomainDisplayUrl + base::ASCIIToUTF16("#foobar")));
+    omnibox_view()->DidFinishNavigation(&navigation);
+    ASSERT_NO_FATAL_FAILURE(ExpectElidedToSimplifiedDomain(
+        omnibox_view(), kSimplifiedDomainDisplayUrlScheme,
+        kSimplifiedDomainDisplayUrlSubdomain,
+        kSimplifiedDomainDisplayUrlHostnameAndScheme,
+        kSimplifiedDomainDisplayUrlPath, ShouldElideToRegistrableDomain()));
+    OmniboxViewViews::ElideAnimation* elide_animation =
+        omnibox_view()->GetElideAfterInteractionAnimationForTesting();
+    ASSERT_TRUE(elide_animation);
+    EXPECT_FALSE(elide_animation->IsAnimating());
+  }
+
+  // On same-document main-frame non-fragment navigation, the URL shouldn't
+  // remain elided to the simplified domain.
+  {
+    content::MockNavigationHandle navigation;
+    navigation.set_is_same_document(true);
+    navigation.set_previous_url(GURL(kSimplifiedDomainDisplayUrl));
+    navigation.set_url(
+        GURL(kSimplifiedDomainDisplayUrl + base::ASCIIToUTF16("/foobar")));
+    omnibox_view()->DidFinishNavigation(&navigation);
+    ASSERT_NO_FATAL_FAILURE(ExpectUnelidedFromSimplifiedDomain(
+        render_text, gfx::Range(kSimplifiedDomainDisplayUrlScheme.size(),
+                                kSimplifiedDomainDisplayUrl.size())));
+    OmniboxViewViews::ElideAnimation* elide_animation =
+        omnibox_view()->GetElideAfterInteractionAnimationForTesting();
+    EXPECT_FALSE(elide_animation);
+  }
 }
 
 // Tests that in the hide-on-interaction field trial, a same-document navigation
diff --git a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc
index 51c6ad563..0d20e4a 100644
--- a/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/page_info/safety_tip_page_info_bubble_view_browsertest.cc
@@ -1047,7 +1047,7 @@
 // Tests that UKM data gets properly recorded when safety tip heuristics get
 // triggered.
 IN_PROC_BROWSER_TEST_P(SafetyTipPageInfoBubbleViewBrowserTest,
-                       HeuristicsUkmRecorded) {
+                       DISABLED_HeuristicsUkmRecorded) {
   const std::vector<const char*> kSensitiveKeywords = {"test"};
 
   ReputationService* rep_service = ReputationService::Get(browser()->profile());
diff --git a/chrome/browser/ui/views/passwords/password_bubble_view_base.cc b/chrome/browser/ui/views/passwords/password_bubble_view_base.cc
index 19daf96..5441470 100644
--- a/chrome/browser/ui/views/passwords/password_bubble_view_base.cc
+++ b/chrome/browser/ui/views/passwords/password_bubble_view_base.cc
@@ -156,6 +156,14 @@
   SetShowTitle(!controller->GetTitle().empty());
 }
 
+ax::mojom::Role PasswordBubbleViewBase::GetAccessibleWindowRole() {
+  // This bubble is displayed as non-modal when users finish typing their
+  // password. In absence of a focus change event, ATs will not notice the
+  // bubble unless an alert event is emitted, so we need it to have an
+  // alert role.
+  return ax::mojom::Role::kAlertDialog;
+}
+
 void PasswordBubbleViewBase::OnWidgetClosing(views::Widget* widget) {
   LocationBarBubbleDelegateView::OnWidgetClosing(widget);
   if (widget != GetWidget())
diff --git a/chrome/browser/ui/views/passwords/password_bubble_view_base.h b/chrome/browser/ui/views/passwords/password_bubble_view_base.h
index 5b66e1ca..5616369 100644
--- a/chrome/browser/ui/views/passwords/password_bubble_view_base.h
+++ b/chrome/browser/ui/views/passwords/password_bubble_view_base.h
@@ -66,6 +66,9 @@
 
   ~PasswordBubbleViewBase() override;
 
+  // views::BubbleDialogDelegateView:
+  ax::mojom::Role GetAccessibleWindowRole() override;
+
  private:
   // views::BubbleDialogDelegateView:
   void Init() override;
diff --git a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views_browsertest.cc b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views_browsertest.cc
index 63c5ab6..4933983 100644
--- a/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views_browsertest.cc
+++ b/chrome/browser/ui/views/tab_sharing/tab_sharing_ui_views_browsertest.cc
@@ -185,15 +185,21 @@
   AddTabs(browser(), 2);
   CreateUiAndStartSharing(browser(), 1);
 
-  // Close a tab different than the shared one and test that the UI has not
-  // changed.
+  // Close a tab different than the shared one and wait until it's actually
+  // closed, then test that the UI has not changed.
   TabStripModel* tab_strip_model = browser()->tab_strip_model();
+  content::WebContentsDestroyedWatcher tab_2_destroyed_watcher(
+      tab_strip_model->GetWebContentsAt(2));
   tab_strip_model->CloseWebContentsAt(2, TabStripModel::CLOSE_NONE);
+  tab_2_destroyed_watcher.Wait();
   VerifyUi(browser(), 1);
 
-  // Close the shared tab and verify that sharing is stopped, i.e. the UI is
-  // removed.
+  // Close the shared tab and wait until it's actually closed, then verify that
+  // sharing is stopped, i.e. the UI is removed.
+  content::WebContentsDestroyedWatcher tab_1_destroyed_watcher(
+      tab_strip_model->GetWebContentsAt(1));
   tab_strip_model->CloseWebContentsAt(1, TabStripModel::CLOSE_NONE);
+  tab_1_destroyed_watcher.Wait();
   VerifyUi(browser(), kNoSharedTabIndex, 0 /*infobar_count*/);
 }
 
diff --git a/chrome/browser/ui/web_applications/system_web_app_ui_utils.cc b/chrome/browser/ui/web_applications/system_web_app_ui_utils.cc
index 8f66c8d..1ae3756 100644
--- a/chrome/browser/ui/web_applications/system_web_app_ui_utils.cc
+++ b/chrome/browser/ui/web_applications/system_web_app_ui_utils.cc
@@ -163,8 +163,11 @@
                                            params->disposition);
 
     // Navigate application window to application's |url| if necessary.
+    // Help app always navigates because its url might not match the url inside
+    // the iframe, and the iframe's url is the one that matters.
     web_contents = browser->tab_strip_model()->GetWebContentsAt(0);
-    if (!web_contents || web_contents->GetURL() != url) {
+    if (!web_contents || web_contents->GetURL() != url ||
+        app_type == SystemAppType::HELP) {
       web_contents = NavigateWebApplicationWindow(
           browser, params->app_id, url, WindowOpenDisposition::CURRENT_TAB);
     }
@@ -173,8 +176,11 @@
       browser = CreateApplicationWindow(profile, *params, url);
 
     // Navigate application window to application's |url| if necessary.
+    // Help app always navigates because its url might not match the url inside
+    // the iframe, and the iframe's url is the one that matters.
     web_contents = browser->tab_strip_model()->GetWebContentsAt(0);
-    if (!web_contents || web_contents->GetURL() != url) {
+    if (!web_contents || web_contents->GetURL() != url ||
+        app_type == SystemAppType::HELP) {
       web_contents = NavigateApplicationWindow(
           browser, *params, url, WindowOpenDisposition::CURRENT_TAB);
     }
diff --git a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
index 0a4b60dd..9c2e3b1 100644
--- a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
+++ b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
@@ -133,7 +133,6 @@
 
     apps::AppServiceProxy* proxy =
         apps::AppServiceProxyFactory::GetForProfile(profile_);
-    DCHECK(proxy);
     proxy->UninstallSilently(from_app);
   }
 }
diff --git a/chrome/browser/ui/webui/app_management/app_management_page_handler.cc b/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
index 82108473..1b1430c 100644
--- a/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
+++ b/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
@@ -45,7 +45,6 @@
 constexpr char const* kAppIdsWithHiddenMoreSettings[] = {
     extensions::kWebStoreAppId,
     extension_misc::kFilesManagerAppId,
-    extension_misc::kGeniusAppId,
 };
 
 constexpr char const* kAppIdsWithHiddenPinToShelf[] = {
@@ -97,11 +96,6 @@
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile_);
 
-  // TODO(crbug.com/826982): revisit pending decision on AppServiceProxy in
-  // incognito
-  if (!proxy)
-    return;
-
   Observe(&proxy->AppRegistryCache());
 
 #if defined(OS_CHROMEOS)
@@ -118,11 +112,6 @@
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile_);
 
-  // TODO(crbug.com/826982): revisit pending decision on AppServiceProxy in
-  // incognito
-  if (!proxy)
-    return;
-
   app_management::mojom::AppPtr app;
 
   proxy->AppRegistryCache().ForOneApp(
@@ -144,11 +133,6 @@
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile_);
 
-  // TODO(crbug.com/826982): revisit pending decision on AppServiceProxy in
-  // incognito
-  if (!proxy)
-    return;
-
   std::vector<app_management::mojom::AppPtr> apps;
   proxy->AppRegistryCache().ForEachApp(
       [this, &apps](const apps::AppUpdate& update) {
@@ -195,11 +179,6 @@
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile_);
 
-  // TODO(crbug.com/826982): revisit pending decision on AppServiceProxy in
-  // incognito
-  if (!proxy)
-    return;
-
   proxy->SetPermission(app_id, std::move(permission));
 }
 
@@ -207,11 +186,6 @@
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile_);
 
-  // TODO(crbug.com/826982): revisit pending decision on AppServiceProxy in
-  // incognito
-  if (!proxy)
-    return;
-
   proxy->Uninstall(app_id, nullptr /* parent_window */);
 }
 
@@ -219,11 +193,6 @@
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile_);
 
-  // TODO(crbug.com/826982): revisit pending decision on AppServiceProxy in
-  // incognito
-  if (!proxy)
-    return;
-
   proxy->OpenNativeSettings(app_id);
 }
 
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index f9b8b01..3f212d4 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -620,10 +620,8 @@
     return &NewWebUI<chromeos::DriveInternalsUI>;
   if (url.host_piece() == chrome::kChromeUIFirstRunHost)
     return &NewWebUI<chromeos::FirstRunUI>;
-  if (base::FeatureList::IsEnabled(chromeos::features::kHelpAppV2)) {
-    if (url.host_piece() == chromeos::kChromeUIHelpAppHost)
-      return &NewWebUI<chromeos::HelpAppUI>;
-  }
+  if (url.host_piece() == chromeos::kChromeUIHelpAppHost)
+    return &NewWebUI<chromeos::HelpAppUI>;
   if (url.host_piece() == chrome::kChromeUIMachineLearningInternalsHost)
     return &NewWebUI<chromeos::machine_learning::MachineLearningInternalsUI>;
   if (url.host_piece() == chrome::kChromeUIMobileSetupHost)
diff --git a/chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.cc
index b870e18..40b2b7eb 100644
--- a/chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.cc
@@ -6,6 +6,8 @@
 
 #include "chrome/browser/chromeos/login/oobe_screen.h"
 #include "chrome/browser/chromeos/login/screens/family_link_notice_screen.h"
+#include "chrome/grit/chromium_strings.h"
+#include "chrome/grit/generated_resources.h"
 #include "components/login/localized_values_builder.h"
 
 namespace chromeos {
@@ -25,14 +27,18 @@
 
 void FamilyLinkNoticeScreenHandler::DeclareLocalizedValues(
     ::login::LocalizedValuesBuilder* builder) {
-  // TODO(crbug.com/1101318): provide translatable strings
-  builder->Add("familyLinkDialogTitle", "Add parental controls after setup");
-  builder->Add(
-      "familyLinkDialogSubtitle",
-      "Your child's account isn't set up for Family Link parental controls. "
-      "You can add parental controls once you finish setup. You'll find "
-      "information on parental controls in the Explore app.");
-  builder->Add("familyLinkContinueButton", "Continue");
+  builder->Add("familyLinkDialogTitle",
+               IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_TITLE);
+  builder->Add("familyLinkDialogNewGaiaAccountSubtitle",
+               IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_NEW_ACCOUNT_SUBTITLE);
+  builder->Add("familyLinkDialogExistingGaiaAccountSubtitle",
+               IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_EXISTING_ACCOUNT_SUBTITLE);
+  builder->Add("familyLinkDialogNotEligibleTitle",
+               IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_NOT_ELIGIBLE_TITLE);
+  builder->Add("familyLinkDialogNotEligibleSubtitle",
+               IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_NOT_ELIGIBLE_SUBTITLE);
+  builder->Add("familyLinkContinueButton",
+               IDS_LOGIN_FAMILY_LINK_NOTICE_SCREEN_CONTINUE_BUTTON);
 }
 
 void FamilyLinkNoticeScreenHandler::Initialize() {}
@@ -40,12 +46,27 @@
 void FamilyLinkNoticeScreenHandler::Show() {
   ShowScreen(kScreenId);
 }
+
 void FamilyLinkNoticeScreenHandler::Bind(FamilyLinkNoticeScreen* screen) {
   screen_ = screen;
   BaseScreenHandler::SetBaseScreen(screen_);
 }
+
 void FamilyLinkNoticeScreenHandler::Unbind() {
   screen_ = nullptr;
   BaseScreenHandler::SetBaseScreen(nullptr);
 }
+
+void FamilyLinkNoticeScreenHandler::SetIsNewGaiaAccount(bool value) {
+  CallJS("login.FamilyLinkNoticeScreen.setIsNewGaiaAccount", value);
+}
+
+void FamilyLinkNoticeScreenHandler::SetDisplayEmail(const std::string& value) {
+  CallJS("login.FamilyLinkNoticeScreen.setDisplayEmail", value);
+}
+
+void FamilyLinkNoticeScreenHandler::SetDomain(const std::string& value) {
+  CallJS("login.FamilyLinkNoticeScreen.setDomain", value);
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.h
index 531d0b0..88b4ad27 100644
--- a/chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/family_link_notice_screen_handler.h
@@ -29,6 +29,15 @@
 
   // Unbinds the screen from the view.
   virtual void Unbind() = 0;
+
+  // Set if account is a new gaia account user just created.
+  virtual void SetIsNewGaiaAccount(bool value) = 0;
+
+  // Set email to be displayed.
+  virtual void SetDisplayEmail(const std::string& value) = 0;
+
+  // Set enterprise domain to be displayed.
+  virtual void SetDomain(const std::string& value) = 0;
 };
 
 class FamilyLinkNoticeScreenHandler : public FamilyLinkNoticeView,
@@ -48,6 +57,9 @@
   void Show() override;
   void Bind(FamilyLinkNoticeScreen* screen) override;
   void Unbind() override;
+  void SetIsNewGaiaAccount(bool value) override;
+  void SetDisplayEmail(const std::string& value) override;
+  void SetDomain(const std::string& value) override;
 
   // BaseScreenHandler:
   void DeclareLocalizedValues(
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc
index 92df43e..b05bf1b 100644
--- a/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc
@@ -23,6 +23,7 @@
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile_manager.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/arc/arc_service_manager.h"
 #include "components/arc/test/fake_arc_session.h"
 #include "content/public/browser/web_ui_data_source.h"
@@ -58,6 +59,9 @@
   ~StorageHandlerTest() override = default;
 
   void SetUp() override {
+    // Need to initialize DBusThreadManager before ArcSessionManager's
+    // constructor calls DBusThreadManager::Get().
+    chromeos::DBusThreadManager::Initialize();
     // The storage handler requires an instance of DiskMountManager,
     // ArcServiceManager and ArcSessionManager.
     chromeos::disks::DiskMountManager::InitializeForTesting(
@@ -119,8 +123,11 @@
     apps_size_test_api_.reset();
     crostini_size_test_api_.reset();
     other_users_size_test_api_.reset();
+    arc_session_manager_.reset();
+    arc_service_manager_.reset();
     chromeos::disks::DiskMountManager::Shutdown();
     storage::ExternalMountPoints::GetSystemInstance()->RevokeAllFileSystems();
+    chromeos::DBusThreadManager::Shutdown();
   }
 
  protected:
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc b/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
index f647582..a27bd8c 100644
--- a/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/os_settings_ui.cc
@@ -72,6 +72,10 @@
     webui::SetupBundledWebUIDataSource(html_source, "chromeos/os_settings.js",
                                        IDR_OS_SETTINGS_OS_SETTINGS_ROLLUP_JS,
                                        IDR_OS_SETTINGS_OS_SETTINGS_V3_HTML);
+    html_source->AddResourcePath("chromeos/shared.rollup.js",
+                                 IDR_OS_SETTINGS_SHARED_ROLLUP_JS);
+    html_source->AddResourcePath("chromeos/lazy_load.js",
+                                 IDR_OS_SETTINGS_LAZY_LOAD_ROLLUP_JS);
   } else {
     // Polymer2 Source files
     html_source->AddResourcePath("crisper.js", IDR_OS_SETTINGS_CRISPER_JS);
diff --git a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc b/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc
index b6f8cc8..32ae905 100644
--- a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc
+++ b/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc
@@ -86,7 +86,11 @@
       source == InlineLoginDialogChromeOS::Source::kArc) {
     return GURL(chrome::kChromeUIAccountManagerErrorURL);
   }
-  return GetUrlWithEmailParam(chrome::kChromeUIEDUCoexistenceLoginURL, email);
+  DCHECK_EQ(std::string(chrome::kChromeUIChromeSigninURL).back(), '/');
+  // chrome://chrome-signin/edu
+  const std::string kEduAccountLoginURL =
+      std::string(chrome::kChromeUIChromeSigninURL) + "edu";
+  return GetUrlWithEmailParam(kEduAccountLoginURL, email);
 }
 
 }  // namespace
diff --git a/chrome/browser/ui/webui/signin/profile_picker_handler.cc b/chrome/browser/ui/webui/signin/profile_picker_handler.cc
index 1fc0c268..b74f0bfa 100644
--- a/chrome/browser/ui/webui/signin/profile_picker_handler.cc
+++ b/chrome/browser/ui/webui/signin/profile_picker_handler.cc
@@ -51,6 +51,11 @@
       base::BindRepeating(
           &ProfilePickerHandler::HandleGetNewProfileSuggestedThemeInfo,
           base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
+      "loadSignInProfileCreationFlow",
+      base::BindRepeating(
+          &ProfilePickerHandler::HandleLoadSignInProfileCreationFlow,
+          base::Unretained(this)));
 }
 
 void ProfilePickerHandler::OnJavascriptAllowed() {
@@ -131,6 +136,11 @@
   ResolveJavascriptCallback(callback_id, std::move(dict));
 }
 
+void ProfilePickerHandler::HandleLoadSignInProfileCreationFlow(
+    const base::ListValue* args) {
+  // TODO(crbug.com/1063856): Add implementation.
+}
+
 void ProfilePickerHandler::OnSwitchToProfileComplete(
     Profile* profile,
     Profile::CreateStatus profile_create_status) {
diff --git a/chrome/browser/ui/webui/signin/profile_picker_handler.h b/chrome/browser/ui/webui/signin/profile_picker_handler.h
index cd6d8cc3..8d98c0f 100644
--- a/chrome/browser/ui/webui/signin/profile_picker_handler.h
+++ b/chrome/browser/ui/webui/signin/profile_picker_handler.h
@@ -28,6 +28,7 @@
   void HandleLaunchSelectedProfile(const base::ListValue* args);
   void HandleAskOnStartupChanged(const base::ListValue* args);
   void HandleGetNewProfileSuggestedThemeInfo(const base::ListValue* args);
+  void HandleLoadSignInProfileCreationFlow(const base::ListValue* args);
 
   void OnSwitchToProfileComplete(Profile* profile,
                                  Profile::CreateStatus profile_create_status);
diff --git a/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc b/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc
index 6e182ae..93201ca6 100644
--- a/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc
+++ b/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc
@@ -28,7 +28,6 @@
 #include "components/url_formatter/url_fixer.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/storage_partition.h"
-#include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
 
 using content::BrowserThread;
@@ -182,22 +181,12 @@
     return;
 
   SupervisedUserURLFilter* filter = GetSupervisedUserService()->GetURLFilter();
-  content::WebContents* web_contents =
-      web_ui() ? web_ui()->GetWebContents() : nullptr;
-  bool skip_manual_parent_filter = false;
-  if (web_contents) {
-    skip_manual_parent_filter =
-        filter->ShouldSkipParentManualAllowlistFiltering(
-            web_contents->GetOutermostWebContents());
-  }
-
   std::map<std::string, base::string16> allowlists =
       filter->GetMatchingWhitelistTitles(url);
   filter->GetFilteringBehaviorForURLWithAsyncChecks(
       url,
       base::BindOnce(&SupervisedUserInternalsMessageHandler::OnTryURLResult,
-                     weak_factory_.GetWeakPtr(), allowlists),
-      skip_manual_parent_filter);
+                     weak_factory_.GetWeakPtr(), allowlists));
 }
 
 void SupervisedUserInternalsMessageHandler::SendBasicInfo() {
diff --git a/chrome/browser/web_applications/system_web_app_manager.cc b/chrome/browser/web_applications/system_web_app_manager.cc
index 5b82416..4a0ea26 100644
--- a/chrome/browser/web_applications/system_web_app_manager.cc
+++ b/chrome/browser/web_applications/system_web_app_manager.cc
@@ -282,7 +282,7 @@
     case SystemAppType::MEDIA:
       return base::FeatureList::IsEnabled(chromeos::features::kMediaApp);
     case SystemAppType::HELP:
-      return base::FeatureList::IsEnabled(chromeos::features::kHelpAppV2);
+      return true;
     case SystemAppType::PRINT_MANAGEMENT:
       return base::FeatureList::IsEnabled(
           chromeos::features::kPrintJobManagementApp);
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index df2b786..0d3a936 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-master-1596571199-429c5d3274b1adcffd4054f095f3cc2a5ada36c8.profdata
+chrome-win32-master-1596610622-a993b1ede4201f1709aeb65ee161df429dedf1b5.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index e8bf390..de8d250 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-master-1596562698-892fa89488e0e796ec09ee348ea5782de7379276.profdata
+chrome-win64-master-1596606694-35c6f8535b14ce15b4839555c5550c892d549ecc.profdata
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index a1020d02..2c00bcb 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -959,7 +959,9 @@
 
 // Dictionary pref containing the whitelisted urls, schemes and applications
 // that would not be blocked by per app time limits.
-const char kPerAppTimeLimitsWhitelistPolicy[] =
+// Note that this used to be `kPerAppTimeLimitsWhitelistPolicy`, hence the
+// difference between the variable name and the string value.
+const char kPerAppTimeLimitsAllowlistPolicy[] =
     "child_user.per_app_time_limits.whitelist";
 
 // List of preconfigured network file shares.
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 6c586f7..df88abf 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -323,7 +323,7 @@
 extern const char kPerAppTimeLimitsLastSuccessfulReportTime[];
 extern const char kPerAppTimeLimitsLatestLimitUpdateTime[];
 extern const char kPerAppTimeLimitsPolicy[];
-extern const char kPerAppTimeLimitsWhitelistPolicy[];
+extern const char kPerAppTimeLimitsAllowlistPolicy[];
 extern const char kDeviceWallpaperImageFilePath[];
 extern const char kKerberosRememberPasswordEnabled[];
 extern const char kKerberosAddAccountsAllowed[];
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc
index b9f199d..330633b 100644
--- a/chrome/common/webui_url_constants.cc
+++ b/chrome/common/webui_url_constants.cc
@@ -68,7 +68,6 @@
 const char kChromeUIDownloadsHost[] = "downloads";
 const char kChromeUIDownloadsURL[] = "chrome://downloads/";
 const char kChromeUIDriveInternalsHost[] = "drive-internals";
-const char kChromeUIEDUCoexistenceLoginURL[] = "chrome://chrome-signin/edu";
 const char kChromeUIExtensionIconHost[] = "extension-icon";
 const char kChromeUIExtensionIconURL[] = "chrome://extension-icon/";
 const char kChromeUIExtensionsHost[] = "extensions";
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h
index f8bd254..fce39c9 100644
--- a/chrome/common/webui_url_constants.h
+++ b/chrome/common/webui_url_constants.h
@@ -71,7 +71,6 @@
 extern const char kChromeUIDownloadsHost[];
 extern const char kChromeUIDownloadsURL[];
 extern const char kChromeUIDriveInternalsHost[];
-extern const char kChromeUIEDUCoexistenceLoginURL[];
 extern const char kChromeUIExtensionIconHost[];
 extern const char kChromeUIExtensionIconURL[];
 extern const char kChromeUIExtensionsHost[];
diff --git a/chrome/credential_provider/gaiacp/gaia_credential_base.cc b/chrome/credential_provider/gaiacp/gaia_credential_base.cc
index 81e29dd..9ad1166e 100644
--- a/chrome/credential_provider/gaiacp/gaia_credential_base.cc
+++ b/chrome/credential_provider/gaiacp/gaia_credential_base.cc
@@ -565,6 +565,12 @@
   if (os_username.size() > kWindowsUsernameBufferLength - 1)
     os_username.resize(kWindowsUsernameBufferLength - 1);
 
+  // After resizing the os user name above, the last char may be a '.' which is
+  // illegal as the last character per Microsoft documentation.
+  // https://docs.microsoft.com/en-us/windows/win32/api/lmaccess/ns-lmaccess-user_info_1#remarks
+  if (os_username.size() > 0 && os_username.back() == '.')
+    os_username.resize(os_username.size() - 1);
+
   // Replace invalid characters.  While @ is not strictly invalid according to
   // MSDN docs, it causes trouble.
   for (auto& c : os_username) {
diff --git a/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc b/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc
index 49e19e0..2f0c3c5 100644
--- a/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc
+++ b/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc
@@ -854,6 +854,31 @@
   EXPECT_EQ(test->GetFinalEmail(), email);
 }
 
+TEST_F(GcpGaiaCredentialBaseTest, TrimPeriodAtTheEnd) {
+  USES_CONVERSION;
+  // Create provider and start logon.
+  Microsoft::WRL::ComPtr<ICredentialProviderCredential> cred;
+
+  ASSERT_EQ(S_OK, InitializeProviderAndGetCredential(0, &cred));
+
+  Microsoft::WRL::ComPtr<ITestCredential> test;
+  ASSERT_EQ(S_OK, cred.As(&test));
+
+  // The top level domain("info" in this example) is removed and the rest is
+  // truncated to be 20 characters. However, in this example, this will result
+  // with "abcdefghijklmn_abcd." which isn't valid per Microsoft documentation.
+  // The rule says there shouldn't be a '.' at the end. Thus it needs to be
+  // removed.
+  constexpr char email[] = "abcdefghijklmn@abcd.ef.info";
+
+  ASSERT_EQ(S_OK, test->SetGlsEmailAddress(email));
+
+  ASSERT_EQ(S_OK, StartLogonProcessAndWait());
+
+  ASSERT_STREQ(W2COLE(L"abcdefghijklmn_abcd"), test->GetFinalUsername());
+  EXPECT_EQ(test->GetFinalEmail(), email);
+}
+
 TEST_F(GcpGaiaCredentialBaseTest, NewUserDisabledThroughUsageScenario) {
   USES_CONVERSION;
   // Create provider and start logon.
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 0503250..b880fa362 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2184,10 +2184,10 @@
         "../browser/chromeos/child_accounts/screen_time_controller_browsertest.cc",
         "../browser/chromeos/child_accounts/time_limit_test_utils.cc",
         "../browser/chromeos/child_accounts/time_limits/app_time_browsertest.cc",
+        "../browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_test_utils.cc",
+        "../browser/chromeos/child_accounts/time_limits/app_time_limits_allowlist_policy_test_utils.h",
         "../browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.cc",
         "../browser/chromeos/child_accounts/time_limits/app_time_limits_policy_builder.h",
-        "../browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_test_utils.cc",
-        "../browser/chromeos/child_accounts/time_limits/app_time_limits_whitelist_policy_test_utils.h",
         "../browser/chromeos/child_accounts/time_limits/web_time_calculation_browsertest.cc",
         "../browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer_browsertest.cc",
         "../browser/chromeos/chrome_content_browser_client_chromeos_part_browsertest.cc",
@@ -4868,6 +4868,8 @@
       "../browser/extensions/external_policy_loader_unittest.cc",
       "../browser/extensions/external_provider_impl_chromeos_unittest.cc",
       "../browser/extensions/external_provider_impl_unittest.cc",
+      "../browser/extensions/external_testing_loader.cc",
+      "../browser/extensions/external_testing_loader.h",
       "../browser/extensions/forced_extensions/force_installed_metrics_unittest.cc",
       "../browser/extensions/install_tracker_unittest.cc",
       "../browser/extensions/install_verifier_unittest.cc",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/BookmarkTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/BookmarkTestRule.java
index 9c13a8ee..850e33b 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/BookmarkTestRule.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/BookmarkTestRule.java
@@ -6,6 +6,8 @@
 
 import android.support.test.InstrumentationRegistry;
 
+import androidx.annotation.Nullable;
+
 import org.junit.rules.TestRule;
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
@@ -21,6 +23,7 @@
  * with the parent chromeActivity.
  */
 public class BookmarkTestRule implements TestRule {
+    @Nullable
     private BookmarkActivity mBookmarkActivity;
 
     @Override
@@ -52,6 +55,14 @@
         BookmarkTestUtil.waitForBookmarkModelLoaded();
     }
 
+    /**
+     * Returns the bookmark activity.
+     */
+    @Nullable
+    public BookmarkActivity getBookmarkActivity() {
+        return mBookmarkActivity;
+    }
+
     private void showBookmarkManagerInternal(ChromeActivity chromeActivity) {
         TestThreadUtils.runOnUiThreadBlocking(
                 () -> BookmarkUtils.showBookmarkManager(chromeActivity));
diff --git a/chrome/test/base/testing_browser_process.cc b/chrome/test/base/testing_browser_process.cc
index e1203534..bc7c379 100644
--- a/chrome/test/base/testing_browser_process.cc
+++ b/chrome/test/base/testing_browser_process.cc
@@ -485,11 +485,6 @@
   browser_policy_connector_.reset();
 }
 
-TestingBrowserProcessPlatformPart*
-TestingBrowserProcess::GetTestPlatformPart() {
-  return platform_part_.get();
-}
-
 void TestingBrowserProcess::SetSafeBrowsingService(
     safe_browsing::SafeBrowsingService* sb_service) {
   sb_service_ = sb_service;
diff --git a/chrome/test/base/testing_browser_process.h b/chrome/test/base/testing_browser_process.h
index 9ba41bd..e586a3a7 100644
--- a/chrome/test/base/testing_browser_process.h
+++ b/chrome/test/base/testing_browser_process.h
@@ -20,7 +20,6 @@
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
-#include "chrome/test/base/testing_browser_process_platform_part.h"
 #include "extensions/buildflags/buildflags.h"
 #include "media/media_buildflags.h"
 #include "printing/buildflags/buildflags.h"
@@ -164,7 +163,6 @@
   void SetRapporServiceImpl(rappor::RapporServiceImpl* rappor_service);
   void SetShuttingDown(bool is_shutting_down);
   void ShutdownBrowserPolicyConnector();
-  TestingBrowserProcessPlatformPart* GetTestPlatformPart();
 
  private:
   // See CreateInstance() and DestoryInstance() above.
@@ -214,7 +212,7 @@
   scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_;
   rappor::RapporServiceImpl* rappor_service_ = nullptr;
 
-  std::unique_ptr<TestingBrowserProcessPlatformPart> platform_part_;
+  std::unique_ptr<BrowserProcessPlatformPart> platform_part_;
   std::unique_ptr<network::TestNetworkConnectionTracker>
       test_network_connection_tracker_;
 
diff --git a/chrome/test/base/testing_browser_process_platform_part.cc b/chrome/test/base/testing_browser_process_platform_part.cc
index 695346b..cc69987 100644
--- a/chrome/test/base/testing_browser_process_platform_part.cc
+++ b/chrome/test/base/testing_browser_process_platform_part.cc
@@ -9,10 +9,3 @@
 
 TestingBrowserProcessPlatformPart::~TestingBrowserProcessPlatformPart() {
 }
-#if defined(OS_MAC)
-void TestingBrowserProcessPlatformPart::SetLocationPermissionManager(
-    std::unique_ptr<GeolocationSystemPermissionManager>
-        location_permission_manager) {
-  location_permission_manager_ = std::move(location_permission_manager);
-}
-#endif
diff --git a/chrome/test/base/testing_browser_process_platform_part.h b/chrome/test/base/testing_browser_process_platform_part.h
index 50800825..d3d816a 100644
--- a/chrome/test/base/testing_browser_process_platform_part.h
+++ b/chrome/test/base/testing_browser_process_platform_part.h
@@ -6,7 +6,6 @@
 #define CHROME_TEST_BASE_TESTING_BROWSER_PROCESS_PLATFORM_PART_H_
 
 #include "base/macros.h"
-#include "build/build_config.h"
 #include "chrome/browser/browser_process_platform_part.h"
 
 // A TestingBrowserProcessPlatformPart is essentially a
@@ -16,11 +15,6 @@
  public:
   TestingBrowserProcessPlatformPart();
   ~TestingBrowserProcessPlatformPart() override;
-#if defined(OS_MAC)
-  void SetLocationPermissionManager(
-      std::unique_ptr<GeolocationSystemPermissionManager>
-          location_permission_manager);
-#endif
 
  private:
   DISALLOW_COPY_AND_ASSIGN(TestingBrowserProcessPlatformPart);
diff --git a/chrome/test/base/testing_profile.cc b/chrome/test/base/testing_profile.cc
index 40a2eb4..afde93a6 100644
--- a/chrome/test/base/testing_profile.cc
+++ b/chrome/test/base/testing_profile.cc
@@ -41,7 +41,6 @@
 #include "chrome/browser/policy/schema_registry_service_builder.h"
 #include "chrome/browser/prefs/browser_prefs.h"
 #include "chrome/browser/prefs/pref_service_syncable_util.h"
-#include "chrome/browser/prerender/prerender_manager.h"
 #include "chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.h"
 #include "chrome/browser/profiles/profile_key.h"
 #include "chrome/browser/profiles/profile_manager.h"
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index 5400bd3e6..b8f0c1e8 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -5538,6 +5538,18 @@
 
   "ExtensionCacheSize": {},
 
+  "DeviceShowLowDiskSpaceNotification": {
+    "os": ["chromeos"],
+    "policy_pref_mapping_test": [
+      {
+        "policies": {
+          "ShowLowDiskSpaceNotification": false
+        },
+        "prefs": { "cros.device.show_low_disk_space_notification": {"value": false} }
+      }
+    ]
+  },
+
   "DeviceLoginScreenDomainAutoComplete": {},
 
   "AllowKioskAppControlChromeVersion": {},
@@ -6935,6 +6947,7 @@
   },
 
   "PerAppTimeLimitsWhitelist" : {
+    "note": "This policy is deprecated, see http://crbug.com/1103812.",
     "os": ["chromeos"],
     "can_be_recommended": false,
     "policy_pref_mapping_test": [
@@ -6966,6 +6979,38 @@
     ]
   },
 
+  "PerAppTimeLimitsAllowlist" : {
+    "os": ["chromeos"],
+    "can_be_recommended": false,
+    "policy_pref_mapping_test": [
+      {
+        "policies": {
+          "PerAppTimeLimitsAllowlist": {
+            "scheme_list": [
+              "chrome",
+              "files"
+            ],
+            "domain_list": [
+              "support.google.com",
+              "policies.google.com"
+            ],
+            "app_list": [
+             {
+              "app_id": "pjkljhegncpnkpknbcohdijeoejaedia",
+              "app_type": "EXTENSION"
+             },
+             {
+               "app_id": "iniodglblcgmngkgdipeiclkdjjpnlbn",
+               "app_type": "BUILT-IN"
+             }
+            ]
+          }
+        },
+        "prefs": { "child_user.per_app_time_limits.whitelist": {} }
+      }
+    ]
+  },
+
   "DeviceLoginScreenPrivacyScreenEnabled": {
     "os": ["chromeos"],
     "policy_pref_mapping_tests": [
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index 42f4524a..641dfa8 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -242,13 +242,15 @@
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/fake_bluetooth_private.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/fake_bluetooth.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/input_method_options_page_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/localized_link_test.m.js",
-        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/multidevice_page_tests.m.js",
-        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/multidevice_subpage_tests.m.js",
-        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/multidevice_smartlock_subpage_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/multidevice_feature_item_tests.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/multidevice_feature_toggle_tests.m.js",
+        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/multidevice_page_tests.m.js",
+        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/multidevice_smartlock_subpage_test.m.js",
+        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/multidevice_subpage_tests.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.m.js",
+        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_languages_page_tests.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_reset_page_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_people_page_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/os_privacy_page_test.m.js",
@@ -256,11 +258,13 @@
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/people_page_account_manager_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/people_page_change_picture_test.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/people_page_kerberos_accounts_test.m.js",
-        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/test_os_sync_browser_proxy.m.js",
-        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/test_os_reset_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_multidevice_browser_proxy.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/personalization_page_test.m.js",
+        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/smart_inputs_page_test.m.js",
+        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/test_multidevice_browser_proxy.m.js",
+        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/test_os_languages_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",
+        "$root_gen_dir/chrome/test/data/webui/settings/chromeos/test_os_sync_browser_proxy.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/test_wallpaper_browser_proxy.m.js",
         "$root_gen_dir/chrome/test/data/webui/settings/chromeos/timezone_selector_test.m.js",
       ]
diff --git a/chrome/test/data/webui/cr_elements/BUILD.gn b/chrome/test/data/webui/cr_elements/BUILD.gn
index c6819d16..d9202c4 100644
--- a/chrome/test/data/webui/cr_elements/BUILD.gn
+++ b/chrome/test/data/webui/cr_elements/BUILD.gn
@@ -51,7 +51,6 @@
 js_type_check("closure_compile") {
   is_polymer3 = true
 
-  # TODO(crbug.com/1000989): Add JS type checking for all commented out targets.
   deps = [
     ":cr_action_menu_test.m",
     ":cr_button_tests.m",
@@ -67,9 +66,7 @@
     ":cr_input_test.m",
     ":cr_lazy_render_tests.m",
     ":cr_link_row_tests.m",
-
-    #":cr_lottie_tests",
-
+    ":cr_lottie_tests.m",
     ":cr_policy_indicator_behavior_tests.m",
     ":cr_policy_indicator_tests.m",
     ":cr_policy_pref_indicator_tests.m",
@@ -279,6 +276,19 @@
   extra_deps = [ ":modulize" ]
 }
 
+js_library("cr_lottie_tests.m") {
+  sources = [
+    "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_lottie_tests.m.js",
+  ]
+  deps = [
+    "..:chai_assert",
+    "..:mock_controller.m",
+    "//ui/webui/resources/cr_elements/cr_lottie:cr_lottie.m",
+  ]
+  externs_list = [ "$externs_path/mocha-2.5.js" ]
+  extra_deps = [ ":modulize" ]
+}
+
 js_library("cr_policy_indicator_behavior_tests.m") {
   sources = [ "$root_gen_dir/chrome/test/data/webui/cr_elements/cr_policy_indicator_behavior_tests.m.js" ]
   deps = [
diff --git a/chrome/test/data/webui/cr_elements/cr_lottie_tests.js b/chrome/test/data/webui/cr_elements/cr_lottie_tests.js
index 82d33274..ec59a1c 100644
--- a/chrome/test/data/webui/cr_elements/cr_lottie_tests.js
+++ b/chrome/test/data/webui/cr_elements/cr_lottie_tests.js
@@ -7,6 +7,7 @@
 // #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 // #import {eventToPromise} from '../test_util.m.js';
 // #import {MockController, MockMethod} from '../mock_controller.m.js';
+// #import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from '../chai_assert.js';
 // clang-format on
 
 /** @fileoverview Suite of tests for cr-lottie. */
@@ -39,13 +40,13 @@
 
   /**
    * A green pixel as returned by samplePixel.
-   * @type {!Array<number>>}
+   * @type {!Array<number>}
    */
   const GREEN_PIXEL = [0, 255, 0, 255];
 
   /**
    * A blue pixel as returned by samplePixel.
-   * @type {!Array<number>>}
+   * @type {!Array<number>}
    */
   const BLUE_PIXEL = [0, 0, 255, 255];
 
@@ -61,7 +62,7 @@
   /** @type {?HTMLCanvasElement} */
   let canvas = null;
 
-  /** @type {?blob} */
+  /** @type {?Blob} */
   let lottieWorkerJs = null;
 
   /** @type {Promise} */
@@ -70,9 +71,6 @@
   /** @type {Promise} */
   let waitForPlayingEvent;
 
-  /** @type {Promise} */
-  let waitForResizeEvent;
-
   setup(function(done) {
     mockController = new MockController();
 
@@ -83,7 +81,7 @@
     xhr.onreadystatechange = function() {
       if (xhr.readyState === 4) {
         assertEquals(200, xhr.status);
-        lottieWorkerJs = xhr.response;
+        lottieWorkerJs = /** @type {Blob} */ (xhr.response);
         done();
       }
     };
@@ -94,8 +92,9 @@
   });
 
   function createLottieElement() {
-    PolymerTest.clearBody();
-    crLottieElement = document.createElement('cr-lottie');
+    document.body.innerHTML = '';
+    crLottieElement =
+        /** @type {!CrLottieElement} */ (document.createElement('cr-lottie'));
     crLottieElement.animationUrl = SAMPLE_LOTTIE_GREEN;
     crLottieElement.autoplay = true;
 
@@ -103,16 +102,14 @@
         test_util.eventToPromise('cr-lottie-initialized', crLottieElement);
     waitForPlayingEvent =
         test_util.eventToPromise('cr-lottie-playing', crLottieElement);
-    waitForResizeEvent =
-        test_util.eventToPromise('cr-lottie-resized', crLottieElement);
 
-    container = document.createElement('div');
+    container = /** @type {!HTMLDivElement} */ (document.createElement('div'));
     container.style.width = '300px';
     container.style.height = '200px';
     document.body.appendChild(container);
     container.appendChild(crLottieElement);
 
-    canvas = crLottieElement.offscreenCanvas_;
+    canvas = /** @type {!HTMLCanvasElement} */ (crLottieElement.$$('canvas'));
 
     Polymer.dom.flush();
   }
@@ -145,34 +142,24 @@
         context.getImageData(canvas.width / 2, canvas.height / 2, 1, 1).data);
   }
 
-  test('TestInitializeAnimationAndAutoPlay', async () => {
-    createLottieElement();
-    assertFalse(crLottieElement.isAnimationLoaded_);
-    await waitForInitializeEvent;
-    assertTrue(crLottieElement.isAnimationLoaded_);
-    await waitForPlayingEvent;
-  });
-
-  // TODO(crbug.com/1021474): flaky.
-  test.skip('TestResize', async () => {
+  test('TestResize', async () => {
     createLottieElement();
     await waitForInitializeEvent;
     await waitForPlayingEvent;
-    await waitForResizeEvent;
 
     const newHeight = 300;
     const newWidth = 400;
-    waitForResizeEvent =
-        test_util.eventToPromise('cr-lottie-resized', crLottieElement)
-            .then(function(e) {
-              assertEquals(e.detail.height, newHeight);
-              assertEquals(e.detail.width, newWidth);
-            });
+    const waitForResizeEvent =
+        /** @type {!Promise<!CustomEvent<{width: number, height: number}>>} */ (
+            test_util.eventToPromise('cr-lottie-resized', crLottieElement));
 
     // Update size of parent div container to see if the canvas is resized.
     container.style.width = newWidth + 'px';
     container.style.height = newHeight + 'px';
-    await waitForResizeEvent;
+    const resizeEvent = await waitForResizeEvent;
+
+    assertEquals(resizeEvent.detail.height, newHeight);
+    assertEquals(resizeEvent.detail.width, newWidth);
   });
 
   test('TestPlayPause', async () => {
@@ -266,13 +253,15 @@
   test('TestHidden', async () => {
     await waitForPlayingEvent;
 
-    assertFalse(crLottieElement.$$('canvas').hidden);
+    assertFalse(canvas.hidden);
     crLottieElement.hidden = true;
-    assertTrue(crLottieElement.$$('canvas').hidden);
+    assertTrue(canvas.hidden);
   });
 
   test('TestDetachBeforeImageLoaded', async () => {
-    const mockXhr = {};
+    const mockXhr = {
+      onreadystatechange: () => {},
+    };
     mockXhr.open = mockController.createFunctionMock(mockXhr, 'open');
     mockXhr.send = mockController.createFunctionMock(mockXhr, 'send');
     mockXhr.abort = mockController.createFunctionMock(mockXhr, 'abort');
@@ -309,7 +298,9 @@
   });
 
   test('TestLoadNewImageWhileOldImageIsStillLoading', async () => {
-    const mockXhr = {};
+    const mockXhr = {
+      onreadystatechange: () => {},
+    };
     mockXhr.open = mockController.createFunctionMock(mockXhr, 'open');
     mockXhr.send = mockController.createFunctionMock(mockXhr, 'send');
     mockXhr.abort = mockController.createFunctionMock(mockXhr, 'abort');
diff --git a/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js b/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js
index 9fa9137..0c11eab 100644
--- a/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js
+++ b/chrome/test/data/webui/nearby_share/nearby_discovery_page_test.js
@@ -7,6 +7,7 @@
 import 'chrome://nearby/nearby_discovery_page.js';
 
 import {setDiscoveryManagerForTesting} from 'chrome://nearby/discovery_manager.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../chai_assert.js';
 
@@ -23,18 +24,59 @@
   let nextId = 1;
 
   /**
+   * Compares two unguessable tokens.
+   * @param {!mojoBase.mojom.UnguessableToken} a
+   * @param {!mojoBase.mojom.UnguessableToken} b
+   */
+  function assertTokensEqual(a, b) {
+    assertEquals(a.high, b.high);
+    assertEquals(a.low, b.low);
+  }
+
+  /**
+   * Compares two share targets.
+   * @param {?nearbyShare.mojom.ShareTarget} a
+   * @param {?nearbyShare.mojom.ShareTarget} b
+   */
+  function assertShareTargetsEqual(a, b) {
+    assertTrue(!!a);
+    assertTrue(!!b);
+    assertTokensEqual(a.id, b.id);
+  }
+
+  /**
+   * Returns a list of visible share target elements. The not([hidden]) selector
+   * is needed for iron-list as it reuses components but hides them when not in
+   * use.
+   * @return {!Array<!NearbyDiscoveryPageElement>}
+   */
+  function getShareTargetElements() {
+    // Make sure the iron-list had time to render its elements.
+    flush();
+    return [...discoveryPageElement.$$('#deviceList')
+                .querySelectorAll('nearby-device:not([hidden])')];
+  }
+
+  /**
    * Get the list of device names that are currently shown.
    * @return {!Array<string>}
    */
   function getDeviceNames() {
-    /** @type {!Array<string>} */
-    const deviceNames = [];
-    for (const device of discoveryPageElement.$$('#device-list').children) {
-      if (device.is === 'nearby-device') {
-        deviceNames.push(device.$$('#name').textContent);
-      }
+    return getShareTargetElements().map(
+        (device) => device.$$('#name').textContent);
+  }
+
+  /**
+   * Clicks on device with |index| and returns if that succeeded.
+   * @return {boolean}
+   */
+  function clickOnDevice(index) {
+    const devices = getShareTargetElements();
+    if (index >= devices.length) {
+      return false;
     }
-    return deviceNames;
+    devices[index].click();
+    return true;
   }
 
   /**
@@ -68,6 +110,10 @@
     discoveryPageElement = /** @type {!NearbyDiscoveryPageElement} */ (
         document.createElement('nearby-discovery-page'));
     document.body.appendChild(discoveryPageElement);
+
+    // TODO(knollr): Remove this once prototyping is done.
+    /** @suppress {visibility} */
+    discoveryPageElement.shareTargets_ = [];
   });
 
   teardown(function() {
@@ -79,19 +125,15 @@
   });
 
   test('selects share target with success', async function() {
-    // TODO(knollr): Remove this once prototyping is done.
-    /** @suppress {visibility} */
-    discoveryPageElement.shareTargets_ = [];
-
     const created = await setupShareTarget();
+    discoveryPageElement.selectedShareTarget = created;
     discoveryPageElement.$$('#next-button').click();
     const selectedId = await discoveryManager.whenCalled('selectShareTarget');
-    assertEquals(created.id.high, selectedId.high);
-    assertEquals(created.id.low, selectedId.low);
+    assertTokensEqual(created.id, selectedId);
   });
 
   test('selects share target with error', async function() {
-    await setupShareTarget();
+    discoveryPageElement.selectedShareTarget = await setupShareTarget();
     discoveryManager.selectShareTargetResult.result =
         nearbyShare.mojom.SelectShareTargetResult.kError;
 
@@ -100,7 +142,7 @@
   });
 
   test('selects share target with confirmation', async function() {
-    await setupShareTarget();
+    discoveryPageElement.selectedShareTarget = await setupShareTarget();
     discoveryManager.selectShareTargetResult.token = 'test token';
     discoveryManager.selectShareTargetResult.confirmationManager =
         new FakeConfirmationManagerRemote();
@@ -167,11 +209,64 @@
     listener.onShareTargetDiscovered(shareTarget);
     await listener.$.flushForTesting();
 
-    const expectedDeviceCount = getDeviceNames().length;
+    const expectedDeviceCount = getShareTargetElements().length;
 
     listener.onShareTargetDiscovered(shareTarget);
     await listener.$.flushForTesting();
 
-    assertEquals(expectedDeviceCount, getDeviceNames().length);
+    assertEquals(expectedDeviceCount, getShareTargetElements().length);
   });
+
+  test('selects device on click', async function() {
+    /** @type {!nearbyShare.mojom.ShareTargetListenerRemote} */
+    const listener = await discoveryManager.whenCalled('startDiscovery');
+
+    // Setup 3 targets to select from.
+    const targets = [
+      createShareTarget('Device 1'),
+      createShareTarget('Device 2'),
+      createShareTarget('Device 3'),
+    ];
+    targets.forEach((target) => listener.onShareTargetDiscovered(target));
+    await listener.$.flushForTesting();
+
+    assertEquals(null, discoveryPageElement.selectedShareTarget);
+
+    // Click on fist share target and expect it to be selected.
+    assertTrue(clickOnDevice(0));
+    assertShareTargetsEqual(
+        targets[0], discoveryPageElement.selectedShareTarget);
+
+    // Click on last share target and expect it to be selected.
+    assertTrue(clickOnDevice(2));
+    assertShareTargetsEqual(
+        targets[2], discoveryPageElement.selectedShareTarget);
+  });
+
+  test('loosing selected device disables next button', async function() {
+    /** @type {!nearbyShare.mojom.ShareTargetListenerRemote} */
+    const listener = await discoveryManager.whenCalled('startDiscovery');
+
+    // Setup 3 targets and select the second one.
+    const targets = [
+      createShareTarget('Device 1'),
+      createShareTarget('Device 2'),
+      createShareTarget('Device 3'),
+    ];
+    targets.forEach((target) => listener.onShareTargetDiscovered(target));
+    await listener.$.flushForTesting();
+
+    assertTrue(clickOnDevice(1));
+    assertFalse(discoveryPageElement.$$('#next-button').disabled);
+
+    // Loose the second device.
+    listener.onShareTargetLost(targets[1]);
+    await listener.$.flushForTesting();
+
+    // Loosing the selected device should clear the selected device and disable
+    // the next button.
+    assertEquals(null, discoveryPageElement.selectedShareTarget);
+    assertTrue(discoveryPageElement.$$('#next-button').disabled);
+  });
+
 });
diff --git a/chrome/test/data/webui/settings/chromeos/BUILD.gn b/chrome/test/data/webui/settings/chromeos/BUILD.gn
index 418e979..3523559a 100644
--- a/chrome/test/data/webui/settings/chromeos/BUILD.gn
+++ b/chrome/test/data/webui/settings/chromeos/BUILD.gn
@@ -35,16 +35,18 @@
     "bluetooth_page_tests.js",
     "fake_bluetooth.js",
     "fake_bluetooth_private.js",
+    "fake_quick_unlock_private.js",
     "fake_settings_search_handler.js",
     "fake_user_action_recorder.js",
-    "fake_quick_unlock_private.js",
+    "input_method_options_page_test.js",
     "localized_link_test.js",
-    "multidevice_page_tests.js",
-    "multidevice_subpage_tests.js",
-    "multidevice_smartlock_subpage_test.js",
     "multidevice_feature_item_tests.js",
     "multidevice_feature_toggle_tests.js",
+    "multidevice_page_tests.js",
+    "multidevice_smartlock_subpage_test.js",
+    "multidevice_subpage_tests.js",
     "nearby_share_subpage_tests.js",
+    "os_languages_page_tests.js",
     "os_reset_page_test.js",
     "os_people_page_test.js",
     "os_privacy_page_test.js",
@@ -53,9 +55,11 @@
     "people_page_change_picture_test.js",
     "people_page_kerberos_accounts_test.js",
     "personalization_page_test.js",
-    "test_os_reset_browser_proxy.js",
+    "smart_inputs_page_test.js",
+    "test_os_languages_browser_proxy.js",
     "test_os_lifetime_browser_proxy.js",
     "test_multidevice_browser_proxy.js",
+    "test_os_reset_browser_proxy.js",
     "test_wallpaper_browser_proxy.js",
     "test_os_sync_browser_proxy.js",
     "timezone_selector_test.js",
diff --git a/chrome/test/data/webui/settings/chromeos/input_method_options_page_test.js b/chrome/test/data/webui/settings/chromeos/input_method_options_page_test.js
index 49df0a7..be03119 100644
--- a/chrome/test/data/webui/settings/chromeos/input_method_options_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/input_method_options_page_test.js
@@ -2,6 +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 {CrSettingsPrefs, Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
+// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// #import {FakeSettingsPrivate} from '../fake_settings_private.m.js';
+// #import {waitAfterNextRender} from '../../test_util.m.js';
+// clang-format on
+
 /**
  * @fileoverview Suite of tests for the OS Settings input method options page.
  */
diff --git a/chrome/test/data/webui/settings/chromeos/os_languages_page_tests.js b/chrome/test/data/webui/settings/chromeos/os_languages_page_tests.js
index e81ea13d..df379b8 100644
--- a/chrome/test/data/webui/settings/chromeos/os_languages_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_languages_page_tests.js
@@ -2,6 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// clang-format off
+// #import {LanguagesBrowserProxyImpl} from 'chrome://os-settings/chromeos/lazy_load.js';
+// #import {CrSettingsPrefs, Router} from 'chrome://os-settings/chromeos/os_settings.js';
+// #import {assert} from 'chrome://resources/js/assert.m.js';
+// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// #import {getFakeLanguagePrefs} from '../fake_language_settings_private.m.js'
+// #import {FakeSettingsPrivate} from '../fake_settings_private.m.js';
+// #import {TestLanguagesBrowserProxy} from './test_os_languages_browser_proxy.m.js';
+// #import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
+// #import {fakeDataBind} from '../../test_util.m.js';
+// clang-format on
+
 cr.define('os_languages_page_tests', function() {
   /** @enum {string} */
   const TestNames = {
@@ -128,7 +140,7 @@
        */
       function assertRestartButtonActiveState(shouldBeActive) {
         const activeElement = getActiveElement();
-        isRestartButtonActive =
+        const isRestartButtonActive =
             activeElement && (activeElement.id === 'restartButton');
         assertEquals(isRestartButtonActive, shouldBeActive);
       }
@@ -329,5 +341,6 @@
     });
   });
 
+  // #cr_define_end
   return {TestNames: TestNames};
 });
diff --git a/chrome/test/data/webui/settings/chromeos/os_namespace_rewrites.gni b/chrome/test/data/webui/settings/chromeos/os_namespace_rewrites.gni
index f7378e44..0a897be 100644
--- a/chrome/test/data/webui/settings/chromeos/os_namespace_rewrites.gni
+++ b/chrome/test/data/webui/settings/chromeos/os_namespace_rewrites.gni
@@ -2,17 +2,23 @@
 
 os_test_namespace_rewrites = os_settings_namespace_rewrites + [
                                "multidevice.createFakePageContentData|createFakePageContentData",
-                               "multidevice.TestMultideviceBrowserProxy|TestMultideviceBrowserProxy",
                                "multidevice.HOST_DEVICE|HOST_DEVICE",
+                               "multidevice.TestMultideviceBrowserProxy|TestMultideviceBrowserProxy",
+                               "parental_controls.ParentalControlsBrowserProxy|ParentalControlsBrowserProxy",
                                "reset_page.TestOsResetBrowserProxy|TestOsResetBrowserProxy",
-                               "settings.TestLifetimeBrowserProxy|TestLifetimeBrowserProxy",
                                "settings.FakeBluetooth|FakeBluetooth",
                                "settings.FakeBluetoothPrivate|FakeBluetoothPrivate",
-                               "settings.MultiDeviceSettingsMode|MultiDeviceSettingsMode",
-                               "test_util.flushTasks|flushTasks",
-                               "test_util.eventToPromise|eventToPromise",
-                               "test_util.waitAfterNextRender|waitAfterNextRender",
-                               "settings.TestWallpaperBrowserProxy|TestWallpaperBrowserProxy",
-                               "parental_controls.ParentalControlsBrowserProxy|ParentalControlsBrowserProxy",
                                "settings.FakeQuickUnlockPrivate|FakeQuickUnlockPrivate",
+                               "settings.FakeLanguageSettingsPrivate|FakeLanguageSettingsPrivate",
+                               "settings.FakeInputMethodPrivate|FakeInputMethodPrivate",
+                               "settings.FakeSettingsPrivate|FakeSettingsPrivate",
+                               "settings.getFakeLanguagePrefs|getFakeLanguagePrefs",
+                               "settings.MultiDeviceSettingsMode|MultiDeviceSettingsMode",
+                               "settings.TestLanguagesBrowserProxy|TestLanguagesBrowserProxy",
+                               "settings.TestLifetimeBrowserProxy|TestLifetimeBrowserProxy",
+                               "settings.TestWallpaperBrowserProxy|TestWallpaperBrowserProxy",
+                               "test_util.eventToPromise|eventToPromise",
+                               "test_util.fakeDataBind|fakeDataBind",
+                               "test_util.flushTasks|flushTasks",
+                               "test_util.waitAfterNextRender|waitAfterNextRender",
                              ]
diff --git a/chrome/test/data/webui/settings/chromeos/os_privacy_page_test.js b/chrome/test/data/webui/settings/chromeos/os_privacy_page_test.js
index 3a8b416..33219b4 100644
--- a/chrome/test/data/webui/settings/chromeos/os_privacy_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/os_privacy_page_test.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 // clang-format off
-// #import 'chrome://os-settings/chromeos/os_settings.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';
diff --git a/chrome/test/data/webui/settings/chromeos/os_reset_page_test.js b/chrome/test/data/webui/settings/chromeos/os_reset_page_test.js
index 099c596..ddc1efcc 100644
--- a/chrome/test/data/webui/settings/chromeos/os_reset_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/os_reset_page_test.js
@@ -4,7 +4,8 @@
 
 // clang-format off
 // #import {TestLifetimeBrowserProxy} from './test_os_lifetime_browser_proxy.m.js';
-// #import {LifetimeBrowserProxy, LifetimeBrowserProxyImpl, OsResetBrowserProxyImpl, Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
+// #import {OsResetBrowserProxyImpl} from 'chrome://os-settings/chromeos/lazy_load.js';
+// #import {LifetimeBrowserProxy, LifetimeBrowserProxyImpl, Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
 // #import {TestOsResetBrowserProxy} from './test_os_reset_browser_proxy.m.js';
 // #import {assertEquals, assertFalse, assertNotEquals, assertTrue} from '../../chai_assert.js';
 // #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
index e202f1c8..383595c 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -1355,10 +1355,10 @@
       BROWSER_SETTINGS_PATH + '../test_browser_proxy.js',
       BROWSER_SETTINGS_PATH + 'fake_input_method_private.js',
       BROWSER_SETTINGS_PATH + 'fake_language_settings_private.js',
-      BROWSER_SETTINGS_PATH + 'test_languages_browser_proxy.js',
       BROWSER_SETTINGS_PATH + 'fake_settings_private.js',
       BROWSER_SETTINGS_PATH + '../test_util.js',
       'os_languages_page_tests.js',
+      'test_os_languages_browser_proxy.js',
     ]);
   }
 };
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 b510a5f..152ea47 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
@@ -38,22 +38,25 @@
 };
 
 [['AmbientModePpage', 'ambient_mode_page_test.m.js'],
- ['ResetPage', 'os_reset_page_test.m.js'],
- ['LocalizedLink', 'localized_link_test.m.js'],
  ['BluetoothPage', 'bluetooth_page_tests.m.js'],
- ['NearbyShareSubPage', 'nearby_share_subpage_tests.m.js'],
- ['MultidevicePage', 'multidevice_page_tests.m.js'],
- ['MultideviceSubPage', 'multidevice_subpage_tests.m.js'],
- ['MultideviceSmartLockSubPage', 'multidevice_smartlock_subpage_test.m.js'],
+ ['InputMethodOptionPage', 'input_method_options_page_test.m.js'],
+ ['LocalizedLink', 'localized_link_test.m.js'],
  ['MultideviceFeatureItem', 'multidevice_feature_item_tests.m.js'],
  ['MultideviceFeatureToggle', 'multidevice_feature_toggle_tests.m.js'],
+ ['MultidevicePage', 'multidevice_page_tests.m.js'],
+ ['MultideviceSmartLockSubPage', 'multidevice_smartlock_subpage_test.m.js'],
+ ['MultideviceSubPage', 'multidevice_subpage_tests.m.js'],
+ ['OsLanguagesPage', 'os_languages_page_tests.m.js'],
+ ['NearbyShareSubPage', 'nearby_share_subpage_tests.m.js'],
  ['ParentalControlsPage', 'parental_controls_page_test.m.js'],
  ['PeoplePage', 'os_people_page_test.m.js'],
- ['PersonalizationPage', 'personalization_page_test.m.js'],
  ['PeoplePageAccountManager', 'people_page_account_manager_test.m.js'],
  ['PeoplePageChangePicture', 'people_page_change_picture_test.m.js'],
  ['PeoplePageKerberosAccounts', 'people_page_kerberos_accounts_test.m.js'],
+ ['PersonalizationPage', 'personalization_page_test.m.js'],
  ['PrivacyPage', 'os_privacy_page_test.m.js'],
+ ['ResetPage', 'os_reset_page_test.m.js'],
+ ['SmartInputsPage', 'smart_inputs_page_test.m.js'],
  ['TimezoneSelector', 'timezone_selector_test.m.js'],
 ].forEach(test => registerTest(...test));
 
diff --git a/chrome/test/data/webui/settings/chromeos/smart_inputs_page_test.js b/chrome/test/data/webui/settings/chromeos/smart_inputs_page_test.js
index 778ae3a..a6822eb 100644
--- a/chrome/test/data/webui/settings/chromeos/smart_inputs_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/smart_inputs_page_test.js
@@ -1,7 +1,13 @@
 // 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.
-let smartInputsPage = null;
+
+// clang-format off
+// #import 'chrome://os-settings/chromeos/lazy_load.js';
+// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// clang-format on
+
+let smartInputsPage;
 
 function createSmartInputsPage() {
   PolymerTest.clearBody();
diff --git a/chrome/test/data/webui/settings/chromeos/test_os_languages_browser_proxy.js b/chrome/test/data/webui/settings/chromeos/test_os_languages_browser_proxy.js
new file mode 100644
index 0000000..54f6265
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/test_os_languages_browser_proxy.js
@@ -0,0 +1,61 @@
+// 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.
+
+// clang-format off
+// #import {LanguagesBrowserProxy} from 'chrome://os-settings/chromeos/lazy_load.js';
+// #import {FakeInputMethodPrivate} from '../fake_input_method_private.m.js';
+// #import {FakeLanguageSettingsPrivate} from '../fake_language_settings_private.m.js';
+// #import {TestBrowserProxy} from '../../test_browser_proxy.m.js';
+// clang-format on
+
+cr.define('settings', function() {
+  /** @implements {settings.LanguagesBrowserProxy} */
+  /* #export */ class TestLanguagesBrowserProxy extends TestBrowserProxy {
+    constructor() {
+      const methodNames = [];
+      methodNames.push('getProspectiveUILanguage', 'setProspectiveUILanguage');
+
+      super(methodNames);
+
+      /** @private {!LanguageSettingsPrivate} */
+      this.languageSettingsPrivate_ =
+          new settings.FakeLanguageSettingsPrivate();
+
+      /** @private {!InputMethodPrivate} */
+      this.inputMethodPrivate_ = /** @type{!InputMethodPrivate} */ (
+          new settings.FakeInputMethodPrivate());
+    }
+
+    /** @override */
+    getLanguageSettingsPrivate() {
+      return this.languageSettingsPrivate_;
+    }
+
+    /** @param {!LanguageSettingsPrivate} languageSettingsPrivate */
+    setLanguageSettingsPrivate(languageSettingsPrivate) {
+      this.languageSettingsPrivate_ = languageSettingsPrivate;
+    }
+
+    /** @override */
+    getProspectiveUILanguage() {
+      this.methodCalled('getProspectiveUILanguage');
+      return Promise.resolve('en-US');
+    }
+
+    /** @override */
+    setProspectiveUILanguage(language) {
+      this.methodCalled('setProspectiveUILanguage', language);
+    }
+
+
+    getInputMethodPrivate() {
+      return this.inputMethodPrivate_;
+    }
+  }
+
+  // #cr_define_end
+  return {
+    TestLanguagesBrowserProxy: TestLanguagesBrowserProxy,
+  };
+});
diff --git a/chromeos/components/camera_app_ui/resources/src/js/background.js b/chromeos/components/camera_app_ui/resources/src/js/background.js
index 8ecdf67..df53de4 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/background.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/background.js
@@ -68,9 +68,9 @@
 /**
  * Callbacks called when specific window events happened.
  * @typedef {{
- *   onActive: function(CCAWindow),
- *   onSuspended: function(CCAWindow),
- *   onClosed: function(CCAWindow),
+ *   onActive: function(!CCAWindow),
+ *   onSuspended: function(!CCAWindow),
+ *   onClosed: function(!CCAWindow),
  * }}
  */
 let WindowEventCallbacks;  // eslint-disable-line no-unused-vars
@@ -103,7 +103,7 @@
    * @param {?WindowTestEventCallbacks} testingCallbacks
    * @param {?PerfLogger} perfLogger The logger for perf events. If it
    *     is null, we will create a new one for the window.
-   * @param {Intent=} intent Intent to be handled by the app window.
+   * @param {?Intent=} intent Intent to be handled by the app window.
    *     Set to null for app window not launching from intent.
    */
   constructor(callbacks, testingCallbacks, perfLogger, intent = null) {
@@ -150,7 +150,7 @@
 
   /**
    * Gets state of the window.
-   * @return {WindowState}
+   * @return {!WindowState}
    */
   get state() {
     return this.state_;
@@ -538,7 +538,7 @@
 
 /**
  * Handles connection from the test extension used in Tast.
- * @param {Port} port The port that used to do two-way communication.
+ * @param {!Port} port The port that used to do two-way communication.
  */
 function handleExternalConnectionFromTest(port) {
   if (port.sender.origin !== TEST_API_ORIGIN) {
diff --git a/chromeos/components/camera_app_ui/resources/src/js/browser_proxy/browser_proxy_interface.js b/chromeos/components/camera_app_ui/resources/src/js/browser_proxy/browser_proxy_interface.js
index 44096a8..e6bb6a3 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/browser_proxy/browser_proxy_interface.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/browser_proxy/browser_proxy_interface.js
@@ -56,7 +56,7 @@
 
   /**
    * @param {string} name
-   * @param {Array<string>|string=} substitutions
+   * @param {!Array<string>|string=} substitutions
    * @return {string}
    * @abstract
    */
@@ -101,7 +101,7 @@
   addOnMessageExternalListener(listener) {}
 
   /**
-   * @param {function(Port)} listener
+   * @param {function(!Port)} listener
    * @abstract
    */
   addOnConnectExternalListener(listener) {}
diff --git a/chromeos/components/camera_app_ui/resources/src/js/browser_proxy/webui_browser_proxy.js b/chromeos/components/camera_app_ui/resources/src/js/browser_proxy/webui_browser_proxy.js
index 2558d47..c131f1b 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/browser_proxy/webui_browser_proxy.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/browser_proxy/webui_browser_proxy.js
@@ -11,7 +11,7 @@
 
 /* eslint-disable new-cap */
 
-/** @throws {Error} */
+/** @throws {!Error} */
 function NOTIMPLEMENTED() {
   throw Error('Browser proxy method not implemented!');
 }
diff --git a/chromeos/components/camera_app_ui/resources/src/js/device/camera3_device_info.js b/chromeos/components/camera_app_ui/resources/src/js/device/camera3_device_info.js
index 48ee7c8..0bca191d 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/device/camera3_device_info.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/device/camera3_device_info.js
@@ -75,7 +75,7 @@
    *     operator.
    * @param {!MediaDeviceInfo} deviceInfo
    * @return {!Promise<!Camera3DeviceInfo>}
-   * @throws {Error} Thrown when the device operation is not supported.
+   * @throws {!Error} Thrown when the device operation is not supported.
    */
   static async create(deviceInfo) {
     const deviceId = deviceInfo.deviceId;
diff --git a/chromeos/components/camera_app_ui/resources/src/js/device/device_info_updater.js b/chromeos/components/camera_app_ui/resources/src/js/device/device_info_updater.js
index 8db11fd..b3dfcc9d 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/device/device_info_updater.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/device/device_info_updater.js
@@ -39,7 +39,7 @@
 
     /**
      * Listeners to be called after new camera information is available.
-     * @type {!Array<function(!DeviceInfoUpdater): Promise>}
+     * @type {!Array<function(!DeviceInfoUpdater): !Promise>}
      * @private
      */
     this.deviceChangeListeners_ = [];
@@ -75,7 +75,7 @@
     /**
      * Camera3DeviceInfo of all available video devices. Is null on HALv1 device
      * without mojo api support.
-     * @type {!Promise<?Array<Camera3DeviceInfo>>}
+     * @type {!Promise<?Array<!Camera3DeviceInfo>>}
      * @private
      */
     this.camera3DevicesInfo_ = this.queryMojoDevicesInfo_();
@@ -143,7 +143,7 @@
   /**
    * Enumerates all available devices and gets their MediaDeviceInfo.
    * @return {!Promise<!Array<!MediaDeviceInfo>>}
-   * @throws {Error}
+   * @throws {!Error}
    * @private
    */
   async enumerateDevices_() {
@@ -167,7 +167,7 @@
    * @return {!Promise<?Array<!Camera3DeviceInfo>>} Camera3DeviceInfo
    *     of available devices. Maybe null on HALv1 devices without supporting
    *     private mojo api.
-   * @throws {Error} Thrown when camera unplugging happens between enumerating
+   * @throws {!Error} Thrown when camera unplugging happens between enumerating
    *     devices and querying mojo APIs with current device info results.
    * @private
    */
@@ -191,7 +191,7 @@
    * Requests to lock update of device information. This function is preserved
    * for device information reader to lock the update capability so as to ensure
    * getting consistent data between all information providers.
-   * @param {function(): Promise} callback Called after
+   * @param {function(): !Promise} callback Called after
    *     update capability is locked. Getting information from all providers in
    *     callback are guaranteed to be consistent.
    */
@@ -246,7 +246,7 @@
    * @param {string} deviceId Device id of the video device.
    * @return {!Promise<!{photo: !ResolutionList, video: !ResolutionList}>}
    *     Supported photo and video resolutions.
-   * @throws {Error} May fail on HALv1 device without capability of querying
+   * @throws {!Error} May fail on HALv1 device without capability of querying
    *     supported resolutions.
    */
   async getDeviceResolutions(deviceId) {
diff --git a/chromeos/components/camera_app_ui/resources/src/js/error.js b/chromeos/components/camera_app_ui/resources/src/js/error.js
index e4414e2..968140a 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/error.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/error.js
@@ -26,8 +26,8 @@
 /**
  * Error reported in testing run.
  * @typedef {{
- *   type: ErrorType,
- *   level: ErrorLevel,
+ *   type: !ErrorType,
+ *   level: !ErrorLevel,
  *   stack: string,
  *   time: number,
  * }}
@@ -152,8 +152,8 @@
 /**
  * Reports error either through test error callback in test run or to error
  * metrics in non test run.
- * @param {ErrorType} type
- * @param {ErrorLevel} level
+ * @param {!ErrorType} type
+ * @param {!ErrorLevel} level
  * @param {!Error} error
  */
 export function reportError(type, level, error) {
diff --git a/chromeos/components/camera_app_ui/resources/src/js/intent.js b/chromeos/components/camera_app_ui/resources/src/js/intent.js
index 6a59e98..fbebd850 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/intent.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/intent.js
@@ -32,7 +32,7 @@
   /**
    * @param {!URL} url
    * @param {number} intentId
-   * @param {Mode} mode
+   * @param {!Mode} mode
    * @param {boolean} shouldHandleResult
    * @param {boolean} shouldDownScale
    * @param {boolean} isSecure
@@ -52,7 +52,7 @@
 
     /**
      * Capture mode of intent.
-     * @const {Mode}
+     * @const {!Mode}
      */
     this.mode = mode;
 
@@ -166,7 +166,7 @@
    * @param {!URL} url Url passed along with app launch event.
    * @return {!Intent} Created intent object. Returns null if input is not a
    *     valid intent url.
-   * @throws {ParseError}
+   * @throws {!ParseError}
    */
   static create(url) {
     const params = url.searchParams;
@@ -181,7 +181,7 @@
     if (param === null || !Object.values(Mode).includes(param)) {
       throw new ParseError(url);
     }
-    const mode = /** @type {Mode} */ (param);
+    const mode = /** @type {!Mode} */ (param);
 
     return new Intent(
         url, intentId, mode, getBool('shouldHandleResult'),
diff --git a/chromeos/components/camera_app_ui/resources/src/js/main.js b/chromeos/components/camera_app_ui/resources/src/js/main.js
index 13b4204..be17737 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/main.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/main.js
@@ -223,7 +223,7 @@
 
   /**
    * Handles pressed keys.
-   * @param {Event} event Key press event.
+   * @param {!Event} event Key press event.
    * @private
    */
   onKeyPressed_(event) {
diff --git a/chromeos/components/camera_app_ui/resources/src/js/metrics.js b/chromeos/components/camera_app_ui/resources/src/js/metrics.js
index 5cb391d..69bf782a 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/metrics.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/metrics.js
@@ -33,7 +33,7 @@
 /**
  * Send the event to GA backend.
  * @param {!ga.Fields} event The event to send.
- * @param {Map<number, Object>=} dimen Optional object contains dimension
+ * @param {?Map<number, !Object>=} dimen Optional object contains dimension
  *     information.
  */
 async function sendEvent(event, dimen = null) {
@@ -193,7 +193,7 @@
     this.resolution;
 
     /**
-     * @type {(IntentResultType|undefined)}
+     * @type {!IntentResultType|undefined}
      */
     this.intentResult;
 
@@ -204,13 +204,13 @@
 
     /**
      * Whether the event is for video snapshot.
-     * @type {(boolean|undefined)}
+     * @type {boolean|undefined}
      */
     this.isVideoSnapshot;
 
     /**
      * Whether the video have ever paused and resumed in the recording.
-     * @type {(boolean|undefined)}
+     * @type {boolean|undefined}
      */
     this.everPaused;
   }
@@ -230,8 +230,8 @@
   everPaused = false,
 }) {
   /**
-   * @param {!Array<state.StateUnion>} states
-   * @param {state.StateUnion=} cond
+   * @param {!Array<!state.StateUnion>} states
+   * @param {!state.StateUnion=} cond
    * @param {boolean=} strict
    * @return {string}
    */
diff --git a/chromeos/components/camera_app_ui/resources/src/js/models/chrome_file_system_entry.js b/chromeos/components/camera_app_ui/resources/src/js/models/chrome_file_system_entry.js
index e50034f4..145ea309 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/models/chrome_file_system_entry.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/models/chrome_file_system_entry.js
@@ -138,8 +138,8 @@
 
     /**
      * @type {{
-     *   getFile: function(string, Object): !Promise,
-     *   getDirectory: function(string, Object): !Promise,
+     *   getFile: function(string, !Object): !Promise,
+     *   getDirectory: function(string, !Object): !Promise,
      * }}
      * @private
      */
diff --git a/chromeos/components/camera_app_ui/resources/src/js/models/file_system.js b/chromeos/components/camera_app_ui/resources/src/js/models/file_system.js
index ad6d91b..2fe1620e 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/models/file_system.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/models/file_system.js
@@ -210,7 +210,7 @@
 /**
  * Creates a file for saving video recording result.
  * @return {!Promise<!AbstractFileEntry>} Newly created video file.
- * @throws {Error} If failed to create video file.
+ * @throws {!Error} If failed to create video file.
  */
 export async function createVideoFile() {
   assert(externalDir !== null);
@@ -229,7 +229,7 @@
 
 /**
  * @return {!Promise<!AbstractFileEntry>} Newly created temporary file.
- * @throws {Error} If failed to create video temp file.
+ * @throws {!Error} If failed to create video temp file.
  */
 export async function createPrivateTempVideoFile() {
   // TODO(inker): Handles running out of space case.
diff --git a/chromeos/components/camera_app_ui/resources/src/js/models/file_system_entry.js b/chromeos/components/camera_app_ui/resources/src/js/models/file_system_entry.js
index da0182a..1adccd5 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/models/file_system_entry.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/models/file_system_entry.js
@@ -56,7 +56,7 @@
    * original entry should not be used after calling this method.
    * @param {!AbstractDirectoryEntry} dir
    * @param {string} name
-   * @return {!Promise<AbstractFileEntry>} The new file entry.
+   * @return {!Promise<!AbstractFileEntry>} The new file entry.
    * @abstract
    */
   async moveTo(dir, name) {}
diff --git a/chromeos/components/camera_app_ui/resources/src/js/models/mp4_video_processor.js b/chromeos/components/camera_app_ui/resources/src/js/models/mp4_video_processor.js
index 37e84b9..2911ea6 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/models/mp4_video_processor.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/models/mp4_video_processor.js
@@ -39,7 +39,7 @@
   constructor() {
     /**
      * The data to be read from the device.
-     * @type {!Array<Int8Array>}
+     * @type {!Array<!Int8Array>}
      */
     this.data_ = [];
 
@@ -89,7 +89,7 @@
 
   /**
    * Implements the read() operation for the emulated device.
-   * @param {FileStream} stream
+   * @param {!FileStream} stream
    * @param {!Int8Array} buffer The destination buffer.
    * @param {number} offset The destination buffer offset.
    * @param {number} length The maximum length to read.
@@ -123,7 +123,7 @@
   }
 
   /**
-   * @return {FileOps}
+   * @return {!FileOps}
    */
   getFileOps() {
     return {
@@ -173,7 +173,7 @@
 
   /**
    * Implements the write() operation for the emulated device.
-   * @param {FileStream} stream
+   * @param {!FileStream} stream
    * @param {!Int8Array} buffer The source buffer.
    * @param {number} offset The source buffer offset.
    * @param {number} length The maximum length to be write.
@@ -205,7 +205,7 @@
   }
 
   /**
-   * @return {FileOps}
+   * @return {!FileOps}
    */
   getFileOps() {
     return {
diff --git a/chromeos/components/camera_app_ui/resources/src/js/mojo/chrome_helper.js b/chromeos/components/camera_app_ui/resources/src/js/mojo/chrome_helper.js
index 853fd83..559fdaa7 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/mojo/chrome_helper.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/mojo/chrome_helper.js
@@ -44,10 +44,10 @@
 
   /**
    * Starts monitor monitoring system screen state of device.
-   * @param {function(chromeosCamera.mojom.ScreenState)} onChange Callback
+   * @param {function(!chromeosCamera.mojom.ScreenState)} onChange Callback
    *     called each time when device screen state changes with parameter of
    *     newly changed value.
-   * @return {!Promise<chromeosCamera.mojom.ScreenState>} Resolved to initial
+   * @return {!Promise<!chromeosCamera.mojom.ScreenState>} Resolved to initial
    *     system screen state.
    */
   async initScreenStateMonitor(onChange) {
@@ -88,7 +88,7 @@
   /**
    * Checks return value from |handleCameraResult|.
    * @param {string} caller Caller identifier.
-   * @param {Promise<{isSuccess: boolean}>|null} value
+   * @param {!Promise<{isSuccess: boolean}>|null} value
    * @return {!Promise}
    */
   async checkReturn_(caller, value) {
diff --git a/chromeos/components/camera_app_ui/resources/src/js/mojo/device_operator.js b/chromeos/components/camera_app_ui/resources/src/js/mojo/device_operator.js
index 2b392ac2..330fba0 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/mojo/device_operator.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/mojo/device_operator.js
@@ -17,7 +17,7 @@
  *     from which to parse the data according to its type.
  * @return {!Array<number>} An array containing elements whose types correspond
  *     to the format of input |tag|.
- * @throws {Error} if entry type is not supported.
+ * @throws {!Error} if entry type is not supported.
  */
 export function parseMetadata(entry) {
   const {buffer} = Uint8Array.from(entry.data);
@@ -88,7 +88,7 @@
   constructor() {
     /**
      * An interface remote that is used to construct the mojo interface.
-     * @type {cros.mojom.CameraAppDeviceProviderRemote}
+     * @type {!cros.mojom.CameraAppDeviceProviderRemote}
      * @private
      */
     this.deviceProvider_ = cros.mojom.CameraAppDeviceProvider.getRemote();
@@ -110,7 +110,7 @@
    * @param {string} deviceId The id of target camera device.
    * @return {!Promise<!cros.mojom.CameraAppDeviceRemote>} Corresponding device
    *     remote.
-   * @throws {Error} Thrown when given device id is invalid.
+   * @throws {!Error} Thrown when given device id is invalid.
    */
   async getDevice_(deviceId) {
     const {device, status} =
@@ -129,7 +129,7 @@
    * @param {string} deviceId The renderer-facing device id of the target camera
    *     which could be retrieved from MediaDeviceInfo.deviceId.
    * @return {!Promise<!ResolutionList>} Promise of supported resolutions.
-   * @throws {Error} Thrown when fail to parse the metadata or the device
+   * @throws {!Error} Thrown when fail to parse the metadata or the device
    *     operation is not supported.
    */
   async getPhotoResolutions(deviceId) {
@@ -166,9 +166,9 @@
    * Gets supported video configurations for specific camera.
    * @param {string} deviceId The renderer-facing device id of the target camera
    *     which could be retrieved from MediaDeviceInfo.deviceId.
-   * @return {!Promise<!Array<VideoConfig>>} Promise of supported video
+   * @return {!Promise<!Array<!VideoConfig>>} Promise of supported video
    *     configurations.
-   * @throws {Error} Thrown when fail to parse the metadata or the device
+   * @throws {!Error} Thrown when fail to parse the metadata or the device
    *     operation is not supported.
    */
   async getVideoConfigs(deviceId) {
@@ -210,7 +210,7 @@
    * @param {string} deviceId The renderer-facing device id of the target camera
    *     which could be retrieved from MediaDeviceInfo.deviceId.
    * @return {!Promise<!Facing>} Promise of device facing.
-   * @throws {Error} Thrown when the device operation is not supported.
+   * @throws {!Error} Thrown when the device operation is not supported.
    */
   async getCameraFacing(deviceId) {
     const device = await this.getDevice_(deviceId);
@@ -233,7 +233,7 @@
    *     which could be retrieved from MediaDeviceInfo.deviceId.
    * @return {!Promise<!FpsRangeList>} Promise of supported fps ranges.
    *     Each range is represented as [min, max].
-   * @throws {Error} Thrown when fail to parse the metadata or the device
+   * @throws {!Error} Thrown when fail to parse the metadata or the device
    *     operation is not supported.
    */
   async getSupportedFpsRanges(deviceId) {
@@ -266,14 +266,14 @@
    * Sets the stream configurations for target device.
    * @param {string} deviceId The renderer-facing device id of the target camera
    *     which could be retrieved from MediaDeviceInfo.deviceId.
-   * @param {MediaStreamConstraints} constraints The constraints including fps
+   * @param {!MediaStreamConstraints} constraints The constraints including fps
    *     range and the resolution. If frame rate range negotiation is needed,
    *     the caller should either set exact field or set both min and max fields
    *     for frame rate property.
    * @param {{stillCaptureResolution: (!Resolution|undefined)}=} optConfig
    *     Optional configurations for streams.
-   * @throws {Error} Thrown when the input contains invalid values or the device
-   *     operation is not supported.
+   * @throws {!Error} Thrown when the input contains invalid values or the
+   *     device operation is not supported.
    */
   async setStreamConfig(deviceId, constraints, optConfig = {}) {
     let /** number */ minFrameRate = 0;
@@ -333,7 +333,7 @@
    * Sets the intent for the upcoming capture session.
    * @param {string} deviceId The renderer-facing device id of the target camera
    *     which could be retrieved from MediaDeviceInfo.deviceId.
-   * @param {cros.mojom.CaptureIntent} captureIntent The purpose of this
+   * @param {!cros.mojom.CaptureIntent} captureIntent The purpose of this
    *     capture, to help the camera device decide optimal configurations.
    * @return {!Promise} Promise for the operation.
    */
@@ -347,14 +347,14 @@
    * @param {string} deviceId The renderer-facing device id of the target camera
    *     which could be retrieved from MediaDeviceInfo.deviceId.
    * @return {!Promise<boolean>} Promise of the boolean result.
-   * @throws {Error} Thrown when the device operation is not supported.
+   * @throws {!Error} Thrown when the device operation is not supported.
    */
   async isPortraitModeSupported(deviceId) {
     // TODO(wtlee): Change to portrait mode tag.
     // This should be 0x80000000 but mojo interface will convert the tag to
     // int32.
     const portraitModeTag =
-        /** @type{cros.mojom.CameraMetadataTag} */ (-0x80000000);
+        /** @type{!cros.mojom.CameraMetadataTag} */ (-0x80000000);
 
     const device = await this.getDevice_(deviceId);
     const {cameraInfo} = await device.getCameraInfo();
@@ -366,13 +366,13 @@
   /**
    * Adds a metadata observer to Camera App Device through Mojo IPC.
    * @param {string} deviceId The id for target camera device.
-   * @param {function(cros.mojom.CameraMetadata)} callback Callback that
+   * @param {function(!cros.mojom.CameraMetadata)} callback Callback that
    *     handles the metadata.
-   * @param {cros.mojom.StreamType} streamType Stream type which the observer
+   * @param {!cros.mojom.StreamType} streamType Stream type which the observer
    *     gets the metadata from.
    * @return {!Promise<number>} id for the added observer. Can be used later
    *     to identify and remove the inserted observer.
-   * @throws {Error} if fails to construct device connection.
+   * @throws {!Error} if fails to construct device connection.
    */
   async addMetadataObserver(deviceId, callback, streamType) {
     const observerCallbackRouter =
@@ -392,7 +392,7 @@
    * @param {!number} observerId The id for the metadata observer to be removed.
    * @return {!Promise<boolean>} Promise for the result. It will be resolved
    *     with a boolean indicating whether the removal is successful or not.
-   * @throws {Error} if fails to construct device connection.
+   * @throws {!Error} if fails to construct device connection.
    */
   async removeMetadataObserver(deviceId, observerId) {
     const device = await this.getDevice_(deviceId);
@@ -410,7 +410,7 @@
    * @param {string} deviceId The id for target camera device.
    * @param {function()} callback Callback to trigger on shutter done.
    * @return {!Promise<number>} Id for the added observer.
-   * @throws {Error} if fails to construct device connection.
+   * @throws {!Error} if fails to construct device connection.
    */
   async addShutterObserver(deviceId, callback) {
     const observerCallbackRouter =
@@ -428,7 +428,7 @@
    * @param {string} deviceId The id of target camera device.
    * @param {!number} observerId The id of the observer to be removed.
    * @return {!Promise<boolean>} True when the observer is successfully removed.
-   * @throws {Error} if fails to construct device connection.
+   * @throws {!Error} if fails to construct device connection.
    */
   async removeShutterObserver(deviceId, observerId) {
     const device = await this.getDevice_(deviceId);
@@ -445,8 +445,8 @@
    *     that would be applied on the result.
    * @return {!Promise<!media.mojom.Blob>} The captured
    *     result with given effect.
-   * @throws {Error} Thrown when the reprocess is failed or the device operation
-   *     is not supported.
+   * @throws {!Error} Thrown when the reprocess is failed or the device
+   *     operation is not supported.
    */
   async setReprocessOption(deviceId, effect) {
     const device = await this.getDevice_(deviceId);
diff --git a/chromeos/components/camera_app_ui/resources/src/js/mojo/image_capture.js b/chromeos/components/camera_app_ui/resources/src/js/mojo/image_capture.js
index a593b401..c4eaf18 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/mojo/image_capture.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/mojo/image_capture.js
@@ -32,7 +32,7 @@
 
     /**
      * The standard ImageCapture object.
-     * @type {ImageCapture}
+     * @type {!ImageCapture}
      * @private
      */
     this.capture_ = new ImageCapture(videoTrack);
@@ -40,7 +40,7 @@
 
   /**
    * Gets the photo capabilities with the available options/effects.
-   * @return {!Promise<!PhotoCapabilities|CrosPhotoCapabilities>} Promise
+   * @return {!Promise<!PhotoCapabilities|!CrosPhotoCapabilities>} Promise
    *     for the result.
    */
   async getPhotoCapabilities() {
@@ -70,13 +70,13 @@
    * received the shutter event.
    * @param {!PhotoSettings} photoSettings Photo settings for ImageCapture's
    *     takePhoto().
-   * @param {!Array<cros.mojom.Effect>=} photoEffects Photo effects to be
+   * @param {!Array<!cros.mojom.Effect>=} photoEffects Photo effects to be
    *     applied.
    * @return {!Promise<!Array<!Promise<!Blob>>>} A promise of the array
    *     containing promise of each blob result.
    */
   async takePhoto(photoSettings, photoEffects = []) {
-    /** @type {Array<!Promise<!Blob>>} */
+    /** @type {!Array<!Promise<!Blob>>} */
     const takes = [];
     const deviceOperator = await DeviceOperator.getInstance();
     if (deviceOperator === null && photoEffects.length > 0) {
diff --git a/chromeos/components/camera_app_ui/resources/src/js/nav.js b/chromeos/components/camera_app_ui/resources/src/js/nav.js
index 273d67de..cbbb512f 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/nav.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/nav.js
@@ -88,7 +88,7 @@
  * Shows the view indexed in the stacked views and activates the view only if
  * it becomes the topmost visible view.
  * @param {number} index Index of the view.
- * @return {View} View shown.
+ * @return {!View} View shown.
  */
 function show(index) {
   const view = allViews[index];
@@ -138,7 +138,7 @@
 
 /**
  * Finds the view by its name in the stacked views.
- * @param {ViewName} name View name.
+ * @param {!ViewName} name View name.
  * @return {number} Index of the view found; otherwise, -1.
  */
 function findIndex(name) {
@@ -148,7 +148,7 @@
 /**
  * Opens a navigation session of the view; shows the view before entering it and
  * hides the view after leaving it for the ended session.
- * @param {ViewName} name View name.
+ * @param {!ViewName} name View name.
  * @param {...*} args Optional rest parameters for entering the view.
  * @return {!Promise<*>} Promise for the operation or result.
  */
@@ -161,7 +161,7 @@
 
 /**
  * Closes the current navigation session of the view by leaving it.
- * @param {ViewName} name View name.
+ * @param {!ViewName} name View name.
  * @param {*=} condition Optional condition for leaving the view.
  * @return {boolean} Whether successfully leaving the view or not.
  */
@@ -172,7 +172,7 @@
 
 /**
  * Handles key pressed event.
- * @param {Event} event Key press event.
+ * @param {!Event} event Key press event.
  */
 export function onKeyPressed(event) {
   const key = util.getShortcutIdentifier(event);
diff --git a/chromeos/components/camera_app_ui/resources/src/js/perf.js b/chromeos/components/camera_app_ui/resources/src/js/perf.js
index 6e4bf3b..d42caa87 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/perf.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/perf.js
@@ -25,7 +25,7 @@
 };
 
 /**
- * @typedef {function(PerfEvent, number, !Object=)}
+ * @typedef {function(!PerfEvent, number, !Object=)}
  */
 let PerfEventListener;  // eslint-disable-line no-unused-vars
 
@@ -39,14 +39,14 @@
   constructor() {
     /**
      * Map to store events starting timestamp.
-     * @type {!Map<PerfEvent, number>}
+     * @type {!Map<!PerfEvent, number>}
      * @private
      */
     this.startTimeMap_ = new Map();
 
     /**
      * Set of the listeners for perf events.
-     * @type {!Set<PerfEventListener>}
+     * @type {!Set<!PerfEventListener>}
      */
     this.listeners_ = new Set();
 
@@ -76,7 +76,7 @@
 
   /**
    * Starts the measurement for given event.
-   * @param {PerfEvent} event Target event.
+   * @param {!PerfEvent} event Target event.
    */
   start(event) {
     if (this.startTimeMap_.has(event)) {
@@ -90,8 +90,8 @@
 
   /**
    * Stops the measurement for given event and returns the measurement result.
-   * @param {PerfEvent} event Target event.
-   * @param {PerfInformation=} perfInfo Optional information of this event
+   * @param {!PerfEvent} event Target event.
+   * @param {!PerfInformation=} perfInfo Optional information of this event
    *     for performance measurement.
    */
   stop(event, perfInfo = {}) {
@@ -122,7 +122,7 @@
 
   /**
    * Stops the measurement of launch-related events.
-   * @param {PerfInformation=} perfInfo Optional information of this event
+   * @param {!PerfInformation=} perfInfo Optional information of this event
    *     for performance measurement.
    */
   stopLaunch(perfInfo) {
diff --git a/chromeos/components/camera_app_ui/resources/src/js/state.js b/chromeos/components/camera_app_ui/resources/src/js/state.js
index 0d39e82..bd1281399 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/state.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/state.js
@@ -67,7 +67,7 @@
 };
 
 /**
- * @typedef {(State|Mode|ViewName|PerfEvent)}
+ * @typedef {(!State|!Mode|!ViewName|!PerfEvent)}
  */
 export let StateUnion;
 
@@ -77,26 +77,26 @@
 /**
  * Asserts input string is valid state.
  * @param {string} s
- * @return {State}
+ * @return {!State}
  */
 export function assertState(s) {
   assert(stateValues.has(s), `No such state: ${s}`);
-  return /** @type {State} */ (s);
+  return /** @type {!State} */ (s);
 }
 
 /**
- * @typedef {function(boolean, PerfInformation=)}
+ * @typedef {function(boolean, !PerfInformation=)}
  */
 let StateObserver;  // eslint-disable-line no-unused-vars
 
 /**
- * @type {!Map<StateUnion, Set<!StateObserver>>}
+ * @type {!Map<!StateUnion, !Set<!StateObserver>>}
  */
 const allObservers = new Map();
 
 /**
  * Adds observer function to be called on any state change.
- * @param {StateUnion} state State to be observed.
+ * @param {!StateUnion} state State to be observed.
  * @param {!StateObserver} observer Observer function called with
  *     newly changed value.
  */
@@ -111,7 +111,7 @@
 
 /**
  * Removes observer function to be called on state change.
- * @param {StateUnion} state State to remove observer from.
+ * @param {!StateUnion} state State to remove observer from.
  * @param {!StateObserver} observer Observer function to be removed.
  * @return {boolean} Whether the observer is in the set and is removed
  *     successfully or not.
@@ -126,7 +126,7 @@
 
 /**
  * Checks if the specified state exists.
- * @param {StateUnion} state State to be checked.
+ * @param {!StateUnion} state State to be checked.
  * @return {boolean} Whether the state exists.
  */
 export function get(state) {
@@ -136,9 +136,9 @@
 /**
  * Sets the specified state on or off. Optionally, pass the information for
  * performance measurement.
- * @param {StateUnion} state State to be set.
+ * @param {!StateUnion} state State to be set.
  * @param {boolean} val True to set the state on, false otherwise.
- * @param {PerfInformation=} perfInfo Optional information of this state
+ * @param {!PerfInformation=} perfInfo Optional information of this state
  *     for performance measurement.
  */
 export function set(state, val, perfInfo = {}) {
diff --git a/chromeos/components/camera_app_ui/resources/src/js/tooltip.js b/chromeos/components/camera_app_ui/resources/src/js/tooltip.js
index fdd190b..1b7d0c44 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/tooltip.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/tooltip.js
@@ -68,8 +68,8 @@
 
 /**
  * Sets up tooltips for elements.
- * @param {!NodeList<Element>} elements Elements whose tooltips to be shown.
- * @return {!NodeList<Element>} Elements whose tooltips have been set up.
+ * @param {!NodeList<!Element>} elements Elements whose tooltips to be shown.
+ * @return {!NodeList<!Element>} Elements whose tooltips have been set up.
  */
 export function setup(elements) {
   wrapper = assertInstanceof(document.querySelector('#tooltip'), HTMLElement);
diff --git a/chromeos/components/camera_app_ui/resources/src/js/type.js b/chromeos/components/camera_app_ui/resources/src/js/type.js
index d0589bd3..169cae16 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/type.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/type.js
@@ -125,7 +125,7 @@
 /**
  * @typedef {{
  *   hasError: (boolean|undefined),
- *   resolution: (Resolution|undefined),
+ *   resolution: (!Resolution|undefined),
  * }}
  */
 export let PerfInformation;
@@ -149,7 +149,7 @@
 
 /**
  * A list of resolutions.
- * @typedef {Array<!Resolution>}
+ * @typedef {!Array<!Resolution>}
  */
 export let ResolutionList;
 
@@ -157,12 +157,12 @@
  * Map of all available resolution to its maximal supported capture fps. The key
  * of the map is the resolution and the corresponding value is the maximal
  * capture fps under that resolution.
- * @typedef {Object<(!Resolution|string), number>}
+ * @typedef {!Object<(!Resolution|string), number>}
  */
 export let MaxFpsInfo;
 
 /**
  * List of supported capture fps ranges.
- * @typedef {Array<!FpsRange>}
+ * @typedef {!Array<!FpsRange>}
  */
 export let FpsRangeList;
diff --git a/chromeos/components/camera_app_ui/resources/src/js/util.js b/chromeos/components/camera_app_ui/resources/src/js/util.js
index 6bcd7ab..861fbee 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/util.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/util.js
@@ -90,7 +90,7 @@
 /**
  * Orients a photo to the upright orientation.
  * @param {!Blob} blob Photo as a blob.
- * @param {function(Blob)} onSuccess Success callback with the result photo as
+ * @param {function(!Blob)} onSuccess Success callback with the result photo as
  *     a blob.
  * @param {function()} onFailure Failure callback.
  */
@@ -159,7 +159,7 @@
 
 /**
  * Cancels animating the element by removing 'animate' class.
- * @param {HTMLElement} element Element for canceling animation.
+ * @param {!HTMLElement} element Element for canceling animation.
  * @return {!Promise} Promise resolved when ongoing animation is canceled and
  *     next animation can be safely applied.
  */
@@ -205,7 +205,7 @@
 
 /**
  * Animates the element once by applying 'animate' class.
- * @param {HTMLElement} element Element to be animated.
+ * @param {!HTMLElement} element Element to be animated.
  * @param {function()=} callback Callback called on completion.
  */
 export function animateOnce(element, callback) {
@@ -222,7 +222,7 @@
 
 /**
  * Returns a shortcut string, such as Ctrl-Alt-A.
- * @param {Event} event Keyboard event.
+ * @param {!Event} event Keyboard event.
  * @return {string} Shortcut identifier.
  */
 export function getShortcutIdentifier(event) {
@@ -259,7 +259,7 @@
 
 /**
  * Makes the element unfocusable by mouse.
- * @param {HTMLElement} element Element to be unfocusable.
+ * @param {!HTMLElement} element Element to be unfocusable.
  */
 export function makeUnfocusableByMouse(element) {
   element.addEventListener('mousedown', (event) => event.preventDefault());
@@ -306,7 +306,7 @@
  * Reads blob into Image.
  * @param {!Blob} blob
  * @return {!Promise<!HTMLImageElement>}
- * @throws {Error}
+ * @throws {!Error}
  */
 export function blobToImage(blob) {
   return new Promise((resolve, reject) => {
@@ -392,7 +392,7 @@
 
 /**
  * Binds on/off of specified state with different aria label on an element.
- * @param {!{element: !Element, state: state.State, onLabel: string,
+ * @param {!{element: !Element, state: !state.State, onLabel: string,
  *     offLabel: string}} params
  */
 export function bindElementAriaLabelWithState(
diff --git a/chromeos/components/camera_app_ui/resources/src/js/views/camera.js b/chromeos/components/camera_app_ui/resources/src/js/views/camera.js
index e6db4ce..137477eb 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/views/camera.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/views/camera.js
@@ -62,7 +62,7 @@
    * @param {!DeviceInfoUpdater} infoUpdater
    * @param {!PhotoConstraintsPreferrer} photoPreferrer
    * @param {!VideoConstraintsPreferrer} videoPreferrer
-   * @param {Mode} defaultMode
+   * @param {!Mode} defaultMode
    * @param {!PerfLogger} perfLogger
    */
   constructor(
@@ -132,7 +132,7 @@
 
     /**
      * Modes for the camera.
-     * @type {Modes}
+     * @type {!Modes}
      * @private
      */
     this.modes_ = new Modes(
@@ -320,7 +320,7 @@
 
   /**
    * Begins to take photo or recording with the current options, e.g. timer.
-   * @param {metrics.ShutterType} shutterType The shutter is triggered by which
+   * @param {!metrics.ShutterType} shutterType The shutter is triggered by which
    *     shutter type.
    * @return {?Promise} Promise resolved when take action completes. Returns
    *     null if CCA can't start take action.
diff --git a/chromeos/components/camera_app_ui/resources/src/js/views/camera/modes.js b/chromeos/components/camera_app_ui/resources/src/js/views/camera/modes.js
index 206b36d6..7a0f6719 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/views/camera/modes.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/views/camera/modes.js
@@ -65,7 +65,7 @@
  * param {!PhotoResult} Captured photo result.
  * param {string} Name of the photo result to be saved as.
  * return {!Promise}
- * @typedef {function(PhotoResult, string): !Promise}
+ * @typedef {function(!PhotoResult, string): !Promise}
  */
 export let DoSavePhoto;
 
@@ -321,7 +321,7 @@
     });
 
     [state.State.EXPERT, state.State.SAVE_METADATA].forEach(
-        (/** state.State */ s) => {
+        (/** !state.State */ s) => {
           state.addObserver(s, this.updateSaveMetadata_.bind(this));
         });
 
@@ -330,7 +330,7 @@
   }
 
   /**
-   * @return {!Array<Mode>}
+   * @return {!Array<!Mode>}
    * @private
    */
   get allModeNames_() {
@@ -369,7 +369,7 @@
    */
   getModeCandidates() {
     const tried = {};
-    const /** !Array<Mode> */ results = [];
+    const /** !Array<!Mode> */ results = [];
     let mode = this.allModeNames_.find(state.get);
     assert(mode !== undefined);
     while (!tried[mode]) {
@@ -408,7 +408,7 @@
   /**
    * Gets capture intent for the given mode.
    * @param {!Mode} mode
-   * @return {cros.mojom.CaptureIntent} Capture intent for the given mode.
+   * @return {!cros.mojom.CaptureIntent} Capture intent for the given mode.
    */
   getCaptureIntent(mode) {
     return this.allModes_[mode].captureIntent;
@@ -421,7 +421,7 @@
    *     the video device.
    */
   async getSupportedModes(deviceId) {
-    const /** !Array<Mode> */ supportedModes = [];
+    const /** !Array<!Mode> */ supportedModes = [];
     for (const mode of this.allModeNames_) {
       const obj = this.allModes_[mode];
       if (await obj.isSupported(deviceId)) {
diff --git a/chromeos/components/camera_app_ui/resources/src/js/views/dialog.js b/chromeos/components/camera_app_ui/resources/src/js/views/dialog.js
index da16c34b..8a7e7716 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/views/dialog.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/views/dialog.js
@@ -12,7 +12,7 @@
  */
 export class Dialog extends View {
   /**
-   * @param {ViewName} name View name of the dialog.
+   * @param {!ViewName} name View name of the dialog.
    */
   constructor(name) {
     super(name, true);
diff --git a/chromeos/components/camera_app_ui/resources/src/js/views/settings.js b/chromeos/components/camera_app_ui/resources/src/js/views/settings.js
index b3e945c9..7a87638 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/views/settings.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/views/settings.js
@@ -50,8 +50,8 @@
  */
 export class BaseSettings extends View {
   /**
-   * @param {ViewName} name Name of the view.
-   * @param {!Object<string, function(Event=)>=} itemHandlers Click-handlers
+   * @param {!ViewName} name Name of the view.
+   * @param {!Object<string, function(!Event=)>=} itemHandlers Click-handlers
    *     mapped by element ids.
    */
   constructor(name, itemHandlers = {}) {
@@ -60,7 +60,7 @@
     this.root.querySelector('.menu-header button')
         .addEventListener('click', () => this.leave());
     this.root.querySelectorAll('.menu-item').forEach((element) => {
-      /** @type {function(Event=)|undefined} */
+      /** @type {function(!Event=)|undefined} */
       const handler = itemHandlers[element.id];
       if (handler) {
         element.addEventListener('click', handler);
@@ -77,7 +77,7 @@
 
   /**
    * Opens sub-settings.
-   * @param {ViewName} name Name of settings view.
+   * @param {!ViewName} name Name of settings view.
    * @private
    */
   openSubSettings(name) {
diff --git a/chromeos/components/camera_app_ui/resources/src/js/views/view.js b/chromeos/components/camera_app_ui/resources/src/js/views/view.js
index ddde67ed..2a2f8a5 100644
--- a/chromeos/components/camera_app_ui/resources/src/js/views/view.js
+++ b/chromeos/components/camera_app_ui/resources/src/js/views/view.js
@@ -36,7 +36,7 @@
  */
 export class View {
   /**
-   * @param {ViewName} name Unique name of view which should be same as its DOM
+   * @param {!ViewName} name Unique name of view which should be same as its DOM
    *     element id.
    * @param {boolean=} dismissByEsc Enable dismissible by Esc-key.
    * @param {boolean=} dismissByBkgndClick Enable dismissible by
@@ -44,7 +44,7 @@
    */
   constructor(name, dismissByEsc = false, dismissByBkgndClick = false) {
     /**
-     * @const {ViewName}
+     * @const {!ViewName}
      */
     this.name = name;
 
@@ -119,14 +119,14 @@
 
   /**
    * Hook of the subclass for entering the view.
-   * @param {EnterOptions=} options Optional rest parameters for
+   * @param {!EnterOptions=} options Optional rest parameters for
    *     entering the view.
    */
   entering(options) {}
 
   /**
    * Enters the view.
-   * @param {EnterOptions=} options Optional rest parameters for
+   * @param {!EnterOptions=} options Optional rest parameters for
    *     entering the view.
    * @return {!Promise<*>} Promise for the navigation session.
    */
diff --git a/chromeos/components/help_app_ui/test/help_app_ui_browsertest.js b/chromeos/components/help_app_ui/test/help_app_ui_browsertest.js
index 4299941..223a99f6 100644
--- a/chromeos/components/help_app_ui/test/help_app_ui_browsertest.js
+++ b/chromeos/components/help_app_ui/test/help_app_ui_browsertest.js
@@ -33,11 +33,6 @@
   }
 
   /** @override */
-  get featureList() {
-    return {enabled: ['chromeos::features::kHelpAppV2']};
-  }
-
-  /** @override */
   get isAsync() {
     return true;
   }
diff --git a/chromeos/components/telemetry_extension_ui/resources/trusted.js b/chromeos/components/telemetry_extension_ui/resources/trusted.js
index 548623bd..bbd43d3 100644
--- a/chromeos/components/telemetry_extension_ui/resources/trusted.js
+++ b/chromeos/components/telemetry_extension_ui/resources/trusted.js
@@ -137,23 +137,14 @@
 
 const telemetryProxy = new TelemetryProxy();
 
-/**
- * @type { MessagePipe|null }
- */
-var untrustedMessagePipe = null;
+const untrustedMessagePipe =
+    new MessagePipe('chrome-untrusted://telemetry-extension');
 
-document.addEventListener('DOMContentLoaded', async () => {
-  const untrustedMessagePipe =
-      new MessagePipe('chrome-untrusted://telemetry-extension');
+untrustedMessagePipe.registerHandler(
+    dpsl_internal.Message.DIAGNOSTICS_AVAILABLE_ROUTINES, async () => {
+      return await getOrCreateDiagnosticsService().getAvailableRoutines();
+    });
 
-  untrustedMessagePipe.registerHandler(
-      dpsl_internal.Message.DIAGNOSTICS_AVAILABLE_ROUTINES, async () => {
-        return await getOrCreateDiagnosticsService().getAvailableRoutines();
-      });
-
-  untrustedMessagePipe.registerHandler(
-      dpsl_internal.Message.PROBE_TELEMETRY_INFO,
-      (message) => telemetryProxy.handleProbeTelemetryInfo(message));
-
-  globalThis.untrustedMessagePipe = untrustedMessagePipe;
-});
+untrustedMessagePipe.registerHandler(
+    dpsl_internal.Message.PROBE_TELEMETRY_INFO,
+    (message) => telemetryProxy.handleProbeTelemetryInfo(message));
diff --git a/chromeos/constants/chromeos_features.cc b/chromeos/constants/chromeos_features.cc
index 2cf5a888..9245748 100644
--- a/chromeos/constants/chromeos_features.cc
+++ b/chromeos/constants/chromeos_features.cc
@@ -239,9 +239,6 @@
 const base::Feature kGaiaActionButtons{"GaiaActionButtons",
                                        base::FEATURE_ENABLED_BY_DEFAULT};
 
-// The new ChromeOS Help App. https://crbug.com/1012578.
-const base::Feature kHelpAppV2{"HelpAppV2", base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Enable the help app in the first run experience. This opens the help app
 // after the OOBE, and provides some extra functionality like a getting started
 // guide inside the app.
@@ -303,11 +300,11 @@
     "LoginDisplayPasswordButton", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Controls whether to enable the requirement of a minimum chrome version on the
-// device through the policy MinimumChromeVersionEnforced. If the requirement is
+// device through the policy DeviceMinimumVersion. If the requirement is
 // not met and the warning time in the policy has expired, the user is
 // restricted from using the session.
 const base::Feature kMinimumChromeVersion{"MinimumChromeVersion",
-                                          base::FEATURE_DISABLED_BY_DEFAULT};
+                                          base::FEATURE_ENABLED_BY_DEFAULT};
 
 // ChromeOS Media App. https://crbug.com/996088.
 const base::Feature kMediaApp{"MediaApp", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chromeos/constants/chromeos_features.h b/chromeos/constants/chromeos_features.h
index 37b4855..9c05b47 100644
--- a/chromeos/constants/chromeos_features.h
+++ b/chromeos/constants/chromeos_features.h
@@ -113,7 +113,6 @@
 extern const base::Feature kHelpAppReleaseNotes;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kHelpAppSearchServiceIntegration;
-COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const base::Feature kHelpAppV2;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const base::Feature kImeInputLogicHmm;
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
diff --git a/chromeos/constants/chromeos_switches.cc b/chromeos/constants/chromeos_switches.cc
index e6bab67..b6b445a3 100644
--- a/chromeos/constants/chromeos_switches.cc
+++ b/chromeos/constants/chromeos_switches.cc
@@ -578,7 +578,7 @@
 // throttled.
 const char kDisableArcCpuRestriction[] = "disable-arc-cpu-restriction";
 
-// If this switch is passed, the device policy MinimumChromeVersionEnforced
+// If this switch is passed, the device policy DeviceMinimumVersion
 // assumes that the device has reached Auto Update Expiration. This is useful
 // for testing the policy behaviour on the DUT.
 const char kUpdateRequiredAueForTest[] = "aue-reached-for-update-required-test";
diff --git a/chromeos/constants/chromeos_switches.h b/chromeos/constants/chromeos_switches.h
index cf8f7e77..f471952 100644
--- a/chromeos/constants/chromeos_switches.h
+++ b/chromeos/constants/chromeos_switches.h
@@ -280,7 +280,7 @@
 // device is not in tablet mode.
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) bool ShouldOobeUseTabletModeFirstRun();
 
-// Returns true if device policy MinimumChromeVersionEnforced should assume that
+// Returns true if device policy DeviceMinimumVersion should assume that
 // Auto Update Expiration is reached. This should only be used for testing.
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 bool IsAueReachedForUpdateRequiredForTest();
diff --git a/chromeos/dbus/system_proxy/fake_system_proxy_client.cc b/chromeos/dbus/system_proxy/fake_system_proxy_client.cc
index 20462e4..baa7569 100644
--- a/chromeos/dbus/system_proxy/fake_system_proxy_client.cc
+++ b/chromeos/dbus/system_proxy/fake_system_proxy_client.cc
@@ -31,6 +31,15 @@
       FROM_HERE, base::BindOnce(std::move(callback), response));
 }
 
+void FakeSystemProxyClient::ClearUserCredentials(
+    const system_proxy::ClearUserCredentialsRequest& request,
+    ClearUserCredentialsCallback callback) {
+  ++clear_user_credentials_call_count_;
+  system_proxy::ClearUserCredentialsResponse response;
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback), response));
+}
+
 void FakeSystemProxyClient::SetWorkerActiveSignalCallback(
     WorkerActiveCallback callback) {
   worker_active_callback_ = callback;
@@ -56,6 +65,10 @@
   return shut_down_call_count_;
 }
 
+int FakeSystemProxyClient::GetClearUserCredentialsCount() const {
+  return clear_user_credentials_call_count_;
+}
+
 system_proxy::SetAuthenticationDetailsRequest
 FakeSystemProxyClient::GetLastAuthenticationDetailsRequest() const {
   return last_set_auth_details_request_;
diff --git a/chromeos/dbus/system_proxy/fake_system_proxy_client.h b/chromeos/dbus/system_proxy/fake_system_proxy_client.h
index 5962a88..300b68b 100644
--- a/chromeos/dbus/system_proxy/fake_system_proxy_client.h
+++ b/chromeos/dbus/system_proxy/fake_system_proxy_client.h
@@ -28,6 +28,10 @@
   void SetWorkerActiveSignalCallback(WorkerActiveCallback callback) override;
   void SetAuthenticationRequiredSignalCallback(
       AuthenticationRequiredCallback callback) override;
+  void ClearUserCredentials(
+      const system_proxy::ClearUserCredentialsRequest& request,
+      ClearUserCredentialsCallback callback) override;
+
   void ConnectToWorkerSignals() override;
 
   SystemProxyClient::TestInterface* GetTestInterface() override;
@@ -35,6 +39,7 @@
   // SystemProxyClient::TestInterface implementation.
   int GetSetAuthenticationDetailsCallCount() const override;
   int GetShutDownCallCount() const override;
+  int GetClearUserCredentialsCount() const override;
   system_proxy::SetAuthenticationDetailsRequest
   GetLastAuthenticationDetailsRequest() const override;
   void SendAuthenticationRequiredSignal(
@@ -44,6 +49,7 @@
   system_proxy::SetAuthenticationDetailsRequest last_set_auth_details_request_;
   int set_credentials_call_count_ = 0;
   int shut_down_call_count_ = 0;
+  int clear_user_credentials_call_count_ = 0;
   bool connect_to_worker_signals_called_ = false;
   // Signal callbacks.
   SystemProxyClient::WorkerActiveCallback worker_active_callback_;
diff --git a/chromeos/dbus/system_proxy/system_proxy_client.cc b/chromeos/dbus/system_proxy/system_proxy_client.cc
index e5a8646..8bd005b 100644
--- a/chromeos/dbus/system_proxy/system_proxy_client.cc
+++ b/chromeos/dbus/system_proxy/system_proxy_client.cc
@@ -71,6 +71,13 @@
     CallProtoMethod(system_proxy::kShutDownMethod, std::move(callback));
   }
 
+  void ClearUserCredentials(
+      const system_proxy::ClearUserCredentialsRequest& request,
+      ClearUserCredentialsCallback callback) override {
+    CallProtoMethodWithRequest(system_proxy::kClearUserCredentialsMethod,
+                               request, std::move(callback));
+  }
+
   void SetWorkerActiveSignalCallback(WorkerActiveCallback callback) override {
     DCHECK(callback);
     DCHECK(!worker_active_callback_);
diff --git a/chromeos/dbus/system_proxy/system_proxy_client.h b/chromeos/dbus/system_proxy/system_proxy_client.h
index afd600f..2955dd8 100644
--- a/chromeos/dbus/system_proxy/system_proxy_client.h
+++ b/chromeos/dbus/system_proxy/system_proxy_client.h
@@ -29,6 +29,8 @@
       const system_proxy::WorkerActiveSignalDetails& details)>;
   using AuthenticationRequiredCallback = base::RepeatingCallback<void(
       const system_proxy::AuthenticationRequiredDetails& details)>;
+  using ClearUserCredentialsCallback = base::OnceCallback<void(
+      const system_proxy::ClearUserCredentialsResponse& response)>;
 
   // Interface with testing functionality. Accessed through GetTestInterface(),
   // only implemented in the fake implementation.
@@ -38,6 +40,8 @@
     virtual int GetSetAuthenticationDetailsCallCount() const = 0;
     // Returns how many times |ShutDownDaemon| was called.
     virtual int GetShutDownCallCount() const = 0;
+    // Returns how many times |ClearUserCredentials| was called.
+    virtual int GetClearUserCredentialsCount() const = 0;
     // Returns the content of the last request sent to the System-proxy service
     // to set authentication details.
     virtual system_proxy::SetAuthenticationDetailsRequest
@@ -79,6 +83,10 @@
   // task and reply. |callback| is called when the daemon starts to shut-down.
   virtual void ShutDownDaemon(ShutDownDaemonCallback callback) = 0;
 
+  virtual void ClearUserCredentials(
+      const system_proxy::ClearUserCredentialsRequest& request,
+      ClearUserCredentialsCallback callback) = 0;
+
   // Returns an interface for testing (fake only), or returns nullptr.
   virtual TestInterface* GetTestInterface() = 0;
 
diff --git a/chromeos/settings/cros_settings_names.cc b/chromeos/settings/cros_settings_names.cc
index 68153c6..22dd27e 100644
--- a/chromeos/settings/cros_settings_names.cc
+++ b/chromeos/settings/cros_settings_names.cc
@@ -484,4 +484,8 @@
 // An enum pref that indicates whether adb sideloading is allowed on this device
 const char kDeviceCrostiniArcAdbSideloadingAllowed[] =
     "cros.device.crostini_arc_adb_sideloading_allowed";
+
+// A boolean pref controlling showing the low disk space notification.
+const char kDeviceShowLowDiskSpaceNotification[] =
+    "cros.device.show_low_disk_space_notification";
 }  // namespace chromeos
diff --git a/chromeos/settings/cros_settings_names.h b/chromeos/settings/cros_settings_names.h
index df2b5bdf..9a39170a9 100644
--- a/chromeos/settings/cros_settings_names.h
+++ b/chromeos/settings/cros_settings_names.h
@@ -276,6 +276,9 @@
 
 COMPONENT_EXPORT(CHROMEOS_SETTINGS)
 extern const char kDeviceCrostiniArcAdbSideloadingAllowed[];
+
+COMPONENT_EXPORT(CHROMEOS_SETTINGS)
+extern const char kDeviceShowLowDiskSpaceNotification[];
 }  // namespace chromeos
 
 #endif  // CHROMEOS_SETTINGS_CROS_SETTINGS_NAMES_H_
diff --git a/components/arc/metrics/arc_metrics_constants.h b/components/arc/metrics/arc_metrics_constants.h
index a3c9169..8cb11e8 100644
--- a/components/arc/metrics/arc_metrics_constants.h
+++ b/components/arc/metrics/arc_metrics_constants.h
@@ -95,7 +95,10 @@
   // User started an app from entering URL in the Omnibox in the browser.
   APP_STARTED_FROM_OMNIBOX = 20,
 
-  kMaxValue = APP_STARTED_FROM_OMNIBOX,
+  // User started an app from Chrome OS sharesheet.
+  APP_STARTED_FROM_SHARESHEET = 21,
+
+  kMaxValue = APP_STARTED_FROM_SHARESHEET,
 };
 
 // Enumerates relevant Mojo connections.
diff --git a/components/content_settings/browser/tab_specific_content_settings.cc b/components/content_settings/browser/tab_specific_content_settings.cc
index 42ec61d..2a667d6 100644
--- a/components/content_settings/browser/tab_specific_content_settings.cc
+++ b/components/content_settings/browser/tab_specific_content_settings.cc
@@ -878,14 +878,6 @@
       status.blocked = setting == CONTENT_SETTING_BLOCK;
       break;
     }
-    case ContentSettingsType::GEOLOCATION: {
-      const GURL geolocation_origin = main_frame_->GetLastCommittedURL();
-      ContentSetting setting = map_->GetContentSetting(
-          geolocation_origin, geolocation_origin, content_type, std::string());
-      if (setting == CONTENT_SETTING_ALLOW)
-        geolocation_was_just_granted_on_site_level_ = true;
-      break;
-    }
     case ContentSettingsType::IMAGES:
     case ContentSettingsType::JAVASCRIPT:
     case ContentSettingsType::PLUGINS:
diff --git a/components/content_settings/browser/tab_specific_content_settings.h b/components/content_settings/browser/tab_specific_content_settings.h
index da1ec14..6c3d78e 100644
--- a/components/content_settings/browser/tab_specific_content_settings.h
+++ b/components/content_settings/browser/tab_specific_content_settings.h
@@ -282,10 +282,6 @@
     return mic_was_just_granted_on_site_level_;
   }
 
-  bool geolocation_was_just_granted_on_site_level() {
-    return geolocation_was_just_granted_on_site_level_;
-  }
-
   // Returns the state of the camera and microphone usage.
   // The return value always includes all active media capture devices, on top
   // of the devices from the last request.
@@ -553,12 +549,10 @@
   std::string media_stream_requested_audio_device_;
   std::string media_stream_requested_video_device_;
 
-  // The Geolocation, camera, and/or microphone permission was granted to this
-  // origin from a permission prompt that was triggered by the currently active
-  // document.
+  // The camera and/or microphone permission was granted to this origin from a
+  // permission prompt that was triggered by the currently active document.
   bool camera_was_just_granted_on_site_level_ = false;
   bool mic_was_just_granted_on_site_level_ = false;
-  bool geolocation_was_just_granted_on_site_level_ = false;
 
   // Observer to watch for content settings changed.
   ScopedObserver<HostContentSettingsMap, content_settings::Observer> observer_{
diff --git a/components/policy/proto/chrome_device_policy.proto b/components/policy/proto/chrome_device_policy.proto
index 79c4f0f..5d9efa88 100644
--- a/components/policy/proto/chrome_device_policy.proto
+++ b/components/policy/proto/chrome_device_policy.proto
@@ -1686,6 +1686,10 @@
   optional AllowanceMode mode = 1 [default = DISALLOW];
 }
 
+message DeviceShowLowDiskSpaceNotificationProto {
+  optional bool device_show_low_disk_space_notification = 1;
+}
+
 message ChromeDeviceSettingsProto {
   reserved 61, 90;
   optional DevicePolicyRefreshRateProto device_policy_refresh_rate = 1;
@@ -1825,4 +1829,6 @@
   optional DevicePrintersBlocklistProto device_printers_blocklist = 108;
   optional DevicePrintersAllowlistProto device_printers_allowlist = 109;
   optional DevicePrintersProto device_printers = 110;
+  optional DeviceShowLowDiskSpaceNotificationProto
+      device_show_low_disk_space_notification = 111;
 }
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 7c3377a..a315c84a3 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -979,6 +979,7 @@
         'ExtensionCacheSize',
         'DeviceOffHours',
         'SuggestedContentEnabled',
+        'DeviceShowLowDiskSpaceNotification',
       ],
     },
     {
@@ -1131,6 +1132,7 @@
         'ParentAccessCodeConfig',
         'PerAppTimeLimits',
         'PerAppTimeLimitsWhitelist',
+        'PerAppTimeLimitsAllowlist',
         'UsageTimeLimit',
       ],
     },
@@ -14229,6 +14231,28 @@
       'id': 327,
     },
     {
+      'name': 'DeviceShowLowDiskSpaceNotification',
+      'owners': ['vsavu@chromium.org'],
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      'supported_on': ['chrome_os:86-'],
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': False,
+      },
+      'example_value': True,
+      'device_only': True,
+      'default_for_managed_devices_doc_only': False,
+      'id': 763,
+      'caption': '''Show notification when disk space is low''',
+      'tags': [],
+      'desc':
+      '''Allows enabling or disabling a notification when disk space is low. This applies to all users on the device.
+      If there is exactly one user account on a managed device, the notification is always shown, regardless of the value of this policy.
+      If there are multiple user accounts on a a managed device, the notification is only shown when this policy is set to True.
+      On unmanaged devices the notification is always shown.''',
+    },
+    {
       'name': 'NetworkThrottlingEnabled',
       'owners': ['kirtika@chromium.org', 'pmarko@chromium.org'],
       'device_only': True,
@@ -15303,7 +15327,7 @@
     {
       'name': 'DeviceMinimumVersion',
       'owners': ['snijhara@google.com'],
-      'future_on': ['chrome_os'],
+      'supported_on': ['chrome_os:86-'],
       'device_only': True,
       'type': 'dict',
       'schema': {
@@ -15364,7 +15388,7 @@
 
       When this policy is set to a non-empty list:
       If none of the entries has a <ph name="CHROMEOS_VERSION_PROPERTY_NAME">chromeos_version</ph> greater than the current version of the device, then no restrictions are applied and the already existing restrictions are revoked.
-      If at least one of the entries has a <ph name="CHROMEOS_VERSION_PROPERTY_NAME">chromeos_version</ph> greater than the current version, the strongest entry is chosen whose version is greater and closest to the current version.
+      If at least one of the entries has a <ph name="CHROMEOS_VERSION_PROPERTY_NAME">chromeos_version</ph> greater than the current version, the entry whose version is greater and closest to the current version is chosen.
       In case of conflict, preference is given to the entry with lower <ph name="WARNING_PERIOD_PROPERTY_NAME">warning_period</ph> or <ph name="AUE_WARNING_PERIOD_PROPERTY_NAME">aue_warning_period</ph> and the policy is applied using that entry.
 
       If the current version becomes obsolete during user session and the current network limits auto updates, an on-screen notification is shown to update the device within the <ph name="WARNING_PERIOD_PROPERTY_NAME">warning_period</ph> shown in the notification.
@@ -15387,7 +15411,7 @@
     {
       'name': 'DeviceMinimumVersionAueMessage',
       'owners': ['snijhara@google.com', 'marcgrimme@chromium.org'],
-      'future_on': ['chrome_os'],
+      'supported_on': ['chrome_os:86-'],
       'device_only': True,
       'type': 'string',
       'schema': { 'type': 'string' },
@@ -21991,6 +22015,7 @@
         'dynamic_refresh': True,
         'per_profile': True
       },
+      'deprecated': True,
       'type':  'dict',
       'schema': {
         'type': 'object',
@@ -22052,6 +22077,79 @@
         Accessing whitelisted URLs will not count towards the chrome time limit.
         Add url regular expressions to |url_list| to whitelist urls that match any of the regular expressions in the list.
         Add an application with its |app_id| and |app_type| to |app_list| to whitelist the application.
+
+        This policy is deprecated, please use <ph name="PER_APP_TIME_LIMITS_ALLOWLIST">PerAppTimeLimitsAllowlist</ph> instead.
+        '''
+    },
+    {
+      'name': 'PerAppTimeLimitsAllowlist',
+      'owners': ['yilkal@chromium.org', 'cros-families-eng@google.com'],
+      'id': 762,
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': True
+      },
+      'type':  'dict',
+      'schema': {
+        'type': 'object',
+        'properties': {
+          'url_list': {
+            'type': 'array',
+            'items': {
+              'type': 'string',
+            }
+          },
+          'app_list': {
+            'type': 'array',
+            'items': {
+              'type': 'object',
+              'properties': {
+                'app_id': {
+                  'type': 'string'
+                },
+                'app_type': {
+                  'type': 'string',
+                  'enum': [
+                    'ARC',
+                    'BUILT-IN',
+                    'EXTENSION',
+                    'WEB',
+                    'CROSTINI'
+                  ],
+                }
+              },
+            }
+          }
+        }
+      },
+      'example_value': {
+        'url_list': [
+          "chrome://*",
+          "file://*",
+          "https://www.support.google.com",
+          "https://www.policies.google.com"
+        ],
+        'app_list': [
+          {
+            'app_id': 'pjkljhegncpnkpknbcohdijeoejaedia',
+            'app_type': 'EXTENSION'
+          },
+          {
+            'app_id': 'iniodglblcgmngkgdipeiclkdjjpnlbn',
+            'app_type': 'BUILT-IN'
+          }
+        ]
+      },
+      'caption': '''Per-App Time Limits Allowlist''',
+      'tags': [],
+      'supported_on': ['chrome_os: 86-'],
+      'desc': '''This policy specifies which applications and URLs should be allowed for per-app usage restrictions.
+        The configured allowlist is applied to the apps installed on <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> for the given user with per-app time limits.
+        The configured allowlist can only be applied to child user accounts and take effect when <ph name="PER_APP_TIME_LIMITS_POLICY_NAME">PerAppTimeLimits</ph> policy is set.
+        The configured allowlist is applied to applications and URLs so that they will not be blocked by per-app time limits.
+        Accessing allowed URLs will not count towards the chrome time limit.
+        Add url regular expressions to |url_list| to allow urls that match any of the regular expressions in the list.
+        Add an application with its |app_id| and |app_type| to |app_list| to allow the application.
        '''
     },
     {
@@ -22921,6 +23019,7 @@
     'UptimeLimit': 'uptime_limit.uptime_limit',
     'DeviceAllowRedeemChromeOsRegistrationOffers': 'allow_redeem_offers.allow_redeem_offers',
     'ExtensionCacheSize': 'extension_cache_size.extension_cache_size',
+    'DeviceShowLowDiskSpaceNotification': 'device_show_low_disk_space_notification.device_show_low_disk_space_notification',
     'DisplayRotationDefault': 'display_rotation_default.display_rotation_default',
     'DeviceQuirksDownloadEnabled': 'quirks_download_enabled.quirks_download_enabled',
     'UnaffiliatedArcAllowed': 'unaffiliated_arc_allowed.unaffiliated_arc_allowed',
@@ -23547,6 +23646,6 @@
   ],
   'placeholders': [],
   'deleted_policy_ids': [412, 476, 546, 562, 569, 578],
-  'highest_id_currently_used': 761,
+  'highest_id_currently_used': 763,
   'highest_atomic_group_id_currently_used': 39
 }
diff --git a/components/prerender/browser/BUILD.gn b/components/prerender/browser/BUILD.gn
index 2c8615f..3e4e3bf 100644
--- a/components/prerender/browser/BUILD.gn
+++ b/components/prerender/browser/BUILD.gn
@@ -6,17 +6,26 @@
   sources = [
     "prerender_config.cc",
     "prerender_config.h",
+    "prerender_contents.cc",
+    "prerender_contents.h",
     "prerender_contents_delegate.h",
+    "prerender_field_trial.cc",
+    "prerender_field_trial.h",
+    "prerender_handle.cc",
+    "prerender_handle.h",
     "prerender_histograms.cc",
     "prerender_histograms.h",
     "prerender_history.cc",
     "prerender_history.h",
+    "prerender_manager.cc",
+    "prerender_manager.h",
     "prerender_manager_delegate.h",
     "prerender_util.cc",
     "prerender_util.h",
   ]
 
   deps = [
+    "//components/content_settings/core/browser",
     "//components/google/core/common",
     "//components/prerender/common",
     "//components/prerender/common:mojo_bindings",
diff --git a/components/prerender/browser/DEPS b/components/prerender/browser/DEPS
index affa3cd..a41004d 100644
--- a/components/prerender/browser/DEPS
+++ b/components/prerender/browser/DEPS
@@ -1,6 +1,14 @@
 include_rules = [
+  "+components/content_settings/core",
   "+components/google/core/common",
+  "+components/keyed_service/core",
   "+content/public/browser",
-  "+net/http/http_cache.h",
-  "+ui/gfx/geometry/rect.h",
+  "+content/public/common",
+  "+mojo/public",
+  "+net/http",
+  "+services/resource_coordinator/public",
+  "+services/service_manager/public",
+  "+third_party/blink/public",
+  "+ui/base",
+  "+ui/gfx",
 ]
diff --git a/components/prerender/browser/prerender_contents.cc b/components/prerender/browser/prerender_contents.cc
new file mode 100644
index 0000000..d72fdc6
--- /dev/null
+++ b/components/prerender/browser/prerender_contents.cc
@@ -0,0 +1,627 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/prerender/browser/prerender_contents.h"
+
+#include <stddef.h>
+
+#include <functional>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/callback_helpers.h"
+#include "base/stl_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/task/post_task.h"
+#include "build/build_config.h"
+#include "components/prerender/browser/prerender_contents_delegate.h"
+#include "components/prerender/browser/prerender_manager.h"
+#include "components/prerender/common/prerender_final_status.h"
+#include "components/prerender/common/prerender_util.h"
+#include "components/prerender/common/render_frame_prerender_messages.mojom.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/navigation_handle.h"
+#include "content/public/browser/notification_service.h"
+#include "content/public/browser/notification_types.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/render_widget_host.h"
+#include "content/public/browser/session_storage_namespace.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_delegate.h"
+#include "content/public/common/frame_navigate_params.h"
+#include "net/http/http_response_headers.h"
+#include "services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.h"
+#include "services/service_manager/public/cpp/binder_registry.h"
+#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
+#include "ui/base/page_transition_types.h"
+#include "ui/gfx/geometry/size.h"
+
+using content::BrowserThread;
+using content::OpenURLParams;
+using content::RenderViewHost;
+using content::SessionStorageNamespace;
+using content::WebContents;
+
+namespace prerender {
+
+class PrerenderContentsFactoryImpl : public PrerenderContents::Factory {
+ public:
+  PrerenderContents* CreatePrerenderContents(
+      std::unique_ptr<PrerenderContentsDelegate> delegate,
+      PrerenderManager* prerender_manager,
+      content::BrowserContext* browser_context,
+      const GURL& url,
+      const content::Referrer& referrer,
+      const base::Optional<url::Origin>& initiator_origin,
+      Origin origin) override {
+    return new PrerenderContents(std::move(delegate), prerender_manager,
+                                 browser_context, url, referrer,
+                                 initiator_origin, origin);
+  }
+};
+
+// WebContentsDelegateImpl -----------------------------------------------------
+
+class PrerenderContents::WebContentsDelegateImpl
+    : public content::WebContentsDelegate {
+ public:
+  explicit WebContentsDelegateImpl(PrerenderContents* prerender_contents)
+      : prerender_contents_(prerender_contents) {}
+
+  // content::WebContentsDelegate implementation:
+  WebContents* OpenURLFromTab(WebContents* source,
+                              const OpenURLParams& params) override {
+    // |OpenURLFromTab| is typically called when a frame performs a navigation
+    // that requires the browser to perform the transition instead of WebKit.
+    // Examples include client redirects to hosted app URLs.
+    // TODO(cbentzel): Consider supporting this for CURRENT_TAB dispositions, if
+    // it is a common case during prerenders.
+    prerender_contents_->Destroy(FINAL_STATUS_OPEN_URL);
+    return NULL;
+  }
+
+  bool ShouldTransferNavigation(bool is_main_frame_navigation) override {
+    // Cancel the prerender if the navigation attempts to transfer to a
+    // different process.  Examples include server redirects to privileged pages
+    // or cross-site subframe navigations in --site-per-process.
+    prerender_contents_->Destroy(FINAL_STATUS_OPEN_URL);
+    return false;
+  }
+
+  void CanDownload(const GURL& url,
+                   const std::string& request_method,
+                   base::OnceCallback<void(bool)> callback) override {
+    prerender_contents_->Destroy(FINAL_STATUS_DOWNLOAD);
+    // Cancel the download.
+    std::move(callback).Run(false);
+  }
+
+  bool OnGoToEntryOffset(int offset) override {
+    // This isn't allowed because the history merge operation
+    // does not work if there are renderer issued challenges.
+    // TODO(cbentzel): Cancel in this case? May not need to do
+    // since render-issued offset navigations are not guaranteed,
+    // but indicates that the page cares about the history.
+    return false;
+  }
+
+  gfx::Size GetSizeForNewRenderView(WebContents* web_contents) override {
+    // Have to set the size of the RenderView on initialization to be sure it is
+    // set before the RenderView is hidden on all platforms (esp. Android).
+    return prerender_contents_->bounds_.size();
+  }
+
+ private:
+  PrerenderContents* prerender_contents_;
+};
+
+PrerenderContents::Observer::~Observer() {}
+
+PrerenderContents::PrerenderContents(
+    std::unique_ptr<PrerenderContentsDelegate> delegate,
+    PrerenderManager* prerender_manager,
+    content::BrowserContext* browser_context,
+    const GURL& url,
+    const content::Referrer& referrer,
+    const base::Optional<url::Origin>& initiator_origin,
+    Origin origin)
+    : prerender_mode_(prerender::mojom::PrerenderMode::kNoPrerender),
+      prerendering_has_started_(false),
+      prerender_manager_(prerender_manager),
+      delegate_(std::move(delegate)),
+      prerender_url_(url),
+      referrer_(referrer),
+      initiator_origin_(initiator_origin),
+      browser_context_(browser_context),
+      has_finished_loading_(false),
+      final_status_(FINAL_STATUS_UNKNOWN),
+      prerendering_has_been_cancelled_(false),
+      process_pid_(base::kNullProcessId),
+      child_id_(-1),
+      route_id_(-1),
+      origin_(origin),
+      network_bytes_(0) {
+  switch (origin) {
+    case ORIGIN_OMNIBOX:
+    case ORIGIN_EXTERNAL_REQUEST:
+    case ORIGIN_EXTERNAL_REQUEST_FORCED_PRERENDER:
+    case ORIGIN_NAVIGATION_PREDICTOR:
+    case ORIGIN_ISOLATED_PRERENDER:
+      DCHECK(!initiator_origin_.has_value());
+      break;
+
+    case ORIGIN_GWS_PRERENDER:
+    case ORIGIN_LINK_REL_PRERENDER_SAMEDOMAIN:
+    case ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN:
+    case ORIGIN_LINK_REL_NEXT:
+      DCHECK(initiator_origin_.has_value());
+      break;
+    case ORIGIN_NONE:
+    case ORIGIN_MAX:
+      NOTREACHED();
+  }
+
+  DCHECK(prerender_manager);
+}
+
+bool PrerenderContents::Init() {
+  return AddAliasURL(prerender_url_);
+}
+
+void PrerenderContents::SetPrerenderMode(prerender::mojom::PrerenderMode mode) {
+  DCHECK(!prerendering_has_started_);
+  prerender_mode_ = mode;
+}
+
+// static
+PrerenderContents::Factory* PrerenderContents::CreateFactory() {
+  return new PrerenderContentsFactoryImpl();
+}
+
+void PrerenderContents::StartPrerendering(
+    const gfx::Rect& bounds,
+    SessionStorageNamespace* session_storage_namespace) {
+  DCHECK(browser_context_);
+  DCHECK(!bounds.IsEmpty());
+  DCHECK(!prerendering_has_started_);
+  DCHECK(!prerender_contents_);
+  DCHECK_EQ(1U, alias_urls_.size());
+
+  session_storage_namespace_id_ = session_storage_namespace->id();
+  bounds_ = bounds;
+
+  DCHECK(load_start_time_.is_null());
+  load_start_time_ = base::TimeTicks::Now();
+
+  prerendering_has_started_ = true;
+
+  prerender_contents_ = CreateWebContents(session_storage_namespace);
+  content::WebContentsObserver::Observe(prerender_contents_.get());
+  delegate_->OnPrerenderContentsCreated(prerender_contents_.get());
+
+  web_contents_delegate_.reset(new WebContentsDelegateImpl(this));
+  prerender_contents_.get()->SetDelegate(web_contents_delegate_.get());
+
+  // Set the size of the prerender WebContents.
+  prerender_contents_.get()->Resize(bounds_);
+
+  // TODO(davidben): This logic assumes each prerender has at most one
+  // route. https://crbug.com/440544
+  child_id_ = GetRenderViewHost()->GetProcess()->GetID();
+  route_id_ = GetRenderViewHost()->GetRoutingID();
+
+  // TODO(davidben): This logic assumes each prerender has at most one
+  // process. https://crbug.com/440544
+  prerender_manager()->AddPrerenderProcessHost(
+      GetRenderViewHost()->GetProcess());
+
+  NotifyPrerenderStart();
+
+  // Register to inform new RenderViews that we're prerendering.
+  notification_registrar_.Add(
+      this, content::NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED,
+      content::Source<WebContents>(prerender_contents_.get()));
+
+  content::NavigationController::LoadURLParams load_url_params(prerender_url_);
+  load_url_params.referrer = referrer_;
+  load_url_params.initiator_origin = initiator_origin_;
+  load_url_params.transition_type = ui::PAGE_TRANSITION_LINK;
+  if (origin_ == ORIGIN_OMNIBOX) {
+    load_url_params.transition_type = ui::PageTransitionFromInt(
+        ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR);
+  } else if (origin_ == ORIGIN_NAVIGATION_PREDICTOR) {
+    load_url_params.transition_type =
+        ui::PageTransitionFromInt(ui::PAGE_TRANSITION_GENERATED);
+  }
+  prerender_contents_.get()->GetController().LoadURLWithParams(load_url_params);
+}
+
+bool PrerenderContents::GetChildId(int* child_id) const {
+  CHECK(child_id);
+  DCHECK_GE(child_id_, -1);
+  *child_id = child_id_;
+  return child_id_ != -1;
+}
+
+bool PrerenderContents::GetRouteId(int* route_id) const {
+  CHECK(route_id);
+  DCHECK_GE(route_id_, -1);
+  *route_id = route_id_;
+  return route_id_ != -1;
+}
+
+void PrerenderContents::SetFinalStatus(FinalStatus final_status) {
+  DCHECK_GE(final_status, FINAL_STATUS_USED);
+  DCHECK_LT(final_status, FINAL_STATUS_MAX);
+
+  DCHECK_EQ(FINAL_STATUS_UNKNOWN, final_status_);
+
+  final_status_ = final_status;
+}
+
+PrerenderContents::~PrerenderContents() {
+  DCHECK_NE(FINAL_STATUS_UNKNOWN, final_status());
+  DCHECK(prerendering_has_been_cancelled() ||
+         final_status() == FINAL_STATUS_USED);
+  DCHECK_NE(ORIGIN_MAX, origin());
+
+  prerender_manager_->RecordFinalStatus(origin(), final_status());
+  prerender_manager_->RecordNetworkBytesConsumed(origin(), network_bytes_);
+
+  if (!prerender_contents_)
+    return;
+
+  // If we still have a WebContents, clean up anything we need to and then
+  // destroy it.
+  std::unique_ptr<WebContents> contents = ReleasePrerenderContents();
+}
+
+void PrerenderContents::AddObserver(Observer* observer) {
+  DCHECK_EQ(FINAL_STATUS_UNKNOWN, final_status_);
+  observer_list_.AddObserver(observer);
+}
+
+void PrerenderContents::RemoveObserver(Observer* observer) {
+  observer_list_.RemoveObserver(observer);
+}
+
+void PrerenderContents::Observe(int type,
+                                const content::NotificationSource& source,
+                                const content::NotificationDetails& details) {
+  switch (type) {
+    case content::NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED: {
+      if (prerender_contents_.get()) {
+        DCHECK_EQ(content::Source<WebContents>(source).ptr(),
+                  prerender_contents_.get());
+
+        content::Details<RenderViewHost> new_render_view_host(details);
+        OnRenderViewHostCreated(new_render_view_host.ptr());
+
+        // Make sure the size of the RenderViewHost has been passed to the new
+        // RenderView.  Otherwise, the size may not be sent until the
+        // RenderViewReady event makes it from the render process to the UI
+        // thread of the browser process.  When the RenderView receives its
+        // size, is also sets itself to be visible, which would then break the
+        // visibility API.
+        new_render_view_host->GetWidget()->SynchronizeVisualProperties();
+        prerender_contents_->WasHidden();
+      }
+      break;
+    }
+
+    default:
+      NOTREACHED() << "Unexpected notification sent.";
+      break;
+  }
+}
+
+void PrerenderContents::OnRenderViewHostCreated(
+    RenderViewHost* new_render_view_host) {}
+
+std::unique_ptr<WebContents> PrerenderContents::CreateWebContents(
+    SessionStorageNamespace* session_storage_namespace) {
+  // TODO(ajwong): Remove the temporary map once prerendering is aware of
+  // multiple session storage namespaces per tab.
+  content::SessionStorageNamespaceMap session_storage_namespace_map;
+  session_storage_namespace_map[std::string()] = session_storage_namespace;
+  return WebContents::CreateWithSessionStorage(
+      WebContents::CreateParams(browser_context_),
+      session_storage_namespace_map);
+}
+
+void PrerenderContents::NotifyPrerenderStart() {
+  DCHECK_EQ(FINAL_STATUS_UNKNOWN, final_status_);
+  for (Observer& observer : observer_list_)
+    observer.OnPrerenderStart(this);
+}
+
+void PrerenderContents::NotifyPrerenderStopLoading() {
+  for (Observer& observer : observer_list_)
+    observer.OnPrerenderStopLoading(this);
+}
+
+void PrerenderContents::NotifyPrerenderDomContentLoaded() {
+  for (Observer& observer : observer_list_)
+    observer.OnPrerenderDomContentLoaded(this);
+}
+
+void PrerenderContents::NotifyPrerenderStop() {
+  DCHECK_NE(FINAL_STATUS_UNKNOWN, final_status_);
+  for (Observer& observer : observer_list_)
+    observer.OnPrerenderStop(this);
+  observer_list_.Clear();
+}
+
+bool PrerenderContents::CheckURL(const GURL& url) {
+  if (!url.SchemeIsHTTPOrHTTPS()) {
+    Destroy(FINAL_STATUS_UNSUPPORTED_SCHEME);
+    return false;
+  }
+  if (prerender_manager_->HasRecentlyBeenNavigatedTo(origin(), url)) {
+    Destroy(FINAL_STATUS_RECENTLY_VISITED);
+    return false;
+  }
+  return true;
+}
+
+bool PrerenderContents::AddAliasURL(const GURL& url) {
+  if (!CheckURL(url))
+    return false;
+
+  alias_urls_.push_back(url);
+  return true;
+}
+
+bool PrerenderContents::Matches(
+    const GURL& url,
+    SessionStorageNamespace* session_storage_namespace) const {
+  // TODO(davidben): Remove any consumers that pass in a NULL
+  // session_storage_namespace and only test with matches.
+  if (session_storage_namespace &&
+      session_storage_namespace_id_ != session_storage_namespace->id()) {
+    return false;
+  }
+  return base::Contains(alias_urls_, url);
+}
+
+void PrerenderContents::RenderProcessGone(base::TerminationStatus status) {
+  if (status == base::TERMINATION_STATUS_STILL_RUNNING) {
+    // The renderer process is being killed because of the browser/test
+    // shutdown, before the termination notification is received.
+    Destroy(FINAL_STATUS_APP_TERMINATING);
+  }
+  Destroy(FINAL_STATUS_RENDERER_CRASHED);
+}
+
+void PrerenderContents::RenderFrameCreated(
+    content::RenderFrameHost* render_frame_host) {
+  // When a new RenderFrame is created for a prerendering WebContents, tell the
+  // new RenderFrame it's being used for prerendering before any navigations
+  // occur.  Note that this is always triggered before the first navigation, so
+  // there's no need to send the message just after the WebContents is created.
+  mojo::AssociatedRemote<prerender::mojom::PrerenderMessages>
+      prerender_render_frame;
+  render_frame_host->GetRemoteAssociatedInterfaces()->GetInterface(
+      &prerender_render_frame);
+  prerender_render_frame->SetIsPrerendering(
+      prerender_mode_, PrerenderHistograms::GetHistogramPrefix(origin_));
+}
+
+void PrerenderContents::DidStopLoading() {
+  NotifyPrerenderStopLoading();
+}
+
+void PrerenderContents::DOMContentLoaded(
+    content::RenderFrameHost* render_frame_host) {
+  if (!render_frame_host->GetParent())
+    NotifyPrerenderDomContentLoaded();
+}
+
+void PrerenderContents::DidStartNavigation(
+    content::NavigationHandle* navigation_handle) {
+  if (!navigation_handle->IsInMainFrame() ||
+      navigation_handle->IsSameDocument()) {
+    return;
+  }
+
+  if (!CheckURL(navigation_handle->GetURL()))
+    return;
+
+  // Usually, this event fires if the user clicks or enters a new URL.
+  // Neither of these can happen in the case of an invisible prerender.
+  // So the cause is: Some JavaScript caused a new URL to be loaded.  In that
+  // case, the spinner would start again in the browser, so we must reset
+  // has_finished_loading_ so that the spinner won't be stopped.
+  has_finished_loading_ = false;
+}
+
+void PrerenderContents::DidRedirectNavigation(
+    content::NavigationHandle* navigation_handle) {
+  if (!navigation_handle->IsInMainFrame())
+    return;
+
+  // If it's a redirect on the top-level resource, the name needs to be
+  // remembered for future matching, and if it redirects to an https resource,
+  // it needs to be canceled. If a subresource is redirected, nothing changes.
+  CheckURL(navigation_handle->GetURL());
+}
+
+void PrerenderContents::DidFinishLoad(
+    content::RenderFrameHost* render_frame_host,
+    const GURL& validated_url) {
+  if (!render_frame_host->GetParent())
+    has_finished_loading_ = true;
+}
+
+void PrerenderContents::DidFinishNavigation(
+    content::NavigationHandle* navigation_handle) {
+  if (!navigation_handle->IsInMainFrame() ||
+      !navigation_handle->HasCommitted() || navigation_handle->IsErrorPage()) {
+    return;
+  }
+
+  if (navigation_handle->GetResponseHeaders() &&
+      navigation_handle->GetResponseHeaders()->response_code() >= 400) {
+    // Maintain same behavior as old navigation API when the URL is unreachable
+    // and leads to an error page. While there will be a subsequent navigation
+    // that has navigation_handle->IsErrorPage(), it'll be too late to wait for
+    // it as the renderer side will consider this prerender complete. This
+    // object would therefore have been destructed already and so instead look
+    // for the error response code now.
+    // Also maintain same final status code that previous navigation API
+    // returned, which was reached because the URL for the error page was
+    // kUnreachableWebDataURL and that was interpreted as unsupported scheme.
+    Destroy(FINAL_STATUS_UNSUPPORTED_SCHEME);
+    return;
+  }
+
+  // Add each redirect as an alias. |navigation_handle->GetURL()| is included in
+  // |navigation_handle->GetRedirectChain()|.
+  //
+  // TODO(davidben): We do not correctly patch up history for renderer-initated
+  // navigations which add history entries. http://crbug.com/305660.
+  for (const auto& redirect : navigation_handle->GetRedirectChain()) {
+    if (!AddAliasURL(redirect))
+      return;
+  }
+}
+
+void PrerenderContents::Destroy(FinalStatus final_status) {
+  DCHECK_NE(final_status, FINAL_STATUS_USED);
+
+  if (prerendering_has_been_cancelled_)
+    return;
+
+  SetFinalStatus(final_status);
+
+  prerendering_has_been_cancelled_ = true;
+  prerender_manager_->AddToHistory(this);
+  prerender_manager_->SetPrefetchFinalStatusForUrl(prerender_url_,
+                                                   final_status);
+  prerender_manager_->MoveEntryToPendingDelete(this, final_status);
+
+  if (prerendering_has_started())
+    NotifyPrerenderStop();
+}
+
+void PrerenderContents::DestroyWhenUsingTooManyResources() {
+  if (process_pid_ == base::kNullProcessId) {
+    RenderViewHost* rvh = GetRenderViewHost();
+    if (!rvh)
+      return;
+
+    content::RenderProcessHost* rph = rvh->GetProcess();
+    if (!rph)
+      return;
+
+    base::ProcessHandle handle = rph->GetProcess().Handle();
+    if (handle == base::kNullProcessHandle)
+      return;
+
+    process_pid_ = rph->GetProcess().Pid();
+  }
+
+  if (process_pid_ == base::kNullProcessId)
+    return;
+
+  // Using AdaptCallbackForRepeating allows for an easier transition to
+  // OnceCallbacks for https://crbug.com/714018.
+  memory_instrumentation::MemoryInstrumentation::GetInstance()
+      ->RequestPrivateMemoryFootprint(
+          process_pid_, base::AdaptCallbackForRepeating(base::BindOnce(
+                            &PrerenderContents::DidGetMemoryUsage,
+                            weak_factory_.GetWeakPtr())));
+}
+
+void PrerenderContents::DidGetMemoryUsage(
+    bool success,
+    std::unique_ptr<memory_instrumentation::GlobalMemoryDump> global_dump) {
+  if (!success)
+    return;
+
+  for (const memory_instrumentation::GlobalMemoryDump::ProcessDump& dump :
+       global_dump->process_dumps()) {
+    if (dump.pid() != process_pid_)
+      continue;
+
+    // If |final_status_| == |FINAL_STATUS_USED|, then destruction will be
+    // handled by the entity that set final_status_.
+    if (dump.os_dump().private_footprint_kb * 1024 >
+            prerender_manager_->config().max_bytes &&
+        final_status_ != FINAL_STATUS_USED) {
+      Destroy(FINAL_STATUS_MEMORY_LIMIT_EXCEEDED);
+    }
+    return;
+  }
+}
+
+std::unique_ptr<WebContents> PrerenderContents::ReleasePrerenderContents() {
+  prerender_contents_->SetDelegate(nullptr);
+  content::WebContentsObserver::Observe(nullptr);
+
+  delegate_->ReleasePrerenderContents(prerender_contents_.get());
+
+  return std::move(prerender_contents_);
+}
+
+RenderViewHost* PrerenderContents::GetRenderViewHost() {
+  return prerender_contents_ ? prerender_contents_->GetRenderViewHost()
+                             : nullptr;
+}
+
+std::unique_ptr<base::DictionaryValue> PrerenderContents::GetAsValue() const {
+  if (!prerender_contents_)
+    return nullptr;
+  auto dict_value = std::make_unique<base::DictionaryValue>();
+  dict_value->SetString("url", prerender_url_.spec());
+  base::TimeTicks current_time = base::TimeTicks::Now();
+  base::TimeDelta duration = current_time - load_start_time_;
+  dict_value->SetInteger("duration", duration.InSeconds());
+  dict_value->SetBoolean(
+      "is_loaded", prerender_contents_ && !prerender_contents_->IsLoading());
+  return dict_value;
+}
+
+void PrerenderContents::PrepareForUse() {
+  SetFinalStatus(FINAL_STATUS_USED);
+
+  if (prerender_contents_.get()) {
+    auto frames = prerender_contents_->GetAllFrames();
+    for (auto* frame : frames) {
+      mojo::AssociatedRemote<prerender::mojom::PrerenderMessages>
+          prerender_render_frame;
+      frame->GetRemoteAssociatedInterfaces()->GetInterface(
+          &prerender_render_frame);
+      prerender_render_frame->SetIsPrerendering(
+          prerender::mojom::PrerenderMode::kNoPrerender, std::string());
+    }
+  }
+
+  NotifyPrerenderStop();
+}
+
+void PrerenderContents::CancelPrerenderForUnsupportedScheme() {
+  Destroy(FINAL_STATUS_UNSUPPORTED_SCHEME);
+}
+
+void PrerenderContents::CancelPrerenderForNoStatePrefetch() {
+  Destroy(FINAL_STATUS_NOSTATE_PREFETCH_FINISHED);
+}
+
+void PrerenderContents::AddPrerenderCancelerReceiver(
+    mojo::PendingReceiver<prerender::mojom::PrerenderCanceler> receiver) {
+  prerender_canceler_receiver_set_.Add(this, std::move(receiver));
+}
+
+void PrerenderContents::AddNetworkBytes(int64_t bytes) {
+  network_bytes_ += bytes;
+  for (Observer& observer : observer_list_)
+    observer.OnPrerenderNetworkBytesChanged(this);
+}
+
+}  // namespace prerender
diff --git a/chrome/browser/prerender/prerender_contents.h b/components/prerender/browser/prerender_contents.h
similarity index 98%
rename from chrome/browser/prerender/prerender_contents.h
rename to components/prerender/browser/prerender_contents.h
index 8e4c653..1af0943 100644
--- a/chrome/browser/prerender/prerender_contents.h
+++ b/components/prerender/browser/prerender_contents.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_
-#define CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_
+#ifndef COMPONENTS_PRERENDER_BROWSER_PRERENDER_CONTENTS_H_
+#define COMPONENTS_PRERENDER_BROWSER_PRERENDER_CONTENTS_H_
 
 #include <stdint.h>
 
@@ -347,4 +347,4 @@
 
 }  // namespace prerender
 
-#endif  // CHROME_BROWSER_PRERENDER_PRERENDER_CONTENTS_H_
+#endif  // COMPONENTS_PRERENDER_BROWSER_PRERENDER_CONTENTS_H_
diff --git a/chrome/browser/prerender/prerender_field_trial.cc b/components/prerender/browser/prerender_field_trial.cc
similarity index 89%
rename from chrome/browser/prerender/prerender_field_trial.cc
rename to components/prerender/browser/prerender_field_trial.cc
index 71c15e0..3d386bce 100644
--- a/chrome/browser/prerender/prerender_field_trial.cc
+++ b/components/prerender/browser/prerender_field_trial.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/prerender/prerender_field_trial.h"
+#include "components/prerender/browser/prerender_field_trial.h"
 
 #include <string>
 
 #include "base/metrics/field_trial.h"
-#include "chrome/browser/prerender/prerender_manager.h"
+#include "components/prerender/browser/prerender_manager.h"
 
 namespace prerender {
 
diff --git a/chrome/browser/prerender/prerender_field_trial.h b/components/prerender/browser/prerender_field_trial.h
similarity index 79%
rename from chrome/browser/prerender/prerender_field_trial.h
rename to components/prerender/browser/prerender_field_trial.h
index 1f9739c..2325862 100644
--- a/chrome/browser/prerender/prerender_field_trial.h
+++ b/components/prerender/browser/prerender_field_trial.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_PRERENDER_PRERENDER_FIELD_TRIAL_H_
-#define CHROME_BROWSER_PRERENDER_PRERENDER_FIELD_TRIAL_H_
+#ifndef COMPONENTS_PRERENDER_BROWSER_PRERENDER_FIELD_TRIAL_H_
+#define COMPONENTS_PRERENDER_BROWSER_PRERENDER_FIELD_TRIAL_H_
 
 #include "base/feature_list.h"
 
@@ -25,4 +25,4 @@
 
 }  // namespace prerender
 
-#endif  // CHROME_BROWSER_PRERENDER_PRERENDER_FIELD_TRIAL_H_
+#endif  // COMPONENTS_PRERENDER_BROWSER_PRERENDER_FIELD_TRIAL_H_
diff --git a/chrome/browser/prerender/prerender_handle.cc b/components/prerender/browser/prerender_handle.cc
similarity index 91%
rename from chrome/browser/prerender/prerender_handle.cc
rename to components/prerender/browser/prerender_handle.cc
index 46509413..17757de 100644
--- a/chrome/browser/prerender/prerender_handle.cc
+++ b/components/prerender/browser/prerender_handle.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/prerender/prerender_handle.h"
+#include "components/prerender/browser/prerender_handle.h"
 
 #include <algorithm>
 
 #include "base/check_op.h"
-#include "chrome/browser/prerender/prerender_contents.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/web_contents.h"
 
@@ -15,11 +15,9 @@
 
 namespace prerender {
 
-PrerenderHandle::Observer::Observer() {
-}
+PrerenderHandle::Observer::Observer() {}
 
-PrerenderHandle::Observer::~Observer() {
-}
+PrerenderHandle::Observer::~Observer() {}
 
 PrerenderHandle::~PrerenderHandle() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -47,7 +45,7 @@
 bool PrerenderHandle::IsPrerendering() const {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   return prerender_data_.get() != nullptr &&
-      !prerender_data_->contents()->prerendering_has_been_cancelled();
+         !prerender_data_->contents()->prerendering_has_been_cancelled();
 }
 
 bool PrerenderHandle::IsFinishedLoading() const {
diff --git a/chrome/browser/prerender/prerender_handle.h b/components/prerender/browser/prerender_handle.h
similarity index 93%
rename from chrome/browser/prerender/prerender_handle.h
rename to components/prerender/browser/prerender_handle.h
index f70508d..a9a8fadf 100644
--- a/chrome/browser/prerender/prerender_handle.h
+++ b/components/prerender/browser/prerender_handle.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_PRERENDER_PRERENDER_HANDLE_H_
-#define CHROME_BROWSER_PRERENDER_PRERENDER_HANDLE_H_
+#ifndef COMPONENTS_PRERENDER_BROWSER_PRERENDER_HANDLE_H_
+#define COMPONENTS_PRERENDER_BROWSER_PRERENDER_HANDLE_H_
 
 #include <memory>
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "chrome/browser/prerender/prerender_manager.h"
+#include "components/prerender/browser/prerender_manager.h"
 
 namespace prerender {
 
@@ -103,4 +103,4 @@
 
 }  // namespace prerender
 
-#endif  // CHROME_BROWSER_PRERENDER_PRERENDER_HANDLE_H_
+#endif  // COMPONENTS_PRERENDER_BROWSER_PRERENDER_HANDLE_H_
diff --git a/components/prerender/browser/prerender_manager.cc b/components/prerender/browser/prerender_manager.cc
new file mode 100644
index 0000000..dccf3d0
--- /dev/null
+++ b/components/prerender/browser/prerender_manager.cc
@@ -0,0 +1,1021 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/prerender/browser/prerender_manager.h"
+
+#include <stddef.h>
+
+#include <algorithm>
+#include <functional>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "base/check_op.h"
+#include "base/location.h"
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/metrics/field_trial.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/notreached.h"
+#include "base/single_thread_task_runner.h"
+#include "base/stl_util.h"
+#include "base/strings/string_util.h"
+#include "base/system/sys_info.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "base/time/default_tick_clock.h"
+#include "base/time/time.h"
+#include "base/timer/elapsed_timer.h"
+#include "base/values.h"
+#include "components/content_settings/core/browser/cookie_settings.h"
+#include "components/prerender/browser/prerender_contents.h"
+#include "components/prerender/browser/prerender_field_trial.h"
+#include "components/prerender/browser/prerender_handle.h"
+#include "components/prerender/browser/prerender_histograms.h"
+#include "components/prerender/browser/prerender_history.h"
+#include "components/prerender/browser/prerender_manager_delegate.h"
+#include "components/prerender/browser/prerender_util.h"
+#include "components/prerender/common/prerender_final_status.h"
+#include "components/prerender/common/prerender_types.mojom.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/navigation_controller.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/session_storage_namespace.h"
+#include "content/public/browser/site_instance.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_delegate.h"
+#include "content/public/common/url_constants.h"
+#include "net/http/http_cache.h"
+#include "net/http/http_request_headers.h"
+#include "third_party/blink/public/common/prerender/prerender_rel_type.h"
+#include "ui/gfx/geometry/rect.h"
+
+using content::BrowserThread;
+using content::RenderViewHost;
+using content::SessionStorageNamespace;
+using content::WebContents;
+
+namespace prerender {
+
+namespace {
+
+// Time interval at which periodic cleanups are performed.
+constexpr base::TimeDelta kPeriodicCleanupInterval =
+    base::TimeDelta::FromMilliseconds(1000);
+
+// Time interval after which OnCloseWebContentsDeleter will schedule a
+// WebContents for deletion.
+constexpr base::TimeDelta kDeleteWithExtremePrejudice =
+    base::TimeDelta::FromSeconds(3);
+
+// Length of prerender history, for display in chrome://net-internals
+constexpr int kHistoryLength = 100;
+
+}  // namespace
+
+class PrerenderManager::OnCloseWebContentsDeleter
+    : public content::WebContentsDelegate,
+      public base::SupportsWeakPtr<
+          PrerenderManager::OnCloseWebContentsDeleter> {
+ public:
+  OnCloseWebContentsDeleter(PrerenderManager* manager,
+                            std::unique_ptr<WebContents> tab)
+      : manager_(manager), tab_(std::move(tab)) {
+    tab_->SetDelegate(this);
+    base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+        FROM_HERE,
+        base::BindOnce(
+            &OnCloseWebContentsDeleter::ScheduleWebContentsForDeletion,
+            AsWeakPtr(), /*timeout=*/true),
+        kDeleteWithExtremePrejudice);
+  }
+
+  void CloseContents(WebContents* source) override {
+    DCHECK_EQ(tab_.get(), source);
+    ScheduleWebContentsForDeletion(/*timeout=*/false);
+  }
+
+ private:
+  void ScheduleWebContentsForDeletion(bool timeout) {
+    UMA_HISTOGRAM_BOOLEAN("Prerender.TabContentsDeleterTimeout", timeout);
+    tab_->SetDelegate(nullptr);
+    manager_->ScheduleDeleteOldWebContents(std::move(tab_), this);
+    // |this| is deleted at this point.
+  }
+
+  PrerenderManager* const manager_;
+  std::unique_ptr<WebContents> tab_;
+
+  DISALLOW_COPY_AND_ASSIGN(OnCloseWebContentsDeleter);
+};
+
+PrerenderManagerObserver::~PrerenderManagerObserver() = default;
+
+// static
+PrerenderManager::PrerenderManagerMode PrerenderManager::mode_ =
+    PRERENDER_MODE_NOSTATE_PREFETCH;
+
+struct PrerenderManager::NavigationRecord {
+  NavigationRecord(const GURL& url, base::TimeTicks time, Origin origin)
+      : url(url), time(time), origin(origin) {}
+
+  GURL url;
+  base::TimeTicks time;
+  Origin origin;
+  FinalStatus final_status = FINAL_STATUS_UNKNOWN;
+};
+
+PrerenderManager::PrerenderManager(
+    content::BrowserContext* browser_context,
+    std::unique_ptr<PrerenderManagerDelegate> delegate)
+    : browser_context_(browser_context),
+      delegate_(std::move(delegate)),
+      prerender_contents_factory_(PrerenderContents::CreateFactory()),
+      prerender_history_(std::make_unique<PrerenderHistory>(kHistoryLength)),
+      histograms_(std::make_unique<PrerenderHistograms>()),
+      tick_clock_(base::DefaultTickClock::GetInstance()) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  last_prerender_start_time_ =
+      GetCurrentTimeTicks() -
+      base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs);
+}
+
+PrerenderManager::~PrerenderManager() {
+  // The earlier call to KeyedService::Shutdown() should have
+  // emptied these vectors already.
+  DCHECK(active_prerenders_.empty());
+  DCHECK(to_delete_prerenders_.empty());
+
+  for (auto* host : prerender_process_hosts_) {
+    host->RemoveObserver(this);
+  }
+}
+
+void PrerenderManager::Shutdown() {
+  DestroyAllContents(FINAL_STATUS_PROFILE_DESTROYED);
+  on_close_web_contents_deleters_.clear();
+  browser_context_ = nullptr;
+
+  DCHECK(active_prerenders_.empty());
+}
+
+std::unique_ptr<PrerenderHandle>
+PrerenderManager::AddPrerenderFromLinkRelPrerender(
+    int process_id,
+    int route_id,
+    const GURL& url,
+    const uint32_t rel_types,
+    const content::Referrer& referrer,
+    const url::Origin& initiator_origin,
+    const gfx::Size& size) {
+  Origin origin = rel_types & blink::kPrerenderRelTypePrerender
+                      ? ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN
+                      : ORIGIN_LINK_REL_NEXT;
+  SessionStorageNamespace* session_storage_namespace = nullptr;
+  // Unit tests pass in a process_id == -1.
+  if (process_id != -1) {
+    RenderViewHost* source_render_view_host =
+        RenderViewHost::FromID(process_id, route_id);
+    if (!source_render_view_host)
+      return nullptr;
+    WebContents* source_web_contents =
+        WebContents::FromRenderViewHost(source_render_view_host);
+    if (!source_web_contents)
+      return nullptr;
+    if (origin == ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN &&
+        source_web_contents->GetURL().host_piece() == url.host_piece()) {
+      origin = ORIGIN_LINK_REL_PRERENDER_SAMEDOMAIN;
+    }
+    // TODO(ajwong): This does not correctly handle storage for isolated apps.
+    session_storage_namespace = source_web_contents->GetController()
+                                    .GetDefaultSessionStorageNamespace();
+  }
+  return AddPrerenderWithPreconnectFallback(origin, url, referrer,
+                                            initiator_origin, gfx::Rect(size),
+                                            session_storage_namespace);
+}
+
+std::unique_ptr<PrerenderHandle> PrerenderManager::AddPrerenderFromOmnibox(
+    const GURL& url,
+    SessionStorageNamespace* session_storage_namespace,
+    const gfx::Size& size) {
+  return AddPrerenderWithPreconnectFallback(
+      ORIGIN_OMNIBOX, url, content::Referrer(), base::nullopt, gfx::Rect(size),
+      session_storage_namespace);
+}
+
+std::unique_ptr<PrerenderHandle>
+PrerenderManager::AddPrerenderFromNavigationPredictor(
+    const GURL& url,
+    SessionStorageNamespace* session_storage_namespace,
+    const gfx::Size& size) {
+  DCHECK(IsNoStatePrefetchEnabled());
+
+  return AddPrerenderWithPreconnectFallback(
+      ORIGIN_NAVIGATION_PREDICTOR, url, content::Referrer(), base::nullopt,
+      gfx::Rect(size), session_storage_namespace);
+}
+
+std::unique_ptr<PrerenderHandle> PrerenderManager::AddIsolatedPrerender(
+    const GURL& url,
+    SessionStorageNamespace* session_storage_namespace,
+    const gfx::Size& size) {
+  DCHECK(IsNoStatePrefetchEnabled());
+
+  // The preconnect fallback won't happen.
+  return AddPrerenderWithPreconnectFallback(
+      ORIGIN_ISOLATED_PRERENDER, url, content::Referrer(), base::nullopt,
+      gfx::Rect(size), session_storage_namespace);
+}
+
+std::unique_ptr<PrerenderHandle>
+PrerenderManager::AddPrerenderFromExternalRequest(
+    const GURL& url,
+    const content::Referrer& referrer,
+    SessionStorageNamespace* session_storage_namespace,
+    const gfx::Rect& bounds) {
+  return AddPrerenderWithPreconnectFallback(ORIGIN_EXTERNAL_REQUEST, url,
+                                            referrer, base::nullopt, bounds,
+                                            session_storage_namespace);
+}
+
+std::unique_ptr<PrerenderHandle>
+PrerenderManager::AddForcedPrerenderFromExternalRequest(
+    const GURL& url,
+    const content::Referrer& referrer,
+    SessionStorageNamespace* session_storage_namespace,
+    const gfx::Rect& bounds) {
+  return AddPrerenderWithPreconnectFallback(
+      ORIGIN_EXTERNAL_REQUEST_FORCED_PRERENDER, url, referrer, base::nullopt,
+      bounds, session_storage_namespace);
+}
+
+void PrerenderManager::CancelAllPrerenders() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  while (!active_prerenders_.empty()) {
+    PrerenderContents* prerender_contents =
+        active_prerenders_.front()->contents();
+    prerender_contents->Destroy(FINAL_STATUS_CANCELLED);
+  }
+}
+
+void PrerenderManager::MoveEntryToPendingDelete(PrerenderContents* entry,
+                                                FinalStatus final_status) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(entry);
+
+  auto it = FindIteratorForPrerenderContents(entry);
+  DCHECK(it != active_prerenders_.end());
+  to_delete_prerenders_.push_back(std::move(*it));
+  active_prerenders_.erase(it);
+  // Destroy the old WebContents relatively promptly to reduce resource usage.
+  PostCleanupTask();
+}
+
+bool PrerenderManager::IsWebContentsPrerendering(
+    const WebContents* web_contents,
+    Origin* origin) const {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  PrerenderContents* prerender_contents = GetPrerenderContents(web_contents);
+  if (!prerender_contents)
+    return false;
+
+  if (origin)
+    *origin = prerender_contents->origin();
+  return true;
+}
+
+bool PrerenderManager::HasPrerenderedUrl(
+    GURL url,
+    content::WebContents* web_contents) const {
+  content::SessionStorageNamespace* session_storage_namespace =
+      web_contents->GetController().GetDefaultSessionStorageNamespace();
+
+  for (const auto& prerender_data : active_prerenders_) {
+    PrerenderContents* prerender_contents = prerender_data->contents();
+    if (prerender_contents->Matches(url, session_storage_namespace))
+      return true;
+  }
+  return false;
+}
+
+bool PrerenderManager::HasPrerenderedAndFinishedLoadingUrl(
+    GURL url,
+    content::WebContents* web_contents) const {
+  content::SessionStorageNamespace* session_storage_namespace =
+      web_contents->GetController().GetDefaultSessionStorageNamespace();
+
+  for (const auto& prerender_data : active_prerenders_) {
+    PrerenderContents* prerender_contents = prerender_data->contents();
+    if (prerender_contents->Matches(url, session_storage_namespace) &&
+        prerender_contents->has_finished_loading()) {
+      return true;
+    }
+  }
+  return false;
+}
+
+PrerenderContents* PrerenderManager::GetPrerenderContents(
+    const content::WebContents* web_contents) const {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  for (const auto& prerender : active_prerenders_) {
+    WebContents* prerender_web_contents =
+        prerender->contents()->prerender_contents();
+    if (prerender_web_contents == web_contents) {
+      return prerender->contents();
+    }
+  }
+
+  // Also check the pending-deletion list. If the prerender is in pending
+  // delete, anyone with a handle on the WebContents needs to know.
+  for (const auto& prerender : to_delete_prerenders_) {
+    WebContents* prerender_web_contents =
+        prerender->contents()->prerender_contents();
+    if (prerender_web_contents == web_contents) {
+      return prerender->contents();
+    }
+  }
+  return nullptr;
+}
+
+PrerenderContents* PrerenderManager::GetPrerenderContentsForRoute(
+    int child_id,
+    int route_id) const {
+  WebContents* web_contents = nullptr;
+  RenderViewHost* render_view_host = RenderViewHost::FromID(child_id, route_id);
+  web_contents = WebContents::FromRenderViewHost(render_view_host);
+  return web_contents ? GetPrerenderContents(web_contents) : nullptr;
+}
+
+PrerenderContents* PrerenderManager::GetPrerenderContentsForProcess(
+    int render_process_id) const {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  for (auto& prerender_data : active_prerenders_) {
+    PrerenderContents* prerender_contents = prerender_data->contents();
+    if (prerender_contents->GetRenderViewHost()->GetProcess()->GetID() ==
+        render_process_id) {
+      return prerender_contents;
+    }
+  }
+  return nullptr;
+}
+
+std::vector<WebContents*>
+PrerenderManager::GetAllNoStatePrefetchingContentsForTesting() const {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  std::vector<WebContents*> result;
+
+  for (const auto& prerender : active_prerenders_) {
+    WebContents* contents = prerender->contents()->prerender_contents();
+    if (contents && prerender->contents()->prerender_mode() ==
+                        prerender::mojom::PrerenderMode::kPrefetchOnly) {
+      result.push_back(contents);
+    }
+  }
+
+  return result;
+}
+
+bool PrerenderManager::HasRecentlyBeenNavigatedTo(Origin origin,
+                                                  const GURL& url) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  CleanUpOldNavigations(&navigations_, base::TimeDelta::FromMilliseconds(
+                                           kNavigationRecordWindowMs));
+  for (auto it = navigations_.rbegin(); it != navigations_.rend(); ++it) {
+    if (it->url == url)
+      return true;
+  }
+
+  return false;
+}
+
+std::unique_ptr<base::DictionaryValue> PrerenderManager::CopyAsValue() const {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  auto dict_value = std::make_unique<base::DictionaryValue>();
+  dict_value->Set("history", prerender_history_->CopyEntriesAsValue());
+  dict_value->Set("active", GetActivePrerendersAsValue());
+  dict_value->SetBoolean("enabled", delegate_->IsPredictionEnabled());
+  dict_value->SetString("disabled_note",
+                        delegate_->GetReasonForDisablingPrediction());
+  // If prerender is disabled via a flag this method is not even called.
+  std::string enabled_note;
+  dict_value->SetString("enabled_note", enabled_note);
+  return dict_value;
+}
+
+void PrerenderManager::ClearData(int clear_flags) {
+  DCHECK_GE(clear_flags, 0);
+  DCHECK_LT(clear_flags, CLEAR_MAX);
+  if (clear_flags & CLEAR_PRERENDER_CONTENTS)
+    DestroyAllContents(FINAL_STATUS_CACHE_OR_HISTORY_CLEARED);
+  // This has to be second, since destroying prerenders can add to the history.
+  if (clear_flags & CLEAR_PRERENDER_HISTORY)
+    prerender_history_->Clear();
+}
+
+void PrerenderManager::RecordFinalStatus(Origin origin,
+                                         FinalStatus final_status) const {
+  histograms_->RecordFinalStatus(origin, final_status);
+}
+
+void PrerenderManager::RecordNavigation(const GURL& url) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  navigations_.emplace_back(url, GetCurrentTimeTicks(), ORIGIN_NONE);
+  CleanUpOldNavigations(&navigations_, base::TimeDelta::FromMilliseconds(
+                                           kNavigationRecordWindowMs));
+}
+
+struct PrerenderManager::PrerenderData::OrderByExpiryTime {
+  bool operator()(const std::unique_ptr<PrerenderData>& a,
+                  const std::unique_ptr<PrerenderData>& b) const {
+    return a->expiry_time() < b->expiry_time();
+  }
+};
+
+PrerenderManager::PrerenderData::PrerenderData(
+    PrerenderManager* manager,
+    std::unique_ptr<PrerenderContents> contents,
+    base::TimeTicks expiry_time)
+    : manager_(manager),
+      contents_(std::move(contents)),
+      expiry_time_(expiry_time) {
+  DCHECK(contents_);
+}
+
+PrerenderManager::PrerenderData::~PrerenderData() = default;
+
+void PrerenderManager::PrerenderData::OnHandleCreated(PrerenderHandle* handle) {
+  DCHECK(contents_);
+  ++handle_count_;
+  contents_->AddObserver(handle);
+}
+
+void PrerenderManager::PrerenderData::OnHandleNavigatedAway(
+    PrerenderHandle* handle) {
+  DCHECK_LT(0, handle_count_);
+  DCHECK(contents_);
+  if (abandon_time_.is_null())
+    abandon_time_ = base::TimeTicks::Now();
+  // We intentionally don't decrement the handle count here, so that the
+  // prerender won't be canceled until it times out.
+  manager_->SourceNavigatedAway(this);
+}
+
+void PrerenderManager::PrerenderData::OnHandleCanceled(
+    PrerenderHandle* handle) {
+  DCHECK_LT(0, handle_count_);
+  DCHECK(contents_);
+
+  if (--handle_count_ == 0) {
+    // This will eventually remove this object from |active_prerenders_|.
+    contents_->Destroy(FINAL_STATUS_CANCELLED);
+  }
+}
+
+std::unique_ptr<PrerenderContents>
+PrerenderManager::PrerenderData::ReleaseContents() {
+  return std::move(contents_);
+}
+
+void PrerenderManager::SourceNavigatedAway(PrerenderData* prerender_data) {
+  // The expiry time of our prerender data will likely change because of
+  // this navigation. This requires a re-sort of |active_prerenders_|.
+  for (auto it = active_prerenders_.begin(); it != active_prerenders_.end();
+       ++it) {
+    PrerenderData* data = it->get();
+    if (data == prerender_data) {
+      data->set_expiry_time(std::min(data->expiry_time(),
+                                     GetExpiryTimeForNavigatedAwayPrerender()));
+      SortActivePrerenders();
+      return;
+    }
+  }
+}
+
+bool PrerenderManager::IsLowEndDevice() const {
+  return base::SysInfo::IsLowEndDevice();
+}
+
+void PrerenderManager::MaybePreconnect(Origin origin,
+                                       const GURL& url_arg) const {
+  delegate_->MaybePreconnect(url_arg);
+}
+
+std::unique_ptr<PrerenderHandle>
+PrerenderManager::AddPrerenderWithPreconnectFallback(
+    Origin origin,
+    const GURL& url_arg,
+    const content::Referrer& referrer,
+    const base::Optional<url::Origin>& initiator_origin,
+    const gfx::Rect& bounds,
+    SessionStorageNamespace* session_storage_namespace) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  // Disallow prerendering on low end devices.
+  if (IsLowEndDevice()) {
+    SkipPrerenderContentsAndMaybePreconnect(url_arg, origin,
+                                            FINAL_STATUS_LOW_END_DEVICE);
+    return nullptr;
+  }
+
+  if ((origin == ORIGIN_LINK_REL_PRERENDER_CROSSDOMAIN ||
+       origin == ORIGIN_LINK_REL_PRERENDER_SAMEDOMAIN) &&
+      IsGoogleOriginURL(referrer.url)) {
+    origin = ORIGIN_GWS_PRERENDER;
+  }
+
+  GURL url = url_arg;
+
+  if (delegate_->GetCookieSettings()->ShouldBlockThirdPartyCookies()) {
+    SkipPrerenderContentsAndMaybePreconnect(
+        url, origin, FINAL_STATUS_BLOCK_THIRD_PARTY_COOKIES);
+    return nullptr;
+  }
+
+  if (!delegate_->IsPredictionEnabled(origin)) {
+    FinalStatus final_status =
+        delegate_->IsPredictionDisabledDueToNetwork(origin)
+            ? FINAL_STATUS_CELLULAR_NETWORK
+            : FINAL_STATUS_PRERENDERING_DISABLED;
+    SkipPrerenderContentsAndMaybePreconnect(url, origin, final_status);
+    return nullptr;
+  }
+
+  if (PrerenderData* preexisting_prerender_data =
+          FindPrerenderData(url, session_storage_namespace)) {
+    SkipPrerenderContentsAndMaybePreconnect(url, origin,
+                                            FINAL_STATUS_DUPLICATE);
+    return base::WrapUnique(new PrerenderHandle(preexisting_prerender_data));
+  }
+
+  if (IsNoStatePrefetchEnabled()) {
+    base::TimeDelta prefetch_age;
+    GetPrefetchInformation(url, &prefetch_age, nullptr /* final_status*/,
+                           nullptr /* origin */);
+    if (!prefetch_age.is_zero() &&
+        prefetch_age <
+            base::TimeDelta::FromMinutes(net::HttpCache::kPrefetchReuseMins)) {
+      SkipPrerenderContentsAndMaybePreconnect(url, origin,
+                                              FINAL_STATUS_DUPLICATE);
+      return nullptr;
+    }
+  }
+
+  // Do not prerender if there are too many render processes, and we would
+  // have to use an existing one.  We do not want prerendering to happen in
+  // a shared process, so that we can always reliably lower the CPU
+  // priority for prerendering.
+  // In single-process mode, ShouldTryToUseExistingProcessHost() always returns
+  // true, so that case needs to be explicitly checked for.
+  // TODO(tburkard): Figure out how to cancel prerendering in the opposite
+  // case, when a new tab is added to a process used for prerendering.
+  // TODO(ppi): Check whether there are usually enough render processes
+  // available on Android. If not, kill an existing renderers so that we can
+  // create a new one.
+  if (content::RenderProcessHost::ShouldTryToUseExistingProcessHost(
+          browser_context_, url) &&
+      !content::RenderProcessHost::run_renderer_in_process()) {
+    SkipPrerenderContentsAndMaybePreconnect(url, origin,
+                                            FINAL_STATUS_TOO_MANY_PROCESSES);
+    return nullptr;
+  }
+
+  // Check if enough time has passed since the last prerender.
+  if (!DoesRateLimitAllowPrerender(origin)) {
+    // Cancel the prerender. We could add it to the pending prerender list but
+    // this doesn't make sense as the next prerender request will be triggered
+    // by a navigation and is unlikely to be the same site.
+    SkipPrerenderContentsAndMaybePreconnect(url, origin,
+                                            FINAL_STATUS_RATE_LIMIT_EXCEEDED);
+    return nullptr;
+  }
+
+  // Record the URL in the prefetch list, even when in full prerender mode, to
+  // enable metrics comparisons.
+  prefetches_.emplace_back(url, GetCurrentTimeTicks(), origin);
+
+  if (GetMode() == PRERENDER_MODE_SIMPLE_LOAD_EXPERIMENT) {
+    // Exit after adding the url to prefetches_, so that no prefetching occurs
+    // but the page is still tracked as "would have been prefetched".
+    return nullptr;
+  }
+
+  // If this is GWS and we are in the holdback, skip the prefetch. Record the
+  // status as holdback, so we can analyze via UKM.
+  if (origin == ORIGIN_GWS_PRERENDER &&
+      base::FeatureList::IsEnabled(kGWSPrefetchHoldback)) {
+    // Set the holdback status on the prefetch entry.
+    SetPrefetchFinalStatusForUrl(url, FINAL_STATUS_GWS_HOLDBACK);
+    SkipPrerenderContentsAndMaybePreconnect(url, origin,
+                                            FINAL_STATUS_GWS_HOLDBACK);
+    return nullptr;
+  }
+
+  // If this is Navigation predictor and we are in the holdback, skip the
+  // prefetch. Record the status as holdback, so we can analyze via UKM.
+  if (origin == ORIGIN_NAVIGATION_PREDICTOR &&
+      base::FeatureList::IsEnabled(kNavigationPredictorPrefetchHoldback)) {
+    // Set the holdback status on the prefetch entry.
+    SetPrefetchFinalStatusForUrl(url,
+                                 FINAL_STATUS_NAVIGATION_PREDICTOR_HOLDBACK);
+    SkipPrerenderContentsAndMaybePreconnect(
+        url, origin, FINAL_STATUS_NAVIGATION_PREDICTOR_HOLDBACK);
+    return nullptr;
+  }
+
+  std::unique_ptr<PrerenderContents> prerender_contents =
+      CreatePrerenderContents(url, referrer, initiator_origin, origin);
+  DCHECK(prerender_contents);
+  PrerenderContents* prerender_contents_ptr = prerender_contents.get();
+  if (IsNoStatePrefetchEnabled()) {
+    prerender_contents_ptr->SetPrerenderMode(
+        prerender::mojom::PrerenderMode::kPrefetchOnly);
+  }
+  active_prerenders_.push_back(
+      std::make_unique<PrerenderData>(this, std::move(prerender_contents),
+                                      GetExpiryTimeForNewPrerender(origin)));
+  if (!prerender_contents_ptr->Init()) {
+    DCHECK(active_prerenders_.end() ==
+           FindIteratorForPrerenderContents(prerender_contents_ptr));
+    return nullptr;
+  }
+
+  DCHECK(!prerender_contents_ptr->prerendering_has_started());
+
+  std::unique_ptr<PrerenderHandle> prerender_handle =
+      base::WrapUnique(new PrerenderHandle(active_prerenders_.back().get()));
+  SortActivePrerenders();
+
+  last_prerender_start_time_ = GetCurrentTimeTicks();
+
+  gfx::Rect contents_bounds =
+      bounds.IsEmpty() ? config_.default_tab_bounds : bounds;
+
+  prerender_contents_ptr->StartPrerendering(contents_bounds,
+                                            session_storage_namespace);
+
+  DCHECK(prerender_contents_ptr->prerendering_has_started());
+
+  StartSchedulingPeriodicCleanups();
+  return prerender_handle;
+}
+
+void PrerenderManager::StartSchedulingPeriodicCleanups() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  if (repeating_timer_.IsRunning())
+    return;
+
+  repeating_timer_.Start(FROM_HERE, kPeriodicCleanupInterval, this,
+                         &PrerenderManager::PeriodicCleanup);
+}
+
+void PrerenderManager::StopSchedulingPeriodicCleanups() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  repeating_timer_.Stop();
+}
+
+void PrerenderManager::PeriodicCleanup() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  base::ElapsedTimer resource_timer;
+
+  // Grab a copy of the current PrerenderContents pointers, so that we
+  // will not interfere with potential deletions of the list.
+  std::vector<PrerenderContents*> prerender_contents;
+  prerender_contents.reserve(active_prerenders_.size());
+  for (auto& prerender : active_prerenders_)
+    prerender_contents.push_back(prerender->contents());
+
+  // And now check for prerenders using too much memory.
+  for (auto* contents : prerender_contents)
+    contents->DestroyWhenUsingTooManyResources();
+
+  base::ElapsedTimer cleanup_timer;
+
+  // Perform deferred cleanup work.
+  DeleteOldWebContents();
+  DeleteOldEntries();
+  if (active_prerenders_.empty())
+    StopSchedulingPeriodicCleanups();
+
+  DeleteToDeletePrerenders();
+
+  CleanUpOldNavigations(&prefetches_, base::TimeDelta::FromMinutes(30));
+}
+
+void PrerenderManager::PostCleanupTask() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(&PrerenderManager::PeriodicCleanup,
+                                weak_factory_.GetWeakPtr()));
+}
+
+base::TimeTicks PrerenderManager::GetExpiryTimeForNewPrerender(
+    Origin origin) const {
+  return GetCurrentTimeTicks() + config_.time_to_live;
+}
+
+base::TimeTicks PrerenderManager::GetExpiryTimeForNavigatedAwayPrerender()
+    const {
+  return GetCurrentTimeTicks() + config_.abandon_time_to_live;
+}
+
+void PrerenderManager::DeleteOldEntries() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  while (!active_prerenders_.empty()) {
+    auto& prerender_data = active_prerenders_.front();
+    DCHECK(prerender_data);
+    DCHECK(prerender_data->contents());
+
+    if (prerender_data->expiry_time() > GetCurrentTimeTicks())
+      return;
+    prerender_data->contents()->Destroy(FINAL_STATUS_TIMED_OUT);
+  }
+}
+
+void PrerenderManager::DeleteToDeletePrerenders() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  // Delete the items one by one (after removing from the vector) as deleting
+  // the WebContents may trigger a call to GetPrerenderContents(), which
+  // iterates over |to_delete_prerenders_|.
+  while (!to_delete_prerenders_.empty()) {
+    std::unique_ptr<PrerenderData> prerender_data =
+        std::move(to_delete_prerenders_.back());
+    to_delete_prerenders_.pop_back();
+  }
+}
+
+base::Time PrerenderManager::GetCurrentTime() const {
+  return base::Time::Now();
+}
+
+base::TimeTicks PrerenderManager::GetCurrentTimeTicks() const {
+  return tick_clock_->NowTicks();
+}
+
+void PrerenderManager::SetTickClockForTesting(
+    const base::TickClock* tick_clock) {
+  tick_clock_ = tick_clock;
+}
+
+void PrerenderManager::AddObserver(
+    std::unique_ptr<PrerenderManagerObserver> observer) {
+  observers_.push_back(std::move(observer));
+}
+
+std::unique_ptr<PrerenderContents> PrerenderManager::CreatePrerenderContents(
+    const GURL& url,
+    const content::Referrer& referrer,
+    const base::Optional<url::Origin>& initiator_origin,
+    Origin origin) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  return base::WrapUnique(prerender_contents_factory_->CreatePrerenderContents(
+      delegate_->GetPrerenderContentsDelegate(), this, browser_context_, url,
+      referrer, initiator_origin, origin));
+}
+
+void PrerenderManager::SortActivePrerenders() {
+  std::sort(active_prerenders_.begin(), active_prerenders_.end(),
+            PrerenderData::OrderByExpiryTime());
+}
+
+PrerenderManager::PrerenderData* PrerenderManager::FindPrerenderData(
+    const GURL& url,
+    SessionStorageNamespace* session_storage_namespace) {
+  for (const auto& prerender : active_prerenders_) {
+    PrerenderContents* contents = prerender->contents();
+    if (contents->Matches(url, session_storage_namespace))
+      return prerender.get();
+  }
+  return nullptr;
+}
+
+PrerenderManager::PrerenderDataVector::iterator
+PrerenderManager::FindIteratorForPrerenderContents(
+    PrerenderContents* prerender_contents) {
+  for (auto it = active_prerenders_.begin(); it != active_prerenders_.end();
+       ++it) {
+    if ((*it)->contents() == prerender_contents)
+      return it;
+  }
+  return active_prerenders_.end();
+}
+
+bool PrerenderManager::DoesRateLimitAllowPrerender(Origin origin) const {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  // Allow navigation predictor to manage its own rate limit.
+  if (origin == ORIGIN_NAVIGATION_PREDICTOR)
+    return true;
+  base::TimeDelta elapsed_time =
+      GetCurrentTimeTicks() - last_prerender_start_time_;
+  if (!config_.rate_limit_enabled)
+    return true;
+  return elapsed_time >=
+         base::TimeDelta::FromMilliseconds(kMinTimeBetweenPrerendersMs);
+}
+
+void PrerenderManager::DeleteOldWebContents() {
+  old_web_contents_list_.clear();
+}
+
+bool PrerenderManager::GetPrefetchInformation(const GURL& url,
+                                              base::TimeDelta* prefetch_age,
+                                              FinalStatus* final_status,
+                                              Origin* origin) {
+  CleanUpOldNavigations(&prefetches_, base::TimeDelta::FromMinutes(30));
+
+  if (prefetch_age)
+    *prefetch_age = base::TimeDelta();
+  if (final_status)
+    *final_status = FINAL_STATUS_MAX;
+  if (origin)
+    *origin = ORIGIN_NONE;
+
+  for (auto it = prefetches_.crbegin(); it != prefetches_.crend(); ++it) {
+    if (it->url == url) {
+      if (prefetch_age)
+        *prefetch_age = GetCurrentTimeTicks() - it->time;
+      if (final_status)
+        *final_status = it->final_status;
+      if (origin)
+        *origin = it->origin;
+      return true;
+    }
+  }
+  return false;
+}
+
+void PrerenderManager::SetPrefetchFinalStatusForUrl(const GURL& url,
+                                                    FinalStatus final_status) {
+  for (auto it = prefetches_.rbegin(); it != prefetches_.rend(); ++it) {
+    if (it->url == url) {
+      it->final_status = final_status;
+      break;
+    }
+  }
+}
+
+bool PrerenderManager::HasRecentlyPrefetchedUrlForTesting(const GURL& url) {
+  return std::any_of(prefetches_.cbegin(), prefetches_.cend(),
+                     [url](const NavigationRecord& r) {
+                       return r.url == url &&
+                              r.final_status ==
+                                  FINAL_STATUS_NOSTATE_PREFETCH_FINISHED;
+                     });
+}
+
+void PrerenderManager::OnPrefetchUsed(const GURL& url) {
+  // Loading a prefetched URL resets the revalidation bypass. Remove all
+  // matching urls from the prefetch list for more accurate metrics.
+  base::EraseIf(prefetches_,
+                [url](const NavigationRecord& r) { return r.url == url; });
+}
+
+void PrerenderManager::CleanUpOldNavigations(
+    std::vector<NavigationRecord>* navigations,
+    base::TimeDelta max_age) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  // Cutoff. Navigations before this cutoff can be discarded.
+  base::TimeTicks cutoff = GetCurrentTimeTicks() - max_age;
+  auto it = navigations->begin();
+  for (; it != navigations->end(); ++it) {
+    if (it->time > cutoff)
+      break;
+  }
+  navigations->erase(navigations->begin(), it);
+}
+
+void PrerenderManager::ScheduleDeleteOldWebContents(
+    std::unique_ptr<WebContents> tab,
+    OnCloseWebContentsDeleter* deleter) {
+  old_web_contents_list_.push_back(std::move(tab));
+  PostCleanupTask();
+
+  if (!deleter)
+    return;
+
+  for (auto it = on_close_web_contents_deleters_.begin();
+       it != on_close_web_contents_deleters_.end(); ++it) {
+    if (it->get() == deleter) {
+      on_close_web_contents_deleters_.erase(it);
+      return;
+    }
+  }
+  NOTREACHED();
+}
+
+void PrerenderManager::AddToHistory(PrerenderContents* contents) {
+  PrerenderHistory::Entry entry(contents->prerender_url(),
+                                contents->final_status(), contents->origin(),
+                                base::Time::Now());
+  prerender_history_->AddEntry(entry);
+}
+
+std::unique_ptr<base::ListValue> PrerenderManager::GetActivePrerendersAsValue()
+    const {
+  auto list_value = std::make_unique<base::ListValue>();
+  for (const auto& prerender : active_prerenders_) {
+    auto prerender_value = prerender->contents()->GetAsValue();
+    if (prerender_value)
+      list_value->Append(std::move(prerender_value));
+  }
+  return list_value;
+}
+
+void PrerenderManager::DestroyAllContents(FinalStatus final_status) {
+  DeleteOldWebContents();
+  while (!active_prerenders_.empty()) {
+    PrerenderContents* contents = active_prerenders_.front()->contents();
+    contents->Destroy(final_status);
+  }
+  DeleteToDeletePrerenders();
+}
+
+void PrerenderManager::SkipPrerenderContentsAndMaybePreconnect(
+    const GURL& url,
+    Origin origin,
+    FinalStatus final_status) const {
+  PrerenderHistory::Entry entry(url, final_status, origin, base::Time::Now());
+  prerender_history_->AddEntry(entry);
+  histograms_->RecordFinalStatus(origin, final_status);
+
+  if (origin == ORIGIN_ISOLATED_PRERENDER) {
+    // Isolated Prerenders should not preconnect since that can't be done in a
+    // fully isolated way.
+    return;
+  }
+
+  if (final_status == FINAL_STATUS_LOW_END_DEVICE ||
+      final_status == FINAL_STATUS_CELLULAR_NETWORK ||
+      final_status == FINAL_STATUS_DUPLICATE ||
+      final_status == FINAL_STATUS_TOO_MANY_PROCESSES) {
+    MaybePreconnect(origin, url);
+  }
+
+  static_assert(
+      FINAL_STATUS_MAX == FINAL_STATUS_NAVIGATION_PREDICTOR_HOLDBACK + 1,
+      "Consider whether a failed prerender should fallback to preconnect");
+}
+
+void PrerenderManager::RecordNetworkBytesConsumed(Origin origin,
+                                                  int64_t prerender_bytes) {
+  if (!IsNoStatePrefetchEnabled())
+    return;
+  int64_t recent_browser_context_bytes =
+      browser_context_network_bytes_ -
+      last_recorded_browser_context_network_bytes_;
+  last_recorded_browser_context_network_bytes_ = browser_context_network_bytes_;
+  DCHECK_GE(recent_browser_context_bytes, 0);
+  histograms_->RecordNetworkBytesConsumed(origin, prerender_bytes,
+                                          recent_browser_context_bytes);
+}
+
+void PrerenderManager::AddPrerenderProcessHost(
+    content::RenderProcessHost* process_host) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  bool inserted = prerender_process_hosts_.insert(process_host).second;
+  DCHECK(inserted);
+  process_host->AddObserver(this);
+}
+
+bool PrerenderManager::MayReuseProcessHost(
+    content::RenderProcessHost* process_host) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  // Isolate prerender processes to make the resource monitoring check more
+  // accurate.
+  return !base::Contains(prerender_process_hosts_, process_host);
+}
+
+void PrerenderManager::RenderProcessHostDestroyed(
+    content::RenderProcessHost* host) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  size_t erased = prerender_process_hosts_.erase(host);
+  DCHECK_EQ(1u, erased);
+}
+
+base::WeakPtr<PrerenderManager> PrerenderManager::AsWeakPtr() {
+  return weak_factory_.GetWeakPtr();
+}
+
+void PrerenderManager::ClearPrefetchInformationForTesting() {
+  prefetches_.clear();
+}
+
+void PrerenderManager::SetPrerenderContentsFactoryForTest(
+    PrerenderContents::Factory* prerender_contents_factory) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  prerender_contents_factory_.reset(prerender_contents_factory);
+}
+
+}  // namespace prerender
diff --git a/chrome/browser/prerender/prerender_manager.h b/components/prerender/browser/prerender_manager.h
similarity index 98%
rename from chrome/browser/prerender/prerender_manager.h
rename to components/prerender/browser/prerender_manager.h
index b471e5b..386a437fc 100644
--- a/chrome/browser/prerender/prerender_manager.h
+++ b/components/prerender/browser/prerender_manager.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_PRERENDER_PRERENDER_MANAGER_H_
-#define CHROME_BROWSER_PRERENDER_PRERENDER_MANAGER_H_
+#ifndef COMPONENTS_PRERENDER_BROWSER_PRERENDER_MANAGER_H_
+#define COMPONENTS_PRERENDER_BROWSER_PRERENDER_MANAGER_H_
 
 #include <stdint.h>
 
@@ -18,9 +18,9 @@
 #include "base/time/clock.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
-#include "chrome/browser/prerender/prerender_contents.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/prerender/browser/prerender_config.h"
+#include "components/prerender/browser/prerender_contents.h"
 #include "components/prerender/browser/prerender_histograms.h"
 #include "components/prerender/browser/prerender_manager_delegate.h"
 #include "components/prerender/common/prerender_final_status.h"
@@ -42,7 +42,7 @@
 namespace content {
 class WebContents;
 class BrowserContext;
-}
+}  // namespace content
 
 namespace gfx {
 class Rect;
@@ -560,4 +560,4 @@
 
 }  // namespace prerender
 
-#endif  // CHROME_BROWSER_PRERENDER_PRERENDER_MANAGER_H_
+#endif  // COMPONENTS_PRERENDER_BROWSER_PRERENDER_MANAGER_H_
diff --git a/content/browser/accessibility/accessibility_action_browsertest.cc b/content/browser/accessibility/accessibility_action_browsertest.cc
index efe6f468..5600f913 100644
--- a/content/browser/accessibility/accessibility_action_browsertest.cc
+++ b/content/browser/accessibility/accessibility_action_browsertest.cc
@@ -19,6 +19,7 @@
 #include "content/shell/browser/shell.h"
 #include "net/base/data_url.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/accessibility/accessibility_switches.h"
 #include "ui/accessibility/ax_enums.mojom.h"
 #include "ui/gfx/codec/png_codec.h"
 #include "url/gurl.h"
@@ -877,4 +878,48 @@
 #endif  // !defined(OS_ANDROID)
 }
 
+// This test ony makes sense on platforms where the popup menu is implemented
+// internally as an HTML page in a popup, not where it's a native popup.
+#if defined(OS_WIN) || defined(OS_CHROMEOS) || defined(USE_ATK)
+IN_PROC_BROWSER_TEST_F(AccessibilityActionBrowserTest,
+                       OpenSelectPopupWithNoAXMenuList) {
+  base::CommandLine::ForCurrentProcess()->AppendSwitch(
+      ::switches::kDisableAXMenuList);
+
+  LoadInitialAccessibilityTreeFromHtml(R"HTML(
+      <head><title>No AXMenuList</title></head>
+      <body>
+        <select>
+          <option selected>One</option>
+          <option>Two</option>
+          <option>Three</option>
+        </select>
+      </body>
+      )HTML");
+
+  BrowserAccessibility* target = FindNode(ax::mojom::Role::kPopUpButton, "One");
+  ASSERT_NE(nullptr, target);
+
+  EXPECT_EQ(0U, target->PlatformChildCount());
+  EXPECT_EQ(nullptr, FindNode(ax::mojom::Role::kListBox, ""));
+
+  // Call DoDefaultAction.
+  AccessibilityNotificationWaiter waiter2(
+      shell()->web_contents(), ui::kAXModeComplete, ax::mojom::Event::kClicked);
+  GetManager()->DoDefaultAction(*target);
+  waiter2.WaitForNotification();
+
+  WaitForAccessibilityTreeToContainNodeWithName(shell()->web_contents(),
+                                                "Three");
+
+  ASSERT_EQ(1U, target->PlatformChildCount());
+  BrowserAccessibility* popup_web_area = target->PlatformGetChild(0);
+  EXPECT_EQ(ax::mojom::Role::kRootWebArea, popup_web_area->GetRole());
+
+  BrowserAccessibility* listbox = FindNode(ax::mojom::Role::kListBox, "");
+  ASSERT_TRUE(listbox);
+  EXPECT_EQ(3U, listbox->PlatformChildCount());
+}
+#endif  // defined(OS_WIN) || defined(OS_CHROMEOS) || defined(USE_ATK)
+
 }  // namespace content
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc
index 1ee2423..013b4fb 100644
--- a/content/browser/accessibility/browser_accessibility.cc
+++ b/content/browser/accessibility/browser_accessibility.cc
@@ -1036,6 +1036,30 @@
          ax::mojom::NameFrom::kAttributeExplicitlyEmpty;
 }
 
+std::string BrowserAccessibility::ComputeAccessibleNameFromDescendants() const {
+  std::string name;
+  for (InternalChildIterator it = InternalChildrenBegin();
+       it != InternalChildrenEnd(); ++it) {
+    const BrowserAccessibility* child = it.get();
+    std::string child_name;
+    if (child->GetStringAttribute(ax::mojom::StringAttribute::kName,
+                                  &child_name)) {
+      if (!name.empty())
+        name += " ";
+      name += child_name;
+    } else if (!child->HasState(ax::mojom::State::kFocusable)) {
+      child_name = child->ComputeAccessibleNameFromDescendants();
+      if (!child_name.empty()) {
+        if (!name.empty())
+          name += " ";
+        name += child_name;
+      }
+    }
+  }
+
+  return name;
+}
+
 std::string BrowserAccessibility::GetLiveRegionText() const {
   if (IsIgnored())
     return "";
diff --git a/content/browser/accessibility/browser_accessibility.h b/content/browser/accessibility/browser_accessibility.h
index 9cf722b..16c7908f 100644
--- a/content/browser/accessibility/browser_accessibility.h
+++ b/content/browser/accessibility/browser_accessibility.h
@@ -382,6 +382,9 @@
   // Returns true if the accessible name was explicitly set to "" by the author
   bool HasExplicitlyEmptyName() const;
 
+  // TODO(nektar): Remove this method and replace with GetInnerText.
+  std::string ComputeAccessibleNameFromDescendants() const;
+
   // Get text to announce for a live region change, for ATs that do not
   // implement this functionality.
   std::string GetLiveRegionText() const;
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm
index cf856f5..d203e3a 100644
--- a/content/browser/accessibility/browser_accessibility_cocoa.mm
+++ b/content/browser/accessibility/browser_accessibility_cocoa.mm
@@ -1220,6 +1220,19 @@
     }
   }
 
+  // If it's focusable but didn't have any other name or value, compute a name
+  // from its descendants. Note that this is a workaround because VoiceOver
+  // does not always present focus changes if the new focus lacks a name.
+  base::string16 value = _owner->GetValue();
+  if (_owner->HasState(ax::mojom::State::kFocusable) &&
+      !ui::IsControl(_owner->GetRole()) && value.empty() &&
+      [self internalRole] != ax::mojom::Role::kDateTime &&
+      [self internalRole] != ax::mojom::Role::kWebArea &&
+      [self internalRole] != ax::mojom::Role::kRootWebArea) {
+    return base::SysUTF8ToNSString(
+        _owner->ComputeAccessibleNameFromDescendants());
+  }
+
   return @"";
 }
 
diff --git a/content/browser/download/download_browsertest.cc b/content/browser/download/download_browsertest.cc
index 463ff35..9ee0ac6 100644
--- a/content/browser/download/download_browsertest.cc
+++ b/content/browser/download/download_browsertest.cc
@@ -4308,9 +4308,11 @@
                                   parameters);
 }
 
-#if defined(OS_WIN)
-// Flaky https://crbug.com/1105429, windows probably use a large receiving
-// buffer size and cause the first slice to start at a offset > 0.
+#if defined(OS_WIN) || defined(OS_LINUX) || defined(OS_CHROMEOS) || \
+    defined(OS_ANDROID)
+// Flaky https://crbug.com/1105429, https://crbug.com/1106059.
+// Windows probably use a large receiving buffer size and cause the first slice
+// to start at a offset > 0.
 #define MAYBE_MiddleSliceDelayedError DISABLED_MiddleSliceDelayedError
 #else
 #define MAYBE_MiddleSliceDelayedError MiddleSliceDelayedError
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index a147f6e..116b5c8 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1867,6 +1867,8 @@
   // be sent again.
   has_before_unload_handler_ = false;
   has_unload_handler_ = false;
+  has_pagehide_handler_ = false;
+  has_visibilitychange_handler_ = false;
 
   if (IsPendingDeletion()) {
     // If the process has died, we don't need to wait for the ACK. Complete the
@@ -2115,12 +2117,13 @@
     Send(new UnfreezableFrameMsg_Delete(routing_id_, intent));
 
     if (!frame_tree_node_->IsMainFrame() && IsCurrent()) {
-      // If this subframe has an unload handler (and isn't speculative), ensure
-      // that it has a chance to execute by delaying process cleanup. This will
-      // prevent the process from shutting down immediately in the case where
-      // this is the last active frame in the process. See
-      // https://crbug.com/852204.
-      if (has_unload_handler()) {
+      DCHECK_NE(lifecycle_state(), LifecycleState::kSpeculative);
+      // If this subframe has unload handlers (and isn't speculative), ensure
+      // that they have a chance to execute by delaying process cleanup. This
+      // will prevent the process from shutting down immediately in the case
+      // where this is the last active frame in the process.
+      // See https://crbug.com/852204.
+      if (has_unload_handlers()) {
         RenderProcessHostImpl* process =
             static_cast<RenderProcessHostImpl*>(GetProcess());
         process->DelayProcessShutdownForUnload(subframe_unload_timeout_);
@@ -2133,7 +2136,7 @@
     }
   }
 
-  LifecycleState lifecycle_state = has_unload_handler()
+  LifecycleState lifecycle_state = has_unload_handlers()
                                        ? LifecycleState::kRunningUnloadHandlers
                                        : LifecycleState::kReadyToBeDeleted;
   SetLifecycleState(lifecycle_state);
@@ -2335,6 +2338,13 @@
     active_sandbox_flags_ = frame_tree_node()->active_sandbox_flags();
     document_policy_ = blink::DocumentPolicy::CreateWithHeaderPolicy({});
 
+    // Since we're changing documents, we should reset the event handler
+    // trackers.
+    has_before_unload_handler_ = false;
+    has_unload_handler_ = false;
+    has_pagehide_handler_ = false;
+    has_visibilitychange_handler_ = false;
+
     DCHECK(params.embedding_token.has_value());
     SetEmbeddingToken(params.embedding_token.value());
   }
@@ -4286,20 +4296,37 @@
       DCHECK_NE(has_before_unload_handler_, present);
       has_before_unload_handler_ = present;
       break;
+    case blink::mojom::SuddenTerminationDisablerType::kPageHideHandler:
+      DCHECK_NE(has_pagehide_handler_, present);
+      has_pagehide_handler_ = present;
+      break;
     case blink::mojom::SuddenTerminationDisablerType::kUnloadHandler:
       DCHECK_NE(has_unload_handler_, present);
       has_unload_handler_ = present;
       break;
+    case blink::mojom::SuddenTerminationDisablerType::kVisibilityChangeHandler:
+      DCHECK_NE(has_visibilitychange_handler_, present);
+      has_visibilitychange_handler_ = present;
+      break;
   }
 }
 
 bool RenderFrameHostImpl::GetSuddenTerminationDisablerState(
     blink::mojom::SuddenTerminationDisablerType disabler_type) {
+  if (do_not_delete_for_testing_ &&
+      disabler_type !=
+          blink::mojom::SuddenTerminationDisablerType::kBeforeUnloadHandler) {
+    return true;
+  }
   switch (disabler_type) {
     case blink::mojom::SuddenTerminationDisablerType::kBeforeUnloadHandler:
       return has_before_unload_handler_;
+    case blink::mojom::SuddenTerminationDisablerType::kPageHideHandler:
+      return has_pagehide_handler_;
     case blink::mojom::SuddenTerminationDisablerType::kUnloadHandler:
-      return has_unload_handler();
+      return has_unload_handler_;
+    case blink::mojom::SuddenTerminationDisablerType::kVisibilityChangeHandler:
+      return has_visibilitychange_handler_;
   }
 }
 
@@ -5612,8 +5639,9 @@
       local_ancestor->DeleteRenderFrame(FrameDeleteIntention::kNotMainFrame);
       if (local_ancestor != child) {
         LifecycleState child_lifecycle_state =
-            child->has_unload_handler() ? LifecycleState::kRunningUnloadHandlers
-                                        : LifecycleState::kReadyToBeDeleted;
+            child->has_unload_handlers()
+                ? LifecycleState::kRunningUnloadHandlers
+                : LifecycleState::kReadyToBeDeleted;
         child->SetLifecycleState(child_lifecycle_state);
       }
 
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index c3de5da5..1a056cee 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -752,13 +752,15 @@
     kInBackForwardCache,
 
     // This state corresponds to when RenderFrameHost has started running unload
-    // handlers. An event such as navigation commit or detaching the frame
-    // causes the RenderFrameHost to transition to this state. Then, the
-    // RenderFrameHost sends IPCs to the renderer process to execute unload
-    // handlers and deletes the RenderFrame. The RenderFrameHost waits for an
-    // ACK from the renderer process, either FrameHostMsg_Unload_ACK for a
-    // navigating frame or mojom::FrameHost::Detach for its subframes, after
-    // which the RenderFrameHost transitions to kReadyToBeDeleted state.
+    // handlers (this includes handlers for the "unload", "pagehide", and
+    // "visibilitychange" events). An event such as navigation commit or
+    // detaching the frame causes the RenderFrameHost to transition to this
+    // state. Then, the RenderFrameHost sends IPCs to the renderer process to
+    // execute unload handlers and deletes the RenderFrame. The RenderFrameHost
+    // waits for an ACK from the renderer process, either
+    // FrameHostMsg_Unload_ACK for a navigating frame or FrameHostMsg_Detach for
+    // its subframes, after which the RenderFrameHost transitions to
+    // kReadyToBeDeleted state.
     //
     // Transition to this state happens only from kActive state. Note that
     // eviction from BackForwardCache does not run unload handlers, and
@@ -1801,6 +1803,7 @@
   friend class TestRenderViewHost;
   friend class TextInputTestLocalFrame;
   friend class WebContentsSplitCacheBrowserTest;
+  friend class RenderFrameHostManagerUnloadBrowserTest;
 
   FRIEND_TEST_ALL_PREFIXES(NavigatorTest, TwoNavigationsRacingCommit);
   FRIEND_TEST_ALL_PREFIXES(RenderFrameHostImplBeforeUnloadBrowserTest,
@@ -2416,8 +2419,9 @@
   // See |SetIsXrOverlaySetup()|
   bool HasSeenRecentXrOverlaySetup();
 
-  bool has_unload_handler() {
-    return has_unload_handler_ || do_not_delete_for_testing_;
+  bool has_unload_handlers() {
+    return has_unload_handler_ || has_pagehide_handler_ ||
+           has_visibilitychange_handler_ || do_not_delete_for_testing_;
   }
 
   // Updates the |lifecycle_state_|. Called when there is a change in the
@@ -2772,6 +2776,8 @@
   // Renderer-side states that blocks fast shutdown of the frame.
   bool has_before_unload_handler_ = false;
   bool has_unload_handler_ = false;
+  bool has_pagehide_handler_ = false;
+  bool has_visibilitychange_handler_ = false;
 
   base::Optional<RenderFrameAudioOutputStreamFactory>
       audio_service_audio_output_stream_factory_;
diff --git a/content/browser/frame_host/render_frame_host_manager_browsertest.cc b/content/browser/frame_host/render_frame_host_manager_browsertest.cc
index 57964d8..1e7731b5 100644
--- a/content/browser/frame_host/render_frame_host_manager_browsertest.cc
+++ b/content/browser/frame_host/render_frame_host_manager_browsertest.cc
@@ -7022,16 +7022,40 @@
     return request_content_;
   }
 
-  // Adds an unload handler to |rfh| and verifies that the unload state
+  blink::mojom::SuddenTerminationDisablerType DisablerTypeForEvent(
+      const std::string& event_name) {
+    if (event_name == "unload")
+      return blink::mojom::SuddenTerminationDisablerType::kUnloadHandler;
+    if (event_name == "pagehide")
+      return blink::mojom::SuddenTerminationDisablerType::kPageHideHandler;
+    if (event_name == "visibilitychange")
+      return blink::mojom::SuddenTerminationDisablerType::
+          kVisibilityChangeHandler;
+    NOTREACHED();
+    return blink::mojom::SuddenTerminationDisablerType::kUnloadHandler;
+  }
+
+  // Adds an unload event handler (can be for the unload, pagehide, or
+  // visibilitychange event) to |rfh| and verifies that the unload state
   // bookkeeping on |rfh| is updated properly.
-  void AddUnloadHandler(RenderFrameHostImpl* rfh, const std::string& script) {
+  void AddUnloadEventHandler(RenderFrameHostImpl* rfh,
+                             const std::string& event_name,
+                             const std::string& script) {
+    EXPECT_THAT(event_name,
+                testing::AnyOf(testing::Eq("unload"), testing::Eq("pagehide"),
+                               testing::Eq("visibilitychange")));
     EXPECT_FALSE(rfh->GetSuddenTerminationDisablerState(
-        blink::mojom::SuddenTerminationDisablerType::kUnloadHandler));
+        DisablerTypeForEvent(event_name)));
+    EXPECT_FALSE(rfh->has_unload_handlers());
+    std::string event_target =
+        event_name == "visibilitychange" ? "document" : "window";
     EXPECT_TRUE(ExecuteScript(
-        rfh, base::StringPrintf("window.onunload = function(e) { %s }",
+        rfh, base::StringPrintf("%s.addEventListener('%s', (e) => { %s });",
+                                event_target.c_str(), event_name.c_str(),
                                 script.c_str())));
     EXPECT_TRUE(rfh->GetSuddenTerminationDisablerState(
-        blink::mojom::SuddenTerminationDisablerType::kUnloadHandler));
+        DisablerTypeForEvent(event_name)));
+    EXPECT_TRUE(rfh->has_unload_handlers());
   }
 
   // Extend the timeout for keeping the subframe process alive for unload
@@ -7083,36 +7107,42 @@
 };
 
 // Ensure that after a main frame with a cross-site iframe is itself navigated
-// cross-site, the unload handler in the iframe can use navigator.sendBeacon()
-// to do a termination ping.  See https://crbug.com/852204, where this was
-// broken with site isolation if the iframe was in its own process.
+// cross-site, the unload event handlers (for unload, pagehide, or
+// visibilitychange events) in the iframe can use navigator.sendBeacon() to do a
+// termination ping.  See https://crbug.com/852204, where this was broken with
+// site isolation if the iframe was in its own process.
 IN_PROC_BROWSER_TEST_P(RenderFrameHostManagerUnloadBrowserTest,
                        SubframeTerminationPing_SendBeacon) {
   // See BackForwardCache::DisableForTestingReason for explanation.
   DisableBackForwardCache(BackForwardCacheImpl::TEST_USES_UNLOAD_EVENT);
-
+  const std::string unload_event_names[] = {"unload", "pagehide",
+                                            "visibilitychange"};
   GURL main_url(embedded_test_server()->GetURL(
       "a.com", "/cross_site_iframe_factory.html?a(b)"));
-  EXPECT_TRUE(NavigateToURL(shell(), main_url));
-  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
-                            ->GetFrameTree()
-                            ->root();
-  RenderFrameHostImpl* child_rfh = root->child_at(0)->current_frame_host();
-
-  // Add a subframe unload handler to do a termination ping via sendBeacon.
   GURL ping_url(embedded_test_server()->GetURL("b.com", "/empty.html"));
-  AddUnloadHandler(child_rfh,
-                   base::StringPrintf("navigator.sendBeacon('%s', 'ping');",
-                                      ping_url.spec().c_str()));
-  ExtendSubframeUnloadTimeoutForTerminationPing(child_rfh);
-
-  // Navigate the main frame to c.com and wait for the ping.
-  StartMonitoringRequestsFor(ping_url);
   GURL c_url(embedded_test_server()->GetURL("c.com", "/title1.html"));
-  EXPECT_TRUE(NavigateToURL(shell(), c_url));
-  // Test succeeds if this doesn't time out while waiting for |ping_url|.
-  WaitForMonitoredRequest();
-  EXPECT_EQ("ping", GetRequestContent());
+
+  for (const std::string& unload_event_name : unload_event_names) {
+    EXPECT_TRUE(NavigateToURL(shell(), main_url));
+    FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                              ->GetFrameTree()
+                              ->root();
+    RenderFrameHostImpl* child_rfh = root->child_at(0)->current_frame_host();
+
+    // Add a subframe unload handler to do a termination ping via sendBeacon.
+    AddUnloadEventHandler(
+        child_rfh, unload_event_name,
+        base::StringPrintf("navigator.sendBeacon('%s', 'ping');",
+                           ping_url.spec().c_str()));
+    ExtendSubframeUnloadTimeoutForTerminationPing(child_rfh);
+
+    // Navigate the main frame to c.com and wait for the ping.
+    StartMonitoringRequestsFor(ping_url);
+    EXPECT_TRUE(NavigateToURL(shell(), c_url));
+    // Test succeeds if this doesn't time out while waiting for |ping_url|.
+    WaitForMonitoredRequest();
+    EXPECT_EQ("ping", GetRequestContent());
+  }
 }
 
 // Ensure that after a main frame with a cross-site iframe is itself navigated
@@ -7135,11 +7165,12 @@
   // Add a subframe unload handler to do a termination ping by loading an
   // image.
   GURL ping_url(embedded_test_server()->GetURL("b.com", "/blank.jpg"));
-  AddUnloadHandler(child_rfh,
-                   base::StringPrintf("var img = document.createElement('img');"
-                                      "img.src = '%s';"
-                                      "document.body.appendChild(img);",
-                                      ping_url.spec().c_str()));
+  AddUnloadEventHandler(
+      child_rfh, "unload",
+      base::StringPrintf("var img = document.createElement('img');"
+                         "img.src = '%s';"
+                         "document.body.appendChild(img);",
+                         ping_url.spec().c_str()));
   ExtendSubframeUnloadTimeoutForTerminationPing(child_rfh);
 
   // Navigate the main frame to c.com and wait for the ping.
@@ -7177,9 +7208,10 @@
   // In the popup, add a subframe unload handler to do a termination ping via
   // sendBeacon.
   GURL ping_url(embedded_test_server()->GetURL("c.com", "/empty.html"));
-  AddUnloadHandler(child_rfh,
-                   base::StringPrintf("navigator.sendBeacon('%s', 'ping');",
-                                      ping_url.spec().c_str()));
+  AddUnloadEventHandler(
+      child_rfh, "unload",
+      base::StringPrintf("navigator.sendBeacon('%s', 'ping');",
+                         ping_url.spec().c_str()));
   ExtendSubframeUnloadTimeoutForTerminationPing(child_rfh);
 
   // Close the popup and wait for the ping.
@@ -7207,7 +7239,7 @@
   RenderFrameHostImpl* child_rfh = root->child_at(0)->current_frame_host();
 
   // Add an unload handler which never finishes to b.com subframe.
-  AddUnloadHandler(child_rfh, "while(1);");
+  AddUnloadEventHandler(child_rfh, "unload", "while(1);");
 
   // Navigate the main frame to c.com and wait for the subframe process to
   // shut down.  This should happen when the subframe unload timeout happens,
@@ -7250,8 +7282,8 @@
 
   // Add an unload handler in the child frame to send a postMessage to the
   // parent frame.
-  AddUnloadHandler(child->current_frame_host(),
-                   "parent.postMessage('foo', '*')");
+  AddUnloadEventHandler(child->current_frame_host(), "unload",
+                        "parent.postMessage('foo', '*')");
 
   // Navigate the subframe cross-site to c.com and wait for the message.
   GURL c_url(embedded_test_server()->GetURL("c.com", "/title1.html"));
@@ -7265,8 +7297,8 @@
 
   // Now repeat the test with a remote-to-local navigation that brings the
   // subframe back to a.com.
-  AddUnloadHandler(child->current_frame_host(),
-                   "parent.postMessage('bar', '*')");
+  AddUnloadEventHandler(child->current_frame_host(), "unload",
+                        "parent.postMessage('bar', '*')");
   GURL a_url(embedded_test_server()->GetURL("a.com", "/title2.html"));
   EXPECT_TRUE(ExecuteScriptAndExtractString(
       root,
diff --git a/content/browser/media/media_web_contents_observer.cc b/content/browser/media/media_web_contents_observer.cc
index 7522ac159..ab6645c 100644
--- a/content/browser/media/media_web_contents_observer.cc
+++ b/content/browser/media/media_web_contents_observer.cc
@@ -380,7 +380,12 @@
 void MediaWebContentsObserver::OnAudioOutputSinkChanged(
     RenderFrameHost* render_frame_host,
     int delegate_id,
-    std::string hashed_device_id) {}
+    std::string hashed_device_id) {
+  // TODO(1111432): Translate |hashed_device_id| into a raw device id before
+  // passing to controllers manager.
+  session_controllers_manager_.OnAudioOutputSinkChanged(
+      MediaPlayerId(render_frame_host, delegate_id), hashed_device_id);
+}
 
 void MediaWebContentsObserver::OnBufferUnderflow(
     RenderFrameHost* render_frame_host,
diff --git a/content/browser/media/session/media_session_controller.cc b/content/browser/media/session/media_session_controller.cc
index 042b18fd..31a6f84 100644
--- a/content/browser/media/session/media_session_controller.cc
+++ b/content/browser/media/session/media_session_controller.cc
@@ -160,6 +160,9 @@
   media_session_->OnPictureInPictureAvailabilityChanged();
 }
 
+void MediaSessionController::OnAudioOutputSinkChanged(
+    const std::string& raw_device_id) {}
+
 bool MediaSessionController::IsMediaSessionNeeded() const {
   if (!is_playback_in_progress_)
     return false;
diff --git a/content/browser/media/session/media_session_controller.h b/content/browser/media/session/media_session_controller.h
index 424633b..d8a4b9a 100644
--- a/content/browser/media/session/media_session_controller.h
+++ b/content/browser/media/session/media_session_controller.h
@@ -76,6 +76,9 @@
   // Called when the media picture-in-picture availability has changed.
   void OnPictureInPictureAvailabilityChanged(bool available);
 
+  // Called when the audio output device has changed.
+  void OnAudioOutputSinkChanged(const std::string& raw_device_id);
+
  private:
   bool IsMediaSessionNeeded() const;
 
diff --git a/content/browser/media/session/media_session_controllers_manager.cc b/content/browser/media/session/media_session_controllers_manager.cc
index 3fae7f90..695489fb 100644
--- a/content/browser/media/session/media_session_controllers_manager.cc
+++ b/content/browser/media/session/media_session_controllers_manager.cc
@@ -112,6 +112,16 @@
   controller->OnPictureInPictureAvailabilityChanged(available);
 }
 
+void MediaSessionControllersManager::OnAudioOutputSinkChanged(
+    const MediaPlayerId& id,
+    const std::string& raw_device_id) {
+  if (!IsMediaSessionEnabled())
+    return;
+
+  MediaSessionController* const controller = FindOrCreateController(id);
+  controller->OnAudioOutputSinkChanged(raw_device_id);
+}
+
 MediaSessionController* MediaSessionControllersManager::FindOrCreateController(
     const MediaPlayerId& id) {
   auto it = controllers_map_.find(id);
diff --git a/content/browser/media/session/media_session_controllers_manager.h b/content/browser/media/session/media_session_controllers_manager.h
index 672d5039..6c7facd 100644
--- a/content/browser/media/session/media_session_controllers_manager.h
+++ b/content/browser/media/session/media_session_controllers_manager.h
@@ -73,6 +73,10 @@
   void OnPictureInPictureAvailabilityChanged(const MediaPlayerId& id,
                                              bool available);
 
+  // Called when the audio output device for the player |id| has changed.
+  void OnAudioOutputSinkChanged(const MediaPlayerId& id,
+                                const std::string& raw_device_id);
+
  private:
   using ControllersMap =
       std::map<MediaPlayerId, std::unique_ptr<MediaSessionController>>;
@@ -90,4 +94,4 @@
 
 }  // namespace content
 
-#endif // CONTENT_BROWSER_MEDIA_SESSION_MEDIA_SESSION_CONTROLLERS_MANAGER_H_
+#endif  // CONTENT_BROWSER_MEDIA_SESSION_MEDIA_SESSION_CONTROLLERS_MANAGER_H_
diff --git a/content/browser/native_file_system/file_system_chooser.cc b/content/browser/native_file_system/file_system_chooser.cc
index 66a322d..ebae1dc 100644
--- a/content/browser/native_file_system/file_system_chooser.cc
+++ b/content/browser/native_file_system/file_system_chooser.cc
@@ -133,7 +133,8 @@
     std::vector<blink::mojom::ChooseFileSystemEntryAcceptsOptionPtr> accepts,
     bool include_accepts_all)
     : type_(type),
-      file_types_(ConvertAcceptsToFileTypeInfo(accepts, include_accepts_all)) {}
+      file_types_(ConvertAcceptsToFileTypeInfo(accepts, include_accepts_all)),
+      default_file_type_index_(file_types_.extensions.empty() ? 0 : 1) {}
 
 // static
 void FileSystemChooser::CreateAndShow(
@@ -178,7 +179,7 @@
   listener->dialog_->SelectFile(
       dialog_type, /*title=*/base::string16(),
       /*default_path=*/base::FilePath(), &options.file_type_info(),
-      /*file_type_index=*/1,
+      options.default_file_type_index(),
       /*default_extension=*/base::FilePath::StringType(),
       web_contents ? web_contents->GetTopLevelNativeWindow() : nullptr,
       /*params=*/nullptr);
diff --git a/content/browser/native_file_system/file_system_chooser.h b/content/browser/native_file_system/file_system_chooser.h
index 60828b22..6c72656 100644
--- a/content/browser/native_file_system/file_system_chooser.h
+++ b/content/browser/native_file_system/file_system_chooser.h
@@ -42,10 +42,12 @@
     const ui::SelectFileDialog::FileTypeInfo& file_type_info() const {
       return file_types_;
     }
+    int default_file_type_index() const { return default_file_type_index_; }
 
    private:
     blink::mojom::ChooseFileSystemEntryType type_;
     ui::SelectFileDialog::FileTypeInfo file_types_;
+    int default_file_type_index_ = 0;
   };
 
   static void CreateAndShow(WebContents* web_contents,
diff --git a/content/browser/renderer_host/page_lifecycle_state_manager.h b/content/browser/renderer_host/page_lifecycle_state_manager.h
index 2891a87..371095d 100644
--- a/content/browser/renderer_host/page_lifecycle_state_manager.h
+++ b/content/browser/renderer_host/page_lifecycle_state_manager.h
@@ -31,16 +31,16 @@
       bool is_in_back_forward_cache,
       base::Optional<base::TimeTicks> navigation_start);
 
+  // Calculates the per-page lifecycle state based on the per-tab / web contents
+  // lifecycle state saved in this instance.
+  blink::mojom::PageLifecycleStatePtr CalculatePageLifecycleState();
+
  private:
   // Send mojo message to renderer if the effective (page) lifecycle state has
   // changed.
   void SendUpdatesToRendererIfNeeded(
       base::Optional<base::TimeTicks> navigation_start);
 
-  // Calculates the per-page lifecycle state based on the per-tab / web contents
-  // lifecycle state saved in this instance.
-  blink::mojom::PageLifecycleStatePtr CalculatePageLifecycleState();
-
   void OnPageLifecycleChangedAck(
       blink::mojom::PageLifecycleStatePtr acknowledged_state);
   void OnBackForwardCacheTimeout();
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index bd3bb3d..b7fed9a 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -3291,6 +3291,7 @@
     switches::kMojoCoreLibraryPath,
     switches::kDisable2dCanvasImageChromium,
     switches::kDisableYUVImageDecoding,
+    switches::kDisableAXMenuList,
     switches::kDisableAcceleratedVideoDecode,
     switches::kDisableBackgroundTimerThrottling,
     switches::kDisableBestEffortTasks,
diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h
index b911b1a..a66502a 100644
--- a/content/browser/renderer_host/render_view_host_impl.h
+++ b/content/browser/renderer_host/render_view_host_impl.h
@@ -216,6 +216,10 @@
   void SetIsFrozen(bool frozen);
   void OnBackForwardCacheTimeout();
 
+  PageLifecycleStateManager* GetPageLifecycleStateManager() {
+    return page_lifecycle_state_manager_.get();
+  }
+
   // Called during frame eviction to return all SurfaceIds in the frame tree.
   // Marks all views in the frame tree as evicted.
   std::vector<viz::SurfaceId> CollectSurfaceIdsForEviction();
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 5acdd6e..6dd7a7d56 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -723,18 +723,18 @@
     TextInputManager* text_input_manager,
     RenderWidgetHostViewBase* updated_view,
     bool did_change_state) {
-  DCHECK_EQ(text_input_manager_, text_input_manager);
-  // If there are no active widgets, the TextInputState.type should be reported
-  // as none.
-  const ui::mojom::TextInputState& state =
-      GetTextInputManager()->GetActiveWidget()
-          ? *GetTextInputManager()->GetTextInputState()
-          : ui::mojom::TextInputState();
-
   if (!ime_adapter_android_)
     return;
 
-  ime_adapter_android_->UpdateState(state);
+  DCHECK_EQ(text_input_manager_, text_input_manager);
+  if (GetTextInputManager()->GetActiveWidget()) {
+    ime_adapter_android_->UpdateState(
+        *GetTextInputManager()->GetTextInputState());
+  } else {
+    // If there are no active widgets, the TextInputState.type should be
+    // reported as none.
+    ime_adapter_android_->UpdateState(ui::mojom::TextInputState());
+  }
 }
 
 void RenderWidgetHostViewAndroid::OnImeCompositionRangeChanged(
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index 575c4371..879822b 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -1468,14 +1468,44 @@
 
 #if defined(OS_CHROMEOS)
 gfx::Range RenderWidgetHostViewAura::GetAutocorrectRange() const {
-  // TODO(crbug.com/1108170): Implement this function, since we need this
-  // for autocorrect on websites to work.
-  return gfx::Range();
+  if (!text_input_manager_ || !text_input_manager_->GetActiveWidget())
+    return gfx::Range();
+
+  const std::vector<ui::mojom::ImeTextSpanInfoPtr>& ime_text_spans_info =
+      text_input_manager_->GetTextInputState()->ime_text_spans_info;
+
+  unsigned autocorrect_span_found = 0;
+  gfx::Range range;
+  for (const auto& ime_text_span_info : ime_text_spans_info) {
+    if (ime_text_span_info->span.type == ui::ImeTextSpan::Type::kAutocorrect) {
+      range = gfx::Range(ime_text_span_info->span.start_offset,
+                         ime_text_span_info->span.end_offset);
+      autocorrect_span_found++;
+    }
+  }
+  // Assuming there is only one autocorrect span at any point in time.
+  DCHECK_LE(autocorrect_span_found, 1u);
+  return range;
 }
+
 gfx::Rect RenderWidgetHostViewAura::GetAutocorrectCharacterBounds() const {
-  // TODO(crbug.com/1108170): Implement this function, since we need this
-  // for autocorrect on websites to work.
-  return gfx::Rect();
+  if (!text_input_manager_ || !text_input_manager_->GetActiveWidget())
+    return gfx::Rect();
+
+  const std::vector<ui::mojom::ImeTextSpanInfoPtr>& ime_text_spans_info =
+      text_input_manager_->GetTextInputState()->ime_text_spans_info;
+
+  unsigned autocorrect_span_found = 0;
+  gfx::Rect bounds;
+  for (const auto& ime_text_span_info : ime_text_spans_info) {
+    if (ime_text_span_info->span.type == ui::ImeTextSpan::Type::kAutocorrect) {
+      bounds = ConvertRectToScreen(ime_text_span_info->bounds);
+      autocorrect_span_found++;
+    }
+  }
+  // Assuming there is only one autocorrect span at any point in time.
+  DCHECK_LE(autocorrect_span_found, 1u);
+  return bounds;
 }
 
 bool RenderWidgetHostViewAura::SetAutocorrectRange(
diff --git a/content/browser/renderer_host/text_input_manager.cc b/content/browser/renderer_host/text_input_manager.cc
index 12dbfe94b..c25aa48 100644
--- a/content/browser/renderer_host/text_input_manager.cc
+++ b/content/browser/renderer_host/text_input_manager.cc
@@ -48,7 +48,7 @@
 
   // Unregister all the remaining views.
   std::vector<RenderWidgetHostViewBase*> views;
-  for (auto pair : text_input_state_map_)
+  for (auto const& pair : text_input_state_map_)
     views.push_back(pair.first);
 
   for (auto* view : views)
@@ -62,7 +62,11 @@
 }
 
 const ui::mojom::TextInputState* TextInputManager::GetTextInputState() const {
-  return !!active_view_ ? &text_input_state_map_.at(active_view_) : nullptr;
+  if (!active_view_) {
+    return nullptr;
+  }
+
+  return text_input_state_map_.at(active_view_).get();
 }
 
 const TextInputManager::SelectionRegion* TextInputManager::GetSelectionRegion(
@@ -112,10 +116,15 @@
 
   // Since |view| is registered, we already have a previous value for its
   // TextInputState.
-  bool changed = ShouldUpdateTextInputState(text_input_state_map_[view],
+  bool changed = ShouldUpdateTextInputState(*text_input_state_map_[view],
                                             text_input_state);
-
-  text_input_state_map_[view] = text_input_state;
+  text_input_state_map_[view] = text_input_state.Clone();
+  for (const auto& ime_text_span_info :
+       text_input_state_map_[view]->ime_text_spans_info) {
+    const gfx::Rect& bounds = ime_text_span_info->bounds;
+    ime_text_span_info->bounds = gfx::Rect(
+        view->TransformPointToRootCoordSpace(bounds.origin()), bounds.size());
+  }
 
   // If |view| is different from |active_view| and its |TextInputState.type| is
   // not NONE, |active_view_| should change to |view|.
@@ -129,7 +138,7 @@
       // RenderWidget's IPC might arrive sooner and we reach here. To make the
       // IME behavior identical to the non-OOPIF case, we have to manually reset
       // the state for |active_view_|.
-      text_input_state_map_[active_view_].type = ui::TEXT_INPUT_TYPE_NONE;
+      text_input_state_map_[active_view_]->type = ui::TEXT_INPUT_TYPE_NONE;
       RenderWidgetHostViewBase* active_view = active_view_;
       active_view_ = nullptr;
       NotifyObserversAboutInputStateUpdate(active_view, true);
@@ -256,8 +265,7 @@
 
 void TextInputManager::Register(RenderWidgetHostViewBase* view) {
   DCHECK(!IsRegistered(view));
-
-  text_input_state_map_[view] = ui::mojom::TextInputState();
+  text_input_state_map_[view] = ui::mojom::TextInputState::New();
   selection_region_map_[view] = SelectionRegion();
   composition_range_info_map_[view] = CompositionRangeInfo();
   text_selection_map_[view] = TextSelection();
@@ -301,7 +309,7 @@
 ui::TextInputType TextInputManager::GetTextInputTypeForViewForTesting(
     RenderWidgetHostViewBase* view) {
   DCHECK(IsRegistered(view));
-  return text_input_state_map_[view].type;
+  return text_input_state_map_[view]->type;
 }
 
 const gfx::Range* TextInputManager::GetCompositionRangeForTesting() const {
diff --git a/content/browser/renderer_host/text_input_manager.h b/content/browser/renderer_host/text_input_manager.h
index 8afe8207..9c31f17 100644
--- a/content/browser/renderer_host/text_input_manager.h
+++ b/content/browser/renderer_host/text_input_manager.h
@@ -253,7 +253,7 @@
   // The following maps track corresponding IME state for views. For each view,
   // the values in the map are initialized and cleared in Register and
   // Unregister methods, respectively.
-  ViewMap<ui::mojom::TextInputState> text_input_state_map_;
+  ViewMap<ui::mojom::TextInputStatePtr> text_input_state_map_;
   ViewMap<SelectionRegion> selection_region_map_;
   ViewMap<CompositionRangeInfo> composition_range_info_map_;
   ViewMap<TextSelection> text_selection_map_;
diff --git a/content/browser/service_worker/service_worker_internals_ui.cc b/content/browser/service_worker/service_worker_internals_ui.cc
index ecffbf9c..2c6ab157 100644
--- a/content/browser/service_worker/service_worker_internals_ui.cc
+++ b/content/browser/service_worker/service_worker_internals_ui.cc
@@ -13,6 +13,7 @@
 
 #include "base/bind.h"
 #include "base/callback_helpers.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task/post_task.h"
 #include "base/values.h"
@@ -257,6 +258,14 @@
       "serviceworker.onPartitionData", ConvertToRawPtrVector(args));
 }
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class ServiceWorkerInternalsLinkQuery {
+  kDevTools = 0,
+  kOther = 1,
+  kMaxValue = kOther,
+};
+
 }  // namespace
 
 class ServiceWorkerInternalsUI::PartitionObserver
@@ -351,6 +360,14 @@
 
 ServiceWorkerInternalsUI::ServiceWorkerInternalsUI(WebUI* web_ui)
     : WebUIController(web_ui), next_partition_id_(0) {
+  std::string query = web_ui->GetWebContents()->GetURL().query();
+  ServiceWorkerInternalsLinkQuery query_type =
+      ServiceWorkerInternalsLinkQuery::kOther;
+  if (query == "devtools") {
+    query_type = ServiceWorkerInternalsLinkQuery::kDevTools;
+  }
+  base::UmaHistogramEnumeration("ServiceWorker.InternalsPageAccessed",
+                                query_type);
   WebUIDataSource* source =
       WebUIDataSource::Create(kChromeUIServiceWorkerInternalsHost);
   source->OverrideContentSecurityPolicy(
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index eb1a234..1cf8510 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -1893,7 +1893,7 @@
   return visibility_;
 }
 
-bool WebContentsImpl::NeedToFireBeforeUnloadOrUnload() {
+bool WebContentsImpl::NeedToFireBeforeUnloadOrUnloadEvents() {
   if (!notify_disconnection_)
     return false;
 
@@ -1904,19 +1904,34 @@
     return false;
 
   // Check whether any frame in the frame tree needs to run beforeunload or
-  // unload handlers.
+  // unload-time event handlers.
   for (FrameTreeNode* node : frame_tree_.Nodes()) {
     RenderFrameHostImpl* rfh = node->current_frame_host();
 
-    // No need to run beforeunload/unload if the RenderFrame isn't live.
+    // No need to run beforeunload/unload-time events if the RenderFrame isn't
+    // live.
     if (!rfh->IsRenderFrameLive())
       continue;
-
-    if (rfh->GetSuddenTerminationDisablerState(
-            blink::mojom::SuddenTerminationDisablerType::
-                kBeforeUnloadHandler) ||
+    bool should_run_before_unload_handler =
         rfh->GetSuddenTerminationDisablerState(
-            blink::mojom::SuddenTerminationDisablerType::kUnloadHandler)) {
+            blink::mojom::SuddenTerminationDisablerType::kBeforeUnloadHandler);
+    bool should_run_unload_handler = rfh->GetSuddenTerminationDisablerState(
+        blink::mojom::SuddenTerminationDisablerType::kUnloadHandler);
+    bool should_run_page_hide_handler = rfh->GetSuddenTerminationDisablerState(
+        blink::mojom::SuddenTerminationDisablerType::kPageHideHandler);
+    auto* rvh = static_cast<RenderViewHostImpl*>(rfh->GetRenderViewHost());
+    // If the tab is already hidden, we should not run visibilitychange
+    // handlers.
+    bool is_page_visible = rvh->GetPageLifecycleStateManager()
+                               ->CalculatePageLifecycleState()
+                               ->visibility == PageVisibilityState::kVisible;
+
+    bool should_run_visibility_change_handler =
+        is_page_visible && rfh->GetSuddenTerminationDisablerState(
+                               blink::mojom::SuddenTerminationDisablerType::
+                                   kVisibilityChangeHandler);
+    if (should_run_before_unload_handler || should_run_unload_handler ||
+        should_run_page_hide_handler || should_run_visibility_change_handler) {
       return true;
     }
   }
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 8c82eaa..7f381fd 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -395,7 +395,7 @@
   void WasHidden() override;
   void WasOccluded() override;
   Visibility GetVisibility() override;
-  bool NeedToFireBeforeUnloadOrUnload() override;
+  bool NeedToFireBeforeUnloadOrUnloadEvents() override;
   void DispatchBeforeUnload(bool auto_cancel) override;
   void AttachInnerWebContents(std::unique_ptr<WebContents> inner_web_contents,
                               RenderFrameHost* render_frame_host,
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc
index 4ddeec0d..48ce757d 100644
--- a/content/browser/web_contents/web_contents_impl_browsertest.cc
+++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -1436,28 +1436,40 @@
 void NavigateToDataURLAndCheckForTerminationDisabler(
     Shell* shell,
     const std::string& html,
-    bool expect_onunload,
-    bool expect_onbeforeunload) {
+    bool expect_unload,
+    bool expect_beforeunload,
+    bool expect_pagehide,
+    bool expect_visibilitychange) {
   EXPECT_TRUE(NavigateToURL(shell, GURL("data:text/html," + html)));
   RenderFrameHostImpl* rfh =
       static_cast<RenderFrameHostImpl*>(shell->web_contents()->GetMainFrame());
-  EXPECT_EQ(expect_onunload || expect_onbeforeunload,
-            shell->web_contents()->NeedToFireBeforeUnloadOrUnload());
-  EXPECT_EQ(expect_onunload,
+  EXPECT_EQ(expect_unload || expect_beforeunload || expect_pagehide ||
+                expect_visibilitychange,
+            shell->web_contents()->NeedToFireBeforeUnloadOrUnloadEvents());
+  EXPECT_EQ(expect_unload,
             rfh->GetSuddenTerminationDisablerState(
                 blink::mojom::SuddenTerminationDisablerType::kUnloadHandler));
   EXPECT_EQ(
-      expect_onbeforeunload,
+      expect_beforeunload,
       rfh->GetSuddenTerminationDisablerState(
           blink::mojom::SuddenTerminationDisablerType::kBeforeUnloadHandler));
+  EXPECT_EQ(expect_pagehide,
+            rfh->GetSuddenTerminationDisablerState(
+                blink::mojom::SuddenTerminationDisablerType::kPageHideHandler));
+  EXPECT_EQ(expect_visibilitychange,
+            rfh->GetSuddenTerminationDisablerState(
+                blink::mojom::SuddenTerminationDisablerType::
+                    kVisibilityChangeHandler));
 }
 }  // namespace
 
 IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
                        SuddenTerminationDisablerNone) {
   const std::string NO_HANDLERS_HTML = "<html><body>foo</body></html>";
-  NavigateToDataURLAndCheckForTerminationDisabler(shell(), NO_HANDLERS_HTML,
-                                                  false, false);
+  NavigateToDataURLAndCheckForTerminationDisabler(
+      shell(), NO_HANDLERS_HTML, false /* expect_unload */,
+      false /* expect_beforeunload */, false /* expect_pagehide */,
+      false /* expect_visibilitychange */);
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -1472,8 +1484,10 @@
       ->GetMainFrame()
       ->GetProcess()
       ->SetSuddenTerminationAllowed(false);
-  NavigateToDataURLAndCheckForTerminationDisabler(shell(), NO_HANDLERS_HTML,
-                                                  false, false);
+  NavigateToDataURLAndCheckForTerminationDisabler(
+      shell(), NO_HANDLERS_HTML, false /* expect_unload */,
+      false /* expect_beforeunload */, false /* expect_pagehide */,
+      false /* expect_visibilitychange */);
 }
 
 IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
@@ -1481,8 +1495,32 @@
   const std::string UNLOAD_HTML =
       "<html><body><script>window.onunload=function(e) {}</script>"
       "</body></html>";
-  NavigateToDataURLAndCheckForTerminationDisabler(shell(), UNLOAD_HTML, true,
-                                                  false);
+  NavigateToDataURLAndCheckForTerminationDisabler(
+      shell(), UNLOAD_HTML, true /* expect_unload */,
+      false /* expect_beforeunload */, false /* expect_pagehide */,
+      false /* expect_visibilitychange */);
+}
+
+IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
+                       SuddenTerminationDisablerOnPagehide) {
+  const std::string PAGEHIDE_HTML =
+      "<html><body><script>window.onpagehide=function(e) {}</script>"
+      "</body></html>";
+  NavigateToDataURLAndCheckForTerminationDisabler(
+      shell(), PAGEHIDE_HTML, false /* expect_unload */,
+      false /* expect_beforeunload */, true /* expect_pagehide */,
+      false /* expect_visibilitychange */);
+}
+
+IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
+                       SuddenTerminationDisablerOnVisibilityChange) {
+  const std::string VISIBILITYCHANGE_HTML =
+      "<html><body><script>document.onvisibilitychange=function(e) {}</script>"
+      "</body></html>";
+  NavigateToDataURLAndCheckForTerminationDisabler(
+      shell(), VISIBILITYCHANGE_HTML, false /* expect_unload */,
+      false /* expect_beforeunload */, false /* expect_pagehide */,
+      true /* expect_visibilitychange */);
 }
 
 IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
@@ -1490,18 +1528,88 @@
   const std::string BEFORE_UNLOAD_HTML =
       "<html><body><script>window.onbeforeunload=function(e) {}</script>"
       "</body></html>";
-  NavigateToDataURLAndCheckForTerminationDisabler(shell(), BEFORE_UNLOAD_HTML,
-                                                  false, true);
+  NavigateToDataURLAndCheckForTerminationDisabler(
+      shell(), BEFORE_UNLOAD_HTML, false /* expect_unload */,
+      true /* expect_beforeunload */, false /* expect_pagehide */,
+      false /* expect_visibilitychange */);
 }
 
 IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
-                       SuddenTerminationDisablerOnUnloadAndBeforeUnload) {
-  const std::string UNLOAD_AND_BEFORE_UNLOAD_HTML =
+                       SuddenTerminationDisablerAllThenNavigate) {
+  const std::string ALL_HANDLERS_HTML =
       "<html><body><script>window.onunload=function(e) {};"
+      "window.onpagehide=function(e) {};"
+      "document.onvisibilitychange=function(e) {}; "
       "window.onbeforeunload=function(e) {}</script>"
       "</body></html>";
   NavigateToDataURLAndCheckForTerminationDisabler(
-      shell(), UNLOAD_AND_BEFORE_UNLOAD_HTML, true, true);
+      shell(), ALL_HANDLERS_HTML, true /* expect_unload */,
+      true /* expect_beforeunload */, true /* expect_pagehide */,
+      true /* expect_visibilitychange*/);
+  // After navigation to empty page, the values should be reset to false.
+  NavigateToDataURLAndCheckForTerminationDisabler(
+      shell(), "", false /* expect_unload */, false /* expect_beforeunload */,
+      false /* expect_pagehide */, false /* expect_visibilitychange */);
+}
+
+IN_PROC_BROWSER_TEST_F(WebContentsImplBrowserTest,
+                       SuddenTerminationDisablerAllThenRemove) {
+  const std::string ALL_HANDLERS_ADDED_THEN_REMOVED_HTML =
+      "<html><body><script>"
+      "function handleEverything(e) {}"
+      "window.addEventListener('unload', handleEverything);"
+      "window.addEventListener('beforeunload', handleEverything);"
+      "window.addEventListener('pagehide', handleEverything);"
+      "document.addEventListener('visibilitychange', handleEverything);"
+      "window.removeEventListener('unload', handleEverything);"
+      "window.removeEventListener('beforeunload', handleEverything);"
+      "window.removeEventListener('pagehide', handleEverything);"
+      "document.removeEventListener('visibilitychange', handleEverything);"
+      "</script></body></html>";
+  // After the handlers were added, they got deleted, so we should treat them as
+  // non-existent in the end.
+  NavigateToDataURLAndCheckForTerminationDisabler(
+      shell(), ALL_HANDLERS_ADDED_THEN_REMOVED_HTML, false /* expect_unload */,
+      false /* expect_beforeunload */, false /* expect_pagehide */,
+      false /* expect_visibilitychange */);
+}
+
+IN_PROC_BROWSER_TEST_F(
+    WebContentsImplBrowserTest,
+    SuddenTerminationDisablerWhenTabIsHiddenOnVisibilityChange) {
+  auto* web_contents = static_cast<WebContentsImpl*>(shell()->web_contents());
+  const std::string VISIBILITYCHANGE_HTML =
+      "<html><body><script>document.onvisibilitychange=function(e) {}</script>"
+      "</body></html>";
+  NavigateToDataURLAndCheckForTerminationDisabler(
+      shell(), VISIBILITYCHANGE_HTML, false /* expect_unload */,
+      false /* expect_beforeunload */, false /* expect_pagehide */,
+      true /* expect_visibilitychange */);
+  web_contents->UpdateWebContentsVisibility(Visibility::VISIBLE);
+  EXPECT_TRUE(shell()->web_contents()->NeedToFireBeforeUnloadOrUnloadEvents());
+
+  // The visibilitychange handler won't block sudden termination if the tab is
+  // already hidden.
+  web_contents->UpdateWebContentsVisibility(Visibility::HIDDEN);
+  EXPECT_TRUE(
+      static_cast<WebContentsImpl*>(shell()->web_contents())->IsHidden());
+  EXPECT_FALSE(shell()->web_contents()->NeedToFireBeforeUnloadOrUnloadEvents());
+
+  // The visibilitychange handler will block sudden termination if the tab
+  // becomes visible again.
+  web_contents->UpdateWebContentsVisibility(Visibility::VISIBLE);
+  EXPECT_TRUE(shell()->web_contents()->NeedToFireBeforeUnloadOrUnloadEvents());
+
+  // The visibilitychange handler won't block sudden termination if the tab is
+  // occluded (because we treat it as hidden), unless when occlusion is
+  // disabled, in which case we treat it the same as being visible.
+  const bool occlusion_is_disabled =
+      !base::FeatureList::IsEnabled(features::kWebContentsOcclusion) ||
+      base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kDisableBackgroundingOccludedWindowsForTesting);
+  web_contents->UpdateWebContentsVisibility(Visibility::OCCLUDED);
+  EXPECT_EQ(occlusion_is_disabled,
+            shell()->web_contents()->NeedToFireBeforeUnloadOrUnloadEvents());
 }
 
 class TestWCDelegateForDialogsAndFullscreen : public JavaScriptDialogManager,
diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h
index 0e2e69f..f1c25ed 100644
--- a/content/public/browser/web_contents.h
+++ b/content/public/browser/web_contents.h
@@ -579,12 +579,12 @@
 
   // This function checks *all* frames in this WebContents (not just the main
   // frame) and returns true if at least one frame has either a beforeunload or
-  // an unload handler.
+  // an unload/pagehide/visibilitychange handler.
   //
   // The value of this may change over time. For example, if true and the
   // beforeunload listener is executed and allows the user to exit, then this
   // returns false.
-  virtual bool NeedToFireBeforeUnloadOrUnload() = 0;
+  virtual bool NeedToFireBeforeUnloadOrUnloadEvents() = 0;
 
   // Runs the beforeunload handler for the main frame and all its subframes.
   // See also ClosePage in RenderViewHostImpl, which runs the unload handler.
diff --git a/content/public/test/mock_navigation_handle.h b/content/public/test/mock_navigation_handle.h
index eec48d6..e7485dd 100644
--- a/content/public/test/mock_navigation_handle.h
+++ b/content/public/test/mock_navigation_handle.h
@@ -28,6 +28,7 @@
   // NavigationHandle implementation:
   int64_t GetNavigationId() override { return navigation_id_; }
   const GURL& GetURL() override { return url_; }
+  const GURL& GetPreviousURL() override { return previous_url_; }
   SiteInstance* GetStartingSiteInstance() override {
     return starting_site_instance_;
   }
@@ -74,7 +75,6 @@
   MOCK_METHOD0(HasSubframeNavigationEntryCommitted, bool());
   MOCK_METHOD0(DidReplaceEntry, bool());
   MOCK_METHOD0(ShouldUpdateHistory, bool());
-  MOCK_METHOD0(GetPreviousURL, const GURL&());
   MOCK_METHOD0(GetSocketAddress, net::IPEndPoint());
   const net::HttpRequestHeaders& GetRequestHeaders() override {
     return request_headers_;
@@ -133,6 +133,9 @@
   MOCK_METHOD0(GetIsOverridingUserAgent, bool());
 
   void set_url(const GURL& url) { url_ = url; }
+  void set_previous_url(const GURL& previous_url) {
+    previous_url_ = previous_url;
+  }
   void set_starting_site_instance(SiteInstance* site_instance) {
     starting_site_instance_ = site_instance;
   }
@@ -188,6 +191,7 @@
  private:
   int64_t navigation_id_;
   GURL url_;
+  GURL previous_url_;
   SiteInstance* starting_site_instance_ = nullptr;
   WebContents* web_contents_ = nullptr;
   GURL base_url_for_data_url_;
diff --git a/content/public/test/text_input_test_utils.cc b/content/public/test/text_input_test_utils.cc
index be71b0c..1dd4c2a 100644
--- a/content/public/test/text_input_test_utils.cc
+++ b/content/public/test/text_input_test_utils.cc
@@ -462,11 +462,12 @@
 
 void TextInputStateSender::SetFromCurrentState() {
   if (view_) {
-    *text_input_state_ =
-        *RenderWidgetHostImpl::From(view_->GetRenderWidgetHost())
-             ->delegate()
-             ->GetTextInputManager()
-             ->GetTextInputState();
+    const ui::mojom::TextInputState* state =
+        RenderWidgetHostImpl::From(view_->GetRenderWidgetHost())
+            ->delegate()
+            ->GetTextInputManager()
+            ->GetTextInputState();
+    text_input_state_ = state->Clone();
   }
 }
 
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc
index cd0c0bd..5ea591e 100644
--- a/content/renderer/accessibility/render_accessibility_impl.cc
+++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -227,6 +227,12 @@
   else
     event_schedule_mode_ = EventScheduleMode::kProcessEventsImmediately;
 
+  // Optionally disable AXMenuList, which makes the internal pop-up menu
+  // UI for a select element directly accessible.
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          ::switches::kDisableAXMenuList))
+    settings->SetUseAXMenuList(false);
+
   const WebDocument& document = GetMainDocument();
   if (!document.IsNull()) {
     ax_context_ = std::make_unique<WebAXContext>(document);
diff --git a/content/test/data/accessibility/aria/aria-atomic-expected-mac.txt b/content/test/data/accessibility/aria/aria-atomic-expected-mac.txt
index 3d5a0be..f6779b8 100644
--- a/content/test/data/accessibility/aria/aria-atomic-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-atomic-expected-mac.txt
@@ -1,9 +1,9 @@
 AXWebArea
-++AXGroup AXARIAAtomic=0
+++AXGroup AXARIAAtomic=0 AXDescription='This test is for aria-atomic="false"'
 ++++AXStaticText AXARIAAtomic=0 AXValue='This test is for aria-atomic="false"'
-++AXGroup AXARIAAtomic=1
+++AXGroup AXARIAAtomic=1 AXDescription='This test is for aria-atomic="true"'
 ++++AXStaticText AXARIAAtomic=0 AXValue='This test is for aria-atomic="true"'
-++AXGroup AXARIAAtomic=1
+++AXGroup AXARIAAtomic=1 AXDescription='This test is for alert.'
 ++++AXStaticText AXARIAAtomic=0 AXValue='This test is for alert.'
-++AXGroup AXARIAAtomic=1
+++AXGroup AXARIAAtomic=1 AXDescription='This test is for status.'
 ++++AXStaticText AXARIAAtomic=0 AXValue='This test is for status.'
diff --git a/content/test/data/accessibility/aria/aria-feed-expected-mac.txt b/content/test/data/accessibility/aria/aria-feed-expected-mac.txt
index 5d46b30e..8c4fa38 100644
--- a/content/test/data/accessibility/aria/aria-feed-expected-mac.txt
+++ b/content/test/data/accessibility/aria/aria-feed-expected-mac.txt
@@ -1,5 +1,5 @@
 AXWebArea AXRoleDescription='HTML content'
-++AXGroup AXRoleDescription='article'
+++AXGroup AXDescription='First' AXRoleDescription='article'
 ++++AXStaticText AXRoleDescription='text' AXValue='First'
-++AXGroup AXRoleDescription='article'
+++AXGroup AXDescription='Second' AXRoleDescription='article'
 ++++AXStaticText AXRoleDescription='text' AXValue='Second'
diff --git a/content/test/data/accessibility/html/input-date-with-popup-open-expected-mac.txt b/content/test/data/accessibility/html/input-date-with-popup-open-expected-mac.txt
index 2798338..964a37a5 100644
--- a/content/test/data/accessibility/html/input-date-with-popup-open-expected-mac.txt
+++ b/content/test/data/accessibility/html/input-date-with-popup-open-expected-mac.txt
@@ -24,7 +24,7 @@
 ++++++++++++++++AXGroup AXRoleDescription='group'
 ++++++++++++++AXButton AXDescription='Show next month' AXRoleDescription='button'
 ++++++++++++++++AXGroup AXRoleDescription='group'
-++++++++++++++AXTable AXRoleDescription='table'
+++++++++++++++AXTable AXDescription='S M T W T F S Sunday, August 31, 2008 Monday, September 1, 2008 Tuesday, September 2, 2008 Wednesday, September 3, 2008 Thursday, September 4, 2008 Friday, September 5, 2008 Saturday, September 6, 2008 Sunday, September 7, 2008 Monday, September 8, 2008 Tuesday, September 9, 2008 Wednesday, September 10, 2008 Thursday, September 11, 2008 Friday, September 12, 2008 Saturday, September 13, 2008 Sunday, September 14, 2008 Monday, September 15, 2008 Tuesday, September 16, 2008 Wednesday, September 17, 2008 Thursday, September 18, 2008 Friday, September 19, 2008 Saturday, September 20, 2008 Sunday, September 21, 2008 Monday, September 22, 2008 Tuesday, September 23, 2008 Wednesday, September 24, 2008 Thursday, September 25, 2008 Friday, September 26, 2008 Saturday, September 27, 2008 Sunday, September 28, 2008 Monday, September 29, 2008 Tuesday, September 30, 2008 Wednesday, October 1, 2008 Thursday, October 2, 2008 Friday, October 3, 2008 Saturday, October 4, 2008 Sunday, October 5, 2008 Monday, October 6, 2008 Tuesday, October 7, 2008 Wednesday, October 8, 2008 Thursday, October 9, 2008 Friday, October 10, 2008 Saturday, October 11, 2008 Today' AXRoleDescription='table'
 ++++++++++++++++AXGroup AXRoleDescription='group'
 ++++++++++++++++++AXGroup AXRoleDescription='group'
 ++++++++++++++++++++AXStaticText AXRoleDescription='text' AXValue='S'
diff --git a/content/test/data/accessibility/html/table-focusable-sections-expected-mac.txt b/content/test/data/accessibility/html/table-focusable-sections-expected-mac.txt
index f676fa5..2b740db 100644
--- a/content/test/data/accessibility/html/table-focusable-sections-expected-mac.txt
+++ b/content/test/data/accessibility/html/table-focusable-sections-expected-mac.txt
@@ -1,12 +1,12 @@
 AXWebArea AXTitle='Table example - focusable thead, tbody, tfoot'
 ++AXTable
-++++AXGroup
+++++AXGroup AXDescription='Sum Subtraction'
 ++++++AXRow AXIndex=0
 ++++++++AXCell AXColumnIndexRange={len: 1, loc: 0} AXRowIndexRange={len: 1, loc: 0}
 ++++++++++AXStaticText AXValue='Sum'
 ++++++++AXCell AXColumnIndexRange={len: 1, loc: 1} AXRowIndexRange={len: 1, loc: 0}
 ++++++++++AXStaticText AXValue='Subtraction'
-++++AXGroup
+++++AXGroup AXDescription='10 7 2 4'
 ++++++AXRow AXIndex=1
 ++++++++AXCell AXColumnIndexRange={len: 1, loc: 0} AXRowIndexRange={len: 1, loc: 1}
 ++++++++++AXStaticText AXValue='10'
@@ -17,7 +17,7 @@
 ++++++++++AXStaticText AXValue='2'
 ++++++++AXCell AXColumnIndexRange={len: 1, loc: 1} AXRowIndexRange={len: 1, loc: 2}
 ++++++++++AXStaticText AXValue='4'
-++++AXGroup
+++++AXGroup AXDescription='12 3'
 ++++++AXRow AXIndex=3
 ++++++++AXCell AXColumnIndexRange={len: 1, loc: 0} AXRowIndexRange={len: 1, loc: 3}
 ++++++++++AXStaticText AXValue='12'
diff --git a/extensions/browser/extension_prefs.cc b/extensions/browser/extension_prefs.cc
index 87d104f8..9e5ff69 100644
--- a/extensions/browser/extension_prefs.cc
+++ b/extensions/browser/extension_prefs.cc
@@ -2234,6 +2234,7 @@
   registry->RegisterIntegerPref(pref_names::kToolbarSize, -1);
   registry->RegisterBooleanPref(pref_names::kPinnedExtensionsMigrationComplete,
                                 false);
+  registry->RegisterListPref(pref_names::kDeletedComponentExtensions);
   registry->RegisterDictionaryPref(kExtensionsBlocklistUpdate);
   registry->RegisterListPref(pref_names::kInstallAllowList);
   registry->RegisterListPref(pref_names::kInstallDenyList);
@@ -2651,6 +2652,34 @@
   }
 }
 
+bool ExtensionPrefs::ShouldInstallObsoleteComponentExtension(
+    const std::string& extension_id) {
+  ListPrefUpdate update(prefs_, pref_names::kDeletedComponentExtensions);
+  base::Value* current_ids = update.Get();
+  base::Value::ListView list = current_ids->GetList();
+  auto existing_entry = std::find_if(
+      list.begin(), list.end(), [&extension_id](const base::Value& value) {
+        return value.is_string() && value.GetString() == extension_id;
+      });
+  return (existing_entry == list.end());
+}
+
+void ExtensionPrefs::MarkObsoleteComponentExtensionAsRemoved(
+    const std::string& extension_id,
+    const Manifest::Location& location) {
+  ListPrefUpdate update(prefs_, pref_names::kDeletedComponentExtensions);
+  base::Value* current_ids = update.Get();
+  base::Value::ListView list = current_ids->GetList();
+  auto existing_entry = std::find_if(
+      list.begin(), list.end(), [&extension_id](const base::Value& value) {
+        return value.is_string() && value.GetString() == extension_id;
+      });
+  // This should only be called once per extension.
+  DCHECK(existing_entry == list.end());
+  current_ids->Append(extension_id);
+  OnExtensionUninstalled(extension_id, location, false);
+}
+
 void ExtensionPrefs::ClearExternalUninstallBit(const ExtensionId& id) {
   ListPrefUpdate update(prefs_, kExternalUninstalls);
   base::Value* current_ids = update.Get();
diff --git a/extensions/browser/extension_prefs.h b/extensions/browser/extension_prefs.h
index 9a244d5..f8dd2011 100644
--- a/extensions/browser/extension_prefs.h
+++ b/extensions/browser/extension_prefs.h
@@ -703,6 +703,18 @@
   // TODO(devlin): Remove this once clients are migrated over, around M84.
   void MigrateToNewExternalUninstallPref();
 
+  // Returns true if the given component extension should be installed, even
+  // though it has been obsoleted. Installing it allows us to ensure it is
+  // cleaned/deleted up properly. After that cleanup is done, this will return
+  // false.
+  bool ShouldInstallObsoleteComponentExtension(const std::string& extension_id);
+
+  // Mark the given component extension as deleted. It should not be installed /
+  // loaded again after this.
+  void MarkObsoleteComponentExtensionAsRemoved(
+      const std::string& extension_id,
+      const Manifest::Location& location);
+
   // When called before the ExtensionService is created, alerts that are
   // normally suppressed in first run will still trigger.
   static void SetRunAlertsInFirstRunForTest();
diff --git a/extensions/browser/pref_names.cc b/extensions/browser/pref_names.cc
index ec039b6..30e8453a 100644
--- a/extensions/browser/pref_names.cc
+++ b/extensions/browser/pref_names.cc
@@ -51,6 +51,8 @@
 const char kToolbarSize[] = "extensions.toolbarsize";
 const char kPinnedExtensionsMigrationComplete[] =
     "extensions.pinned_extension_migration";
+const char kDeletedComponentExtensions[] =
+    "extensions.deleted_component_extensions";
 
 const char kPrefPreferences[] = "preferences";
 const char kPrefIncognitoPreferences[] = "incognito_preferences";
diff --git a/extensions/browser/pref_names.h b/extensions/browser/pref_names.h
index faaea794..7356be8b 100644
--- a/extensions/browser/pref_names.h
+++ b/extensions/browser/pref_names.h
@@ -114,6 +114,10 @@
 // to the ExtensionsToolbarContainer.
 extern const char kPinnedExtensionsMigrationComplete[];
 
+// A preference for a list of Component extensions that have been
+// uninstalled/removed and should not be reloaded.
+extern const char kDeletedComponentExtensions[];
+
 // Properties in kExtensions dictionaries --------------------------------------
 
 // Extension-controlled preferences.
diff --git a/infra/config/dev.star b/infra/config/dev.star
index 87d8716..81993f7 100755
--- a/infra/config/dev.star
+++ b/infra/config/dev.star
@@ -6,27 +6,27 @@
 # See https://chromium.googlesource.com/infra/luci/luci-go/+/HEAD/lucicfg/doc/README.md
 # for information on starlark/lucicfg
 
-load('//project.star', 'master_only_exec')
+load("//project.star", "master_only_exec")
 
 lucicfg.check_version(
-    min = '1.18.4',
-    message = 'Update depot_tools',
+    min = "1.18.4",
+    message = "Update depot_tools",
 )
 
 # Enable LUCI Realms support.
-lucicfg.enable_experiment('crbug.com/1085650')
+lucicfg.enable_experiment("crbug.com/1085650")
 
 # Tell lucicfg what files it is allowed to touch
 lucicfg.config(
-    config_dir = 'generated',
+    config_dir = "generated",
     tracked_files = [
-        'cr-buildbucket-dev.cfg',
-        'luci-logdog-dev.cfg',
-        'luci-milo-dev.cfg',
-        'luci-scheduler-dev.cfg',
-        'realms-dev.cfg',
+        "cr-buildbucket-dev.cfg",
+        "luci-logdog-dev.cfg",
+        "luci-milo-dev.cfg",
+        "luci-scheduler-dev.cfg",
+        "realms-dev.cfg",
     ],
     fail_on_warnings = True,
 )
 
-master_only_exec('//dev/dev.star')
+master_only_exec("//dev/dev.star")
diff --git a/infra/config/dev/dev.star b/infra/config/dev/dev.star
index 439be9c..7d8fbcb 100755
--- a/infra/config/dev/dev.star
+++ b/infra/config/dev/dev.star
@@ -7,13 +7,13 @@
 # for information on starlark/lucicfg
 
 luci.project(
-    name = 'chromium',
+    name = "chromium",
     dev = True,
-    buildbucket = 'cr-buildbucket-dev.appspot.com',
-    logdog = 'luci-logdog-dev.appspot.com',
-    milo = 'luci-milo-dev.appspot.com',
-    scheduler = 'luci-scheduler-dev.appspot.com',
-    swarming = 'chromium-swarm-dev.appspot.com',
+    buildbucket = "cr-buildbucket-dev.appspot.com",
+    logdog = "luci-logdog-dev.appspot.com",
+    milo = "luci-milo-dev.appspot.com",
+    scheduler = "luci-scheduler-dev.appspot.com",
+    swarming = "chromium-swarm-dev.appspot.com",
     acls = [
         acl.entry(
             roles = [
@@ -21,37 +21,37 @@
                 acl.PROJECT_CONFIGS_READER,
                 acl.SCHEDULER_READER,
             ],
-            groups = 'all',
+            groups = "all",
         ),
         acl.entry(
             roles = acl.LOGDOG_WRITER,
-            groups = 'luci-logdog-chromium-dev-writers',
+            groups = "luci-logdog-chromium-dev-writers",
         ),
         acl.entry(
             roles = acl.SCHEDULER_OWNER,
-            groups = 'project-chromium-admins',
+            groups = "project-chromium-admins",
         ),
     ],
 )
 
 luci.logdog(
-    gs_bucket = 'chromium-luci-logdog',
+    gs_bucket = "chromium-luci-logdog",
 )
 
 luci.milo(
-    logo = 'https://storage.googleapis.com/chrome-infra-public/logo/chromium.svg',
+    logo = "https://storage.googleapis.com/chrome-infra-public/logo/chromium.svg",
 )
 
 # An all-purpose public realm.
 luci.realm(
-    name = 'public',
+    name = "public",
     bindings = [
         luci.binding(
-            roles = 'role/buildbucket.reader',
-            groups = 'all',
+            roles = "role/buildbucket.reader",
+            groups = "all",
         ),
         # Other roles are inherited from @root which grants them to group:all.
     ],
 )
 
-exec('//dev/subprojects/chromium/subproject.star')
+exec("//dev/subprojects/chromium/subproject.star")
diff --git a/infra/config/dev/subprojects/chromium/ci.star b/infra/config/dev/subprojects/chromium/ci.star
index fc34986..b74f6e5 100644
--- a/infra/config/dev/subprojects/chromium/ci.star
+++ b/infra/config/dev/subprojects/chromium/ci.star
@@ -2,98 +2,97 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'builder', 'cpu', 'defaults', 'os')
+load("//lib/builders.star", "builder", "cpu", "defaults", "os")
 
 luci.bucket(
-    name = 'ci',
+    name = "ci",
     acls = [
         acl.entry(
             roles = acl.BUILDBUCKET_READER,
-            groups = 'all',
+            groups = "all",
         ),
         acl.entry(
             roles = acl.BUILDBUCKET_TRIGGERER,
             users = [
-                'luci-scheduler-dev@appspot.gserviceaccount.com',
-                'chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com',
+                "luci-scheduler-dev@appspot.gserviceaccount.com",
+                "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com",
             ],
         ),
         acl.entry(
             roles = acl.BUILDBUCKET_OWNER,
-            groups = 'google/luci-task-force@google.com',
+            groups = "google/luci-task-force@google.com",
         ),
     ],
 )
 
 luci.gitiles_poller(
-    name = 'master-gitiles-trigger',
-    bucket = 'ci',
-    repo = 'https://chromium.googlesource.com/chromium/src',
+    name = "master-gitiles-trigger",
+    bucket = "ci",
+    repo = "https://chromium.googlesource.com/chromium/src",
 )
 
-
 luci.recipe.defaults.cipd_package.set(
-    'infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build')
+    "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",
+)
 
-
-defaults.bucket.set('ci')
+defaults.bucket.set("ci")
 defaults.build_numbers.set(True)
 defaults.builderless.set(None)
 defaults.cpu.set(cpu.X86_64)
-defaults.executable.set(luci.recipe(name = 'swarming/staging'))
+defaults.executable.set(luci.recipe(name = "swarming/staging"))
 defaults.execution_timeout.set(3 * time.hour)
-defaults.mastername.set('chromium.dev')
+defaults.mastername.set("chromium.dev")
 defaults.os.set(os.LINUX_DEFAULT)
 defaults.service_account.set(
-    'chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com')
-defaults.swarming_tags.set(['vpython:native-python-wrapper'])
-
+    "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com",
+)
+defaults.swarming_tags.set(["vpython:native-python-wrapper"])
 
 def ci_builder(*, name, **kwargs):
-  return builder(
-      name = name,
-      triggered_by = ['master-gitiles-trigger'],
-      resultdb_bigquery_exports = [resultdb.export_test_results(
-          bq_table = 'luci-resultdb-dev.chromium.ci_test_results',
-      )],
-      **kwargs
-  )
+    return builder(
+        name = name,
+        triggered_by = ["master-gitiles-trigger"],
+        resultdb_bigquery_exports = [resultdb.export_test_results(
+            bq_table = "luci-resultdb-dev.chromium.ci_test_results",
+        )],
+        **kwargs
+    )
 
 ci_builder(
-    name = 'android-lollipop-arm-rel-swarming',
+    name = "android-lollipop-arm-rel-swarming",
 )
 
 ci_builder(
-    name = 'android-marshmallow-arm64-rel-swarming',
+    name = "android-marshmallow-arm64-rel-swarming",
 )
 
 ci_builder(
-    name = 'linux-rel-swarming',
+    name = "linux-rel-swarming",
 )
 
 ci_builder(
-    name = 'mac-rel-swarming',
+    name = "mac-rel-swarming",
     os = os.MAC_DEFAULT,
 )
 
 ci_builder(
-    name = 'win-rel-swarming',
+    name = "win-rel-swarming",
     os = os.WINDOWS_DEFAULT,
 )
 
 ## builders using swarming staging instance
 
 def ci_builder_staging(**kwargs):
-  return ci_builder(
-      swarming_host = 'chromium-swarm-staging.appspot.com',
-      **kwargs
-  )
+    return ci_builder(
+        swarming_host = "chromium-swarm-staging.appspot.com",
+        **kwargs
+    )
 
 ci_builder_staging(
-    name = 'linux-rel-swarming-staging',
+    name = "linux-rel-swarming-staging",
 )
 
 ci_builder_staging(
-    name = 'win-rel-swarming-staging',
+    name = "win-rel-swarming-staging",
     os = os.WINDOWS_DEFAULT,
 )
diff --git a/infra/config/dev/subprojects/chromium/consoles/chromium.swarm.star b/infra/config/dev/subprojects/chromium/consoles/chromium.swarm.star
index 91aa7ed9..0885749 100644
--- a/infra/config/dev/subprojects/chromium/consoles/chromium.swarm.star
+++ b/infra/config/dev/subprojects/chromium/consoles/chromium.swarm.star
@@ -3,24 +3,24 @@
 # found in the LICENSE file.
 
 luci.console_view(
-    name = 'chromium.dev',
-    header = '//dev/chromium-header.textpb',
-    repo = 'https://chromium.googlesource.com/chromium/src',
+    name = "chromium.dev",
+    header = "//dev/chromium-header.textpb",
+    repo = "https://chromium.googlesource.com/chromium/src",
     entries = [
-        luci.console_view_entry(builder = 'ci/android-lollipop-arm-rel-swarming'),
-        luci.console_view_entry(builder = 'ci/android-marshmallow-arm64-rel-swarming'),
-        luci.console_view_entry(builder = 'ci/linux-rel-swarming'),
-        luci.console_view_entry(builder = 'ci/mac-rel-swarming'),
-        luci.console_view_entry(builder = 'ci/win-rel-swarming'),
-   ],
+        luci.console_view_entry(builder = "ci/android-lollipop-arm-rel-swarming"),
+        luci.console_view_entry(builder = "ci/android-marshmallow-arm64-rel-swarming"),
+        luci.console_view_entry(builder = "ci/linux-rel-swarming"),
+        luci.console_view_entry(builder = "ci/mac-rel-swarming"),
+        luci.console_view_entry(builder = "ci/win-rel-swarming"),
+    ],
 )
 
 luci.console_view(
-    name = 'chromium.staging',
-    header = '//dev/chromium-header.textpb',
-    repo = 'https://chromium.googlesource.com/chromium/src',
+    name = "chromium.staging",
+    header = "//dev/chromium-header.textpb",
+    repo = "https://chromium.googlesource.com/chromium/src",
     entries = [
-        luci.console_view_entry(builder = 'ci/linux-rel-swarming-staging'),
-        luci.console_view_entry(builder = 'ci/win-rel-swarming-staging'),
-   ],
+        luci.console_view_entry(builder = "ci/linux-rel-swarming-staging"),
+        luci.console_view_entry(builder = "ci/win-rel-swarming-staging"),
+    ],
 )
diff --git a/infra/config/dev/subprojects/chromium/subproject.star b/infra/config/dev/subprojects/chromium/subproject.star
index ac749ce..0000421 100644
--- a/infra/config/dev/subprojects/chromium/subproject.star
+++ b/infra/config/dev/subprojects/chromium/subproject.star
@@ -2,5 +2,5 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-exec('./ci.star')
-exec('./consoles/chromium.swarm.star')
+exec("./ci.star")
+exec("./consoles/chromium.swarm.star")
diff --git a/infra/config/generators/cq-builders-md.star b/infra/config/generators/cq-builders-md.star
index 40a1a51..75b2864 100644
--- a/infra/config/generators/cq-builders-md.star
+++ b/infra/config/generators/cq-builders-md.star
@@ -2,8 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/try.star', 'INFRA_CONFIG_LOCATION_REGEXP')
-
+load("//lib/try.star", "INFRA_CONFIG_LOCATION_REGEXP")
 
 _MD_HEADER = """\
 <!-- Auto-generated by lucicfg (via cq-builders-md.star). -->
@@ -40,163 +39,165 @@
 as required builders.
 """
 
-_TRY_BUILDER_VIEW_URL = 'https://ci.chromium.org/p/chromium/builders/try'
+_TRY_BUILDER_VIEW_URL = "https://ci.chromium.org/p/chromium/builders/try"
 
-_REGEX_PREFIX = '.+/[+]/'
-
+_REGEX_PREFIX = ".+/[+]/"
 
 def _get_main_config_group_builders(ctx):
-  cq_cfg = ctx.output['commit-queue.cfg']
+    cq_cfg = ctx.output["commit-queue.cfg"]
 
-  for c in cq_cfg.config_groups:
-    if len(c.gerrit) != 1:
-      continue
+    for c in cq_cfg.config_groups:
+        if len(c.gerrit) != 1:
+            continue
 
-    gerrit = c.gerrit[0]
-    if len(gerrit.projects) != 1:
-      continue
+        gerrit = c.gerrit[0]
+        if len(gerrit.projects) != 1:
+            continue
 
-    project = gerrit.projects[0]
-    if len(project.ref_regexp) != 1:
-      continue
+        project = gerrit.projects[0]
+        if len(project.ref_regexp) != 1:
+            continue
 
-    if (project.name == 'chromium/src'
-        # Repeated proto fields have an internal type that won't compare equal
-        # to a list, so convert it
-        and list(project.ref_regexp) == ['refs/heads/.+']):
-      return c.verifiers.tryjob.builders
+        if (project.name == "chromium/src" and
+            # Repeated proto fields have an internal type that won't compare equal
+            # to a list, so convert it
+            list(project.ref_regexp) == ["refs/heads/.+"]):
+            return c.verifiers.tryjob.builders
 
-  fail('Could not find the main CQ group')
-
+    fail("Could not find the main CQ group")
 
 def _normalize_builder(builder):
-  location_regexp_exclude = [r for r in builder.location_regexp_exclude
-                             if r != INFRA_CONFIG_LOCATION_REGEXP]
-  location_regexp = builder.location_regexp
-  if list(location_regexp) == ['.*'] and not location_regexp_exclude:
-    location_regexp = None
-  return struct(
-      name = builder.name,
-      experiment_percentage = builder.experiment_percentage,
-      includable_only = builder.includable_only,
-      location_regexp = location_regexp,
-      location_regexp_exclude = location_regexp_exclude,
-  )
+    location_regexp_exclude = [
+        r
+        for r in builder.location_regexp_exclude
+        if r != INFRA_CONFIG_LOCATION_REGEXP
+    ]
+    location_regexp = builder.location_regexp
+    if list(location_regexp) == [".*"] and not location_regexp_exclude:
+        location_regexp = None
+    return struct(
+        name = builder.name,
+        experiment_percentage = builder.experiment_percentage,
+        includable_only = builder.includable_only,
+        location_regexp = location_regexp,
+        location_regexp_exclude = location_regexp_exclude,
+    )
 
 def _group_builders_by_section(builders):
-  required = []
-  experimental = []
-  optional = []
+    required = []
+    experimental = []
+    optional = []
 
-  for builder in builders:
-    builder = _normalize_builder(builder)
-    if builder.experiment_percentage:
-      experimental.append(builder)
-    elif builder.location_regexp or builder.location_regexp_exclude:
-      optional.append(builder)
-    elif builder.includable_only:
-      continue
-    else:
-      required.append(builder)
+    for builder in builders:
+        builder = _normalize_builder(builder)
+        if builder.experiment_percentage:
+            experimental.append(builder)
+        elif builder.location_regexp or builder.location_regexp_exclude:
+            optional.append(builder)
+        elif builder.includable_only:
+            continue
+        else:
+            required.append(builder)
 
-  return struct(
-      required = required,
-      experimental = experimental,
-      optional = optional,
-  )
+    return struct(
+        required = required,
+        experimental = experimental,
+        optional = optional,
+    )
 
-
-def _codesearch_query(*atoms, package=None):
-  query = ['https://cs.chromium.org/search?q=']
-  if package != None:
-    query.append('package:%5E')  # %5E -> encoded ^
-    query.append(package)
-    query.append('$')
-  for atom in atoms:
-    query.append('+')
-    query.append(atom)
-  return ''.join(query)
-
+def _codesearch_query(*atoms, package = None):
+    query = ["https://cs.chromium.org/search?q="]
+    if package != None:
+        query.append("package:%5E")  # %5E -> encoded ^
+        query.append(package)
+        query.append("$")
+    for atom in atoms:
+        query.append("+")
+        query.append(atom)
+    return "".join(query)
 
 def _get_regex_line_details(regex):
-  if regex.startswith(_REGEX_PREFIX):
-    regex = regex[len(_REGEX_PREFIX):]
-  title = '//' + regex.lstrip('/')
-  if regex.endswith('.+'):
-    regex = regex[:-len('.+')]
+    if regex.startswith(_REGEX_PREFIX):
+        regex = regex[len(_REGEX_PREFIX):]
+    title = "//" + regex.lstrip("/")
+    if regex.endswith(".+"):
+        regex = regex[:-len(".+")]
 
-  url = _codesearch_query('file:' + regex, package='chromium')
-  # If the regex doesn't have any interesting characters that might be part of a
-  # regex, assume the regex is targeting a single path and direct link to it
-  # Equals sign and dashes used by layout tests
-  if all([c.isalnum() or c in '/-_=' for c in regex.codepoints()]):
-    url = 'https://cs.chromium.org/chromium/src/' + regex
+    url = _codesearch_query("file:" + regex, package = "chromium")
 
-  return struct(
-      title=title,
-      url=url,
-  )
+    # If the regex doesn't have any interesting characters that might be part of a
+    # regex, assume the regex is targeting a single path and direct link to it
+    # Equals sign and dashes used by layout tests
+    if all([c.isalnum() or c in "/-_=" for c in regex.codepoints()]):
+        url = "https://cs.chromium.org/chromium/src/" + regex
 
+    return struct(
+        title = title,
+        url = url,
+    )
 
 def _generate_cq_builders_md(ctx):
-  builders = _get_main_config_group_builders(ctx)
+    builders = _get_main_config_group_builders(ctx)
 
-  builders_by_section = _group_builders_by_section(builders)
+    builders_by_section = _group_builders_by_section(builders)
 
-  lines = [_MD_HEADER]
+    lines = [_MD_HEADER]
 
-  for title, header, section in (
-      ('Required builders', _REQUIRED_HEADER, 'required'),
-      ('Optional builders', _OPTIONAL_HEADER, 'optional'),
-      ('Experimental builders', _EXPERIMENTAL_HEADER, 'experimental'),
-  ):
-    builders = getattr(builders_by_section, section)
-    if not builders:
-      continue
+    for title, header, section in (
+        ("Required builders", _REQUIRED_HEADER, "required"),
+        ("Optional builders", _OPTIONAL_HEADER, "optional"),
+        ("Experimental builders", _EXPERIMENTAL_HEADER, "experimental"),
+    ):
+        builders = getattr(builders_by_section, section)
+        if not builders:
+            continue
 
-    lines.append('## %s' % title)
-    lines.append(header)
+        lines.append("## %s" % title)
+        lines.append(header)
 
-    for b in builders:
-      name = b.name.rsplit('/', 1)[-1]
-      lines.append((
-          '* [{name}]({try_builder_view}/{name}) '
-          + '([definition]({definition_query}+{name})) '
-          + '([matching builders]({trybot_query}+{name}))'
-      ).format(
-          name=name,
-          try_builder_view=_TRY_BUILDER_VIEW_URL,
-          definition_query=_codesearch_query(
-              'file:/cq.star$', '-file:/beta/', '-file:/stable/',
-              package='chromium'),
-          trybot_query=_codesearch_query('file:trybots.py'),
-      ))
+        for b in builders:
+            name = b.name.rsplit("/", 1)[-1]
+            lines.append((
+                "* [{name}]({try_builder_view}/{name}) " +
+                "([definition]({definition_query}+{name})) " +
+                "([matching builders]({trybot_query}+{name}))"
+            ).format(
+                name = name,
+                try_builder_view = _TRY_BUILDER_VIEW_URL,
+                definition_query = _codesearch_query(
+                    "file:/cq.star$",
+                    "-file:/beta/",
+                    "-file:/stable/",
+                    package = "chromium",
+                ),
+                trybot_query = _codesearch_query("file:trybots.py"),
+            ))
 
-      if b.experiment_percentage:
-        lines.append('  * Experiment percentage: {percentage}'.format(
-            percentage=b.experiment_percentage,
-        ))
+            if b.experiment_percentage:
+                lines.append("  * Experiment percentage: {percentage}".format(
+                    percentage = b.experiment_percentage,
+                ))
 
-      for attr, regexp_header in (
-          ('location_regexp', 'Path regular expressions:'),
-          ('location_regexp_exclude', 'Path exclude regular expressions:'),
-      ):
-        regexes = getattr(b, attr)
-        if not regexes:
-          continue
-        lines.append('')
-        lines.append('  ' + regexp_header)
-        for regex in regexes:
-          regex_line_details = _get_regex_line_details(regex)
-          lines.append('  * [`{title}`]({url})'.format(
-              title=regex_line_details.title,
-              url=regex_line_details.url,
-          ))
+            for attr, regexp_header in (
+                ("location_regexp", "Path regular expressions:"),
+                ("location_regexp_exclude", "Path exclude regular expressions:"),
+            ):
+                regexes = getattr(b, attr)
+                if not regexes:
+                    continue
+                lines.append("")
+                lines.append("  " + regexp_header)
+                for regex in regexes:
+                    regex_line_details = _get_regex_line_details(regex)
+                    lines.append("  * [`{title}`]({url})".format(
+                        title = regex_line_details.title,
+                        url = regex_line_details.url,
+                    ))
 
-      lines.append('')
+            lines.append("")
 
-    lines.append('')
+        lines.append("")
 
-  ctx.output['cq-builders.md'] = '\n'.join(lines)
+    ctx.output["cq-builders.md"] = "\n".join(lines)
 
 lucicfg.generator(_generate_cq_builders_md)
diff --git a/infra/config/generators/scheduler-bucketed-jobs.star b/infra/config/generators/scheduler-bucketed-jobs.star
index 42074f6..49e9ea26 100644
--- a/infra/config/generators/scheduler-bucketed-jobs.star
+++ b/infra/config/generators/scheduler-bucketed-jobs.star
@@ -3,34 +3,34 @@
 # found in the LICENSE file.
 
 def _ensure_ci_jobs_can_be_bucketed_or_not(ctx):
-  cfg = ctx.output['luci-scheduler.cfg']
+    cfg = ctx.output["luci-scheduler.cfg"]
 
-  ci_jobs = {}
-  for j in cfg.job:
-    # The default behavior is the same as 'triggered', so look for non-empty
-    # schedules that are not 'triggered', we don't want to create duplicates of
-    # those jobs because it will cause double the number of builds to be
-    # scheduled
-    if j.schedule and j.schedule != 'triggered':
-      continue
+    ci_jobs = {}
+    for j in cfg.job:
+        # The default behavior is the same as 'triggered', so look for non-empty
+        # schedules that are not 'triggered', we don't want to create duplicates of
+        # those jobs because it will cause double the number of builds to be
+        # scheduled
+        if j.schedule and j.schedule != "triggered":
+            continue
 
-    bucket = j.buildbucket.bucket
-    if bucket != 'luci.chromium.ci':
-      continue
+        bucket = j.buildbucket.bucket
+        if bucket != "luci.chromium.ci":
+            continue
 
-    builder = j.buildbucket.builder
-    if builder in ci_jobs:
-      fail('Multiple jobs defined for CI builder ci/{}'.format(builder))
+        builder = j.buildbucket.builder
+        if builder in ci_jobs:
+            fail("Multiple jobs defined for CI builder ci/{}".format(builder))
 
-    ci_jobs[builder] = j
+        ci_jobs[builder] = j
 
-  for builder, job in ci_jobs.items():
-    new_job = proto.from_wirepb(proto.message_type(job), proto.to_wirepb(job))
-    new_job.id = builder if job.id != builder else 'ci-{}'.format(builder)
-    cfg.job.append(new_job)
+    for builder, job in ci_jobs.items():
+        new_job = proto.from_wirepb(proto.message_type(job), proto.to_wirepb(job))
+        new_job.id = builder if job.id != builder else "ci-{}".format(builder)
+        cfg.job.append(new_job)
 
-  jobs = sorted(cfg.job, key=lambda j: j.id)
-  cfg.job.clear()
-  cfg.job.extend(jobs)
+    jobs = sorted(cfg.job, key = lambda j: j.id)
+    cfg.job.clear()
+    cfg.job.extend(jobs)
 
 lucicfg.generator(_ensure_ci_jobs_can_be_bucketed_or_not)
diff --git a/infra/config/generators/scheduler-noop-jobs.star b/infra/config/generators/scheduler-noop-jobs.star
index 450f563..0c8257f8 100644
--- a/infra/config/generators/scheduler-noop-jobs.star
+++ b/infra/config/generators/scheduler-noop-jobs.star
@@ -13,9 +13,8 @@
 """
 
 # Don't make a habit of this - it isn't public API
-load('@stdlib//internal/luci/proto.star', 'scheduler_pb')
-load('//project.star', 'settings')
-
+load("@stdlib//internal/luci/proto.star", "scheduler_pb")
+load("//project.star", "settings")
 
 # For the chromium project (settings.is_master is True), we have bucket-based
 # milestones for <=M85. We create a no-op job that prefixes the ci bucket name
@@ -26,51 +25,48 @@
 # milestone project will use the same bucket names, so we create a no-op job for
 # the 'ci' bucket.
 _BRANCH_NOOP_CONFIG = struct(
-    buckets = ['ci-m84', 'ci-m85'],
-    fmt = '{bucket}-{builder}',
+    buckets = ["ci-m84", "ci-m85"],
+    fmt = "{bucket}-{builder}",
 ) if settings.is_master else struct(
-    buckets = ['ci'],
-    fmt = '{builder}',
+    buckets = ["ci"],
+    fmt = "{builder}",
 )
 
-
 _NON_BRANCHED_TESTERS = (
     # This tester is triggered by 'Mac Builder', but it is an FYI builder and
     # not mirrored by any branched try builders, so we do not need to run it on
     # the branches
-    'mac-osxbeta-rel',
+    "mac-osxbeta-rel",
 
     # These testers are triggered by 'Win x64 Builder', but it is an FYI builder
     # and not mirrored by any branched try builders, so we do not need to run it
     # on the branches (crbug/990885)
-    'Win10 Tests x64 1803',
-    'Win10 Tests x64 1909',
+    "Win10 Tests x64 1803",
+    "Win10 Tests x64 1909",
 
     # These Android testers are triggered by 'Android arm Builder (dbg)', but we
     # don't have sufficient capacity of devices with older Android versions, so
     # we do not run them on the branches
-    'Android WebView L (dbg)',
-    'Lollipop Phone Tester',
-    'Lollipop Tablet Tester',
-    'Marshmallow Tablet Tester',
+    "Android WebView L (dbg)",
+    "Lollipop Phone Tester",
+    "Lollipop Tablet Tester",
+    "Marshmallow Tablet Tester",
 )
 
-
 _TESTER_NOOP_JOBS = [scheduler_pb.Job(
-    id = _BRANCH_NOOP_CONFIG.fmt.format(bucket=bucket, builder=builder),
-    schedule = 'triggered',
+    id = _BRANCH_NOOP_CONFIG.fmt.format(bucket = bucket, builder = builder),
+    schedule = "triggered",
     acl_sets = [bucket],
     acls = [scheduler_pb.Acl(
         role = scheduler_pb.Acl.TRIGGERER,
-        granted_to = 'chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com',
+        granted_to = "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com",
     )],
     noop = scheduler_pb.NoopTask(),
 ) for builder in _NON_BRANCHED_TESTERS for bucket in _BRANCH_NOOP_CONFIG.buckets]
 
-
 def _add_noop_jobs(ctx):
-  cfg = ctx.output['luci-scheduler.cfg']
-  for j in _TESTER_NOOP_JOBS:
-    cfg.job.append(j)
+    cfg = ctx.output["luci-scheduler.cfg"]
+    for j in _TESTER_NOOP_JOBS:
+        cfg.job.append(j)
 
 lucicfg.generator(_add_noop_jobs)
diff --git a/infra/config/generators/sort-consoles.star b/infra/config/generators/sort-consoles.star
index 54be15e..b0981ae 100644
--- a/infra/config/generators/sort-consoles.star
+++ b/infra/config/generators/sort-consoles.star
@@ -1,8 +1,9 @@
 def _sort_consoles(ctx):
-  milo = ctx.output['luci-milo.cfg']
-  # Sort so that the overview consoles appear at the top of the console list
-  # The overview consoles specify a title, so checking c.id == c.name will put
-  # the overview consoles first
-  milo.consoles = sorted(milo.consoles, key=lambda c: (c.id == c.name, c.id))
+    milo = ctx.output["luci-milo.cfg"]
+
+    # Sort so that the overview consoles appear at the top of the console list
+    # The overview consoles specify a title, so checking c.id == c.name will put
+    # the overview consoles first
+    milo.consoles = sorted(milo.consoles, key = lambda c: (c.id == c.name, c.id))
 
 lucicfg.generator(_sort_consoles)
diff --git a/infra/config/lib/args.star b/infra/config/lib/args.star
index f419c3b..980223b 100644
--- a/infra/config/lib/args.star
+++ b/infra/config/lib/args.star
@@ -5,65 +5,61 @@
 """Library containing utilities for handling args in libraries."""
 
 def _sentinel(tag):
-  return struct(**{tag: tag})
-
+    return struct(**{tag: tag})
 
 # A sentinel value indicating a value that will be computed based off of some
 # other values
-COMPUTE = _sentinel('__compute__')
-
+COMPUTE = _sentinel("__compute__")
 
 # A sentinel value to be used as a default so that it can be distinguished
 # between an unspecified value and an explicit value of None
-DEFAULT = _sentinel('__default__')
+DEFAULT = _sentinel("__default__")
 
+def defaults(extends = None, **vars):
+    """Define a structure that provides module-level defaults for function
+    arguments.
 
-def defaults(extends=None, **vars):
-  """Define a structure that provides module-level defaults for function
-  arguments.
+    Arguments:
+      * extends - A struct containing `lucicfg.var` attributes to add to the
+        resulting struct.
+      * vars - Defaults to define. Each entry results in a `lucicfg.var` attribute
+        being added to the resulting struct. The name of the attribute is the
+        keyword and the default value of the `lucicfg.var` is the keyword's value.
 
-  Arguments:
-    * extends - A struct containing `lucicfg.var` attributes to add to the
-      resulting struct.
-    * vars - Defaults to define. Each entry results in a `lucicfg.var` attribute
-      being added to the resulting struct. The name of the attribute is the
-      keyword and the default value of the `lucicfg.var` is the keyword's value.
+    Returns:
+      A struct containing `lucicfg.var` attributes providing the module level
+      defaults and the following methods:
+      * get_value(name, value) - Gets the value of an argument. If `value` is not
+        `DEFAULT`, `value` is returned. Otherwise, the module-level default for
+        `name` is returned.
+      * get_value_from_kwargs(name, kwargs) - Gets the value of a keyword
+        argument. If `name` is in `kwargs`, `kwargs[name]` is returned. Otherwise,
+        the module-level default for `name` is returned.
+    """
+    methods = ["get_value", "get_value_from_kwargs"]
+    for m in methods:
+        if m in vars:
+            fail("{!r} can't be used as the name of a default: it is a method"
+                .format(a))
 
-  Returns:
-    A struct containing `lucicfg.var` attributes providing the module level
-    defaults and the following methods:
-    * get_value(name, value) - Gets the value of an argument. If `value` is not
-      `DEFAULT`, `value` is returned. Otherwise, the module-level default for
-      `name` is returned.
-    * get_value_from_kwargs(name, kwargs) - Gets the value of a keyword
-      argument. If `name` is in `kwargs`, `kwargs[name]` is returned. Otherwise,
-      the module-level default for `name` is returned.
-  """
-  methods = ['get_value', 'get_value_from_kwargs']
-  for m in methods:
-    if m in vars:
-      fail("{!r} can't be used as the name of a default: it is a method"
-           .format(a))
+    vars = {k: lucicfg.var(default = v) for k, v in vars.items()}
+    for a in dir(extends):
+        if a not in methods:
+            vars[a] = getattr(extends, a)
 
-  vars = {k: lucicfg.var(default = v) for k, v in vars.items()}
-  for a in dir(extends):
-    if a not in methods:
-      vars[a] = getattr(extends, a)
+    def get_value(name, value):
+        if value != DEFAULT:
+            return value
+        return vars[name].get()
 
-  def get_value(name, value):
-    if value != DEFAULT:
-      return value
-    return vars[name].get()
+    def get_value_from_kwargs(name, kwargs):
+        return get_value(name, kwargs.get(name, DEFAULT))
 
-  def get_value_from_kwargs(name, kwargs):
-    return get_value(name, kwargs.get(name, DEFAULT))
-
-  return struct(
-      get_value = get_value,
-      get_value_from_kwargs = get_value_from_kwargs,
-      **vars
-  )
-
+    return struct(
+        get_value = get_value,
+        get_value_from_kwargs = get_value_from_kwargs,
+        **vars
+    )
 
 args = struct(
     COMPUTE = COMPUTE,
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star
index 2e3f3ea..f9475e67 100644
--- a/infra/config/lib/builders.star
+++ b/infra/config/lib/builders.star
@@ -25,8 +25,7 @@
 through `builders.cpu`, `builders.os` and `builders.goma` respectively.
 """
 
-load('./args.star', 'args')
-
+load("./args.star", "args")
 
 ################################################################################
 # Constants for use with the builder function                                  #
@@ -34,18 +33,17 @@
 
 # The cpu constants to be used with the builder function
 cpu = struct(
-    X86 = 'x86',
-    X86_64 = 'x86-64',
+    X86 = "x86",
+    X86_64 = "x86-64",
 )
 
-
 # The category for an os: a more generic grouping than specific OS versions that
 # can be used for computing defaults
 os_category = struct(
-    ANDROID = 'Android',
-    LINUX = 'Linux',
-    MAC = 'Mac',
-    WINDOWS = 'Windows',
+    ANDROID = "Android",
+    LINUX = "Linux",
+    MAC = "Mac",
+    WINDOWS = "Windows",
 )
 
 # The os constants to be used for the os parameter of the builder function
@@ -53,45 +51,41 @@
 # "current" version of the OS and a use that runs against a specific version
 # that happens to be the "current" version
 def os_enum(dimension, category):
-  return struct(dimension=dimension, category=category)
+    return struct(dimension = dimension, category = category)
 
 os = struct(
-    ANDROID = os_enum('Android', os_category.ANDROID),
-
-    LINUX_TRUSTY = os_enum('Ubuntu-14.04', os_category.LINUX),
-    LINUX_XENIAL = os_enum('Ubuntu-16.04', os_category.LINUX),
-    LINUX_DEFAULT = os_enum('Ubuntu-16.04', os_category.LINUX),
-
-    MAC_10_12 = os_enum('Mac-10.12', os_category.MAC),
-    MAC_10_13 = os_enum('Mac-10.13', os_category.MAC),
-    MAC_10_14 = os_enum('Mac-10.14', os_category.MAC),
-    MAC_10_15 = os_enum('Mac-10.15', os_category.MAC),
-    MAC_DEFAULT = os_enum('Mac-10.13', os_category.MAC),
-    MAC_ANY = os_enum('Mac', os_category.MAC),
-
-    WINDOWS_7 = os_enum('Windows-7', os_category.WINDOWS),
-    WINDOWS_8_1 = os_enum('Windows-8.1', os_category.WINDOWS),
-    WINDOWS_10 = os_enum('Windows-10', os_category.WINDOWS),
-    WINDOWS_DEFAULT = os_enum('Windows-10', os_category.WINDOWS),
-    WINDOWS_ANY = os_enum('Windows', os_category.WINDOWS),
+    ANDROID = os_enum("Android", os_category.ANDROID),
+    LINUX_TRUSTY = os_enum("Ubuntu-14.04", os_category.LINUX),
+    LINUX_XENIAL = os_enum("Ubuntu-16.04", os_category.LINUX),
+    LINUX_DEFAULT = os_enum("Ubuntu-16.04", os_category.LINUX),
+    MAC_10_12 = os_enum("Mac-10.12", os_category.MAC),
+    MAC_10_13 = os_enum("Mac-10.13", os_category.MAC),
+    MAC_10_14 = os_enum("Mac-10.14", os_category.MAC),
+    MAC_10_15 = os_enum("Mac-10.15", os_category.MAC),
+    MAC_DEFAULT = os_enum("Mac-10.13", os_category.MAC),
+    MAC_ANY = os_enum("Mac", os_category.MAC),
+    WINDOWS_7 = os_enum("Windows-7", os_category.WINDOWS),
+    WINDOWS_8_1 = os_enum("Windows-8.1", os_category.WINDOWS),
+    WINDOWS_10 = os_enum("Windows-10", os_category.WINDOWS),
+    WINDOWS_DEFAULT = os_enum("Windows-10", os_category.WINDOWS),
+    WINDOWS_ANY = os_enum("Windows", os_category.WINDOWS),
 )
 
-
 # The constants to be used for the goma_backend and goma_jobs parameters of the
 # builder function
 goma = struct(
     backend = struct(
         RBE_PROD = {
-            'server_host': 'goma.chromium.org',
-            'rpc_extra_params': '?prod',
+            "server_host": "goma.chromium.org",
+            "rpc_extra_params": "?prod",
         },
         RBE_STAGING = {
-            'server_host': 'staging-goma.chromium.org',
-            'rpc_extra_params': '?staging',
+            "server_host": "staging-goma.chromium.org",
+            "rpc_extra_params": "?staging",
         },
         RBE_TOT = {
-            'server_host': 'staging-goma.chromium.org',
-            'rpc_extra_params': '?tot',
+            "server_host": "staging-goma.chromium.org",
+            "rpc_extra_params": "?tot",
         },
     ),
     jobs = struct(
@@ -124,109 +118,113 @@
     ),
 )
 
-
 def xcode_enum(cache_name, cache_path):
-  return swarming.cache(name=cache_name, path=cache_path)
-
+    return swarming.cache(name = cache_name, path = cache_path)
 
 # Keep this in-sync with the versions of bots in //ios/build/bots/.
 xcode_cache = struct(
-   x10e1001 = xcode_enum('xcode_ios_10e1001', 'xcode_ios_10e1001.app'),
-   x11a1027 = xcode_enum('xcode_ios_11a1027', 'xcode_ios_11a1027.app'),
-   x11c29 = xcode_enum('xcode_ios_11c29', 'xcode_ios_11c29.app'),
-   x11m382q = xcode_enum('xcode_ios_11m382q', 'xcode_ios_11m382q.app'),
-   x11e146 = xcode_enum('xcode_ios_11e146', 'xcode_ios_11e146.app'),
-   x11e608c = xcode_enum('xcode_ios_11e608c', 'xcode_ios_11e608c.app'),
-   x11e608cwk = xcode_enum('xcode_ios_11e608cwk', 'xcode_ios_11e608cwk.app'),
-   x11e503a_xct12b1 = xcode_enum('xcode_ios_11e503a_xct12b1', 'xcode_ios_11e503a_xct12b1.app'),
-   x11e708 = xcode_enum('xcode_ios_11e708', 'xcode_ios_11e708.app'),
-   # xcode12
-   x12a6163b = xcode_enum('xcode_ios_12a6163b', 'xcode_ios_12a6163b.app'),
+    x10e1001 = xcode_enum("xcode_ios_10e1001", "xcode_ios_10e1001.app"),
+    x11a1027 = xcode_enum("xcode_ios_11a1027", "xcode_ios_11a1027.app"),
+    x11c29 = xcode_enum("xcode_ios_11c29", "xcode_ios_11c29.app"),
+    x11m382q = xcode_enum("xcode_ios_11m382q", "xcode_ios_11m382q.app"),
+    x11e146 = xcode_enum("xcode_ios_11e146", "xcode_ios_11e146.app"),
+    x11e608c = xcode_enum("xcode_ios_11e608c", "xcode_ios_11e608c.app"),
+    x11e608cwk = xcode_enum("xcode_ios_11e608cwk", "xcode_ios_11e608cwk.app"),
+    x11e503a_xct12b1 = xcode_enum("xcode_ios_11e503a_xct12b1", "xcode_ios_11e503a_xct12b1.app"),
+    x11e708 = xcode_enum("xcode_ios_11e708", "xcode_ios_11e708.app"),
+    # xcode12
+    x12a6163b = xcode_enum("xcode_ios_12a6163b", "xcode_ios_12a6163b.app"),
 )
 
-
 ################################################################################
 # Implementation details                                                       #
 ################################################################################
 
 _DEFAULT_BUILDERLESS_OS_CATEGORIES = [os_category.LINUX]
 
-
 def _chromium_tests_property(*, bucketed_triggers, project_trigger_overrides):
-  chromium_tests = {}
+    chromium_tests = {}
 
-  bucketed_triggers = defaults.get_value('bucketed_triggers', bucketed_triggers)
-  if bucketed_triggers:
-    chromium_tests['bucketed_triggers'] = True
+    bucketed_triggers = defaults.get_value("bucketed_triggers", bucketed_triggers)
+    if bucketed_triggers:
+        chromium_tests["bucketed_triggers"] = True
 
-  project_trigger_overrides = defaults.get_value('project_trigger_overrides', project_trigger_overrides)
-  if project_trigger_overrides:
-    chromium_tests['project_trigger_overrides'] = project_trigger_overrides
+    project_trigger_overrides = defaults.get_value("project_trigger_overrides", project_trigger_overrides)
+    if project_trigger_overrides:
+        chromium_tests["project_trigger_overrides"] = project_trigger_overrides
 
-  return chromium_tests or None
-
+    return chromium_tests or None
 
 def _goma_property(*, goma_backend, goma_debug, goma_enable_ats, goma_jobs, goma_use_luci_auth, os):
-  goma_properties = {}
+    goma_properties = {}
 
-  goma_backend = defaults.get_value('goma_backend', goma_backend)
-  if goma_backend != None:
-    goma_properties.update(goma_backend)
+    goma_backend = defaults.get_value("goma_backend", goma_backend)
+    if goma_backend != None:
+        goma_properties.update(goma_backend)
 
-  goma_debug = defaults.get_value('goma_debug', goma_debug)
-  if goma_debug:
-    goma_properties['debug'] = True
+    goma_debug = defaults.get_value("goma_debug", goma_debug)
+    if goma_debug:
+        goma_properties["debug"] = True
 
-  goma_enable_ats = defaults.get_value('goma_enable_ats', goma_enable_ats)
-  # TODO(crbug.com/1040754): Remove this flag.
-  if goma_enable_ats == args.COMPUTE:
-    goma_enable_ats = (
-        os and os.category in (os_category.LINUX, os_category.WINDOWS) and
-        goma_backend in (goma.backend.RBE_TOT, goma.backend.RBE_STAGING,
-                         goma.backend.RBE_PROD))
-  if goma_enable_ats:
-    goma_properties['enable_ats'] = True
+    goma_enable_ats = defaults.get_value("goma_enable_ats", goma_enable_ats)
 
-  goma_jobs = defaults.get_value('goma_jobs', goma_jobs)
-  if goma_jobs != None:
-    goma_properties['jobs'] = goma_jobs
+    # TODO(crbug.com/1040754): Remove this flag.
+    if goma_enable_ats == args.COMPUTE:
+        goma_enable_ats = (
+            os and os.category in (os_category.LINUX, os_category.WINDOWS) and
+            goma_backend in (
+                goma.backend.RBE_TOT,
+                goma.backend.RBE_STAGING,
+                goma.backend.RBE_PROD,
+            )
+        )
+    if goma_enable_ats:
+        goma_properties["enable_ats"] = True
 
-  goma_use_luci_auth = defaults.get_value('goma_use_luci_auth', goma_use_luci_auth)
-  if goma_use_luci_auth:
-    goma_properties['use_luci_auth'] = True
+    goma_jobs = defaults.get_value("goma_jobs", goma_jobs)
+    if goma_jobs != None:
+        goma_properties["jobs"] = goma_jobs
 
-  return goma_properties or None
+    goma_use_luci_auth = defaults.get_value("goma_use_luci_auth", goma_use_luci_auth)
+    if goma_use_luci_auth:
+        goma_properties["use_luci_auth"] = True
 
+    return goma_properties or None
 
 def _code_coverage_property(
-    *,
-    use_clang_coverage,
-    use_java_coverage,
-    coverage_exclude_sources,
-    coverage_test_types):
-  code_coverage = {}
+        *,
+        use_clang_coverage,
+        use_java_coverage,
+        coverage_exclude_sources,
+        coverage_test_types):
+    code_coverage = {}
 
-  use_clang_coverage = defaults.get_value(
-      'use_clang_coverage', use_clang_coverage)
-  if use_clang_coverage:
-    code_coverage['use_clang_coverage'] = True
+    use_clang_coverage = defaults.get_value(
+        "use_clang_coverage",
+        use_clang_coverage,
+    )
+    if use_clang_coverage:
+        code_coverage["use_clang_coverage"] = True
 
-  use_java_coverage = defaults.get_value('use_java_coverage', use_java_coverage)
-  if use_java_coverage:
-    code_coverage['use_java_coverage'] = True
+    use_java_coverage = defaults.get_value("use_java_coverage", use_java_coverage)
+    if use_java_coverage:
+        code_coverage["use_java_coverage"] = True
 
-  coverage_exclude_sources = defaults.get_value('coverage_exclude_sources',
-      coverage_exclude_sources)
-  if coverage_exclude_sources:
-    code_coverage['coverage_exclude_sources'] = coverage_exclude_sources
+    coverage_exclude_sources = defaults.get_value(
+        "coverage_exclude_sources",
+        coverage_exclude_sources,
+    )
+    if coverage_exclude_sources:
+        code_coverage["coverage_exclude_sources"] = coverage_exclude_sources
 
-  coverage_test_types = defaults.get_value('coverage_test_types',
-      coverage_test_types)
-  if coverage_test_types:
-    code_coverage['coverage_test_types'] = coverage_test_types
+    coverage_test_types = defaults.get_value(
+        "coverage_test_types",
+        coverage_test_types,
+    )
+    if coverage_test_types:
+        code_coverage["coverage_test_types"] = coverage_test_types
 
-  return code_coverage or None
-
+    return code_coverage or None
 
 ################################################################################
 # Builder defaults and function                                                #
@@ -270,248 +268,251 @@
 )
 
 def builder(
-    *,
-    name,
-    bucket=args.DEFAULT,
-    executable=args.DEFAULT,
-    triggered_by=args.DEFAULT,
-    os=args.DEFAULT,
-    builderless=args.DEFAULT,
-    auto_builder_dimension=args.DEFAULT,
-    cores=args.DEFAULT,
-    cpu=args.DEFAULT,
-    mastername=args.DEFAULT,
-    pool=args.DEFAULT,
-    ssd=args.DEFAULT,
-    bucketed_triggers=args.DEFAULT,
-    project_trigger_overrides=args.DEFAULT,
-    configure_kitchen=args.DEFAULT,
-    goma_backend=args.DEFAULT,
-    goma_debug=args.DEFAULT,
-    goma_enable_ats=args.DEFAULT,
-    goma_jobs=args.DEFAULT,
-    goma_use_luci_auth=args.DEFAULT,
-    use_clang_coverage=args.DEFAULT,
-    use_java_coverage=args.DEFAULT,
-    coverage_exclude_sources=args.DEFAULT,
-    coverage_test_types=args.DEFAULT,
-    resultdb_bigquery_exports=args.DEFAULT,
-    **kwargs):
-  """Define a builder.
+        *,
+        name,
+        bucket = args.DEFAULT,
+        executable = args.DEFAULT,
+        triggered_by = args.DEFAULT,
+        os = args.DEFAULT,
+        builderless = args.DEFAULT,
+        auto_builder_dimension = args.DEFAULT,
+        cores = args.DEFAULT,
+        cpu = args.DEFAULT,
+        mastername = args.DEFAULT,
+        pool = args.DEFAULT,
+        ssd = args.DEFAULT,
+        bucketed_triggers = args.DEFAULT,
+        project_trigger_overrides = args.DEFAULT,
+        configure_kitchen = args.DEFAULT,
+        goma_backend = args.DEFAULT,
+        goma_debug = args.DEFAULT,
+        goma_enable_ats = args.DEFAULT,
+        goma_jobs = args.DEFAULT,
+        goma_use_luci_auth = args.DEFAULT,
+        use_clang_coverage = args.DEFAULT,
+        use_java_coverage = args.DEFAULT,
+        coverage_exclude_sources = args.DEFAULT,
+        coverage_test_types = args.DEFAULT,
+        resultdb_bigquery_exports = args.DEFAULT,
+        **kwargs):
+    """Define a builder.
 
-  For all of the optional parameters defined by this method, passing None will
-  prevent the emission of any dimensions or property fields associated with that
-  parameter.
+    For all of the optional parameters defined by this method, passing None will
+    prevent the emission of any dimensions or property fields associated with that
+    parameter.
 
-  All parameters defined by this function except for `name` and `kwargs` support
-  module-level defaults. The `defaults` struct defined in this module has an
-  attribute with a `lucicfg.var` for all of the fields defined here as well as
-  all of the parameters of `luci.builder` that support module-level defaults.
+    All parameters defined by this function except for `name` and `kwargs` support
+    module-level defaults. The `defaults` struct defined in this module has an
+    attribute with a `lucicfg.var` for all of the fields defined here as well as
+    all of the parameters of `luci.builder` that support module-level defaults.
 
-  See https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/master/lucicfg/doc/README.md#luci.builder
-  for more information.
+    See https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/master/lucicfg/doc/README.md#luci.builder
+    for more information.
 
-  Arguments:
-    * name - name of the builder, will show up in UIs and logs. Required.
-    * bucket - a bucket the build is in, see luci.bucket(...) rule. Required
-      (may be specified by module-level default).
-    * executable - an executable to run, e.g. a luci.recipe(...). Required (may
-      be specified by module-level default).
-    * os - a member of the `os` enum indicating the OS the builder requires for
-      the machines that run it. Emits a dimension of the form 'os:os'. By
-      default considered None.
-    * builderless - a boolean indicating whether the builder runs on builderless
-      machines. If True, emits a 'builderless:1' dimension. By default,
-      considered True iff `os` refers to a linux OS.
-    * auto_builder_dimension - a boolean indicating whether the builder runs on
-      machines devoted to the builder. If True, a dimension will be emitted of
-      the form 'builder:<name>'. By default, considered True iff `builderless`
-      is considered False.
-    * mastername - a string with the mastername of the builder. Emits a property
-      of the form 'mastername:<mastername>'. By default, considered None.
-    * cores - an int indicating the number of cores the builder requires for the
-      machines that run it. Emits a dimension of the form 'cores:<cores>' will
-      be emitted. By default, considered None.
-    * cpu - a member of the `cpu` enum indicating the cpu the builder requires
-      for the machines that run it. Emits a dimension of the form 'cpu:<cpu>'.
-      By default, considered None.
-    * pool - a string indicating the pool of the machines that run the builder.
-      Emits a dimension of the form 'pool:<pool>'. By default, considered None.
-      When running a builder that has no explicit pool dimension, buildbucket
-      inserts one of the form 'pool:luci.<project>.<bucket>'.
-    * ssd - a boolean indicating whether the builder runs on machines with ssd.
-      If True, emits a 'ssd:1' dimension. If False, emits a 'ssd:0' parameter.
-      By default, considered False if builderless is considered True and
-      otherwise None.
-    * bucketed_triggers - a boolean indicating whether jobs triggered by the
-      builder being defined should have the bucket prepended to the builder name
-      to trigger. If True, the 'bucketed_triggers' field will be set in the
-      '$build/chromium_tests' property. By default, considered False.
-    * project_trigger_overrides - a dict mapping the LUCI projects declared in
-      recipe BotSpecs to the LUCI project to use when triggering builders. When
-      this builder triggers another builder, if the BotSpec for that builder has
-      a LUCI project that is a key in this mapping, the corresponding value will
-      be used instead.
-    * configure_kitchen - a boolean indicating whether to configure kitchen. If
-      True, emits a property to set the 'git_auth' and 'devshell' fields of the
-      '$kitchen' property. By default, considered False.
-    * goma_backend - a member of the `goma.backend` enum indicating the goma
-      backend the builder should use. Will be incorporated into the
-      '$build/goma' property. By default, considered None.
-    * goma_debug - a boolean indicating whether goma should be debugged. If
-      True, the 'debug' field will be set in the '$build/goma' property. By
-      default, considered False.
-    * goma_enable_ats - a boolean indicating whether ats should be enabled for
-      goma. If True, the 'enable_ats' field will be set in the '$build/goma'
-      property. By default, considered False.
-    * goma_jobs - a member of the `goma.jobs` enum indicating the number of jobs
-      to be used by the builder. Sets the 'jobs' field of the '$build/goma'
-      property will be set according to the enum member. By default, the 'jobs'
-      considered None.
-    * goma_use_luci_auth - a boolean indicating whether luci_auth should be
-      used for accessing goma backend. If True, the 'use_luci_auth' field
-      will be set in the '$build/goma' property. By default, considered False.
-    * use_clang_coverage - a boolean indicating whether clang coverage should be
-      used. If True, the 'use_clang_coverage" field will be set in the
-      '$build/code_coverage' property. By default, considered False.
-    * use_java_coverage - a boolean indicating whether java coverage should be
-      used. If True, the 'use_java_coverage" field will be set in the
-      '$build/code_coverage' property. By default, considered False.
-    * coverage_exclude_sources - a string as the key to find the source file
-      exclusion pattern in code_coverage recipe module. Will be copied to
-      '$build/code_coverage' property if set. By default, considered None.
-    * coverage_test_types - a list of string as test types to process data for
-      in code_coverage recipe module. Will be copied to '$build/code_coverage'
-      property. By default, considered None.
-    * resultdb_bigquery_exports - a list of resultdb.export_test_results(...)
-      specifying parameters for exporting test results to BigQuery. By default,
-      do not export.
-    * kwargs - Additional keyword arguments to forward on to `luci.builder`.
-  """
-  # We don't have any need of an explicit dimensions dict,
-  # instead we have individual arguments for dimensions
-  if 'dimensions' in 'kwargs':
-    fail('Explicit dimensions are not supported: '
-         + 'use builderless, cores, cpu, os or ssd instead')
+    Arguments:
+      * name - name of the builder, will show up in UIs and logs. Required.
+      * bucket - a bucket the build is in, see luci.bucket(...) rule. Required
+        (may be specified by module-level default).
+      * executable - an executable to run, e.g. a luci.recipe(...). Required (may
+        be specified by module-level default).
+      * os - a member of the `os` enum indicating the OS the builder requires for
+        the machines that run it. Emits a dimension of the form 'os:os'. By
+        default considered None.
+      * builderless - a boolean indicating whether the builder runs on builderless
+        machines. If True, emits a 'builderless:1' dimension. By default,
+        considered True iff `os` refers to a linux OS.
+      * auto_builder_dimension - a boolean indicating whether the builder runs on
+        machines devoted to the builder. If True, a dimension will be emitted of
+        the form 'builder:<name>'. By default, considered True iff `builderless`
+        is considered False.
+      * mastername - a string with the mastername of the builder. Emits a property
+        of the form 'mastername:<mastername>'. By default, considered None.
+      * cores - an int indicating the number of cores the builder requires for the
+        machines that run it. Emits a dimension of the form 'cores:<cores>' will
+        be emitted. By default, considered None.
+      * cpu - a member of the `cpu` enum indicating the cpu the builder requires
+        for the machines that run it. Emits a dimension of the form 'cpu:<cpu>'.
+        By default, considered None.
+      * pool - a string indicating the pool of the machines that run the builder.
+        Emits a dimension of the form 'pool:<pool>'. By default, considered None.
+        When running a builder that has no explicit pool dimension, buildbucket
+        inserts one of the form 'pool:luci.<project>.<bucket>'.
+      * ssd - a boolean indicating whether the builder runs on machines with ssd.
+        If True, emits a 'ssd:1' dimension. If False, emits a 'ssd:0' parameter.
+        By default, considered False if builderless is considered True and
+        otherwise None.
+      * bucketed_triggers - a boolean indicating whether jobs triggered by the
+        builder being defined should have the bucket prepended to the builder name
+        to trigger. If True, the 'bucketed_triggers' field will be set in the
+        '$build/chromium_tests' property. By default, considered False.
+      * project_trigger_overrides - a dict mapping the LUCI projects declared in
+        recipe BotSpecs to the LUCI project to use when triggering builders. When
+        this builder triggers another builder, if the BotSpec for that builder has
+        a LUCI project that is a key in this mapping, the corresponding value will
+        be used instead.
+      * configure_kitchen - a boolean indicating whether to configure kitchen. If
+        True, emits a property to set the 'git_auth' and 'devshell' fields of the
+        '$kitchen' property. By default, considered False.
+      * goma_backend - a member of the `goma.backend` enum indicating the goma
+        backend the builder should use. Will be incorporated into the
+        '$build/goma' property. By default, considered None.
+      * goma_debug - a boolean indicating whether goma should be debugged. If
+        True, the 'debug' field will be set in the '$build/goma' property. By
+        default, considered False.
+      * goma_enable_ats - a boolean indicating whether ats should be enabled for
+        goma. If True, the 'enable_ats' field will be set in the '$build/goma'
+        property. By default, considered False.
+      * goma_jobs - a member of the `goma.jobs` enum indicating the number of jobs
+        to be used by the builder. Sets the 'jobs' field of the '$build/goma'
+        property will be set according to the enum member. By default, the 'jobs'
+        considered None.
+      * goma_use_luci_auth - a boolean indicating whether luci_auth should be
+        used for accessing goma backend. If True, the 'use_luci_auth' field
+        will be set in the '$build/goma' property. By default, considered False.
+      * use_clang_coverage - a boolean indicating whether clang coverage should be
+        used. If True, the 'use_clang_coverage" field will be set in the
+        '$build/code_coverage' property. By default, considered False.
+      * use_java_coverage - a boolean indicating whether java coverage should be
+        used. If True, the 'use_java_coverage" field will be set in the
+        '$build/code_coverage' property. By default, considered False.
+      * coverage_exclude_sources - a string as the key to find the source file
+        exclusion pattern in code_coverage recipe module. Will be copied to
+        '$build/code_coverage' property if set. By default, considered None.
+      * coverage_test_types - a list of string as test types to process data for
+        in code_coverage recipe module. Will be copied to '$build/code_coverage'
+        property. By default, considered None.
+      * resultdb_bigquery_exports - a list of resultdb.export_test_results(...)
+        specifying parameters for exporting test results to BigQuery. By default,
+        do not export.
+      * kwargs - Additional keyword arguments to forward on to `luci.builder`.
+    """
 
-  dimensions = {}
+    # We don't have any need of an explicit dimensions dict,
+    # instead we have individual arguments for dimensions
+    if "dimensions" in "kwargs":
+        fail("Explicit dimensions are not supported: " +
+             "use builderless, cores, cpu, os or ssd instead")
 
-  properties = kwargs.pop('properties', {})
-  if '$kitchen' in properties:
-    fail('Setting "$kitchen" property is not supported: '
-         + 'use configure_kitchen instead')
-  if '$build/goma' in properties:
-    fail('Setting "$build/goma" property is not supported: '
-         + 'use goma_backend, goma_dbug, goma_enable_ats and goma_jobs instead')
-  if '$build/code_coverage' in properties:
-    fail('Setting "$build/code_coverage" property is not supported: '
-         + 'use use_clang_coverage, use_java_coverage, coverage_exclude_sources'
-         + ' and/or coverage_test_types instead')
-  properties = dict(properties)
+    dimensions = {}
 
-  os = defaults.get_value('os', os)
-  if os:
-    dimensions['os'] = os.dimension
+    properties = kwargs.pop("properties", {})
+    if "$kitchen" in properties:
+        fail('Setting "$kitchen" property is not supported: ' +
+             "use configure_kitchen instead")
+    if "$build/goma" in properties:
+        fail('Setting "$build/goma" property is not supported: ' +
+             "use goma_backend, goma_dbug, goma_enable_ats and goma_jobs instead")
+    if "$build/code_coverage" in properties:
+        fail('Setting "$build/code_coverage" property is not supported: ' +
+             "use use_clang_coverage, use_java_coverage, coverage_exclude_sources" +
+             " and/or coverage_test_types instead")
+    properties = dict(properties)
 
-  builderless = defaults.get_value('builderless', builderless)
-  if builderless == args.COMPUTE:
-    builderless = os != None and os.category in _DEFAULT_BUILDERLESS_OS_CATEGORIES
-  if builderless:
-    dimensions['builderless'] = '1'
+    os = defaults.get_value("os", os)
+    if os:
+        dimensions["os"] = os.dimension
 
-  auto_builder_dimension = defaults.get_value(
-      'auto_builder_dimension', auto_builder_dimension)
-  if auto_builder_dimension == args.COMPUTE:
-    auto_builder_dimension = builderless == False
-  if auto_builder_dimension:
-    dimensions['builder'] = name
+    builderless = defaults.get_value("builderless", builderless)
+    if builderless == args.COMPUTE:
+        builderless = os != None and os.category in _DEFAULT_BUILDERLESS_OS_CATEGORIES
+    if builderless:
+        dimensions["builderless"] = "1"
 
-  cores = defaults.get_value('cores', cores)
-  if cores != None:
-    dimensions['cores'] = str(cores)
+    auto_builder_dimension = defaults.get_value(
+        "auto_builder_dimension",
+        auto_builder_dimension,
+    )
+    if auto_builder_dimension == args.COMPUTE:
+        auto_builder_dimension = builderless == False
+    if auto_builder_dimension:
+        dimensions["builder"] = name
 
-  cpu = defaults.get_value('cpu', cpu)
-  if cpu != None:
-    dimensions['cpu'] = cpu
+    cores = defaults.get_value("cores", cores)
+    if cores != None:
+        dimensions["cores"] = str(cores)
 
-  mastername = defaults.get_value('mastername', mastername)
-  if mastername != None:
-    properties['mastername'] = mastername
+    cpu = defaults.get_value("cpu", cpu)
+    if cpu != None:
+        dimensions["cpu"] = cpu
 
-  pool = defaults.get_value('pool', pool)
-  if pool:
-    dimensions['pool'] = pool
+    mastername = defaults.get_value("mastername", mastername)
+    if mastername != None:
+        properties["mastername"] = mastername
 
-  ssd = defaults.get_value('ssd', ssd)
-  if ssd == args.COMPUTE:
-    ssd = False if builderless else None
-  if ssd != None:
-    dimensions['ssd'] = str(int(ssd))
+    pool = defaults.get_value("pool", pool)
+    if pool:
+        dimensions["pool"] = pool
 
-  configure_kitchen = defaults.get_value('configure_kitchen', configure_kitchen)
-  if configure_kitchen:
-    properties['$kitchen'] = {
-        'devshell': True,
-        'git_auth': True,
-    }
+    ssd = defaults.get_value("ssd", ssd)
+    if ssd == args.COMPUTE:
+        ssd = False if builderless else None
+    if ssd != None:
+        dimensions["ssd"] = str(int(ssd))
 
-  chromium_tests = _chromium_tests_property(
-      bucketed_triggers = bucketed_triggers,
-      project_trigger_overrides = project_trigger_overrides,
-  )
-  if chromium_tests != None:
-    properties['$build/chromium_tests'] = chromium_tests
+    configure_kitchen = defaults.get_value("configure_kitchen", configure_kitchen)
+    if configure_kitchen:
+        properties["$kitchen"] = {
+            "devshell": True,
+            "git_auth": True,
+        }
 
-  goma = _goma_property(
-      goma_backend = goma_backend,
-      goma_debug = goma_debug,
-      goma_enable_ats = goma_enable_ats,
-      goma_jobs = goma_jobs,
-      goma_use_luci_auth = goma_use_luci_auth,
-      os = os,
-  )
-  if goma != None:
-    properties['$build/goma'] = goma
+    chromium_tests = _chromium_tests_property(
+        bucketed_triggers = bucketed_triggers,
+        project_trigger_overrides = project_trigger_overrides,
+    )
+    if chromium_tests != None:
+        properties["$build/chromium_tests"] = chromium_tests
 
-  code_coverage = _code_coverage_property(
-      use_clang_coverage = use_clang_coverage,
-      use_java_coverage = use_java_coverage,
-      coverage_exclude_sources = coverage_exclude_sources,
-      coverage_test_types = coverage_test_types,
-  )
-  if code_coverage != None:
-    properties['$build/code_coverage'] = code_coverage
+    goma = _goma_property(
+        goma_backend = goma_backend,
+        goma_debug = goma_debug,
+        goma_enable_ats = goma_enable_ats,
+        goma_jobs = goma_jobs,
+        goma_use_luci_auth = goma_use_luci_auth,
+        os = os,
+    )
+    if goma != None:
+        properties["$build/goma"] = goma
 
-  kwargs = dict(kwargs)
-  bucket = defaults.get_value('bucket', bucket)
-  if bucket != args.COMPUTE:
-    kwargs['bucket'] = bucket
-  executable = defaults.get_value('executable', executable)
-  if executable != args.COMPUTE:
-    kwargs['executable'] = executable
-  triggered_by = defaults.get_value('triggered_by', triggered_by)
-  if triggered_by != args.COMPUTE:
-    kwargs['triggered_by'] = triggered_by
+    code_coverage = _code_coverage_property(
+        use_clang_coverage = use_clang_coverage,
+        use_java_coverage = use_java_coverage,
+        coverage_exclude_sources = coverage_exclude_sources,
+        coverage_test_types = coverage_test_types,
+    )
+    if code_coverage != None:
+        properties["$build/code_coverage"] = code_coverage
 
-  return luci.builder(
-      name = name,
-      dimensions = dimensions,
-      properties = properties,
-      resultdb_settings = resultdb.settings(
-          enable = True,
-          bq_exports = defaults.get_value(
-              'resultdb_bigquery_exports', resultdb_bigquery_exports),
-      ),
-      **kwargs
-  )
+    kwargs = dict(kwargs)
+    bucket = defaults.get_value("bucket", bucket)
+    if bucket != args.COMPUTE:
+        kwargs["bucket"] = bucket
+    executable = defaults.get_value("executable", executable)
+    if executable != args.COMPUTE:
+        kwargs["executable"] = executable
+    triggered_by = defaults.get_value("triggered_by", triggered_by)
+    if triggered_by != args.COMPUTE:
+        kwargs["triggered_by"] = triggered_by
 
+    return luci.builder(
+        name = name,
+        dimensions = dimensions,
+        properties = properties,
+        resultdb_settings = resultdb.settings(
+            enable = True,
+            bq_exports = defaults.get_value(
+                "resultdb_bigquery_exports",
+                resultdb_bigquery_exports,
+            ),
+        ),
+        **kwargs
+    )
 
-def builder_name(builder, bucket=args.DEFAULT):
-  bucket = defaults.get_value('bucket', bucket)
-  if bucket == args.COMPUTE:
-    fail('Either a default for bucket must be set or bucket must be passed in')
-  return '{}/{}'.format(bucket, builder)
-
+def builder_name(builder, bucket = args.DEFAULT):
+    bucket = defaults.get_value("bucket", bucket)
+    if bucket == args.COMPUTE:
+        fail("Either a default for bucket must be set or bucket must be passed in")
+    return "{}/{}".format(bucket, builder)
 
 builders = struct(
     builder = builder,
diff --git a/infra/config/lib/ci.star b/infra/config/lib/ci.star
index 86b40e11..d050e86e 100644
--- a/infra/config/lib/ci.star
+++ b/infra/config/lib/ci.star
@@ -12,16 +12,15 @@
 corresponding attribute on `defaults` that is a `lucicfg.var` that can be used
 to set the default value. Can also be accessed through `ci.defaults`.
 """
-load('@stdlib//internal/graph.star', 'graph')
-load('@stdlib//internal/luci/common.star', 'keys')
 
-load('//project.star', 'settings')
-load('./builders.star', 'builders')
-load('./args.star', 'args')
-
+load("@stdlib//internal/graph.star", "graph")
+load("@stdlib//internal/luci/common.star", "keys")
+load("//project.star", "settings")
+load("./builders.star", "builders")
+load("./args.star", "args")
 
 defaults = args.defaults(
-    extends=builders.defaults,
+    extends = builders.defaults,
     add_to_console_view = False,
     console_view = args.COMPUTE,
     header = None,
@@ -30,867 +29,835 @@
     repo = None,
 )
 
-
 def declare_bucket(milestone_vars):
-  luci.bucket(
-      name = milestone_vars.ci_bucket,
-      acls = [
-          acl.entry(
-              roles = acl.BUILDBUCKET_READER,
-              groups = 'all',
-          ),
-          acl.entry(
-              roles = acl.BUILDBUCKET_TRIGGERER,
-              groups = 'project-chromium-ci-schedulers',
-          ),
-          acl.entry(
-              roles = acl.BUILDBUCKET_OWNER,
-              groups = 'google/luci-task-force@google.com',
-          ),
-      ],
-  )
-
-  luci.gitiles_poller(
-      name = milestone_vars.ci_poller,
-      bucket = milestone_vars.ci_bucket,
-      repo = 'https://chromium.googlesource.com/chromium/src',
-      refs = [milestone_vars.ref],
-  )
-
-  # TODO(gbeaty) Determine what should be in each main console and define it
-  # separately
-  for name, title in (
-      (milestone_vars.main_console_name, milestone_vars.main_console_title),
-      (milestone_vars.cq_mirrors_console_name, milestone_vars.cq_mirrors_console_title)):
-    ci.overview_console_view(
-        name = name,
-        header = '//chromium-header.textpb',
-        repo = 'https://chromium.googlesource.com/chromium/src',
-        refs = [milestone_vars.ref],
-        title = title,
-        top_level_ordering = [
-            'chromium',
-            'chromium.win',
-            'chromium.mac',
-            'chromium.linux',
-            'chromium.chromiumos',
-            'chromium.android',
-            'chrome',
-            'chromium.memory',
-            'chromium.dawn',
-            'chromium.gpu',
-            'chromium.fyi',
-            'chromium.android.fyi',
-            'chromium.clang',
-            'chromium.fuzz',
-            'chromium.gpu.fyi',
-            'chromium.swangle',
+    luci.bucket(
+        name = milestone_vars.ci_bucket,
+        acls = [
+            acl.entry(
+                roles = acl.BUILDBUCKET_READER,
+                groups = "all",
+            ),
+            acl.entry(
+                roles = acl.BUILDBUCKET_TRIGGERER,
+                groups = "project-chromium-ci-schedulers",
+            ),
+            acl.entry(
+                roles = acl.BUILDBUCKET_OWNER,
+                groups = "google/luci-task-force@google.com",
+            ),
         ],
     )
 
-
-def set_defaults(milestone_vars, **kwargs):
-  default_values = dict(
-      add_to_console_view = milestone_vars.is_master,
-      bucket = milestone_vars.ci_bucket,
-      build_numbers = True,
-      configure_kitchen = True,
-      cores = 8,
-      cpu = builders.cpu.X86_64,
-      executable = 'recipe:chromium',
-      execution_timeout = 3 * time.hour,
-      header = '//chromium-header.textpb',
-      os = builders.os.LINUX_DEFAULT,
-      pool = 'luci.chromium.ci',
-      project_trigger_overrides = {'chromium': settings.project} if not settings.is_master else None,
-      repo = 'https://chromium.googlesource.com/chromium/src',
-      service_account = 'chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com',
-      swarming_tags = ['vpython:native-python-wrapper'],
-      triggered_by = [milestone_vars.ci_poller],
-  )
-  default_values.update(kwargs)
-  for k, v in default_values.items():
-    getattr(defaults, k).set(v)
-
-
-def _console_view_ordering_graph_key(console_name):
-  return graph.key('@chromium', '', 'console_view_ordering', console_name)
-
-
-def _overview_console_view_ordering_graph_key(console_name):
-  return graph.key('@chromium', '', 'overview_console_view_ordering', console_name)
-
-
-def _console_view_ordering_impl(ctx, *, console_name, ordering):
-  key = _console_view_ordering_graph_key(console_name)
-  graph.add_node(key, props = {
-      'ordering': ordering,
-  })
-  graph.add_edge(keys.project(), key)
-  return graph.keyset(key)
-
-_console_view_ordering = lucicfg.rule(impl=_console_view_ordering_impl)
-
-
-def _overview_console_view_ordering_impl(ctx, *, console_name, top_level_ordering):
-  key = _overview_console_view_ordering_graph_key(console_name)
-  graph.add_node(key, props = {
-      'top_level_ordering': top_level_ordering,
-  })
-  graph.add_edge(keys.project(), key)
-  return graph.keyset(key)
-
-_overview_console_view_ordering = lucicfg.rule(impl=_overview_console_view_ordering_impl)
-
-
-def _category_join(parent, category):
-  return '|'.join([c for c in (parent, category) if c])
-
-
-def _level_sort_key(category, ordering):
-  """Compute the key for a single level of ordering.
-
-  A key that can be used to sort categories/short names at the same
-  category nesting level.
-  """
-  for i, c in enumerate(ordering):
-    if c == category:
-      # We found the category in the ordering, so the index in the ordering is
-      # sufficient for sorting
-      return (i,)
-  # We didn't find the category, the key uses:
-  # 1. The length of the ordering so that it sorts after all the categories in
-  #    the ordering
-  # 2. The category itself, which lexicographically sorts all of the categories
-  #    that do not match the ordering
-  return (len(ordering), category)
-
-
-def _builder_sort_key(console_ordering, category, short_name, name):
-  """Compute the key for a builder.
-
-  Builders are sorted lexicographically by the sequence of category
-  components, then lexicographically by the short name, then by the
-  builder names. The ordering for the console_view modifies the sorting
-  for category components and short names for given prefixes of the
-  category component sequence. Builders with no short name will sort
-  before builders with a short name for a given category, which cannot
-  be modified by the ordering.
-
-  Returns:
-    A key that can be used to sort builder entries within the same console.
-  """
-  current_category = None
-
-  # Build the category key as a sequence of the keys for each level
-  category_key = []
-  if category:
-    for c in category.split('|'):
-      ordering = console_ordering.get(current_category, [])
-      if type(ordering) == type(''):
-        ordering = console_ordering[ordering]
-      if type(ordering) == type(struct()):
-        ordering = ordering.categories
-      category_key.append(_level_sort_key(c, ordering))
-      current_category = _category_join(current_category, c)
-
-  short_name_key = ()
-  if short_name:
-    ordering = console_ordering.get(category, [])
-    if type(ordering) == type(''):
-      ordering = console_ordering[ordering]
-    short_name_ordering = getattr(ordering, 'short_names', [])
-    short_name_key = _level_sort_key(short_name, short_name_ordering)
-
-  return (
-      category_key,
-      short_name_key,
-      name,
-  )
-
-
-def _get_console_ordering(console_name):
-  """Get the ordering dict used for sorting entries of a console_view.
-
-  Returns:
-    The ordering dict used to sort entries of the console_view with the
-    given name or None if the name does not refer to a console_view with
-    an ordering.
-  """
-  graph_key = _console_view_ordering_graph_key(console_name)
-  node = graph.node(graph_key)
-  return node.props.ordering if node != None else None
-
-
-def _get_console_view_key_fn(console_name):
-  """Get the key function for sorting entries of a console_view.
-
-  Returns:
-    The key function used to sort entries of the console_view with the
-    given name or None if the name does not refer to a console_view with
-    an ordering.
-  """
-  ordering = _get_console_ordering(console_name)
-  if ordering == None:
-    return None
-
-  def key_fn(b):
-    return _builder_sort_key(ordering, b.category, b.short_name, b.name)
-  return key_fn
-
-
-def _get_overview_console_view_key_fn(console_name):
-  """Get the key function for sorting overview_console_view entries.
-
-  Returns:
-    The key function used to sort entries of the overview_console_view
-    with the given name or None if the name does not refer to an
-    overview_console_view.
-  """
-  overview_console_ordering = graph.node(
-      _overview_console_view_ordering_graph_key(console_name))
-  if overview_console_ordering == None:
-    return None
-
-  top_level_ordering = overview_console_ordering.props.top_level_ordering
-
-  def key_fn(b):
-    if not b.category:
-      fail('Builder {} must have a category'.format(b))
-    category_components = b.category.split('|', 1)
-
-    subconsole = category_components[0]
-    subconsole_sort_key = _level_sort_key(subconsole, top_level_ordering)
-
-    builder_sort_key = ()
-    subconsole_ordering = _get_console_ordering(subconsole)
-    if subconsole_ordering != None:
-      category = ''
-      if len(category_components) > 1:
-        category = category_components[1]
-      builder_sort_key = _builder_sort_key(
-          subconsole_ordering, category, b.short_name, b.name)
-
-    return (
-        subconsole_sort_key,
-        builder_sort_key,
+    luci.gitiles_poller(
+        name = milestone_vars.ci_poller,
+        bucket = milestone_vars.ci_bucket,
+        repo = "https://chromium.googlesource.com/chromium/src",
+        refs = [milestone_vars.ref],
     )
 
-  return key_fn
+    # TODO(gbeaty) Determine what should be in each main console and define it
+    # separately
+    for name, title in (
+        (milestone_vars.main_console_name, milestone_vars.main_console_title),
+        (milestone_vars.cq_mirrors_console_name, milestone_vars.cq_mirrors_console_title),
+    ):
+        ci.overview_console_view(
+            name = name,
+            header = "//chromium-header.textpb",
+            repo = "https://chromium.googlesource.com/chromium/src",
+            refs = [milestone_vars.ref],
+            title = title,
+            top_level_ordering = [
+                "chromium",
+                "chromium.win",
+                "chromium.mac",
+                "chromium.linux",
+                "chromium.chromiumos",
+                "chromium.android",
+                "chrome",
+                "chromium.memory",
+                "chromium.dawn",
+                "chromium.gpu",
+                "chromium.fyi",
+                "chromium.android.fyi",
+                "chromium.clang",
+                "chromium.fuzz",
+                "chromium.gpu.fyi",
+                "chromium.swangle",
+            ],
+        )
 
+def set_defaults(milestone_vars, **kwargs):
+    default_values = dict(
+        add_to_console_view = milestone_vars.is_master,
+        bucket = milestone_vars.ci_bucket,
+        build_numbers = True,
+        configure_kitchen = True,
+        cores = 8,
+        cpu = builders.cpu.X86_64,
+        executable = "recipe:chromium",
+        execution_timeout = 3 * time.hour,
+        header = "//chromium-header.textpb",
+        os = builders.os.LINUX_DEFAULT,
+        pool = "luci.chromium.ci",
+        project_trigger_overrides = {"chromium": settings.project} if not settings.is_master else None,
+        repo = "https://chromium.googlesource.com/chromium/src",
+        service_account = "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com",
+        swarming_tags = ["vpython:native-python-wrapper"],
+        triggered_by = [milestone_vars.ci_poller],
+    )
+    default_values.update(kwargs)
+    for k, v in default_values.items():
+        getattr(defaults, k).set(v)
+
+def _console_view_ordering_graph_key(console_name):
+    return graph.key("@chromium", "", "console_view_ordering", console_name)
+
+def _overview_console_view_ordering_graph_key(console_name):
+    return graph.key("@chromium", "", "overview_console_view_ordering", console_name)
+
+def _console_view_ordering_impl(ctx, *, console_name, ordering):
+    key = _console_view_ordering_graph_key(console_name)
+    graph.add_node(key, props = {
+        "ordering": ordering,
+    })
+    graph.add_edge(keys.project(), key)
+    return graph.keyset(key)
+
+_console_view_ordering = lucicfg.rule(impl = _console_view_ordering_impl)
+
+def _overview_console_view_ordering_impl(ctx, *, console_name, top_level_ordering):
+    key = _overview_console_view_ordering_graph_key(console_name)
+    graph.add_node(key, props = {
+        "top_level_ordering": top_level_ordering,
+    })
+    graph.add_edge(keys.project(), key)
+    return graph.keyset(key)
+
+_overview_console_view_ordering = lucicfg.rule(impl = _overview_console_view_ordering_impl)
+
+def _category_join(parent, category):
+    return "|".join([c for c in (parent, category) if c])
+
+def _level_sort_key(category, ordering):
+    """Compute the key for a single level of ordering.
+
+    A key that can be used to sort categories/short names at the same
+    category nesting level.
+    """
+    for i, c in enumerate(ordering):
+        if c == category:
+            # We found the category in the ordering, so the index in the ordering is
+            # sufficient for sorting
+            return (i,)
+
+    # We didn't find the category, the key uses:
+    # 1. The length of the ordering so that it sorts after all the categories in
+    #    the ordering
+    # 2. The category itself, which lexicographically sorts all of the categories
+    #    that do not match the ordering
+    return (len(ordering), category)
+
+def _builder_sort_key(console_ordering, category, short_name, name):
+    """Compute the key for a builder.
+
+    Builders are sorted lexicographically by the sequence of category
+    components, then lexicographically by the short name, then by the
+    builder names. The ordering for the console_view modifies the sorting
+    for category components and short names for given prefixes of the
+    category component sequence. Builders with no short name will sort
+    before builders with a short name for a given category, which cannot
+    be modified by the ordering.
+
+    Returns:
+      A key that can be used to sort builder entries within the same console.
+    """
+    current_category = None
+
+    # Build the category key as a sequence of the keys for each level
+    category_key = []
+    if category:
+        for c in category.split("|"):
+            ordering = console_ordering.get(current_category, [])
+            if type(ordering) == type(""):
+                ordering = console_ordering[ordering]
+            if type(ordering) == type(struct()):
+                ordering = ordering.categories
+            category_key.append(_level_sort_key(c, ordering))
+            current_category = _category_join(current_category, c)
+
+    short_name_key = ()
+    if short_name:
+        ordering = console_ordering.get(category, [])
+        if type(ordering) == type(""):
+            ordering = console_ordering[ordering]
+        short_name_ordering = getattr(ordering, "short_names", [])
+        short_name_key = _level_sort_key(short_name, short_name_ordering)
+
+    return (
+        category_key,
+        short_name_key,
+        name,
+    )
+
+def _get_console_ordering(console_name):
+    """Get the ordering dict used for sorting entries of a console_view.
+
+    Returns:
+      The ordering dict used to sort entries of the console_view with the
+      given name or None if the name does not refer to a console_view with
+      an ordering.
+    """
+    graph_key = _console_view_ordering_graph_key(console_name)
+    node = graph.node(graph_key)
+    return node.props.ordering if node != None else None
+
+def _get_console_view_key_fn(console_name):
+    """Get the key function for sorting entries of a console_view.
+
+    Returns:
+      The key function used to sort entries of the console_view with the
+      given name or None if the name does not refer to a console_view with
+      an ordering.
+    """
+    ordering = _get_console_ordering(console_name)
+    if ordering == None:
+        return None
+
+    def key_fn(b):
+        return _builder_sort_key(ordering, b.category, b.short_name, b.name)
+
+    return key_fn
+
+def _get_overview_console_view_key_fn(console_name):
+    """Get the key function for sorting overview_console_view entries.
+
+    Returns:
+      The key function used to sort entries of the overview_console_view
+      with the given name or None if the name does not refer to an
+      overview_console_view.
+    """
+    overview_console_ordering = graph.node(
+        _overview_console_view_ordering_graph_key(console_name),
+    )
+    if overview_console_ordering == None:
+        return None
+
+    top_level_ordering = overview_console_ordering.props.top_level_ordering
+
+    def key_fn(b):
+        if not b.category:
+            fail("Builder {} must have a category".format(b))
+        category_components = b.category.split("|", 1)
+
+        subconsole = category_components[0]
+        subconsole_sort_key = _level_sort_key(subconsole, top_level_ordering)
+
+        builder_sort_key = ()
+        subconsole_ordering = _get_console_ordering(subconsole)
+        if subconsole_ordering != None:
+            category = ""
+            if len(category_components) > 1:
+                category = category_components[1]
+            builder_sort_key = _builder_sort_key(
+                subconsole_ordering,
+                category,
+                b.short_name,
+                b.name,
+            )
+
+        return (
+            subconsole_sort_key,
+            builder_sort_key,
+        )
+
+    return key_fn
 
 def _sort_console_entries(ctx):
-  milo = ctx.output['luci-milo.cfg']
-  consoles = []
-  for console in milo.consoles:
-    if not console.builders:
-      continue
-    key_fn = (_get_console_view_key_fn(console.id)
-              or _get_overview_console_view_key_fn(console.id))
-    if key_fn:
-      console.builders = sorted(console.builders, key_fn)
-    consoles.append(console)
+    milo = ctx.output["luci-milo.cfg"]
+    consoles = []
+    for console in milo.consoles:
+        if not console.builders:
+            continue
+        key_fn = (_get_console_view_key_fn(console.id) or
+                  _get_overview_console_view_key_fn(console.id))
+        if key_fn:
+            console.builders = sorted(console.builders, key_fn)
+        consoles.append(console)
 
 lucicfg.generator(_sort_console_entries)
 
+def ordering(*, short_names = None, categories = None):
+    """Specifies the sorting behavior for a category.
 
-def ordering(*, short_names=None, categories=None):
-  """Specifies the sorting behavior for a category.
+    Args:
+      short_names - A list of strings that specifies the order short names
+        should appear for builders in the same category. Builders without
+        short names will appear before all others and builders with short
+        names that do not appear in the list will be sorted
+        lexicographically after short names that do appear in the list. By
+        default, short names are sorted lexicographically.
+      categories - A list of strings that specifies the order the next
+        category component should appear for builders with matching
+        category prefix. Builders without any additional category
+        components will appear before all others and builders whose next
+        category component do not appear in the list will be sorted
+        lexicographically by the next category component. By default, the
+        next category components are sorted lexicographically.
+    """
+    return struct(
+        short_names = short_names or [],
+        categories = categories or [],
+    )
 
-  Args:
-    short_names - A list of strings that specifies the order short names
-      should appear for builders in the same category. Builders without
-      short names will appear before all others and builders with short
-      names that do not appear in the list will be sorted
-      lexicographically after short names that do appear in the list. By
-      default, short names are sorted lexicographically.
-    categories - A list of strings that specifies the order the next
-      category component should appear for builders with matching
-      category prefix. Builders without any additional category
-      components will appear before all others and builders whose next
-      category component do not appear in the list will be sorted
-      lexicographically by the next category component. By default, the
-      next category components are sorted lexicographically.
-  """
-  return struct(
-      short_names = short_names or [],
-      categories = categories or [],
-  )
+def console_view(*, name, ordering = None, **kwargs):
+    """Create a console view, optionally providing an entry ordering.
 
+    Args:
+      name - The name of the console view.
+      ordering - A dictionary defining the ordering of categories for the
+        console. If not provided, the console will not be sorted.
 
-def console_view(*, name, ordering=None, **kwargs):
-  """Create a console view, optionally providing an entry ordering.
+        The keys of the dictionary indicate the category that the values
+        applies the sorting to and can take one of two forms:
+        1.  None: Controls the ordering of the top-level categories and/or
+            the short names of builders that have no category.
+        2.  str: Category string to apply the ordering to the next nested
+            level of categories and/or the short names of builders with
+            that category. Arbitrary strings can be used also, which can
+            be used as aliases for other entries to refer to.
 
-  Args:
-    name - The name of the console view.
-    ordering - A dictionary defining the ordering of categories for the
-      console. If not provided, the console will not be sorted.
+        The value for each entry defines the ordering to be applied to
+        builders that have matched the sequence of category components
+        identified by the key and can take one of two forms:
+        1.  struct created using `ci.ordering`: See `ci.ordering` for
+            details.
+        2.  list of category components: Equivalent to a `ci.ordering`
+            call that only specifies `categories` with the given list.
+        3.  str: An alias for another category. The string must be another
+            key in the dict. The ordering will be looked up by that key
+            instead.
+      kwargs - Additional keyword arguments to forward on to
+        `luci.console_view`. The header and repo arguments support
+         module-level defaults.
+    """
+    kwargs["header"] = defaults.get_value_from_kwargs("header", kwargs)
+    kwargs["repo"] = defaults.get_value_from_kwargs("repo", kwargs)
+    luci.console_view(
+        name = name,
+        **kwargs
+    )
 
-      The keys of the dictionary indicate the category that the values
-      applies the sorting to and can take one of two forms:
-      1.  None: Controls the ordering of the top-level categories and/or
-          the short names of builders that have no category.
-      2.  str: Category string to apply the ordering to the next nested
-          level of categories and/or the short names of builders with
-          that category. Arbitrary strings can be used also, which can
-          be used as aliases for other entries to refer to.
-
-      The value for each entry defines the ordering to be applied to
-      builders that have matched the sequence of category components
-      identified by the key and can take one of two forms:
-      1.  struct created using `ci.ordering`: See `ci.ordering` for
-          details.
-      2.  list of category components: Equivalent to a `ci.ordering`
-          call that only specifies `categories` with the given list.
-      3.  str: An alias for another category. The string must be another
-          key in the dict. The ordering will be looked up by that key
-          instead.
-    kwargs - Additional keyword arguments to forward on to
-      `luci.console_view`. The header and repo arguments support
-       module-level defaults.
-  """
-  kwargs['header'] = defaults.get_value_from_kwargs('header', kwargs)
-  kwargs['repo'] = defaults.get_value_from_kwargs('repo', kwargs)
-  luci.console_view(
-      name = name,
-      **kwargs
-  )
-
-  _console_view_ordering(
-      console_name = name,
-      ordering = ordering or {},
-  )
-
+    _console_view_ordering(
+        console_name = name,
+        ordering = ordering or {},
+    )
 
 def overview_console_view(*, name, top_level_ordering, **kwargs):
-  """Create an overview console view.
+    """Create an overview console view.
 
-  An overview console view is a console view that contains a subset of
-  entries from other consoles. The entries from each console will have
-  that console's name prepended to the entries' categories and will
-  appear in the same order as they do in that console. The ordering of
-  entries from different consoles is controlled by the
-  `top_level_ordering` parameter.
+    An overview console view is a console view that contains a subset of
+    entries from other consoles. The entries from each console will have
+    that console's name prepended to the entries' categories and will
+    appear in the same order as they do in that console. The ordering of
+    entries from different consoles is controlled by the
+    `top_level_ordering` parameter.
 
-  Args:
-    name - The name of the console view.
-    top_level_ordering - A list of strings defining the order that
-      entries from different consoles will appear. Entries will be
-      sorted by the name of the console they come from, appearing in the
-      same order as in top_level_ordering. Entries from consoles whose
-      name does not appear in the list will be sorted lexicographically
-      by the console name and appear after entries whose console does
-      appear in the list.
-    kwargs - Additional keyword arguments to forward on to
-      `luci.console_view`. The header and repo arguments support
-       module-level defaults.
-  """
-  kwargs['header'] = defaults.get_value_from_kwargs('header', kwargs)
-  kwargs['repo'] = defaults.get_value_from_kwargs('repo', kwargs)
-  luci.console_view(
-      name = name,
-      **kwargs
-  )
+    Args:
+      name - The name of the console view.
+      top_level_ordering - A list of strings defining the order that
+        entries from different consoles will appear. Entries will be
+        sorted by the name of the console they come from, appearing in the
+        same order as in top_level_ordering. Entries from consoles whose
+        name does not appear in the list will be sorted lexicographically
+        by the console name and appear after entries whose console does
+        appear in the list.
+      kwargs - Additional keyword arguments to forward on to
+        `luci.console_view`. The header and repo arguments support
+         module-level defaults.
+    """
+    kwargs["header"] = defaults.get_value_from_kwargs("header", kwargs)
+    kwargs["repo"] = defaults.get_value_from_kwargs("repo", kwargs)
+    luci.console_view(
+        name = name,
+        **kwargs
+    )
 
-  _overview_console_view_ordering(
-      console_name = name,
-      top_level_ordering = top_level_ordering,
-  )
+    _overview_console_view_ordering(
+        console_name = name,
+        top_level_ordering = top_level_ordering,
+    )
 
+def console_view_entry(*, category = None, short_name = None):
+    """Specifies the details of a console view entry.
 
-def console_view_entry(*, category=None, short_name=None):
-  """Specifies the details of a console view entry.
+    See https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/master/lucicfg/doc/README.md#luci.console_view_entry
+    for details on the arguments.
 
-  See https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/master/lucicfg/doc/README.md#luci.console_view_entry
-  for details on the arguments.
-
-  Returns:
-    A struct that can be passed to the `console_view_entry` argument of
-    `ci.builder` to add an entry to the console for the builder's
-    mastername.
-  """
-  return struct(
-      category = category,
-      short_name = short_name,
-  )
-
+    Returns:
+      A struct that can be passed to the `console_view_entry` argument of
+      `ci.builder` to add an entry to the console for the builder's
+      mastername.
+    """
+    return struct(
+        category = category,
+        short_name = short_name,
+    )
 
 def ci_builder(
-    *,
-    name,
-    add_to_console_view=args.DEFAULT,
-    console_view=args.DEFAULT,
-    main_console_view=args.DEFAULT,
-    cq_mirrors_console_view=args.DEFAULT,
-    console_view_entry=None,
-    tree_closing=False,
-    notifies=None,
-    **kwargs):
-  """Define a CI builder.
+        *,
+        name,
+        add_to_console_view = args.DEFAULT,
+        console_view = args.DEFAULT,
+        main_console_view = args.DEFAULT,
+        cq_mirrors_console_view = args.DEFAULT,
+        console_view_entry = None,
+        tree_closing = False,
+        notifies = None,
+        **kwargs):
+    """Define a CI builder.
 
-  Arguments:
-    name - name of the builder, will show up in UIs and logs. Required.
-    add_to_console_view - A bool indicating whether an entry should be
-      created for the builder in the console identified by
-      `console_view`. Supports a module-level default that defaults to
-      False.
-    console_view - A string identifying the ID of the console view to
-      add an entry to. Supports a module-level default that defaults to
-      the mastername of the builder, if provided. An entry will be added
-      only if `add_to_console_view` is True and `console_view_entry` is
-      provided.
-    main_console_view - A string identifying the ID of the main console
-      view to add an entry to. Supports a module-level default that
-      defaults to None. An entry will be added only if
-      `console_view_entry` is provided. Note that `add_to_console_view`
-      has no effect on creating an entry to the main console view.
-    cq_mirrors_console_view - A string identifying the ID of the CQ
-      mirrors console view to add an entry to. Supports a module-level
-      default that defaults to None. An entry will be added only if
-      `console_view_entry` is provided. Note that `add_to_console_view`
-      has no effect on creating an entry to the main console view.
-    console_view_entry - A structure providing the details of the entry
-      to add to the console view. See `ci.console_view_entry` for details.
-    tree_closing - If true, failed builds from this builder that meet certain
-      criteria will close the tree and email the sheriff. See the
-      'chromium-tree-closer' config in notifiers.star for the full criteria.
-    notifies - Any extra notifiers to attach to this builder.
-  """
+    Arguments:
+      name - name of the builder, will show up in UIs and logs. Required.
+      add_to_console_view - A bool indicating whether an entry should be
+        created for the builder in the console identified by
+        `console_view`. Supports a module-level default that defaults to
+        False.
+      console_view - A string identifying the ID of the console view to
+        add an entry to. Supports a module-level default that defaults to
+        the mastername of the builder, if provided. An entry will be added
+        only if `add_to_console_view` is True and `console_view_entry` is
+        provided.
+      main_console_view - A string identifying the ID of the main console
+        view to add an entry to. Supports a module-level default that
+        defaults to None. An entry will be added only if
+        `console_view_entry` is provided. Note that `add_to_console_view`
+        has no effect on creating an entry to the main console view.
+      cq_mirrors_console_view - A string identifying the ID of the CQ
+        mirrors console view to add an entry to. Supports a module-level
+        default that defaults to None. An entry will be added only if
+        `console_view_entry` is provided. Note that `add_to_console_view`
+        has no effect on creating an entry to the main console view.
+      console_view_entry - A structure providing the details of the entry
+        to add to the console view. See `ci.console_view_entry` for details.
+      tree_closing - If true, failed builds from this builder that meet certain
+        criteria will close the tree and email the sheriff. See the
+        'chromium-tree-closer' config in notifiers.star for the full criteria.
+      notifies - Any extra notifiers to attach to this builder.
+    """
 
-  # Branch builders should never close the tree, only builders from the main
-  # "ci" bucket.
-  bucket = defaults.get_value_from_kwargs('bucket', kwargs)
-  if tree_closing and bucket == 'ci':
-    notifies = (notifies or []) + ['chromium-tree-closer', 'chromium-tree-closer-email']
+    # Branch builders should never close the tree, only builders from the main
+    # "ci" bucket.
+    bucket = defaults.get_value_from_kwargs("bucket", kwargs)
+    if tree_closing and bucket == "ci":
+        notifies = (notifies or []) + ["chromium-tree-closer", "chromium-tree-closer-email"]
 
-  # Define the builder first so that any validation of luci.builder arguments
-  # (e.g. bucket) occurs before we try to use it
-  ret = builders.builder(
-      name = name,
-      resultdb_bigquery_exports = [resultdb.export_test_results(
-          bq_table = 'luci-resultdb.chromium.ci_test_results',
-      )],
-      notifies = notifies,
-      **kwargs
-  )
+    # Define the builder first so that any validation of luci.builder arguments
+    # (e.g. bucket) occurs before we try to use it
+    ret = builders.builder(
+        name = name,
+        resultdb_bigquery_exports = [resultdb.export_test_results(
+            bq_table = "luci-resultdb.chromium.ci_test_results",
+        )],
+        notifies = notifies,
+        **kwargs
+    )
 
-  if console_view_entry:
-    console_view = defaults.get_value('console_view', console_view)
-    if console_view == args.COMPUTE:
-      console_view = defaults.get_value_from_kwargs('mastername', kwargs)
+    if console_view_entry:
+        console_view = defaults.get_value("console_view", console_view)
+        if console_view == args.COMPUTE:
+            console_view = defaults.get_value_from_kwargs("mastername", kwargs)
 
-    if console_view:
-      add_to_console_view = defaults.get_value(
-          'add_to_console_view', add_to_console_view)
+        if console_view:
+            add_to_console_view = defaults.get_value(
+                "add_to_console_view",
+                add_to_console_view,
+            )
 
-      builder = '{}/{}'.format(bucket, name)
+            builder = "{}/{}".format(bucket, name)
 
-      if add_to_console_view:
-        luci.console_view_entry(
-            builder = builder,
-            console_view = console_view,
-            category = console_view_entry.category,
-            short_name = console_view_entry.short_name,
-        )
+            if add_to_console_view:
+                luci.console_view_entry(
+                    builder = builder,
+                    console_view = console_view,
+                    category = console_view_entry.category,
+                    short_name = console_view_entry.short_name,
+                )
 
-      main_console_view = defaults.get_value('main_console_view', main_console_view)
-      if main_console_view:
-        luci.console_view_entry(
-            builder = builder,
-            console_view = main_console_view,
-            category = '|'.join([console_view, console_view_entry.category]),
-            short_name = console_view_entry.short_name,
-        )
+            main_console_view = defaults.get_value("main_console_view", main_console_view)
+            if main_console_view:
+                luci.console_view_entry(
+                    builder = builder,
+                    console_view = main_console_view,
+                    category = "|".join([console_view, console_view_entry.category]),
+                    short_name = console_view_entry.short_name,
+                )
 
-      cq_mirrors_console_view = defaults.get_value(
-          'cq_mirrors_console_view', cq_mirrors_console_view)
-      if cq_mirrors_console_view:
-        luci.console_view_entry(
-            builder = builder,
-            console_view = cq_mirrors_console_view,
-            category = '|'.join([console_view, console_view_entry.category]),
-            short_name = console_view_entry.short_name,
-        )
+            cq_mirrors_console_view = defaults.get_value(
+                "cq_mirrors_console_view",
+                cq_mirrors_console_view,
+            )
+            if cq_mirrors_console_view:
+                luci.console_view_entry(
+                    builder = builder,
+                    console_view = cq_mirrors_console_view,
+                    category = "|".join([console_view, console_view_entry.category]),
+                    short_name = console_view_entry.short_name,
+                )
 
-  return ret
-
+    return ret
 
 def android_builder(
-    *,
-    name,
-    # TODO(tandrii): migrate to this gradually (current value of
-    # goma.jobs.MANY_JOBS_FOR_CI is 500).
-    # goma_jobs=goma.jobs.MANY_JOBS_FOR_CI
-    goma_jobs=builders.goma.jobs.J150,
-    **kwargs):
-  return ci_builder(
-      name = name,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      goma_jobs = goma_jobs,
-      mastername = 'chromium.android',
-      **kwargs
-  )
-
+        *,
+        name,
+        # TODO(tandrii): migrate to this gradually (current value of
+        # goma.jobs.MANY_JOBS_FOR_CI is 500).
+        # goma_jobs=goma.jobs.MANY_JOBS_FOR_CI
+        goma_jobs = builders.goma.jobs.J150,
+        **kwargs):
+    return ci_builder(
+        name = name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        goma_jobs = goma_jobs,
+        mastername = "chromium.android",
+        **kwargs
+    )
 
 def android_fyi_builder(*, name, **kwargs):
-  return ci_builder(
-      name = name,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      mastername = 'chromium.android.fyi',
-      **kwargs
-  )
+    return ci_builder(
+        name = name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        mastername = "chromium.android.fyi",
+        **kwargs
+    )
 
+def chromium_builder(*, name, tree_closing = True, **kwargs):
+    return ci_builder(
+        name = name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        mastername = "chromium",
+        tree_closing = tree_closing,
+        **kwargs
+    )
 
-def chromium_builder(*, name, tree_closing=True, **kwargs):
-  return ci_builder(
-      name = name,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      mastername = 'chromium',
-      tree_closing = tree_closing,
-      **kwargs
-  )
+def chromiumos_builder(*, name, tree_closing = True, **kwargs):
+    return ci_builder(
+        name = name,
+        mastername = "chromium.chromiumos",
+        goma_backend = builders.goma.backend.RBE_PROD,
+        tree_closing = tree_closing,
+        **kwargs
+    )
 
+def clang_builder(*, name, builderless = True, cores = 32, properties = None, **kwargs):
+    properties = properties or {}
+    properties.update({
+        "perf_dashboard_machine_group": "ChromiumClang",
+    })
+    return ci_builder(
+        name = name,
+        builderless = builderless,
+        cores = cores,
+        # Because these run ToT Clang, goma is not used.
+        # Naturally the runtime will be ~4-8h on average, depending on config.
+        # CFI builds will take even longer - around 11h.
+        execution_timeout = 12 * time.hour,
+        mastername = "chromium.clang",
+        properties = properties,
+        **kwargs
+    )
 
-def chromiumos_builder(*, name, tree_closing=True, **kwargs):
-  return ci_builder(
-      name = name,
-      mastername = 'chromium.chromiumos',
-      goma_backend = builders.goma.backend.RBE_PROD,
-      tree_closing = tree_closing,
-      **kwargs
-  )
+def clang_mac_builder(*, name, cores = 24, **kwargs):
+    return clang_builder(
+        name = name,
+        cores = cores,
+        os = builders.os.MAC_10_14,
+        ssd = True,
+        properties = {
+            "xcode_build_version": "11a1027",
+        },
+        **kwargs
+    )
 
-
-def clang_builder(*, name, builderless=True, cores=32, properties=None, **kwargs):
-  properties = properties or {}
-  properties.update({
-    'perf_dashboard_machine_group': 'ChromiumClang',
-  })
-  return ci_builder(
-      name = name,
-      builderless = builderless,
-      cores = cores,
-      # Because these run ToT Clang, goma is not used.
-      # Naturally the runtime will be ~4-8h on average, depending on config.
-      # CFI builds will take even longer - around 11h.
-      execution_timeout = 12 * time.hour,
-      mastername = 'chromium.clang',
-      properties = properties,
-      **kwargs
-  )
-
-
-def clang_mac_builder(*, name, cores=24, **kwargs):
-  return clang_builder(
-      name = name,
-      cores = cores,
-      os = builders.os.MAC_10_14,
-      ssd = True,
-      properties = {
-          'xcode_build_version': '11a1027',
-      },
-      **kwargs
-  )
-
-
-def dawn_builder(*, name, builderless=True, **kwargs):
-  return ci.builder(
-      name = name,
-      builderless = builderless,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      mastername = 'chromium.dawn',
-      service_account =
-      'chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com',
-      **kwargs
-  )
-
+def dawn_builder(*, name, builderless = True, **kwargs):
+    return ci.builder(
+        name = name,
+        builderless = builderless,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        mastername = "chromium.dawn",
+        service_account =
+            "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com",
+        **kwargs
+    )
 
 def fuzz_builder(*, name, **kwargs):
-  return ci.builder(
-      name = name,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      mastername = 'chromium.fuzz',
-      notifies = ['chromesec-lkgr-failures'],
-      **kwargs
-  )
-
+    return ci.builder(
+        name = name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        mastername = "chromium.fuzz",
+        notifies = ["chromesec-lkgr-failures"],
+        **kwargs
+    )
 
 def fuzz_libfuzzer_builder(*, name, **kwargs):
-  return fuzz_builder(
-      name = name,
-      executable = 'recipe:chromium_libfuzzer',
-      **kwargs
-  )
-
+    return fuzz_builder(
+        name = name,
+        executable = "recipe:chromium_libfuzzer",
+        **kwargs
+    )
 
 def fyi_builder(
-    *,
-    name,
-    execution_timeout=10 * time.hour,
-    goma_backend=builders.goma.backend.RBE_PROD,
-    **kwargs):
-  return ci.builder(
-      name = name,
-      execution_timeout = execution_timeout,
-      goma_backend = goma_backend,
-      mastername = 'chromium.fyi',
-      **kwargs
-  )
-
+        *,
+        name,
+        execution_timeout = 10 * time.hour,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        **kwargs):
+    return ci.builder(
+        name = name,
+        execution_timeout = execution_timeout,
+        goma_backend = goma_backend,
+        mastername = "chromium.fyi",
+        **kwargs
+    )
 
 def fyi_celab_builder(*, name, **kwargs):
-  return ci.builder(
-      name = name,
-      mastername = 'chromium.fyi',
-      os = builders.os.WINDOWS_ANY,
-      executable = 'recipe:celab',
-      goma_backend = builders.goma.backend.RBE_PROD,
-      properties = {
-          'exclude': 'chrome_only',
-          'pool_name': 'celab-chromium-ci',
-          'pool_size': 20,
-          'tests': '*',
-      },
-      **kwargs
-  )
-
+    return ci.builder(
+        name = name,
+        mastername = "chromium.fyi",
+        os = builders.os.WINDOWS_ANY,
+        executable = "recipe:celab",
+        goma_backend = builders.goma.backend.RBE_PROD,
+        properties = {
+            "exclude": "chrome_only",
+            "pool_name": "celab-chromium-ci",
+            "pool_size": 20,
+            "tests": "*",
+        },
+        **kwargs
+    )
 
 def fyi_coverage_builder(
-    *,
-    name,
-    cores=32,
-    ssd=True,
-    execution_timeout=20 * time.hour,
-    **kwargs):
-  return fyi_builder(
-      name = name,
-      cores = cores,
-      ssd=ssd,
-      execution_timeout = execution_timeout,
-      **kwargs
-  )
-
+        *,
+        name,
+        cores = 32,
+        ssd = True,
+        execution_timeout = 20 * time.hour,
+        **kwargs):
+    return fyi_builder(
+        name = name,
+        cores = cores,
+        ssd = ssd,
+        execution_timeout = execution_timeout,
+        **kwargs
+    )
 
 def fyi_ios_builder(
-    *,
-    name,
-    caches = None,
-    executable='recipe:ios/unified_builder_tester',
-    goma_backend=builders.goma.backend.RBE_PROD,
-    os = builders.os.MAC_10_15,
-    **kwargs):
+        *,
+        name,
+        caches = None,
+        executable = "recipe:ios/unified_builder_tester",
+        goma_backend = builders.goma.backend.RBE_PROD,
+        os = builders.os.MAC_10_15,
+        **kwargs):
+    if not caches:
+        caches = [builders.xcode_cache.x11e146]
 
-  if not caches:
-    caches = [builders.xcode_cache.x11e146]
-
-  return fyi_builder(
-      name = name,
-      caches = caches,
-      cores = None,
-      executable = executable,
-      os = os,
-      **kwargs
-  )
-
+    return fyi_builder(
+        name = name,
+        caches = caches,
+        cores = None,
+        executable = executable,
+        os = os,
+        **kwargs
+    )
 
 def fyi_mac_builder(
-    *,
-    name,
-    cores=4,
-    os=builders.os.MAC_DEFAULT,
-    **kwargs):
-  return fyi_builder(
-      name = name,
-      cores = cores,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      os = os,
-      **kwargs
-  )
-
+        *,
+        name,
+        cores = 4,
+        os = builders.os.MAC_DEFAULT,
+        **kwargs):
+    return fyi_builder(
+        name = name,
+        cores = cores,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        os = os,
+        **kwargs
+    )
 
 def fyi_windows_builder(
-    *,
-    name,
-    os=builders.os.WINDOWS_DEFAULT,
-    **kwargs):
-  return fyi_builder(
-      name = name,
-      os = os,
-      **kwargs
-  )
-
+        *,
+        name,
+        os = builders.os.WINDOWS_DEFAULT,
+        **kwargs):
+    return fyi_builder(
+        name = name,
+        os = os,
+        **kwargs
+    )
 
 def gpu_fyi_builder(*, name, **kwargs):
-  return ci.builder(
-      name = name,
-      mastername = 'chromium.gpu.fyi',
-      service_account =
-      'chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com',
-      **kwargs
-  )
-
+    return ci.builder(
+        name = name,
+        mastername = "chromium.gpu.fyi",
+        service_account =
+            "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com",
+        **kwargs
+    )
 
 def gpu_fyi_linux_builder(
-    *,
-    name,
-    execution_timeout=6 * time.hour,
-    goma_backend=builders.goma.backend.RBE_PROD,
-    **kwargs):
-  return gpu_fyi_builder(
-      name = name,
-      execution_timeout = execution_timeout,
-      goma_backend = goma_backend,
-      **kwargs
-  )
-
+        *,
+        name,
+        execution_timeout = 6 * time.hour,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        **kwargs):
+    return gpu_fyi_builder(
+        name = name,
+        execution_timeout = execution_timeout,
+        goma_backend = goma_backend,
+        **kwargs
+    )
 
 def gpu_fyi_mac_builder(*, name, **kwargs):
-  return gpu_fyi_builder(
-      name = name,
-      cores = 4,
-      execution_timeout = 6 * time.hour,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      os = builders.os.MAC_ANY,
-      **kwargs
-  )
-
+    return gpu_fyi_builder(
+        name = name,
+        cores = 4,
+        execution_timeout = 6 * time.hour,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        os = builders.os.MAC_ANY,
+        **kwargs
+    )
 
 # Many of the GPU testers are thin testers, they use linux VMS regardless of the
 # actual OS that the tests are built for
 def gpu_fyi_thin_tester(
-    *,
-    name,
-    execution_timeout=6 * time.hour,
-    **kwargs):
-  return gpu_fyi_linux_builder(
-      name = name,
-      cores = 2,
-      execution_timeout = execution_timeout,
-      # Setting goma_backend for testers is a no-op, but better to be explicit
-      # here and also leave the generated configs unchanged for these testers.
-      goma_backend = None,
-      **kwargs
-  )
-
+        *,
+        name,
+        execution_timeout = 6 * time.hour,
+        **kwargs):
+    return gpu_fyi_linux_builder(
+        name = name,
+        cores = 2,
+        execution_timeout = execution_timeout,
+        # Setting goma_backend for testers is a no-op, but better to be explicit
+        # here and also leave the generated configs unchanged for these testers.
+        goma_backend = None,
+        **kwargs
+    )
 
 def gpu_fyi_windows_builder(*, name, **kwargs):
-  return gpu_fyi_builder(
-      name = name,
-      builderless = True,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      os = builders.os.WINDOWS_ANY,
-      **kwargs
-  )
+    return gpu_fyi_builder(
+        name = name,
+        builderless = True,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        os = builders.os.WINDOWS_ANY,
+        **kwargs
+    )
 
-
-def gpu_builder(*, name, tree_closing=True, notifies=None, **kwargs):
-  if tree_closing:
-    notifies = (notifies or []) + ['gpu-tree-closer-email']
-  return ci.builder(
-      name = name,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      mastername = 'chromium.gpu',
-      tree_closing = tree_closing,
-      notifies = notifies,
-      **kwargs
-  )
+def gpu_builder(*, name, tree_closing = True, notifies = None, **kwargs):
+    if tree_closing:
+        notifies = (notifies or []) + ["gpu-tree-closer-email"]
+    return ci.builder(
+        name = name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        mastername = "chromium.gpu",
+        tree_closing = tree_closing,
+        notifies = notifies,
+        **kwargs
+    )
 
 # Many of the GPU testers are thin testers, they use linux VMS regardless of the
 # actual OS that the tests are built for
-def gpu_thin_tester(*, name, tree_closing=True, **kwargs):
-  return gpu_builder(
-      name = name,
-      cores = 2,
-      os = builders.os.LINUX_DEFAULT,
-      tree_closing = tree_closing,
-      **kwargs
-  )
-
+def gpu_thin_tester(*, name, tree_closing = True, **kwargs):
+    return gpu_builder(
+        name = name,
+        cores = 2,
+        os = builders.os.LINUX_DEFAULT,
+        tree_closing = tree_closing,
+        **kwargs
+    )
 
 def linux_builder(
-    *,
-    name,
-    goma_backend=builders.goma.backend.RBE_PROD,
-    goma_jobs=builders.goma.jobs.MANY_JOBS_FOR_CI,
-    tree_closing=True,
-    notifies=('chromium.linux',),
-    extra_notifies=None,
-    **kwargs):
-  return ci.builder(
-      name = name,
-      goma_backend = goma_backend,
-      goma_jobs = goma_jobs,
-      mastername = 'chromium.linux',
-      tree_closing = tree_closing,
-      notifies = list(notifies) + (extra_notifies or []),
-      **kwargs
-  )
-
+        *,
+        name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        goma_jobs = builders.goma.jobs.MANY_JOBS_FOR_CI,
+        tree_closing = True,
+        notifies = ("chromium.linux",),
+        extra_notifies = None,
+        **kwargs):
+    return ci.builder(
+        name = name,
+        goma_backend = goma_backend,
+        goma_jobs = goma_jobs,
+        mastername = "chromium.linux",
+        tree_closing = tree_closing,
+        notifies = list(notifies) + (extra_notifies or []),
+        **kwargs
+    )
 
 def mac_builder(
-    *,
-    name,
-    cores=None,
-    goma_backend=builders.goma.backend.RBE_PROD,
-    os=builders.os.MAC_DEFAULT,
-    tree_closing=True,
-    **kwargs):
-  return ci.builder(
-      name = name,
-      cores = cores,
-      goma_backend = goma_backend,
-      mastername = 'chromium.mac',
-      os = os,
-      tree_closing = tree_closing,
-      **kwargs
-  )
+        *,
+        name,
+        cores = None,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        os = builders.os.MAC_DEFAULT,
+        tree_closing = True,
+        **kwargs):
+    return ci.builder(
+        name = name,
+        cores = cores,
+        goma_backend = goma_backend,
+        mastername = "chromium.mac",
+        os = os,
+        tree_closing = tree_closing,
+        **kwargs
+    )
 
+def mac_ios_builder(
+        *,
+        name,
+        caches = None,
+        executable = "recipe:chromium",
+        goma_backend = builders.goma.backend.RBE_PROD,
+        properties = None,
+        **kwargs):
+    if not caches:
+        caches = [builders.xcode_cache.x11e146]
+    if not properties:
+        properties = {
+            "xcode_build_version": "11e146",
+        }
 
-def mac_ios_builder(*,
-                    name,
-                    caches=None,
-                    executable='recipe:chromium',
-                    goma_backend=builders.goma.backend.RBE_PROD,
-                    properties=None,
-                    **kwargs):
-  if not caches:
-    caches = [builders.xcode_cache.x11e146]
-  if not properties:
-    properties = {
-      'xcode_build_version': '11e146'
-    }
-
-  return mac_builder(
-      name = name,
-      caches = caches,
-      goma_backend = goma_backend,
-      executable = executable,
-      os = builders.os.MAC_10_15,
-      properties = properties,
-      **kwargs
-  )
-
+    return mac_builder(
+        name = name,
+        caches = caches,
+        goma_backend = goma_backend,
+        executable = executable,
+        os = builders.os.MAC_10_15,
+        properties = properties,
+        **kwargs
+    )
 
 def memory_builder(
-    *,
-    name,
-    goma_jobs=builders.goma.jobs.MANY_JOBS_FOR_CI,
-    notifies=None,
-    tree_closing=True,
-    **kwargs):
-  if name.startswith('Linux'):
-    notifies = (notifies or []) + ['linux-memory']
+        *,
+        name,
+        goma_jobs = builders.goma.jobs.MANY_JOBS_FOR_CI,
+        notifies = None,
+        tree_closing = True,
+        **kwargs):
+    if name.startswith("Linux"):
+        notifies = (notifies or []) + ["linux-memory"]
 
-  return ci.builder(
-      name = name,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      goma_jobs = goma_jobs,
-      mastername = 'chromium.memory',
-      notifies = notifies,
-      tree_closing=tree_closing,
-      **kwargs
-  )
-
+    return ci.builder(
+        name = name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        goma_jobs = goma_jobs,
+        mastername = "chromium.memory",
+        notifies = notifies,
+        tree_closing = tree_closing,
+        **kwargs
+    )
 
 def swangle_builder(*, name, builderless = True, pinned = True, **kwargs):
     builder_args = dict(kwargs)
@@ -905,74 +872,68 @@
         builder_args.update(executable = "recipe:angle_chromium")
     return ci.builder(**builder_args)
 
-
 def swangle_linux_builder(
-    *,
-    name,
-    **kwargs):
-  return swangle_builder(
-      name = name,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      os = builders.os.LINUX_DEFAULT,
-      **kwargs
-  )
-
+        *,
+        name,
+        **kwargs):
+    return swangle_builder(
+        name = name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        os = builders.os.LINUX_DEFAULT,
+        **kwargs
+    )
 
 def swangle_mac_builder(
-    *,
-    name,
-    **kwargs):
-  return swangle_builder(
-      name = name,
-      builderless = False,
-      cores = 4,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      os = builders.os.MAC_ANY,
-      **kwargs
-  )
-
+        *,
+        name,
+        **kwargs):
+    return swangle_builder(
+        name = name,
+        builderless = False,
+        cores = 4,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        os = builders.os.MAC_ANY,
+        **kwargs
+    )
 
 def swangle_windows_builder(*, name, **kwargs):
-  return swangle_builder(
-      name = name,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      os = builders.os.WINDOWS_DEFAULT,
-      **kwargs
-  )
-
+    return swangle_builder(
+        name = name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        os = builders.os.WINDOWS_DEFAULT,
+        **kwargs
+    )
 
 def thin_tester(
-    *,
-    name,
-    mastername,
-    triggered_by,
-    tree_closing=True,
-    **kwargs):
-  return ci.builder(
-      name = name,
-      mastername = mastername,
-      triggered_by = triggered_by,
-      goma_backend = None,
-      tree_closing = tree_closing,
-      **kwargs
-  )
-
+        *,
+        name,
+        mastername,
+        triggered_by,
+        tree_closing = True,
+        **kwargs):
+    return ci.builder(
+        name = name,
+        mastername = mastername,
+        triggered_by = triggered_by,
+        goma_backend = None,
+        tree_closing = tree_closing,
+        **kwargs
+    )
 
 def win_builder(
-    *,
-    name,
-    os=builders.os.WINDOWS_DEFAULT,
-    tree_closing=True,
-    **kwargs):
-  return ci.builder(
-      name = name,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      mastername = 'chromium.win',
-      os = os,
-      tree_closing = tree_closing,
-      **kwargs
-  )
-
+        *,
+        name,
+        os = builders.os.WINDOWS_DEFAULT,
+        tree_closing = True,
+        **kwargs):
+    return ci.builder(
+        name = name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        mastername = "chromium.win",
+        os = os,
+        tree_closing = tree_closing,
+        **kwargs
+    )
 
 ci = struct(
     builder = ci_builder,
@@ -983,7 +944,6 @@
     overview_console_view = overview_console_view,
     ordering = ordering,
     set_defaults = set_defaults,
-
     android_builder = android_builder,
     android_fyi_builder = android_fyi_builder,
     chromium_builder = chromium_builder,
diff --git a/infra/config/lib/try.star b/infra/config/lib/try.star
index 8f3d38a8..b323fef 100644
--- a/infra/config/lib/try.star
+++ b/infra/config/lib/try.star
@@ -16,398 +16,380 @@
 corresponding attribute on `defaults` that is a `lucicfg.var` that can be used
 to set the default value. Can also be accessed through `try_.defaults`.
 """
-load('@stdlib//internal/graph.star', 'graph')
-load('@stdlib//internal/luci/common.star', 'keys')
 
-load('./builders.star', 'builders')
-load('./args.star', 'args')
+load("@stdlib//internal/graph.star", "graph")
+load("@stdlib//internal/luci/common.star", "keys")
+load("./builders.star", "builders")
+load("./args.star", "args")
 
-
-INFRA_CONFIG_LOCATION_REGEXP = 'infra/config/.+'
-
+INFRA_CONFIG_LOCATION_REGEXP = "infra/config/.+"
 
 defaults = args.defaults(
-    extends=builders.defaults,
+    extends = builders.defaults,
     add_to_list_view = False,
     cq_group = None,
     list_view = args.COMPUTE,
     main_list_view = None,
 )
 
-
 def declare_bucket(milestone_vars):
-  luci.bucket(
-      name = milestone_vars.try_bucket,
-      acls = [
-          acl.entry(
-              roles = acl.BUILDBUCKET_READER,
-              groups = 'all',
-          ),
-          acl.entry(
-              roles = acl.BUILDBUCKET_TRIGGERER,
-              users = [
-                  'findit-for-me@appspot.gserviceaccount.com',
-                  'tricium-prod@appspot.gserviceaccount.com',
-              ],
-              groups = [
-                  'project-chromium-tryjob-access',
-                  # Allow Pinpoint to trigger builds for bisection
-                  'service-account-chromeperf',
-                  'service-account-cq',
-              ],
-              projects = milestone_vars.try_triggering_projects,
-          ),
-          acl.entry(
-              roles = acl.BUILDBUCKET_OWNER,
-              groups = 'service-account-chromium-tryserver',
-          ),
-      ],
-  )
+    luci.bucket(
+        name = milestone_vars.try_bucket,
+        acls = [
+            acl.entry(
+                roles = acl.BUILDBUCKET_READER,
+                groups = "all",
+            ),
+            acl.entry(
+                roles = acl.BUILDBUCKET_TRIGGERER,
+                users = [
+                    "findit-for-me@appspot.gserviceaccount.com",
+                    "tricium-prod@appspot.gserviceaccount.com",
+                ],
+                groups = [
+                    "project-chromium-tryjob-access",
+                    # Allow Pinpoint to trigger builds for bisection
+                    "service-account-chromeperf",
+                    "service-account-cq",
+                ],
+                projects = milestone_vars.try_triggering_projects,
+            ),
+            acl.entry(
+                roles = acl.BUILDBUCKET_OWNER,
+                groups = "service-account-chromium-tryserver",
+            ),
+        ],
+    )
 
-  luci.cq_group(
-      name = milestone_vars.cq_group,
-      retry_config = cq.RETRY_ALL_FAILURES,
-      tree_status_host = milestone_vars.tree_status_host,
-      watch = cq.refset(
-          repo = 'https://chromium.googlesource.com/chromium/src',
-          refs = [milestone_vars.cq_ref_regexp],
-      ),
-      acls = [
-          acl.entry(
-              acl.CQ_COMMITTER,
-              groups = 'project-chromium-committers',
-          ),
-          acl.entry(
-              acl.CQ_DRY_RUNNER,
-              groups = 'project-chromium-tryjob-access',
-          ),
-      ],
-  )
+    luci.cq_group(
+        name = milestone_vars.cq_group,
+        retry_config = cq.RETRY_ALL_FAILURES,
+        tree_status_host = milestone_vars.tree_status_host,
+        watch = cq.refset(
+            repo = "https://chromium.googlesource.com/chromium/src",
+            refs = [milestone_vars.cq_ref_regexp],
+        ),
+        acls = [
+            acl.entry(
+                acl.CQ_COMMITTER,
+                groups = "project-chromium-committers",
+            ),
+            acl.entry(
+                acl.CQ_DRY_RUNNER,
+                groups = "project-chromium-tryjob-access",
+            ),
+        ],
+    )
 
-  try_.list_view(
-      name = milestone_vars.main_list_view_name,
-      title = milestone_vars.main_list_view_title,
-  )
-
+    try_.list_view(
+        name = milestone_vars.main_list_view_name,
+        title = milestone_vars.main_list_view_title,
+    )
 
 def set_defaults(milestone_vars, **kwargs):
-  default_values = dict(
-      add_to_list_view = milestone_vars.is_master,
-      bucket = milestone_vars.try_bucket,
-      build_numbers = True,
-      caches = [
-          swarming.cache(
-              name = 'win_toolchain',
-              path = 'win_toolchain',
-          ),
-      ],
-      configure_kitchen = True,
-      cores = 8,
-      cpu = builders.cpu.X86_64,
-      cq_group = milestone_vars.cq_group,
-      executable = 'recipe:chromium_trybot',
-      execution_timeout = 4 * time.hour,
-      # Max. pending time for builds. CQ considers builds pending >2h as timed
-      # out: http://shortn/_8PaHsdYmlq. Keep this in sync.
-      expiration_timeout = 2 * time.hour,
-      os = builders.os.LINUX_DEFAULT,
-      pool = 'luci.chromium.try',
-      service_account = 'chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com',
-      swarming_tags = ['vpython:native-python-wrapper'],
-      task_template_canary_percentage = 5,
-  )
-  default_values.update(kwargs)
-  for k, v in default_values.items():
-    getattr(defaults, k).set(v)
-
+    default_values = dict(
+        add_to_list_view = milestone_vars.is_master,
+        bucket = milestone_vars.try_bucket,
+        build_numbers = True,
+        caches = [
+            swarming.cache(
+                name = "win_toolchain",
+                path = "win_toolchain",
+            ),
+        ],
+        configure_kitchen = True,
+        cores = 8,
+        cpu = builders.cpu.X86_64,
+        cq_group = milestone_vars.cq_group,
+        executable = "recipe:chromium_trybot",
+        execution_timeout = 4 * time.hour,
+        # Max. pending time for builds. CQ considers builds pending >2h as timed
+        # out: http://shortn/_8PaHsdYmlq. Keep this in sync.
+        expiration_timeout = 2 * time.hour,
+        os = builders.os.LINUX_DEFAULT,
+        pool = "luci.chromium.try",
+        service_account = "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com",
+        swarming_tags = ["vpython:native-python-wrapper"],
+        task_template_canary_percentage = 5,
+    )
+    default_values.update(kwargs)
+    for k, v in default_values.items():
+        getattr(defaults, k).set(v)
 
 def _sorted_list_view_graph_key(console_name):
-  return graph.key('@chromium', '', 'sorted_list_view', console_name)
-
+    return graph.key("@chromium", "", "sorted_list_view", console_name)
 
 def _sorted_list_view_impl(ctx, *, console_name):
-  key = _sorted_list_view_graph_key(console_name)
-  graph.add_node(key)
-  graph.add_edge(keys.project(), key)
-  return graph.keyset(key)
+    key = _sorted_list_view_graph_key(console_name)
+    graph.add_node(key)
+    graph.add_edge(keys.project(), key)
+    return graph.keyset(key)
 
-_sorted_list_view = lucicfg.rule(impl=_sorted_list_view_impl)
-
+_sorted_list_view = lucicfg.rule(impl = _sorted_list_view_impl)
 
 def _sort_console_entries(ctx):
-  milo = ctx.output['luci-milo.cfg']
-  consoles = []
-  for console in milo.consoles:
-    if not console.builders:
-      continue
-    graph_key = _sorted_list_view_graph_key(console.id)
-    node = graph.node(graph_key)
-    if node:
-      console.builders = sorted(console.builders, lambda b: b.name)
-    consoles.append(console)
+    milo = ctx.output["luci-milo.cfg"]
+    consoles = []
+    for console in milo.consoles:
+        if not console.builders:
+            continue
+        graph_key = _sorted_list_view_graph_key(console.id)
+        node = graph.node(graph_key)
+        if node:
+            console.builders = sorted(console.builders, lambda b: b.name)
+        consoles.append(console)
 
 lucicfg.generator(_sort_console_entries)
 
-
 def list_view(*, name, **kwargs):
-  ret = luci.list_view(
-      name = name,
-      **kwargs
-  )
+    ret = luci.list_view(
+        name = name,
+        **kwargs
+    )
 
-  _sorted_list_view(
-      console_name = name,
-  )
+    _sorted_list_view(
+        console_name = name,
+    )
 
-  return ret
-
+    return ret
 
 def tryjob(
-    *,
-    disable_reuse=None,
-    experiment_percentage=None,
-    location_regexp=None,
-    location_regexp_exclude=None,
-    cancel_stale=None,
-    run_on_infra_config_changes=False):
-  """Specifies the details of a tryjob verifier.
+        *,
+        disable_reuse = None,
+        experiment_percentage = None,
+        location_regexp = None,
+        location_regexp_exclude = None,
+        cancel_stale = None,
+        run_on_infra_config_changes = False):
+    """Specifies the details of a tryjob verifier.
 
-  See https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/master/lucicfg/doc/README.md#luci.cq_tryjob_verifier
-  for details on the most of the arguments.
+    See https://chromium.googlesource.com/infra/luci/luci-go/+/refs/heads/master/lucicfg/doc/README.md#luci.cq_tryjob_verifier
+    for details on the most of the arguments.
 
-  Arguments:
-    run_on_infra_changes - A bool indicating whether the try job should be run
-      for changes against //infra/config.
+    Arguments:
+      run_on_infra_changes - A bool indicating whether the try job should be run
+        for changes against //infra/config.
 
-  Returns:
-    A struct that can be passed to the `tryjob` argument of `try_.builder` to
-    enable the builder for CQ.
-  """
-  if not run_on_infra_config_changes:
-    location_regexp_exclude = [INFRA_CONFIG_LOCATION_REGEXP] + (location_regexp_exclude or [])
-  return struct(
-      disable_reuse = disable_reuse,
-      experiment_percentage = experiment_percentage,
-      location_regexp = location_regexp,
-      location_regexp_exclude = location_regexp_exclude,
-      cancel_stale = cancel_stale,
-  )
-
+    Returns:
+      A struct that can be passed to the `tryjob` argument of `try_.builder` to
+      enable the builder for CQ.
+    """
+    if not run_on_infra_config_changes:
+        location_regexp_exclude = [INFRA_CONFIG_LOCATION_REGEXP] + (location_regexp_exclude or [])
+    return struct(
+        disable_reuse = disable_reuse,
+        experiment_percentage = experiment_percentage,
+        location_regexp = location_regexp,
+        location_regexp_exclude = location_regexp_exclude,
+        cancel_stale = cancel_stale,
+    )
 
 def try_builder(
-    *,
-    name,
-    add_to_list_view=args.DEFAULT,
-    cq_group=args.DEFAULT,
-    list_view=args.DEFAULT,
-    main_list_view = args.DEFAULT,
-    tryjob=None,
-    **kwargs):
-  """Define a try builder.
+        *,
+        name,
+        add_to_list_view = args.DEFAULT,
+        cq_group = args.DEFAULT,
+        list_view = args.DEFAULT,
+        main_list_view = args.DEFAULT,
+        tryjob = None,
+        **kwargs):
+    """Define a try builder.
 
-  Arguments:
-    name - name of the builder, will show up in UIs and logs. Required.
-    add_to_list_view - A bool indicating whether an entry should be
-      created for the builder in the console identified by
-      `list_view`. Supports a module-level default that defaults to
-      False.
-    cq_group - The CQ group to add the builder to. If tryjob is None, it will
-      be added as includable_only.
-    list_view - A string identifying the ID of the list view to
-      add an entry to. Supports a module-level default that defaults to
-      the mastername of the builder, if provided. An entry will be added
-      only if `add_to_list_view` is True.
-    main_console_view - A string identifying the ID of the main list
-      view to add an entry to. Supports a module-level default that
-      defaults to None. Note that `add_to_list_view` has no effect on
-      creating an entry to the main list view.
-    tryjob - A struct containing the details of the tryjob verifier for the
-      builder, obtained by calling the `tryjob` function.
-  """
-  # Define the builder first so that any validation of luci.builder arguments
-  # (e.g. bucket) occurs before we try to use it
-  ret = builders.builder(
-      name = name,
-      resultdb_bigquery_exports = [resultdb.export_test_results(
-          bq_table = 'luci-resultdb.chromium.try_test_results',
-      )],
-      **kwargs
-  )
+    Arguments:
+      name - name of the builder, will show up in UIs and logs. Required.
+      add_to_list_view - A bool indicating whether an entry should be
+        created for the builder in the console identified by
+        `list_view`. Supports a module-level default that defaults to
+        False.
+      cq_group - The CQ group to add the builder to. If tryjob is None, it will
+        be added as includable_only.
+      list_view - A string identifying the ID of the list view to
+        add an entry to. Supports a module-level default that defaults to
+        the mastername of the builder, if provided. An entry will be added
+        only if `add_to_list_view` is True.
+      main_console_view - A string identifying the ID of the main list
+        view to add an entry to. Supports a module-level default that
+        defaults to None. Note that `add_to_list_view` has no effect on
+        creating an entry to the main list view.
+      tryjob - A struct containing the details of the tryjob verifier for the
+        builder, obtained by calling the `tryjob` function.
+    """
 
-  bucket = defaults.get_value_from_kwargs('bucket', kwargs)
-  builder = '{}/{}'.format(bucket, name)
-  cq_group = defaults.get_value('cq_group', cq_group)
-  if tryjob != None:
-    luci.cq_tryjob_verifier(
-        builder = builder,
-        cq_group = cq_group,
-        disable_reuse = tryjob.disable_reuse,
-        experiment_percentage = tryjob.experiment_percentage,
-        location_regexp = tryjob.location_regexp,
-        location_regexp_exclude = tryjob.location_regexp_exclude,
-        cancel_stale = tryjob.cancel_stale
-    )
-  else:
-    # Allow CQ to trigger this builder if user opts in via CQ-Include-Trybots.
-    luci.cq_tryjob_verifier(
-        builder = builder,
-        cq_group = cq_group,
-        includable_only = True,
+    # Define the builder first so that any validation of luci.builder arguments
+    # (e.g. bucket) occurs before we try to use it
+    ret = builders.builder(
+        name = name,
+        resultdb_bigquery_exports = [resultdb.export_test_results(
+            bq_table = "luci-resultdb.chromium.try_test_results",
+        )],
+        **kwargs
     )
 
-  add_to_list_view = defaults.get_value('add_to_list_view', add_to_list_view)
-  if add_to_list_view:
-    list_view = defaults.get_value('list_view', list_view)
-    if list_view == args.COMPUTE:
-      list_view = defaults.get_value_from_kwargs('mastername', kwargs)
+    bucket = defaults.get_value_from_kwargs("bucket", kwargs)
+    builder = "{}/{}".format(bucket, name)
+    cq_group = defaults.get_value("cq_group", cq_group)
+    if tryjob != None:
+        luci.cq_tryjob_verifier(
+            builder = builder,
+            cq_group = cq_group,
+            disable_reuse = tryjob.disable_reuse,
+            experiment_percentage = tryjob.experiment_percentage,
+            location_regexp = tryjob.location_regexp,
+            location_regexp_exclude = tryjob.location_regexp_exclude,
+            cancel_stale = tryjob.cancel_stale,
+        )
+    else:
+        # Allow CQ to trigger this builder if user opts in via CQ-Include-Trybots.
+        luci.cq_tryjob_verifier(
+            builder = builder,
+            cq_group = cq_group,
+            includable_only = True,
+        )
 
-    if list_view:
-      add_to_list_view = defaults.get_value(
-          'add_to_list_view', add_to_list_view)
+    add_to_list_view = defaults.get_value("add_to_list_view", add_to_list_view)
+    if add_to_list_view:
+        list_view = defaults.get_value("list_view", list_view)
+        if list_view == args.COMPUTE:
+            list_view = defaults.get_value_from_kwargs("mastername", kwargs)
 
-      luci.list_view_entry(
-          builder = builder,
-          list_view = list_view,
-      )
+        if list_view:
+            add_to_list_view = defaults.get_value(
+                "add_to_list_view",
+                add_to_list_view,
+            )
 
-  main_list_view = defaults.get_value('main_list_view', main_list_view)
-  if main_list_view:
-    luci.list_view_entry(
-        builder = builder,
-        list_view = main_list_view,
-    )
+            luci.list_view_entry(
+                builder = builder,
+                list_view = list_view,
+            )
 
-  return ret
+    main_list_view = defaults.get_value("main_list_view", main_list_view)
+    if main_list_view:
+        luci.list_view_entry(
+            builder = builder,
+            list_view = main_list_view,
+        )
 
+    return ret
 
 def blink_builder(*, name, goma_backend = None, **kwargs):
-  return try_builder(
-      name = name,
-      goma_backend = goma_backend,
-      mastername = 'tryserver.blink',
-      **kwargs
-  )
-
+    return try_builder(
+        name = name,
+        goma_backend = goma_backend,
+        mastername = "tryserver.blink",
+        **kwargs
+    )
 
 def blink_mac_builder(*, name, **kwargs):
-  return blink_builder(
-      name = name,
-      cores = None,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      os = builders.os.MAC_ANY,
-      builderless = True,
-      ssd = True,
-      **kwargs
-  )
-
+    return blink_builder(
+        name = name,
+        cores = None,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        os = builders.os.MAC_ANY,
+        builderless = True,
+        ssd = True,
+        **kwargs
+    )
 
 def chromium_builder(*, name, **kwargs):
-  return try_builder(
-      name = name,
-      builderless = True,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      mastername = 'tryserver.chromium',
-      **kwargs
-  )
-
+    return try_builder(
+        name = name,
+        builderless = True,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        mastername = "tryserver.chromium",
+        **kwargs
+    )
 
 def chromium_android_builder(*, name, **kwargs):
-  return try_builder(
-      name = name,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      mastername = 'tryserver.chromium.android',
-      **kwargs
-  )
-
+    return try_builder(
+        name = name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        mastername = "tryserver.chromium.android",
+        **kwargs
+    )
 
 def chromium_angle_builder(*, name, **kwargs):
-  return try_builder(
-      name = name,
-      builderless = False,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      mastername = 'tryserver.chromium.angle',
-      service_account = 'chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com',
-      **kwargs
-  )
-
+    return try_builder(
+        name = name,
+        builderless = False,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        mastername = "tryserver.chromium.angle",
+        service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com",
+        **kwargs
+    )
 
 def chromium_chromiumos_builder(*, name, **kwargs):
-  return try_builder(
-      name = name,
-      mastername = 'tryserver.chromium.chromiumos',
-      goma_backend = builders.goma.backend.RBE_PROD,
-      **kwargs
-  )
-
+    return try_builder(
+        name = name,
+        mastername = "tryserver.chromium.chromiumos",
+        goma_backend = builders.goma.backend.RBE_PROD,
+        **kwargs
+    )
 
 def chromium_dawn_builder(*, name, **kwargs):
-  return try_builder(
-      name = name,
-      builderless = False,
-      cores = None,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      mastername = 'tryserver.chromium.dawn',
-      service_account = 'chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com',
-      **kwargs
-  )
+    return try_builder(
+        name = name,
+        builderless = False,
+        cores = None,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        mastername = "tryserver.chromium.dawn",
+        service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com",
+        **kwargs
+    )
 
-
-def chromium_linux_builder(*, name, goma_backend=builders.goma.backend.RBE_PROD, **kwargs):
-  return try_builder(
-      name = name,
-      goma_backend = goma_backend,
-      mastername = 'tryserver.chromium.linux',
-      **kwargs
-  )
-
+def chromium_linux_builder(*, name, goma_backend = builders.goma.backend.RBE_PROD, **kwargs):
+    return try_builder(
+        name = name,
+        goma_backend = goma_backend,
+        mastername = "tryserver.chromium.linux",
+        **kwargs
+    )
 
 def chromium_mac_builder(
-    *,
-    name,
-    builderless=True,
-    cores=None,
-    goma_backend=builders.goma.backend.RBE_PROD,
-    os=builders.os.MAC_ANY,
-    **kwargs):
-  return try_builder(
-      name = name,
-      cores = cores,
-      goma_backend = goma_backend,
-      mastername = 'tryserver.chromium.mac',
-      os = os,
-      builderless = builderless,
-      ssd = True,
-      **kwargs
-  )
-
+        *,
+        name,
+        builderless = True,
+        cores = None,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        os = builders.os.MAC_ANY,
+        **kwargs):
+    return try_builder(
+        name = name,
+        cores = cores,
+        goma_backend = goma_backend,
+        mastername = "tryserver.chromium.mac",
+        os = os,
+        builderless = builderless,
+        ssd = True,
+        **kwargs
+    )
 
 def chromium_mac_ios_builder(
-    *,
-    name,
-    caches=None,
-    executable='recipe:ios/try',
-    goma_backend=builders.goma.backend.RBE_PROD,
-    os=builders.os.MAC_10_15,
-    properties=None,
-    **kwargs):
-  if not caches:
-    caches = [builders.xcode_cache.x11e146]
-  if not properties:
-    properties = {
-      'xcode_build_version': '11e146',
-    }
-  return try_builder(
-      name = name,
-      caches = caches,
-      cores = None,
-      executable = executable,
-      goma_backend = goma_backend,
-      mastername = 'tryserver.chromium.mac',
-      os = os,
-      properties = properties,
-      **kwargs
-  )
-
+        *,
+        name,
+        caches = None,
+        executable = "recipe:ios/try",
+        goma_backend = builders.goma.backend.RBE_PROD,
+        os = builders.os.MAC_10_15,
+        properties = None,
+        **kwargs):
+    if not caches:
+        caches = [builders.xcode_cache.x11e146]
+    if not properties:
+        properties = {
+            "xcode_build_version": "11e146",
+        }
+    return try_builder(
+        name = name,
+        caches = caches,
+        cores = None,
+        executable = executable,
+        goma_backend = goma_backend,
+        mastername = "tryserver.chromium.mac",
+        os = os,
+        properties = properties,
+        **kwargs
+    )
 
 def chromium_swangle_builder(*, name, pinned = True, **kwargs):
     builder_args = dict(kwargs)
@@ -421,100 +403,91 @@
         builder_args.update(executable = "recipe:angle_chromium_trybot")
     return try_builder(**builder_args)
 
-
 def chromium_swangle_linux_builder(*, name, **kwargs):
-  return chromium_swangle_builder(
-      name = name,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      os = builders.os.LINUX_DEFAULT,
-      **kwargs
-  )
-
+    return chromium_swangle_builder(
+        name = name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        os = builders.os.LINUX_DEFAULT,
+        **kwargs
+    )
 
 def chromium_swangle_mac_builder(*, name, **kwargs):
-  return chromium_swangle_builder(
-      name = name,
-      cores = None,
-      ssd = None,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      os = builders.os.MAC_ANY,
-      **kwargs
-  )
-
+    return chromium_swangle_builder(
+        name = name,
+        cores = None,
+        ssd = None,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        os = builders.os.MAC_ANY,
+        **kwargs
+    )
 
 def chromium_swangle_windows_builder(*, name, **kwargs):
-  return chromium_swangle_builder(
-      name = name,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      os = builders.os.WINDOWS_DEFAULT,
-      **kwargs
-  )
-
+    return chromium_swangle_builder(
+        name = name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        os = builders.os.WINDOWS_DEFAULT,
+        **kwargs
+    )
 
 def chromium_win_builder(
-    *,
-    name,
-    builderless=True,
-    goma_backend=builders.goma.backend.RBE_PROD,
-    os=builders.os.WINDOWS_DEFAULT,
-    **kwargs):
-  return try_builder(
-      name = name,
-      builderless = builderless,
-      goma_backend = goma_backend,
-      mastername = 'tryserver.chromium.win',
-      os = os,
-      **kwargs
-  )
+        *,
+        name,
+        builderless = True,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        os = builders.os.WINDOWS_DEFAULT,
+        **kwargs):
+    return try_builder(
+        name = name,
+        builderless = builderless,
+        goma_backend = goma_backend,
+        mastername = "tryserver.chromium.win",
+        os = os,
+        **kwargs
+    )
 
-
-def gpu_try_builder(*, name, builderless=False, execution_timeout=6 * time.hour, **kwargs):
-  return try_builder(
-      name = name,
-      builderless = builderless,
-      execution_timeout = execution_timeout,
-      service_account = 'chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com',
-      **kwargs
-  )
-
+def gpu_try_builder(*, name, builderless = False, execution_timeout = 6 * time.hour, **kwargs):
+    return try_builder(
+        name = name,
+        builderless = builderless,
+        execution_timeout = execution_timeout,
+        service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com",
+        **kwargs
+    )
 
 def gpu_chromium_android_builder(*, name, **kwargs):
-  return gpu_try_builder(
-      name = name,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      mastername = 'tryserver.chromium.android',
-      **kwargs
-  )
-
+    return gpu_try_builder(
+        name = name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        mastername = "tryserver.chromium.android",
+        **kwargs
+    )
 
 def gpu_chromium_linux_builder(*, name, **kwargs):
-  return gpu_try_builder(
-      name = name,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      mastername = 'tryserver.chromium.linux',
-      **kwargs
-  )
-
+    return gpu_try_builder(
+        name = name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        mastername = "tryserver.chromium.linux",
+        **kwargs
+    )
 
 def gpu_chromium_mac_builder(*, name, **kwargs):
-  return gpu_try_builder(
-      name = name,
-      cores = None,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      mastername = 'tryserver.chromium.mac',
-      os = builders.os.MAC_ANY,
-      **kwargs
-  )
+    return gpu_try_builder(
+        name = name,
+        cores = None,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        mastername = "tryserver.chromium.mac",
+        os = builders.os.MAC_ANY,
+        **kwargs
+    )
 
-def gpu_chromium_win_builder(*, name, os=builders.os.WINDOWS_ANY, **kwargs):
-  return gpu_try_builder(
-      name = name,
-      goma_backend = builders.goma.backend.RBE_PROD,
-      mastername = 'tryserver.chromium.win',
-      os = os,
-      **kwargs
-  )
-
+def gpu_chromium_win_builder(*, name, os = builders.os.WINDOWS_ANY, **kwargs):
+    return gpu_try_builder(
+        name = name,
+        goma_backend = builders.goma.backend.RBE_PROD,
+        mastername = "tryserver.chromium.win",
+        os = os,
+        **kwargs
+    )
 
 try_ = struct(
     defaults = defaults,
@@ -523,7 +496,6 @@
     job = tryjob,
     list_view = list_view,
     set_defaults = set_defaults,
-
     blink_builder = blink_builder,
     blink_mac_builder = blink_mac_builder,
     chromium_builder = chromium_builder,
diff --git a/infra/config/main.star b/infra/config/main.star
index 7788566..d99746e 100755
--- a/infra/config/main.star
+++ b/infra/config/main.star
@@ -6,53 +6,62 @@
 # See https://chromium.googlesource.com/infra/luci/luci-go/+/HEAD/lucicfg/doc/README.md
 # for information on starlark/lucicfg
 
-load('//project.star', 'master_only_exec', 'settings')
+load("//project.star", "master_only_exec", "settings")
 
 lucicfg.check_version(
-    min = '1.18.4',
-    message = 'Update depot_tools',
+    min = "1.18.4",
+    message = "Update depot_tools",
 )
 
 # Enable LUCI Realms support.
-lucicfg.enable_experiment('crbug.com/1085650')
+lucicfg.enable_experiment("crbug.com/1085650")
 
 # Enable tree closing.
 lucicfg.enable_experiment("crbug.com/1054172")
 
 # Tell lucicfg what files it is allowed to touch
 lucicfg.config(
-    config_dir = 'generated',
+    config_dir = "generated",
     tracked_files = [
-        'commit-queue.cfg',
-        'cq-builders.md',
-        'cr-buildbucket.cfg',
-        'luci-logdog.cfg',
-        'luci-milo.cfg',
-        'luci-notify.cfg',
-        'luci-notify/email-templates/*.template',
-        'luci-scheduler.cfg',
-        'project.cfg',
-        'project.pyl',
-        'realms.cfg',
-        'tricium-prod.cfg',
+        "commit-queue.cfg",
+        "cq-builders.md",
+        "cr-buildbucket.cfg",
+        "luci-logdog.cfg",
+        "luci-milo.cfg",
+        "luci-notify.cfg",
+        "luci-notify/email-templates/*.template",
+        "luci-scheduler.cfg",
+        "project.cfg",
+        "project.pyl",
+        "realms.cfg",
+        "tricium-prod.cfg",
     ],
     fail_on_warnings = True,
+    lint_checks = [
+        "default",
+        "-confusing-name",
+        "-function-docstring",
+        "-function-docstring-args",
+        "-function-docstring-return",
+        "-function-docstring-header",
+        "-module-docstring",
+    ],
 )
 
 # Just copy tricium-prod.cfg to the generated outputs
 lucicfg.emit(
-    dest = 'tricium-prod.cfg',
-    data = io.read_file('tricium-prod.cfg'),
+    dest = "tricium-prod.cfg",
+    data = io.read_file("tricium-prod.cfg"),
 )
 
 luci.project(
     name = settings.project,
-    buildbucket = 'cr-buildbucket.appspot.com',
-    logdog = 'luci-logdog.appspot.com',
-    milo = 'luci-milo.appspot.com',
-    notify = 'luci-notify.appspot.com',
-    scheduler = 'luci-scheduler.appspot.com',
-    swarming = 'chromium-swarm.appspot.com',
+    buildbucket = "cr-buildbucket.appspot.com",
+    logdog = "luci-logdog.appspot.com",
+    milo = "luci-milo.appspot.com",
+    notify = "luci-notify.appspot.com",
+    scheduler = "luci-scheduler.appspot.com",
+    swarming = "chromium-swarm.appspot.com",
     acls = [
         acl.entry(
             roles = [
@@ -60,15 +69,15 @@
                 acl.PROJECT_CONFIGS_READER,
                 acl.SCHEDULER_READER,
             ],
-            groups = 'all',
+            groups = "all",
         ),
         acl.entry(
             roles = acl.LOGDOG_WRITER,
-            groups = 'luci-logdog-chromium-writers',
+            groups = "luci-logdog-chromium-writers",
         ),
         acl.entry(
             roles = acl.SCHEDULER_OWNER,
-            groups = 'project-chromium-admins',
+            groups = "project-chromium-admins",
         ),
     ],
 )
@@ -76,15 +85,15 @@
 luci.cq(
     submit_max_burst = 2,
     submit_burst_delay = time.minute,
-    status_host = 'chromium-cq-status.appspot.com',
+    status_host = "chromium-cq-status.appspot.com",
 )
 
 luci.logdog(
-    gs_bucket = 'chromium-luci-logdog',
+    gs_bucket = "chromium-luci-logdog",
 )
 
 luci.milo(
-    logo = 'https://storage.googleapis.com/chrome-infra-public/logo/chromium.svg',
+    logo = "https://storage.googleapis.com/chrome-infra-public/logo/chromium.svg",
 )
 
 luci.notify(
@@ -93,27 +102,28 @@
 
 # An all-purpose public realm.
 luci.realm(
-    name = 'public',
+    name = "public",
     bindings = [
         luci.binding(
-            roles = 'role/buildbucket.reader',
-            groups = 'all',
+            roles = "role/buildbucket.reader",
+            groups = "all",
         ),
         # Other roles are inherited from @root which grants them to group:all.
     ],
 )
 
-exec('//recipes.star')
+exec("//recipes.star")
 
-exec('//notifiers.star')
+exec("//notifiers.star")
 
-exec('//subprojects/chromium/subproject.star')
-master_only_exec('//subprojects/codesearch/subproject.star')
-master_only_exec('//subprojects/findit/subproject.star')
-master_only_exec('//subprojects/goma/subproject.star')
-master_only_exec('//subprojects/webrtc/subproject.star')
+exec("//subprojects/chromium/subproject.star")
+master_only_exec("//subprojects/codesearch/subproject.star")
+master_only_exec("//subprojects/findit/subproject.star")
+master_only_exec("//subprojects/goma/subproject.star")
+master_only_exec("//subprojects/webrtc/subproject.star")
 
-master_only_exec('//generators/cq-builders-md.star')
+master_only_exec("//generators/cq-builders-md.star")
+
 # This should be exec'ed before exec'ing scheduler-noop-jobs.star because
 # attempting to read the buildbucket field that is not set for the noop jobs
 # actually causes an empty buildbucket message to be set
@@ -121,14 +131,15 @@
 # problems when the number of builders with the same name goes from 1 to >1 or
 # vice-versa. This generator makes sure both the bucketed and non-bucketed IDs
 # work so that there aren't transient failures when the configuration changes
-master_only_exec('//generators/scheduler-bucketed-jobs.star')
+master_only_exec("//generators/scheduler-bucketed-jobs.star")
+
 # TODO(https://crbug.com/819899) There are a number of noop jobs for dummy
 # builders defined due to legacy requirements that trybots mirror CI bots
 # no-op scheduler jobs are not supported by the lucicfg libraries, so this
 # generator adds in the necessary no-op jobs
 # The trybots should be update to not require no-op jobs to be triggered so that
 # the no-op jobs can be removed
-exec('//generators/scheduler-noop-jobs.star')
-exec('//generators/sort-consoles.star')
+exec("//generators/scheduler-noop-jobs.star")
+exec("//generators/sort-consoles.star")
 
-exec('//validators/builders-in-consoles.star')
+exec("//validators/builders-in-consoles.star")
diff --git a/infra/config/notifiers.star b/infra/config/notifiers.star
index 44fbf7d0..c343a29 100644
--- a/infra/config/notifiers.star
+++ b/infra/config/notifiers.star
@@ -3,105 +3,105 @@
 # found in the LICENSE file.
 
 luci.notifier(
-    name = 'chromesec-lkgr-failures',
+    name = "chromesec-lkgr-failures",
     on_status_change = True,
     notify_emails = [
-        'chromesec-lkgr-failures@google.com',
+        "chromesec-lkgr-failures@google.com",
     ],
 )
 
 luci.notifier(
-    name = 'chrome-memory-sheriffs',
+    name = "chrome-memory-sheriffs",
     on_status_change = True,
     notify_emails = [
-        'chrome-memory-sheriffs+bots@google.com',
+        "chrome-memory-sheriffs+bots@google.com",
     ],
 )
 
 luci.notifier(
-    name = 'cr-fuchsia',
+    name = "cr-fuchsia",
     on_status_change = True,
     notify_emails = [
-        'cr-fuchsia+bot@chromium.org',
+        "cr-fuchsia+bot@chromium.org",
     ],
 )
 
 luci.notifier(
-    name = 'cronet',
+    name = "cronet",
     on_status_change = True,
     notify_emails = [
-        'cronet-bots-observer@google.com',
+        "cronet-bots-observer@google.com",
     ],
 )
 
 luci.notifier(
-    name = 'metadata-mapping',
-    on_new_status = ['FAILURE'],
-    notify_emails = ['chromium-component-mapping@google.com'],
+    name = "metadata-mapping",
+    on_new_status = ["FAILURE"],
+    notify_emails = ["chromium-component-mapping@google.com"],
 )
 
 TREE_CLOSING_STEPS = [
-    'bot_update',
-    'compile',
-    'gclient runhooks',
-    'runhooks',
-    'update',
+    "bot_update",
+    "compile",
+    "gclient runhooks",
+    "runhooks",
+    "update",
 ]
 
 luci.tree_closer(
-    name = 'chromium-tree-closer',
-    tree_status_host = 'chromium-status.appspot.com',
-    failed_step_regexp = TREE_CLOSING_STEPS
+    name = "chromium-tree-closer",
+    tree_status_host = "chromium-status.appspot.com",
+    failed_step_regexp = TREE_CLOSING_STEPS,
 )
 
 luci.tree_closer(
-    name = 'close-on-any-step-failure',
-    tree_status_host = 'chromium-status.appspot.com',
+    name = "close-on-any-step-failure",
+    tree_status_host = "chromium-status.appspot.com",
 )
 
 def tree_closure_notifier(**kwargs):
-  return luci.notifier(
-      on_occurrence = ['FAILURE'],
-      failed_step_regexp = TREE_CLOSING_STEPS,
-      **kwargs,
-  )
+    return luci.notifier(
+        on_occurrence = ["FAILURE"],
+        failed_step_regexp = TREE_CLOSING_STEPS,
+        **kwargs
+    )
 
 tree_closure_notifier(
-    name = 'chromium-tree-closer-email',
+    name = "chromium-tree-closer-email",
     notify_rotation_urls = [
         "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-build-sheriff",
     ],
     template = luci.notifier_template(
-        name = 'tree_closure_email_template',
-        body = io.read_file('templates/tree_closure_email.template'),
+        name = "tree_closure_email_template",
+        body = io.read_file("templates/tree_closure_email.template"),
     ),
 )
 
 tree_closure_notifier(
-    name = 'gpu-tree-closer-email',
-    notify_emails = ['chrome-gpu-build-failures@google.com'],
+    name = "gpu-tree-closer-email",
+    notify_emails = ["chrome-gpu-build-failures@google.com"],
     notify_rotation_urls = [
         "https://rota-ng.appspot.com/legacy/sheriff_gpu.json",
     ],
 )
 
 tree_closure_notifier(
-    name = 'linux-memory',
-    notify_emails = ['thomasanderson@chromium.org'],
+    name = "linux-memory",
+    notify_emails = ["thomasanderson@chromium.org"],
 )
 
 tree_closure_notifier(
-    name = 'linux-archive-rel',
-    notify_emails = ['thomasanderson@chromium.org'],
+    name = "linux-archive-rel",
+    notify_emails = ["thomasanderson@chromium.org"],
 )
 
 tree_closure_notifier(
-    name = 'Deterministic Android',
-    notify_emails = ['agrieve@chromium.org'],
+    name = "Deterministic Android",
+    notify_emails = ["agrieve@chromium.org"],
 )
 
 tree_closure_notifier(
-    name = 'Deterministic Linux',
+    name = "Deterministic Linux",
     notify_emails = [
         "tikuta@chromium.org",
         "ukai@chromium.org",
@@ -110,7 +110,7 @@
 )
 
 tree_closure_notifier(
-    name = 'linux-ozone-rel',
+    name = "linux-ozone-rel",
     notify_emails = [
         "fwang@chromium.org",
         "maksim.sisov@chromium.org",
@@ -122,14 +122,14 @@
 )
 
 luci.notifier(
-    name = 'Closure Compilation Linux',
+    name = "Closure Compilation Linux",
     notify_emails = [
         "dbeam+closure-bots@chromium.org",
         "fukino+closure-bots@chromium.org",
         "hirono+closure-bots@chromium.org",
         "vitalyp@chromium.org",
     ],
-    on_occurrence = ['FAILURE'],
+    on_occurrence = ["FAILURE"],
     failed_step_regexp = [
         "update_scripts",
         "setup_build",
@@ -137,57 +137,57 @@
         "generate_gyp_files",
         "compile",
         "generate_v2_gyp_files",
-        "compile_v2"
-    ]
+        "compile_v2",
+    ],
 )
 
 luci.notifier(
-    name = 'Site Isolation Android',
+    name = "Site Isolation Android",
     notify_emails = [
         "nasko+fyi-bots@chromium.org",
         "creis+fyi-bots@chromium.org",
         "lukasza+fyi-bots@chromium.org",
         "alexmos+fyi-bots@chromium.org",
     ],
-    on_new_status = ['FAILURE'],
+    on_new_status = ["FAILURE"],
 )
 
 luci.notifier(
-    name = 'CFI Linux',
+    name = "CFI Linux",
     notify_emails = [
-        'pcc@chromium.org',
+        "pcc@chromium.org",
     ],
-    on_new_status = ['FAILURE'],
+    on_new_status = ["FAILURE"],
 )
 
 luci.notifier(
-    name = 'Win 10 Fast Ring',
+    name = "Win 10 Fast Ring",
     notify_emails = [
-        'wfh@chromium.org',
+        "wfh@chromium.org",
     ],
-    on_new_status = ['FAILURE'],
+    on_new_status = ["FAILURE"],
 )
 
 luci.notifier(
-    name = 'linux-blink-heap-verification',
+    name = "linux-blink-heap-verification",
     notify_emails = [
-        'mlippautz+fyi-bots@chromium.org',
+        "mlippautz+fyi-bots@chromium.org",
     ],
-    on_new_status = ['FAILURE'],
+    on_new_status = ["FAILURE"],
 )
 
 luci.notifier(
-    name = 'annotator-rel',
+    name = "annotator-rel",
     notify_emails = [
         "pastarmovj@chromium.org",
         "nicolaso@chromium.org",
     ],
-    on_new_status = ['FAILURE'],
+    on_new_status = ["FAILURE"],
 )
 
 tree_closure_notifier(
-    name = 'chromium.linux',
+    name = "chromium.linux",
     notify_emails = [
-        'thomasanderson@chromium.org',
+        "thomasanderson@chromium.org",
     ],
 )
diff --git a/infra/config/project.star b/infra/config/project.star
index 4d8a715..3d1d77c 100644
--- a/infra/config/project.star
+++ b/infra/config/project.star
@@ -3,48 +3,45 @@
 # found in the LICENSE file.
 
 settings = struct(
-    project = 'chromium',
+    project = "chromium",
     # Switch this to False for branches
     is_master = True,
-    ref = 'refs/heads/master',
-    ci_bucket = 'ci',
-    ci_poller = 'master-gitiles-trigger',
-    main_console_name = 'main',
-    main_console_title = 'Chromium Main Console',
-    cq_mirrors_console_name = 'mirrors',
-    cq_mirrors_console_title = 'Chromium CQ Mirrors Console',
-    try_bucket = 'try',
-    try_triggering_projects = ['angle', 'dawn', 'skia', 'v8'],
-    cq_group = 'cq',
-    cq_ref_regexp = 'refs/heads/.+',
-    main_list_view_name = 'try',
-    main_list_view_title = 'Chromium CQ console',
+    ref = "refs/heads/master",
+    ci_bucket = "ci",
+    ci_poller = "master-gitiles-trigger",
+    main_console_name = "main",
+    main_console_title = "Chromium Main Console",
+    cq_mirrors_console_name = "mirrors",
+    cq_mirrors_console_title = "Chromium CQ Mirrors Console",
+    try_bucket = "try",
+    try_triggering_projects = ["angle", "dawn", "skia", "v8"],
+    cq_group = "cq",
+    cq_ref_regexp = "refs/heads/.+",
+    main_list_view_name = "try",
+    main_list_view_title = "Chromium CQ console",
     # Switch this to None for branches
-    tree_status_host = 'chromium-status.appspot.com/',
+    tree_status_host = "chromium-status.appspot.com/",
 )
 
-
 def _generate_project_pyl(ctx):
-  ctx.output['project.pyl'] = '\n'.join([
-      '# This is a non-LUCI generated file',
-      '# This is consumed by presubmit checks that need to validate the config',
-      repr(dict(
-          # On master, we want to ensure that we don't have source side specs
-          # defined for non-existent builders
-          # On branches, we don't want to re-generate the source side specs as
-          # that would increase branch day toil and complicate cherry-picks
-          validate_source_side_specs_have_builder = settings.is_master,
-      )),
-      '',
-  ])
+    ctx.output["project.pyl"] = "\n".join([
+        "# This is a non-LUCI generated file",
+        "# This is consumed by presubmit checks that need to validate the config",
+        repr(dict(
+            # On master, we want to ensure that we don't have source side specs
+            # defined for non-existent builders
+            # On branches, we don't want to re-generate the source side specs as
+            # that would increase branch day toil and complicate cherry-picks
+            validate_source_side_specs_have_builder = settings.is_master,
+        )),
+        "",
+    ])
 
 lucicfg.generator(_generate_project_pyl)
 
-
 def master_only_exec(f):
-  if settings.is_master:
-    exec(f)
-
+    if settings.is_master:
+        exec(f)
 
 # The branch numbers of branches that we have builders running for (including
 # milestone-specific projects)
diff --git a/infra/config/recipes.star b/infra/config/recipes.star
index a898114..cdba2aff 100644
--- a/infra/config/recipes.star
+++ b/infra/config/recipes.star
@@ -2,144 +2,145 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-_RECIPE_NAME_PREFIX = 'recipe:'
+_RECIPE_NAME_PREFIX = "recipe:"
 
 def _recipe_for_package(cipd_package):
-  def recipe(*, name, cipd_version=None, recipe=None, use_bbagent=False):
-    # Force the caller to put the recipe prefix rather than adding it
-    # programatically to make the string greppable
-    if not name.startswith(_RECIPE_NAME_PREFIX):
-      fail("Recipe name {!r} does not start with {!r}"
-           .format(name, _RECIPE_NAME_PREFIX))
-    if recipe == None:
-      recipe = name[len(_RECIPE_NAME_PREFIX):]
-    return luci.recipe(
-        name = name,
-        cipd_package = cipd_package,
-        cipd_version = cipd_version,
-        recipe = recipe,
-        use_bbagent = use_bbagent,
-    )
-  return recipe
+    def recipe(*, name, cipd_version = None, recipe = None, use_bbagent = False):
+        # Force the caller to put the recipe prefix rather than adding it
+        # programatically to make the string greppable
+        if not name.startswith(_RECIPE_NAME_PREFIX):
+            fail("Recipe name {!r} does not start with {!r}"
+                .format(name, _RECIPE_NAME_PREFIX))
+        if recipe == None:
+            recipe = name[len(_RECIPE_NAME_PREFIX):]
+        return luci.recipe(
+            name = name,
+            cipd_package = cipd_package,
+            cipd_version = cipd_version,
+            recipe = recipe,
+            use_bbagent = use_bbagent,
+        )
 
+    return recipe
 
 build_recipe = _recipe_for_package(
-    'infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build')
-
-build_recipe(
-    name = 'recipe:android/avd_packager',
+    "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",
 )
 
 build_recipe(
-    name = 'recipe:android/sdk_packager',
+    name = "recipe:android/avd_packager",
 )
 
 build_recipe(
-    name = 'recipe:angle_chromium',
+    name = "recipe:android/sdk_packager",
 )
 
 build_recipe(
-    name = 'recipe:angle_chromium_trybot',
+    name = "recipe:angle_chromium",
 )
 
 build_recipe(
-    name = 'recipe:binary_size_generator_tot',
+    name = "recipe:angle_chromium_trybot",
 )
 
 build_recipe(
-    name = 'recipe:binary_size_trybot',
+    name = "recipe:binary_size_generator_tot",
 )
 
 build_recipe(
-    name = 'recipe:celab',
+    name = "recipe:binary_size_trybot",
 )
 
 build_recipe(
-    name = 'recipe:chromium',
+    name = "recipe:celab",
 )
 
 build_recipe(
-    name = 'recipe:chromium_afl',
+    name = "recipe:chromium",
 )
 
 build_recipe(
-    name = 'recipe:chromium_clang_coverage_tot',
+    name = "recipe:chromium_afl",
 )
 
 build_recipe(
-    name = 'recipe:chromium_codesearch',
+    name = "recipe:chromium_clang_coverage_tot",
+)
+
+build_recipe(
+    name = "recipe:chromium_codesearch",
     use_bbagent = True,
 )
 
 build_recipe(
-    name = 'recipe:chromium_export_metadata',
+    name = "recipe:chromium_export_metadata",
     use_bbagent = True,
 )
 
 build_recipe(
-    name = 'recipe:chromium_libfuzzer',
+    name = "recipe:chromium_libfuzzer",
 )
 
 build_recipe(
-    name = 'recipe:chromium_libfuzzer_trybot',
+    name = "recipe:chromium_libfuzzer_trybot",
 )
 
 build_recipe(
-    name = 'recipe:chromium_trybot',
+    name = "recipe:chromium_trybot",
 )
 
 build_recipe(
-    name = 'recipe:chromium_upload_clang',
+    name = "recipe:chromium_upload_clang",
 )
 
 build_recipe(
-    name = 'recipe:closure_compilation',
+    name = "recipe:closure_compilation",
 )
 
 build_recipe(
-    name = 'recipe:cronet',
+    name = "recipe:cronet",
 )
 
 build_recipe(
-    name = 'recipe:findit/chromium/compile',
+    name = "recipe:findit/chromium/compile",
 )
 
 build_recipe(
-    name = 'recipe:findit/chromium/export_bot_db',
+    name = "recipe:findit/chromium/export_bot_db",
 )
 
 build_recipe(
-    name = 'recipe:findit/chromium/single_revision',
+    name = "recipe:findit/chromium/single_revision",
 )
 
 build_recipe(
-    name = 'recipe:findit/chromium/update_components',
+    name = "recipe:findit/chromium/update_components",
 )
 
 build_recipe(
-    name = 'recipe:ios/try',
+    name = "recipe:ios/try",
 )
 
 build_recipe(
-    name = 'recipe:ios/unified_builder_tester',
+    name = "recipe:ios/unified_builder_tester",
 )
 
 build_recipe(
-    name = 'recipe:presubmit',
+    name = "recipe:presubmit",
 )
 
 build_recipe(
-    name = 'recipe:swarming/deterministic_build',
+    name = "recipe:swarming/deterministic_build",
 )
 
 build_recipe(
-    name = 'recipe:tricium_clang_tidy_wrapper',
+    name = "recipe:tricium_clang_tidy_wrapper",
 )
 
 build_recipe(
-    name = 'recipe:tricium_metrics',
+    name = "recipe:tricium_metrics",
 )
 
 build_recipe(
-    name = 'recipe:webrtc/chromium_ios',
+    name = "recipe:webrtc/chromium_ios",
 )
diff --git a/infra/config/subprojects/chromium/ci.star b/infra/config/subprojects/chromium/ci.star
index 3722db1..bd9ba973 100644
--- a/infra/config/subprojects/chromium/ci.star
+++ b/infra/config/subprojects/chromium/ci.star
@@ -2,14 +2,12 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'builder_name', 'cpu', 'goma', 'os')
-load('//lib/ci.star', 'ci')
-load('//project.star', 'settings')
-
+load("//lib/builders.star", "builder_name", "goma", "os")
+load("//lib/ci.star", "ci")
+load("//project.star", "settings")
 
 def main_console_if_on_branch():
-  return None if settings.is_master else settings.main_console_name
-
+    return None if settings.is_master else settings.main_console_name
 
 ci.set_defaults(
     settings,
@@ -21,309 +19,307 @@
 
 ci.declare_bucket(settings)
 
-
 # Automatically maintained consoles
 
 ci.console_view(
-    name = 'chromium',
+    name = "chromium",
     include_experimental_builds = True,
     ordering = {
-        '*type*': ci.ordering(short_names=['dbg', 'rel', 'off']),
-        'android':'*type*',
-        'fuchsia':'*type*',
-        'linux':'*type*',
-        'mac':'*type*',
-        'win':'*type*',
+        "*type*": ci.ordering(short_names = ["dbg", "rel", "off"]),
+        "android": "*type*",
+        "fuchsia": "*type*",
+        "linux": "*type*",
+        "mac": "*type*",
+        "win": "*type*",
     },
 )
 
 ci.console_view(
-    name = 'chromium.android',
+    name = "chromium.android",
     ordering = {
-        None: ['cronet', 'builder', 'tester'],
-        '*cpu*': ['arm', 'arm64', 'x86'],
-        'cronet': '*cpu*',
-        'builder': '*cpu*',
-        'builder|det': ci.ordering(short_names=['rel', 'dbg']),
-        'tester': ['phone', 'tablet'],
-        'builder_tester|arm64': ci.ordering(short_names=['M proguard']),
+        None: ["cronet", "builder", "tester"],
+        "*cpu*": ["arm", "arm64", "x86"],
+        "cronet": "*cpu*",
+        "builder": "*cpu*",
+        "builder|det": ci.ordering(short_names = ["rel", "dbg"]),
+        "tester": ["phone", "tablet"],
+        "builder_tester|arm64": ci.ordering(short_names = ["M proguard"]),
     },
 )
 
 ci.console_view(
-    name = 'chromium.android.fyi',
+    name = "chromium.android.fyi",
     ordering = {
-        None: ['android', 'memory', 'weblayer', 'webview'],
+        None: ["android", "memory", "weblayer", "webview"],
     },
 )
 
 ci.console_view(
-    name = 'chromium.chromiumos',
+    name = "chromium.chromiumos",
     ordering = {
-        None: ['default'],
-        'default': ci.ordering(short_names=['ful', 'rel']),
-        'simple': ['release', 'debug'],
+        None: ["default"],
+        "default": ci.ordering(short_names = ["ful", "rel"]),
+        "simple": ["release", "debug"],
     },
 )
 
 ci.console_view(
-    name = 'chromium.clang',
+    name = "chromium.clang",
     ordering = {
         None: [
-            'ToT Linux',
-            'ToT Android',
-            'ToT Mac',
-            'ToT Windows',
-            'ToT Code Coverage',
+            "ToT Linux",
+            "ToT Android",
+            "ToT Mac",
+            "ToT Windows",
+            "ToT Code Coverage",
         ],
-        'ToT Linux': ci.ordering(
-            short_names=['rel', 'ofi', 'dbg', 'asn', 'fuz', 'msn', 'tsn'],
+        "ToT Linux": ci.ordering(
+            short_names = ["rel", "ofi", "dbg", "asn", "fuz", "msn", "tsn"],
         ),
-        'ToT Android': ci.ordering(short_names=['rel', 'dbg', 'x64']),
-        'ToT Mac': ci.ordering(short_names=['rel', 'ofi', 'dbg']),
-        'ToT Windows': ci.ordering(
-            short_names=['rel', 'ofi'],
-            categories=['x64'],
+        "ToT Android": ci.ordering(short_names = ["rel", "dbg", "x64"]),
+        "ToT Mac": ci.ordering(short_names = ["rel", "ofi", "dbg"]),
+        "ToT Windows": ci.ordering(
+            short_names = ["rel", "ofi"],
+            categories = ["x64"],
         ),
-        'ToT Windows|x64': ci.ordering(short_names=['rel']),
-        'CFI|Win': ci.ordering(short_names=['x86', 'x64']),
-        'iOS': ['public'],
-        'iOS|public': ci.ordering(short_names=['sim', 'dev']),
+        "ToT Windows|x64": ci.ordering(short_names = ["rel"]),
+        "CFI|Win": ci.ordering(short_names = ["x86", "x64"]),
+        "iOS": ["public"],
+        "iOS|public": ci.ordering(short_names = ["sim", "dev"]),
     },
 )
 
 ci.console_view(
-    name = 'chromium.dawn',
+    name = "chromium.dawn",
     ordering = {
-        None: ['ToT'],
-        '*builder*': ['Builder'],
-        '*cpu*': ci.ordering(short_names=['x86']),
-        'ToT|Mac': '*builder*',
-        'ToT|Windows|Builder': '*cpu*',
-        'ToT|Windows|Intel': '*cpu*',
-        'ToT|Windows|Nvidia': '*cpu*',
-        'DEPS|Mac': '*builder*',
-        'DEPS|Windows|Builder': '*cpu*',
-        'DEPS|Windows|Intel': '*cpu*',
-        'DEPS|Windows|Nvidia': '*cpu*',
+        None: ["ToT"],
+        "*builder*": ["Builder"],
+        "*cpu*": ci.ordering(short_names = ["x86"]),
+        "ToT|Mac": "*builder*",
+        "ToT|Windows|Builder": "*cpu*",
+        "ToT|Windows|Intel": "*cpu*",
+        "ToT|Windows|Nvidia": "*cpu*",
+        "DEPS|Mac": "*builder*",
+        "DEPS|Windows|Builder": "*cpu*",
+        "DEPS|Windows|Intel": "*cpu*",
+        "DEPS|Windows|Nvidia": "*cpu*",
     },
 )
 
 ci.console_view(
-    name = 'chromium.fyi',
+    name = "chromium.fyi",
     ordering = {
         None: [
-            'closure_compilation',
-            'code_coverage',
-            'cronet',
-            'mac',
-            'deterministic',
-            'fuchsia',
-            'chromeos',
-            'iOS',
-            'linux',
-            'mojo',
-            'recipe',
-            'remote_run',
-            'site_isolation',
-            'network',
-            'viz',
-            'win10',
-            'win32',
+            "closure_compilation",
+            "code_coverage",
+            "cronet",
+            "mac",
+            "deterministic",
+            "fuchsia",
+            "chromeos",
+            "iOS",
+            "linux",
+            "mojo",
+            "recipe",
+            "remote_run",
+            "site_isolation",
+            "network",
+            "viz",
+            "win10",
+            "win32",
         ],
-        'code_coverage': ci.ordering(
-            short_names=['and', 'ann', 'lnx', 'lcr', 'mac']
+        "code_coverage": ci.ordering(
+            short_names = ["and", "ann", "lnx", "lcr", "mac"],
         ),
-        'mac': ci.ordering(short_names=['bld', '15', 'herm']),
-        'deterministic|mac': ci.ordering(short_names=['rel', 'dbg']),
-        'iOS|iOS13': ci.ordering(short_names=['dev', 'sim']),
-        'linux|blink': ci.ordering(short_names=['TD']),
+        "mac": ci.ordering(short_names = ["bld", "15", "herm"]),
+        "deterministic|mac": ci.ordering(short_names = ["rel", "dbg"]),
+        "iOS|iOS13": ci.ordering(short_names = ["dev", "sim"]),
+        "linux|blink": ci.ordering(short_names = ["TD"]),
     },
 )
 
 ci.console_view(
-    name ='chromium.fuzz',
+    name = "chromium.fuzz",
     ordering = {
         None: [
-            'afl',
-            'win asan',
-            'mac asan',
-            'cros asan',
-            'linux asan',
-            'libfuzz',
-            'linux msan',
-            'linux tsan',
+            "afl",
+            "win asan",
+            "mac asan",
+            "cros asan",
+            "linux asan",
+            "libfuzz",
+            "linux msan",
+            "linux tsan",
         ],
-        '*config*': ci.ordering(short_names=['dbg', 'rel']),
-        'win asan': '*config*',
-        'mac asan': '*config*',
-        'linux asan': '*config*',
-        'linux asan|x64 v8-ARM': '*config*',
-        'libfuzz': ci.ordering(short_names=[
-            'chromeos-asan',
-            'linux32',
-            'linux32-dbg',
-            'linux',
-            'linux-dbg',
-            'linux-msan',
-            'linux-ubsan',
-            'mac-asan',
-            'win-asan',
+        "*config*": ci.ordering(short_names = ["dbg", "rel"]),
+        "win asan": "*config*",
+        "mac asan": "*config*",
+        "linux asan": "*config*",
+        "linux asan|x64 v8-ARM": "*config*",
+        "libfuzz": ci.ordering(short_names = [
+            "chromeos-asan",
+            "linux32",
+            "linux32-dbg",
+            "linux",
+            "linux-dbg",
+            "linux-msan",
+            "linux-ubsan",
+            "mac-asan",
+            "win-asan",
         ]),
     },
 )
 
 ci.console_view(
-    name = 'chromium.gpu',
+    name = "chromium.gpu",
     ordering = {
-        None: ['Windows', 'Mac', 'Linux'],
+        None: ["Windows", "Mac", "Linux"],
     },
 )
 
 ci.console_view(
-    name = 'chromium.gpu.fyi',
+    name = "chromium.gpu.fyi",
     ordering = {
-        None: ['Windows', 'Mac', 'Linux'],
-        '*builder*': ['Builder'],
-        '*type*': ci.ordering(short_names=['rel', 'dbg', 'exp']),
-        '*cpu*': ci.ordering(short_names=['x86']),
-        'Windows': '*builder*',
-        'Windows|Builder': ['Release', 'dEQP', 'dx12vk', 'Debug'],
-        'Windows|Builder|Release': '*cpu*',
-        'Windows|Builder|dEQP': '*cpu*',
-        'Windows|Builder|dx12vk': '*type*',
-        'Windows|Builder|Debug': '*cpu*',
-        'Windows|10|x64|Intel': '*type*',
-        'Windows|10|x64|Nvidia': '*type*',
-        'Windows|10|x86|Nvidia': '*type*',
-        'Windows|7|x64|Nvidia': '*type*',
-        'Mac': '*builder*',
-        'Mac|Builder': '*type*',
-        'Mac|AMD|Retina': '*type*',
-        'Mac|Intel': '*type*',
-        'Mac|Nvidia': '*type*',
-        'Linux': '*builder*',
-        'Linux|Builder': '*type*',
-        'Linux|Intel': '*type*',
-        'Linux|Nvidia': '*type*',
-        'Android': ['L32', 'M64', 'N64', 'P32', 'vk', 'dqp', 'skgl', 'skv'],
-        'Android|M64': ['QCOM'],
+        None: ["Windows", "Mac", "Linux"],
+        "*builder*": ["Builder"],
+        "*type*": ci.ordering(short_names = ["rel", "dbg", "exp"]),
+        "*cpu*": ci.ordering(short_names = ["x86"]),
+        "Windows": "*builder*",
+        "Windows|Builder": ["Release", "dEQP", "dx12vk", "Debug"],
+        "Windows|Builder|Release": "*cpu*",
+        "Windows|Builder|dEQP": "*cpu*",
+        "Windows|Builder|dx12vk": "*type*",
+        "Windows|Builder|Debug": "*cpu*",
+        "Windows|10|x64|Intel": "*type*",
+        "Windows|10|x64|Nvidia": "*type*",
+        "Windows|10|x86|Nvidia": "*type*",
+        "Windows|7|x64|Nvidia": "*type*",
+        "Mac": "*builder*",
+        "Mac|Builder": "*type*",
+        "Mac|AMD|Retina": "*type*",
+        "Mac|Intel": "*type*",
+        "Mac|Nvidia": "*type*",
+        "Linux": "*builder*",
+        "Linux|Builder": "*type*",
+        "Linux|Intel": "*type*",
+        "Linux|Nvidia": "*type*",
+        "Android": ["L32", "M64", "N64", "P32", "vk", "dqp", "skgl", "skv"],
+        "Android|M64": ["QCOM"],
     },
 )
 
 ci.console_view(
-    name = 'chromium.linux',
+    name = "chromium.linux",
     ordering = {
-        None: ['release', 'debug'],
-        'release': ci.ordering(short_names=['bld', 'tst', 'nsl', 'gcc']),
-        'cast': ci.ordering(short_names=['vid', 'aud']),
+        None: ["release", "debug"],
+        "release": ci.ordering(short_names = ["bld", "tst", "nsl", "gcc"]),
+        "cast": ci.ordering(short_names = ["vid", "aud"]),
     },
 )
 
 ci.console_view(
-    name = 'chromium.mac',
+    name = "chromium.mac",
     ordering = {
-        None: ['release'],
-        'release': ci.ordering(short_names=['bld']),
-        'debug': ci.ordering(short_names=['bld']),
-        'ios|default': ci.ordering(short_names=['dev', 'sim']),
+        None: ["release"],
+        "release": ci.ordering(short_names = ["bld"]),
+        "debug": ci.ordering(short_names = ["bld"]),
+        "ios|default": ci.ordering(short_names = ["dev", "sim"]),
     },
 )
 
 ci.console_view(
-    name = 'chromium.memory',
+    name = "chromium.memory",
     ordering = {
-        None: ['win', 'mac', 'linux', 'cros'],
-        '*build-or-test*': ci.ordering(short_names=['bld', 'tst']),
-        'linux|TSan v2': '*build-or-test*',
-        'linux|asan lsan': '*build-or-test*',
-        'linux|webkit': ci.ordering(short_names=['asn', 'msn']),
+        None: ["win", "mac", "linux", "cros"],
+        "*build-or-test*": ci.ordering(short_names = ["bld", "tst"]),
+        "linux|TSan v2": "*build-or-test*",
+        "linux|asan lsan": "*build-or-test*",
+        "linux|webkit": ci.ordering(short_names = ["asn", "msn"]),
     },
 )
 
 ci.console_view(
-    name = 'chromium.swangle',
+    name = "chromium.swangle",
     ordering = {
-        None: ['DEPS', 'ToT ANGLE', 'ToT SwiftShader'],
-        '*os*': ['Windows', 'Mac'],
-        '*cpu*': ci.ordering(short_names=['x86', 'x64']),
-        'DEPS': '*os*',
-        'DEPS|Windows': '*cpu*',
-        'DEPS|Linux': '*cpu*',
-        'ToT ANGLE': '*os*',
-        'ToT ANGLE|Windows': '*cpu*',
-        'ToT ANGLE|Linux': '*cpu*',
-        'ToT SwiftShader': '*os*',
-        'ToT SwiftShader|Windows': '*cpu*',
-        'ToT SwiftShader|Linux': '*cpu*',
-        'Chromium': '*os*',
+        None: ["DEPS", "ToT ANGLE", "ToT SwiftShader"],
+        "*os*": ["Windows", "Mac"],
+        "*cpu*": ci.ordering(short_names = ["x86", "x64"]),
+        "DEPS": "*os*",
+        "DEPS|Windows": "*cpu*",
+        "DEPS|Linux": "*cpu*",
+        "ToT ANGLE": "*os*",
+        "ToT ANGLE|Windows": "*cpu*",
+        "ToT ANGLE|Linux": "*cpu*",
+        "ToT SwiftShader": "*os*",
+        "ToT SwiftShader|Windows": "*cpu*",
+        "ToT SwiftShader|Linux": "*cpu*",
+        "Chromium": "*os*",
     },
 )
 
 ci.console_view(
-    name = 'chromium.win',
+    name = "chromium.win",
     ordering = {
-        None: ['release', 'debug'],
-        'debug|builder': ci.ordering(short_names=['64', '32']),
-        'debug|tester': ci.ordering(short_names=['7', '10']),
+        None: ["release", "debug"],
+        "debug|builder": ci.ordering(short_names = ["64", "32"]),
+        "debug|tester": ci.ordering(short_names = ["7", "10"]),
     },
 )
 
 # Builders are sorted first lexicographically by the function used to define
 # them, then lexicographically by their name
 
-
 ci.android_builder(
-    name = 'Android WebView M (dbg)',
+    name = "Android WebView M (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|webview',
-        short_name = 'M',
+        category = "tester|webview",
+        short_name = "M",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Android WebView N (dbg)',
+    name = "Android WebView N (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|webview',
-        short_name = 'N',
+        category = "tester|webview",
+        short_name = "N",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Android WebView O (dbg)',
+    name = "Android WebView O (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|webview',
-        short_name = 'O',
+        category = "tester|webview",
+        short_name = "O",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Android WebView P (dbg)',
+    name = "Android WebView P (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|webview',
-        short_name = 'P',
+        category = "tester|webview",
+        short_name = "P",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Android arm Builder (dbg)',
+    name = "Android arm Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|arm',
-        short_name = '32',
+        category = "builder|arm",
+        short_name = "32",
     ),
     execution_timeout = 4 * time.hour,
     tree_closing = True,
 )
 
 ci.android_builder(
-    name = 'Android arm64 Builder (dbg)',
+    name = "Android arm64 Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|arm',
-        short_name = '64',
+        category = "builder|arm",
+        short_name = "64",
     ),
     goma_jobs = goma.jobs.MANY_JOBS_FOR_CI,
     execution_timeout = 5 * time.hour,
@@ -331,166 +327,166 @@
 )
 
 ci.android_builder(
-    name = 'Android x64 Builder (dbg)',
+    name = "Android x64 Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|x86',
-        short_name = '64',
+        category = "builder|x86",
+        short_name = "64",
     ),
     execution_timeout = 5 * time.hour,
 )
 
 ci.android_builder(
-    name = 'Android x86 Builder (dbg)',
+    name = "Android x86 Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|x86',
-        short_name = '32',
+        category = "builder|x86",
+        short_name = "32",
     ),
     execution_timeout = 4 * time.hour,
 )
 
 ci.android_builder(
-    name = 'Cast Android (dbg)',
+    name = "Cast Android (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'on_cq',
-        short_name = 'cst',
+        category = "on_cq",
+        short_name = "cst",
     ),
     tree_closing = True,
 )
 
 ci.android_builder(
-    name = 'Marshmallow 64 bit Tester',
+    name = "Marshmallow 64 bit Tester",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|phone',
-        short_name = 'M',
+        category = "tester|phone",
+        short_name = "M",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Nougat Phone Tester',
+    name = "Nougat Phone Tester",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|phone',
-        short_name = 'N',
+        category = "tester|phone",
+        short_name = "N",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Oreo Phone Tester',
+    name = "Oreo Phone Tester",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|phone',
-        short_name = 'O',
+        category = "tester|phone",
+        short_name = "O",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'android-cronet-arm-dbg',
+    name = "android-cronet-arm-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|arm',
-        short_name = 'dbg',
+        category = "cronet|arm",
+        short_name = "dbg",
     ),
-    notifies = ['cronet'],
+    notifies = ["cronet"],
 )
 
 ci.android_builder(
-    name = 'android-cronet-arm-rel',
+    name = "android-cronet-arm-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|arm',
-        short_name = 'rel',
+        category = "cronet|arm",
+        short_name = "rel",
     ),
-    notifies = ['cronet'],
+    notifies = ["cronet"],
 )
 
 ci.android_builder(
-    name = 'android-cronet-kitkat-arm-rel',
+    name = "android-cronet-kitkat-arm-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|test',
-        short_name = 'k',
+        category = "cronet|test",
+        short_name = "k",
     ),
-    notifies = ['cronet'],
-    triggered_by = [builder_name('android-cronet-arm-rel')],
+    notifies = ["cronet"],
+    triggered_by = [builder_name("android-cronet-arm-rel")],
 )
 
 ci.android_builder(
-    name = 'android-cronet-lollipop-arm-rel',
+    name = "android-cronet-lollipop-arm-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|test',
-        short_name = 'l',
+        category = "cronet|test",
+        short_name = "l",
     ),
-    notifies = ['cronet'],
-    triggered_by = [builder_name('android-cronet-arm-rel')],
+    notifies = ["cronet"],
+    triggered_by = [builder_name("android-cronet-arm-rel")],
 )
 
 ci.android_builder(
-    name = 'android-lollipop-arm-rel',
+    name = "android-lollipop-arm-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'on_cq',
-        short_name = 'L',
+        category = "on_cq",
+        short_name = "L",
     ),
     tree_closing = True,
 )
 
 ci.android_builder(
-    name = 'android-marshmallow-arm64-rel',
+    name = "android-marshmallow-arm64-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'on_cq',
-        short_name = 'M',
+        category = "on_cq",
+        short_name = "M",
     ),
     tree_closing = True,
 )
 
 ci.android_builder(
-    name = 'android-marshmallow-x86-rel',
+    name = "android-marshmallow-x86-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'builder_tester|x86',
-        short_name = 'M',
+        category = "builder_tester|x86",
+        short_name = "M",
     ),
 )
 
 ci.android_builder(
-    name = 'android-nougat-arm64-rel',
+    name = "android-nougat-arm64-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'builder_tester|arm64',
-        short_name = 'N',
+        category = "builder_tester|arm64",
+        short_name = "N",
     ),
 )
 
 ci.android_builder(
-    name = 'android-pie-arm64-dbg',
+    name = "android-pie-arm64-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|phone',
-        short_name = 'P',
+        category = "tester|phone",
+        short_name = "P",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'android-pie-arm64-rel',
+    name = "android-pie-arm64-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'on_cq',
-        short_name = 'P',
+        category = "on_cq",
+        short_name = "P",
     ),
     tree_closing = True,
 )
 
 ci.chromium_builder(
-    name = 'android-official',
+    name = "android-official",
     main_console_view = settings.main_console_name,
     console_view_entry = ci.console_view_entry(
-        category = 'android',
-        short_name = 'off',
+        category = "android",
+        short_name = "off",
     ),
     cores = 32,
     tree_closing = False,
 )
 
 ci.chromium_builder(
-    name = 'fuchsia-official',
+    name = "fuchsia-official",
     main_console_view = settings.main_console_name,
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia',
-        short_name = 'off',
+        category = "fuchsia",
+        short_name = "off",
     ),
     cores = 32,
     # TODO: Change this back down to something reasonable once these builders
@@ -500,14 +496,14 @@
 )
 
 ci.chromium_builder(
-    name = 'linux-official',
+    name = "linux-official",
     builderless = False,
     # TODO(https://crbug.com/1072012) Use the default console view and add
     # main_console_view = settings.main_console_name once the build is green
-    console_view = 'chromium.fyi',
+    console_view = "chromium.fyi",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
-        short_name = 'off',
+        category = "linux",
+        short_name = "off",
     ),
     cores = 32,
     # TODO: Change this back down to something reasonable once these builders
@@ -517,11 +513,11 @@
 )
 
 ci.chromium_builder(
-    name = 'win-official',
+    name = "win-official",
     main_console_view = settings.main_console_name,
     console_view_entry = ci.console_view_entry(
-        category = 'win|off',
-        short_name = '64',
+        category = "win|off",
+        short_name = "64",
     ),
     cores = 32,
     os = os.WINDOWS_DEFAULT,
@@ -530,11 +526,11 @@
 )
 
 ci.chromium_builder(
-    name = 'win32-official',
+    name = "win32-official",
     main_console_view = settings.main_console_name,
     console_view_entry = ci.console_view_entry(
-        category = 'win|off',
-        short_name = '32',
+        category = "win|off",
+        short_name = "32",
     ),
     cores = 32,
     os = os.WINDOWS_DEFAULT,
@@ -543,55 +539,55 @@
 )
 
 ci.chromiumos_builder(
-    name = 'chromeos-amd64-generic-dbg',
+    name = "chromeos-amd64-generic-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'simple|debug|x64',
-        short_name = 'dbg',
+        category = "simple|debug|x64",
+        short_name = "dbg",
     ),
     main_console_view = settings.main_console_name,
 )
 
 ci.chromiumos_builder(
-    name = 'chromeos-amd64-generic-rel',
+    name = "chromeos-amd64-generic-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'simple|release|x64',
-        short_name = 'rel',
+        category = "simple|release|x64",
+        short_name = "rel",
     ),
     main_console_view = settings.main_console_name,
 )
 
 ci.chromiumos_builder(
-    name = 'chromeos-arm-generic-rel',
+    name = "chromeos-arm-generic-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'simple|release',
-        short_name = 'arm',
+        category = "simple|release",
+        short_name = "arm",
     ),
     main_console_view = settings.main_console_name,
 )
 
 ci.chromiumos_builder(
-    name = 'linux-chromeos-dbg',
+    name = "linux-chromeos-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'default',
-        short_name = 'dbg',
+        category = "default",
+        short_name = "dbg",
     ),
     main_console_view = settings.main_console_name,
 )
 
 ci.chromiumos_builder(
-    name = 'linux-chromeos-rel',
+    name = "linux-chromeos-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'default',
-        short_name = 'rel',
+        category = "default",
+        short_name = "rel",
     ),
     main_console_view = settings.main_console_name,
 )
 
 ci.chromiumos_builder(
-    name = 'linux-lacros-builder-rel',
+    name = "linux-lacros-builder-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'default',
-        short_name = 'lcr',
+        category = "default",
+        short_name = "lcr",
     ),
     main_console_view = settings.main_console_name,
     # TODO(crbug.com/1104291): Enable tree closing.
@@ -599,56 +595,56 @@
 )
 
 ci.chromiumos_builder(
-    name = 'linux-lacros-tester-rel',
+    name = "linux-lacros-tester-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'default',
-        short_name = 'lcr',
+        category = "default",
+        short_name = "lcr",
     ),
     main_console_view = settings.main_console_name,
-    triggered_by = ['linux-lacros-builder-rel'],
+    triggered_by = ["linux-lacros-builder-rel"],
     # TODO(crbug.com/1104291): Enable tree closing.
     tree_closing = False,
 )
 
 ci.dawn_builder(
-    name = 'Dawn Linux x64 DEPS Builder',
+    name = "Dawn Linux x64 DEPS Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Linux|Builder',
-        short_name = 'x64',
+        category = "DEPS|Linux|Builder",
+        short_name = "x64",
     ),
     main_console_view = None,
 )
 
 ci.dawn_builder(
-    name = 'Dawn Linux x64 DEPS Release (Intel HD 630)',
+    name = "Dawn Linux x64 DEPS Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Linux|Intel',
-        short_name = 'x64',
+        category = "DEPS|Linux|Intel",
+        short_name = "x64",
     ),
     cores = 2,
     main_console_view = None,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Linux x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Linux x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Linux x64 DEPS Release (NVIDIA)',
+    name = "Dawn Linux x64 DEPS Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Linux|Nvidia',
-        short_name = 'x64',
+        category = "DEPS|Linux|Nvidia",
+        short_name = "x64",
     ),
     cores = 2,
     main_console_view = None,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Linux x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Linux x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Mac x64 DEPS Builder',
+    name = "Dawn Mac x64 DEPS Builder",
     builderless = False,
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Mac|Builder',
-        short_name = 'x64',
+        category = "DEPS|Mac|Builder",
+        short_name = "x64",
     ),
     cores = None,
     main_console_view = None,
@@ -658,356 +654,351 @@
 # Note that the Mac testers are all thin Linux VMs, triggering jobs on the
 # physical Mac hardware in the Swarming pool which is why they run on linux
 ci.dawn_builder(
-    name = 'Dawn Mac x64 DEPS Release (AMD)',
+    name = "Dawn Mac x64 DEPS Release (AMD)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Mac|AMD',
-        short_name = 'x64',
+        category = "DEPS|Mac|AMD",
+        short_name = "x64",
     ),
     cores = 2,
     main_console_view = None,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Mac x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Mac x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Mac x64 DEPS Release (Intel)',
+    name = "Dawn Mac x64 DEPS Release (Intel)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Mac|Intel',
-        short_name = 'x64',
+        category = "DEPS|Mac|Intel",
+        short_name = "x64",
     ),
     cores = 2,
     main_console_view = None,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Mac x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Mac x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x64 DEPS Builder',
+    name = "Dawn Win10 x64 DEPS Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Builder',
-        short_name = 'x64',
+        category = "DEPS|Windows|Builder",
+        short_name = "x64",
     ),
     main_console_view = None,
     os = os.WINDOWS_ANY,
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x64 DEPS Release (Intel HD 630)',
+    name = "Dawn Win10 x64 DEPS Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Intel',
-        short_name = 'x64',
+        category = "DEPS|Windows|Intel",
+        short_name = "x64",
     ),
     cores = 2,
     main_console_view = None,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Win10 x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Win10 x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x64 DEPS Release (NVIDIA)',
+    name = "Dawn Win10 x64 DEPS Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Nvidia',
-        short_name = 'x64',
+        category = "DEPS|Windows|Nvidia",
+        short_name = "x64",
     ),
     cores = 2,
     main_console_view = None,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Win10 x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Win10 x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x86 DEPS Builder',
+    name = "Dawn Win10 x86 DEPS Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Builder',
-        short_name = 'x86',
+        category = "DEPS|Windows|Builder",
+        short_name = "x86",
     ),
     main_console_view = None,
     os = os.WINDOWS_ANY,
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x86 DEPS Release (Intel HD 630)',
+    name = "Dawn Win10 x86 DEPS Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Intel',
-        short_name = 'x86',
+        category = "DEPS|Windows|Intel",
+        short_name = "x86",
     ),
     cores = 2,
     main_console_view = None,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Win10 x86 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Win10 x86 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x86 DEPS Release (NVIDIA)',
+    name = "Dawn Win10 x86 DEPS Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Nvidia',
-        short_name = 'x86',
+        category = "DEPS|Windows|Nvidia",
+        short_name = "x86",
     ),
     cores = 2,
     main_console_view = None,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Win10 x86 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Win10 x86 DEPS Builder")],
 )
 
-
 ci.fyi_builder(
-    name = 'VR Linux',
+    name = "VR Linux",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
+        category = "linux",
     ),
     main_console_view = None,
 )
 
 ci.fyi_ios_builder(
-    name = 'ios-simulator-cronet',
+    name = "ios-simulator-cronet",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet',
+        category = "cronet",
     ),
-    executable = 'recipe:chromium',
+    executable = "recipe:chromium",
     main_console_view = None,
-    notifies = ['cronet'],
+    notifies = ["cronet"],
     properties = {
-        'xcode_build_version': '11e146',
+        "xcode_build_version": "11e146",
     },
 )
 
-
 ci.gpu_builder(
-    name = 'Android Release (Nexus 5X)',
+    name = "Android Release (Nexus 5X)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android',
+        category = "Android",
     ),
 )
 
 ci.gpu_builder(
-    name = 'GPU Linux Builder',
+    name = "GPU Linux Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux',
+        category = "Linux",
     ),
 )
 
 ci.gpu_builder(
-    name = 'GPU Mac Builder',
+    name = "GPU Mac Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac',
+        category = "Mac",
     ),
     cores = None,
     os = os.MAC_ANY,
 )
 
 ci.gpu_builder(
-    name = 'GPU Win x64 Builder',
+    name = "GPU Win x64 Builder",
     builderless = True,
     console_view_entry = ci.console_view_entry(
-        category = 'Windows',
+        category = "Windows",
     ),
     os = os.WINDOWS_ANY,
 )
 
-
 ci.gpu_thin_tester(
-    name = 'Linux Release (NVIDIA)',
+    name = "Linux Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux',
+        category = "Linux",
     ),
-    triggered_by = [builder_name('GPU Linux Builder')],
+    triggered_by = [builder_name("GPU Linux Builder")],
 )
 
 ci.gpu_thin_tester(
-    name = 'Mac Release (Intel)',
+    name = "Mac Release (Intel)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac',
+        category = "Mac",
     ),
-    triggered_by = [builder_name('GPU Mac Builder')],
+    triggered_by = [builder_name("GPU Mac Builder")],
 )
 
 ci.gpu_thin_tester(
-    name = 'Mac Retina Release (AMD)',
+    name = "Mac Retina Release (AMD)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac',
+        category = "Mac",
     ),
-    triggered_by = [builder_name('GPU Mac Builder')],
+    triggered_by = [builder_name("GPU Mac Builder")],
 )
 
 ci.gpu_thin_tester(
-    name = 'Win10 x64 Release (NVIDIA)',
+    name = "Win10 x64 Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows',
+        category = "Windows",
     ),
-    triggered_by = [builder_name('GPU Win x64 Builder')],
+    triggered_by = [builder_name("GPU Win x64 Builder")],
 )
 
-
 ci.linux_builder(
-    name = 'Cast Linux',
+    name = "Cast Linux",
     console_view_entry = ci.console_view_entry(
-        category = 'cast',
-        short_name = 'vid',
+        category = "cast",
+        short_name = "vid",
     ),
     goma_jobs = goma.jobs.J50,
     main_console_view = settings.main_console_name,
 )
 
 ci.linux_builder(
-    name = 'Fuchsia ARM64',
+    name = "Fuchsia ARM64",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|a64',
-        short_name = 'rel',
+        category = "fuchsia|a64",
+        short_name = "rel",
     ),
     main_console_view = settings.main_console_name,
-    extra_notifies = ['cr-fuchsia'],
+    extra_notifies = ["cr-fuchsia"],
 )
 
 ci.linux_builder(
-    name = 'Fuchsia x64',
+    name = "Fuchsia x64",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|x64',
-        short_name = 'rel',
+        category = "fuchsia|x64",
+        short_name = "rel",
     ),
     main_console_view = settings.main_console_name,
-    extra_notifies = ['cr-fuchsia'],
+    extra_notifies = ["cr-fuchsia"],
 )
 
 ci.linux_builder(
-    name = 'Linux Builder',
+    name = "Linux Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'bld',
+        category = "release",
+        short_name = "bld",
     ),
     main_console_view = settings.main_console_name,
 )
 
 ci.linux_builder(
-    name = 'Linux Builder (dbg)',
+    name = "Linux Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|builder',
-        short_name = '64',
+        category = "debug|builder",
+        short_name = "64",
     ),
     main_console_view = settings.main_console_name,
 )
 
 ci.linux_builder(
-    name = 'Linux Tests',
+    name = "Linux Tests",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'tst',
+        category = "release",
+        short_name = "tst",
     ),
     goma_backend = None,
     main_console_view = settings.main_console_name,
-    triggered_by = [builder_name('Linux Builder')],
+    triggered_by = [builder_name("Linux Builder")],
 )
 
 ci.linux_builder(
-    name = 'Linux Tests (dbg)(1)',
+    name = "Linux Tests (dbg)(1)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|tester',
-        short_name = '64',
+        category = "debug|tester",
+        short_name = "64",
     ),
     main_console_view = settings.main_console_name,
-    triggered_by = [builder_name('Linux Builder (dbg)')],
+    triggered_by = [builder_name("Linux Builder (dbg)")],
 )
 
 ci.linux_builder(
-    name = 'fuchsia-arm64-cast',
+    name = "fuchsia-arm64-cast",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|cast',
-        short_name = 'a64',
+        category = "fuchsia|cast",
+        short_name = "a64",
     ),
     main_console_view = settings.main_console_name,
     # Set tree_closing to false to disable the defaualt tree closer, which
     # filters by step name, and instead enable tree closing for any step
     # failure.
     tree_closing = False,
-    extra_notifies = ['cr-fuchsia', 'close-on-any-step-failure'],
+    extra_notifies = ["cr-fuchsia", "close-on-any-step-failure"],
 )
 
 ci.linux_builder(
-    name = 'fuchsia-x64-cast',
+    name = "fuchsia-x64-cast",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|cast',
-        short_name = 'x64',
+        category = "fuchsia|cast",
+        short_name = "x64",
     ),
     main_console_view = settings.main_console_name,
     # Set tree_closing to false to disable the defaualt tree closer, which
     # filters by step name, and instead enable tree closing for any step
     # failure.
     tree_closing = False,
-    extra_notifies = ['cr-fuchsia', 'close-on-any-step-failure'],
+    extra_notifies = ["cr-fuchsia", "close-on-any-step-failure"],
 )
 
 ci.linux_builder(
-    name = 'linux-ozone-rel',
+    name = "linux-ozone-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'ozo',
+        category = "release",
+        short_name = "ozo",
     ),
     main_console_view = settings.main_console_name,
     # Set tree_closing to false to disable the defaualt tree closer, which
     # filters by step name, and instead enable tree closing for any step
     # failure.
     tree_closing = False,
-    extra_notifies = ['linux-ozone-rel', 'close-on-any-step-failure'],
+    extra_notifies = ["linux-ozone-rel", "close-on-any-step-failure"],
 )
 
 ci.linux_builder(
-    name = 'Linux Ozone Tester (Headless)',
-    console_view = 'chromium.fyi',
+    name = "Linux Ozone Tester (Headless)",
+    console_view = "chromium.fyi",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
-        short_name = 'loh',
+        category = "linux",
+        short_name = "loh",
     ),
     main_console_view = None,
-    triggered_by = [builder_name('linux-ozone-rel')],
+    triggered_by = [builder_name("linux-ozone-rel")],
 )
 
 ci.linux_builder(
-    name = 'Linux Ozone Tester (Wayland)',
-    console_view = 'chromium.fyi',
+    name = "Linux Ozone Tester (Wayland)",
+    console_view = "chromium.fyi",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
-        short_name = 'low',
+        category = "linux",
+        short_name = "low",
     ),
     main_console_view = None,
-    triggered_by = [builder_name('linux-ozone-rel')],
+    triggered_by = [builder_name("linux-ozone-rel")],
 )
 
 ci.linux_builder(
-    name = 'Linux Ozone Tester (X11)',
-    console_view = 'chromium.fyi',
+    name = "Linux Ozone Tester (X11)",
+    console_view = "chromium.fyi",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
-        short_name = 'lox',
+        category = "linux",
+        short_name = "lox",
     ),
     main_console_view = None,
-    triggered_by = [builder_name('linux-ozone-rel')],
+    triggered_by = [builder_name("linux-ozone-rel")],
 )
 
-
 ci.mac_builder(
-    name = 'Mac Builder',
+    name = "Mac Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'bld',
+        category = "release",
+        short_name = "bld",
     ),
     main_console_view = settings.main_console_name,
     os = os.MAC_10_15,
 )
 
 ci.mac_builder(
-    name = 'Mac Builder (dbg)',
+    name = "Mac Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug',
-        short_name = 'bld',
+        category = "debug",
+        short_name = "bld",
     ),
     main_console_view = settings.main_console_name,
     os = os.MAC_ANY,
 )
 
 ci.mac_builder(
-    name = 'mac-arm64',
+    name = "mac-arm64",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'a64',
+        category = "release",
+        short_name = "a64",
     ),
     main_console_view = settings.main_console_name,
     cores = None,
@@ -1015,190 +1006,187 @@
 )
 
 ci.thin_tester(
-    name = 'Mac10.10 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.10 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '10',
+        category = "release",
+        short_name = "10",
     ),
     main_console_view = settings.main_console_name,
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.11 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.11 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '11',
+        category = "release",
+        short_name = "11",
     ),
     main_console_view = settings.main_console_name,
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.12 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.12 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '12',
+        category = "release",
+        short_name = "12",
     ),
     main_console_view = settings.main_console_name,
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.13 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.13 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '13',
+        category = "release",
+        short_name = "13",
     ),
     main_console_view = settings.main_console_name,
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.14 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.14 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '14',
+        category = "release",
+        short_name = "14",
     ),
     main_console_view = settings.main_console_name,
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.15 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.15 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '15',
+        category = "release",
+        short_name = "15",
     ),
     main_console_view = settings.main_console_name,
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.13 Tests (dbg)',
-    mastername = 'chromium.mac',
+    name = "Mac10.13 Tests (dbg)",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'debug',
-        short_name = '13',
+        category = "debug",
+        short_name = "13",
     ),
     main_console_view = settings.main_console_name,
-    triggered_by = [builder_name('Mac Builder (dbg)')],
+    triggered_by = [builder_name("Mac Builder (dbg)")],
 )
 
 ci.thin_tester(
-    name = 'WebKit Mac10.13 (retina)',
-    mastername = 'chromium.mac',
+    name = "WebKit Mac10.13 (retina)",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'ret',
+        category = "release",
+        short_name = "ret",
     ),
     main_console_view = settings.main_console_name,
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
-
 ci.mac_ios_builder(
-    name = 'ios-simulator',
+    name = "ios-simulator",
     console_view_entry = ci.console_view_entry(
-        category = 'ios|default',
-        short_name = 'sim',
+        category = "ios|default",
+        short_name = "sim",
     ),
     main_console_view = settings.main_console_name,
 )
 
 ci.mac_ios_builder(
-    name = 'ios-simulator-full-configs',
+    name = "ios-simulator-full-configs",
     console_view_entry = ci.console_view_entry(
-        category = 'ios|default',
-        short_name = 'ful',
+        category = "ios|default",
+        short_name = "ful",
     ),
     main_console_view = settings.main_console_name,
 )
 
-
 ci.memory_builder(
-    name = 'Linux ASan LSan Builder',
+    name = "Linux ASan LSan Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|asan lsan',
-        short_name = 'bld',
+        category = "linux|asan lsan",
+        short_name = "bld",
     ),
     main_console_view = settings.main_console_name,
     ssd = True,
 )
 
 ci.memory_builder(
-    name = 'Linux ASan LSan Tests (1)',
+    name = "Linux ASan LSan Tests (1)",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|asan lsan',
-        short_name = 'tst',
+        category = "linux|asan lsan",
+        short_name = "tst",
     ),
     main_console_view = settings.main_console_name,
-    triggered_by = [builder_name('Linux ASan LSan Builder')],
+    triggered_by = [builder_name("Linux ASan LSan Builder")],
 )
 
 ci.memory_builder(
-    name = 'Linux ASan Tests (sandboxed)',
+    name = "Linux ASan Tests (sandboxed)",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|asan lsan',
-        short_name = 'sbx',
+        category = "linux|asan lsan",
+        short_name = "sbx",
     ),
     main_console_view = settings.main_console_name,
-    triggered_by = [builder_name('Linux ASan LSan Builder')],
+    triggered_by = [builder_name("Linux ASan LSan Builder")],
 )
 
 ci.memory_builder(
-    name = 'Linux TSan Builder',
+    name = "Linux TSan Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|TSan v2',
-        short_name = 'bld',
+        category = "linux|TSan v2",
+        short_name = "bld",
     ),
     main_console_view = settings.main_console_name,
 )
 
 ci.memory_builder(
-    name = 'Linux TSan Tests',
+    name = "Linux TSan Tests",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|TSan v2',
-        short_name = 'tst',
+        category = "linux|TSan v2",
+        short_name = "tst",
     ),
-    triggered_by = [builder_name('Linux TSan Builder')],
+    triggered_by = [builder_name("Linux TSan Builder")],
     main_console_view = settings.main_console_name,
 )
 
-
 ci.win_builder(
-    name = 'Win7 Tests (dbg)(1)',
+    name = "Win7 Tests (dbg)(1)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|tester',
-        short_name = '7',
+        category = "debug|tester",
+        short_name = "7",
     ),
     os = os.WINDOWS_7,
     main_console_view = settings.main_console_name,
-    triggered_by = [builder_name('Win Builder (dbg)')],
+    triggered_by = [builder_name("Win Builder (dbg)")],
 )
 
 ci.win_builder(
-    name = 'Win 7 Tests x64 (1)',
+    name = "Win 7 Tests x64 (1)",
     console_view_entry = ci.console_view_entry(
-        category = 'release|tester',
-        short_name = '64',
+        category = "release|tester",
+        short_name = "64",
     ),
     os = os.WINDOWS_7,
     main_console_view = settings.main_console_name,
-    triggered_by = [builder_name('Win x64 Builder')],
+    triggered_by = [builder_name("Win x64 Builder")],
 )
 
 ci.win_builder(
-    name = 'Win Builder (dbg)',
+    name = "Win Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|builder',
-        short_name = '32',
+        category = "debug|builder",
+        short_name = "32",
     ),
     cores = 32,
     main_console_view = settings.main_console_name,
@@ -1206,10 +1194,10 @@
 )
 
 ci.win_builder(
-    name = 'Win x64 Builder',
+    name = "Win x64 Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'release|builder',
-        short_name = '64',
+        category = "release|builder",
+        short_name = "64",
     ),
     cores = 32,
     main_console_view = settings.main_console_name,
@@ -1217,11 +1205,11 @@
 )
 
 ci.win_builder(
-    name = 'Win10 Tests x64',
+    name = "Win10 Tests x64",
     console_view_entry = ci.console_view_entry(
-        category = 'release|tester',
-        short_name = 'w10',
+        category = "release|tester",
+        short_name = "w10",
     ),
     main_console_view = settings.main_console_name,
-    triggered_by = [builder_name('Win x64 Builder')],
+    triggered_by = [builder_name("Win x64 Builder")],
 )
diff --git a/infra/config/subprojects/chromium/master-only/ci.star b/infra/config/subprojects/chromium/master-only/ci.star
index b51c09e..e48c73d 100644
--- a/infra/config/subprojects/chromium/master-only/ci.star
+++ b/infra/config/subprojects/chromium/master-only/ci.star
@@ -2,127 +2,123 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'cpu', 'goma', 'os', 'xcode_cache')
-load('//lib/ci.star', 'ci')
-load('//project.star', 'settings')
+load("//lib/builders.star", "cpu", "goma", "os", "xcode_cache")
+load("//lib/ci.star", "ci")
+load("//project.star", "settings")
 
 # Execute the versioned files to define all of the per-branch entities
 # (bucket, builders, console, poller, etc.)
-exec('../versioned/m84/buckets/ci.star')
-exec('../versioned/m85/buckets/ci.star')
-
+exec("../versioned/m84/buckets/ci.star")
+exec("../versioned/m85/buckets/ci.star")
 
 ci.set_defaults(
     settings,
     add_to_console_view = True,
 )
 
-
 # *** After this point everything is trunk only ***
 
 # The chromium.clang console includes some entries for builders from the chrome project
 [luci.console_view_entry(
-    builder = 'chrome:ci/{}'.format(name),
-    console_view = 'chromium.clang',
+    builder = "chrome:ci/{}".format(name),
+    console_view = "chromium.clang",
     category = category,
     short_name = short_name,
 ) for name, category, short_name in (
-    ('ToTLinuxOfficial', 'ToT Linux', 'ofi'),
-    ('ToTMacOfficial', 'ToT Mac', 'ofi'),
-    ('ToTWin', 'ToT Windows', 'rel'),
-    ('ToTWin64', 'ToT Windows|x64', 'rel'),
-    ('ToTWinOfficial', 'ToT Windows', 'ofi'),
-    ('ToTWinThinLTO64', 'ToT Windows|x64', 'lto'),
-    ('clang-tot-device', 'iOS|internal', 'dev'),
+    ("ToTLinuxOfficial", "ToT Linux", "ofi"),
+    ("ToTMacOfficial", "ToT Mac", "ofi"),
+    ("ToTWin", "ToT Windows", "rel"),
+    ("ToTWin64", "ToT Windows|x64", "rel"),
+    ("ToTWinOfficial", "ToT Windows", "ofi"),
+    ("ToTWinThinLTO64", "ToT Windows|x64", "lto"),
+    ("clang-tot-device", "iOS|internal", "dev"),
 )]
 
 # The main console includes some entries for builders from the chrome project
 [luci.console_view_entry(
-    builder = 'chrome:ci/{}'.format(name),
-    console_view = 'main',
-    category = 'chrome',
+    builder = "chrome:ci/{}".format(name),
+    console_view = "main",
+    category = "chrome",
     short_name = short_name,
 ) for name, short_name in (
-    ('linux-chromeos-chrome', 'cro'),
-    ('linux-chrome', 'lnx'),
-    ('mac-chrome', 'mac'),
-    ('win-chrome', 'win'),
-    ('win64-chrome', 'win'),
+    ("linux-chromeos-chrome", "cro"),
+    ("linux-chrome", "lnx"),
+    ("mac-chrome", "mac"),
+    ("win-chrome", "win"),
+    ("win64-chrome", "win"),
 )]
 
-
 # Builders are sorted first lexicographically by the function used to define
 # them, then lexicographically by their name
 
-
 ci.builder(
-    name = 'android-avd-packager',
-    executable = 'recipe:android/avd_packager',
+    name = "android-avd-packager",
+    executable = "recipe:android/avd_packager",
     properties = {
-        'avd_configs': [
-            'tools/android/avd/proto/creation/generic_android23.textpb',
-            'tools/android/avd/proto/creation/generic_android28.textpb',
-            'tools/android/avd/proto/creation/generic_playstore_android28.textpb',
+        "avd_configs": [
+            "tools/android/avd/proto/creation/generic_android23.textpb",
+            "tools/android/avd/proto/creation/generic_android28.textpb",
+            "tools/android/avd/proto/creation/generic_playstore_android28.textpb",
         ],
     },
-    schedule = '0 7 * * 0 *',
-    service_account = 'chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com',
+    schedule = "0 7 * * 0 *",
+    service_account = "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com",
     triggered_by = [],
 )
 
 ci.builder(
-    name = 'android-sdk-packager',
-    executable = 'recipe:android/sdk_packager',
-    schedule = '0 7 * * 0 *',
-    service_account = 'chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com',
+    name = "android-sdk-packager",
+    executable = "recipe:android/sdk_packager",
+    schedule = "0 7 * * 0 *",
+    service_account = "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com",
     triggered_by = [],
     properties = {
         # We still package part of build-tools;25.0.2 to support
         # http://bit.ly/2KNUygZ
-        'packages': [
+        "packages": [
             {
-                'sdk_package_name': 'build-tools;25.0.2',
-                'cipd_yaml': 'third_party/android_sdk/cipd/build-tools/25.0.2.yaml'
+                "sdk_package_name": "build-tools;25.0.2",
+                "cipd_yaml": "third_party/android_sdk/cipd/build-tools/25.0.2.yaml",
             },
             {
-                'sdk_package_name': 'build-tools;29.0.2',
-                'cipd_yaml': 'third_party/android_sdk/cipd/build-tools/29.0.2.yaml'
+                "sdk_package_name": "build-tools;29.0.2",
+                "cipd_yaml": "third_party/android_sdk/cipd/build-tools/29.0.2.yaml",
             },
             {
-                'sdk_package_name': 'build-tools;30.0.1',
-                'cipd_yaml': 'third_party/android_sdk/cipd/build-tools/30.0.1.yaml'
+                "sdk_package_name": "build-tools;30.0.1",
+                "cipd_yaml": "third_party/android_sdk/cipd/build-tools/30.0.1.yaml",
             },
             {
-                'sdk_package_name': 'cmdline-tools;latest',
-                'cipd_yaml': 'third_party/android_sdk/cipd/cmdline-tools.yaml'
+                "sdk_package_name": "cmdline-tools;latest",
+                "cipd_yaml": "third_party/android_sdk/cipd/cmdline-tools.yaml",
             },
             {
-                'sdk_package_name': 'emulator',
-                'cipd_yaml': 'third_party/android_sdk/cipd/emulator.yaml'
+                "sdk_package_name": "emulator",
+                "cipd_yaml": "third_party/android_sdk/cipd/emulator.yaml",
             },
             {
-                'sdk_package_name': 'extras;google;gcm',
-                'cipd_yaml': 'third_party/android_sdk/cipd/extras/google/gcm.yaml'
+                "sdk_package_name": "extras;google;gcm",
+                "cipd_yaml": "third_party/android_sdk/cipd/extras/google/gcm.yaml",
             },
             {
-                'sdk_package_name': 'patcher;v4',
-                'cipd_yaml': 'third_party/android_sdk/cipd/patcher/v4.yaml'
+                "sdk_package_name": "patcher;v4",
+                "cipd_yaml": "third_party/android_sdk/cipd/patcher/v4.yaml",
             },
             {
-                'sdk_package_name': 'platforms;android-29',
-                'cipd_yaml': 'third_party/android_sdk/cipd/platforms/android-29.yaml'
+                "sdk_package_name": "platforms;android-29",
+                "cipd_yaml": "third_party/android_sdk/cipd/platforms/android-29.yaml",
             },
             {
-                'sdk_package_name': 'platforms;android-30',
-                'cipd_yaml': 'third_party/android_sdk/cipd/platforms/android-30.yaml'
+                "sdk_package_name": "platforms;android-30",
+                "cipd_yaml": "third_party/android_sdk/cipd/platforms/android-30.yaml",
             },
             {
-                'sdk_package_name': 'platform-tools',
-                'cipd_yaml': 'third_party/android_sdk/cipd/platform-tools.yaml'
+                "sdk_package_name": "platform-tools",
+                "cipd_yaml": "third_party/android_sdk/cipd/platform-tools.yaml",
             },
             {
-                'sdk_package_name': 'sources;android-29',
-                'cipd_yaml': 'third_party/android_sdk/cipd/sources/android-29.yaml'
+                "sdk_package_name": "sources;android-29",
+                "cipd_yaml": "third_party/android_sdk/cipd/sources/android-29.yaml",
             },
             # Not yet available as R is not released to AOSP.
             #{
@@ -130,31 +126,30 @@
             #    'cipd_yaml': 'third_party/android_sdk/cipd/sources/android-30.yaml'
             #},
             {
-                'sdk_package_name': 'system-images;android-29;google_apis;x86',
-                'cipd_yaml': 'third_party/android_sdk/cipd/system_images/android-29/google_apis/x86.yaml'
+                "sdk_package_name": "system-images;android-29;google_apis;x86",
+                "cipd_yaml": "third_party/android_sdk/cipd/system_images/android-29/google_apis/x86.yaml",
             },
             {
-                'sdk_package_name': 'system-images;android-29;google_apis_playstore;x86',
-                'cipd_yaml': 'third_party/android_sdk/cipd/system_images/android-29/google_apis_playstore/x86.yaml'
+                "sdk_package_name": "system-images;android-29;google_apis_playstore;x86",
+                "cipd_yaml": "third_party/android_sdk/cipd/system_images/android-29/google_apis_playstore/x86.yaml",
             },
             {
-                'sdk_package_name': 'system-images;android-30;google_apis;x86',
-                'cipd_yaml': 'third_party/android_sdk/cipd/system_images/android-30/google_apis/x86.yaml'
+                "sdk_package_name": "system-images;android-30;google_apis;x86",
+                "cipd_yaml": "third_party/android_sdk/cipd/system_images/android-30/google_apis/x86.yaml",
             },
             {
-                'sdk_package_name': 'system-images;android-30;google_apis_playstore;x86',
-                'cipd_yaml': 'third_party/android_sdk/cipd/system_images/android-30/google_apis_playstore/x86.yaml'
+                "sdk_package_name": "system-images;android-30;google_apis_playstore;x86",
+                "cipd_yaml": "third_party/android_sdk/cipd/system_images/android-30/google_apis_playstore/x86.yaml",
             },
         ],
     },
 )
 
-
 ci.android_builder(
-    name = 'Android ASAN (dbg)',
+    name = "Android ASAN (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|arm',
-        short_name = 'san',
+        category = "builder|arm",
+        short_name = "san",
     ),
     # Higher build timeout since dbg ASAN builds can take a while on a clobber
     # build.
@@ -163,739 +158,732 @@
 )
 
 ci.android_builder(
-    name = 'Android WebView L (dbg)',
+    name = "Android WebView L (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|webview',
-        short_name = 'L',
+        category = "tester|webview",
+        short_name = "L",
     ),
-    triggered_by = ['ci/Android arm Builder (dbg)'],
+    triggered_by = ["ci/Android arm Builder (dbg)"],
 )
 
 ci.android_builder(
-    name = 'Deterministic Android',
+    name = "Deterministic Android",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|det',
-        short_name = 'rel',
+        category = "builder|det",
+        short_name = "rel",
     ),
-    executable = 'recipe:swarming/deterministic_build',
+    executable = "recipe:swarming/deterministic_build",
     execution_timeout = 6 * time.hour,
-    notifies = ['Deterministic Android'],
+    notifies = ["Deterministic Android"],
     tree_closing = True,
 )
 
 ci.android_builder(
-    name = 'Deterministic Android (dbg)',
+    name = "Deterministic Android (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|det',
-        short_name = 'dbg',
+        category = "builder|det",
+        short_name = "dbg",
     ),
-    executable = 'recipe:swarming/deterministic_build',
+    executable = "recipe:swarming/deterministic_build",
     execution_timeout = 6 * time.hour,
-    notifies = ['Deterministic Android'],
+    notifies = ["Deterministic Android"],
     tree_closing = True,
 )
 
 ci.android_builder(
-    name = 'Lollipop Phone Tester',
+    name = "Lollipop Phone Tester",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|phone',
-        short_name = 'L',
+        category = "tester|phone",
+        short_name = "L",
     ),
     # We have limited phone capacity and thus limited ability to run
     # tests in parallel, hence the high timeout.
     execution_timeout = 6 * time.hour,
-    triggered_by = ['ci/Android arm Builder (dbg)'],
+    triggered_by = ["ci/Android arm Builder (dbg)"],
 )
 
 ci.android_builder(
-    name = 'Lollipop Tablet Tester',
+    name = "Lollipop Tablet Tester",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|tablet',
-        short_name = 'L',
+        category = "tester|tablet",
+        short_name = "L",
     ),
     # We have limited tablet capacity and thus limited ability to run
     # tests in parallel, hence the high timeout.
     execution_timeout = 20 * time.hour,
-    triggered_by = ['ci/Android arm Builder (dbg)'],
+    triggered_by = ["ci/Android arm Builder (dbg)"],
 )
 
 ci.android_builder(
-    name = 'Marshmallow Tablet Tester',
+    name = "Marshmallow Tablet Tester",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|tablet',
-        short_name = 'M',
+        category = "tester|tablet",
+        short_name = "M",
     ),
     # We have limited tablet capacity and thus limited ability to run
     # tests in parallel, hence the high timeout.
     execution_timeout = 12 * time.hour,
-    triggered_by = ['ci/Android arm Builder (dbg)'],
+    triggered_by = ["ci/Android arm Builder (dbg)"],
 )
 
 ci.android_builder(
-    name = 'android-arm64-proguard-rel',
+    name = "android-arm64-proguard-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'builder_tester|arm64',
-        short_name = 'M proguard',
+        category = "builder_tester|arm64",
+        short_name = "M proguard",
     ),
     goma_jobs = goma.jobs.MANY_JOBS_FOR_CI,
     execution_timeout = 6 * time.hour,
 )
 
 ci.android_builder(
-    name = 'android-cronet-arm64-dbg',
+    name = "android-cronet-arm64-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|arm64',
-        short_name = 'dbg',
+        category = "cronet|arm64",
+        short_name = "dbg",
     ),
-    notifies = ['cronet'],
+    notifies = ["cronet"],
 )
 
 ci.android_builder(
-    name = 'android-cronet-arm64-rel',
+    name = "android-cronet-arm64-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|arm64',
-        short_name = 'rel',
+        category = "cronet|arm64",
+        short_name = "rel",
     ),
-    notifies = ['cronet'],
+    notifies = ["cronet"],
 )
 
 ci.android_builder(
-    name = 'android-cronet-asan-arm-rel',
+    name = "android-cronet-asan-arm-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|asan',
+        category = "cronet|asan",
     ),
-    notifies = ['cronet'],
+    notifies = ["cronet"],
 )
 
 # Runs on a specific machine with an attached phone
 ci.android_builder(
-    name = 'android-cronet-marshmallow-arm64-perf-rel',
+    name = "android-cronet-marshmallow-arm64-perf-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|test|perf',
-        short_name = 'm',
+        category = "cronet|test|perf",
+        short_name = "m",
     ),
     cores = None,
     cpu = None,
-    executable = 'recipe:cronet',
-    notifies = ['cronet'],
+    executable = "recipe:cronet",
+    notifies = ["cronet"],
     os = os.ANDROID,
 )
 
 ci.android_builder(
-    name = 'android-cronet-marshmallow-arm64-rel',
+    name = "android-cronet-marshmallow-arm64-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|test',
-        short_name = 'm',
+        category = "cronet|test",
+        short_name = "m",
     ),
-    notifies = ['cronet'],
-    triggered_by = ['android-cronet-arm64-rel'],
+    notifies = ["cronet"],
+    triggered_by = ["android-cronet-arm64-rel"],
 )
 
 ci.android_builder(
-    name = 'android-cronet-x86-dbg',
+    name = "android-cronet-x86-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|x86',
-        short_name = 'dbg',
+        category = "cronet|x86",
+        short_name = "dbg",
     ),
-    notifies = ['cronet'],
+    notifies = ["cronet"],
 )
 
 ci.android_builder(
-    name = 'android-cronet-x86-rel',
+    name = "android-cronet-x86-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|x86',
-        short_name = 'rel',
+        category = "cronet|x86",
+        short_name = "rel",
     ),
-    notifies = ['cronet'],
+    notifies = ["cronet"],
 )
 
 ci.android_builder(
-    name = 'android-incremental-dbg',
+    name = "android-incremental-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|incremental',
+        category = "tester|incremental",
     ),
 )
 
 ci.android_builder(
-    name = 'android-pie-x86-rel',
+    name = "android-pie-x86-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'builder_tester|x86',
-        short_name = 'P',
+        category = "builder_tester|x86",
+        short_name = "P",
     ),
 )
 
 ci.android_builder(
-    name = 'android-10-arm64-rel',
+    name = "android-10-arm64-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'builder_tester|arm64',
-        short_name = '10',
+        category = "builder_tester|arm64",
+        short_name = "10",
     ),
 )
 
 ci.android_builder(
-    name = 'android-binary-size-generator',
-    executable = 'recipe:binary_size_generator_tot',
+    name = "android-binary-size-generator",
+    executable = "recipe:binary_size_generator_tot",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|other',
-        short_name = 'size',
-    ),
-)
-
-
-ci.android_fyi_builder(
-    name = 'android-bfcache-rel',
-    console_view_entry = ci.console_view_entry(
-        category = 'android',
+        category = "builder|other",
+        short_name = "size",
     ),
 )
 
 ci.android_fyi_builder(
-    name = 'Android WebLayer P FYI (rel)',
+    name = "android-bfcache-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'weblayer',
-        short_name = 'p-rel',
+        category = "android",
     ),
 )
 
 ci.android_fyi_builder(
-    name = 'android-weblayer-pie-x86-fyi-rel',
+    name = "Android WebLayer P FYI (rel)",
     console_view_entry = ci.console_view_entry(
-        category = 'weblayer',
-        short_name = 'p-x86-rel',
+        category = "weblayer",
+        short_name = "p-rel",
     ),
 )
 
 ci.android_fyi_builder(
-    name = 'Android WebView P Blink-CORS FYI (rel)',
+    name = "android-weblayer-pie-x86-fyi-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'webview',
-        short_name = 'cors',
+        category = "weblayer",
+        short_name = "p-x86-rel",
     ),
 )
 
 ci.android_fyi_builder(
-    name = 'Android WebView P FYI (rel)',
+    name = "Android WebView P Blink-CORS FYI (rel)",
     console_view_entry = ci.console_view_entry(
-        category = 'webview',
-        short_name = 'p-rel',
+        category = "webview",
+        short_name = "cors",
     ),
 )
 
 ci.android_fyi_builder(
-    name = 'android-marshmallow-x86-fyi-rel',
+    name = "Android WebView P FYI (rel)",
     console_view_entry = ci.console_view_entry(
-        category = 'emulator|M|x86',
-        short_name = 'rel',
+        category = "webview",
+        short_name = "p-rel",
     ),
-    goma_jobs=goma.jobs.J150,
+)
+
+ci.android_fyi_builder(
+    name = "android-marshmallow-x86-fyi-rel",
+    console_view_entry = ci.console_view_entry(
+        category = "emulator|M|x86",
+        short_name = "rel",
+    ),
+    goma_jobs = goma.jobs.J150,
 )
 
 # TODO(hypan): remove this once there is no associated disabled tests
 ci.android_fyi_builder(
-    name = 'android-pie-x86-fyi-rel',
+    name = "android-pie-x86-fyi-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'emulator|P|x86',
-        short_name = 'rel',
+        category = "emulator|P|x86",
+        short_name = "rel",
     ),
-    goma_jobs=goma.jobs.J150,
-    schedule = 'triggered',  # triggered manually via Scheduler UI
+    goma_jobs = goma.jobs.J150,
+    schedule = "triggered",  # triggered manually via Scheduler UI
 )
 
-
-
 ci.chromium_builder(
-    name = 'android-archive-dbg',
+    name = "android-archive-dbg",
     # Bump to 32 if needed.
     console_view_entry = ci.console_view_entry(
-        category = 'android',
-        short_name = 'dbg',
+        category = "android",
+        short_name = "dbg",
     ),
     cores = 8,
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.chromium_builder(
-    name = 'android-archive-rel',
+    name = "android-archive-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'android',
-        short_name = 'rel',
+        category = "android",
+        short_name = "rel",
     ),
     cores = 32,
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.chromium_builder(
-    name = 'linux-archive-dbg',
+    name = "linux-archive-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
-        short_name = 'dbg',
+        category = "linux",
+        short_name = "dbg",
     ),
     # Bump to 32 if needed.
     cores = 8,
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.chromium_builder(
-    name = 'linux-archive-rel',
+    name = "linux-archive-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
-        short_name = 'rel',
+        category = "linux",
+        short_name = "rel",
     ),
     cores = 32,
-    main_console_view = 'main',
-    notifies = ['linux-archive-rel'],
+    main_console_view = "main",
+    notifies = ["linux-archive-rel"],
 )
 
 ci.chromium_builder(
-    name = 'mac-archive-dbg',
+    name = "mac-archive-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'mac',
-        short_name = 'dbg',
+        category = "mac",
+        short_name = "dbg",
     ),
     # Bump to 8 cores if needed.
     cores = 4,
-    main_console_view = 'main',
+    main_console_view = "main",
     os = os.MAC_DEFAULT,
 )
 
 ci.chromium_builder(
-    name = 'mac-archive-rel',
+    name = "mac-archive-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'mac',
-        short_name = 'rel',
+        category = "mac",
+        short_name = "rel",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
     os = os.MAC_DEFAULT,
 )
 
 ci.chromium_builder(
-    name = 'win-archive-dbg',
+    name = "win-archive-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'win|dbg',
-        short_name = '64',
+        category = "win|dbg",
+        short_name = "64",
     ),
     cores = 32,
-    main_console_view = 'main',
+    main_console_view = "main",
     os = os.WINDOWS_DEFAULT,
     tree_closing = False,
 )
 
 ci.chromium_builder(
-    name = 'win-archive-rel',
+    name = "win-archive-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'win|rel',
-        short_name = '64',
+        category = "win|rel",
+        short_name = "64",
     ),
     cores = 32,
-    main_console_view = 'main',
+    main_console_view = "main",
     os = os.WINDOWS_DEFAULT,
 )
 
 ci.chromium_builder(
-    name = 'win32-archive-dbg',
+    name = "win32-archive-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'win|dbg',
-        short_name = '32',
+        category = "win|dbg",
+        short_name = "32",
     ),
     cores = 32,
-    main_console_view = 'main',
+    main_console_view = "main",
     os = os.WINDOWS_DEFAULT,
     tree_closing = False,
 )
 
 ci.chromium_builder(
-    name = 'win32-archive-rel',
+    name = "win32-archive-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'win|rel',
-        short_name = '32',
+        category = "win|rel",
+        short_name = "32",
     ),
     cores = 32,
-    main_console_view = 'main',
+    main_console_view = "main",
     os = os.WINDOWS_DEFAULT,
 )
 
-
 ci.chromiumos_builder(
-    name = 'Linux ChromiumOS Full',
+    name = "Linux ChromiumOS Full",
     console_view_entry = ci.console_view_entry(
-        category = 'default',
-        short_name = 'ful',
+        category = "default",
+        short_name = "ful",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.chromiumos_builder(
-    name = 'chromeos-amd64-generic-asan-rel',
+    name = "chromeos-amd64-generic-asan-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'simple|release|x64',
-        short_name = 'asn',
+        category = "simple|release|x64",
+        short_name = "asn",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.chromiumos_builder(
-    name = 'chromeos-amd64-generic-cfi-thin-lto-rel',
+    name = "chromeos-amd64-generic-cfi-thin-lto-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'simple|release|x64',
-        short_name = 'cfi',
+        category = "simple|release|x64",
+        short_name = "cfi",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.chromiumos_builder(
-    name = 'chromeos-arm-generic-dbg',
+    name = "chromeos-arm-generic-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'simple|debug',
-        short_name = 'arm',
+        category = "simple|debug",
+        short_name = "arm",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.chromiumos_builder(
-    name = 'chromeos-kevin-rel',
+    name = "chromeos-kevin-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'simple|release',
-        short_name = 'kvn',
+        category = "simple|release",
+        short_name = "kvn",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
-
 ci.clang_builder(
-    name = 'CFI Linux CF',
+    name = "CFI Linux CF",
     goma_backend = goma.backend.RBE_PROD,
     console_view_entry = ci.console_view_entry(
-        category = 'CFI|Linux',
-        short_name = 'CF',
+        category = "CFI|Linux",
+        short_name = "CF",
     ),
-    notifies = ['CFI Linux'],
+    notifies = ["CFI Linux"],
 )
 
 ci.clang_builder(
-    name = 'CFI Linux ToT',
+    name = "CFI Linux ToT",
     console_view_entry = ci.console_view_entry(
-        category = 'CFI|Linux',
-        short_name = 'ToT',
+        category = "CFI|Linux",
+        short_name = "ToT",
     ),
-    notifies = ['CFI Linux'],
+    notifies = ["CFI Linux"],
 )
 
 ci.clang_builder(
-    name = 'CrWinAsan',
+    name = "CrWinAsan",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Windows|Asan',
-        short_name = 'asn',
+        category = "ToT Windows|Asan",
+        short_name = "asn",
     ),
     os = os.WINDOWS_ANY,
 )
 
 ci.clang_builder(
-    name = 'CrWinAsan(dll)',
+    name = "CrWinAsan(dll)",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Windows|Asan',
-        short_name = 'dll',
+        category = "ToT Windows|Asan",
+        short_name = "dll",
     ),
     os = os.WINDOWS_ANY,
 )
 
 ci.clang_builder(
-    name = 'ToTAndroid',
+    name = "ToTAndroid",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Android',
-        short_name = 'rel',
+        category = "ToT Android",
+        short_name = "rel",
     ),
 )
 
 ci.clang_builder(
-    name = 'ToTAndroid (dbg)',
+    name = "ToTAndroid (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Android',
-        short_name = 'dbg',
+        category = "ToT Android",
+        short_name = "dbg",
     ),
 )
 
 ci.clang_builder(
-    name = 'ToTAndroid x64',
+    name = "ToTAndroid x64",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Android',
-        short_name = 'x64',
+        category = "ToT Android",
+        short_name = "x64",
     ),
 )
 
 ci.clang_builder(
-    name = 'ToTAndroid64',
+    name = "ToTAndroid64",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Android',
-        short_name = 'a64',
+        category = "ToT Android",
+        short_name = "a64",
     ),
 )
 
 ci.clang_builder(
-    name = 'ToTAndroidASan',
+    name = "ToTAndroidASan",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Android',
-        short_name = 'asn',
+        category = "ToT Android",
+        short_name = "asn",
     ),
 )
 
 ci.clang_builder(
-    name = 'ToTAndroidCFI',
+    name = "ToTAndroidCFI",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Android',
-        short_name = 'cfi',
+        category = "ToT Android",
+        short_name = "cfi",
     ),
 )
 
 ci.clang_builder(
-    name = 'ToTAndroidOfficial',
+    name = "ToTAndroidOfficial",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Android',
-        short_name = 'off',
+        category = "ToT Android",
+        short_name = "off",
     ),
 )
 
-def clang_tot_linux_builder(short_name, category='ToT Linux', **kwargs):
-  ci.clang_builder(
-      console_view_entry = ci.console_view_entry(
-          category = category,
-          short_name = short_name,
-      ),
-      notifies = [luci.notifier(
-          name = 'ToT Linux notifier',
-          on_new_status = ['FAILURE'],
-          notify_emails = ['thomasanderson@chromium.org'],
-      )],
-      **kwargs,
-  )
+def clang_tot_linux_builder(short_name, category = "ToT Linux", **kwargs):
+    ci.clang_builder(
+        console_view_entry = ci.console_view_entry(
+            category = category,
+            short_name = short_name,
+        ),
+        notifies = [luci.notifier(
+            name = "ToT Linux notifier",
+            on_new_status = ["FAILURE"],
+            notify_emails = ["thomasanderson@chromium.org"],
+        )],
+        **kwargs
+    )
 
 clang_tot_linux_builder(
-    name = 'ToTLinux',
-    short_name = 'rel',
+    name = "ToTLinux",
+    short_name = "rel",
 )
 
 clang_tot_linux_builder(
-    name = 'ToTLinux (dbg)',
-    short_name = 'dbg',
+    name = "ToTLinux (dbg)",
+    short_name = "dbg",
 )
 
 clang_tot_linux_builder(
-    name = 'ToTLinuxASan',
-    short_name = 'asn',
+    name = "ToTLinuxASan",
+    short_name = "asn",
 )
 
 clang_tot_linux_builder(
-    name = 'ToTLinuxASanLibfuzzer',
+    name = "ToTLinuxASanLibfuzzer",
     # Requires a large disk, so has a machine specifically devoted to it
     builderless = False,
-    short_name = 'fuz',
+    short_name = "fuz",
 )
 
 clang_tot_linux_builder(
-    name = 'ToTLinuxCoverage',
-    category = 'ToT Code Coverage',
-    short_name = 'linux',
-    executable = 'recipe:chromium_clang_coverage_tot',
+    name = "ToTLinuxCoverage",
+    category = "ToT Code Coverage",
+    short_name = "linux",
+    executable = "recipe:chromium_clang_coverage_tot",
 )
 
 clang_tot_linux_builder(
-    name = 'ToTLinuxMSan',
-    short_name = 'msn',
+    name = "ToTLinuxMSan",
+    short_name = "msn",
 )
 
 clang_tot_linux_builder(
-    name = 'ToTLinuxTSan',
-    short_name = 'tsn',
+    name = "ToTLinuxTSan",
+    short_name = "tsn",
 )
 
 clang_tot_linux_builder(
-    name = 'ToTLinuxThinLTO',
-    short_name = 'lto',
+    name = "ToTLinuxThinLTO",
+    short_name = "lto",
 )
 
 clang_tot_linux_builder(
-    name = 'ToTLinuxUBSanVptr',
-    short_name = 'usn',
+    name = "ToTLinuxUBSanVptr",
+    short_name = "usn",
 )
 
 ci.clang_builder(
-    name = 'ToTWin(dbg)',
+    name = "ToTWin(dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Windows',
-        short_name = 'dbg',
+        category = "ToT Windows",
+        short_name = "dbg",
     ),
     os = os.WINDOWS_ANY,
 )
 
 ci.clang_builder(
-    name = 'ToTWin(dll)',
+    name = "ToTWin(dll)",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Windows',
-        short_name = 'dll',
+        category = "ToT Windows",
+        short_name = "dll",
     ),
     os = os.WINDOWS_ANY,
 )
 
 ci.clang_builder(
-    name = 'ToTWin64(dbg)',
+    name = "ToTWin64(dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Windows|x64',
-        short_name = 'dbg',
+        category = "ToT Windows|x64",
+        short_name = "dbg",
     ),
     os = os.WINDOWS_ANY,
 )
 
 ci.clang_builder(
-    name = 'ToTWin64(dll)',
+    name = "ToTWin64(dll)",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Windows|x64',
-        short_name = 'dll',
+        category = "ToT Windows|x64",
+        short_name = "dll",
     ),
     os = os.WINDOWS_ANY,
 )
 
 ci.clang_builder(
-    name = 'ToTWinASanLibfuzzer',
+    name = "ToTWinASanLibfuzzer",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Windows|Asan',
-        short_name = 'fuz',
+        category = "ToT Windows|Asan",
+        short_name = "fuz",
     ),
     os = os.WINDOWS_ANY,
 )
 
 ci.clang_builder(
-    name = 'ToTWinCFI',
+    name = "ToTWinCFI",
     console_view_entry = ci.console_view_entry(
-        category = 'CFI|Win',
-        short_name = 'x86',
+        category = "CFI|Win",
+        short_name = "x86",
     ),
     os = os.WINDOWS_ANY,
 )
 
 ci.clang_builder(
-    name = 'ToTWinCFI64',
+    name = "ToTWinCFI64",
     console_view_entry = ci.console_view_entry(
-        category = 'CFI|Win',
-        short_name = 'x64',
+        category = "CFI|Win",
+        short_name = "x64",
     ),
     os = os.WINDOWS_ANY,
 )
 
 ci.clang_builder(
-    name = 'UBSanVptr Linux',
+    name = "UBSanVptr Linux",
     console_view_entry = ci.console_view_entry(
-        short_name = 'usn',
+        short_name = "usn",
     ),
     goma_backend = goma.backend.RBE_PROD,
 )
 
 ci.clang_builder(
-    name = 'linux-win_cross-rel',
+    name = "linux-win_cross-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Windows',
-        short_name = 'lxw',
+        category = "ToT Windows",
+        short_name = "lxw",
     ),
 )
 
 ci.clang_builder(
-    name = 'ToTiOS',
+    name = "ToTiOS",
     caches = [xcode_cache.x11e146],
     console_view_entry = ci.console_view_entry(
-        category = 'iOS|public',
-        short_name = 'sim',
+        category = "iOS|public",
+        short_name = "sim",
     ),
     cores = None,
     os = os.MAC_10_14,
     properties = {
-        'xcode_build_version': '11e146'
+        "xcode_build_version": "11e146",
     },
-    ssd=True
+    ssd = True,
 )
 
 ci.clang_builder(
-    name = 'ToTiOSDevice',
+    name = "ToTiOSDevice",
     caches = [xcode_cache.x11e146],
     console_view_entry = ci.console_view_entry(
-        category = 'iOS|public',
-        short_name = 'dev',
+        category = "iOS|public",
+        short_name = "dev",
     ),
     cores = None,
     os = os.MAC_10_14,
     properties = {
-        'xcode_build_version': '11e146'
+        "xcode_build_version": "11e146",
     },
-    ssd=True
+    ssd = True,
 )
 
-
 ci.clang_mac_builder(
-    name = 'ToTMac',
+    name = "ToTMac",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Mac',
-        short_name = 'rel',
+        category = "ToT Mac",
+        short_name = "rel",
     ),
 )
 
 ci.clang_mac_builder(
-    name = 'ToTMac (dbg)',
+    name = "ToTMac (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Mac',
-        short_name = 'dbg',
+        category = "ToT Mac",
+        short_name = "dbg",
     ),
 )
 
 ci.clang_mac_builder(
-    name = 'ToTMacASan',
+    name = "ToTMacASan",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Mac',
-        short_name = 'asn',
+        category = "ToT Mac",
+        short_name = "asn",
     ),
 )
 
 ci.clang_mac_builder(
-    name = 'ToTMacCoverage',
+    name = "ToTMacCoverage",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT Code Coverage',
-        short_name = 'mac',
+        category = "ToT Code Coverage",
+        short_name = "mac",
     ),
-    executable = 'recipe:chromium_clang_coverage_tot',
+    executable = "recipe:chromium_clang_coverage_tot",
 )
 
-
 ci.dawn_builder(
-    name = 'Dawn Linux x64 Builder',
+    name = "Dawn Linux x64 Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT|Linux|Builder',
-        short_name = 'x64',
+        category = "ToT|Linux|Builder",
+        short_name = "x64",
     ),
 )
 
 ci.dawn_builder(
-    name = 'Dawn Linux x64 Release (Intel HD 630)',
+    name = "Dawn Linux x64 Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT|Linux|Intel',
-        short_name = 'x64',
+        category = "ToT|Linux|Intel",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Linux x64 Builder'],
+    triggered_by = ["Dawn Linux x64 Builder"],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Linux x64 Release (NVIDIA)',
+    name = "Dawn Linux x64 Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT|Linux|Nvidia',
-        short_name = 'x64',
+        category = "ToT|Linux|Nvidia",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Linux x64 Builder'],
+    triggered_by = ["Dawn Linux x64 Builder"],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Mac x64 Builder',
+    name = "Dawn Mac x64 Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT|Mac|Builder',
-        short_name = 'x64',
+        category = "ToT|Mac|Builder",
+        short_name = "x64",
     ),
     builderless = False,
     cores = None,
@@ -903,41 +891,41 @@
 )
 
 ci.dawn_builder(
-    name = 'Dawn Mac x64 Release (AMD)',
+    name = "Dawn Mac x64 Release (AMD)",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT|Mac|AMD',
-        short_name = 'x64',
+        category = "ToT|Mac|AMD",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Mac x64 Builder'],
+    triggered_by = ["Dawn Mac x64 Builder"],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Mac x64 Release (Intel)',
+    name = "Dawn Mac x64 Release (Intel)",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT|Mac|Intel',
-        short_name = 'x64',
+        category = "ToT|Mac|Intel",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Mac x64 Builder'],
+    triggered_by = ["Dawn Mac x64 Builder"],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x86 Builder',
+    name = "Dawn Win10 x86 Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT|Windows|Builder',
-        short_name = 'x86',
+        category = "ToT|Windows|Builder",
+        short_name = "x86",
     ),
     os = os.WINDOWS_ANY,
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x64 Builder',
+    name = "Dawn Win10 x64 Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT|Windows|Builder',
-        short_name = 'x64',
+        category = "ToT|Windows|Builder",
+        short_name = "x64",
     ),
     os = os.WINDOWS_ANY,
 )
@@ -945,63 +933,63 @@
 # Note that the Win testers are all thin Linux VMs, triggering jobs on the
 # physical Win hardware in the Swarming pool, which is why they run on linux
 ci.dawn_builder(
-    name = 'Dawn Win10 x86 Release (Intel HD 630)',
+    name = "Dawn Win10 x86 Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT|Windows|Intel',
-        short_name = 'x86',
+        category = "ToT|Windows|Intel",
+        short_name = "x86",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Win10 x86 Builder'],
+    triggered_by = ["Dawn Win10 x86 Builder"],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x64 Release (Intel HD 630)',
+    name = "Dawn Win10 x64 Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT|Windows|Intel',
-        short_name = 'x64',
+        category = "ToT|Windows|Intel",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Win10 x64 Builder'],
+    triggered_by = ["Dawn Win10 x64 Builder"],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x86 Release (NVIDIA)',
+    name = "Dawn Win10 x86 Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT|Windows|Nvidia',
-        short_name = 'x86',
+        category = "ToT|Windows|Nvidia",
+        short_name = "x86",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Win10 x86 Builder'],
+    triggered_by = ["Dawn Win10 x86 Builder"],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x64 Release (NVIDIA)',
+    name = "Dawn Win10 x64 Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT|Windows|Nvidia',
-        short_name = 'x64',
+        category = "ToT|Windows|Nvidia",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = ['Dawn Win10 x64 Builder'],
+    triggered_by = ["Dawn Win10 x64 Builder"],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x64 ASAN Release',
+    name = "Dawn Win10 x64 ASAN Release",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT|Windows|ASAN',
-        short_name = 'x64',
+        category = "ToT|Windows|ASAN",
+        short_name = "x64",
     ),
     os = os.WINDOWS_ANY,
 )
 
 ci.fuzz_builder(
-    name = 'ASAN Debug',
+    name = "ASAN Debug",
     console_view_entry = ci.console_view_entry(
-        category = 'linux asan',
-        short_name = 'dbg',
+        category = "linux asan",
+        short_name = "dbg",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 4,
@@ -1009,10 +997,10 @@
 )
 
 ci.fuzz_builder(
-    name = 'ASan Debug (32-bit x86 with V8-ARM)',
+    name = "ASan Debug (32-bit x86 with V8-ARM)",
     console_view_entry = ci.console_view_entry(
-        category = 'linux asan|x64 v8-ARM',
-        short_name = 'dbg',
+        category = "linux asan|x64 v8-ARM",
+        short_name = "dbg",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 4,
@@ -1020,10 +1008,10 @@
 )
 
 ci.fuzz_builder(
-    name = 'ASAN Release',
+    name = "ASAN Release",
     console_view_entry = ci.console_view_entry(
-        category = 'linux asan',
-        short_name = 'rel',
+        category = "linux asan",
+        short_name = "rel",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 5,
@@ -1031,10 +1019,10 @@
 )
 
 ci.fuzz_builder(
-    name = 'ASan Release (32-bit x86 with V8-ARM)',
+    name = "ASan Release (32-bit x86 with V8-ARM)",
     console_view_entry = ci.console_view_entry(
-        category = 'linux asan|x64 v8-ARM',
-        short_name = 'rel',
+        category = "linux asan|x64 v8-ARM",
+        short_name = "rel",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 4,
@@ -1042,10 +1030,10 @@
 )
 
 ci.fuzz_builder(
-    name = 'ASAN Release Media',
+    name = "ASAN Release Media",
     console_view_entry = ci.console_view_entry(
-        category = 'linux asan',
-        short_name = 'med',
+        category = "linux asan",
+        short_name = "med",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 4,
@@ -1053,22 +1041,22 @@
 )
 
 ci.fuzz_builder(
-    name = 'Afl Upload Linux ASan',
+    name = "Afl Upload Linux ASan",
     console_view_entry = ci.console_view_entry(
-        category = 'afl',
-        short_name = 'afl',
+        category = "afl",
+        short_name = "afl",
     ),
-    executable = 'recipe:chromium_afl',
+    executable = "recipe:chromium_afl",
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 4,
     ),
 )
 
 ci.fuzz_builder(
-    name = 'ASan Release Media (32-bit x86 with V8-ARM)',
+    name = "ASan Release Media (32-bit x86 with V8-ARM)",
     console_view_entry = ci.console_view_entry(
-        category = 'linux asan|x64 v8-ARM',
-        short_name = 'med',
+        category = "linux asan|x64 v8-ARM",
+        short_name = "med",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 4,
@@ -1076,9 +1064,9 @@
 )
 
 ci.fuzz_builder(
-    name = 'ChromiumOS ASAN Release',
+    name = "ChromiumOS ASAN Release",
     console_view_entry = ci.console_view_entry(
-        category = 'cros asan',
+        category = "cros asan",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 6,
@@ -1086,10 +1074,10 @@
 )
 
 ci.fuzz_builder(
-    name = 'MSAN Release (chained origins)',
+    name = "MSAN Release (chained origins)",
     console_view_entry = ci.console_view_entry(
-        category = 'linux msan',
-        short_name = 'org',
+        category = "linux msan",
+        short_name = "org",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 4,
@@ -1097,10 +1085,10 @@
 )
 
 ci.fuzz_builder(
-    name = 'MSAN Release (no origins)',
+    name = "MSAN Release (no origins)",
     console_view_entry = ci.console_view_entry(
-        category = 'linux msan',
-        short_name = 'rel',
+        category = "linux msan",
+        short_name = "rel",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 4,
@@ -1108,11 +1096,11 @@
 )
 
 ci.fuzz_builder(
-    name = 'Mac ASAN Release',
+    name = "Mac ASAN Release",
     builderless = False,
     console_view_entry = ci.console_view_entry(
-        category = 'mac asan',
-        short_name = 'rel',
+        category = "mac asan",
+        short_name = "rel",
     ),
     cores = 4,
     os = os.MAC_DEFAULT,
@@ -1122,11 +1110,11 @@
 )
 
 ci.fuzz_builder(
-    name = 'Mac ASAN Release Media',
+    name = "Mac ASAN Release Media",
     builderless = False,
     console_view_entry = ci.console_view_entry(
-        category = 'mac asan',
-        short_name = 'med',
+        category = "mac asan",
+        short_name = "med",
     ),
     cores = 4,
     os = os.MAC_DEFAULT,
@@ -1136,10 +1124,10 @@
 )
 
 ci.fuzz_builder(
-    name = 'TSAN Debug',
+    name = "TSAN Debug",
     console_view_entry = ci.console_view_entry(
-        category = 'linux tsan',
-        short_name = 'dbg',
+        category = "linux tsan",
+        short_name = "dbg",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 4,
@@ -1147,10 +1135,10 @@
 )
 
 ci.fuzz_builder(
-    name = 'TSAN Release',
+    name = "TSAN Release",
     console_view_entry = ci.console_view_entry(
-        category = 'linux tsan',
-        short_name = 'rel',
+        category = "linux tsan",
+        short_name = "rel",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 3,
@@ -1158,10 +1146,10 @@
 )
 
 ci.fuzz_builder(
-    name = 'UBSan Release',
+    name = "UBSan Release",
     console_view_entry = ci.console_view_entry(
-        category = 'linux UBSan',
-        short_name = 'rel',
+        category = "linux UBSan",
+        short_name = "rel",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 4,
@@ -1169,10 +1157,10 @@
 )
 
 ci.fuzz_builder(
-    name = 'UBSan vptr Release',
+    name = "UBSan vptr Release",
     console_view_entry = ci.console_view_entry(
-        category = 'linux UBSan',
-        short_name = 'vpt',
+        category = "linux UBSan",
+        short_name = "vpt",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 4,
@@ -1180,11 +1168,11 @@
 )
 
 ci.fuzz_builder(
-    name = 'Win ASan Release',
+    name = "Win ASan Release",
     builderless = False,
     console_view_entry = ci.console_view_entry(
-        category = 'win asan',
-        short_name = 'rel',
+        category = "win asan",
+        short_name = "rel",
     ),
     os = os.WINDOWS_DEFAULT,
     triggering_policy = scheduler.greedy_batching(
@@ -1193,11 +1181,11 @@
 )
 
 ci.fuzz_builder(
-    name = 'Win ASan Release Media',
+    name = "Win ASan Release Media",
     builderless = False,
     console_view_entry = ci.console_view_entry(
-        category = 'win asan',
-        short_name = 'med',
+        category = "win asan",
+        short_name = "med",
     ),
     os = os.WINDOWS_DEFAULT,
     triggering_policy = scheduler.greedy_batching(
@@ -1205,12 +1193,11 @@
     ),
 )
 
-
 ci.fuzz_libfuzzer_builder(
-    name = 'Libfuzzer Upload Chrome OS ASan',
+    name = "Libfuzzer Upload Chrome OS ASan",
     console_view_entry = ci.console_view_entry(
-        category = 'libfuzz',
-        short_name = 'chromeos-asan',
+        category = "libfuzz",
+        short_name = "chromeos-asan",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 3,
@@ -1218,10 +1205,10 @@
 )
 
 ci.fuzz_libfuzzer_builder(
-    name = 'Libfuzzer Upload Linux ASan',
+    name = "Libfuzzer Upload Linux ASan",
     console_view_entry = ci.console_view_entry(
-        category = 'libfuzz',
-        short_name = 'linux',
+        category = "libfuzz",
+        short_name = "linux",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 5,
@@ -1229,10 +1216,10 @@
 )
 
 ci.fuzz_libfuzzer_builder(
-    name = 'Libfuzzer Upload Linux ASan Debug',
+    name = "Libfuzzer Upload Linux ASan Debug",
     console_view_entry = ci.console_view_entry(
-        category = 'libfuzz',
-        short_name = 'linux-dbg',
+        category = "libfuzz",
+        short_name = "linux-dbg",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 5,
@@ -1240,10 +1227,10 @@
 )
 
 ci.fuzz_libfuzzer_builder(
-    name = 'Libfuzzer Upload Linux MSan',
+    name = "Libfuzzer Upload Linux MSan",
     console_view_entry = ci.console_view_entry(
-        category = 'libfuzz',
-        short_name = 'linux-msan',
+        category = "libfuzz",
+        short_name = "linux-msan",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 5,
@@ -1251,12 +1238,12 @@
 )
 
 ci.fuzz_libfuzzer_builder(
-    name = 'Libfuzzer Upload Linux UBSan',
+    name = "Libfuzzer Upload Linux UBSan",
     # Do not use builderless for this (crbug.com/980080).
     builderless = False,
     console_view_entry = ci.console_view_entry(
-        category = 'libfuzz',
-        short_name = 'linux-ubsan',
+        category = "libfuzz",
+        short_name = "linux-ubsan",
     ),
     execution_timeout = 3 * time.hour + 30 * time.minute,
     triggering_policy = scheduler.greedy_batching(
@@ -1265,10 +1252,10 @@
 )
 
 ci.fuzz_libfuzzer_builder(
-    name = 'Libfuzzer Upload Linux V8-ARM64 ASan',
+    name = "Libfuzzer Upload Linux V8-ARM64 ASan",
     console_view_entry = ci.console_view_entry(
-        category = 'libfuzz',
-        short_name = 'arm64',
+        category = "libfuzz",
+        short_name = "arm64",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 1,
@@ -1276,10 +1263,10 @@
 )
 
 ci.fuzz_libfuzzer_builder(
-    name = 'Libfuzzer Upload Linux V8-ARM64 ASan Debug',
+    name = "Libfuzzer Upload Linux V8-ARM64 ASan Debug",
     console_view_entry = ci.console_view_entry(
-        category = 'libfuzz',
-        short_name = 'arm64-dbg',
+        category = "libfuzz",
+        short_name = "arm64-dbg",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 1,
@@ -1287,10 +1274,10 @@
 )
 
 ci.fuzz_libfuzzer_builder(
-    name = 'Libfuzzer Upload Linux32 ASan',
+    name = "Libfuzzer Upload Linux32 ASan",
     console_view_entry = ci.console_view_entry(
-        category = 'libfuzz',
-        short_name = 'linux32',
+        category = "libfuzz",
+        short_name = "linux32",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 3,
@@ -1298,10 +1285,10 @@
 )
 
 ci.fuzz_libfuzzer_builder(
-    name = 'Libfuzzer Upload Linux32 ASan Debug',
+    name = "Libfuzzer Upload Linux32 ASan Debug",
     console_view_entry = ci.console_view_entry(
-        category = 'libfuzz',
-        short_name = 'linux32-dbg',
+        category = "libfuzz",
+        short_name = "linux32-dbg",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 3,
@@ -1309,10 +1296,10 @@
 )
 
 ci.fuzz_libfuzzer_builder(
-    name = 'Libfuzzer Upload Linux32 V8-ARM ASan',
+    name = "Libfuzzer Upload Linux32 V8-ARM ASan",
     console_view_entry = ci.console_view_entry(
-        category = 'libfuzz',
-        short_name = 'arm',
+        category = "libfuzz",
+        short_name = "arm",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 1,
@@ -1320,10 +1307,10 @@
 )
 
 ci.fuzz_libfuzzer_builder(
-    name = 'Libfuzzer Upload Linux32 V8-ARM ASan Debug',
+    name = "Libfuzzer Upload Linux32 V8-ARM ASan Debug",
     console_view_entry = ci.console_view_entry(
-        category = 'libfuzz',
-        short_name = 'arm-dbg',
+        category = "libfuzz",
+        short_name = "arm-dbg",
     ),
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 1,
@@ -1331,10 +1318,10 @@
 )
 
 ci.fuzz_libfuzzer_builder(
-    name = 'Libfuzzer Upload Mac ASan',
+    name = "Libfuzzer Upload Mac ASan",
     console_view_entry = ci.console_view_entry(
-        category = 'libfuzz',
-        short_name = 'mac-asan',
+        category = "libfuzz",
+        short_name = "mac-asan",
     ),
     cores = 24,
     execution_timeout = 4 * time.hour,
@@ -1342,10 +1329,10 @@
 )
 
 ci.fuzz_libfuzzer_builder(
-    name = 'Libfuzzer Upload Windows ASan',
+    name = "Libfuzzer Upload Windows ASan",
     console_view_entry = ci.console_view_entry(
-        category = 'libfuzz',
-        short_name = 'win-asan',
+        category = "libfuzz",
+        short_name = "win-asan",
     ),
     os = os.WINDOWS_DEFAULT,
     triggering_policy = scheduler.greedy_batching(
@@ -1353,271 +1340,270 @@
     ),
 )
 
-
 ci.fyi_builder(
-    name = 'Closure Compilation Linux',
+    name = "Closure Compilation Linux",
     console_view_entry = ci.console_view_entry(
-        category = 'closure_compilation',
+        category = "closure_compilation",
     ),
-    executable = 'recipe:closure_compilation',
-    notifies = ['Closure Compilation Linux'],
+    executable = "recipe:closure_compilation",
+    notifies = ["Closure Compilation Linux"],
 )
 
 ci.fyi_builder(
-    name = 'Linux Viz',
+    name = "Linux Viz",
     console_view_entry = ci.console_view_entry(
-        category = 'viz',
+        category = "viz",
     ),
 )
 
 ci.fyi_builder(
-    name = 'Linux remote_run Builder',
+    name = "Linux remote_run Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'remote_run',
+        category = "remote_run",
     ),
 )
 
 ci.fyi_builder(
-    name = 'Linux remote_run Tester',
+    name = "Linux remote_run Tester",
     console_view_entry = ci.console_view_entry(
-        category = 'remote_run',
+        category = "remote_run",
     ),
-    triggered_by = ['Linux remote_run Builder'],
+    triggered_by = ["Linux remote_run Builder"],
 )
 
 ci.fyi_builder(
-    name = 'Mojo Android',
+    name = "Mojo Android",
     console_view_entry = ci.console_view_entry(
-        category = 'mojo',
-        short_name = 'and',
+        category = "mojo",
+        short_name = "and",
     ),
 )
 
 ci.fyi_builder(
-    name = 'Mojo ChromiumOS',
+    name = "Mojo ChromiumOS",
     console_view_entry = ci.console_view_entry(
-        category = 'mojo',
-        short_name = 'cr',
+        category = "mojo",
+        short_name = "cr",
     ),
 )
 
 ci.fyi_builder(
-    name = 'Mojo Linux',
+    name = "Mojo Linux",
     console_view_entry = ci.console_view_entry(
-        category = 'mojo',
-        short_name = 'lnx',
+        category = "mojo",
+        short_name = "lnx",
     ),
 )
 
 ci.fyi_builder(
-    name = 'Site Isolation Android',
+    name = "Site Isolation Android",
     console_view_entry = ci.console_view_entry(
-        category = 'site_isolation',
+        category = "site_isolation",
     ),
-    notifies = ['Site Isolation Android'],
+    notifies = ["Site Isolation Android"],
 )
 
 ci.fyi_builder(
-    name = 'android-mojo-webview-rel',
+    name = "android-mojo-webview-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'mojo',
-        short_name = 'aw',
+        category = "mojo",
+        short_name = "aw",
     ),
 )
 
 ci.fyi_builder(
-    name = 'chromeos-amd64-generic-lacros-rel',
+    name = "chromeos-amd64-generic-lacros-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'chromeos',
+        category = "chromeos",
     ),
     properties = {
         # The format of these properties is defined at archive/properties.proto
-        '$build/archive' : {
-            'archive_datas': [
-            {
-                'files': [
-                    'chrome',
-                    'chrome_100_percent.pak',
-                    'chrome_200_percent.pak',
-                    'crashpad_handler',
-                    'headless_lib.pak',
-                    'icudtl.dat',
-                    'nacl_helper',
-                    'nacl_irt_x86_64.nexe',
-                    'resources.pak',
-                    'snapshot_blob.bin',
-                ],
-                'dirs': ['locales', 'swiftshader'],
-                'gcs_bucket': 'chromium-lacros-fishfood',
-                'gcs_path': 'x86_64/{%position%}/lacros.zip',
-                'archive_type': 'ARCHIVE_TYPE_ZIP',
-            },
-        ],
-      },
+        "$build/archive": {
+            "archive_datas": [
+                {
+                    "files": [
+                        "chrome",
+                        "chrome_100_percent.pak",
+                        "chrome_200_percent.pak",
+                        "crashpad_handler",
+                        "headless_lib.pak",
+                        "icudtl.dat",
+                        "nacl_helper",
+                        "nacl_irt_x86_64.nexe",
+                        "resources.pak",
+                        "snapshot_blob.bin",
+                    ],
+                    "dirs": ["locales", "swiftshader"],
+                    "gcs_bucket": "chromium-lacros-fishfood",
+                    "gcs_path": "x86_64/{%position%}/lacros.zip",
+                    "archive_type": "ARCHIVE_TYPE_ZIP",
+                },
+            ],
+        },
     },
 )
 
 ci.fyi_builder(
-    name = 'fuchsia-fyi-arm64-dbg',
+    name = "fuchsia-fyi-arm64-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|a64',
-        short_name = 'dbg',
+        category = "fuchsia|a64",
+        short_name = "dbg",
     ),
-    notifies = ['cr-fuchsia'],
+    notifies = ["cr-fuchsia"],
 )
 
 ci.fyi_builder(
-    name = 'fuchsia-fyi-arm64-rel',
+    name = "fuchsia-fyi-arm64-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|a64',
-        short_name = 'rel',
+        category = "fuchsia|a64",
+        short_name = "rel",
     ),
-    notifies = ['cr-fuchsia'],
+    notifies = ["cr-fuchsia"],
 )
 
 ci.fyi_builder(
-    name = 'fuchsia-fyi-x64-dbg',
+    name = "fuchsia-fyi-x64-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|x64',
-        short_name = 'dbg',
+        category = "fuchsia|x64",
+        short_name = "dbg",
     ),
-    notifies = ['cr-fuchsia'],
+    notifies = ["cr-fuchsia"],
 )
 
 ci.fyi_builder(
-    name = 'fuchsia-fyi-x64-rel',
+    name = "fuchsia-fyi-x64-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|x64',
-        short_name = 'rel',
+        category = "fuchsia|x64",
+        short_name = "rel",
     ),
-    notifies = ['cr-fuchsia'],
+    notifies = ["cr-fuchsia"],
 )
 
 ci.fyi_builder(
-    name = 'linux-annotator-rel',
+    name = "linux-annotator-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'network|traffic|annotations',
-        short_name = 'lnx',
+        category = "network|traffic|annotations",
+        short_name = "lnx",
     ),
-    notifies = ['annotator-rel'],
+    notifies = ["annotator-rel"],
 )
 
 ci.fyi_builder(
-    name = 'linux-ash-chromium-builder-fyi-rel',
+    name = "linux-ash-chromium-builder-fyi-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'default',
-        short_name = 'lcr',
+        category = "default",
+        short_name = "lcr",
     ),
     properties = {
         # The format of these properties is defined at archive/properties.proto
-        '$build/archive' : {
-            'archive_datas': [
-            {
-                'files': [
-                    'chrome',
-                    'chrome_100_percent.pak',
-                    'chrome_200_percent.pak',
-                    'crashpad_handler',
-                    'headless_lib.pak',
-                    'icudtl.dat',
-                    'libminigbm.so',
-                    'nacl_helper',
-                    'nacl_irt_x86_64.nexe',
-                    'resources.pak',
-                    'snapshot_blob.bin',
-                ],
-                'dirs': ['locales', 'swiftshader'],
-                'gcs_bucket': 'ash-chromium-on-linux-prebuilts',
-                'gcs_path': 'x86_64/{%position%}/ash-chromium.zip',
-                'archive_type': 'ARCHIVE_TYPE_ZIP',
-            },
-        ],
-      },
+        "$build/archive": {
+            "archive_datas": [
+                {
+                    "files": [
+                        "chrome",
+                        "chrome_100_percent.pak",
+                        "chrome_200_percent.pak",
+                        "crashpad_handler",
+                        "headless_lib.pak",
+                        "icudtl.dat",
+                        "libminigbm.so",
+                        "nacl_helper",
+                        "nacl_irt_x86_64.nexe",
+                        "resources.pak",
+                        "snapshot_blob.bin",
+                    ],
+                    "dirs": ["locales", "swiftshader"],
+                    "gcs_bucket": "ash-chromium-on-linux-prebuilts",
+                    "gcs_path": "x86_64/{%position%}/ash-chromium.zip",
+                    "archive_type": "ARCHIVE_TYPE_ZIP",
+                },
+            ],
+        },
     },
 )
 
 ci.fyi_builder(
-    name = 'linux-bfcache-rel',
+    name = "linux-bfcache-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
+        category = "linux",
     ),
 )
 
 ci.fyi_builder(
-    name = 'linux-blink-animation-use-time-delta',
+    name = "linux-blink-animation-use-time-delta",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|blink',
-        short_name = 'TD',
+        category = "linux|blink",
+        short_name = "TD",
     ),
 )
 
 ci.fyi_builder(
-    name = 'linux-blink-heap-concurrent-marking-tsan-rel',
+    name = "linux-blink-heap-concurrent-marking-tsan-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|blink',
-        short_name = 'CM',
+        category = "linux|blink",
+        short_name = "CM",
     ),
 )
 
 ci.fyi_builder(
-    name = 'linux-blink-heap-verification',
+    name = "linux-blink-heap-verification",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|blink',
-        short_name = 'VF',
+        category = "linux|blink",
+        short_name = "VF",
     ),
-    notifies = ['linux-blink-heap-verification'],
+    notifies = ["linux-blink-heap-verification"],
 )
 
 ci.fyi_builder(
-    name = 'linux-chromium-tests-staging-builder',
+    name = "linux-chromium-tests-staging-builder",
     console_view_entry = ci.console_view_entry(
-        category = 'recipe|staging|linux',
-        short_name = 'bld',
+        category = "recipe|staging|linux",
+        short_name = "bld",
     ),
 )
 
 ci.fyi_builder(
-    name = 'linux-chromium-tests-staging-tests',
+    name = "linux-chromium-tests-staging-tests",
     console_view_entry = ci.console_view_entry(
-        category = 'recipe|staging|linux',
-        short_name = 'tst',
+        category = "recipe|staging|linux",
+        short_name = "tst",
     ),
-    triggered_by = ['linux-chromium-tests-staging-builder'],
+    triggered_by = ["linux-chromium-tests-staging-builder"],
 )
 
 ci.fyi_builder(
-    name = 'linux-fieldtrial-rel',
+    name = "linux-fieldtrial-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
+        category = "linux",
     ),
 )
 
 ci.fyi_builder(
-    name = 'linux-lacros-builder-fyi-rel',
+    name = "linux-lacros-builder-fyi-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
+        category = "linux",
     ),
 )
 
 ci.fyi_builder(
-    name = 'linux-lacros-tester-fyi-rel',
+    name = "linux-lacros-tester-fyi-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
+        category = "linux",
     ),
-    triggered_by = ['linux-lacros-builder-fyi-rel'],
+    triggered_by = ["linux-lacros-builder-fyi-rel"],
 )
 
 ci.fyi_builder(
-    name = 'linux-perfetto-rel',
+    name = "linux-perfetto-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
+        category = "linux",
     ),
 )
 
 ci.fyi_builder(
-    name = 'linux-wpt-fyi-rel',
+    name = "linux-wpt-fyi-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
+        category = "linux",
     ),
     experimental = True,
     goma_backend = None,
@@ -1626,149 +1612,148 @@
 # This is launching & collecting entirely isolated tests.
 # OS shouldn't matter.
 ci.fyi_builder(
-    name = 'mac-osxbeta-rel',
+    name = "mac-osxbeta-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'mac',
-        short_name = 'beta',
+        category = "mac",
+        short_name = "beta",
     ),
     goma_backend = None,
     main_console_view = None,
-    triggered_by = ['ci/Mac Builder'],
+    triggered_by = ["ci/Mac Builder"],
 )
 
 ci.fyi_builder(
-    name = 'win-pixel-builder-rel',
+    name = "win-pixel-builder-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'win10',
+        category = "win10",
     ),
     os = os.WINDOWS_10,
 )
 
 ci.fyi_builder(
-    name = 'win-pixel-tester-rel',
+    name = "win-pixel-tester-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'win10',
+        category = "win10",
     ),
     os = None,
-    triggered_by = ['win-pixel-builder-rel'],
+    triggered_by = ["win-pixel-builder-rel"],
 )
 
 ci.fyi_builder(
-    name = 'linux-upload-perfetto',
+    name = "linux-upload-perfetto",
     console_view_entry = ci.console_view_entry(
-        category = 'perfetto',
-        short_name = 'lnx',
+        category = "perfetto",
+        short_name = "lnx",
     ),
     os = os.LINUX_DEFAULT,
 )
 
 ci.fyi_builder(
-    name = 'mac-upload-perfetto',
+    name = "mac-upload-perfetto",
     builderless = True,
     console_view_entry = ci.console_view_entry(
-        category = 'perfetto',
-        short_name = 'mac',
+        category = "perfetto",
+        short_name = "mac",
     ),
     os = os.MAC_DEFAULT,
-    schedule = 'with 3h interval',
+    schedule = "with 3h interval",
     triggered_by = [],
     ssd = None,
 )
 
 ci.fyi_builder(
-    name = 'win-upload-perfetto',
+    name = "win-upload-perfetto",
     builderless = True,
     console_view_entry = ci.console_view_entry(
-        category = 'perfetto',
-        short_name = 'win',
+        category = "perfetto",
+        short_name = "win",
     ),
     os = os.WINDOWS_DEFAULT,
-    schedule = 'with 3h interval',
+    schedule = "with 3h interval",
     triggered_by = [],
 )
 
 ci.fyi_celab_builder(
-    name = 'win-celab-builder-rel',
+    name = "win-celab-builder-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'celab',
+        category = "celab",
     ),
-    schedule = '0 0,6,12,18 * * *',
+    schedule = "0 0,6,12,18 * * *",
     triggered_by = [],
 )
 
 ci.fyi_celab_builder(
-    name = 'win-celab-tester-rel',
+    name = "win-celab-tester-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'celab',
+        category = "celab",
     ),
-    triggered_by = ['win-celab-builder-rel'],
+    triggered_by = ["win-celab-builder-rel"],
 )
 
-
 ci.fyi_coverage_builder(
-    name = 'android-code-coverage',
+    name = "android-code-coverage",
     console_view_entry = ci.console_view_entry(
-        category = 'code_coverage',
-        short_name = 'and',
+        category = "code_coverage",
+        short_name = "and",
     ),
     use_java_coverage = True,
-    schedule = 'triggered',
+    schedule = "triggered",
     triggered_by = [],
 )
 
 ci.fyi_coverage_builder(
-    name = 'android-code-coverage-native',
+    name = "android-code-coverage-native",
     console_view_entry = ci.console_view_entry(
-        category = 'code_coverage',
-        short_name = 'ann',
+        category = "code_coverage",
+        short_name = "ann",
     ),
     use_clang_coverage = True,
 )
 
 ci.fyi_coverage_builder(
-    name = 'ios-simulator-code-coverage',
+    name = "ios-simulator-code-coverage",
     caches = [xcode_cache.x11e146],
     console_view_entry = ci.console_view_entry(
-        category = 'code_coverage',
-        short_name = 'ios',
+        category = "code_coverage",
+        short_name = "ios",
     ),
     cores = None,
     os = os.MAC_10_15,
     use_clang_coverage = True,
-    coverage_exclude_sources = 'ios_test_files_and_test_utils',
-    coverage_test_types = ['overall', 'unit'],
+    coverage_exclude_sources = "ios_test_files_and_test_utils",
+    coverage_test_types = ["overall", "unit"],
     properties = {
-        'xcode_build_version': '11e146',
+        "xcode_build_version": "11e146",
     },
 )
 
 ci.fyi_coverage_builder(
-    name = 'linux-chromeos-code-coverage',
+    name = "linux-chromeos-code-coverage",
     console_view_entry = ci.console_view_entry(
-        category = 'code_coverage',
-        short_name = 'lcr',
+        category = "code_coverage",
+        short_name = "lcr",
     ),
     use_clang_coverage = True,
-    schedule = 'triggered',
+    schedule = "triggered",
     triggered_by = [],
 )
 
 ci.fyi_coverage_builder(
-    name = 'linux-code-coverage',
+    name = "linux-code-coverage",
     console_view_entry = ci.console_view_entry(
-        category = 'code_coverage',
-        short_name = 'lnx',
+        category = "code_coverage",
+        short_name = "lnx",
     ),
     use_clang_coverage = True,
     triggered_by = [],
 )
 
 ci.fyi_coverage_builder(
-    name = 'mac-code-coverage',
+    name = "mac-code-coverage",
     builderless = True,
     console_view_entry = ci.console_view_entry(
-        category = 'code_coverage',
-        short_name = 'mac',
+        category = "code_coverage",
+        short_name = "mac",
     ),
     cores = 24,
     os = os.MAC_ANY,
@@ -1776,266 +1761,262 @@
 )
 
 ci.fyi_coverage_builder(
-    name = 'win10-code-coverage',
+    name = "win10-code-coverage",
     builderless = True,
     console_view_entry = ci.console_view_entry(
-        category = 'code_coverage',
-        short_name = 'win',
+        category = "code_coverage",
+        short_name = "win",
     ),
     os = os.WINDOWS_DEFAULT,
     use_clang_coverage = True,
 )
 
-
 ci.fyi_ios_builder(
-    name = 'ios-asan',
+    name = "ios-asan",
     console_view_entry = ci.console_view_entry(
-        category = 'iOS',
-        short_name = 'asan',
+        category = "iOS",
+        short_name = "asan",
     ),
-    executable = 'recipe:chromium',
+    executable = "recipe:chromium",
     os = os.MAC_10_15,
     properties = {
-        'xcode_build_version': '11e146',
+        "xcode_build_version": "11e146",
     },
 )
 
 ci.fyi_ios_builder(
-    name = 'ios-simulator-cr-recipe',
+    name = "ios-simulator-cr-recipe",
     console_view_entry = ci.console_view_entry(
-        category = 'iOS',
-        short_name = 'chr',
+        category = "iOS",
+        short_name = "chr",
     ),
-    executable = 'recipe:chromium',
+    executable = "recipe:chromium",
     properties = {
-        'xcode_build_version': '11a1027',
+        "xcode_build_version": "11a1027",
     },
 )
 
 ci.fyi_ios_builder(
-    name = 'ios-simulator-multi-window',
+    name = "ios-simulator-multi-window",
     console_view_entry = ci.console_view_entry(
-        category = 'iOS',
-        short_name = 'mwd',
+        category = "iOS",
+        short_name = "mwd",
     ),
-    executable = 'recipe:chromium',
+    executable = "recipe:chromium",
     os = os.MAC_10_15,
     properties = {
-        'xcode_build_version': '11e146',
+        "xcode_build_version": "11e146",
     },
 )
 
 ci.fyi_ios_builder(
-    name = 'ios-webkit-tot',
+    name = "ios-webkit-tot",
     caches = [xcode_cache.x11e608cwk],
     console_view_entry = ci.console_view_entry(
-        category = 'iOS',
-        short_name = 'wk',
+        category = "iOS",
+        short_name = "wk",
     ),
-    executable = 'recipe:chromium',
+    executable = "recipe:chromium",
     properties = {
-        'xcode_build_version': '11e608cwk'
+        "xcode_build_version": "11e608cwk",
     },
-    schedule = '0 1-23/6 * * *',
+    schedule = "0 1-23/6 * * *",
     triggered_by = [],
 )
 
 ci.fyi_ios_builder(
-    name = 'ios13-beta-simulator',
+    name = "ios13-beta-simulator",
     console_view_entry = ci.console_view_entry(
-        category = 'iOS|iOS13',
-        short_name = 'ios13',
+        category = "iOS|iOS13",
+        short_name = "ios13",
     ),
-    executable = 'recipe:chromium',
+    executable = "recipe:chromium",
     os = os.MAC_10_15,
     properties = {
-        'xcode_build_version': '11e146',
+        "xcode_build_version": "11e146",
     },
-    schedule = '0 0,12 * * *',
+    schedule = "0 0,12 * * *",
     triggered_by = [],
 )
 
 ci.fyi_ios_builder(
-    name = 'ios13-sdk-device',
+    name = "ios13-sdk-device",
     console_view_entry = ci.console_view_entry(
-        category = 'iOS|iOS13',
-        short_name = 'dev',
+        category = "iOS|iOS13",
+        short_name = "dev",
     ),
     caches = [xcode_cache.x11e708],
-    executable = 'recipe:chromium',
+    executable = "recipe:chromium",
     os = os.MAC_10_15,
     properties = {
-        'xcode_build_version': '11e708',
+        "xcode_build_version": "11e708",
     },
 )
 
 ci.fyi_ios_builder(
-    name = 'ios13-sdk-simulator',
+    name = "ios13-sdk-simulator",
     console_view_entry = ci.console_view_entry(
-        category = 'iOS|iOS13',
-        short_name = 'sdk13',
+        category = "iOS|iOS13",
+        short_name = "sdk13",
     ),
     caches = [xcode_cache.x11e708],
-    executable = 'recipe:chromium',
+    executable = "recipe:chromium",
     os = os.MAC_10_15,
     properties = {
-        'xcode_build_version': '11e708'
+        "xcode_build_version": "11e708",
     },
-    schedule = '0 6,18 * * *',
+    schedule = "0 6,18 * * *",
     triggered_by = [],
 )
 
 ci.fyi_ios_builder(
-    name = 'ios14-beta-simulator',
+    name = "ios14-beta-simulator",
     console_view_entry = ci.console_view_entry(
-        category = 'iOS|iOS14',
-        short_name = 'ios14',
+        category = "iOS|iOS14",
+        short_name = "ios14",
     ),
-    executable = 'recipe:chromium',
+    executable = "recipe:chromium",
     os = os.MAC_10_15,
     properties = {
-        'xcode_build_version': '11e503a_xct12b1',
+        "xcode_build_version": "11e503a_xct12b1",
     },
 )
 
 ci.fyi_ios_builder(
-    name = 'ios14-sdk-simulator',
+    name = "ios14-sdk-simulator",
     console_view_entry = ci.console_view_entry(
-        category = 'iOS|iOS14',
-        short_name = 'sdk14',
+        category = "iOS|iOS14",
+        short_name = "sdk14",
     ),
     caches = [xcode_cache.x12a6163b],
-    executable = 'recipe:chromium',
+    executable = "recipe:chromium",
     os = os.MAC_10_15,
     properties = {
-        'xcode_build_version': '12a6163b'
-    }
+        "xcode_build_version": "12a6163b",
+    },
 )
 
-
 ci.fyi_mac_builder(
-    name = 'Mac Builder Next',
+    name = "Mac Builder Next",
     console_view_entry = ci.console_view_entry(
-        category = 'mac',
-        short_name = 'bld',
+        category = "mac",
+        short_name = "bld",
     ),
     cores = None,
     os = None,
 )
 
 ci.fyi_mac_builder(
-    name = 'Mac deterministic',
+    name = "Mac deterministic",
     console_view_entry = ci.console_view_entry(
-        category = 'deterministic|mac',
-        short_name = 'rel',
+        category = "deterministic|mac",
+        short_name = "rel",
     ),
     cores = None,
-    executable = 'recipe:swarming/deterministic_build',
+    executable = "recipe:swarming/deterministic_build",
     execution_timeout = 6 * time.hour,
 )
 
 ci.fyi_mac_builder(
-    name = 'Mac deterministic (dbg)',
+    name = "Mac deterministic (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'deterministic|mac',
-        short_name = 'dbg',
+        category = "deterministic|mac",
+        short_name = "dbg",
     ),
     cores = None,
-    executable = 'recipe:swarming/deterministic_build',
+    executable = "recipe:swarming/deterministic_build",
     execution_timeout = 6 * time.hour,
 )
 
 ci.fyi_mac_builder(
-    name = 'mac-hermetic-upgrade-rel',
+    name = "mac-hermetic-upgrade-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'mac',
-        short_name = 'herm',
+        category = "mac",
+        short_name = "herm",
     ),
     cores = 8,
 )
 
 ci.fyi_mac_builder(
-    name = 'mac-mojo-rel',
+    name = "mac-mojo-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'mojo',
-        short_name = 'mac',
+        category = "mojo",
+        short_name = "mac",
     ),
     os = os.MAC_ANY,
 )
 
-
 ci.fyi_windows_builder(
-    name = 'Win10 Tests x64 1803',
+    name = "Win10 Tests x64 1803",
     console_view_entry = ci.console_view_entry(
-        category = 'win10|1803',
+        category = "win10|1803",
     ),
     goma_backend = None,
     main_console_view = None,
     os = os.WINDOWS_10,
-    triggered_by = ['ci/Win x64 Builder'],
+    triggered_by = ["ci/Win x64 Builder"],
 )
 
 ci.fyi_windows_builder(
-    name = 'Win10 Tests x64 1909',
+    name = "Win10 Tests x64 1909",
     console_view_entry = ci.console_view_entry(
-        category = 'win10|1909',
+        category = "win10|1909",
     ),
     goma_backend = None,
     main_console_view = None,
     os = os.WINDOWS_10,
-    triggered_by = ['ci/Win x64 Builder'],
+    triggered_by = ["ci/Win x64 Builder"],
 )
 
 ci.fyi_windows_builder(
-    name = 'Win 10 Fast Ring',
+    name = "Win 10 Fast Ring",
     console_view_entry = ci.console_view_entry(
-        category = 'win10',
+        category = "win10",
     ),
     os = os.WINDOWS_10,
-    notifies = ['Win 10 Fast Ring'],
+    notifies = ["Win 10 Fast Ring"],
 )
 
 ci.fyi_windows_builder(
-    name = 'win32-arm64-rel',
+    name = "win32-arm64-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'win32|arm64',
+        category = "win32|arm64",
     ),
     cpu = cpu.X86,
     goma_jobs = goma.jobs.J150,
 )
 
 ci.fyi_windows_builder(
-    name = 'win-annotator-rel',
+    name = "win-annotator-rel",
     builderless = True,
     console_view_entry = ci.console_view_entry(
-        category = 'network|traffic|annotations',
-        short_name = 'win',
+        category = "network|traffic|annotations",
+        short_name = "win",
     ),
     execution_timeout = 16 * time.hour,
-    notifies = ['annotator-rel'],
+    notifies = ["annotator-rel"],
 )
 
 ci.fyi_windows_builder(
-    name = 'Mojo Windows',
+    name = "Mojo Windows",
     console_view_entry = ci.console_view_entry(
-        category = 'mojo',
-        short_name = 'win',
+        category = "mojo",
+        short_name = "win",
     ),
 )
 
-
 ci.gpu_builder(
-    name = 'GPU Linux Builder (dbg)',
+    name = "GPU Linux Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux',
+        category = "Linux",
     ),
     tree_closing = False,
 )
 
 ci.gpu_builder(
-    name = 'GPU Mac Builder (dbg)',
+    name = "GPU Mac Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac',
+        category = "Mac",
     ),
     cores = None,
     os = os.MAC_ANY,
@@ -2043,939 +2024,932 @@
 )
 
 ci.gpu_builder(
-    name = 'GPU Win x64 Builder (dbg)',
+    name = "GPU Win x64 Builder (dbg)",
     builderless = True,
     console_view_entry = ci.console_view_entry(
-        category = 'Windows',
+        category = "Windows",
     ),
     os = os.WINDOWS_ANY,
     tree_closing = False,
 )
 
-
 ci.gpu_thin_tester(
-    name = 'Linux Debug (NVIDIA)',
+    name = "Linux Debug (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux',
+        category = "Linux",
     ),
-    triggered_by = ['GPU Linux Builder (dbg)'],
+    triggered_by = ["GPU Linux Builder (dbg)"],
     tree_closing = False,
 )
 
 ci.gpu_thin_tester(
-    name = 'Mac Debug (Intel)',
+    name = "Mac Debug (Intel)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac',
+        category = "Mac",
     ),
-    triggered_by = ['GPU Mac Builder (dbg)'],
+    triggered_by = ["GPU Mac Builder (dbg)"],
     tree_closing = False,
 )
 
 ci.gpu_thin_tester(
-    name = 'Mac Retina Debug (AMD)',
+    name = "Mac Retina Debug (AMD)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac',
+        category = "Mac",
     ),
-    triggered_by = ['GPU Mac Builder (dbg)'],
+    triggered_by = ["GPU Mac Builder (dbg)"],
     tree_closing = False,
 )
 
 ci.gpu_thin_tester(
-    name = 'Win10 x64 Debug (NVIDIA)',
+    name = "Win10 x64 Debug (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows',
+        category = "Windows",
     ),
-    triggered_by = ['GPU Win x64 Builder (dbg)'],
+    triggered_by = ["GPU Win x64 Builder (dbg)"],
     tree_closing = False,
 )
 
-
 ci.gpu_fyi_linux_builder(
-    name = 'Android FYI 32 Vk Release (Pixel 2)',
+    name = "Android FYI 32 Vk Release (Pixel 2)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|vk|Q32',
-        short_name = 'P2',
+        category = "Android|vk|Q32",
+        short_name = "P2",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'Android FYI 32 dEQP Vk Release (Pixel 2)',
+    name = "Android FYI 32 dEQP Vk Release (Pixel 2)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|dqp|vk|Q32',
-        short_name = 'P2',
+        category = "Android|dqp|vk|Q32",
+        short_name = "P2",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'Android FYI 64 Perf (Pixel 2)',
+    name = "Android FYI 64 Perf (Pixel 2)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|Perf|Q64',
-        short_name = 'P2',
+        category = "Android|Perf|Q64",
+        short_name = "P2",
     ),
     cores = 2,
-    triggered_by = ['GPU FYI Perf Android 64 Builder'],
+    triggered_by = ["GPU FYI Perf Android 64 Builder"],
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'Android FYI 64 Vk Release (Pixel 2)',
+    name = "Android FYI 64 Vk Release (Pixel 2)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|vk|Q64',
-        short_name = 'P2',
+        category = "Android|vk|Q64",
+        short_name = "P2",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'Android FYI 64 dEQP Vk Release (Pixel 2)',
+    name = "Android FYI 64 dEQP Vk Release (Pixel 2)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|dqp|vk|Q64',
-        short_name = 'P2',
+        category = "Android|dqp|vk|Q64",
+        short_name = "P2",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'Android FYI Release (NVIDIA Shield TV)',
+    name = "Android FYI Release (NVIDIA Shield TV)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|N64|NVDA',
-        short_name = 'STV',
+        category = "Android|N64|NVDA",
+        short_name = "STV",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'Android FYI Release (Nexus 5)',
+    name = "Android FYI Release (Nexus 5)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|L32',
-        short_name = 'N5',
+        category = "Android|L32",
+        short_name = "N5",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'Android FYI Release (Nexus 5X)',
+    name = "Android FYI Release (Nexus 5X)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|M64|QCOM',
-        short_name = 'N5X',
+        category = "Android|M64|QCOM",
+        short_name = "N5X",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'Android FYI Release (Nexus 6)',
+    name = "Android FYI Release (Nexus 6)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|L32',
-        short_name = 'N6',
+        category = "Android|L32",
+        short_name = "N6",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'Android FYI Release (Nexus 6P)',
+    name = "Android FYI Release (Nexus 6P)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|M64|QCOM',
-        short_name = 'N6P',
+        category = "Android|M64|QCOM",
+        short_name = "N6P",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'Android FYI Release (Nexus 9)',
+    name = "Android FYI Release (Nexus 9)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|M64|NVDA',
-        short_name = 'N9',
+        category = "Android|M64|NVDA",
+        short_name = "N9",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'Android FYI Release (Pixel 2)',
+    name = "Android FYI Release (Pixel 2)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|P32|QCOM',
-        short_name = 'P2',
+        category = "Android|P32|QCOM",
+        short_name = "P2",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'Android FYI SkiaRenderer GL (Nexus 5X)',
+    name = "Android FYI SkiaRenderer GL (Nexus 5X)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|skgl|M64',
-        short_name = 'N5X',
+        category = "Android|skgl|M64",
+        short_name = "N5X",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'Android FYI SkiaRenderer Vulkan (Pixel 2)',
+    name = "Android FYI SkiaRenderer Vulkan (Pixel 2)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|skv|P32',
-        short_name = 'P2',
+        category = "Android|skv|P32",
+        short_name = "P2",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'Android FYI dEQP Release (Nexus 5X)',
+    name = "Android FYI dEQP Release (Nexus 5X)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|dqp|M64',
-        short_name = 'N5X',
+        category = "Android|dqp|M64",
+        short_name = "N5X",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'ChromeOS FYI Release (amd64-generic)',
+    name = "ChromeOS FYI Release (amd64-generic)",
     console_view_entry = ci.console_view_entry(
-        category = 'ChromeOS|amd64|generic',
-        short_name = 'x64'
+        category = "ChromeOS|amd64|generic",
+        short_name = "x64",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'ChromeOS FYI Release (kevin)',
+    name = "ChromeOS FYI Release (kevin)",
     console_view_entry = ci.console_view_entry(
-        category = 'ChromeOS|arm|kevin',
-        short_name = 'kvn'
+        category = "ChromeOS|arm|kevin",
+        short_name = "kvn",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'GPU FYI Linux Builder',
+    name = "GPU FYI Linux Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Builder',
-        short_name = 'rel',
+        category = "Linux|Builder",
+        short_name = "rel",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'GPU FYI Linux Builder (dbg)',
+    name = "GPU FYI Linux Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Builder',
-        short_name = 'dbg',
+        category = "Linux|Builder",
+        short_name = "dbg",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'GPU FYI Linux Ozone Builder',
+    name = "GPU FYI Linux Ozone Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Builder',
-        short_name = 'ozn',
+        category = "Linux|Builder",
+        short_name = "ozn",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'GPU FYI Linux dEQP Builder',
+    name = "GPU FYI Linux dEQP Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Builder',
-        short_name = 'dqp',
+        category = "Linux|Builder",
+        short_name = "dqp",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'GPU FYI Perf Android 64 Builder',
+    name = "GPU FYI Perf Android 64 Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Android|Perf|Builder',
-        short_name = '64',
+        category = "Android|Perf|Builder",
+        short_name = "64",
     ),
 )
 
 ci.gpu_fyi_linux_builder(
-    name = 'Linux FYI GPU TSAN Release',
+    name = "Linux FYI GPU TSAN Release",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux',
-        short_name = 'tsn',
+        category = "Linux",
+        short_name = "tsn",
     ),
 )
 
 # Builder + tester.
 ci.gpu_fyi_linux_builder(
-    name = 'Linux FYI SkiaRenderer Dawn Release (Intel HD 630)',
+    name = "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Intel',
-        short_name = 'skd',
-    ),
-)
-
-
-ci.gpu_fyi_mac_builder(
-    name = 'Mac FYI GPU ASAN Release',
-    console_view_entry = ci.console_view_entry(
-        category = 'Mac',
-        short_name = 'asn',
+        category = "Linux|Intel",
+        short_name = "skd",
     ),
 )
 
 ci.gpu_fyi_mac_builder(
-    name = 'GPU FYI Mac Builder',
+    name = "Mac FYI GPU ASAN Release",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac|Builder',
-        short_name = 'rel',
+        category = "Mac",
+        short_name = "asn",
     ),
 )
 
 ci.gpu_fyi_mac_builder(
-    name = 'GPU FYI Mac Builder (dbg)',
+    name = "GPU FYI Mac Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac|Builder',
-        short_name = 'dbg',
+        category = "Mac|Builder",
+        short_name = "rel",
     ),
 )
 
 ci.gpu_fyi_mac_builder(
-    name = 'GPU FYI Mac dEQP Builder',
+    name = "GPU FYI Mac Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac|Builder',
-        short_name = 'dqp',
+        category = "Mac|Builder",
+        short_name = "dbg",
     ),
 )
 
-
-ci.gpu_fyi_thin_tester(
-    name = 'Linux FYI Debug (NVIDIA)',
+ci.gpu_fyi_mac_builder(
+    name = "GPU FYI Mac dEQP Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Nvidia',
-        short_name = 'dbg',
+        category = "Mac|Builder",
+        short_name = "dqp",
     ),
-    triggered_by = ['GPU FYI Linux Builder (dbg)'],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Linux FYI Experimental Release (Intel HD 630)',
+    name = "Linux FYI Debug (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Intel',
-        short_name = 'exp',
+        category = "Linux|Nvidia",
+        short_name = "dbg",
     ),
-    triggered_by = ['GPU FYI Linux Builder'],
+    triggered_by = ["GPU FYI Linux Builder (dbg)"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Linux FYI Experimental Release (NVIDIA)',
+    name = "Linux FYI Experimental Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Nvidia',
-        short_name = 'exp',
+        category = "Linux|Intel",
+        short_name = "exp",
     ),
-    triggered_by = ['GPU FYI Linux Builder'],
+    triggered_by = ["GPU FYI Linux Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Linux FYI Ozone (Intel)',
+    name = "Linux FYI Experimental Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Intel',
-        short_name = 'ozn',
+        category = "Linux|Nvidia",
+        short_name = "exp",
     ),
-    triggered_by = ['GPU FYI Linux Ozone Builder'],
+    triggered_by = ["GPU FYI Linux Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Linux FYI Release (NVIDIA)',
+    name = "Linux FYI Ozone (Intel)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Nvidia',
-        short_name = 'rel',
+        category = "Linux|Intel",
+        short_name = "ozn",
     ),
-    triggered_by = ['GPU FYI Linux Builder'],
+    triggered_by = ["GPU FYI Linux Ozone Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Linux FYI Release (AMD R7 240)',
+    name = "Linux FYI Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|AMD',
-        short_name = 'rel',
+        category = "Linux|Nvidia",
+        short_name = "rel",
     ),
-    triggered_by = ['GPU FYI Linux Builder'],
+    triggered_by = ["GPU FYI Linux Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Linux FYI Release (Intel HD 630)',
+    name = "Linux FYI Release (AMD R7 240)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Intel',
-        short_name = 'rel',
+        category = "Linux|AMD",
+        short_name = "rel",
     ),
-    triggered_by = ['GPU FYI Linux Builder'],
+    triggered_by = ["GPU FYI Linux Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Linux FYI Release (Intel UHD 630)',
+    name = "Linux FYI Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Intel',
-        short_name = 'uhd',
+        category = "Linux|Intel",
+        short_name = "rel",
+    ),
+    triggered_by = ["GPU FYI Linux Builder"],
+)
+
+ci.gpu_fyi_thin_tester(
+    name = "Linux FYI Release (Intel UHD 630)",
+    console_view_entry = ci.console_view_entry(
+        category = "Linux|Intel",
+        short_name = "uhd",
     ),
     # TODO(https://crbug.com/986939): Remove this increased timeout once more
     # devices are added.
     execution_timeout = 18 * time.hour,
-    triggered_by = ['GPU FYI Linux Builder'],
+    triggered_by = ["GPU FYI Linux Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Linux FYI SkiaRenderer Vulkan (Intel HD 630)',
+    name = "Linux FYI SkiaRenderer Vulkan (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Intel',
-        short_name = 'skv',
+        category = "Linux|Intel",
+        short_name = "skv",
     ),
-    triggered_by = ['GPU FYI Linux Builder'],
+    triggered_by = ["GPU FYI Linux Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Linux FYI SkiaRenderer Vulkan (NVIDIA)',
+    name = "Linux FYI SkiaRenderer Vulkan (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Nvidia',
-        short_name = 'skv',
+        category = "Linux|Nvidia",
+        short_name = "skv",
     ),
-    triggered_by = ['GPU FYI Linux Builder'],
+    triggered_by = ["GPU FYI Linux Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Linux FYI dEQP Release (Intel HD 630)',
+    name = "Linux FYI dEQP Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Intel',
-        short_name = 'dqp',
+        category = "Linux|Intel",
+        short_name = "dqp",
     ),
-    triggered_by = ['GPU FYI Linux dEQP Builder'],
+    triggered_by = ["GPU FYI Linux dEQP Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Linux FYI dEQP Release (NVIDIA)',
+    name = "Linux FYI dEQP Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux|Nvidia',
-        short_name = 'dqp',
+        category = "Linux|Nvidia",
+        short_name = "dqp",
     ),
-    triggered_by = ['GPU FYI Linux dEQP Builder'],
+    triggered_by = ["GPU FYI Linux dEQP Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Mac FYI Debug (Intel)',
+    name = "Mac FYI Debug (Intel)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac|Intel',
-        short_name = 'dbg',
+        category = "Mac|Intel",
+        short_name = "dbg",
     ),
-    triggered_by = ['GPU FYI Mac Builder (dbg)'],
+    triggered_by = ["GPU FYI Mac Builder (dbg)"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Mac FYI Experimental Release (Intel)',
+    name = "Mac FYI Experimental Release (Intel)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac|Intel',
-        short_name = 'exp',
+        category = "Mac|Intel",
+        short_name = "exp",
     ),
-    triggered_by = ['GPU FYI Mac Builder'],
+    triggered_by = ["GPU FYI Mac Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Mac FYI Experimental Retina Release (AMD)',
+    name = "Mac FYI Experimental Retina Release (AMD)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac|AMD|Retina',
-        short_name = 'exp',
+        category = "Mac|AMD|Retina",
+        short_name = "exp",
     ),
-    triggered_by = ['GPU FYI Mac Builder'],
+    triggered_by = ["GPU FYI Mac Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Mac FYI Experimental Retina Release (NVIDIA)',
+    name = "Mac FYI Experimental Retina Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac|Nvidia',
-        short_name = 'exp',
+        category = "Mac|Nvidia",
+        short_name = "exp",
     ),
     # This bot has one machine backing its tests at the moment.
     # If it gets more, this can be removed.
     # See crbug.com/853307 for more context.
     execution_timeout = 12 * time.hour,
-    triggered_by = ['GPU FYI Mac Builder'],
+    triggered_by = ["GPU FYI Mac Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Mac FYI Release (Intel)',
+    name = "Mac FYI Release (Intel)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac|Intel',
-        short_name = 'rel',
+        category = "Mac|Intel",
+        short_name = "rel",
     ),
-    triggered_by = ['GPU FYI Mac Builder'],
+    triggered_by = ["GPU FYI Mac Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Mac FYI Retina Debug (AMD)',
+    name = "Mac FYI Retina Debug (AMD)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac|AMD|Retina',
-        short_name = 'dbg',
+        category = "Mac|AMD|Retina",
+        short_name = "dbg",
     ),
-    triggered_by = ['GPU FYI Mac Builder (dbg)'],
+    triggered_by = ["GPU FYI Mac Builder (dbg)"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Mac FYI Retina Debug (NVIDIA)',
+    name = "Mac FYI Retina Debug (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac|Nvidia',
-        short_name = 'dbg',
+        category = "Mac|Nvidia",
+        short_name = "dbg",
     ),
-    triggered_by = ['GPU FYI Mac Builder (dbg)'],
+    triggered_by = ["GPU FYI Mac Builder (dbg)"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Mac FYI Retina Release (AMD)',
+    name = "Mac FYI Retina Release (AMD)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac|AMD|Retina',
-        short_name = 'rel',
+        category = "Mac|AMD|Retina",
+        short_name = "rel",
     ),
-    triggered_by = ['GPU FYI Mac Builder'],
+    triggered_by = ["GPU FYI Mac Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Mac FYI Retina Release (NVIDIA)',
+    name = "Mac FYI Retina Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac|Nvidia',
-        short_name = 'rel',
+        category = "Mac|Nvidia",
+        short_name = "rel",
     ),
-    triggered_by = ['GPU FYI Mac Builder'],
+    triggered_by = ["GPU FYI Mac Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Mac FYI dEQP Release AMD',
+    name = "Mac FYI dEQP Release AMD",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac|AMD',
-        short_name = 'dqp',
+        category = "Mac|AMD",
+        short_name = "dqp",
     ),
-    triggered_by = ['GPU FYI Mac dEQP Builder'],
+    triggered_by = ["GPU FYI Mac dEQP Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Mac FYI dEQP Release Intel',
+    name = "Mac FYI dEQP Release Intel",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac|Intel',
-        short_name = 'dqp',
+        category = "Mac|Intel",
+        short_name = "dqp",
     ),
-    triggered_by = ['GPU FYI Mac dEQP Builder'],
+    triggered_by = ["GPU FYI Mac dEQP Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Mac Pro FYI Release (AMD)',
+    name = "Mac Pro FYI Release (AMD)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac|AMD|Pro',
-        short_name = 'rel',
+        category = "Mac|AMD|Pro",
+        short_name = "rel",
     ),
-    triggered_by = ['GPU FYI Mac Builder'],
+    triggered_by = ["GPU FYI Mac Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win10 FYI x64 Debug (NVIDIA)',
+    name = "Win10 FYI x64 Debug (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x64|Nvidia',
-        short_name = 'dbg',
+        category = "Windows|10|x64|Nvidia",
+        short_name = "dbg",
     ),
-    triggered_by = ['GPU FYI Win x64 Builder (dbg)'],
+    triggered_by = ["GPU FYI Win x64 Builder (dbg)"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)',
+    name = "Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x64|Nvidia|dx12vk',
-        short_name = 'dbg',
+        category = "Windows|10|x64|Nvidia|dx12vk",
+        short_name = "dbg",
     ),
-    triggered_by = ['GPU FYI Win x64 DX12 Vulkan Builder (dbg)'],
+    triggered_by = ["GPU FYI Win x64 DX12 Vulkan Builder (dbg)"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win10 FYI x64 DX12 Vulkan Release (NVIDIA)',
+    name = "Win10 FYI x64 DX12 Vulkan Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x64|Nvidia|dx12vk',
-        short_name = 'rel',
+        category = "Windows|10|x64|Nvidia|dx12vk",
+        short_name = "rel",
     ),
-    triggered_by = ['GPU FYI Win x64 DX12 Vulkan Builder'],
+    triggered_by = ["GPU FYI Win x64 DX12 Vulkan Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win10 FYI x64 Exp Release (Intel HD 630)',
+    name = "Win10 FYI x64 Exp Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x64|Intel',
-        short_name = 'exp',
+        category = "Windows|10|x64|Intel",
+        short_name = "exp",
     ),
-    triggered_by = ['GPU FYI Win x64 Builder'],
+    triggered_by = ["GPU FYI Win x64 Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win10 FYI x64 Exp Release (NVIDIA)',
+    name = "Win10 FYI x64 Exp Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x64|Nvidia',
-        short_name = 'exp',
+        category = "Windows|10|x64|Nvidia",
+        short_name = "exp",
     ),
-    triggered_by = ['GPU FYI Win x64 Builder'],
+    triggered_by = ["GPU FYI Win x64 Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win10 FYI x64 Release (AMD RX 550)',
+    name = "Win10 FYI x64 Release (AMD RX 550)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x64|AMD',
-        short_name = 'rel',
+        category = "Windows|10|x64|AMD",
+        short_name = "rel",
     ),
-    triggered_by = ['GPU FYI Win x64 Builder'],
+    triggered_by = ["GPU FYI Win x64 Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win10 FYI x64 Release (Intel HD 630)',
+    name = "Win10 FYI x64 Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x64|Intel',
-        short_name = 'rel',
+        category = "Windows|10|x64|Intel",
+        short_name = "rel",
     ),
-    triggered_by = ['GPU FYI Win x64 Builder'],
+    triggered_by = ["GPU FYI Win x64 Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win10 FYI x64 Release (Intel UHD 630)',
+    name = "Win10 FYI x64 Release (Intel UHD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x64|Intel',
-        short_name = 'uhd',
+        category = "Windows|10|x64|Intel",
+        short_name = "uhd",
     ),
     # TODO(https://crbug.com/986939): Remove this increased timeout once
     # more devices are added.
     execution_timeout = 18 * time.hour,
-    triggered_by = ['GPU FYI Win x64 Builder'],
+    triggered_by = ["GPU FYI Win x64 Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win10 FYI x64 Release (NVIDIA GeForce GTX 1660)',
+    name = "Win10 FYI x64 Release (NVIDIA GeForce GTX 1660)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x64|Nvidia',
-        short_name = 'gtx',
+        category = "Windows|10|x64|Nvidia",
+        short_name = "gtx",
     ),
     execution_timeout = 18 * time.hour,
-    triggered_by = ['GPU FYI Win x64 Builder'],
+    triggered_by = ["GPU FYI Win x64 Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win10 FYI x64 Release (NVIDIA)',
+    name = "Win10 FYI x64 Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x64|Nvidia',
-        short_name = 'rel',
+        category = "Windows|10|x64|Nvidia",
+        short_name = "rel",
     ),
-    triggered_by = ['GPU FYI Win x64 Builder'],
+    triggered_by = ["GPU FYI Win x64 Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win10 FYI x64 Release XR Perf (NVIDIA)',
+    name = "Win10 FYI x64 Release XR Perf (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x64|Nvidia',
-        short_name = 'xr',
+        category = "Windows|10|x64|Nvidia",
+        short_name = "xr",
     ),
-    triggered_by = ['GPU FYI XR Win x64 Builder'],
+    triggered_by = ["GPU FYI XR Win x64 Builder"],
 )
 
 # Builder + tester.
 ci.gpu_fyi_windows_builder(
-    name = 'Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)',
+    name = "Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x64|Nvidia',
-        short_name = 'skd',
+        category = "Windows|10|x64|Nvidia",
+        short_name = "skd",
     ),
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win10 FYI x64 SkiaRenderer GL (NVIDIA)',
+    name = "Win10 FYI x64 SkiaRenderer GL (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x64|Nvidia',
-        short_name = 'skgl',
+        category = "Windows|10|x64|Nvidia",
+        short_name = "skgl",
     ),
-    triggered_by = ['GPU FYI Win x64 Builder'],
+    triggered_by = ["GPU FYI Win x64 Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win10 FYI x64 dEQP Release (Intel HD 630)',
+    name = "Win10 FYI x64 dEQP Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x64|Intel',
-        short_name = 'dqp',
+        category = "Windows|10|x64|Intel",
+        short_name = "dqp",
     ),
-    triggered_by = ['GPU FYI Win x64 dEQP Builder'],
+    triggered_by = ["GPU FYI Win x64 dEQP Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win10 FYI x64 dEQP Release (NVIDIA)',
+    name = "Win10 FYI x64 dEQP Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x64|Nvidia',
-        short_name = 'dqp',
+        category = "Windows|10|x64|Nvidia",
+        short_name = "dqp",
     ),
-    triggered_by = ['GPU FYI Win x64 dEQP Builder'],
+    triggered_by = ["GPU FYI Win x64 dEQP Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win10 FYI x86 Release (NVIDIA)',
+    name = "Win10 FYI x86 Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|10|x86|Nvidia',
-        short_name = 'rel',
+        category = "Windows|10|x86|Nvidia",
+        short_name = "rel",
     ),
-    triggered_by = ['GPU FYI Win Builder'],
+    triggered_by = ["GPU FYI Win Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win7 FYI Debug (AMD)',
+    name = "Win7 FYI Debug (AMD)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|7|x86|AMD',
-        short_name = 'dbg',
+        category = "Windows|7|x86|AMD",
+        short_name = "dbg",
     ),
-    triggered_by = ['GPU FYI Win Builder (dbg)'],
+    triggered_by = ["GPU FYI Win Builder (dbg)"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win7 FYI Release (AMD)',
+    name = "Win7 FYI Release (AMD)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|7|x86|AMD',
-        short_name = 'rel',
+        category = "Windows|7|x86|AMD",
+        short_name = "rel",
     ),
-    triggered_by = ['GPU FYI Win Builder'],
+    triggered_by = ["GPU FYI Win Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win7 FYI Release (NVIDIA)',
+    name = "Win7 FYI Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|7|x86|Nvidia',
-        short_name = 'rel',
+        category = "Windows|7|x86|Nvidia",
+        short_name = "rel",
     ),
-    triggered_by = ['GPU FYI Win Builder'],
+    triggered_by = ["GPU FYI Win Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win7 FYI dEQP Release (AMD)',
+    name = "Win7 FYI dEQP Release (AMD)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|7|x86|AMD',
-        short_name = 'dqp',
+        category = "Windows|7|x86|AMD",
+        short_name = "dqp",
     ),
-    triggered_by = ['GPU FYI Win dEQP Builder'],
+    triggered_by = ["GPU FYI Win dEQP Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win7 FYI x64 Release (NVIDIA)',
+    name = "Win7 FYI x64 Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|7|x64|Nvidia',
-        short_name = 'rel',
+        category = "Windows|7|x64|Nvidia",
+        short_name = "rel",
     ),
-    triggered_by = ['GPU FYI Win x64 Builder'],
+    triggered_by = ["GPU FYI Win x64 Builder"],
 )
 
 ci.gpu_fyi_thin_tester(
-    name = 'Win7 FYI x64 dEQP Release (NVIDIA)',
+    name = "Win7 FYI x64 dEQP Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|7|x64|Nvidia',
-        short_name = 'dqp',
+        category = "Windows|7|x64|Nvidia",
+        short_name = "dqp",
     ),
-    triggered_by = ['GPU FYI Win x64 dEQP Builder'],
+    triggered_by = ["GPU FYI Win x64 dEQP Builder"],
 )
 
-
 ci.gpu_fyi_windows_builder(
-    name = 'GPU FYI Win Builder',
+    name = "GPU FYI Win Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|Builder|Release',
-        short_name = 'x86',
+        category = "Windows|Builder|Release",
+        short_name = "x86",
     ),
 )
 
 ci.gpu_fyi_windows_builder(
-    name = 'GPU FYI Win Builder (dbg)',
+    name = "GPU FYI Win Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|Builder|Debug',
-        short_name = 'x86',
+        category = "Windows|Builder|Debug",
+        short_name = "x86",
     ),
 )
 
 ci.gpu_fyi_windows_builder(
-    name = 'GPU FYI Win dEQP Builder',
+    name = "GPU FYI Win dEQP Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|Builder|dEQP',
-        short_name = 'x86',
+        category = "Windows|Builder|dEQP",
+        short_name = "x86",
     ),
 )
 
 ci.gpu_fyi_windows_builder(
-    name = 'GPU FYI Win x64 Builder',
+    name = "GPU FYI Win x64 Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|Builder|Release',
-        short_name = 'x64',
+        category = "Windows|Builder|Release",
+        short_name = "x64",
     ),
 )
 
 ci.gpu_fyi_windows_builder(
-    name = 'GPU FYI Win x64 Builder (dbg)',
+    name = "GPU FYI Win x64 Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|Builder|Debug',
-        short_name = 'x64',
+        category = "Windows|Builder|Debug",
+        short_name = "x64",
     ),
 )
 
 ci.gpu_fyi_windows_builder(
-    name = 'GPU FYI Win x64 dEQP Builder',
+    name = "GPU FYI Win x64 dEQP Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|Builder|dEQP',
-        short_name = 'x64',
+        category = "Windows|Builder|dEQP",
+        short_name = "x64",
     ),
 )
 
 ci.gpu_fyi_windows_builder(
-    name = 'GPU FYI Win x64 DX12 Vulkan Builder',
+    name = "GPU FYI Win x64 DX12 Vulkan Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|Builder|dx12vk',
-        short_name = 'rel',
+        category = "Windows|Builder|dx12vk",
+        short_name = "rel",
     ),
 )
 
 ci.gpu_fyi_windows_builder(
-    name = 'GPU FYI Win x64 DX12 Vulkan Builder (dbg)',
+    name = "GPU FYI Win x64 DX12 Vulkan Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|Builder|dx12vk',
-        short_name = 'dbg',
+        category = "Windows|Builder|dx12vk",
+        short_name = "dbg",
     ),
 )
 
 ci.gpu_fyi_windows_builder(
-    name = 'GPU FYI XR Win x64 Builder',
+    name = "GPU FYI XR Win x64 Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows|Builder|XR',
-        short_name = 'x64',
+        category = "Windows|Builder|XR",
+        short_name = "x64",
     ),
 )
 
-
 ci.linux_builder(
-    name = 'Cast Audio Linux',
+    name = "Cast Audio Linux",
     console_view_entry = ci.console_view_entry(
-        category = 'cast',
-        short_name = 'aud',
+        category = "cast",
+        short_name = "aud",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
     ssd = True,
 )
 
 ci.linux_builder(
-    name = 'Deterministic Fuchsia (dbg)',
+    name = "Deterministic Fuchsia (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|x64',
-        short_name = 'det',
+        category = "fuchsia|x64",
+        short_name = "det",
     ),
-    executable = 'recipe:swarming/deterministic_build',
+    executable = "recipe:swarming/deterministic_build",
     execution_timeout = 6 * time.hour,
     goma_jobs = None,
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.linux_builder(
-    name = 'Deterministic Linux',
+    name = "Deterministic Linux",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'det',
+        category = "release",
+        short_name = "det",
     ),
-    executable = 'recipe:swarming/deterministic_build',
+    executable = "recipe:swarming/deterministic_build",
     execution_timeout = 6 * time.hour,
-    main_console_view = 'main',
+    main_console_view = "main",
     # Set tree_closing to false to disable the defaualt tree closer, which
     # filters by step name, and instead enable tree closing for any step
     # failure.
     tree_closing = False,
-    extra_notifies = ['Deterministic Linux', 'close-on-any-step-failure'],
+    extra_notifies = ["Deterministic Linux", "close-on-any-step-failure"],
 )
 
 ci.linux_builder(
-    name = 'Deterministic Linux (dbg)',
+    name = "Deterministic Linux (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|builder',
-        short_name = 'det',
+        category = "debug|builder",
+        short_name = "det",
     ),
     cores = 32,
-    executable = 'recipe:swarming/deterministic_build',
+    executable = "recipe:swarming/deterministic_build",
     execution_timeout = 6 * time.hour,
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.linux_builder(
-    name = 'Leak Detection Linux',
-    console_view = 'chromium.fyi',
+    name = "Leak Detection Linux",
+    console_view = "chromium.fyi",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
-        short_name = 'lk',
+        category = "linux",
+        short_name = "lk",
     ),
     notifies = [],
     tree_closing = False,
 )
 
 ci.linux_builder(
-    name = 'Linux Builder (dbg)(32)',
+    name = "Linux Builder (dbg)(32)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|builder',
-        short_name = '32',
+        category = "debug|builder",
+        short_name = "32",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.linux_builder(
-    name = 'Network Service Linux',
+    name = "Network Service Linux",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'nsl',
+        category = "release",
+        short_name = "nsl",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.linux_builder(
-    name = 'fuchsia-x64-dbg',
+    name = "fuchsia-x64-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|x64',
-        short_name = 'dbg',
+        category = "fuchsia|x64",
+        short_name = "dbg",
     ),
-    main_console_view = 'main',
-    extra_notifies = ['cr-fuchsia'],
+    main_console_view = "main",
+    extra_notifies = ["cr-fuchsia"],
 )
 
 ci.linux_builder(
-    name = 'linux-blink-cors-rel',
+    name = "linux-blink-cors-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'crs',
+        category = "release",
+        short_name = "crs",
     ),
     goma_jobs = None,
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.linux_builder(
-    name = 'linux-gcc-rel',
+    name = "linux-gcc-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'gcc',
+        category = "release",
+        short_name = "gcc",
     ),
     goma_backend = None,
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.linux_builder(
-    name = 'linux-trusty-rel',
+    name = "linux-trusty-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'tru',
+        category = "release",
+        short_name = "tru",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
     os = os.LINUX_TRUSTY,
 )
 
 ci.linux_builder(
-    name = 'metadata-exporter',
-    executable = 'recipe:chromium_export_metadata',
-    service_account = 'component-mapping-updater@chops-service-accounts.iam.gserviceaccount.com',
-    notifies = ['metadata-mapping'],
+    name = "metadata-exporter",
+    executable = "recipe:chromium_export_metadata",
+    service_account = "component-mapping-updater@chops-service-accounts.iam.gserviceaccount.com",
+    notifies = ["metadata-mapping"],
     tree_closing = False,
 )
 
 ci.mac_ios_builder(
-    name = 'ios-device',
+    name = "ios-device",
     console_view_entry = ci.console_view_entry(
-        category = 'ios|default',
-        short_name = 'dev',
+        category = "ios|default",
+        short_name = "dev",
     ),
     # We don't have necessary capacity to run this configuration in CQ, but it
     # is part of the main waterfall
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.mac_ios_builder(
-    name = 'ios-simulator-noncq',
+    name = "ios-simulator-noncq",
     console_view_entry = ci.console_view_entry(
-        category = 'ios|default',
-        short_name = 'non',
+        category = "ios|default",
+        short_name = "non",
     ),
     # We don't have necessary capacity to run this configuration in CQ, but it
     # is part of the main waterfall
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
-
 ci.memory_builder(
-    name = 'Android CFI',
+    name = "Android CFI",
     # TODO(https://crbug.com/1008094) When this builder is not consistently
     # failing, remove the console_view value
-    console_view = 'chromium.android.fyi',
+    console_view = "chromium.android.fyi",
     console_view_entry = ci.console_view_entry(
-        category = 'memory',
-        short_name = 'cfi',
+        category = "memory",
+        short_name = "cfi",
     ),
     cores = 32,
     # TODO(https://crbug.com/919430) Remove the larger timeout once compile
@@ -2985,90 +2959,90 @@
 )
 
 ci.memory_builder(
-    name = 'Linux CFI',
+    name = "Linux CFI",
     console_view_entry = ci.console_view_entry(
-        category = 'cfi',
-        short_name = 'lnx',
+        category = "cfi",
+        short_name = "lnx",
     ),
     cores = 32,
     # TODO(thakis): Remove once https://crbug.com/927738 is resolved.
     execution_timeout = 4 * time.hour,
     goma_jobs = goma.jobs.MANY_JOBS_FOR_CI,
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.memory_builder(
-    name = 'Linux Chromium OS ASan LSan Builder',
+    name = "Linux Chromium OS ASan LSan Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'cros|asan',
-        short_name = 'bld',
+        category = "cros|asan",
+        short_name = "bld",
     ),
     # TODO(crbug.com/1030593): Builds take more than 3 hours sometimes. Remove
     # once the builds are faster.
     execution_timeout = 6 * time.hour,
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.memory_builder(
-    name = 'Linux Chromium OS ASan LSan Tests (1)',
+    name = "Linux Chromium OS ASan LSan Tests (1)",
     console_view_entry = ci.console_view_entry(
-        category = 'cros|asan',
-        short_name = 'tst',
+        category = "cros|asan",
+        short_name = "tst",
     ),
-    triggered_by = ['Linux Chromium OS ASan LSan Builder'],
-    main_console_view = 'main',
+    triggered_by = ["Linux Chromium OS ASan LSan Builder"],
+    main_console_view = "main",
 )
 
 ci.memory_builder(
-    name = 'Linux ChromiumOS MSan Builder',
+    name = "Linux ChromiumOS MSan Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'cros|msan',
-        short_name = 'bld',
+        category = "cros|msan",
+        short_name = "bld",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.memory_builder(
-    name = 'Linux ChromiumOS MSan Tests',
+    name = "Linux ChromiumOS MSan Tests",
     console_view_entry = ci.console_view_entry(
-        category = 'cros|msan',
-        short_name = 'tst',
+        category = "cros|msan",
+        short_name = "tst",
     ),
-    triggered_by = ['Linux ChromiumOS MSan Builder'],
-    main_console_view = 'main',
+    triggered_by = ["Linux ChromiumOS MSan Builder"],
+    main_console_view = "main",
 )
 
 ci.memory_builder(
-    name = 'Linux MSan Builder',
+    name = "Linux MSan Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|msan',
-        short_name = 'bld',
+        category = "linux|msan",
+        short_name = "bld",
     ),
     goma_jobs = goma.jobs.MANY_JOBS_FOR_CI,
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.memory_builder(
-    name = 'Linux MSan Tests',
+    name = "Linux MSan Tests",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|msan',
-        short_name = 'tst',
+        category = "linux|msan",
+        short_name = "tst",
     ),
-    triggered_by = ['Linux MSan Builder'],
-    main_console_view = 'main',
+    triggered_by = ["Linux MSan Builder"],
+    main_console_view = "main",
 )
 
 ci.memory_builder(
-    name = 'Mac ASan 64 Builder',
+    name = "Mac ASan 64 Builder",
     builderless = False,
     console_view_entry = ci.console_view_entry(
-        category = 'mac',
-        short_name = 'bld',
+        category = "mac",
+        short_name = "bld",
     ),
     goma_debug = True,  # TODO(hinoka): Remove this after debugging.
     goma_jobs = None,
     cores = None,  # Swapping between 8 and 24
-    main_console_view = 'main',
+    main_console_view = "main",
     os = os.MAC_DEFAULT,
     triggering_policy = scheduler.greedy_batching(
         max_concurrent_invocations = 2,
@@ -3076,272 +3050,268 @@
 )
 
 ci.memory_builder(
-    name = 'Mac ASan 64 Tests (1)',
+    name = "Mac ASan 64 Tests (1)",
     builderless = False,
     console_view_entry = ci.console_view_entry(
-        category = 'mac',
-        short_name = 'tst',
+        category = "mac",
+        short_name = "tst",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
     os = os.MAC_DEFAULT,
-    triggered_by = ['Mac ASan 64 Builder'],
+    triggered_by = ["Mac ASan 64 Builder"],
 )
 
 ci.memory_builder(
-    name = 'WebKit Linux ASAN',
+    name = "WebKit Linux ASAN",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|webkit',
-        short_name = 'asn',
+        category = "linux|webkit",
+        short_name = "asn",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.memory_builder(
-    name = 'WebKit Linux Leak',
+    name = "WebKit Linux Leak",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|webkit',
-        short_name = 'lk',
+        category = "linux|webkit",
+        short_name = "lk",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.memory_builder(
-    name = 'WebKit Linux MSAN',
+    name = "WebKit Linux MSAN",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|webkit',
-        short_name = 'msn',
+        category = "linux|webkit",
+        short_name = "msn",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
 )
 
 ci.memory_builder(
-    name = 'android-asan',
+    name = "android-asan",
     console_view_entry = ci.console_view_entry(
-        category = 'android',
-        short_name = 'asn',
+        category = "android",
+        short_name = "asn",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
     tree_closing = False,
 )
 
 ci.memory_builder(
-    name = 'win-asan',
+    name = "win-asan",
     console_view_entry = ci.console_view_entry(
-        category = 'win',
-        short_name = 'asn',
+        category = "win",
+        short_name = "asn",
     ),
     cores = 32,
     builderless = True,
-    main_console_view = 'main',
+    main_console_view = "main",
     os = os.WINDOWS_DEFAULT,
 )
 
-
 ci.swangle_linux_builder(
-    name = 'linux-swangle-chromium-x64',
+    name = "linux-swangle-chromium-x64",
     console_view_entry = ci.console_view_entry(
-        category = 'Chromium|Linux',
-        short_name = 'x64',
+        category = "Chromium|Linux",
+        short_name = "x64",
     ),
     pinned = False,
 )
 
 ci.swangle_linux_builder(
-    name = 'linux-swangle-tot-angle-x64',
+    name = "linux-swangle-tot-angle-x64",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT ANGLE|Linux',
-        short_name = 'x64',
+        category = "ToT ANGLE|Linux",
+        short_name = "x64",
     ),
 )
 
 ci.swangle_linux_builder(
-    name = 'linux-swangle-tot-angle-x86',
+    name = "linux-swangle-tot-angle-x86",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT ANGLE|Linux',
-        short_name = 'x86',
+        category = "ToT ANGLE|Linux",
+        short_name = "x86",
     ),
 )
 
 ci.swangle_linux_builder(
-    name = 'linux-swangle-tot-swiftshader-x64',
+    name = "linux-swangle-tot-swiftshader-x64",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT SwiftShader|Linux',
-        short_name = 'x64',
+        category = "ToT SwiftShader|Linux",
+        short_name = "x64",
     ),
 )
 
 ci.swangle_linux_builder(
-    name = 'linux-swangle-tot-swiftshader-x86',
+    name = "linux-swangle-tot-swiftshader-x86",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT SwiftShader|Linux',
-        short_name = 'x86',
+        category = "ToT SwiftShader|Linux",
+        short_name = "x86",
     ),
 )
 
 ci.swangle_linux_builder(
-    name = 'linux-swangle-x64',
+    name = "linux-swangle-x64",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Linux',
-        short_name = 'x64',
+        category = "DEPS|Linux",
+        short_name = "x64",
     ),
     pinned = False,
 )
 
 ci.swangle_linux_builder(
-    name = 'linux-swangle-x86',
+    name = "linux-swangle-x86",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Linux',
-        short_name = 'x86',
+        category = "DEPS|Linux",
+        short_name = "x86",
     ),
     pinned = False,
 )
 
-
 ci.swangle_mac_builder(
-    name = 'mac-swangle-chromium-x64',
+    name = "mac-swangle-chromium-x64",
     console_view_entry = ci.console_view_entry(
-        category = 'Chromium|Mac',
-        short_name = 'x64',
-    ),
-    pinned = False,
-)
-
-
-ci.swangle_windows_builder(
-    name = 'win-swangle-chromium-x86',
-    console_view_entry = ci.console_view_entry(
-        category = 'Chromium|Windows',
-        short_name = 'x86',
+        category = "Chromium|Mac",
+        short_name = "x64",
     ),
     pinned = False,
 )
 
 ci.swangle_windows_builder(
-    name = 'win-swangle-tot-angle-x64',
+    name = "win-swangle-chromium-x86",
     console_view_entry = ci.console_view_entry(
-        category = 'ToT ANGLE|Windows',
-        short_name = 'x64',
-    ),
-)
-
-ci.swangle_windows_builder(
-    name = 'win-swangle-tot-angle-x86',
-    console_view_entry = ci.console_view_entry(
-        category = 'ToT ANGLE|Windows',
-        short_name = 'x86',
-    ),
-)
-
-ci.swangle_windows_builder(
-    name = 'win-swangle-tot-swiftshader-x64',
-    console_view_entry = ci.console_view_entry(
-        category = 'ToT SwiftShader|Windows',
-        short_name = 'x64',
-    ),
-)
-
-ci.swangle_windows_builder(
-    name = 'win-swangle-tot-swiftshader-x86',
-    console_view_entry = ci.console_view_entry(
-        category = 'ToT SwiftShader|Windows',
-        short_name = 'x86',
-    ),
-)
-
-ci.swangle_windows_builder(
-    name = 'win-swangle-x64',
-    console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows',
-        short_name = 'x64',
+        category = "Chromium|Windows",
+        short_name = "x86",
     ),
     pinned = False,
 )
 
 ci.swangle_windows_builder(
-    name = 'win-swangle-x86',
+    name = "win-swangle-tot-angle-x64",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows',
-        short_name = 'x86',
+        category = "ToT ANGLE|Windows",
+        short_name = "x64",
+    ),
+)
+
+ci.swangle_windows_builder(
+    name = "win-swangle-tot-angle-x86",
+    console_view_entry = ci.console_view_entry(
+        category = "ToT ANGLE|Windows",
+        short_name = "x86",
+    ),
+)
+
+ci.swangle_windows_builder(
+    name = "win-swangle-tot-swiftshader-x64",
+    console_view_entry = ci.console_view_entry(
+        category = "ToT SwiftShader|Windows",
+        short_name = "x64",
+    ),
+)
+
+ci.swangle_windows_builder(
+    name = "win-swangle-tot-swiftshader-x86",
+    console_view_entry = ci.console_view_entry(
+        category = "ToT SwiftShader|Windows",
+        short_name = "x86",
+    ),
+)
+
+ci.swangle_windows_builder(
+    name = "win-swangle-x64",
+    console_view_entry = ci.console_view_entry(
+        category = "DEPS|Windows",
+        short_name = "x64",
     ),
     pinned = False,
 )
 
-
-ci.win_builder(
-    name = 'WebKit Win10',
+ci.swangle_windows_builder(
+    name = "win-swangle-x86",
     console_view_entry = ci.console_view_entry(
-        category = 'misc',
-        short_name = 'wbk',
+        category = "DEPS|Windows",
+        short_name = "x86",
     ),
-    main_console_view = 'main',
-    triggered_by = ['Win Builder'],
+    pinned = False,
 )
 
 ci.win_builder(
-    name = 'Win Builder',
+    name = "WebKit Win10",
     console_view_entry = ci.console_view_entry(
-        category = 'release|builder',
-        short_name = '32',
+        category = "misc",
+        short_name = "wbk",
+    ),
+    main_console_view = "main",
+    triggered_by = ["Win Builder"],
+)
+
+ci.win_builder(
+    name = "Win Builder",
+    console_view_entry = ci.console_view_entry(
+        category = "release|builder",
+        short_name = "32",
     ),
     cores = 32,
-    main_console_view = 'main',
+    main_console_view = "main",
     os = os.WINDOWS_ANY,
 )
 
 ci.win_builder(
-    name = 'Win x64 Builder (dbg)',
+    name = "Win x64 Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|builder',
-        short_name = '64',
+        category = "debug|builder",
+        short_name = "64",
     ),
     cores = 32,
     builderless = True,
-    main_console_view = 'main',
+    main_console_view = "main",
     os = os.WINDOWS_ANY,
 )
 
 ci.win_builder(
-    name = 'Win10 Tests x64 (dbg)',
+    name = "Win10 Tests x64 (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|tester',
-        short_name = '10',
+        category = "debug|tester",
+        short_name = "10",
     ),
-    main_console_view = 'main',
-    triggered_by = ['Win x64 Builder (dbg)'],
+    main_console_view = "main",
+    triggered_by = ["Win x64 Builder (dbg)"],
     # Too flaky. See crbug.com/876224 for more details.
     tree_closing = False,
 )
 
 ci.win_builder(
-    name = 'Win7 (32) Tests',
+    name = "Win7 (32) Tests",
     console_view_entry = ci.console_view_entry(
-        category = 'release|tester',
-        short_name = '32',
+        category = "release|tester",
+        short_name = "32",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
     os = os.WINDOWS_7,
-    triggered_by = ['Win Builder'],
+    triggered_by = ["Win Builder"],
 )
 
 ci.win_builder(
-    name = 'Win7 Tests (1)',
+    name = "Win7 Tests (1)",
     console_view_entry = ci.console_view_entry(
-        category = 'release|tester',
-        short_name = '32',
+        category = "release|tester",
+        short_name = "32",
     ),
-    main_console_view = 'main',
+    main_console_view = "main",
     os = os.WINDOWS_7,
-    triggered_by = ['Win Builder'],
+    triggered_by = ["Win Builder"],
 )
 
 ci.win_builder(
-    name = 'Windows deterministic',
+    name = "Windows deterministic",
     console_view_entry = ci.console_view_entry(
-        category = 'misc',
-        short_name = 'det',
+        category = "misc",
+        short_name = "det",
     ),
-    executable = 'recipe:swarming/deterministic_build',
+    executable = "recipe:swarming/deterministic_build",
     execution_timeout = 6 * time.hour,
     goma_jobs = goma.jobs.J150,
-    main_console_view = 'main',
+    main_console_view = "main",
 )
diff --git a/infra/config/subprojects/chromium/master-only/consoles/android.packager.star b/infra/config/subprojects/chromium/master-only/consoles/android.packager.star
index 6e705ad..a2b2d13 100644
--- a/infra/config/subprojects/chromium/master-only/consoles/android.packager.star
+++ b/infra/config/subprojects/chromium/master-only/consoles/android.packager.star
@@ -3,17 +3,17 @@
 # found in the LICENSE file.
 
 luci.console_view(
-    name = 'android.packager',
-    header = '//chromium-header.textpb',
-    repo = 'https://chromium.googlesource.com/chromium/src',
+    name = "android.packager",
+    header = "//chromium-header.textpb",
+    repo = "https://chromium.googlesource.com/chromium/src",
     entries = [
         luci.console_view_entry(
-            builder = 'ci/android-avd-packager',
-            short_name = 'avd',
+            builder = "ci/android-avd-packager",
+            short_name = "avd",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-sdk-packager',
-            short_name = 'sdk',
+            builder = "ci/android-sdk-packager",
+            short_name = "sdk",
         ),
     ],
 )
diff --git a/infra/config/subprojects/chromium/master-only/consoles/luci.chromium.try.star b/infra/config/subprojects/chromium/master-only/consoles/luci.chromium.try.star
index 01909258..fbeaa393 100644
--- a/infra/config/subprojects/chromium/master-only/consoles/luci.chromium.try.star
+++ b/infra/config/subprojects/chromium/master-only/consoles/luci.chromium.try.star
@@ -3,189 +3,189 @@
 # found in the LICENSE file.
 
 luci.list_view(
-    name = 'luci.chromium.try',
+    name = "luci.chromium.try",
     entries = [
-        'try/android-cronet-arm-dbg',
-        'try/android-lollipop-arm-rel',
-        'try/android-marshmallow-arm64-rel',
-        'try/android-marshmallow-x86-rel',
-        'try/android-nougat-arm64-rel',
-        'try/android-oreo-arm64-cts-networkservice-dbg',
-        'try/android-pie-arm64-coverage-rel',
-        'try/android-pie-arm64-rel',
-        'try/android-pie-x86-rel',
-        'try/android-10-arm64-rel',
-        'try/android-webview-pie-arm64-fyi-rel',
-        'try/android_archive_rel_ng',
-        'try/android_arm64_dbg_recipe',
-        'try/android_angle_deqp_rel_ng',
-        'try/android_angle_vk32_deqp_rel_ng',
-        'try/android_angle_vk64_deqp_rel_ng',
-        'try/android_angle_rel_ng',
-        'try/android_angle_vk32_rel_ng',
-        'try/android_angle_vk64_rel_ng',
-        'try/android_cfi_rel_ng',
-        'try/android_compile_dbg',
-        'try/android_compile_x64_dbg',
-        'try/android_compile_x86_dbg',
-        'try/android_mojo',
-        'try/android_n5x_swarming_dbg',
-        'try/android_optional_gpu_tests_rel',
-        'try/android-webview-marshmallow-arm64-dbg',
-        'try/android-webview-nougat-arm64-dbg',
-        'try/android-webview-oreo-arm64-dbg',
-        'try/android-webview-pie-arm64-dbg',
-        'try/cast_shell_audio_linux',
-        'try/cast_shell_linux',
-        'try/chromeos-amd64-generic-cfi-thin-lto-rel',
-        'try/chromeos-amd64-generic-dbg',
-        'try/chromeos-amd64-generic-rel',
-        'try/chromeos-arm-generic-dbg',
-        'try/chromeos-arm-generic-rel',
-        'try/chromeos-kevin-compile-rel',
-        'try/chromeos-kevin-rel',
-        'try/chromium_presubmit',
-        'try/closure_compilation',
-        'try/fuchsia-angle-rel',
-        'try/fuchsia-compile-x64-dbg',
-        'try/gpu-fyi-try-android-l-nexus-5-32',
-        'try/gpu-fyi-try-android-l-nexus-6-32',
-        'try/gpu-fyi-try-android-m-nexus-5x-64',
-        'try/gpu-fyi-try-android-m-nexus-5x-deqp-64',
-        'try/gpu-fyi-try-android-m-nexus-5x-skgl-64',
-        'try/gpu-fyi-try-android-m-nexus-6p-64',
-        'try/gpu-fyi-try-android-m-nexus-9-64',
-        'try/gpu-fyi-try-android-n-nvidia-shield-tv-64',
-        'try/gpu-fyi-try-android-p-pixel-2-32',
-        'try/gpu-fyi-try-android-p-pixel-2-skv-32',
-        'try/gpu-fyi-try-android-q-pixel-2-deqp-vk-32',
-        'try/gpu-fyi-try-android-q-pixel-2-deqp-vk-64',
-        'try/gpu-fyi-try-android-q-pixel-2-vk-32',
-        'try/gpu-fyi-try-android-q-pixel-2-vk-64',
-        'try/gpu-fyi-try-linux-intel-dqp',
-        'try/gpu-fyi-try-linux-intel-exp',
-        'try/gpu-fyi-try-linux-intel-rel',
-        'try/gpu-fyi-try-linux-intel-skv',
-        'try/gpu-fyi-try-linux-nvidia-dbg',
-        'try/gpu-fyi-try-linux-nvidia-dqp',
-        'try/gpu-fyi-try-linux-nvidia-exp',
-        'try/gpu-fyi-try-linux-nvidia-rel',
-        'try/gpu-fyi-try-linux-nvidia-skv',
-        'try/gpu-fyi-try-linux-nvidia-tsn',
-        'try/gpu-fyi-try-win7-amd-dbg-32',
-        'try/gpu-fyi-try-win7-amd-dqp-32',
-        'try/gpu-fyi-try-win7-amd-rel-32',
-        'try/gpu-fyi-try-win7-nvidia-dqp-64',
-        'try/gpu-fyi-try-win7-nvidia-rel-32',
-        'try/gpu-fyi-try-win7-nvidia-rel-64',
-        'try/gpu-fyi-try-win10-intel-dqp-64',
-        'try/gpu-fyi-try-win10-intel-exp-64',
-        'try/gpu-fyi-try-win10-intel-rel-64',
-        'try/gpu-fyi-try-win10-nvidia-dbg-64',
-        'try/gpu-fyi-try-win10-nvidia-dqp-64',
-        'try/gpu-fyi-try-win10-nvidia-exp-64',
-        'try/gpu-fyi-try-win10-nvidia-rel-32',
-        'try/gpu-fyi-try-win10-nvidia-rel-64',
-        'try/gpu-fyi-try-win10-nvidia-skgl-64',
-        'try/gpu-fyi-try-mac-amd-dqp',
-        'try/gpu-fyi-try-mac-amd-pro-rel',
-        'try/gpu-fyi-try-mac-amd-retina-dbg',
-        'try/gpu-fyi-try-mac-amd-retina-exp',
-        'try/gpu-fyi-try-mac-amd-retina-rel',
-        'try/gpu-fyi-try-mac-asan',
-        'try/gpu-fyi-try-mac-intel-dbg',
-        'try/gpu-fyi-try-mac-intel-dqp',
-        'try/gpu-fyi-try-mac-intel-exp',
-        'try/gpu-fyi-try-mac-intel-rel',
-        'try/gpu-fyi-try-mac-nvidia-retina-dbg',
-        'try/gpu-fyi-try-mac-nvidia-retina-exp',
-        'try/gpu-fyi-try-mac-nvidia-retina-rel',
-        'try/gpu-try-android-m-nexus-5x-64',
-        'try/gpu-try-linux-nvidia-dbg',
-        'try/gpu-try-linux-nvidia-rel',
-        'try/gpu-try-mac-amd-retina-dbg',
-        'try/gpu-try-mac-intel-dbg',
-        'try/linux-angle-rel',
-        'try/linux-autofill-assistant',
-        'try/linux-blink-heap-concurrent-marking-tsan-rel',
-        'try/linux-blink-heap-verification-try',
-        'try/linux-chromeos-rel',
-        'try/linux-libfuzzer-asan-rel',
-        'try/linux-ozone-rel',
-        'try/linux_android_dbg_ng',
-        'try/linux_angle_deqp_rel_ng',
-        'try/linux_angle_ozone_rel_ng',
-        'try/linux_chromium_analysis',
-        'try/linux_chromium_archive_rel_ng',
-        'try/linux_chromium_asan_rel_ng',
-        'try/linux_chromium_cfi_rel_ng',
-        'try/linux_chromium_chromeos_asan_rel_ng',
-        'try/linux_chromium_chromeos_msan_rel_ng',
-        'try/linux_chromium_clobber_deterministic',
-        'try/linux_chromium_clobber_rel_ng',
-        'try/linux_chromium_compile_dbg_32_ng',
-        'try/linux_chromium_compile_dbg_ng',
-        'try/linux_chromium_compile_rel_ng',
-        'try/linux-clang-tidy-dbg',
-        'try/linux-clang-tidy-rel',
-        'try/linux-rel',
-        'try/linux_chromium_dbg_ng',
-        'try/linux_chromium_msan_rel_ng',
-        'try/linux_chromium_tsan_rel_ng',
-        'try/linux_chromium_ubsan_rel_ng',
-        'try/linux-lacros-fyi-rel',
-        'try/linux_layout_tests_composite_after_paint',
-        'try/linux-layout-tests-edit-ng',
-        'try/linux-layout-tests-fragment-item',
-        'try/linux_layout_tests_layout_ng_disabled',
-        'try/linux_mojo',
-        'try/linux_mojo_chromeos',
-        'try/linux_optional_gpu_tests_rel',
-        'try/linux_upload_clang',
-        'try/linux-viz-rel',
-        'try/linux-wpt-fyi-rel',
-        'try/network_service_linux',
-        'try/ios-device',
-        'try/ios-simulator',
-        'try/ios-simulator-cronet',
-        'try/ios-simulator-eg',
-        'try/ios13-sdk-simulator',
-        'try/mac-angle-rel',
-        'try/mac-rel',
-        'try/mac-coverage-rel',
-        'try/mac_chromium_10.10',
-        'try/mac_chromium_10.12_rel_ng',
-        'try/mac_chromium_10.13_rel_ng',
-        'try/mac_chromium_10.14_rel_ng',
-        'try/mac_chromium_10.15_rel_ng',
-        'try/mac_chromium_archive_rel_ng',
-        'try/mac_chromium_asan_rel_ng',
-        'try/mac_chromium_compile_dbg_ng',
-        'try/mac_chromium_compile_rel_ng',
-        'try/mac_chromium_dbg_ng',
-        'try/mac_optional_gpu_tests_rel',
-        'try/mac_upload_clang',
-        'try/tricium-metrics-analysis',
-        'try/try-nougat-phone-tester',
-        'try/android-oreo-arm64-dbg',
-        'try/android-pie-arm64-dbg',
-        'try/win7-rel',
-        'try/win10_chromium_x64_dbg_ng',
-        'try/win10_chromium_x64_rel_ng',
-        'try/win10_chromium_x64_rel_ng_exp',
-        'try/win-angle-deqp-rel-32',
-        'try/win-angle-deqp-rel-64',
-        'try/win-angle-rel-32',
-        'try/win-angle-rel-64',
-        'try/win_archive',
-        'try/win_chromium_compile_dbg_ng',
-        'try/win_chromium_compile_rel_ng',
-        'try/win_chromium_dbg_ng',
-        'try/win_chromium_x64_rel_ng',
-        'try/win_mojo',
-        'try/win_optional_gpu_tests_rel',
-        'try/win_upload_clang',
-        'try/win_x64_archive',
-        'try/win-celab-try-rel',
+        "try/android-cronet-arm-dbg",
+        "try/android-lollipop-arm-rel",
+        "try/android-marshmallow-arm64-rel",
+        "try/android-marshmallow-x86-rel",
+        "try/android-nougat-arm64-rel",
+        "try/android-oreo-arm64-cts-networkservice-dbg",
+        "try/android-pie-arm64-coverage-rel",
+        "try/android-pie-arm64-rel",
+        "try/android-pie-x86-rel",
+        "try/android-10-arm64-rel",
+        "try/android-webview-pie-arm64-fyi-rel",
+        "try/android_archive_rel_ng",
+        "try/android_arm64_dbg_recipe",
+        "try/android_angle_deqp_rel_ng",
+        "try/android_angle_vk32_deqp_rel_ng",
+        "try/android_angle_vk64_deqp_rel_ng",
+        "try/android_angle_rel_ng",
+        "try/android_angle_vk32_rel_ng",
+        "try/android_angle_vk64_rel_ng",
+        "try/android_cfi_rel_ng",
+        "try/android_compile_dbg",
+        "try/android_compile_x64_dbg",
+        "try/android_compile_x86_dbg",
+        "try/android_mojo",
+        "try/android_n5x_swarming_dbg",
+        "try/android_optional_gpu_tests_rel",
+        "try/android-webview-marshmallow-arm64-dbg",
+        "try/android-webview-nougat-arm64-dbg",
+        "try/android-webview-oreo-arm64-dbg",
+        "try/android-webview-pie-arm64-dbg",
+        "try/cast_shell_audio_linux",
+        "try/cast_shell_linux",
+        "try/chromeos-amd64-generic-cfi-thin-lto-rel",
+        "try/chromeos-amd64-generic-dbg",
+        "try/chromeos-amd64-generic-rel",
+        "try/chromeos-arm-generic-dbg",
+        "try/chromeos-arm-generic-rel",
+        "try/chromeos-kevin-compile-rel",
+        "try/chromeos-kevin-rel",
+        "try/chromium_presubmit",
+        "try/closure_compilation",
+        "try/fuchsia-angle-rel",
+        "try/fuchsia-compile-x64-dbg",
+        "try/gpu-fyi-try-android-l-nexus-5-32",
+        "try/gpu-fyi-try-android-l-nexus-6-32",
+        "try/gpu-fyi-try-android-m-nexus-5x-64",
+        "try/gpu-fyi-try-android-m-nexus-5x-deqp-64",
+        "try/gpu-fyi-try-android-m-nexus-5x-skgl-64",
+        "try/gpu-fyi-try-android-m-nexus-6p-64",
+        "try/gpu-fyi-try-android-m-nexus-9-64",
+        "try/gpu-fyi-try-android-n-nvidia-shield-tv-64",
+        "try/gpu-fyi-try-android-p-pixel-2-32",
+        "try/gpu-fyi-try-android-p-pixel-2-skv-32",
+        "try/gpu-fyi-try-android-q-pixel-2-deqp-vk-32",
+        "try/gpu-fyi-try-android-q-pixel-2-deqp-vk-64",
+        "try/gpu-fyi-try-android-q-pixel-2-vk-32",
+        "try/gpu-fyi-try-android-q-pixel-2-vk-64",
+        "try/gpu-fyi-try-linux-intel-dqp",
+        "try/gpu-fyi-try-linux-intel-exp",
+        "try/gpu-fyi-try-linux-intel-rel",
+        "try/gpu-fyi-try-linux-intel-skv",
+        "try/gpu-fyi-try-linux-nvidia-dbg",
+        "try/gpu-fyi-try-linux-nvidia-dqp",
+        "try/gpu-fyi-try-linux-nvidia-exp",
+        "try/gpu-fyi-try-linux-nvidia-rel",
+        "try/gpu-fyi-try-linux-nvidia-skv",
+        "try/gpu-fyi-try-linux-nvidia-tsn",
+        "try/gpu-fyi-try-win7-amd-dbg-32",
+        "try/gpu-fyi-try-win7-amd-dqp-32",
+        "try/gpu-fyi-try-win7-amd-rel-32",
+        "try/gpu-fyi-try-win7-nvidia-dqp-64",
+        "try/gpu-fyi-try-win7-nvidia-rel-32",
+        "try/gpu-fyi-try-win7-nvidia-rel-64",
+        "try/gpu-fyi-try-win10-intel-dqp-64",
+        "try/gpu-fyi-try-win10-intel-exp-64",
+        "try/gpu-fyi-try-win10-intel-rel-64",
+        "try/gpu-fyi-try-win10-nvidia-dbg-64",
+        "try/gpu-fyi-try-win10-nvidia-dqp-64",
+        "try/gpu-fyi-try-win10-nvidia-exp-64",
+        "try/gpu-fyi-try-win10-nvidia-rel-32",
+        "try/gpu-fyi-try-win10-nvidia-rel-64",
+        "try/gpu-fyi-try-win10-nvidia-skgl-64",
+        "try/gpu-fyi-try-mac-amd-dqp",
+        "try/gpu-fyi-try-mac-amd-pro-rel",
+        "try/gpu-fyi-try-mac-amd-retina-dbg",
+        "try/gpu-fyi-try-mac-amd-retina-exp",
+        "try/gpu-fyi-try-mac-amd-retina-rel",
+        "try/gpu-fyi-try-mac-asan",
+        "try/gpu-fyi-try-mac-intel-dbg",
+        "try/gpu-fyi-try-mac-intel-dqp",
+        "try/gpu-fyi-try-mac-intel-exp",
+        "try/gpu-fyi-try-mac-intel-rel",
+        "try/gpu-fyi-try-mac-nvidia-retina-dbg",
+        "try/gpu-fyi-try-mac-nvidia-retina-exp",
+        "try/gpu-fyi-try-mac-nvidia-retina-rel",
+        "try/gpu-try-android-m-nexus-5x-64",
+        "try/gpu-try-linux-nvidia-dbg",
+        "try/gpu-try-linux-nvidia-rel",
+        "try/gpu-try-mac-amd-retina-dbg",
+        "try/gpu-try-mac-intel-dbg",
+        "try/linux-angle-rel",
+        "try/linux-autofill-assistant",
+        "try/linux-blink-heap-concurrent-marking-tsan-rel",
+        "try/linux-blink-heap-verification-try",
+        "try/linux-chromeos-rel",
+        "try/linux-libfuzzer-asan-rel",
+        "try/linux-ozone-rel",
+        "try/linux_android_dbg_ng",
+        "try/linux_angle_deqp_rel_ng",
+        "try/linux_angle_ozone_rel_ng",
+        "try/linux_chromium_analysis",
+        "try/linux_chromium_archive_rel_ng",
+        "try/linux_chromium_asan_rel_ng",
+        "try/linux_chromium_cfi_rel_ng",
+        "try/linux_chromium_chromeos_asan_rel_ng",
+        "try/linux_chromium_chromeos_msan_rel_ng",
+        "try/linux_chromium_clobber_deterministic",
+        "try/linux_chromium_clobber_rel_ng",
+        "try/linux_chromium_compile_dbg_32_ng",
+        "try/linux_chromium_compile_dbg_ng",
+        "try/linux_chromium_compile_rel_ng",
+        "try/linux-clang-tidy-dbg",
+        "try/linux-clang-tidy-rel",
+        "try/linux-rel",
+        "try/linux_chromium_dbg_ng",
+        "try/linux_chromium_msan_rel_ng",
+        "try/linux_chromium_tsan_rel_ng",
+        "try/linux_chromium_ubsan_rel_ng",
+        "try/linux-lacros-fyi-rel",
+        "try/linux_layout_tests_composite_after_paint",
+        "try/linux-layout-tests-edit-ng",
+        "try/linux-layout-tests-fragment-item",
+        "try/linux_layout_tests_layout_ng_disabled",
+        "try/linux_mojo",
+        "try/linux_mojo_chromeos",
+        "try/linux_optional_gpu_tests_rel",
+        "try/linux_upload_clang",
+        "try/linux-viz-rel",
+        "try/linux-wpt-fyi-rel",
+        "try/network_service_linux",
+        "try/ios-device",
+        "try/ios-simulator",
+        "try/ios-simulator-cronet",
+        "try/ios-simulator-eg",
+        "try/ios13-sdk-simulator",
+        "try/mac-angle-rel",
+        "try/mac-rel",
+        "try/mac-coverage-rel",
+        "try/mac_chromium_10.10",
+        "try/mac_chromium_10.12_rel_ng",
+        "try/mac_chromium_10.13_rel_ng",
+        "try/mac_chromium_10.14_rel_ng",
+        "try/mac_chromium_10.15_rel_ng",
+        "try/mac_chromium_archive_rel_ng",
+        "try/mac_chromium_asan_rel_ng",
+        "try/mac_chromium_compile_dbg_ng",
+        "try/mac_chromium_compile_rel_ng",
+        "try/mac_chromium_dbg_ng",
+        "try/mac_optional_gpu_tests_rel",
+        "try/mac_upload_clang",
+        "try/tricium-metrics-analysis",
+        "try/try-nougat-phone-tester",
+        "try/android-oreo-arm64-dbg",
+        "try/android-pie-arm64-dbg",
+        "try/win7-rel",
+        "try/win10_chromium_x64_dbg_ng",
+        "try/win10_chromium_x64_rel_ng",
+        "try/win10_chromium_x64_rel_ng_exp",
+        "try/win-angle-deqp-rel-32",
+        "try/win-angle-deqp-rel-64",
+        "try/win-angle-rel-32",
+        "try/win-angle-rel-64",
+        "try/win_archive",
+        "try/win_chromium_compile_dbg_ng",
+        "try/win_chromium_compile_rel_ng",
+        "try/win_chromium_dbg_ng",
+        "try/win_chromium_x64_rel_ng",
+        "try/win_mojo",
+        "try/win_optional_gpu_tests_rel",
+        "try/win_upload_clang",
+        "try/win_x64_archive",
+        "try/win-celab-try-rel",
     ],
 )
diff --git a/infra/config/subprojects/chromium/master-only/consoles/metadata.exporter.star b/infra/config/subprojects/chromium/master-only/consoles/metadata.exporter.star
index 3074467..7cc18046 100644
--- a/infra/config/subprojects/chromium/master-only/consoles/metadata.exporter.star
+++ b/infra/config/subprojects/chromium/master-only/consoles/metadata.exporter.star
@@ -3,11 +3,11 @@
 # found in the LICENSE file.
 
 luci.console_view(
-    name = 'metadata.exporter',
-    repo = 'https://chromium.googlesource.com/chromium/src',
+    name = "metadata.exporter",
+    repo = "https://chromium.googlesource.com/chromium/src",
     entries = [
         luci.console_view_entry(
-            builder = 'ci/metadata-exporter',
+            builder = "ci/metadata-exporter",
         ),
     ],
 )
diff --git a/infra/config/subprojects/chromium/master-only/consoles/sheriff.ios.star b/infra/config/subprojects/chromium/master-only/consoles/sheriff.ios.star
index ea84441..34f0276 100644
--- a/infra/config/subprojects/chromium/master-only/consoles/sheriff.ios.star
+++ b/infra/config/subprojects/chromium/master-only/consoles/sheriff.ios.star
@@ -3,46 +3,45 @@
 # found in the LICENSE file.
 
 luci.console_view(
-    name = 'sheriff.ios',
-    header = '//chromium-header.textpb',
-    repo = 'https://chromium.googlesource.com/chromium/src',
-    title = 'iOS Sheriff Console',
+    name = "sheriff.ios",
+    header = "//chromium-header.textpb",
+    repo = "https://chromium.googlesource.com/chromium/src",
+    title = "iOS Sheriff Console",
     entries = [
-
         luci.console_view_entry(
-            builder = 'ci/ios-device',
-            category = 'chromium.mac',
-            short_name = 'dev',
+            builder = "ci/ios-device",
+            category = "chromium.mac",
+            short_name = "dev",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios-simulator',
-            category = 'chromium.mac',
-            short_name = 'sim',
+            builder = "ci/ios-simulator",
+            category = "chromium.mac",
+            short_name = "sim",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios-simulator-full-configs',
-            category = 'chromium.mac',
-            short_name = 'ful',
+            builder = "ci/ios-simulator-full-configs",
+            category = "chromium.mac",
+            short_name = "ful",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios-simulator-noncq',
-            category = 'chromium.mac',
-            short_name = 'non',
+            builder = "ci/ios-simulator-noncq",
+            category = "chromium.mac",
+            short_name = "non",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios13-sdk-device',
-            category = 'chromium.fyi|13',
-            short_name = 'dev',
+            builder = "ci/ios13-sdk-device",
+            category = "chromium.fyi|13",
+            short_name = "dev",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios13-sdk-simulator',
-            category = 'chromium.fyi|13',
-            short_name = 'sim',
+            builder = "ci/ios13-sdk-simulator",
+            category = "chromium.fyi|13",
+            short_name = "sim",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios13-beta-simulator',
-            category = 'chromium.fyi|13',
-            short_name = 'ios13',
+            builder = "ci/ios13-beta-simulator",
+            category = "chromium.fyi|13",
+            short_name = "ios13",
         ),
     ],
 )
diff --git a/infra/config/subprojects/chromium/master-only/fallback-cq.star b/infra/config/subprojects/chromium/master-only/fallback-cq.star
index b795ea30..69d8ba8 100644
--- a/infra/config/subprojects/chromium/master-only/fallback-cq.star
+++ b/infra/config/subprojects/chromium/master-only/fallback-cq.star
@@ -2,168 +2,167 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//project.star', 'ACTIVE_BRANCH_NUMBERS')
-
+load("//project.star", "ACTIVE_BRANCH_NUMBERS")
 
 def _trailing_digit_regex(n):
-  if n == 0:
-    return ''
-  if n == 1:
-    return r'\d'
-  return r'\d{%d}' % n
-
+    if n == 0:
+        return ""
+    if n == 1:
+        return r"\d"
+    return r"\d{%d}" % n
 
 def _numbers_of_lengths(l, u):
-  if l > u:
-    return []
+    if l > u:
+        return []
 
-  if l == u:
-    if l == 1:
-      return []
-    if l == 2:
-      return [r'[1-9]\d']
-    return [r'[1-9]\d{%s}' % (l - 1)]
+    if l == u:
+        if l == 1:
+            return []
+        if l == 2:
+            return [r"[1-9]\d"]
+        return [r"[1-9]\d{%s}" % (l - 1)]
 
-  return [r'[1-9]\d{%s,%s}' % (l - 1, u - 1)]
-
+    return [r"[1-9]\d{%s,%s}" % (l - 1, u - 1)]
 
 def _char_to_digit(c):
-  d = ord(c) - ord('0')
-  if d < 0 or d > 9:
-    fail('Unxpected character: {}'.format(c))
-  return d
-
+    d = ord(c) - ord("0")
+    if d < 0 or d > 9:
+        fail("Unxpected character: {}".format(c))
+    return d
 
 def _digit_range(l, u):
-  if l == u:
-    return str(l)
-  if l < u:
-    return '[{}-{}]'.format(l, u)
-  return None
+    if l == u:
+        return str(l)
+    if l < u:
+        return "[{}-{}]".format(l, u)
+    return None
 
+def _to_next_position(x, prefix = ""):
+    """Create regexes that match the range (x, 10^len(x)).
 
-def _to_next_position(x, prefix=''):
-  """Create regexes that match the range (x, 10^len(x)).
+    Args:
+      x - The non-inclusive lower bound.
+      prefix - A prefix to add to each regex.
 
-  Args:
-    x - The non-inclusive lower bound.
-    prefix - A prefix to add to each regex.
+    Returns:
+      A list of strings that that match the specified range. The returned regexes
+      are in order of the ranges of numbers that would be matched.
+    """
+    regexes = []
+    for i, c in enumerate(x.elems(), 1):
+        position_str = _digit_range(_char_to_digit(c) + 1, 9)
+        if position_str != None:
+            regexes.append("{prefix}{position}{suffix}".format(
+                prefix = prefix,
+                position = position_str,
+                suffix = _trailing_digit_regex(len(x) - i),
+            ))
+        prefix += c
+    return reversed(regexes)
 
-  Returns:
-    A list of strings that that match the specified range. The returned regexes
-    are in order of the ranges of numbers that would be matched.
-  """
-  regexes = []
-  for i, c in enumerate(x.elems(), 1):
-    position_str = _digit_range(_char_to_digit(c) + 1, 9)
-    if position_str != None:
-      regexes.append('{prefix}{position}{suffix}'.format(
-          prefix=prefix,
-          position=position_str,
-          suffix=_trailing_digit_regex(len(x) - i)))
-    prefix += c
-  return reversed(regexes)
+def _from_current_position(x, prefix = ""):
+    """Create regexes that match the range [10^(len(x)-1), x).
 
+    Args:
+      x - The non-inclusive upper bound.
+      prefix - A prefix to add to each regex.
 
-def _from_current_position(x, prefix=''):
-  """Create regexes that match the range [10^(len(x)-1), x).
-
-  Args:
-    x - The non-inclusive upper bound.
-    prefix - A prefix to add to each regex.
-
-  Returns:
-    A list of strings that that match the specified range. The returned regexes
-    are in order of the ranges of numbers that would be matched.
-  """
-  regexes = []
-  for i, c in enumerate(x.elems(), 1):
-    min_leading = 0 if prefix else 1
-    position_str = _digit_range(min_leading, _char_to_digit(c) - 1)
-    if position_str != None:
-      regexes.append('{prefix}{position}{suffix}'.format(
-          prefix=prefix,
-          position=position_str,
-          suffix=_trailing_digit_regex(len(x) - i)))
-    prefix += c
-  return regexes
-
+    Returns:
+      A list of strings that that match the specified range. The returned regexes
+      are in order of the ranges of numbers that would be matched.
+    """
+    regexes = []
+    for i, c in enumerate(x.elems(), 1):
+        min_leading = 0 if prefix else 1
+        position_str = _digit_range(min_leading, _char_to_digit(c) - 1)
+        if position_str != None:
+            regexes.append("{prefix}{position}{suffix}".format(
+                prefix = prefix,
+                position = position_str,
+                suffix = _trailing_digit_regex(len(x) - i),
+            ))
+        prefix += c
+    return regexes
 
 def _get_fallback_branch_number_regexes():
-  # Check that they're int first since we're relying on numeric qualities to
-  # create the regexes
-  branch_strs = []
-  for b in sorted(ACTIVE_BRANCH_NUMBERS):
-    if type(b) != type(0):
-      fail('The elements of ACTIVE_BRANCH_NUMBERS are expected to be ints,'
-           + ' got {} ({})'.format(type(b), b))
-    branch_strs.append(str(b))
+    # Check that they're int first since we're relying on numeric qualities to
+    # create the regexes
+    branch_strs = []
+    for b in sorted(ACTIVE_BRANCH_NUMBERS):
+        if type(b) != type(0):
+            fail("The elements of ACTIVE_BRANCH_NUMBERS are expected to be ints," +
+                 " got {} ({})".format(type(b), b))
+        branch_strs.append(str(b))
 
-  regexes = []
+    regexes = []
 
-  # Lower than the lowest active branch number
-  regexes.extend(_numbers_of_lengths(1, len(branch_strs[0]) - 1))
-  regexes.extend(_from_current_position(branch_strs[0]))
+    # Lower than the lowest active branch number
+    regexes.extend(_numbers_of_lengths(1, len(branch_strs[0]) - 1))
+    regexes.extend(_from_current_position(branch_strs[0]))
 
-  # In between successive active branches
-  for lower, upper in zip(branch_strs, branch_strs[1:]):
-    if len(lower) < len(upper):
-      regexes.extend(_to_next_position(lower))
-      regexes.extend(_numbers_of_lengths(len(lower) + 1, len(upper) - 1))
-      regexes.extend(_from_current_position(upper))
-      break
+    # In between successive active branches
+    for lower, upper in zip(branch_strs, branch_strs[1:]):
+        if len(lower) < len(upper):
+            regexes.extend(_to_next_position(lower))
+            regexes.extend(_numbers_of_lengths(len(lower) + 1, len(upper) - 1))
+            regexes.extend(_from_current_position(upper))
+            break
 
-    prefix = ''
-    for i in range(len(lower)):
-      if lower[i] != upper[i]:
-        break
-      prefix += lower[i]
+        prefix = ""
+        for i in range(len(lower)):
+            if lower[i] != upper[i]:
+                break
+            prefix += lower[i]
 
-    regexes.extend(_to_next_position(lower[i + 1:], prefix=prefix + lower[i]))
+        regexes.extend(_to_next_position(lower[i + 1:], prefix = prefix + lower[i]))
 
-    # Get regexes for the digits between the first two different digits
-    # e.g. regexes for 430 to 450 when comparing 425 and 461
-    lower_bound = _char_to_digit(lower[i]) + 1
-    upper_bound = _char_to_digit(upper[i]) - 1
-    position_str = _digit_range(lower_bound, upper_bound)
-    if position_str != None:
-      regexes.append('{prefix}{position}{suffix}'.format(
-          prefix=prefix,
-          position=position_str,
-          suffix=_trailing_digit_regex(len(lower) - i - 1)))
+        # Get regexes for the digits between the first two different digits
+        # e.g. regexes for 430 to 450 when comparing 425 and 461
+        lower_bound = _char_to_digit(lower[i]) + 1
+        upper_bound = _char_to_digit(upper[i]) - 1
+        position_str = _digit_range(lower_bound, upper_bound)
+        if position_str != None:
+            regexes.append("{prefix}{position}{suffix}".format(
+                prefix = prefix,
+                position = position_str,
+                suffix = _trailing_digit_regex(len(lower) - i - 1),
+            ))
 
-    regexes.extend(_from_current_position(upper[i + 1:], prefix=prefix + upper[i]))
+        regexes.extend(_from_current_position(upper[i + 1:], prefix = prefix + upper[i]))
 
-  # Greater than the greatest active branch number
-  regexes.extend(_to_next_position(branch_strs[-1]))
-  # Catch all numbers with more digits than the highest active branch
-  regexes.append(r'[1-9]\d{%d,}' % len(branch_strs[-1]))
+    # Greater than the greatest active branch number
+    regexes.extend(_to_next_position(branch_strs[-1]))
 
-  return regexes
+    # Catch all numbers with more digits than the highest active branch
+    regexes.append(r"[1-9]\d{%d,}" % len(branch_strs[-1]))
 
+    return regexes
 
 # Declare a CQ group that watches all branch heads
 # We won't add any builders, but SUBMIT TO CQ fails on Gerrit if there is no CQ
 # group
 luci.cq_group(
-    name = 'fallback-empty-cq',
+    name = "fallback-empty-cq",
     retry_config = cq.RETRY_ALL_FAILURES,
     watch = cq.refset(
-        repo = 'https://chromium.googlesource.com/chromium/src',
+        repo = "https://chromium.googlesource.com/chromium/src",
         refs = (
             # \D - non-digit, match any branch that is not entirely numeric
-            [r'refs/branch-heads/.*\D.*'] +
-            ['refs/branch-heads/' + regex
-             for regex in _get_fallback_branch_number_regexes()]),
+            [r"refs/branch-heads/.*\D.*"] +
+            [
+                "refs/branch-heads/" + regex
+                for regex in _get_fallback_branch_number_regexes()
+            ]
+        ),
     ),
     acls = [
         acl.entry(
             acl.CQ_COMMITTER,
-            groups = 'project-chromium-committers',
+            groups = "project-chromium-committers",
         ),
         acl.entry(
             acl.CQ_DRY_RUNNER,
-            groups = 'project-chromium-tryjob-access',
+            groups = "project-chromium-tryjob-access",
         ),
     ],
 )
@@ -172,14 +171,13 @@
 # the empty CQ group until it's exposed in lucicfg or there is a better way to
 # create a CQ group for all of the canary branches
 def _generate_cq_group_fallback(ctx):
-  cq_cfg = ctx.output['commit-queue.cfg']
+    cq_cfg = ctx.output["commit-queue.cfg"]
 
-  for c in cq_cfg.config_groups:
-    if c.name == 'fallback-empty-cq':
-      c.fallback = 1  # YES
-      return c
+    for c in cq_cfg.config_groups:
+        if c.name == "fallback-empty-cq":
+            c.fallback = 1  # YES
+            return c
 
-  fail('Could not find empty CQ group')
-
+    fail("Could not find empty CQ group")
 
 lucicfg.generator(_generate_cq_group_fallback)
diff --git a/infra/config/subprojects/chromium/master-only/gpu.try.star b/infra/config/subprojects/chromium/master-only/gpu.try.star
index 97610100..4429fb6 100644
--- a/infra/config/subprojects/chromium/master-only/gpu.try.star
+++ b/infra/config/subprojects/chromium/master-only/gpu.try.star
@@ -2,18 +2,16 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'builder', 'cpu', 'defaults', 'goma', 'os')
-load('//lib/try.star', 'try_')
-load('//project.star', 'settings')
-
+load("//lib/builders.star", "goma", "os")
+load("//lib/try.star", "try_")
+load("//project.star", "settings")
 
 try_.set_defaults(
     settings,
     execution_timeout = 6 * time.hour,
-    service_account = 'chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com',
+    service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com",
 )
 
-
 # Builders appear after the function used to define them, with all builders
 # defined using the same function ordered lexicographically by name
 # Builder functions are defined in lexicographic order by name ignoring the
@@ -27,384 +25,380 @@
 # after the last dot in the mastername and YYY is the OS
 
 def gpu_android_builder(*, name, **kwargs):
-  return try_.builder(
-      name = name,
-      builderless = True,
-      goma_backend = goma.backend.RBE_PROD,
-      mastername = 'tryserver.chromium.android',
-      ssd = None,
-      **kwargs
-  )
+    return try_.builder(
+        name = name,
+        builderless = True,
+        goma_backend = goma.backend.RBE_PROD,
+        mastername = "tryserver.chromium.android",
+        ssd = None,
+        **kwargs
+    )
 
 gpu_android_builder(
-    name = 'gpu-fyi-try-android-l-nexus-5-32',
-    pool = 'luci.chromium.gpu.android.nexus5.try',
+    name = "gpu-fyi-try-android-l-nexus-5-32",
+    pool = "luci.chromium.gpu.android.nexus5.try",
 )
 
 gpu_android_builder(
-    name = 'gpu-fyi-try-android-l-nexus-6-32',
-    pool = 'luci.chromium.gpu.android.nexus6.try',
+    name = "gpu-fyi-try-android-l-nexus-6-32",
+    pool = "luci.chromium.gpu.android.nexus6.try",
 )
 
 gpu_android_builder(
-    name = 'gpu-fyi-try-android-m-nexus-5x-64',
-    pool = 'luci.chromium.gpu.android.nexus5x.try',
+    name = "gpu-fyi-try-android-m-nexus-5x-64",
+    pool = "luci.chromium.gpu.android.nexus5x.try",
 )
 
 gpu_android_builder(
-    name = 'gpu-fyi-try-android-m-nexus-5x-deqp-64',
-    pool = 'luci.chromium.gpu.android.nexus5x.try',
+    name = "gpu-fyi-try-android-m-nexus-5x-deqp-64",
+    pool = "luci.chromium.gpu.android.nexus5x.try",
 )
 
 gpu_android_builder(
-    name = 'gpu-fyi-try-android-m-nexus-5x-skgl-64',
-    pool = 'luci.chromium.gpu.android.nexus5x.try',
+    name = "gpu-fyi-try-android-m-nexus-5x-skgl-64",
+    pool = "luci.chromium.gpu.android.nexus5x.try",
 )
 
 gpu_android_builder(
-    name = 'gpu-fyi-try-android-m-nexus-6p-64',
-    pool = 'luci.chromium.gpu.android.nexus6p.try',
+    name = "gpu-fyi-try-android-m-nexus-6p-64",
+    pool = "luci.chromium.gpu.android.nexus6p.try",
 )
 
 gpu_android_builder(
-    name = 'gpu-fyi-try-android-m-nexus-9-64',
-    pool = 'luci.chromium.gpu.android.nexus9.try',
+    name = "gpu-fyi-try-android-m-nexus-9-64",
+    pool = "luci.chromium.gpu.android.nexus9.try",
 )
 
 gpu_android_builder(
-    name = 'gpu-fyi-try-android-n-nvidia-shield-tv-64',
-    pool = 'luci.chromium.gpu.android.nvidia.shield.tv.try',
+    name = "gpu-fyi-try-android-n-nvidia-shield-tv-64",
+    pool = "luci.chromium.gpu.android.nvidia.shield.tv.try",
 )
 
 gpu_android_builder(
-    name = 'gpu-fyi-try-android-p-pixel-2-32',
-    pool = 'luci.chromium.gpu.android.pixel2.chromium.try',
+    name = "gpu-fyi-try-android-p-pixel-2-32",
+    pool = "luci.chromium.gpu.android.pixel2.chromium.try",
 )
 
 gpu_android_builder(
-    name = 'gpu-fyi-try-android-p-pixel-2-skv-32',
-    pool = 'luci.chromium.gpu.android.pixel2.chromium.try',
+    name = "gpu-fyi-try-android-p-pixel-2-skv-32",
+    pool = "luci.chromium.gpu.android.pixel2.chromium.try",
 )
 
 gpu_android_builder(
-    name = 'gpu-fyi-try-android-q-pixel-2-deqp-vk-32',
-    pool = 'luci.chromium.gpu.android.pixel2.try',
+    name = "gpu-fyi-try-android-q-pixel-2-deqp-vk-32",
+    pool = "luci.chromium.gpu.android.pixel2.try",
 )
 
 gpu_android_builder(
-    name = 'gpu-fyi-try-android-q-pixel-2-deqp-vk-64',
-    pool = 'luci.chromium.gpu.android.pixel2.try',
+    name = "gpu-fyi-try-android-q-pixel-2-deqp-vk-64",
+    pool = "luci.chromium.gpu.android.pixel2.try",
 )
 
 gpu_android_builder(
-    name = 'gpu-fyi-try-android-q-pixel-2-vk-32',
-    pool = 'luci.chromium.gpu.android.pixel2.try',
+    name = "gpu-fyi-try-android-q-pixel-2-vk-32",
+    pool = "luci.chromium.gpu.android.pixel2.try",
 )
 
 gpu_android_builder(
-    name = 'gpu-fyi-try-android-q-pixel-2-vk-64',
-    pool = 'luci.chromium.gpu.android.pixel2.try',
+    name = "gpu-fyi-try-android-q-pixel-2-vk-64",
+    pool = "luci.chromium.gpu.android.pixel2.try",
 )
 
 gpu_android_builder(
-    name = 'gpu-try-android-m-nexus-5x-64',
-    pool = 'luci.chromium.gpu.android.nexus5x.try',
+    name = "gpu-try-android-m-nexus-5x-64",
+    pool = "luci.chromium.gpu.android.nexus5x.try",
 )
 
-
 def gpu_chromeos_builder(*, name, **kwargs):
     return try_.builder(
         name = name,
         builderless = True,
         goma_backend = goma.backend.RBE_PROD,
-        mastername = 'tryserver.chromium.chromiumos',
+        mastername = "tryserver.chromium.chromiumos",
         ssd = None,
         **kwargs
     )
 
 gpu_chromeos_builder(
-    name = 'gpu-fyi-try-chromeos-amd64-generic',
-    pool = 'luci.chromium.gpu.chromeos.amd64.generic.try',
+    name = "gpu-fyi-try-chromeos-amd64-generic",
+    pool = "luci.chromium.gpu.chromeos.amd64.generic.try",
 )
 
 gpu_chromeos_builder(
-    name = 'gpu-fyi-try-chromeos-kevin',
-    pool = 'luci.chromium.gpu.chromeos.kevin.try',
+    name = "gpu-fyi-try-chromeos-kevin",
+    pool = "luci.chromium.gpu.chromeos.kevin.try",
 )
 
-
 def gpu_linux_builder(*, name, **kwargs):
-  return try_.builder(
-      name = name,
-      builderless = True,
-      goma_backend = goma.backend.RBE_PROD,
-      mastername = 'tryserver.chromium.linux',
-      ssd = None,
-      **kwargs
-  )
+    return try_.builder(
+        name = name,
+        builderless = True,
+        goma_backend = goma.backend.RBE_PROD,
+        mastername = "tryserver.chromium.linux",
+        ssd = None,
+        **kwargs
+    )
 
 gpu_linux_builder(
-    name = 'gpu-fyi-try-linux-intel-dqp',
-    pool = 'luci.chromium.gpu.linux.intel.try',
+    name = "gpu-fyi-try-linux-intel-dqp",
+    pool = "luci.chromium.gpu.linux.intel.try",
 )
 
 gpu_linux_builder(
-    name = 'gpu-fyi-try-linux-intel-exp',
-    pool = 'luci.chromium.gpu.linux.intel.try',
+    name = "gpu-fyi-try-linux-intel-exp",
+    pool = "luci.chromium.gpu.linux.intel.try",
 )
 
 gpu_linux_builder(
-    name = 'gpu-fyi-try-linux-intel-rel',
-    pool = 'luci.chromium.gpu.linux.intel.try',
+    name = "gpu-fyi-try-linux-intel-rel",
+    pool = "luci.chromium.gpu.linux.intel.try",
 )
 
 gpu_linux_builder(
-    name = 'gpu-fyi-try-linux-intel-sk-dawn-rel',
-    pool = 'luci.chromium.gpu.linux.intel.try',
+    name = "gpu-fyi-try-linux-intel-sk-dawn-rel",
+    pool = "luci.chromium.gpu.linux.intel.try",
 )
 
 gpu_linux_builder(
-    name = 'gpu-fyi-try-linux-intel-skv',
-    pool = 'luci.chromium.gpu.linux.intel.try',
+    name = "gpu-fyi-try-linux-intel-skv",
+    pool = "luci.chromium.gpu.linux.intel.try",
 )
 
 gpu_linux_builder(
-    name = 'gpu-fyi-try-linux-nvidia-dbg',
-    pool = 'luci.chromium.gpu.linux.nvidia.try',
+    name = "gpu-fyi-try-linux-nvidia-dbg",
+    pool = "luci.chromium.gpu.linux.nvidia.try",
 )
 
 gpu_linux_builder(
-    name = 'gpu-fyi-try-linux-nvidia-dqp',
-    pool = 'luci.chromium.gpu.linux.nvidia.try',
+    name = "gpu-fyi-try-linux-nvidia-dqp",
+    pool = "luci.chromium.gpu.linux.nvidia.try",
 )
 
 gpu_linux_builder(
-    name = 'gpu-fyi-try-linux-nvidia-exp',
-    pool = 'luci.chromium.gpu.linux.nvidia.try',
+    name = "gpu-fyi-try-linux-nvidia-exp",
+    pool = "luci.chromium.gpu.linux.nvidia.try",
 )
 
 gpu_linux_builder(
-    name = 'gpu-fyi-try-linux-nvidia-rel',
-    pool = 'luci.chromium.gpu.linux.nvidia.try',
+    name = "gpu-fyi-try-linux-nvidia-rel",
+    pool = "luci.chromium.gpu.linux.nvidia.try",
 )
 
 gpu_linux_builder(
-    name = 'gpu-fyi-try-linux-nvidia-skv',
-    pool = 'luci.chromium.gpu.linux.nvidia.try',
+    name = "gpu-fyi-try-linux-nvidia-skv",
+    pool = "luci.chromium.gpu.linux.nvidia.try",
 )
 
 gpu_linux_builder(
-    name = 'gpu-fyi-try-linux-nvidia-tsn',
-    pool = 'luci.chromium.gpu.linux.nvidia.try',
+    name = "gpu-fyi-try-linux-nvidia-tsn",
+    pool = "luci.chromium.gpu.linux.nvidia.try",
 )
 
 gpu_linux_builder(
-    name = 'gpu-try-linux-nvidia-dbg',
-    pool = 'luci.chromium.gpu.linux.nvidia.try',
+    name = "gpu-try-linux-nvidia-dbg",
+    pool = "luci.chromium.gpu.linux.nvidia.try",
 )
 
 gpu_linux_builder(
-    name = 'gpu-try-linux-nvidia-rel',
-    pool = 'luci.chromium.gpu.linux.nvidia.try',
+    name = "gpu-try-linux-nvidia-rel",
+    pool = "luci.chromium.gpu.linux.nvidia.try",
 )
 
-
 def gpu_mac_builder(*, name, **kwargs):
-  return try_.builder(
-      name = name,
-      builderless = True,
-      cores = None,
-      goma_backend = goma.backend.RBE_PROD,
-      mastername = 'tryserver.chromium.mac',
-      os = os.MAC_ANY,
-      ssd = None,
-      **kwargs
-  )
+    return try_.builder(
+        name = name,
+        builderless = True,
+        cores = None,
+        goma_backend = goma.backend.RBE_PROD,
+        mastername = "tryserver.chromium.mac",
+        os = os.MAC_ANY,
+        ssd = None,
+        **kwargs
+    )
 
 gpu_mac_builder(
-    name = 'gpu-fyi-try-mac-amd-dqp',
-    pool = 'luci.chromium.gpu.mac.retina.amd.try',
+    name = "gpu-fyi-try-mac-amd-dqp",
+    pool = "luci.chromium.gpu.mac.retina.amd.try",
 )
 
 gpu_mac_builder(
-    name = 'gpu-fyi-try-mac-amd-pro-rel',
-    pool = 'luci.chromium.gpu.mac.pro.amd.try',
+    name = "gpu-fyi-try-mac-amd-pro-rel",
+    pool = "luci.chromium.gpu.mac.pro.amd.try",
 )
 
 gpu_mac_builder(
-    name = 'gpu-fyi-try-mac-amd-retina-dbg',
-    pool = 'luci.chromium.gpu.mac.retina.amd.try',
+    name = "gpu-fyi-try-mac-amd-retina-dbg",
+    pool = "luci.chromium.gpu.mac.retina.amd.try",
 )
 
 gpu_mac_builder(
-    name = 'gpu-fyi-try-mac-amd-retina-exp',
-    pool = 'luci.chromium.gpu.mac.retina.amd.try',
+    name = "gpu-fyi-try-mac-amd-retina-exp",
+    pool = "luci.chromium.gpu.mac.retina.amd.try",
 )
 
 gpu_mac_builder(
-    name = 'gpu-fyi-try-mac-amd-retina-rel',
-    pool = 'luci.chromium.gpu.mac.retina.amd.try',
+    name = "gpu-fyi-try-mac-amd-retina-rel",
+    pool = "luci.chromium.gpu.mac.retina.amd.try",
 )
 
 gpu_mac_builder(
-    name = 'gpu-fyi-try-mac-asan',
+    name = "gpu-fyi-try-mac-asan",
     # This bot actually uses both Mac Retina AMD and Mac Mini Intel resources.
     # Group it in Mac Retina AMD users pool, since it is smaller.
-    pool = 'luci.chromium.gpu.mac.retina.amd.try',
+    pool = "luci.chromium.gpu.mac.retina.amd.try",
 )
 
 gpu_mac_builder(
-    name = 'gpu-fyi-try-mac-intel-dbg',
-    pool = 'luci.chromium.gpu.mac.mini.intel.try',
+    name = "gpu-fyi-try-mac-intel-dbg",
+    pool = "luci.chromium.gpu.mac.mini.intel.try",
 )
 
 gpu_mac_builder(
-    name = 'gpu-fyi-try-mac-intel-dqp',
-    pool = 'luci.chromium.gpu.mac.mini.intel.try',
+    name = "gpu-fyi-try-mac-intel-dqp",
+    pool = "luci.chromium.gpu.mac.mini.intel.try",
 )
 
 gpu_mac_builder(
-    name = 'gpu-fyi-try-mac-intel-exp',
-    pool = 'luci.chromium.gpu.mac.mini.intel.try',
+    name = "gpu-fyi-try-mac-intel-exp",
+    pool = "luci.chromium.gpu.mac.mini.intel.try",
 )
 
 gpu_mac_builder(
-    name = 'gpu-fyi-try-mac-intel-rel',
-    pool = 'luci.chromium.gpu.mac.mini.intel.try',
+    name = "gpu-fyi-try-mac-intel-rel",
+    pool = "luci.chromium.gpu.mac.mini.intel.try",
 )
 
 gpu_mac_builder(
-    name = 'gpu-fyi-try-mac-nvidia-retina-dbg',
-    pool = 'luci.chromium.gpu.mac.retina.nvidia.try',
+    name = "gpu-fyi-try-mac-nvidia-retina-dbg",
+    pool = "luci.chromium.gpu.mac.retina.nvidia.try",
 )
 
 gpu_mac_builder(
-    name = 'gpu-fyi-try-mac-nvidia-retina-exp',
+    name = "gpu-fyi-try-mac-nvidia-retina-exp",
     # This bot has one machine backing its tests at the moment.
     # If it gets more, the modified execution_timeout should be removed.
     # See crbug.com/853307 for more context.
     execution_timeout = 12 * time.hour,
-    pool = 'luci.chromium.gpu.mac.retina.nvidia.try',
+    pool = "luci.chromium.gpu.mac.retina.nvidia.try",
 )
 
 gpu_mac_builder(
-    name = 'gpu-fyi-try-mac-nvidia-retina-rel',
-    pool = 'luci.chromium.gpu.mac.retina.nvidia.try',
+    name = "gpu-fyi-try-mac-nvidia-retina-rel",
+    pool = "luci.chromium.gpu.mac.retina.nvidia.try",
 )
 
 gpu_mac_builder(
-    name = 'gpu-try-mac-amd-retina-dbg',
-    pool = 'luci.chromium.gpu.mac.retina.amd.try',
+    name = "gpu-try-mac-amd-retina-dbg",
+    pool = "luci.chromium.gpu.mac.retina.amd.try",
 )
 
 gpu_mac_builder(
-    name = 'gpu-try-mac-intel-dbg',
-    pool = 'luci.chromium.gpu.mac.mini.intel.try',
+    name = "gpu-try-mac-intel-dbg",
+    pool = "luci.chromium.gpu.mac.mini.intel.try",
 )
 
-
 def gpu_win_builder(*, name, **kwargs):
-  return try_.builder(
-      name = name,
-      builderless = True,
-      goma_backend = goma.backend.RBE_PROD,
-      mastername = 'tryserver.chromium.win',
-      os = os.WINDOWS_ANY,
-      ssd = None,
-      **kwargs
-  )
+    return try_.builder(
+        name = name,
+        builderless = True,
+        goma_backend = goma.backend.RBE_PROD,
+        mastername = "tryserver.chromium.win",
+        os = os.WINDOWS_ANY,
+        ssd = None,
+        **kwargs
+    )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win10-intel-dqp-64',
-    pool = 'luci.chromium.gpu.win10.intel.try',
+    name = "gpu-fyi-try-win10-intel-dqp-64",
+    pool = "luci.chromium.gpu.win10.intel.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win10-intel-exp-64',
-    pool = 'luci.chromium.gpu.win10.intel.try',
+    name = "gpu-fyi-try-win10-intel-exp-64",
+    pool = "luci.chromium.gpu.win10.intel.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win10-intel-rel-64',
-    pool = 'luci.chromium.gpu.win10.intel.try',
+    name = "gpu-fyi-try-win10-intel-rel-64",
+    pool = "luci.chromium.gpu.win10.intel.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win10-nvidia-dbg-64',
-    pool = 'luci.chromium.gpu.win10.nvidia.try',
+    name = "gpu-fyi-try-win10-nvidia-dbg-64",
+    pool = "luci.chromium.gpu.win10.nvidia.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win10-nvidia-dqp-64',
-    pool = 'luci.chromium.gpu.win10.nvidia.try',
+    name = "gpu-fyi-try-win10-nvidia-dqp-64",
+    pool = "luci.chromium.gpu.win10.nvidia.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win10-nvidia-dx12vk-dbg-64',
-    pool = 'luci.chromium.gpu.win10.nvidia.try',
+    name = "gpu-fyi-try-win10-nvidia-dx12vk-dbg-64",
+    pool = "luci.chromium.gpu.win10.nvidia.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win10-nvidia-dx12vk-rel-64',
-    pool = 'luci.chromium.gpu.win10.nvidia.try',
+    name = "gpu-fyi-try-win10-nvidia-dx12vk-rel-64",
+    pool = "luci.chromium.gpu.win10.nvidia.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win10-nvidia-exp-64',
-    pool = 'luci.chromium.gpu.win10.nvidia.try',
+    name = "gpu-fyi-try-win10-nvidia-exp-64",
+    pool = "luci.chromium.gpu.win10.nvidia.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win10-nvidia-sk-dawn-rel-64',
-    pool = 'luci.chromium.gpu.win10.nvidia.try',
+    name = "gpu-fyi-try-win10-nvidia-sk-dawn-rel-64",
+    pool = "luci.chromium.gpu.win10.nvidia.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win10-nvidia-skgl-64',
-    pool = 'luci.chromium.gpu.win10.nvidia.try',
+    name = "gpu-fyi-try-win10-nvidia-skgl-64",
+    pool = "luci.chromium.gpu.win10.nvidia.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win10-nvidia-rel-32',
-    pool = 'luci.chromium.gpu.win10.nvidia.try',
+    name = "gpu-fyi-try-win10-nvidia-rel-32",
+    pool = "luci.chromium.gpu.win10.nvidia.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win10-nvidia-rel-64',
-    pool = 'luci.chromium.gpu.win10.nvidia.try',
+    name = "gpu-fyi-try-win10-nvidia-rel-64",
+    pool = "luci.chromium.gpu.win10.nvidia.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win7-amd-dbg-32',
-    pool = 'luci.chromium.gpu.win7.amd.try',
+    name = "gpu-fyi-try-win7-amd-dbg-32",
+    pool = "luci.chromium.gpu.win7.amd.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win7-amd-dqp-32',
-    pool = 'luci.chromium.gpu.win7.amd.try',
+    name = "gpu-fyi-try-win7-amd-dqp-32",
+    pool = "luci.chromium.gpu.win7.amd.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win7-amd-rel-32',
-    pool = 'luci.chromium.gpu.win7.amd.try',
+    name = "gpu-fyi-try-win7-amd-rel-32",
+    pool = "luci.chromium.gpu.win7.amd.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win7-nvidia-dqp-64',
-    pool = 'luci.chromium.gpu.win7.nvidia.try',
+    name = "gpu-fyi-try-win7-nvidia-dqp-64",
+    pool = "luci.chromium.gpu.win7.nvidia.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win7-nvidia-rel-32',
-    pool = 'luci.chromium.gpu.win7.nvidia.try',
+    name = "gpu-fyi-try-win7-nvidia-rel-32",
+    pool = "luci.chromium.gpu.win7.nvidia.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-fyi-try-win7-nvidia-rel-64',
-    pool = 'luci.chromium.gpu.win7.nvidia.try',
+    name = "gpu-fyi-try-win7-nvidia-rel-64",
+    pool = "luci.chromium.gpu.win7.nvidia.try",
 )
 
 gpu_win_builder(
-    name = 'gpu-try-win10-nvidia-rel',
-    pool = 'luci.chromium.gpu.win10.nvidia.try',
+    name = "gpu-try-win10-nvidia-rel",
+    pool = "luci.chromium.gpu.win10.nvidia.try",
 )
diff --git a/infra/config/subprojects/chromium/master-only/master-only.star b/infra/config/subprojects/chromium/master-only/master-only.star
index 5db0040f..c3cec6b 100644
--- a/infra/config/subprojects/chromium/master-only/master-only.star
+++ b/infra/config/subprojects/chromium/master-only/master-only.star
@@ -2,14 +2,14 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-exec('./ci.star')
-exec('./gpu.try.star')
-exec('./swangle.try.star')
-exec('./try.star')
+exec("./ci.star")
+exec("./gpu.try.star")
+exec("./swangle.try.star")
+exec("./try.star")
 
-exec('./consoles/android.packager.star')
-exec('./consoles/luci.chromium.try.star')
-exec('./consoles/metadata.exporter.star')
-exec('./consoles/sheriff.ios.star')
+exec("./consoles/android.packager.star")
+exec("./consoles/luci.chromium.try.star")
+exec("./consoles/metadata.exporter.star")
+exec("./consoles/sheriff.ios.star")
 
-exec('./fallback-cq.star')
+exec("./fallback-cq.star")
diff --git a/infra/config/subprojects/chromium/master-only/swangle.try.star b/infra/config/subprojects/chromium/master-only/swangle.try.star
index f2bfe2d5..3ca5f86a 100644
--- a/infra/config/subprojects/chromium/master-only/swangle.try.star
+++ b/infra/config/subprojects/chromium/master-only/swangle.try.star
@@ -2,101 +2,96 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'builder', 'cpu', 'defaults', 'goma', 'os')
-load('//lib/try.star', 'try_')
-load('//project.star', 'settings')
-
+load("//lib/try.star", "try_")
+load("//project.star", "settings")
 
 try_.set_defaults(
     settings,
     execution_timeout = 2 * time.hour,
-    service_account = 'chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com',
+    service_account = "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com",
 )
 
-
 try_.chromium_swangle_linux_builder(
-    name = 'linux-swangle-chromium-try-x64',
-    pool = 'luci.chromium.swangle.chromium.linux.x64.try',
+    name = "linux-swangle-chromium-try-x64",
+    pool = "luci.chromium.swangle.chromium.linux.x64.try",
     execution_timeout = 6 * time.hour,
     pinned = False,
 )
 
 try_.chromium_swangle_linux_builder(
-    name = 'linux-swangle-try-tot-angle-x64',
-    pool = 'luci.chromium.swangle.angle.linux.x64.try',
+    name = "linux-swangle-try-tot-angle-x64",
+    pool = "luci.chromium.swangle.angle.linux.x64.try",
 )
 
 try_.chromium_swangle_linux_builder(
-    name = 'linux-swangle-try-tot-angle-x86',
-    pool = 'luci.chromium.swangle.linux.x86.try',
+    name = "linux-swangle-try-tot-angle-x86",
+    pool = "luci.chromium.swangle.linux.x86.try",
 )
 
 try_.chromium_swangle_linux_builder(
-    name = 'linux-swangle-try-tot-swiftshader-x64',
-    pool = 'luci.chromium.swangle.sws.linux.x64.try',
+    name = "linux-swangle-try-tot-swiftshader-x64",
+    pool = "luci.chromium.swangle.sws.linux.x64.try",
 )
 
 try_.chromium_swangle_linux_builder(
-    name = 'linux-swangle-try-tot-swiftshader-x86',
-    pool = 'luci.chromium.swangle.linux.x86.try',
+    name = "linux-swangle-try-tot-swiftshader-x86",
+    pool = "luci.chromium.swangle.linux.x86.try",
 )
 
 try_.chromium_swangle_linux_builder(
-    name = 'linux-swangle-try-x64',
-    pool = 'luci.chromium.swangle.deps.linux.x64.try',
+    name = "linux-swangle-try-x64",
+    pool = "luci.chromium.swangle.deps.linux.x64.try",
     pinned = False,
 )
 
 try_.chromium_swangle_linux_builder(
-    name = 'linux-swangle-try-x86',
-    pool = 'luci.chromium.swangle.linux.x86.try',
+    name = "linux-swangle-try-x86",
+    pool = "luci.chromium.swangle.linux.x86.try",
     pinned = False,
 )
 
-
 try_.chromium_swangle_mac_builder(
-    name = 'mac-swangle-chromium-try-x64',
-    pool = 'luci.chromium.swangle.chromium.mac.x64.try',
-    execution_timeout = 6 * time.hour,
-    pinned = False,
-)
-
-
-try_.chromium_swangle_windows_builder(
-    name = 'win-swangle-chromium-try-x86',
-    pool = 'luci.chromium.swangle.chromium.win.x86.try',
+    name = "mac-swangle-chromium-try-x64",
+    pool = "luci.chromium.swangle.chromium.mac.x64.try",
     execution_timeout = 6 * time.hour,
     pinned = False,
 )
 
 try_.chromium_swangle_windows_builder(
-    name = 'win-swangle-try-tot-angle-x64',
-    pool = 'luci.chromium.swangle.win.x64.try',
-)
-
-try_.chromium_swangle_windows_builder(
-    name = 'win-swangle-try-tot-angle-x86',
-    pool = 'luci.chromium.swangle.angle.win.x86.try',
-)
-
-try_.chromium_swangle_windows_builder(
-    name = 'win-swangle-try-tot-swiftshader-x64',
-    pool = 'luci.chromium.swangle.win.x64.try',
-)
-
-try_.chromium_swangle_windows_builder(
-    name = 'win-swangle-try-tot-swiftshader-x86',
-    pool = 'luci.chromium.swangle.sws.win.x86.try',
-)
-
-try_.chromium_swangle_windows_builder(
-    name = 'win-swangle-try-x64',
-    pool = 'luci.chromium.swangle.win.x64.try',
+    name = "win-swangle-chromium-try-x86",
+    pool = "luci.chromium.swangle.chromium.win.x86.try",
+    execution_timeout = 6 * time.hour,
     pinned = False,
 )
 
 try_.chromium_swangle_windows_builder(
-    name = 'win-swangle-try-x86',
-    pool = 'luci.chromium.swangle.deps.win.x86.try',
+    name = "win-swangle-try-tot-angle-x64",
+    pool = "luci.chromium.swangle.win.x64.try",
+)
+
+try_.chromium_swangle_windows_builder(
+    name = "win-swangle-try-tot-angle-x86",
+    pool = "luci.chromium.swangle.angle.win.x86.try",
+)
+
+try_.chromium_swangle_windows_builder(
+    name = "win-swangle-try-tot-swiftshader-x64",
+    pool = "luci.chromium.swangle.win.x64.try",
+)
+
+try_.chromium_swangle_windows_builder(
+    name = "win-swangle-try-tot-swiftshader-x86",
+    pool = "luci.chromium.swangle.sws.win.x86.try",
+)
+
+try_.chromium_swangle_windows_builder(
+    name = "win-swangle-try-x64",
+    pool = "luci.chromium.swangle.win.x64.try",
+    pinned = False,
+)
+
+try_.chromium_swangle_windows_builder(
+    name = "win-swangle-try-x86",
+    pool = "luci.chromium.swangle.deps.win.x86.try",
     pinned = False,
 )
diff --git a/infra/config/subprojects/chromium/master-only/try.star b/infra/config/subprojects/chromium/master-only/try.star
index a676e8b2c..08bfba4 100644
--- a/infra/config/subprojects/chromium/master-only/try.star
+++ b/infra/config/subprojects/chromium/master-only/try.star
@@ -2,116 +2,111 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'cpu', 'goma', 'os', 'xcode_cache')
-load('//lib/try.star', 'try_')
-load('//project.star', 'settings')
+load("//lib/builders.star", "goma", "os", "xcode_cache")
+load("//lib/try.star", "try_")
+load("//project.star", "settings")
 
 # Execute the versioned files to define all of the per-branch entities
 # (bucket, builders, console, cq_group, etc.)
-exec('../versioned/m84/buckets/try.star')
-exec('../versioned/m85/buckets/try.star')
-
+exec("../versioned/m84/buckets/try.star")
+exec("../versioned/m85/buckets/try.star")
 
 try_.set_defaults(
     settings,
     add_to_list_view = True,
 )
 
-
 # *** After this point everything is trunk only ***
 
-
 # Builders are sorted first lexicographically by the function used to define
 # them, then lexicographically by their name
 
 try_.blink_builder(
-    name = 'linux-blink-optional-highdpi-rel',
+    name = "linux-blink-optional-highdpi-rel",
     goma_backend = goma.backend.RBE_PROD,
 )
 
 try_.blink_builder(
-    name = 'win10-blink-rel',
+    name = "win10-blink-rel",
     goma_backend = goma.backend.RBE_PROD,
     os = os.WINDOWS_ANY,
     builderless = True,
 )
 
 try_.blink_builder(
-    name = 'win7-blink-rel',
+    name = "win7-blink-rel",
     goma_backend = goma.backend.RBE_PROD,
     os = os.WINDOWS_ANY,
     builderless = True,
 )
 
-
 try_.blink_mac_builder(
-    name = 'mac10.10-blink-rel',
+    name = "mac10.10-blink-rel",
 )
 
 try_.blink_mac_builder(
-    name = 'mac10.11-blink-rel',
+    name = "mac10.11-blink-rel",
 )
 
 try_.blink_mac_builder(
-    name = 'mac10.12-blink-rel',
+    name = "mac10.12-blink-rel",
 )
 
 try_.blink_mac_builder(
-    name = 'mac10.13-blink-rel',
+    name = "mac10.13-blink-rel",
 )
 
 try_.blink_mac_builder(
-    name = 'mac10.14-blink-rel',
+    name = "mac10.14-blink-rel",
 )
 
 try_.blink_mac_builder(
-    name = 'mac10.15-blink-rel',
-)
-
-
-try_.chromium_android_builder(
-    name = 'android-asan',
+    name = "mac10.15-blink-rel",
 )
 
 try_.chromium_android_builder(
-    name = 'android-bfcache-rel',
+    name = "android-asan",
 )
 
 try_.chromium_android_builder(
-    name = 'android-deterministic-dbg',
-    executable = 'recipe:swarming/deterministic_build',
+    name = "android-bfcache-rel",
+)
+
+try_.chromium_android_builder(
+    name = "android-deterministic-dbg",
+    executable = "recipe:swarming/deterministic_build",
     execution_timeout = 6 * time.hour,
 )
 
 try_.chromium_android_builder(
-    name = 'android-deterministic-rel',
-    executable = 'recipe:swarming/deterministic_build',
+    name = "android-deterministic-rel",
+    executable = "recipe:swarming/deterministic_build",
     execution_timeout = 6 * time.hour,
 )
 
 try_.chromium_android_builder(
-    name = 'android-marshmallow-x86-fyi-rel',
+    name = "android-marshmallow-x86-fyi-rel",
 )
 
 try_.chromium_android_builder(
-    name = 'android-opus-arm-rel',
+    name = "android-opus-arm-rel",
 )
 
 try_.chromium_android_builder(
-    name = 'android-oreo-arm64-cts-networkservice-dbg',
+    name = "android-oreo-arm64-cts-networkservice-dbg",
 )
 
 try_.chromium_android_builder(
-    name = 'android-oreo-arm64-dbg',
+    name = "android-oreo-arm64-dbg",
 )
 
 try_.chromium_android_builder(
-    name = 'android-pie-x86-rel',
-    goma_jobs=goma.jobs.J150,
+    name = "android-pie-x86-rel",
+    goma_jobs = goma.jobs.J150,
 )
 
 try_.chromium_android_builder(
-    name = 'android-pie-arm64-coverage-rel',
+    name = "android-pie-arm64-coverage-rel",
     cores = 16,
     goma_jobs = goma.jobs.J300,
     ssd = True,
@@ -119,412 +114,408 @@
 )
 
 try_.chromium_android_builder(
-    name = 'android-10-arm64-rel',
+    name = "android-10-arm64-rel",
 )
 
 try_.chromium_android_builder(
-    name = 'android-weblayer-pie-arm64-fyi-rel',
+    name = "android-weblayer-pie-arm64-fyi-rel",
 )
 
 try_.chromium_android_builder(
-    name = 'android-weblayer-pie-x86-fyi-rel',
+    name = "android-weblayer-pie-x86-fyi-rel",
 )
 
 try_.chromium_android_builder(
-    name = 'android-webview-marshmallow-arm64-dbg',
+    name = "android-webview-marshmallow-arm64-dbg",
 )
 
 try_.chromium_android_builder(
-    name = 'android-webview-nougat-arm64-dbg',
+    name = "android-webview-nougat-arm64-dbg",
 )
 
 try_.chromium_android_builder(
-    name = 'android-webview-oreo-arm64-dbg',
+    name = "android-webview-oreo-arm64-dbg",
 )
 
 try_.chromium_android_builder(
-    name = 'android-webview-pie-arm64-dbg',
+    name = "android-webview-pie-arm64-dbg",
 )
 
 try_.chromium_android_builder(
-    name = 'android-webview-pie-arm64-fyi-rel',
+    name = "android-webview-pie-arm64-fyi-rel",
 )
 
 try_.chromium_android_builder(
-    name = 'android_archive_rel_ng',
+    name = "android_archive_rel_ng",
 )
 
 try_.chromium_android_builder(
-    name = 'android_arm64_dbg_recipe',
+    name = "android_arm64_dbg_recipe",
     goma_jobs = goma.jobs.J300,
 )
 
 try_.chromium_android_builder(
-    name = 'android_blink_rel',
+    name = "android_blink_rel",
 )
 
 try_.chromium_android_builder(
-    name = 'android_cfi_rel_ng',
+    name = "android_cfi_rel_ng",
     cores = 32,
 )
 
 try_.chromium_android_builder(
-    name = 'android_clang_dbg_recipe',
+    name = "android_clang_dbg_recipe",
     goma_jobs = goma.jobs.J300,
 )
 
 try_.chromium_android_builder(
-    name = 'android_mojo',
+    name = "android_mojo",
 )
 
 try_.chromium_android_builder(
-    name = 'android_n5x_swarming_dbg',
+    name = "android_n5x_swarming_dbg",
 )
 
 try_.chromium_android_builder(
-    name = 'android_unswarmed_pixel_aosp',
+    name = "android_unswarmed_pixel_aosp",
 )
 
 try_.chromium_android_builder(
-    name = 'linux_android_dbg_ng',
+    name = "linux_android_dbg_ng",
 )
 
 try_.chromium_android_builder(
-    name = 'try-nougat-phone-tester',
-)
-
-
-try_.chromium_angle_builder(
-    name = 'android_angle_deqp_rel_ng',
+    name = "try-nougat-phone-tester",
 )
 
 try_.chromium_angle_builder(
-    name = 'android_angle_rel_ng',
+    name = "android_angle_deqp_rel_ng",
 )
 
 try_.chromium_angle_builder(
-    name = 'android_angle_vk32_deqp_rel_ng',
+    name = "android_angle_rel_ng",
 )
 
 try_.chromium_angle_builder(
-    name = 'android_angle_vk32_rel_ng',
+    name = "android_angle_vk32_deqp_rel_ng",
 )
 
 try_.chromium_angle_builder(
-    name = 'android_angle_vk64_deqp_rel_ng',
+    name = "android_angle_vk32_rel_ng",
 )
 
 try_.chromium_angle_builder(
-    name = 'android_angle_vk64_rel_ng',
+    name = "android_angle_vk64_deqp_rel_ng",
 )
 
 try_.chromium_angle_builder(
-    name = 'fuchsia-angle-rel',
+    name = "android_angle_vk64_rel_ng",
 )
 
 try_.chromium_angle_builder(
-    name = 'linux-angle-rel',
+    name = "fuchsia-angle-rel",
 )
 
 try_.chromium_angle_builder(
-    name = 'linux_angle_deqp_rel_ng',
+    name = "linux-angle-rel",
 )
 
 try_.chromium_angle_builder(
-    name = 'linux_angle_ozone_rel_ng',
+    name = "linux_angle_deqp_rel_ng",
 )
 
 try_.chromium_angle_builder(
-    name = 'mac-angle-rel',
+    name = "linux_angle_ozone_rel_ng",
+)
+
+try_.chromium_angle_builder(
+    name = "mac-angle-rel",
     cores = None,
     os = os.MAC_ANY,
 )
 
 try_.chromium_angle_builder(
-    name = 'win-angle-deqp-rel-32',
+    name = "win-angle-deqp-rel-32",
     os = os.WINDOWS_ANY,
 )
 
 try_.chromium_angle_builder(
-    name = 'win-angle-deqp-rel-64',
+    name = "win-angle-deqp-rel-64",
     os = os.WINDOWS_ANY,
 )
 
 try_.chromium_angle_builder(
-    name = 'win-angle-rel-32',
+    name = "win-angle-rel-32",
     os = os.WINDOWS_ANY,
 )
 
 try_.chromium_angle_builder(
-    name = 'win-angle-rel-64',
+    name = "win-angle-rel-64",
     os = os.WINDOWS_ANY,
 )
 
-
 try_.chromium_chromiumos_builder(
-    name = 'chromeos-amd64-generic-cfi-thin-lto-rel',
+    name = "chromeos-amd64-generic-cfi-thin-lto-rel",
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'chromeos-arm-generic-dbg',
+    name = "chromeos-arm-generic-dbg",
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'chromeos-kevin-compile-rel',
-    main_list_view = 'try'
+    name = "chromeos-kevin-compile-rel",
+    main_list_view = "try",
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'chromeos-kevin-rel',
+    name = "chromeos-kevin-rel",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/build/chromeos/.+',
-            '.+/[+]/build/config/chromeos/.*',
-            '.+/[+]/chromeos/CHROMEOS_LKGM',
+            ".+/[+]/build/chromeos/.+",
+            ".+/[+]/build/config/chromeos/.*",
+            ".+/[+]/chromeos/CHROMEOS_LKGM",
         ],
     ),
-    main_list_view = 'try',
+    main_list_view = "try",
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'linux-lacros-compile-rel',
+    name = "linux-lacros-compile-rel",
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'linux-chromeos-dbg',
-)
-
-
-try_.chromium_dawn_builder(
-    name = 'linux-dawn-rel',
+    name = "linux-chromeos-dbg",
 )
 
 try_.chromium_dawn_builder(
-    name = 'mac-dawn-rel',
+    name = "linux-dawn-rel",
+)
+
+try_.chromium_dawn_builder(
+    name = "mac-dawn-rel",
     os = os.MAC_ANY,
 )
 
 try_.chromium_dawn_builder(
-    name = 'win-dawn-rel',
+    name = "win-dawn-rel",
     os = os.WINDOWS_ANY,
 )
 
 try_.chromium_dawn_builder(
-    name = 'dawn-try-win10-x86-rel',
+    name = "dawn-try-win10-x86-rel",
     os = os.WINDOWS_ANY,
 )
 
 try_.chromium_dawn_builder(
-    name = 'dawn-try-win10-x64-asan-rel',
+    name = "dawn-try-win10-x64-asan-rel",
     os = os.WINDOWS_ANY,
 )
 
 try_.chromium_linux_builder(
-    name = 'cast_shell_audio_linux',
+    name = "cast_shell_audio_linux",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-lacros-fyi-rel',
+    name = "linux-lacros-fyi-rel",
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia-compile-x64-dbg',
+    name = "fuchsia-compile-x64-dbg",
     tryjob = try_.job(
         experiment_percentage = 50,
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia-fyi-arm64-dbg',
+    name = "fuchsia-fyi-arm64-dbg",
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia-fyi-arm64-rel',
+    name = "fuchsia-fyi-arm64-rel",
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia-fyi-x64-dbg',
+    name = "fuchsia-fyi-x64-dbg",
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia-fyi-x64-rel',
+    name = "fuchsia-fyi-x64-rel",
 )
 
 try_.chromium_linux_builder(
-    name = 'layout_test_leak_detection',
+    name = "layout_test_leak_detection",
 )
 
 try_.chromium_linux_builder(
-    name = 'leak_detection_linux',
+    name = "leak_detection_linux",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-annotator-rel',
+    name = "linux-annotator-rel",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-bfcache-rel',
+    name = "linux-bfcache-rel",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-blink-heap-concurrent-marking-tsan-rel',
+    name = "linux-blink-heap-concurrent-marking-tsan-rel",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-blink-heap-verification-try',
+    name = "linux-blink-heap-verification-try",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-clang-tidy-dbg',
-    executable = 'recipe:tricium_clang_tidy_wrapper',
+    name = "linux-clang-tidy-dbg",
+    executable = "recipe:tricium_clang_tidy_wrapper",
     goma_jobs = goma.jobs.J150,
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-clang-tidy-rel',
-    executable = 'recipe:tricium_clang_tidy_wrapper',
+    name = "linux-clang-tidy-rel",
+    executable = "recipe:tricium_clang_tidy_wrapper",
     goma_jobs = goma.jobs.J150,
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-dcheck-off-rel',
+    name = "linux-dcheck-off-rel",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-gcc-rel',
+    name = "linux-gcc-rel",
     goma_backend = None,
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-perfetto-rel',
+    name = "linux-perfetto-rel",
     tryjob = try_.job(
         experiment_percentage = 100,
         location_regexp = [
-            '.+/[+]/base/trace_event/.+',
-            '.+/[+]/base/tracing/.+',
-            '.+/[+]/components/tracing/.+',
-            '.+/[+]/content/browser/tracing/.+',
-            '.+/[+]/services/tracing/.+',
+            ".+/[+]/base/trace_event/.+",
+            ".+/[+]/base/tracing/.+",
+            ".+/[+]/components/tracing/.+",
+            ".+/[+]/content/browser/tracing/.+",
+            ".+/[+]/services/tracing/.+",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-trusty-rel',
+    name = "linux-trusty-rel",
     goma_jobs = goma.jobs.J150,
     os = os.LINUX_TRUSTY,
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-viz-rel',
+    name = "linux-viz-rel",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-webkit-msan-rel',
+    name = "linux-webkit-msan-rel",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_analysis',
+    name = "linux_chromium_analysis",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_archive_rel_ng',
+    name = "linux_chromium_archive_rel_ng",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_cfi_rel_ng',
+    name = "linux_chromium_cfi_rel_ng",
     cores = 32,
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_chromeos_asan_rel_ng',
+    name = "linux_chromium_chromeos_asan_rel_ng",
     goma_jobs = goma.jobs.J150,
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_chromeos_msan_rel_ng',
+    name = "linux_chromium_chromeos_msan_rel_ng",
     goma_jobs = goma.jobs.J150,
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_clobber_deterministic',
-    executable = 'recipe:swarming/deterministic_build',
+    name = "linux_chromium_clobber_deterministic",
+    executable = "recipe:swarming/deterministic_build",
     execution_timeout = 6 * time.hour,
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_clobber_rel_ng',
+    name = "linux_chromium_clobber_rel_ng",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_compile_dbg_32_ng',
+    name = "linux_chromium_compile_dbg_32_ng",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_compile_rel_ng',
+    name = "linux_chromium_compile_rel_ng",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_msan_rel_ng',
+    name = "linux_chromium_msan_rel_ng",
     goma_jobs = goma.jobs.J150,
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_ubsan_rel_ng',
+    name = "linux_chromium_ubsan_rel_ng",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-layout-tests-edit-ng',
+    name = "linux-layout-tests-edit-ng",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-autofill-assistant',
+    name = "linux-autofill-assistant",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-layout-tests-fragment-item',
+    name = "linux-layout-tests-fragment-item",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_mojo',
+    name = "linux_mojo",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_mojo_chromeos',
+    name = "linux_mojo_chromeos",
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_upload_clang',
+    name = "linux_upload_clang",
     builderless = True,
     cores = 32,
-    executable = 'recipe:chromium_upload_clang',
+    executable = "recipe:chromium_upload_clang",
     goma_backend = None,
     os = os.LINUX_TRUSTY,
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-wpt-fyi-rel',
+    name = "linux-wpt-fyi-rel",
 )
 
 try_.chromium_linux_builder(
-    name = 'network_service_linux',
+    name = "network_service_linux",
 )
 
 try_.chromium_linux_builder(
-    name = 'tricium-metrics-analysis',
-    executable = 'recipe:tricium_metrics',
+    name = "tricium-metrics-analysis",
+    executable = "recipe:tricium_metrics",
 )
 
-
 try_.chromium_mac_builder(
-    name = 'mac-coverage-rel',
+    name = "mac-coverage-rel",
     use_clang_coverage = True,
     goma_jobs = goma.jobs.J150,
-    tryjob = try_.job(experiment_percentage = 3)
+    tryjob = try_.job(experiment_percentage = 3),
 )
 
 try_.chromium_mac_builder(
-    name = 'mac-osxbeta-rel',
+    name = "mac-osxbeta-rel",
     os = os.MAC_DEFAULT,
 )
 
@@ -532,263 +523,261 @@
 # they are built, hence no additional dimension is specified.
 # The 10.xx version translates to which bots will run isolated tests.
 try_.chromium_mac_builder(
-    name = 'mac_chromium_10.10',
+    name = "mac_chromium_10.10",
 )
 
 try_.chromium_mac_builder(
-    name = 'mac_chromium_10.12_rel_ng',
+    name = "mac_chromium_10.12_rel_ng",
 )
 
 try_.chromium_mac_builder(
-    name = 'mac_chromium_10.13_rel_ng',
+    name = "mac_chromium_10.13_rel_ng",
 )
 
 try_.chromium_mac_builder(
-    name = 'mac_chromium_10.14_rel_ng',
+    name = "mac_chromium_10.14_rel_ng",
 )
 
 try_.chromium_mac_builder(
-    name = 'mac_chromium_10.15_rel_ng',
+    name = "mac_chromium_10.15_rel_ng",
 )
 
 try_.chromium_mac_builder(
-    name = 'mac_chromium_archive_rel_ng',
+    name = "mac_chromium_archive_rel_ng",
 )
 
 try_.chromium_mac_builder(
-    name = 'mac_chromium_asan_rel_ng',
+    name = "mac_chromium_asan_rel_ng",
     goma_jobs = goma.jobs.J150,
 )
 
 try_.chromium_mac_builder(
-    name = 'mac_chromium_compile_rel_ng',
+    name = "mac_chromium_compile_rel_ng",
 )
 
 try_.chromium_mac_builder(
-    name = 'mac_chromium_dbg_ng',
+    name = "mac_chromium_dbg_ng",
 )
 
 try_.chromium_mac_builder(
-    name = 'mac_upload_clang',
+    name = "mac_upload_clang",
     builderless = False,
     caches = [
         swarming.cache(
-            name = 'xcode_mac_9a235',
-            path = 'xcode_mac_9a235.app',
+            name = "xcode_mac_9a235",
+            path = "xcode_mac_9a235.app",
         ),
     ],
-    executable = 'recipe:chromium_upload_clang',
+    executable = "recipe:chromium_upload_clang",
     execution_timeout = 6 * time.hour,
     goma_backend = None,  # Does not use Goma.
     properties = {
-        '$depot_tools/osx_sdk': {
-            'sdk_version': '9a235',
+        "$depot_tools/osx_sdk": {
+            "sdk_version": "9a235",
         },
     },
 )
 
-
 try_.chromium_mac_ios_builder(
-    name = 'ios-device',
-    executable = 'recipe:chromium_trybot',
+    name = "ios-device",
+    executable = "recipe:chromium_trybot",
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator-code-coverage',
-    executable = 'recipe:chromium_trybot',
+    name = "ios-simulator-code-coverage",
+    executable = "recipe:chromium_trybot",
     use_clang_coverage = True,
-    coverage_exclude_sources = 'ios_test_files_and_test_utils',
-    coverage_test_types = ['unit'],
+    coverage_exclude_sources = "ios_test_files_and_test_utils",
+    coverage_test_types = ["unit"],
     os = os.MAC_10_15,
     properties = {
-        'xcode_build_version': '11e146',
+        "xcode_build_version": "11e146",
     },
-    tryjob = try_.job(experiment_percentage = 3)
+    tryjob = try_.job(experiment_percentage = 3),
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator-cr-recipe',
-    executable = 'recipe:chromium_trybot',
+    name = "ios-simulator-cr-recipe",
+    executable = "recipe:chromium_trybot",
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator-eg',
+    name = "ios-simulator-eg",
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator-multi-window',
-    executable = 'recipe:chromium_trybot',
+    name = "ios-simulator-multi-window",
+    executable = "recipe:chromium_trybot",
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator-noncq',
+    name = "ios-simulator-noncq",
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios13-beta-simulator',
-    executable = 'recipe:chromium_trybot',
+    name = "ios13-beta-simulator",
+    executable = "recipe:chromium_trybot",
     caches = [xcode_cache.x11e608c],
     os = os.MAC_10_15,
     properties = {
-        'xcode_build_version': '11e608c'
-    }
+        "xcode_build_version": "11e608c",
+    },
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios13-sdk-simulator',
-    executable = 'recipe:chromium_trybot',
+    name = "ios13-sdk-simulator",
+    executable = "recipe:chromium_trybot",
     caches = [xcode_cache.x11e708],
     os = os.MAC_10_15,
     properties = {
-        'xcode_build_version': '11e708'
-    }
+        "xcode_build_version": "11e708",
+    },
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios14-beta-simulator',
-    executable = 'recipe:chromium_trybot',
+    name = "ios14-beta-simulator",
+    executable = "recipe:chromium_trybot",
     caches = [xcode_cache.x11e503a_xct12b1],
     os = os.MAC_10_15,
     properties = {
-        'xcode_build_version': '11e503a_xct12b1'
-    }
+        "xcode_build_version": "11e503a_xct12b1",
+    },
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios14-sdk-simulator',
-    executable = 'recipe:chromium_trybot',
+    name = "ios14-sdk-simulator",
+    executable = "recipe:chromium_trybot",
     caches = [xcode_cache.x12a6163b],
     os = os.MAC_10_15,
     properties = {
-        'xcode_build_version': '12a6163b'
-    }
+        "xcode_build_version": "12a6163b",
+    },
 )
 
 try_.chromium_win_builder(
-    name = 'win-annotator-rel',
+    name = "win-annotator-rel",
 )
 
 try_.chromium_win_builder(
-    name = 'win-asan',
+    name = "win-asan",
     goma_jobs = goma.jobs.J150,
 )
 
 try_.chromium_win_builder(
-    name = 'win-celab-try-rel',
-    executable = 'recipe:celab',
+    name = "win-celab-try-rel",
+    executable = "recipe:celab",
     properties = {
-        'exclude': 'chrome_only',
-        'pool_name': 'celab-chromium-try',
-        'pool_size': 20,
-        'tests': '*',
+        "exclude": "chrome_only",
+        "pool_name": "celab-chromium-try",
+        "pool_size": 20,
+        "tests": "*",
     },
 )
 
 try_.chromium_win_builder(
-    name = 'win10_chromium_x64_dbg_ng',
+    name = "win10_chromium_x64_dbg_ng",
     os = os.WINDOWS_10,
 )
 
 try_.chromium_win_builder(
-    name = 'win10_chromium_x64_rel_ng_exp',
+    name = "win10_chromium_x64_rel_ng_exp",
     builderless = False,
     os = os.WINDOWS_ANY,
 )
 
 try_.chromium_win_builder(
-    name = 'win_archive',
+    name = "win_archive",
 )
 
 try_.chromium_win_builder(
-    name = 'win_chromium_compile_rel_ng',
+    name = "win_chromium_compile_rel_ng",
 )
 
 try_.chromium_win_builder(
-    name = 'win_chromium_dbg_ng',
+    name = "win_chromium_dbg_ng",
 )
 
 try_.chromium_win_builder(
-    name = 'win_chromium_x64_rel_ng',
+    name = "win_chromium_x64_rel_ng",
 )
 
 try_.chromium_win_builder(
-    name = 'win_mojo',
+    name = "win_mojo",
 )
 
 try_.chromium_win_builder(
-    name = 'win_upload_clang',
+    name = "win_upload_clang",
     builderless = False,
     cores = 32,
-    executable = 'recipe:chromium_upload_clang',
+    executable = "recipe:chromium_upload_clang",
     goma_backend = None,
     os = os.WINDOWS_ANY,
 )
 
 try_.chromium_win_builder(
-    name = 'win_x64_archive',
+    name = "win_x64_archive",
 )
 
-
 # Used for listing chrome trybots in chromium's commit-queue.cfg without also
 # adding them to chromium's cr-buildbucket.cfg. Note that the recipe these
 # builders run allow only known roller accounts when triggered via the CQ.
 def chrome_internal_verifier(
-    *,
-    builder):
-  luci.cq_tryjob_verifier(
-      builder = 'chrome:try/' + builder,
-      cq_group = 'cq',
-      includable_only = True,
-      owner_whitelist = [
-          "googlers",
-          "project-chromium-robot-committers",
-      ],
-  )
+        *,
+        builder):
+    luci.cq_tryjob_verifier(
+        builder = "chrome:try/" + builder,
+        cq_group = "cq",
+        includable_only = True,
+        owner_whitelist = [
+            "googlers",
+            "project-chromium-robot-committers",
+        ],
+    )
 
 chrome_internal_verifier(
-    builder = 'chromeos-betty-chrome',
+    builder = "chromeos-betty-chrome",
 )
 
 chrome_internal_verifier(
-    builder = 'chromeos-betty-pi-arc-chrome',
+    builder = "chromeos-betty-pi-arc-chrome",
 )
 
 chrome_internal_verifier(
-    builder = 'chromeos-eve-chrome',
+    builder = "chromeos-eve-chrome",
 )
 
 chrome_internal_verifier(
-    builder = 'chromeos-eve-compile-chrome',
+    builder = "chromeos-eve-compile-chrome",
 )
 
 chrome_internal_verifier(
-    builder = 'chromeos-kevin-chrome',
+    builder = "chromeos-kevin-chrome",
 )
 
 chrome_internal_verifier(
-    builder = 'chromeos-kevin-compile-chrome',
+    builder = "chromeos-kevin-compile-chrome",
 )
 
 chrome_internal_verifier(
-    builder = 'ipad-device',
+    builder = "ipad-device",
 )
 
 chrome_internal_verifier(
-    builder = 'iphone-device',
+    builder = "iphone-device",
 )
 
 chrome_internal_verifier(
-    builder = 'linux-chromeos-chrome',
+    builder = "linux-chromeos-chrome",
 )
 
 chrome_internal_verifier(
-    builder = 'mac-chrome',
+    builder = "mac-chrome",
 )
 
 chrome_internal_verifier(
-    builder = 'win-chrome',
+    builder = "win-chrome",
 )
 
 chrome_internal_verifier(
-    builder = 'win64-chrome',
+    builder = "win64-chrome",
 )
diff --git a/infra/config/subprojects/chromium/subproject.star b/infra/config/subprojects/chromium/subproject.star
index f1ff509..1bdd1ff 100644
--- a/infra/config/subprojects/chromium/subproject.star
+++ b/infra/config/subprojects/chromium/subproject.star
@@ -2,9 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//project.star', 'master_only_exec')
+load("//project.star", "master_only_exec")
 
-exec('./ci.star')
-exec('./try.star')
+exec("./ci.star")
+exec("./try.star")
 
-master_only_exec('./master-only/master-only.star')
+master_only_exec("./master-only/master-only.star")
diff --git a/infra/config/subprojects/chromium/try.star b/infra/config/subprojects/chromium/try.star
index 1ce8da7..2183700 100644
--- a/infra/config/subprojects/chromium/try.star
+++ b/infra/config/subprojects/chromium/try.star
@@ -2,10 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'cpu', 'goma', 'os')
-load('//lib/try.star', 'try_')
-load('//project.star', 'settings')
-
+load("//lib/builders.star", "goma", "os")
+load("//lib/try.star", "try_")
+load("//project.star", "settings")
 
 try_.declare_bucket(settings)
 
@@ -15,109 +14,106 @@
     main_list_view = settings.main_list_view_name,
 )
 
-
 # Automatically maintained consoles
 
 [try_.list_view(
     name = name,
 ) for name in (
-    'tryserver.blink',
-    'tryserver.chromium',
-    'tryserver.chromium.android',
-    'tryserver.chromium.angle',
-    'tryserver.chromium.chromiumos',
-    'tryserver.chromium.codesearch',
-    'tryserver.chromium.dawn',
-    'tryserver.chromium.linux',
-    'tryserver.chromium.mac',
-    'tryserver.chromium.swangle',
-    'tryserver.chromium.win',
+    "tryserver.blink",
+    "tryserver.chromium",
+    "tryserver.chromium.android",
+    "tryserver.chromium.angle",
+    "tryserver.chromium.chromiumos",
+    "tryserver.chromium.codesearch",
+    "tryserver.chromium.dawn",
+    "tryserver.chromium.linux",
+    "tryserver.chromium.mac",
+    "tryserver.chromium.swangle",
+    "tryserver.chromium.win",
 )]
 
-
 # Builders are sorted first lexicographically by the function used to define
 # them, then lexicographically by their name
 
-
 try_.blink_builder(
-    name = 'linux-blink-rel',
+    name = "linux-blink-rel",
     goma_backend = goma.backend.RBE_PROD,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/cc/.+',
-            '.+/[+]/third_party/blink/renderer/core/paint/.+',
-            '.+/[+]/third_party/blink/renderer/core/svg/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
+            ".+/[+]/cc/.+",
+            ".+/[+]/third_party/blink/renderer/core/paint/.+",
+            ".+/[+]/third_party/blink/renderer/core/svg/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/.+",
         ],
     ),
 )
 
 try_.chromium_builder(
-    name = 'android-official',
+    name = "android-official",
 )
 
 try_.chromium_builder(
-    name = 'fuchsia-official',
+    name = "fuchsia-official",
 )
 
 try_.chromium_builder(
-    name = 'linux-official',
+    name = "linux-official",
 )
 
 try_.chromium_builder(
-    name = 'win-official',
+    name = "win-official",
     os = os.WINDOWS_DEFAULT,
 )
 
 try_.chromium_builder(
-    name = 'win32-official',
+    name = "win32-official",
     os = os.WINDOWS_DEFAULT,
 )
 
 try_.chromium_android_builder(
-    name = 'android-binary-size',
-    executable = 'recipe:binary_size_trybot',
+    name = "android-binary-size",
+    executable = "recipe:binary_size_trybot",
     goma_jobs = goma.jobs.J150,
     properties = {
-      '$build/binary_size': {
-        'analyze_targets': [
-          '//chrome/android:validate_expectations',
-          '//chrome/android:monochrome_public_minimal_apks',
-          '//tools/binary_size:binary_size_trybot_py',
-        ],
-        'compile_targets': [
-          'monochrome_public_minimal_apks',
-          'monochrome_static_initializers',
-          'validate_expectations',
-        ],
-      },
+        "$build/binary_size": {
+            "analyze_targets": [
+                "//chrome/android:validate_expectations",
+                "//chrome/android:monochrome_public_minimal_apks",
+                "//tools/binary_size:binary_size_trybot_py",
+            ],
+            "compile_targets": [
+                "monochrome_public_minimal_apks",
+                "monochrome_static_initializers",
+                "validate_expectations",
+            ],
+        },
     },
     tryjob = try_.job(),
 )
 
 try_.chromium_android_builder(
-    name = 'android-cronet-arm-dbg',
+    name = "android-cronet-arm-dbg",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/components/cronet/.+',
-            '.+/[+]/components/grpc_support/.+',
-            '.+/[+]/build/android/.+',
-            '.+/[+]/build/config/android/.+',
+            ".+/[+]/components/cronet/.+",
+            ".+/[+]/components/grpc_support/.+",
+            ".+/[+]/build/android/.+",
+            ".+/[+]/build/config/android/.+",
         ],
         location_regexp_exclude = [
-            '.+/[+]/components/cronet/ios/.+',
+            ".+/[+]/components/cronet/ios/.+",
         ],
     ),
 )
 
 try_.chromium_android_builder(
-    name = 'android-lollipop-arm-rel',
+    name = "android-lollipop-arm-rel",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(),
 )
 
 try_.chromium_android_builder(
-    name = 'android-marshmallow-arm64-rel',
+    name = "android-marshmallow-arm64-rel",
     cores = 16,
     goma_jobs = goma.jobs.J300,
     ssd = True,
@@ -126,36 +122,36 @@
 )
 
 try_.chromium_android_builder(
-    name = 'android-marshmallow-x86-rel',
+    name = "android-marshmallow-x86-rel",
     goma_jobs = goma.jobs.J150,
 )
 
 try_.chromium_android_builder(
-    name = 'android-nougat-arm64-rel',
+    name = "android-nougat-arm64-rel",
     goma_jobs = goma.jobs.J150,
 )
 
 try_.chromium_android_builder(
-    name = 'android-pie-arm64-dbg',
+    name = "android-pie-arm64-dbg",
     goma_jobs = goma.jobs.J300,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/android/features/vr/.+',
-            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/android/javatests/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/browser/android/vr/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/device/vr/android/.+',
-            '.+/[+]/third_party/gvr-android-sdk/.+',
-            '.+/[+]/third_party/arcore-android-sdk/.+',
-            '.+/[+]/third_party/arcore-android-sdk-client/.+',
+            ".+/[+]/chrome/android/features/vr/.+",
+            ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+",
+            ".+/[+]/chrome/android/javatests/src/org/chromium/chrome/browser/vr/.+",
+            ".+/[+]/chrome/browser/android/vr/.+",
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/device/vr/android/.+",
+            ".+/[+]/third_party/gvr-android-sdk/.+",
+            ".+/[+]/third_party/arcore-android-sdk/.+",
+            ".+/[+]/third_party/arcore-android-sdk-client/.+",
         ],
     ),
 )
 
 try_.chromium_android_builder(
-    name = 'android-pie-arm64-rel',
+    name = "android-pie-arm64-rel",
     cores = 16,
     goma_jobs = goma.jobs.J300,
     ssd = True,
@@ -163,184 +159,181 @@
 )
 
 try_.chromium_android_builder(
-    name = 'android_compile_dbg',
+    name = "android_compile_dbg",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(),
 )
 
 try_.chromium_android_builder(
-    name = 'android_compile_x64_dbg',
+    name = "android_compile_x64_dbg",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+',
-            '.+/[+]/sandbox/linux/system_headers/.+',
-            '.+/[+]/sandbox/linux/tests/.+',
-            '.+/[+]/third_party/gvr-android-sdk/.+',
+            ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+",
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/sandbox/linux/seccomp-bpf/.+",
+            ".+/[+]/sandbox/linux/seccomp-bpf-helpers/.+",
+            ".+/[+]/sandbox/linux/system_headers/.+",
+            ".+/[+]/sandbox/linux/tests/.+",
+            ".+/[+]/third_party/gvr-android-sdk/.+",
         ],
     ),
 )
 
 try_.chromium_android_builder(
-    name = 'android_compile_x86_dbg',
+    name = "android_compile_x86_dbg",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+',
-            '.+/[+]/sandbox/linux/system_headers/.+',
-            '.+/[+]/sandbox/linux/tests/.+',
-            '.+/[+]/third_party/gvr-android-sdk/.+',
+            ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+",
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/sandbox/linux/seccomp-bpf/.+",
+            ".+/[+]/sandbox/linux/seccomp-bpf-helpers/.+",
+            ".+/[+]/sandbox/linux/system_headers/.+",
+            ".+/[+]/sandbox/linux/tests/.+",
+            ".+/[+]/third_party/gvr-android-sdk/.+",
         ],
     ),
 )
 
 try_.chromium_android_builder(
-    name = 'android_cronet',
+    name = "android_cronet",
     tryjob = try_.job(),
 )
 
 try_.chromium_android_builder(
-    name = 'cast_shell_android',
+    name = "cast_shell_android",
     tryjob = try_.job(),
 )
 
-
 try_.chromium_chromiumos_builder(
-    name = 'chromeos-amd64-generic-dbg',
+    name = "chromeos-amd64-generic-dbg",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/content/gpu/.+',
-            '.+/[+]/media/.+',
+            ".+/[+]/content/gpu/.+",
+            ".+/[+]/media/.+",
         ],
     ),
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'chromeos-amd64-generic-rel',
+    name = "chromeos-amd64-generic-rel",
     tryjob = try_.job(),
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'chromeos-arm-generic-rel',
+    name = "chromeos-arm-generic-rel",
     tryjob = try_.job(),
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'linux-chromeos-compile-dbg',
+    name = "linux-chromeos-compile-dbg",
     tryjob = try_.job(),
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'linux-chromeos-rel',
+    name = "linux-chromeos-rel",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(cancel_stale = False),
     use_clang_coverage = True,
 )
 
-
 try_.chromium_dawn_builder(
-    name = 'dawn-linux-x64-deps-rel',
+    name = "dawn-linux-x64-deps-rel",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
+            ".+/[+]/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.dawn.json",
+            ".+/[+]/third_party/blink/renderer/modules/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/WebGPUExpectations",
+            ".+/[+]/third_party/dawn/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/features.gni",
         ],
     ),
 )
 
 try_.chromium_dawn_builder(
-    name = 'dawn-mac-x64-deps-rel',
+    name = "dawn-mac-x64-deps-rel",
     os = os.MAC_ANY,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
+            ".+/[+]/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.dawn.json",
+            ".+/[+]/third_party/blink/renderer/modules/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/WebGPUExpectations",
+            ".+/[+]/third_party/dawn/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/features.gni",
         ],
     ),
 )
 
 try_.chromium_dawn_builder(
-    name = 'dawn-win10-x64-deps-rel',
+    name = "dawn-win10-x64-deps-rel",
     os = os.WINDOWS_ANY,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
+            ".+/[+]/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.dawn.json",
+            ".+/[+]/third_party/blink/renderer/modules/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/WebGPUExpectations",
+            ".+/[+]/third_party/dawn/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/features.gni",
         ],
     ),
 )
 
 try_.chromium_dawn_builder(
-    name = 'dawn-win10-x86-deps-rel',
+    name = "dawn-win10-x86-deps-rel",
     os = os.WINDOWS_ANY,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
+            ".+/[+]/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.dawn.json",
+            ".+/[+]/third_party/blink/renderer/modules/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/WebGPUExpectations",
+            ".+/[+]/third_party/dawn/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/features.gni",
         ],
     ),
 )
 
-
 try_.chromium_linux_builder(
-    name = 'cast_shell_linux',
+    name = "cast_shell_linux",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'closure_compilation',
-    executable = 'recipe:closure_compilation',
+    name = "closure_compilation",
+    executable = "recipe:closure_compilation",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/third_party/closure_compiler/.+',
+            ".+/[+]/third_party/closure_compiler/.+",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'chromium_presubmit',
-    executable = 'recipe:presubmit',
+    name = "chromium_presubmit",
+    executable = "recipe:presubmit",
     goma_backend = None,
     properties = {
-        '$depot_tools/presubmit': {
-            'runhooks': True,
-            'timeout_s': 480,
+        "$depot_tools/presubmit": {
+            "runhooks": True,
+            "timeout_s": 480,
         },
-        'repo_name': 'chromium',
+        "repo_name": "chromium",
     },
     tryjob = try_.job(
         disable_reuse = True,
@@ -349,60 +342,60 @@
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia-arm64-cast',
+    name = "fuchsia-arm64-cast",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chromecast/.+',
+            ".+/[+]/chromecast/.+",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia-x64-cast',
+    name = "fuchsia-x64-cast",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia_arm64',
+    name = "fuchsia_arm64",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia_x64',
+    name = "fuchsia_x64",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-libfuzzer-asan-rel',
-    executable = 'recipe:chromium_libfuzzer_trybot',
+    name = "linux-libfuzzer-asan-rel",
+    executable = "recipe:chromium_libfuzzer_trybot",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-ozone-rel',
+    name = "linux-ozone-rel",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-rel',
+    name = "linux-rel",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(),
     use_clang_coverage = True,
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_asan_rel_ng',
+    name = "linux_chromium_asan_rel_ng",
     goma_jobs = goma.jobs.J150,
     ssd = True,
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_compile_dbg_ng',
+    name = "linux_chromium_compile_dbg_ng",
     caches = [
         swarming.cache(
-            name = 'builder',
-            path = 'linux_debug',
+            name = "builder",
+            path = "linux_debug",
         ),
     ],
     goma_jobs = goma.jobs.J150,
@@ -410,131 +403,128 @@
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_dbg_ng',
+    name = "linux_chromium_dbg_ng",
     caches = [
         swarming.cache(
-            name = 'builder',
-            path = 'linux_debug',
+            name = "builder",
+            path = "linux_debug",
         ),
     ],
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/build/.*check_gn_headers.*',
+            ".+/[+]/build/.*check_gn_headers.*",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_tsan_rel_ng',
+    name = "linux_chromium_tsan_rel_ng",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_layout_tests_composite_after_paint',
+    name = "linux_layout_tests_composite_after_paint",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/third_party/blink/renderer/core/paint/.+',
-            '.+/[+]/third_party/blink/renderer/core/svg/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
-            '.+/[+]/third_party/blink/web_tests/.+',
+            ".+/[+]/third_party/blink/renderer/core/paint/.+",
+            ".+/[+]/third_party/blink/renderer/core/svg/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/.+",
+            ".+/[+]/third_party/blink/web_tests/.+",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_layout_tests_layout_ng_disabled',
+    name = "linux_layout_tests_layout_ng_disabled",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/third_party/blink/renderer/core/editing/.+',
-            '.+/[+]/third_party/blink/renderer/core/layout/.+',
-            '.+/[+]/third_party/blink/renderer/core/paint/.+',
-            '.+/[+]/third_party/blink/renderer/core/svg/.+',
-            '.+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
-            '.+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng',
-            '.+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+',
+            ".+/[+]/third_party/blink/renderer/core/editing/.+",
+            ".+/[+]/third_party/blink/renderer/core/layout/.+",
+            ".+/[+]/third_party/blink/renderer/core/paint/.+",
+            ".+/[+]/third_party/blink/renderer/core/svg/.+",
+            ".+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/.+",
+            ".+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng",
+            ".+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_vr',
+    name = "linux_vr",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
         ],
     ),
 )
 
-
 try_.chromium_mac_builder(
-    name = 'mac-rel',
+    name = "mac-rel",
     goma_jobs = goma.jobs.J150,
     os = os.MAC_10_13,
     tryjob = try_.job(),
 )
 
 try_.chromium_mac_builder(
-    name = 'mac_chromium_compile_dbg_ng',
+    name = "mac_chromium_compile_dbg_ng",
     goma_jobs = goma.jobs.J150,
     os = os.MAC_10_13,
     tryjob = try_.job(),
 )
 
-
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator',
-    executable = 'recipe:chromium_trybot',
+    name = "ios-simulator",
+    executable = "recipe:chromium_trybot",
     properties = {
-        'xcode_build_version': '11e146',
+        "xcode_build_version": "11e146",
     },
     tryjob = try_.job(),
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator-cronet',
-    executable = 'recipe:chromium_trybot',
+    name = "ios-simulator-cronet",
+    executable = "recipe:chromium_trybot",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/components/cronet/.+',
-            '.+/[+]/components/grpc_support/.+',
-            '.+/[+]/ios/.+',
+            ".+/[+]/components/cronet/.+",
+            ".+/[+]/components/grpc_support/.+",
+            ".+/[+]/ios/.+",
         ],
         location_regexp_exclude = [
-            '.+/[+]/components/cronet/android/.+',
+            ".+/[+]/components/cronet/android/.+",
         ],
     ),
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator-full-configs',
-    executable = 'recipe:chromium_trybot',
+    name = "ios-simulator-full-configs",
+    executable = "recipe:chromium_trybot",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/ios/.+',
+            ".+/[+]/ios/.+",
         ],
     ),
 )
 
-
 try_.chromium_win_builder(
-    name = 'win-libfuzzer-asan-rel',
+    name = "win-libfuzzer-asan-rel",
     builderless = False,
-    executable = 'recipe:chromium_libfuzzer_trybot',
+    executable = "recipe:chromium_libfuzzer_trybot",
     os = os.WINDOWS_ANY,
     tryjob = try_.job(cancel_stale = False),
 )
 
 try_.chromium_win_builder(
-    name = 'win_chromium_compile_dbg_ng',
+    name = "win_chromium_compile_dbg_ng",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(cancel_stale = False),
 )
 
 try_.chromium_win_builder(
-    name = 'win10_chromium_x64_rel_ng',
+    name = "win10_chromium_x64_rel_ng",
     goma_jobs = goma.jobs.J150,
     os = os.WINDOWS_10,
     ssd = True,
@@ -543,108 +533,105 @@
 )
 
 try_.chromium_win_builder(
-    name = 'win7-rel',
+    name = "win7-rel",
     execution_timeout = 4 * time.hour + 30 * time.minute,
     goma_jobs = goma.jobs.J300,
     ssd = True,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/sandbox/win/.+',
+            ".+/[+]/sandbox/win/.+",
         ],
     ),
 )
 
 try_.gpu_chromium_android_builder(
-    name = 'android_optional_gpu_tests_rel',
+    name = "android_optional_gpu_tests_rel",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/cc/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/components/viz/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/services/viz/.+',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
+            ".+/[+]/cc/.+",
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/components/viz/.+",
+            ".+/[+]/content/test/gpu/.+",
+            ".+/[+]/gpu/.+",
+            ".+/[+]/media/audio/.+",
+            ".+/[+]/media/filters/.+",
+            ".+/[+]/media/gpu/.+",
+            ".+/[+]/services/viz/.+",
+            ".+/[+]/testing/trigger_scripts/.+",
+            ".+/[+]/third_party/blink/renderer/modules/webgl/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/.+",
         ],
     ),
 )
 
-
 try_.gpu_chromium_linux_builder(
-    name = 'linux_optional_gpu_tests_rel',
+    name = "linux_optional_gpu_tests_rel",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/content/test/gpu/.+",
+            ".+/[+]/gpu/.+",
+            ".+/[+]/media/audio/.+",
+            ".+/[+]/media/filters/.+",
+            ".+/[+]/media/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.gpu.fyi.json",
+            ".+/[+]/testing/trigger_scripts/.+",
+            ".+/[+]/third_party/blink/renderer/modules/webgl/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/.+",
         ],
     ),
 )
 
-
 try_.gpu_chromium_mac_builder(
-    name = 'mac_optional_gpu_tests_rel',
+    name = "mac_optional_gpu_tests_rel",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/services/shape_detection/.+',
-            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/content/test/gpu/.+",
+            ".+/[+]/gpu/.+",
+            ".+/[+]/media/audio/.+",
+            ".+/[+]/media/filters/.+",
+            ".+/[+]/media/gpu/.+",
+            ".+/[+]/services/shape_detection/.+",
+            ".+/[+]/testing/buildbot/chromium.gpu.fyi.json",
+            ".+/[+]/testing/trigger_scripts/.+",
+            ".+/[+]/third_party/blink/renderer/modules/webgl/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/.+",
         ],
     ),
 )
 
-
 try_.gpu_chromium_win_builder(
-    name = 'win_optional_gpu_tests_rel',
+    name = "win_optional_gpu_tests_rel",
     builderless = True,
     os = os.WINDOWS_DEFAULT,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/device/vr/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/vr/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/modules/xr/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/content/test/gpu/.+",
+            ".+/[+]/device/vr/.+",
+            ".+/[+]/gpu/.+",
+            ".+/[+]/media/audio/.+",
+            ".+/[+]/media/filters/.+",
+            ".+/[+]/media/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.gpu.fyi.json",
+            ".+/[+]/testing/trigger_scripts/.+",
+            ".+/[+]/third_party/blink/renderer/modules/vr/.+",
+            ".+/[+]/third_party/blink/renderer/modules/webgl/.+",
+            ".+/[+]/third_party/blink/renderer/modules/xr/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/.+",
         ],
     ),
 )
@@ -653,38 +640,38 @@
 # adding them to chromium's cr-buildbucket.cfg. Note that the recipe these
 # builders run allow only known roller accounts when triggered via the CQ.
 def chrome_internal_verifier(
-    *,
-    builder):
-  luci.cq_tryjob_verifier(
-      builder = 'chrome:try/' + builder,
-      cq_group = settings.cq_group,
-      includable_only = True,
-      owner_whitelist = [
-          "googlers",
-          "project-chromium-robot-committers",
-      ],
-  )
+        *,
+        builder):
+    luci.cq_tryjob_verifier(
+        builder = "chrome:try/" + builder,
+        cq_group = settings.cq_group,
+        includable_only = True,
+        owner_whitelist = [
+            "googlers",
+            "project-chromium-robot-committers",
+        ],
+    )
 
 chrome_internal_verifier(
-    builder = 'mac-chrome-beta',
+    builder = "mac-chrome-beta",
 )
 
 chrome_internal_verifier(
-    builder = 'mac-chrome-stable',
+    builder = "mac-chrome-stable",
 )
 
 chrome_internal_verifier(
-    builder = 'win-chrome-beta',
+    builder = "win-chrome-beta",
 )
 
 chrome_internal_verifier(
-    builder = 'win-chrome-stable',
+    builder = "win-chrome-stable",
 )
 
 chrome_internal_verifier(
-    builder = 'win64-chrome-beta',
+    builder = "win64-chrome-beta",
 )
 
 chrome_internal_verifier(
-    builder = 'win64-chrome-stable',
+    builder = "win64-chrome-stable",
 )
diff --git a/infra/config/subprojects/chromium/versioned/m84/buckets/ci.star b/infra/config/subprojects/chromium/versioned/m84/buckets/ci.star
index 7436e01..40f6366f 100644
--- a/infra/config/subprojects/chromium/versioned/m84/buckets/ci.star
+++ b/infra/config/subprojects/chromium/versioned/m84/buckets/ci.star
@@ -2,12 +2,12 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'builder_name', 'cpu', 'goma', 'os')
-load('//lib/ci.star', 'ci')
+load("//lib/builders.star", "builder_name", "goma", "os")
+load("//lib/ci.star", "ci")
+
 # Load this using relative path so that the load statement doesn't
 # need to be changed when making a new milestone
-load('../vars.star', 'vars')
-
+load("../vars.star", "vars")
 
 ci.set_defaults(
     vars,
@@ -18,267 +18,263 @@
 
 ci.declare_bucket(vars)
 
-
 # Builders are sorted first lexicographically by the function used to define
 # them, then lexicographically by their name
 
-
 ci.android_builder(
-    name = 'Android WebView M (dbg)',
+    name = "Android WebView M (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|webview',
-        short_name = 'M',
+        category = "tester|webview",
+        short_name = "M",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Android WebView N (dbg)',
+    name = "Android WebView N (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|webview',
-        short_name = 'N',
+        category = "tester|webview",
+        short_name = "N",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Android WebView O (dbg)',
+    name = "Android WebView O (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|webview',
-        short_name = 'O',
+        category = "tester|webview",
+        short_name = "O",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Android WebView P (dbg)',
+    name = "Android WebView P (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|webview',
-        short_name = 'P',
+        category = "tester|webview",
+        short_name = "P",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Android arm Builder (dbg)',
+    name = "Android arm Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|arm',
-        short_name = '32',
+        category = "builder|arm",
+        short_name = "32",
     ),
     execution_timeout = 4 * time.hour,
 )
 
 ci.android_builder(
-    name = 'Android arm64 Builder (dbg)',
+    name = "Android arm64 Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|arm',
-        short_name = '64',
+        category = "builder|arm",
+        short_name = "64",
     ),
     goma_jobs = goma.jobs.MANY_JOBS_FOR_CI,
     execution_timeout = 4 * time.hour,
 )
 
 ci.android_builder(
-    name = 'Android x64 Builder (dbg)',
+    name = "Android x64 Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|x86',
-        short_name = '64',
+        category = "builder|x86",
+        short_name = "64",
     ),
     execution_timeout = 4 * time.hour,
 )
 
 ci.android_builder(
-    name = 'Android x86 Builder (dbg)',
+    name = "Android x86 Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|x86',
-        short_name = '32',
+        category = "builder|x86",
+        short_name = "32",
     ),
 )
 
 ci.android_builder(
-    name = 'Cast Android (dbg)',
+    name = "Cast Android (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'on_cq',
-        short_name = 'cst',
+        category = "on_cq",
+        short_name = "cst",
     ),
 )
 
 ci.android_builder(
-    name = 'Marshmallow 64 bit Tester',
+    name = "Marshmallow 64 bit Tester",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|phone',
-        short_name = 'M',
+        category = "tester|phone",
+        short_name = "M",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Nougat Phone Tester',
+    name = "Nougat Phone Tester",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|phone',
-        short_name = 'N',
+        category = "tester|phone",
+        short_name = "N",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Oreo Phone Tester',
+    name = "Oreo Phone Tester",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|phone',
-        short_name = 'O',
+        category = "tester|phone",
+        short_name = "O",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'android-cronet-arm-dbg',
+    name = "android-cronet-arm-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|arm',
-        short_name = 'dbg',
+        category = "cronet|arm",
+        short_name = "dbg",
     ),
-    notifies = ['cronet'],
+    notifies = ["cronet"],
 )
 
 ci.android_builder(
-    name = 'android-cronet-arm-rel',
+    name = "android-cronet-arm-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|arm',
-        short_name = 'rel',
+        category = "cronet|arm",
+        short_name = "rel",
     ),
-    notifies = ['cronet'],
+    notifies = ["cronet"],
 )
 
 ci.android_builder(
-    name = 'android-cronet-kitkat-arm-rel',
+    name = "android-cronet-kitkat-arm-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|test',
-        short_name = 'k',
+        category = "cronet|test",
+        short_name = "k",
     ),
-    notifies = ['cronet'],
-    triggered_by = [builder_name('android-cronet-arm-rel')],
+    notifies = ["cronet"],
+    triggered_by = [builder_name("android-cronet-arm-rel")],
 )
 
 ci.android_builder(
-    name = 'android-cronet-lollipop-arm-rel',
+    name = "android-cronet-lollipop-arm-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|test',
-        short_name = 'l',
+        category = "cronet|test",
+        short_name = "l",
     ),
-    notifies = ['cronet'],
-    triggered_by = [builder_name('android-cronet-arm-rel')],
+    notifies = ["cronet"],
+    triggered_by = [builder_name("android-cronet-arm-rel")],
 )
 
 ci.android_builder(
-    name = 'android-lollipop-arm-rel',
+    name = "android-lollipop-arm-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'on_cq',
-        short_name = 'L',
+        category = "on_cq",
+        short_name = "L",
     ),
 )
 
 ci.android_builder(
-    name = 'android-marshmallow-arm64-rel',
+    name = "android-marshmallow-arm64-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'on_cq',
-        short_name = 'M',
+        category = "on_cq",
+        short_name = "M",
     ),
 )
 
 ci.android_builder(
-    name = 'android-pie-arm64-dbg',
+    name = "android-pie-arm64-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|phone',
-        short_name = 'P',
+        category = "tester|phone",
+        short_name = "P",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'android-pie-arm64-rel',
+    name = "android-pie-arm64-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'on_cq',
-        short_name = 'P',
-    ),
-)
-
-
-ci.chromiumos_builder(
-    name = 'chromeos-amd64-generic-dbg',
-    console_view_entry = ci.console_view_entry(
-        category = 'simple|debug|x64',
-        short_name = 'dbg',
+        category = "on_cq",
+        short_name = "P",
     ),
 )
 
 ci.chromiumos_builder(
-    name = 'chromeos-amd64-generic-rel',
+    name = "chromeos-amd64-generic-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'simple|release|x64',
-        short_name = 'rel',
+        category = "simple|debug|x64",
+        short_name = "dbg",
     ),
 )
 
 ci.chromiumos_builder(
-    name = 'chromeos-arm-generic-rel',
+    name = "chromeos-amd64-generic-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'simple|release',
-        short_name = 'arm',
+        category = "simple|release|x64",
+        short_name = "rel",
     ),
 )
 
 ci.chromiumos_builder(
-    name = 'linux-chromeos-dbg',
+    name = "chromeos-arm-generic-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'default',
-        short_name = 'dbg',
+        category = "simple|release",
+        short_name = "arm",
     ),
 )
 
 ci.chromiumos_builder(
-    name = 'linux-chromeos-rel',
+    name = "linux-chromeos-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'default',
-        short_name = 'rel',
+        category = "default",
+        short_name = "dbg",
     ),
 )
 
-
-ci.dawn_builder(
-    name = 'Dawn Linux x64 DEPS Builder',
+ci.chromiumos_builder(
+    name = "linux-chromeos-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Linux|Builder',
-        short_name = 'x64',
+        category = "default",
+        short_name = "rel",
     ),
 )
 
 ci.dawn_builder(
-    name = 'Dawn Linux x64 DEPS Release (Intel HD 630)',
+    name = "Dawn Linux x64 DEPS Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Linux|Intel',
-        short_name = 'x64',
+        category = "DEPS|Linux|Builder",
+        short_name = "x64",
+    ),
+)
+
+ci.dawn_builder(
+    name = "Dawn Linux x64 DEPS Release (Intel HD 630)",
+    console_view_entry = ci.console_view_entry(
+        category = "DEPS|Linux|Intel",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Linux x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Linux x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Linux x64 DEPS Release (NVIDIA)',
+    name = "Dawn Linux x64 DEPS Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Linux|Nvidia',
-        short_name = 'x64',
+        category = "DEPS|Linux|Nvidia",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Linux x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Linux x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Mac x64 DEPS Builder',
+    name = "Dawn Mac x64 DEPS Builder",
     builderless = False,
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Mac|Builder',
-        short_name = 'x64',
+        category = "DEPS|Mac|Builder",
+        short_name = "x64",
     ),
     cores = None,
     os = os.MAC_ANY,
@@ -287,502 +283,493 @@
 # Note that the Mac testers are all thin Linux VMs, triggering jobs on the
 # physical Mac hardware in the Swarming pool which is why they run on linux
 ci.dawn_builder(
-    name = 'Dawn Mac x64 DEPS Release (AMD)',
+    name = "Dawn Mac x64 DEPS Release (AMD)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Mac|AMD',
-        short_name = 'x64',
+        category = "DEPS|Mac|AMD",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Mac x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Mac x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Mac x64 DEPS Release (Intel)',
+    name = "Dawn Mac x64 DEPS Release (Intel)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Mac|Intel',
-        short_name = 'x64',
+        category = "DEPS|Mac|Intel",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Mac x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Mac x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x64 DEPS Builder',
+    name = "Dawn Win10 x64 DEPS Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Builder',
-        short_name = 'x64',
+        category = "DEPS|Windows|Builder",
+        short_name = "x64",
     ),
     os = os.WINDOWS_ANY,
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x64 DEPS Release (Intel HD 630)',
+    name = "Dawn Win10 x64 DEPS Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Intel',
-        short_name = 'x64',
+        category = "DEPS|Windows|Intel",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Win10 x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Win10 x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x64 DEPS Release (NVIDIA)',
+    name = "Dawn Win10 x64 DEPS Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Nvidia',
-        short_name = 'x64',
+        category = "DEPS|Windows|Nvidia",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Win10 x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Win10 x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x86 DEPS Builder',
+    name = "Dawn Win10 x86 DEPS Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Builder',
-        short_name = 'x86',
+        category = "DEPS|Windows|Builder",
+        short_name = "x86",
     ),
     os = os.WINDOWS_ANY,
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x86 DEPS Release (Intel HD 630)',
+    name = "Dawn Win10 x86 DEPS Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Intel',
-        short_name = 'x86',
+        category = "DEPS|Windows|Intel",
+        short_name = "x86",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Win10 x86 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Win10 x86 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x86 DEPS Release (NVIDIA)',
+    name = "Dawn Win10 x86 DEPS Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Nvidia',
-        short_name = 'x86',
+        category = "DEPS|Windows|Nvidia",
+        short_name = "x86",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Win10 x86 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Win10 x86 DEPS Builder")],
 )
 
-
 ci.fyi_builder(
-    name = 'VR Linux',
+    name = "VR Linux",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
+        category = "linux",
     ),
 )
 
-
 ci.fyi_ios_builder(
-    name = 'ios-simulator-cronet',
+    name = "ios-simulator-cronet",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet',
+        category = "cronet",
     ),
-    executable = 'recipe:chromium',
-    notifies = ['cronet'],
+    executable = "recipe:chromium",
+    notifies = ["cronet"],
     properties = {
-        'xcode_build_version': '11c29',
+        "xcode_build_version": "11c29",
     },
 )
 
-
 ci.gpu_builder(
-    name = 'Android Release (Nexus 5X)',
+    name = "Android Release (Nexus 5X)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android',
+        category = "Android",
     ),
 )
 
 ci.gpu_builder(
-    name = 'GPU Linux Builder',
+    name = "GPU Linux Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux',
+        category = "Linux",
     ),
 )
 
 ci.gpu_builder(
-    name = 'GPU Mac Builder',
+    name = "GPU Mac Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac',
+        category = "Mac",
     ),
     cores = None,
     os = os.MAC_ANY,
 )
 
 ci.gpu_builder(
-    name = 'GPU Win x64 Builder',
+    name = "GPU Win x64 Builder",
     builderless = True,
     console_view_entry = ci.console_view_entry(
-        category = 'Windows',
+        category = "Windows",
     ),
     os = os.WINDOWS_ANY,
 )
 
-
 ci.gpu_thin_tester(
-    name = 'Linux Release (NVIDIA)',
+    name = "Linux Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux',
+        category = "Linux",
     ),
-    triggered_by = [builder_name('GPU Linux Builder')],
+    triggered_by = [builder_name("GPU Linux Builder")],
 )
 
 ci.gpu_thin_tester(
-    name = 'Mac Release (Intel)',
+    name = "Mac Release (Intel)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac',
+        category = "Mac",
     ),
-    triggered_by = [builder_name('GPU Mac Builder')],
+    triggered_by = [builder_name("GPU Mac Builder")],
 )
 
 ci.gpu_thin_tester(
-    name = 'Mac Retina Release (AMD)',
+    name = "Mac Retina Release (AMD)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac',
+        category = "Mac",
     ),
-    triggered_by = [builder_name('GPU Mac Builder')],
+    triggered_by = [builder_name("GPU Mac Builder")],
 )
 
 ci.gpu_thin_tester(
-    name = 'Win10 x64 Release (NVIDIA)',
+    name = "Win10 x64 Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows',
+        category = "Windows",
     ),
-    triggered_by = [builder_name('GPU Win x64 Builder')],
+    triggered_by = [builder_name("GPU Win x64 Builder")],
 )
 
-
 ci.linux_builder(
-    name = 'Cast Linux',
+    name = "Cast Linux",
     console_view_entry = ci.console_view_entry(
-        category = 'cast',
-        short_name = 'vid',
+        category = "cast",
+        short_name = "vid",
     ),
     goma_jobs = goma.jobs.J50,
 )
 
 ci.linux_builder(
-    name = 'Fuchsia ARM64',
+    name = "Fuchsia ARM64",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|a64',
-        short_name = 'rel',
+        category = "fuchsia|a64",
+        short_name = "rel",
     ),
-    extra_notifies = ['cr-fuchsia'],
+    extra_notifies = ["cr-fuchsia"],
 )
 
 ci.linux_builder(
-    name = 'Fuchsia x64',
+    name = "Fuchsia x64",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|x64',
-        short_name = 'rel',
+        category = "fuchsia|x64",
+        short_name = "rel",
     ),
-    extra_notifies = ['cr-fuchsia'],
+    extra_notifies = ["cr-fuchsia"],
 )
 
 ci.linux_builder(
-    name = 'Linux Builder',
+    name = "Linux Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'bld',
+        category = "release",
+        short_name = "bld",
     ),
 )
 
 ci.linux_builder(
-    name = 'Linux Builder (dbg)',
+    name = "Linux Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|builder',
-        short_name = '64',
+        category = "debug|builder",
+        short_name = "64",
     ),
 )
 
 ci.linux_builder(
-    name = 'Linux Tests',
+    name = "Linux Tests",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'tst',
+        category = "release",
+        short_name = "tst",
     ),
     goma_backend = None,
-    triggered_by = [builder_name('Linux Builder')],
+    triggered_by = [builder_name("Linux Builder")],
 )
 
 ci.linux_builder(
-    name = 'Linux Tests (dbg)(1)',
+    name = "Linux Tests (dbg)(1)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|tester',
-        short_name = '64',
+        category = "debug|tester",
+        short_name = "64",
     ),
-    triggered_by = [builder_name('Linux Builder (dbg)')],
+    triggered_by = [builder_name("Linux Builder (dbg)")],
 )
 
 ci.linux_builder(
-    name = 'fuchsia-arm64-cast',
+    name = "fuchsia-arm64-cast",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|cast',
-        short_name = 'a64',
+        category = "fuchsia|cast",
+        short_name = "a64",
     ),
-    extra_notifies = ['cr-fuchsia'],
+    extra_notifies = ["cr-fuchsia"],
 )
 
 ci.linux_builder(
-    name = 'fuchsia-x64-cast',
+    name = "fuchsia-x64-cast",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|cast',
-        short_name = 'x64',
+        category = "fuchsia|cast",
+        short_name = "x64",
     ),
-    extra_notifies = ['cr-fuchsia'],
+    extra_notifies = ["cr-fuchsia"],
 )
 
 ci.linux_builder(
-    name = 'linux-ozone-rel',
+    name = "linux-ozone-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'ozo',
+        category = "release",
+        short_name = "ozo",
     ),
 )
 
 ci.linux_builder(
-    name = 'Linux Ozone Tester (Headless)',
-    console_view = 'chromium.fyi',
+    name = "Linux Ozone Tester (Headless)",
+    console_view = "chromium.fyi",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
-        short_name = 'loh',
+        category = "linux",
+        short_name = "loh",
     ),
-    triggered_by = [builder_name('linux-ozone-rel')],
+    triggered_by = [builder_name("linux-ozone-rel")],
 )
 
 ci.linux_builder(
-    name = 'Linux Ozone Tester (Wayland)',
-    console_view = 'chromium.fyi',
+    name = "Linux Ozone Tester (Wayland)",
+    console_view = "chromium.fyi",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
-        short_name = 'low',
+        category = "linux",
+        short_name = "low",
     ),
-    triggered_by = [builder_name('linux-ozone-rel')],
+    triggered_by = [builder_name("linux-ozone-rel")],
 )
 
 ci.linux_builder(
-    name = 'Linux Ozone Tester (X11)',
-    console_view = 'chromium.fyi',
+    name = "Linux Ozone Tester (X11)",
+    console_view = "chromium.fyi",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
-        short_name = 'lox',
+        category = "linux",
+        short_name = "lox",
     ),
-    triggered_by = [builder_name('linux-ozone-rel')],
+    triggered_by = [builder_name("linux-ozone-rel")],
 )
 
-
 ci.mac_builder(
-    name = 'Mac Builder',
+    name = "Mac Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'bld',
+        category = "release",
+        short_name = "bld",
     ),
     os = os.MAC_10_15,
 )
 
 ci.mac_builder(
-    name = 'Mac Builder (dbg)',
+    name = "Mac Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug',
-        short_name = 'bld',
+        category = "debug",
+        short_name = "bld",
     ),
     os = os.MAC_ANY,
 )
 
 ci.thin_tester(
-    name = 'Mac10.10 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.10 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '10',
+        category = "release",
+        short_name = "10",
     ),
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.11 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.11 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '11',
+        category = "release",
+        short_name = "11",
     ),
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.12 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.12 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '12',
+        category = "release",
+        short_name = "12",
     ),
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.13 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.13 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '13',
+        category = "release",
+        short_name = "13",
     ),
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.14 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.14 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '14',
+        category = "release",
+        short_name = "14",
     ),
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.15 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.15 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '15',
+        category = "release",
+        short_name = "15",
     ),
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.13 Tests (dbg)',
-    mastername = 'chromium.mac',
+    name = "Mac10.13 Tests (dbg)",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'debug',
-        short_name = '13',
+        category = "debug",
+        short_name = "13",
     ),
-    triggered_by = [builder_name('Mac Builder (dbg)')],
+    triggered_by = [builder_name("Mac Builder (dbg)")],
 )
 
 ci.thin_tester(
-    name = 'WebKit Mac10.13 (retina)',
-    mastername = 'chromium.mac',
+    name = "WebKit Mac10.13 (retina)",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'ret',
+        category = "release",
+        short_name = "ret",
     ),
-    triggered_by = [builder_name('Mac Builder')],
-)
-
-
-ci.mac_ios_builder(
-    name = 'ios-simulator',
-    console_view_entry = ci.console_view_entry(
-        category = 'ios|default',
-        short_name = 'sim',
-    )
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.mac_ios_builder(
-    name = 'ios-simulator-full-configs',
+    name = "ios-simulator",
     console_view_entry = ci.console_view_entry(
-        category = 'ios|default',
-        short_name = 'ful',
-    )
+        category = "ios|default",
+        short_name = "sim",
+    ),
 )
 
+ci.mac_ios_builder(
+    name = "ios-simulator-full-configs",
+    console_view_entry = ci.console_view_entry(
+        category = "ios|default",
+        short_name = "ful",
+    ),
+)
 
 ci.memory_builder(
-    name = 'Linux ASan LSan Builder',
+    name = "Linux ASan LSan Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|asan lsan',
-        short_name = 'bld',
+        category = "linux|asan lsan",
+        short_name = "bld",
     ),
     ssd = True,
 )
 
 ci.memory_builder(
-    name = 'Linux ASan LSan Tests (1)',
+    name = "Linux ASan LSan Tests (1)",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|asan lsan',
-        short_name = 'tst',
+        category = "linux|asan lsan",
+        short_name = "tst",
     ),
-    triggered_by = [builder_name('Linux ASan LSan Builder')],
+    triggered_by = [builder_name("Linux ASan LSan Builder")],
 )
 
 ci.memory_builder(
-    name = 'Linux ASan Tests (sandboxed)',
+    name = "Linux ASan Tests (sandboxed)",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|asan lsan',
-        short_name = 'sbx',
+        category = "linux|asan lsan",
+        short_name = "sbx",
     ),
-    triggered_by = [builder_name('Linux ASan LSan Builder')],
+    triggered_by = [builder_name("Linux ASan LSan Builder")],
 )
 
 ci.memory_builder(
-    name = 'Linux TSan Builder',
+    name = "Linux TSan Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|TSan v2',
-        short_name = 'bld',
+        category = "linux|TSan v2",
+        short_name = "bld",
     ),
 )
 
 ci.memory_builder(
-    name = 'Linux TSan Tests',
+    name = "Linux TSan Tests",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|TSan v2',
-        short_name = 'tst',
+        category = "linux|TSan v2",
+        short_name = "tst",
     ),
-    triggered_by = [builder_name('Linux TSan Builder')],
+    triggered_by = [builder_name("Linux TSan Builder")],
 )
 
-
 ci.win_builder(
-    name = 'Win7 Tests (dbg)(1)',
+    name = "Win7 Tests (dbg)(1)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|tester',
-        short_name = '7',
+        category = "debug|tester",
+        short_name = "7",
     ),
     os = os.WINDOWS_7,
-    triggered_by = [builder_name('Win Builder (dbg)')],
+    triggered_by = [builder_name("Win Builder (dbg)")],
 )
 
 ci.win_builder(
-    name = 'Win 7 Tests x64 (1)',
+    name = "Win 7 Tests x64 (1)",
     console_view_entry = ci.console_view_entry(
-        category = 'release|tester',
-        short_name = '64',
+        category = "release|tester",
+        short_name = "64",
     ),
     os = os.WINDOWS_7,
-    triggered_by = [builder_name('Win x64 Builder')],
+    triggered_by = [builder_name("Win x64 Builder")],
 )
 
 ci.win_builder(
-    name = 'Win Builder (dbg)',
+    name = "Win Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|builder',
-        short_name = '32',
+        category = "debug|builder",
+        short_name = "32",
     ),
     cores = 32,
     os = os.WINDOWS_ANY,
 )
 
 ci.win_builder(
-    name = 'Win x64 Builder',
+    name = "Win x64 Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'release|builder',
-        short_name = '64',
+        category = "release|builder",
+        short_name = "64",
     ),
     cores = 32,
     os = os.WINDOWS_ANY,
 )
 
 ci.win_builder(
-    name = 'Win10 Tests x64',
+    name = "Win10 Tests x64",
     console_view_entry = ci.console_view_entry(
-        category = 'release|tester',
-        short_name = 'w10',
+        category = "release|tester",
+        short_name = "w10",
     ),
-    triggered_by = [builder_name('Win x64 Builder')],
+    triggered_by = [builder_name("Win x64 Builder")],
 )
diff --git a/infra/config/subprojects/chromium/versioned/m84/buckets/try.star b/infra/config/subprojects/chromium/versioned/m84/buckets/try.star
index f96694c..039fcd8d 100644
--- a/infra/config/subprojects/chromium/versioned/m84/buckets/try.star
+++ b/infra/config/subprojects/chromium/versioned/m84/buckets/try.star
@@ -2,12 +2,12 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'cpu', 'goma', 'os')
-load('//lib/try.star', 'try_')
+load("//lib/builders.star", "goma", "os")
+load("//lib/try.star", "try_")
+
 # Load this using relative path so that the load statement doesn't
 # need to be changed when making a new milestone
-load('../vars.star', 'vars')
-
+load("../vars.star", "vars")
 
 try_.declare_bucket(vars)
 
@@ -16,87 +16,84 @@
     main_list_view = vars.main_list_view_name,
 )
 
-
 # Builders are sorted first lexicographically by the function used to define
 # them, then lexicographically by their name
 
-
 try_.blink_builder(
-    name = 'linux-blink-rel',
+    name = "linux-blink-rel",
     goma_backend = goma.backend.RBE_PROD,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/cc/.+',
-            '.+/[+]/third_party/blink/renderer/core/paint/.+',
-            '.+/[+]/third_party/blink/renderer/core/svg/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
+            ".+/[+]/cc/.+",
+            ".+/[+]/third_party/blink/renderer/core/paint/.+",
+            ".+/[+]/third_party/blink/renderer/core/svg/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/.+",
         ],
     ),
 )
 
-
 try_.chromium_android_builder(
-    name = 'android-binary-size',
-    executable = 'recipe:binary_size_trybot',
+    name = "android-binary-size",
+    executable = "recipe:binary_size_trybot",
     goma_jobs = goma.jobs.J150,
     properties = {
-      '$build/binary_size': {
-        'analyze_targets': [
-          '//android_webview:system_webview_apk_manifest_expectations',
-          '//android_webview:trichrome_webview_apk_manifest_expectations',
-          '//chrome/android:chrome_modern_public_bundle__base_libs_and_assets_expectations',
-          '//chrome/android:monochrome_public_bundle__base_bundle_module_manifest_expectations',
-          '//chrome/android:monochrome_public_bundle__base_libs_and_assets_expectations',
-          '//chrome/android:monochrome_public_bundle_proguard_expectations',
-          '//chrome/android:monochrome_public_minimal_apks',
-          '//chrome/android:trichrome_chrome_bundle__base_bundle_module_manifest_expectations',
-          '//chrome/android:trichrome_chrome_bundle__base_libs_and_assets_expectations',
-          '//chrome/android:trichrome_library_apk_libs_and_assets_expectations',
-          '//chrome/android:trichrome_library_apk_manifest_expectations',
-          '//tools/binary_size:binary_size_trybot_py',
-        ],
-        'compile_targets': [
-          'chrome_modern_public_bundle__base_libs_and_assets_expectations',
-          'monochrome_public_bundle__base_bundle_module_manifest_expectations',
-          'monochrome_public_bundle__base_libs_and_assets_expectations',
-          'monochrome_public_bundle_proguard_expectations',
-          'monochrome_public_minimal_apks',
-          'monochrome_static_initializers',
-          'system_webview_apk_manifest_expectations',
-          'trichrome_chrome_bundle__base_bundle_module_manifest_expectations',
-          'trichrome_chrome_bundle__base_libs_and_assets_expectations',
-          'trichrome_library_apk_libs_and_assets_expectations',
-          'trichrome_library_apk_manifest_expectations',
-          'trichrome_webview_apk_manifest_expectations'
-        ],
-      },
+        "$build/binary_size": {
+            "analyze_targets": [
+                "//android_webview:system_webview_apk_manifest_expectations",
+                "//android_webview:trichrome_webview_apk_manifest_expectations",
+                "//chrome/android:chrome_modern_public_bundle__base_libs_and_assets_expectations",
+                "//chrome/android:monochrome_public_bundle__base_bundle_module_manifest_expectations",
+                "//chrome/android:monochrome_public_bundle__base_libs_and_assets_expectations",
+                "//chrome/android:monochrome_public_bundle_proguard_expectations",
+                "//chrome/android:monochrome_public_minimal_apks",
+                "//chrome/android:trichrome_chrome_bundle__base_bundle_module_manifest_expectations",
+                "//chrome/android:trichrome_chrome_bundle__base_libs_and_assets_expectations",
+                "//chrome/android:trichrome_library_apk_libs_and_assets_expectations",
+                "//chrome/android:trichrome_library_apk_manifest_expectations",
+                "//tools/binary_size:binary_size_trybot_py",
+            ],
+            "compile_targets": [
+                "chrome_modern_public_bundle__base_libs_and_assets_expectations",
+                "monochrome_public_bundle__base_bundle_module_manifest_expectations",
+                "monochrome_public_bundle__base_libs_and_assets_expectations",
+                "monochrome_public_bundle_proguard_expectations",
+                "monochrome_public_minimal_apks",
+                "monochrome_static_initializers",
+                "system_webview_apk_manifest_expectations",
+                "trichrome_chrome_bundle__base_bundle_module_manifest_expectations",
+                "trichrome_chrome_bundle__base_libs_and_assets_expectations",
+                "trichrome_library_apk_libs_and_assets_expectations",
+                "trichrome_library_apk_manifest_expectations",
+                "trichrome_webview_apk_manifest_expectations",
+            ],
+        },
     },
     tryjob = try_.job(),
 )
 
 try_.chromium_android_builder(
-    name = 'android-cronet-arm-dbg',
+    name = "android-cronet-arm-dbg",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/components/cronet/.+',
-            '.+/[+]/components/grpc_support/.+',
-            '.+/[+]/build/android/.+',
-            '.+/[+]/build/config/android/.+',
+            ".+/[+]/components/cronet/.+",
+            ".+/[+]/components/grpc_support/.+",
+            ".+/[+]/build/android/.+",
+            ".+/[+]/build/config/android/.+",
         ],
         location_regexp_exclude = [
-            '.+/[+]/components/cronet/ios/.+',
+            ".+/[+]/components/cronet/ios/.+",
         ],
     ),
 )
 
 try_.chromium_android_builder(
-    name = 'android-lollipop-arm-rel',
+    name = "android-lollipop-arm-rel",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(),
 )
 
 try_.chromium_android_builder(
-    name = 'android-marshmallow-arm64-rel',
+    name = "android-marshmallow-arm64-rel",
     cores = 16,
     goma_jobs = goma.jobs.J300,
     ssd = True,
@@ -105,23 +102,23 @@
 )
 
 try_.chromium_android_builder(
-    name = 'android-pie-arm64-dbg',
+    name = "android-pie-arm64-dbg",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/android/features/vr/.+',
-            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/android/javatests/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/third_party/gvr-android-sdk/.+',
-            '.+/[+]/third_party/arcore-android-sdk/.+',
-            '.+/[+]/third_party/arcore-android-sdk-client/.+',
+            ".+/[+]/chrome/android/features/vr/.+",
+            ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+",
+            ".+/[+]/chrome/android/javatests/src/org/chromium/chrome/browser/vr/.+",
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/third_party/gvr-android-sdk/.+",
+            ".+/[+]/third_party/arcore-android-sdk/.+",
+            ".+/[+]/third_party/arcore-android-sdk-client/.+",
         ],
     ),
 )
 
 try_.chromium_android_builder(
-    name = 'android-pie-arm64-rel',
+    name = "android-pie-arm64-rel",
     cores = 16,
     goma_jobs = goma.jobs.J300,
     ssd = True,
@@ -129,184 +126,181 @@
 )
 
 try_.chromium_android_builder(
-    name = 'android_compile_dbg',
+    name = "android_compile_dbg",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(),
 )
 
 try_.chromium_android_builder(
-    name = 'android_compile_x64_dbg',
+    name = "android_compile_x64_dbg",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+',
-            '.+/[+]/sandbox/linux/system_headers/.+',
-            '.+/[+]/sandbox/linux/tests/.+',
-            '.+/[+]/third_party/gvr-android-sdk/.+',
+            ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+",
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/sandbox/linux/seccomp-bpf/.+",
+            ".+/[+]/sandbox/linux/seccomp-bpf-helpers/.+",
+            ".+/[+]/sandbox/linux/system_headers/.+",
+            ".+/[+]/sandbox/linux/tests/.+",
+            ".+/[+]/third_party/gvr-android-sdk/.+",
         ],
     ),
 )
 
 try_.chromium_android_builder(
-    name = 'android_compile_x86_dbg',
+    name = "android_compile_x86_dbg",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+',
-            '.+/[+]/sandbox/linux/system_headers/.+',
-            '.+/[+]/sandbox/linux/tests/.+',
-            '.+/[+]/third_party/gvr-android-sdk/.+',
+            ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+",
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/sandbox/linux/seccomp-bpf/.+",
+            ".+/[+]/sandbox/linux/seccomp-bpf-helpers/.+",
+            ".+/[+]/sandbox/linux/system_headers/.+",
+            ".+/[+]/sandbox/linux/tests/.+",
+            ".+/[+]/third_party/gvr-android-sdk/.+",
         ],
     ),
 )
 
 try_.chromium_android_builder(
-    name = 'android_cronet',
+    name = "android_cronet",
     tryjob = try_.job(),
 )
 
 try_.chromium_android_builder(
-    name = 'cast_shell_android',
+    name = "cast_shell_android",
     tryjob = try_.job(),
 )
 
-
 try_.chromium_chromiumos_builder(
-    name = 'chromeos-amd64-generic-dbg',
+    name = "chromeos-amd64-generic-dbg",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/content/gpu/.+',
-            '.+/[+]/media/.+',
+            ".+/[+]/content/gpu/.+",
+            ".+/[+]/media/.+",
         ],
     ),
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'chromeos-amd64-generic-rel',
+    name = "chromeos-amd64-generic-rel",
     tryjob = try_.job(),
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'chromeos-arm-generic-rel',
+    name = "chromeos-arm-generic-rel",
     tryjob = try_.job(),
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'linux-chromeos-compile-dbg',
+    name = "linux-chromeos-compile-dbg",
     tryjob = try_.job(),
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'linux-chromeos-rel',
+    name = "linux-chromeos-rel",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(cancel_stale = False),
     use_clang_coverage = True,
 )
 
-
 try_.chromium_dawn_builder(
-    name = 'dawn-linux-x64-deps-rel',
+    name = "dawn-linux-x64-deps-rel",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
+            ".+/[+]/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.dawn.json",
+            ".+/[+]/third_party/blink/renderer/modules/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/WebGPUExpectations",
+            ".+/[+]/third_party/dawn/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/features.gni",
         ],
     ),
 )
 
 try_.chromium_dawn_builder(
-    name = 'dawn-mac-x64-deps-rel',
+    name = "dawn-mac-x64-deps-rel",
     os = os.MAC_ANY,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
+            ".+/[+]/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.dawn.json",
+            ".+/[+]/third_party/blink/renderer/modules/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/WebGPUExpectations",
+            ".+/[+]/third_party/dawn/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/features.gni",
         ],
     ),
 )
 
 try_.chromium_dawn_builder(
-    name = 'dawn-win10-x64-deps-rel',
+    name = "dawn-win10-x64-deps-rel",
     os = os.WINDOWS_ANY,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
+            ".+/[+]/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.dawn.json",
+            ".+/[+]/third_party/blink/renderer/modules/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/WebGPUExpectations",
+            ".+/[+]/third_party/dawn/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/features.gni",
         ],
     ),
 )
 
 try_.chromium_dawn_builder(
-    name = 'dawn-win10-x86-deps-rel',
+    name = "dawn-win10-x86-deps-rel",
     os = os.WINDOWS_ANY,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
+            ".+/[+]/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.dawn.json",
+            ".+/[+]/third_party/blink/renderer/modules/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/WebGPUExpectations",
+            ".+/[+]/third_party/dawn/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/features.gni",
         ],
     ),
 )
 
-
 try_.chromium_linux_builder(
-    name = 'cast_shell_linux',
+    name = "cast_shell_linux",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'closure_compilation',
-    executable = 'recipe:closure_compilation',
+    name = "closure_compilation",
+    executable = "recipe:closure_compilation",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/third_party/closure_compiler/.+',
+            ".+/[+]/third_party/closure_compiler/.+",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'chromium_presubmit',
-    executable = 'recipe:presubmit',
+    name = "chromium_presubmit",
+    executable = "recipe:presubmit",
     goma_backend = None,
     properties = {
-        '$depot_tools/presubmit': {
-            'runhooks': True,
-            'timeout_s': 480,
+        "$depot_tools/presubmit": {
+            "runhooks": True,
+            "timeout_s": 480,
         },
-        'repo_name': 'chromium',
+        "repo_name": "chromium",
     },
     tryjob = try_.job(
         disable_reuse = True,
@@ -315,60 +309,60 @@
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia-arm64-cast',
+    name = "fuchsia-arm64-cast",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chromecast/.+',
+            ".+/[+]/chromecast/.+",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia-x64-cast',
+    name = "fuchsia-x64-cast",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia_arm64',
+    name = "fuchsia_arm64",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia_x64',
+    name = "fuchsia_x64",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-libfuzzer-asan-rel',
-    executable = 'recipe:chromium_libfuzzer_trybot',
+    name = "linux-libfuzzer-asan-rel",
+    executable = "recipe:chromium_libfuzzer_trybot",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-ozone-rel',
+    name = "linux-ozone-rel",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-rel',
+    name = "linux-rel",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(),
     use_clang_coverage = True,
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_asan_rel_ng',
+    name = "linux_chromium_asan_rel_ng",
     goma_jobs = goma.jobs.J150,
     ssd = True,
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_compile_dbg_ng',
+    name = "linux_chromium_compile_dbg_ng",
     caches = [
         swarming.cache(
-            name = 'builder',
-            path = 'linux_debug',
+            name = "builder",
+            path = "linux_debug",
         ),
     ],
     goma_jobs = goma.jobs.J150,
@@ -376,131 +370,128 @@
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_dbg_ng',
+    name = "linux_chromium_dbg_ng",
     caches = [
         swarming.cache(
-            name = 'builder',
-            path = 'linux_debug',
+            name = "builder",
+            path = "linux_debug",
         ),
     ],
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/build/.*check_gn_headers.*',
+            ".+/[+]/build/.*check_gn_headers.*",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_tsan_rel_ng',
+    name = "linux_chromium_tsan_rel_ng",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_layout_tests_composite_after_paint',
+    name = "linux_layout_tests_composite_after_paint",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/third_party/blink/renderer/core/paint/.+',
-            '.+/[+]/third_party/blink/renderer/core/svg/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
-            '.+/[+]/third_party/blink/web_tests/.+',
+            ".+/[+]/third_party/blink/renderer/core/paint/.+",
+            ".+/[+]/third_party/blink/renderer/core/svg/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/.+",
+            ".+/[+]/third_party/blink/web_tests/.+",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_layout_tests_layout_ng_disabled',
+    name = "linux_layout_tests_layout_ng_disabled",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/third_party/blink/renderer/core/editing/.+',
-            '.+/[+]/third_party/blink/renderer/core/layout/.+',
-            '.+/[+]/third_party/blink/renderer/core/paint/.+',
-            '.+/[+]/third_party/blink/renderer/core/svg/.+',
-            '.+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
-            '.+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng',
-            '.+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+',
+            ".+/[+]/third_party/blink/renderer/core/editing/.+",
+            ".+/[+]/third_party/blink/renderer/core/layout/.+",
+            ".+/[+]/third_party/blink/renderer/core/paint/.+",
+            ".+/[+]/third_party/blink/renderer/core/svg/.+",
+            ".+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/.+",
+            ".+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng",
+            ".+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_vr',
+    name = "linux_vr",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
         ],
     ),
 )
 
-
 try_.chromium_mac_builder(
-    name = 'mac-rel',
+    name = "mac-rel",
     goma_jobs = goma.jobs.J150,
     os = os.MAC_10_13,
     tryjob = try_.job(),
 )
 
 try_.chromium_mac_builder(
-    name = 'mac_chromium_compile_dbg_ng',
+    name = "mac_chromium_compile_dbg_ng",
     goma_jobs = goma.jobs.J150,
     os = os.MAC_10_13,
     tryjob = try_.job(),
 )
 
-
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator',
-    executable = 'recipe:chromium_trybot',
+    name = "ios-simulator",
+    executable = "recipe:chromium_trybot",
     properties = {
-        'xcode_build_version': '11e146',
+        "xcode_build_version": "11e146",
     },
     tryjob = try_.job(),
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator-cronet',
-    executable = 'recipe:chromium_trybot',
+    name = "ios-simulator-cronet",
+    executable = "recipe:chromium_trybot",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/components/cronet/.+',
-            '.+/[+]/components/grpc_support/.+',
-            '.+/[+]/ios/.+',
+            ".+/[+]/components/cronet/.+",
+            ".+/[+]/components/grpc_support/.+",
+            ".+/[+]/ios/.+",
         ],
         location_regexp_exclude = [
-            '.+/[+]/components/cronet/android/.+',
+            ".+/[+]/components/cronet/android/.+",
         ],
     ),
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator-full-configs',
-    executable = 'recipe:chromium_trybot',
+    name = "ios-simulator-full-configs",
+    executable = "recipe:chromium_trybot",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/ios/.+',
+            ".+/[+]/ios/.+",
         ],
     ),
 )
 
-
 try_.chromium_win_builder(
-    name = 'win-libfuzzer-asan-rel',
+    name = "win-libfuzzer-asan-rel",
     builderless = False,
-    executable = 'recipe:chromium_libfuzzer_trybot',
+    executable = "recipe:chromium_libfuzzer_trybot",
     os = os.WINDOWS_ANY,
     tryjob = try_.job(cancel_stale = False),
 )
 
 try_.chromium_win_builder(
-    name = 'win_chromium_compile_dbg_ng',
+    name = "win_chromium_compile_dbg_ng",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(cancel_stale = False),
 )
 
 try_.chromium_win_builder(
-    name = 'win10_chromium_x64_rel_ng',
+    name = "win10_chromium_x64_rel_ng",
     goma_jobs = goma.jobs.J150,
     os = os.WINDOWS_10,
     ssd = True,
@@ -508,98 +499,94 @@
     tryjob = try_.job(cancel_stale = False),
 )
 
-
 try_.gpu_chromium_android_builder(
-    name = 'android_optional_gpu_tests_rel',
+    name = "android_optional_gpu_tests_rel",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/cc/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/components/viz/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/services/viz/.+',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
+            ".+/[+]/cc/.+",
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/components/viz/.+",
+            ".+/[+]/content/test/gpu/.+",
+            ".+/[+]/gpu/.+",
+            ".+/[+]/media/audio/.+",
+            ".+/[+]/media/filters/.+",
+            ".+/[+]/media/gpu/.+",
+            ".+/[+]/services/viz/.+",
+            ".+/[+]/testing/trigger_scripts/.+",
+            ".+/[+]/third_party/blink/renderer/modules/webgl/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/.+",
         ],
     ),
 )
 
-
 try_.gpu_chromium_linux_builder(
-    name = 'linux_optional_gpu_tests_rel',
+    name = "linux_optional_gpu_tests_rel",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/content/test/gpu/.+",
+            ".+/[+]/gpu/.+",
+            ".+/[+]/media/audio/.+",
+            ".+/[+]/media/filters/.+",
+            ".+/[+]/media/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.gpu.fyi.json",
+            ".+/[+]/testing/trigger_scripts/.+",
+            ".+/[+]/third_party/blink/renderer/modules/webgl/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/.+",
         ],
     ),
 )
 
-
 try_.gpu_chromium_mac_builder(
-    name = 'mac_optional_gpu_tests_rel',
+    name = "mac_optional_gpu_tests_rel",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/services/shape_detection/.+',
-            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/content/test/gpu/.+",
+            ".+/[+]/gpu/.+",
+            ".+/[+]/media/audio/.+",
+            ".+/[+]/media/filters/.+",
+            ".+/[+]/media/gpu/.+",
+            ".+/[+]/services/shape_detection/.+",
+            ".+/[+]/testing/buildbot/chromium.gpu.fyi.json",
+            ".+/[+]/testing/trigger_scripts/.+",
+            ".+/[+]/third_party/blink/renderer/modules/webgl/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/.+",
         ],
     ),
 )
 
-
 try_.gpu_chromium_win_builder(
-    name = 'win_optional_gpu_tests_rel',
+    name = "win_optional_gpu_tests_rel",
     builderless = True,
     os = os.WINDOWS_DEFAULT,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/device/vr/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/vr/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/modules/xr/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/content/test/gpu/.+",
+            ".+/[+]/device/vr/.+",
+            ".+/[+]/gpu/.+",
+            ".+/[+]/media/audio/.+",
+            ".+/[+]/media/filters/.+",
+            ".+/[+]/media/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.gpu.fyi.json",
+            ".+/[+]/testing/trigger_scripts/.+",
+            ".+/[+]/third_party/blink/renderer/modules/vr/.+",
+            ".+/[+]/third_party/blink/renderer/modules/webgl/.+",
+            ".+/[+]/third_party/blink/renderer/modules/xr/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/.+",
         ],
     ),
 )
@@ -608,38 +595,38 @@
 # adding them to chromium's cr-buildbucket.cfg. Note that the recipe these
 # builders run allow only known roller accounts when triggered via the CQ.
 def chrome_internal_verifier(
-    *,
-    builder):
-  luci.cq_tryjob_verifier(
-      builder = 'chrome:try/' + builder,
-      cq_group = vars.cq_group,
-      includable_only = True,
-      owner_whitelist = [
-          "googlers",
-          "project-chromium-robot-committers",
-      ],
-  )
+        *,
+        builder):
+    luci.cq_tryjob_verifier(
+        builder = "chrome:try/" + builder,
+        cq_group = vars.cq_group,
+        includable_only = True,
+        owner_whitelist = [
+            "googlers",
+            "project-chromium-robot-committers",
+        ],
+    )
 
 chrome_internal_verifier(
-    builder = 'mac-chrome-beta',
+    builder = "mac-chrome-beta",
 )
 
 chrome_internal_verifier(
-    builder = 'mac-chrome-stable',
+    builder = "mac-chrome-stable",
 )
 
 chrome_internal_verifier(
-    builder = 'win-chrome-beta',
+    builder = "win-chrome-beta",
 )
 
 chrome_internal_verifier(
-    builder = 'win-chrome-stable',
+    builder = "win-chrome-stable",
 )
 
 chrome_internal_verifier(
-    builder = 'win64-chrome-beta',
+    builder = "win64-chrome-beta",
 )
 
 chrome_internal_verifier(
-    builder = 'win64-chrome-stable',
+    builder = "win64-chrome-stable",
 )
diff --git a/infra/config/subprojects/chromium/versioned/m84/vars.star b/infra/config/subprojects/chromium/versioned/m84/vars.star
index 9435600..4d18907 100644
--- a/infra/config/subprojects/chromium/versioned/m84/vars.star
+++ b/infra/config/subprojects/chromium/versioned/m84/vars.star
@@ -4,18 +4,18 @@
 
 vars = struct(
     is_master = False,
-    ref = 'refs/branch-heads/4147',
-    ci_bucket = 'ci-m84',
-    ci_poller = 'm84-gitiles-trigger',
-    main_console_name = 'main-m84',
-    main_console_title = 'Chromium M84 Console',
-    cq_mirrors_console_name = 'mirrors-m84',
-    cq_mirrors_console_title = 'Chromium M84 CQ Mirrors Console',
-    try_bucket = 'try-m84',
+    ref = "refs/branch-heads/4147",
+    ci_bucket = "ci-m84",
+    ci_poller = "m84-gitiles-trigger",
+    main_console_name = "main-m84",
+    main_console_title = "Chromium M84 Console",
+    cq_mirrors_console_name = "mirrors-m84",
+    cq_mirrors_console_title = "Chromium M84 CQ Mirrors Console",
+    try_bucket = "try-m84",
     try_triggering_projects = [],
-    cq_group = 'cq-m84',
-    cq_ref_regexp = 'refs/branch-heads/4147',
-    main_list_view_name = 'try-m84',
-    main_list_view_title = 'Chromium M84 CQ console',
+    cq_group = "cq-m84",
+    cq_ref_regexp = "refs/branch-heads/4147",
+    main_list_view_name = "try-m84",
+    main_list_view_title = "Chromium M84 CQ console",
     tree_status_host = None,
 )
diff --git a/infra/config/subprojects/chromium/versioned/m85/buckets/ci.star b/infra/config/subprojects/chromium/versioned/m85/buckets/ci.star
index 3b21529..2287fd70 100644
--- a/infra/config/subprojects/chromium/versioned/m85/buckets/ci.star
+++ b/infra/config/subprojects/chromium/versioned/m85/buckets/ci.star
@@ -2,12 +2,12 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'builder_name', 'cpu', 'goma', 'os')
-load('//lib/ci.star', 'ci')
+load("//lib/builders.star", "builder_name", "goma", "os")
+load("//lib/ci.star", "ci")
+
 # Load this using relative path so that the load statement doesn't
 # need to be changed when making a new milestone
-load('../vars.star', 'vars')
-
+load("../vars.star", "vars")
 
 ci.set_defaults(
     vars,
@@ -18,213 +18,211 @@
 
 ci.declare_bucket(vars)
 
-
 # Builders are sorted first lexicographically by the function used to define
 # them, then lexicographically by their name
 
-
 ci.android_builder(
-    name = 'Android WebView M (dbg)',
+    name = "Android WebView M (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|webview',
-        short_name = 'M',
+        category = "tester|webview",
+        short_name = "M",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Android WebView N (dbg)',
+    name = "Android WebView N (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|webview',
-        short_name = 'N',
+        category = "tester|webview",
+        short_name = "N",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Android WebView O (dbg)',
+    name = "Android WebView O (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|webview',
-        short_name = 'O',
+        category = "tester|webview",
+        short_name = "O",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Android WebView P (dbg)',
+    name = "Android WebView P (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|webview',
-        short_name = 'P',
+        category = "tester|webview",
+        short_name = "P",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Android arm Builder (dbg)',
+    name = "Android arm Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|arm',
-        short_name = '32',
+        category = "builder|arm",
+        short_name = "32",
     ),
     execution_timeout = 4 * time.hour,
 )
 
 ci.android_builder(
-    name = 'Android arm64 Builder (dbg)',
+    name = "Android arm64 Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|arm',
-        short_name = '64',
+        category = "builder|arm",
+        short_name = "64",
     ),
     goma_jobs = goma.jobs.MANY_JOBS_FOR_CI,
     execution_timeout = 5 * time.hour,
 )
 
 ci.android_builder(
-    name = 'Android x64 Builder (dbg)',
+    name = "Android x64 Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|x86',
-        short_name = '64',
+        category = "builder|x86",
+        short_name = "64",
     ),
     execution_timeout = 4 * time.hour,
 )
 
 ci.android_builder(
-    name = 'Android x86 Builder (dbg)',
+    name = "Android x86 Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'builder|x86',
-        short_name = '32',
+        category = "builder|x86",
+        short_name = "32",
     ),
 )
 
 ci.android_builder(
-    name = 'Cast Android (dbg)',
+    name = "Cast Android (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'on_cq',
-        short_name = 'cst',
+        category = "on_cq",
+        short_name = "cst",
     ),
 )
 
 ci.android_builder(
-    name = 'Marshmallow 64 bit Tester',
+    name = "Marshmallow 64 bit Tester",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|phone',
-        short_name = 'M',
+        category = "tester|phone",
+        short_name = "M",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Nougat Phone Tester',
+    name = "Nougat Phone Tester",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|phone',
-        short_name = 'N',
+        category = "tester|phone",
+        short_name = "N",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'Oreo Phone Tester',
+    name = "Oreo Phone Tester",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|phone',
-        short_name = 'O',
+        category = "tester|phone",
+        short_name = "O",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'android-cronet-arm-dbg',
+    name = "android-cronet-arm-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|arm',
-        short_name = 'dbg',
+        category = "cronet|arm",
+        short_name = "dbg",
     ),
-    notifies = ['cronet'],
+    notifies = ["cronet"],
 )
 
 ci.android_builder(
-    name = 'android-cronet-arm-rel',
+    name = "android-cronet-arm-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|arm',
-        short_name = 'rel',
+        category = "cronet|arm",
+        short_name = "rel",
     ),
-    notifies = ['cronet'],
+    notifies = ["cronet"],
 )
 
 ci.android_builder(
-    name = 'android-cronet-kitkat-arm-rel',
+    name = "android-cronet-kitkat-arm-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|test',
-        short_name = 'k',
+        category = "cronet|test",
+        short_name = "k",
     ),
-    notifies = ['cronet'],
-    triggered_by = [builder_name('android-cronet-arm-rel')],
+    notifies = ["cronet"],
+    triggered_by = [builder_name("android-cronet-arm-rel")],
 )
 
 ci.android_builder(
-    name = 'android-cronet-lollipop-arm-rel',
+    name = "android-cronet-lollipop-arm-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet|test',
-        short_name = 'l',
+        category = "cronet|test",
+        short_name = "l",
     ),
-    notifies = ['cronet'],
-    triggered_by = [builder_name('android-cronet-arm-rel')],
+    notifies = ["cronet"],
+    triggered_by = [builder_name("android-cronet-arm-rel")],
 )
 
 ci.android_builder(
-    name = 'android-lollipop-arm-rel',
+    name = "android-lollipop-arm-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'on_cq',
-        short_name = 'L',
+        category = "on_cq",
+        short_name = "L",
     ),
 )
 
 ci.android_builder(
-    name = 'android-marshmallow-arm64-rel',
+    name = "android-marshmallow-arm64-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'on_cq',
-        short_name = 'M',
+        category = "on_cq",
+        short_name = "M",
     ),
 )
 
 ci.android_builder(
-    name = 'android-marshmallow-x86-rel',
+    name = "android-marshmallow-x86-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'builder_tester|x86',
-        short_name = 'M',
+        category = "builder_tester|x86",
+        short_name = "M",
     ),
 )
 
 ci.android_builder(
-    name = 'android-nougat-arm64-rel',
+    name = "android-nougat-arm64-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'builder_tester|arm64',
-        short_name = 'N',
+        category = "builder_tester|arm64",
+        short_name = "N",
     ),
 )
 
 ci.android_builder(
-    name = 'android-pie-arm64-dbg',
+    name = "android-pie-arm64-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'tester|phone',
-        short_name = 'P',
+        category = "tester|phone",
+        short_name = "P",
     ),
-    triggered_by = [builder_name('Android arm64 Builder (dbg)')],
+    triggered_by = [builder_name("Android arm64 Builder (dbg)")],
 )
 
 ci.android_builder(
-    name = 'android-pie-arm64-rel',
+    name = "android-pie-arm64-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'on_cq',
-        short_name = 'P',
+        category = "on_cq",
+        short_name = "P",
     ),
 )
 
 ci.chromium_builder(
-    name = 'android-official',
+    name = "android-official",
     # TODO(https://crbug.com/1072012) Use the default console view and add
     # main_console_view = settings.main_console_name once the build is green
-    console_view = 'chromium.fyi',
+    console_view = "chromium.fyi",
     console_view_entry = ci.console_view_entry(
-        category = 'android',
-        short_name = 'off',
+        category = "android",
+        short_name = "off",
     ),
     cores = 32,
     # TODO: Change this back down to something reasonable once these builders
@@ -233,13 +231,13 @@
 )
 
 ci.chromium_builder(
-    name = 'fuchsia-official',
+    name = "fuchsia-official",
     # TODO(https://crbug.com/1072012) Use the default console view and add
     # main_console_view = settings.main_console_name once the build is green
-    console_view = 'chromium.fyi',
+    console_view = "chromium.fyi",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia',
-        short_name = 'off',
+        category = "fuchsia",
+        short_name = "off",
     ),
     cores = 32,
     # TODO: Change this back down to something reasonable once these builders
@@ -248,13 +246,13 @@
 )
 
 ci.chromium_builder(
-    name = 'linux-official',
+    name = "linux-official",
     # TODO(https://crbug.com/1072012) Use the default console view and add
     # main_console_view = settings.main_console_name once the build is green
-    console_view = 'chromium.fyi',
+    console_view = "chromium.fyi",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
-        short_name = 'off',
+        category = "linux",
+        short_name = "off",
     ),
     cores = 32,
     # TODO: Change this back down to something reasonable once these builders
@@ -263,82 +261,81 @@
 )
 
 ci.chromiumos_builder(
-    name = 'chromeos-amd64-generic-dbg',
+    name = "chromeos-amd64-generic-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'simple|debug|x64',
-        short_name = 'dbg',
+        category = "simple|debug|x64",
+        short_name = "dbg",
     ),
 )
 
 ci.chromiumos_builder(
-    name = 'chromeos-amd64-generic-rel',
+    name = "chromeos-amd64-generic-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'simple|release|x64',
-        short_name = 'rel',
+        category = "simple|release|x64",
+        short_name = "rel",
     ),
 )
 
 ci.chromiumos_builder(
-    name = 'chromeos-arm-generic-rel',
+    name = "chromeos-arm-generic-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'simple|release',
-        short_name = 'arm',
+        category = "simple|release",
+        short_name = "arm",
     ),
 )
 
 ci.chromiumos_builder(
-    name = 'linux-chromeos-dbg',
+    name = "linux-chromeos-dbg",
     console_view_entry = ci.console_view_entry(
-        category = 'default',
-        short_name = 'dbg',
+        category = "default",
+        short_name = "dbg",
     ),
 )
 
 ci.chromiumos_builder(
-    name = 'linux-chromeos-rel',
+    name = "linux-chromeos-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'default',
-        short_name = 'rel',
-    ),
-)
-
-
-ci.dawn_builder(
-    name = 'Dawn Linux x64 DEPS Builder',
-    console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Linux|Builder',
-        short_name = 'x64',
+        category = "default",
+        short_name = "rel",
     ),
 )
 
 ci.dawn_builder(
-    name = 'Dawn Linux x64 DEPS Release (Intel HD 630)',
+    name = "Dawn Linux x64 DEPS Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Linux|Intel',
-        short_name = 'x64',
+        category = "DEPS|Linux|Builder",
+        short_name = "x64",
+    ),
+)
+
+ci.dawn_builder(
+    name = "Dawn Linux x64 DEPS Release (Intel HD 630)",
+    console_view_entry = ci.console_view_entry(
+        category = "DEPS|Linux|Intel",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Linux x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Linux x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Linux x64 DEPS Release (NVIDIA)',
+    name = "Dawn Linux x64 DEPS Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Linux|Nvidia',
-        short_name = 'x64',
+        category = "DEPS|Linux|Nvidia",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Linux x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Linux x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Mac x64 DEPS Builder',
+    name = "Dawn Mac x64 DEPS Builder",
     builderless = False,
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Mac|Builder',
-        short_name = 'x64',
+        category = "DEPS|Mac|Builder",
+        short_name = "x64",
     ),
     cores = None,
     os = os.MAC_ANY,
@@ -347,502 +344,493 @@
 # Note that the Mac testers are all thin Linux VMs, triggering jobs on the
 # physical Mac hardware in the Swarming pool which is why they run on linux
 ci.dawn_builder(
-    name = 'Dawn Mac x64 DEPS Release (AMD)',
+    name = "Dawn Mac x64 DEPS Release (AMD)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Mac|AMD',
-        short_name = 'x64',
+        category = "DEPS|Mac|AMD",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Mac x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Mac x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Mac x64 DEPS Release (Intel)',
+    name = "Dawn Mac x64 DEPS Release (Intel)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Mac|Intel',
-        short_name = 'x64',
+        category = "DEPS|Mac|Intel",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Mac x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Mac x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x64 DEPS Builder',
+    name = "Dawn Win10 x64 DEPS Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Builder',
-        short_name = 'x64',
+        category = "DEPS|Windows|Builder",
+        short_name = "x64",
     ),
     os = os.WINDOWS_ANY,
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x64 DEPS Release (Intel HD 630)',
+    name = "Dawn Win10 x64 DEPS Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Intel',
-        short_name = 'x64',
+        category = "DEPS|Windows|Intel",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Win10 x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Win10 x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x64 DEPS Release (NVIDIA)',
+    name = "Dawn Win10 x64 DEPS Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Nvidia',
-        short_name = 'x64',
+        category = "DEPS|Windows|Nvidia",
+        short_name = "x64",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Win10 x64 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Win10 x64 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x86 DEPS Builder',
+    name = "Dawn Win10 x86 DEPS Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Builder',
-        short_name = 'x86',
+        category = "DEPS|Windows|Builder",
+        short_name = "x86",
     ),
     os = os.WINDOWS_ANY,
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x86 DEPS Release (Intel HD 630)',
+    name = "Dawn Win10 x86 DEPS Release (Intel HD 630)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Intel',
-        short_name = 'x86',
+        category = "DEPS|Windows|Intel",
+        short_name = "x86",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Win10 x86 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Win10 x86 DEPS Builder")],
 )
 
 ci.dawn_builder(
-    name = 'Dawn Win10 x86 DEPS Release (NVIDIA)',
+    name = "Dawn Win10 x86 DEPS Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'DEPS|Windows|Nvidia',
-        short_name = 'x86',
+        category = "DEPS|Windows|Nvidia",
+        short_name = "x86",
     ),
     cores = 2,
     os = os.LINUX_DEFAULT,
-    triggered_by = [builder_name('Dawn Win10 x86 DEPS Builder')],
+    triggered_by = [builder_name("Dawn Win10 x86 DEPS Builder")],
 )
 
-
 ci.fyi_builder(
-    name = 'VR Linux',
+    name = "VR Linux",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
+        category = "linux",
     ),
 )
 
-
 ci.fyi_ios_builder(
-    name = 'ios-simulator-cronet',
+    name = "ios-simulator-cronet",
     console_view_entry = ci.console_view_entry(
-        category = 'cronet',
+        category = "cronet",
     ),
-    executable = 'recipe:chromium',
-    notifies = ['cronet'],
+    executable = "recipe:chromium",
+    notifies = ["cronet"],
     properties = {
-        'xcode_build_version': '11e146',
+        "xcode_build_version": "11e146",
     },
 )
 
-
 ci.gpu_builder(
-    name = 'Android Release (Nexus 5X)',
+    name = "Android Release (Nexus 5X)",
     console_view_entry = ci.console_view_entry(
-        category = 'Android',
+        category = "Android",
     ),
 )
 
 ci.gpu_builder(
-    name = 'GPU Linux Builder',
+    name = "GPU Linux Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux',
+        category = "Linux",
     ),
 )
 
 ci.gpu_builder(
-    name = 'GPU Mac Builder',
+    name = "GPU Mac Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac',
+        category = "Mac",
     ),
     cores = None,
     os = os.MAC_ANY,
 )
 
 ci.gpu_builder(
-    name = 'GPU Win x64 Builder',
+    name = "GPU Win x64 Builder",
     builderless = True,
     console_view_entry = ci.console_view_entry(
-        category = 'Windows',
+        category = "Windows",
     ),
     os = os.WINDOWS_ANY,
 )
 
-
 ci.gpu_thin_tester(
-    name = 'Linux Release (NVIDIA)',
+    name = "Linux Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Linux',
+        category = "Linux",
     ),
-    triggered_by = [builder_name('GPU Linux Builder')],
+    triggered_by = [builder_name("GPU Linux Builder")],
 )
 
 ci.gpu_thin_tester(
-    name = 'Mac Release (Intel)',
+    name = "Mac Release (Intel)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac',
+        category = "Mac",
     ),
-    triggered_by = [builder_name('GPU Mac Builder')],
+    triggered_by = [builder_name("GPU Mac Builder")],
 )
 
 ci.gpu_thin_tester(
-    name = 'Mac Retina Release (AMD)',
+    name = "Mac Retina Release (AMD)",
     console_view_entry = ci.console_view_entry(
-        category = 'Mac',
+        category = "Mac",
     ),
-    triggered_by = [builder_name('GPU Mac Builder')],
+    triggered_by = [builder_name("GPU Mac Builder")],
 )
 
 ci.gpu_thin_tester(
-    name = 'Win10 x64 Release (NVIDIA)',
+    name = "Win10 x64 Release (NVIDIA)",
     console_view_entry = ci.console_view_entry(
-        category = 'Windows',
+        category = "Windows",
     ),
-    triggered_by = [builder_name('GPU Win x64 Builder')],
+    triggered_by = [builder_name("GPU Win x64 Builder")],
 )
 
-
 ci.linux_builder(
-    name = 'Cast Linux',
+    name = "Cast Linux",
     console_view_entry = ci.console_view_entry(
-        category = 'cast',
-        short_name = 'vid',
+        category = "cast",
+        short_name = "vid",
     ),
     goma_jobs = goma.jobs.J50,
 )
 
 ci.linux_builder(
-    name = 'Fuchsia ARM64',
+    name = "Fuchsia ARM64",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|a64',
-        short_name = 'rel',
+        category = "fuchsia|a64",
+        short_name = "rel",
     ),
-    extra_notifies = ['cr-fuchsia'],
+    extra_notifies = ["cr-fuchsia"],
 )
 
 ci.linux_builder(
-    name = 'Fuchsia x64',
+    name = "Fuchsia x64",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|x64',
-        short_name = 'rel',
+        category = "fuchsia|x64",
+        short_name = "rel",
     ),
-    extra_notifies = ['cr-fuchsia'],
+    extra_notifies = ["cr-fuchsia"],
 )
 
 ci.linux_builder(
-    name = 'Linux Builder',
+    name = "Linux Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'bld',
+        category = "release",
+        short_name = "bld",
     ),
 )
 
 ci.linux_builder(
-    name = 'Linux Builder (dbg)',
+    name = "Linux Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|builder',
-        short_name = '64',
+        category = "debug|builder",
+        short_name = "64",
     ),
 )
 
 ci.linux_builder(
-    name = 'Linux Tests',
+    name = "Linux Tests",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'tst',
+        category = "release",
+        short_name = "tst",
     ),
     goma_backend = None,
-    triggered_by = [builder_name('Linux Builder')],
+    triggered_by = [builder_name("Linux Builder")],
 )
 
 ci.linux_builder(
-    name = 'Linux Tests (dbg)(1)',
+    name = "Linux Tests (dbg)(1)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|tester',
-        short_name = '64',
+        category = "debug|tester",
+        short_name = "64",
     ),
-    triggered_by = [builder_name('Linux Builder (dbg)')],
+    triggered_by = [builder_name("Linux Builder (dbg)")],
 )
 
 ci.linux_builder(
-    name = 'fuchsia-arm64-cast',
+    name = "fuchsia-arm64-cast",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|cast',
-        short_name = 'a64',
+        category = "fuchsia|cast",
+        short_name = "a64",
     ),
-    extra_notifies = ['cr-fuchsia'],
+    extra_notifies = ["cr-fuchsia"],
 )
 
 ci.linux_builder(
-    name = 'fuchsia-x64-cast',
+    name = "fuchsia-x64-cast",
     console_view_entry = ci.console_view_entry(
-        category = 'fuchsia|cast',
-        short_name = 'x64',
+        category = "fuchsia|cast",
+        short_name = "x64",
     ),
-    extra_notifies = ['cr-fuchsia'],
+    extra_notifies = ["cr-fuchsia"],
 )
 
 ci.linux_builder(
-    name = 'linux-ozone-rel',
+    name = "linux-ozone-rel",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'ozo',
+        category = "release",
+        short_name = "ozo",
     ),
 )
 
 ci.linux_builder(
-    name = 'Linux Ozone Tester (Headless)',
-    console_view = 'chromium.fyi',
+    name = "Linux Ozone Tester (Headless)",
+    console_view = "chromium.fyi",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
-        short_name = 'loh',
+        category = "linux",
+        short_name = "loh",
     ),
-    triggered_by = [builder_name('linux-ozone-rel')],
+    triggered_by = [builder_name("linux-ozone-rel")],
 )
 
 ci.linux_builder(
-    name = 'Linux Ozone Tester (Wayland)',
-    console_view = 'chromium.fyi',
+    name = "Linux Ozone Tester (Wayland)",
+    console_view = "chromium.fyi",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
-        short_name = 'low',
+        category = "linux",
+        short_name = "low",
     ),
-    triggered_by = [builder_name('linux-ozone-rel')],
+    triggered_by = [builder_name("linux-ozone-rel")],
 )
 
 ci.linux_builder(
-    name = 'Linux Ozone Tester (X11)',
-    console_view = 'chromium.fyi',
+    name = "Linux Ozone Tester (X11)",
+    console_view = "chromium.fyi",
     console_view_entry = ci.console_view_entry(
-        category = 'linux',
-        short_name = 'lox',
+        category = "linux",
+        short_name = "lox",
     ),
-    triggered_by = [builder_name('linux-ozone-rel')],
+    triggered_by = [builder_name("linux-ozone-rel")],
 )
 
-
 ci.mac_builder(
-    name = 'Mac Builder',
+    name = "Mac Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'bld',
+        category = "release",
+        short_name = "bld",
     ),
     os = os.MAC_10_15,
 )
 
 ci.mac_builder(
-    name = 'Mac Builder (dbg)',
+    name = "Mac Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug',
-        short_name = 'bld',
+        category = "debug",
+        short_name = "bld",
     ),
     os = os.MAC_ANY,
 )
 
 ci.thin_tester(
-    name = 'Mac10.10 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.10 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '10',
+        category = "release",
+        short_name = "10",
     ),
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.11 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.11 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '11',
+        category = "release",
+        short_name = "11",
     ),
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.12 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.12 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '12',
+        category = "release",
+        short_name = "12",
     ),
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.13 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.13 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '13',
+        category = "release",
+        short_name = "13",
     ),
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.14 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.14 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '14',
+        category = "release",
+        short_name = "14",
     ),
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.15 Tests',
-    mastername = 'chromium.mac',
+    name = "Mac10.15 Tests",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = '15',
+        category = "release",
+        short_name = "15",
     ),
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
 ci.thin_tester(
-    name = 'Mac10.13 Tests (dbg)',
-    mastername = 'chromium.mac',
+    name = "Mac10.13 Tests (dbg)",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'debug',
-        short_name = '13',
+        category = "debug",
+        short_name = "13",
     ),
-    triggered_by = [builder_name('Mac Builder (dbg)')],
+    triggered_by = [builder_name("Mac Builder (dbg)")],
 )
 
 ci.thin_tester(
-    name = 'WebKit Mac10.13 (retina)',
-    mastername = 'chromium.mac',
+    name = "WebKit Mac10.13 (retina)",
+    mastername = "chromium.mac",
     console_view_entry = ci.console_view_entry(
-        category = 'release',
-        short_name = 'ret',
+        category = "release",
+        short_name = "ret",
     ),
-    triggered_by = [builder_name('Mac Builder')],
+    triggered_by = [builder_name("Mac Builder")],
 )
 
-
 ci.mac_ios_builder(
-    name = 'ios-simulator',
+    name = "ios-simulator",
     console_view_entry = ci.console_view_entry(
-        category = 'ios|default',
-        short_name = 'sim',
+        category = "ios|default",
+        short_name = "sim",
     ),
 )
 
 ci.mac_ios_builder(
-    name = 'ios-simulator-full-configs',
+    name = "ios-simulator-full-configs",
     console_view_entry = ci.console_view_entry(
-        category = 'ios|default',
-        short_name = 'ful',
+        category = "ios|default",
+        short_name = "ful",
     ),
 )
 
-
 ci.memory_builder(
-    name = 'Linux ASan LSan Builder',
+    name = "Linux ASan LSan Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|asan lsan',
-        short_name = 'bld',
+        category = "linux|asan lsan",
+        short_name = "bld",
     ),
     ssd = True,
 )
 
 ci.memory_builder(
-    name = 'Linux ASan LSan Tests (1)',
+    name = "Linux ASan LSan Tests (1)",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|asan lsan',
-        short_name = 'tst',
+        category = "linux|asan lsan",
+        short_name = "tst",
     ),
-    triggered_by = [builder_name('Linux ASan LSan Builder')],
+    triggered_by = [builder_name("Linux ASan LSan Builder")],
 )
 
 ci.memory_builder(
-    name = 'Linux ASan Tests (sandboxed)',
+    name = "Linux ASan Tests (sandboxed)",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|asan lsan',
-        short_name = 'sbx',
+        category = "linux|asan lsan",
+        short_name = "sbx",
     ),
-    triggered_by = [builder_name('Linux ASan LSan Builder')],
+    triggered_by = [builder_name("Linux ASan LSan Builder")],
 )
 
 ci.memory_builder(
-    name = 'Linux TSan Builder',
+    name = "Linux TSan Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|TSan v2',
-        short_name = 'bld',
+        category = "linux|TSan v2",
+        short_name = "bld",
     ),
 )
 
 ci.memory_builder(
-    name = 'Linux TSan Tests',
+    name = "Linux TSan Tests",
     console_view_entry = ci.console_view_entry(
-        category = 'linux|TSan v2',
-        short_name = 'tst',
+        category = "linux|TSan v2",
+        short_name = "tst",
     ),
-    triggered_by = [builder_name('Linux TSan Builder')],
+    triggered_by = [builder_name("Linux TSan Builder")],
 )
 
-
 ci.win_builder(
-    name = 'Win7 Tests (dbg)(1)',
+    name = "Win7 Tests (dbg)(1)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|tester',
-        short_name = '7',
+        category = "debug|tester",
+        short_name = "7",
     ),
     os = os.WINDOWS_7,
-    triggered_by = [builder_name('Win Builder (dbg)')],
+    triggered_by = [builder_name("Win Builder (dbg)")],
 )
 
 ci.win_builder(
-    name = 'Win 7 Tests x64 (1)',
+    name = "Win 7 Tests x64 (1)",
     console_view_entry = ci.console_view_entry(
-        category = 'release|tester',
-        short_name = '64',
+        category = "release|tester",
+        short_name = "64",
     ),
     os = os.WINDOWS_7,
-    triggered_by = [builder_name('Win x64 Builder')],
+    triggered_by = [builder_name("Win x64 Builder")],
 )
 
 ci.win_builder(
-    name = 'Win Builder (dbg)',
+    name = "Win Builder (dbg)",
     console_view_entry = ci.console_view_entry(
-        category = 'debug|builder',
-        short_name = '32',
+        category = "debug|builder",
+        short_name = "32",
     ),
     cores = 32,
     os = os.WINDOWS_ANY,
 )
 
 ci.win_builder(
-    name = 'Win x64 Builder',
+    name = "Win x64 Builder",
     console_view_entry = ci.console_view_entry(
-        category = 'release|builder',
-        short_name = '64',
+        category = "release|builder",
+        short_name = "64",
     ),
     cores = 32,
     os = os.WINDOWS_ANY,
 )
 
 ci.win_builder(
-    name = 'Win10 Tests x64',
+    name = "Win10 Tests x64",
     console_view_entry = ci.console_view_entry(
-        category = 'release|tester',
-        short_name = 'w10',
+        category = "release|tester",
+        short_name = "w10",
     ),
-    triggered_by = [builder_name('Win x64 Builder')],
+    triggered_by = [builder_name("Win x64 Builder")],
 )
diff --git a/infra/config/subprojects/chromium/versioned/m85/buckets/try.star b/infra/config/subprojects/chromium/versioned/m85/buckets/try.star
index 64f9daf..83c435e 100644
--- a/infra/config/subprojects/chromium/versioned/m85/buckets/try.star
+++ b/infra/config/subprojects/chromium/versioned/m85/buckets/try.star
@@ -2,12 +2,12 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'cpu', 'goma', 'os')
-load('//lib/try.star', 'try_')
+load("//lib/builders.star", "goma", "os")
+load("//lib/try.star", "try_")
+
 # Load this using relative path so that the load statement doesn't
 # need to be changed when making a new milestone
-load('../vars.star', 'vars')
-
+load("../vars.star", "vars")
 
 try_.declare_bucket(vars)
 
@@ -16,80 +16,78 @@
     main_list_view = vars.main_list_view_name,
 )
 
-
 # Builders are sorted first lexicographically by the function used to define
 # them, then lexicographically by their name
 
-
 try_.blink_builder(
-    name = 'linux-blink-rel',
+    name = "linux-blink-rel",
     goma_backend = goma.backend.RBE_PROD,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/cc/.+',
-            '.+/[+]/third_party/blink/renderer/core/paint/.+',
-            '.+/[+]/third_party/blink/renderer/core/svg/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
+            ".+/[+]/cc/.+",
+            ".+/[+]/third_party/blink/renderer/core/paint/.+",
+            ".+/[+]/third_party/blink/renderer/core/svg/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/.+",
         ],
     ),
 )
 
 try_.chromium_builder(
-    name = 'android-official',
+    name = "android-official",
 )
 
 try_.chromium_builder(
-    name = 'fuchsia-official',
+    name = "fuchsia-official",
 )
 
 try_.chromium_builder(
-    name = 'linux-official',
+    name = "linux-official",
 )
 
 try_.chromium_android_builder(
-    name = 'android-binary-size',
-    executable = 'recipe:binary_size_trybot',
+    name = "android-binary-size",
+    executable = "recipe:binary_size_trybot",
     goma_jobs = goma.jobs.J150,
     properties = {
-      '$build/binary_size': {
-        'analyze_targets': [
-          '//chrome/android:validate_expectations',
-          '//chrome/android:monochrome_public_minimal_apks',
-          '//tools/binary_size:binary_size_trybot_py',
-        ],
-        'compile_targets': [
-          'monochrome_public_minimal_apks',
-          'monochrome_static_initializers',
-          'validate_expectations',
-        ],
-      },
+        "$build/binary_size": {
+            "analyze_targets": [
+                "//chrome/android:validate_expectations",
+                "//chrome/android:monochrome_public_minimal_apks",
+                "//tools/binary_size:binary_size_trybot_py",
+            ],
+            "compile_targets": [
+                "monochrome_public_minimal_apks",
+                "monochrome_static_initializers",
+                "validate_expectations",
+            ],
+        },
     },
     tryjob = try_.job(),
 )
 
 try_.chromium_android_builder(
-    name = 'android-cronet-arm-dbg',
+    name = "android-cronet-arm-dbg",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/components/cronet/.+',
-            '.+/[+]/components/grpc_support/.+',
-            '.+/[+]/build/android/.+',
-            '.+/[+]/build/config/android/.+',
+            ".+/[+]/components/cronet/.+",
+            ".+/[+]/components/grpc_support/.+",
+            ".+/[+]/build/android/.+",
+            ".+/[+]/build/config/android/.+",
         ],
         location_regexp_exclude = [
-            '.+/[+]/components/cronet/ios/.+',
+            ".+/[+]/components/cronet/ios/.+",
         ],
     ),
 )
 
 try_.chromium_android_builder(
-    name = 'android-lollipop-arm-rel',
+    name = "android-lollipop-arm-rel",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(),
 )
 
 try_.chromium_android_builder(
-    name = 'android-marshmallow-arm64-rel',
+    name = "android-marshmallow-arm64-rel",
     cores = 16,
     goma_jobs = goma.jobs.J300,
     ssd = True,
@@ -98,34 +96,34 @@
 )
 
 try_.chromium_android_builder(
-    name = 'android-marshmallow-x86-rel',
+    name = "android-marshmallow-x86-rel",
     goma_jobs = goma.jobs.J150,
 )
 
 try_.chromium_android_builder(
-    name = 'android-nougat-arm64-rel',
+    name = "android-nougat-arm64-rel",
     goma_jobs = goma.jobs.J150,
 )
 
 try_.chromium_android_builder(
-    name = 'android-pie-arm64-dbg',
+    name = "android-pie-arm64-dbg",
     goma_jobs = goma.jobs.J300,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/android/features/vr/.+',
-            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/android/javatests/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/third_party/gvr-android-sdk/.+',
-            '.+/[+]/third_party/arcore-android-sdk/.+',
-            '.+/[+]/third_party/arcore-android-sdk-client/.+',
+            ".+/[+]/chrome/android/features/vr/.+",
+            ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+",
+            ".+/[+]/chrome/android/javatests/src/org/chromium/chrome/browser/vr/.+",
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/third_party/gvr-android-sdk/.+",
+            ".+/[+]/third_party/arcore-android-sdk/.+",
+            ".+/[+]/third_party/arcore-android-sdk-client/.+",
         ],
     ),
 )
 
 try_.chromium_android_builder(
-    name = 'android-pie-arm64-rel',
+    name = "android-pie-arm64-rel",
     cores = 16,
     goma_jobs = goma.jobs.J300,
     ssd = True,
@@ -133,184 +131,181 @@
 )
 
 try_.chromium_android_builder(
-    name = 'android_compile_dbg',
+    name = "android_compile_dbg",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(),
 )
 
 try_.chromium_android_builder(
-    name = 'android_compile_x64_dbg',
+    name = "android_compile_x64_dbg",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+',
-            '.+/[+]/sandbox/linux/system_headers/.+',
-            '.+/[+]/sandbox/linux/tests/.+',
-            '.+/[+]/third_party/gvr-android-sdk/.+',
+            ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+",
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/sandbox/linux/seccomp-bpf/.+",
+            ".+/[+]/sandbox/linux/seccomp-bpf-helpers/.+",
+            ".+/[+]/sandbox/linux/system_headers/.+",
+            ".+/[+]/sandbox/linux/tests/.+",
+            ".+/[+]/third_party/gvr-android-sdk/.+",
         ],
     ),
 )
 
 try_.chromium_android_builder(
-    name = 'android_compile_x86_dbg',
+    name = "android_compile_x86_dbg",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf/.+',
-            '.+/[+]/sandbox/linux/seccomp-bpf-helpers/.+',
-            '.+/[+]/sandbox/linux/system_headers/.+',
-            '.+/[+]/sandbox/linux/tests/.+',
-            '.+/[+]/third_party/gvr-android-sdk/.+',
+            ".+/[+]/chrome/android/java/src/org/chromium/chrome/browser/vr/.+",
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/sandbox/linux/seccomp-bpf/.+",
+            ".+/[+]/sandbox/linux/seccomp-bpf-helpers/.+",
+            ".+/[+]/sandbox/linux/system_headers/.+",
+            ".+/[+]/sandbox/linux/tests/.+",
+            ".+/[+]/third_party/gvr-android-sdk/.+",
         ],
     ),
 )
 
 try_.chromium_android_builder(
-    name = 'android_cronet',
+    name = "android_cronet",
     tryjob = try_.job(),
 )
 
 try_.chromium_android_builder(
-    name = 'cast_shell_android',
+    name = "cast_shell_android",
     tryjob = try_.job(),
 )
 
-
 try_.chromium_chromiumos_builder(
-    name = 'chromeos-amd64-generic-dbg',
+    name = "chromeos-amd64-generic-dbg",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/content/gpu/.+',
-            '.+/[+]/media/.+',
+            ".+/[+]/content/gpu/.+",
+            ".+/[+]/media/.+",
         ],
     ),
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'chromeos-amd64-generic-rel',
+    name = "chromeos-amd64-generic-rel",
     tryjob = try_.job(),
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'chromeos-arm-generic-rel',
+    name = "chromeos-arm-generic-rel",
     tryjob = try_.job(),
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'linux-chromeos-compile-dbg',
+    name = "linux-chromeos-compile-dbg",
     tryjob = try_.job(),
 )
 
 try_.chromium_chromiumos_builder(
-    name = 'linux-chromeos-rel',
+    name = "linux-chromeos-rel",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(cancel_stale = False),
     use_clang_coverage = True,
 )
 
-
 try_.chromium_dawn_builder(
-    name = 'dawn-linux-x64-deps-rel',
+    name = "dawn-linux-x64-deps-rel",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
+            ".+/[+]/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.dawn.json",
+            ".+/[+]/third_party/blink/renderer/modules/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/WebGPUExpectations",
+            ".+/[+]/third_party/dawn/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/features.gni",
         ],
     ),
 )
 
 try_.chromium_dawn_builder(
-    name = 'dawn-mac-x64-deps-rel',
+    name = "dawn-mac-x64-deps-rel",
     os = os.MAC_ANY,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
+            ".+/[+]/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.dawn.json",
+            ".+/[+]/third_party/blink/renderer/modules/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/WebGPUExpectations",
+            ".+/[+]/third_party/dawn/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/features.gni",
         ],
     ),
 )
 
 try_.chromium_dawn_builder(
-    name = 'dawn-win10-x64-deps-rel',
+    name = "dawn-win10-x64-deps-rel",
     os = os.WINDOWS_ANY,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
+            ".+/[+]/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.dawn.json",
+            ".+/[+]/third_party/blink/renderer/modules/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/WebGPUExpectations",
+            ".+/[+]/third_party/dawn/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/features.gni",
         ],
     ),
 )
 
 try_.chromium_dawn_builder(
-    name = 'dawn-win10-x86-deps-rel',
+    name = "dawn-win10-x86-deps-rel",
     os = os.WINDOWS_ANY,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.dawn.json',
-            '.+/[+]/third_party/blink/renderer/modules/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+',
-            '.+/[+]/third_party/blink/web_tests/WebGPUExpectations',
-            '.+/[+]/third_party/dawn/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/features.gni',
+            ".+/[+]/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.dawn.json",
+            ".+/[+]/third_party/blink/renderer/modules/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/external/wpt/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/wpt_internal/webgpu/.+",
+            ".+/[+]/third_party/blink/web_tests/WebGPUExpectations",
+            ".+/[+]/third_party/dawn/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/features.gni",
         ],
     ),
 )
 
-
 try_.chromium_linux_builder(
-    name = 'cast_shell_linux',
+    name = "cast_shell_linux",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'closure_compilation',
-    executable = 'recipe:closure_compilation',
+    name = "closure_compilation",
+    executable = "recipe:closure_compilation",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/third_party/closure_compiler/.+',
+            ".+/[+]/third_party/closure_compiler/.+",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'chromium_presubmit',
-    executable = 'recipe:presubmit',
+    name = "chromium_presubmit",
+    executable = "recipe:presubmit",
     goma_backend = None,
     properties = {
-        '$depot_tools/presubmit': {
-            'runhooks': True,
-            'timeout_s': 480,
+        "$depot_tools/presubmit": {
+            "runhooks": True,
+            "timeout_s": 480,
         },
-        'repo_name': 'chromium',
+        "repo_name": "chromium",
     },
     tryjob = try_.job(
         disable_reuse = True,
@@ -319,16 +314,16 @@
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia-arm64-cast',
+    name = "fuchsia-arm64-cast",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chromecast/.+',
+            ".+/[+]/chromecast/.+",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia-x64-cast',
+    name = "fuchsia-x64-cast",
     tryjob = try_.job(),
 )
 
@@ -336,48 +331,48 @@
 # The experiment percentage is used to ramp up the test load while
 # monitoring stability and capacity.  crbug.com/1042511
 try_.chromium_linux_builder(
-    name = 'fuchsia_arm64',
+    name = "fuchsia_arm64",
     tryjob = try_.job(
-      experiment_percentage=50,
+        experiment_percentage = 50,
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'fuchsia_x64',
+    name = "fuchsia_x64",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-libfuzzer-asan-rel',
-    executable = 'recipe:chromium_libfuzzer_trybot',
+    name = "linux-libfuzzer-asan-rel",
+    executable = "recipe:chromium_libfuzzer_trybot",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-ozone-rel',
+    name = "linux-ozone-rel",
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux-rel',
+    name = "linux-rel",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(),
     use_clang_coverage = True,
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_asan_rel_ng',
+    name = "linux_chromium_asan_rel_ng",
     goma_jobs = goma.jobs.J150,
     ssd = True,
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_compile_dbg_ng',
+    name = "linux_chromium_compile_dbg_ng",
     caches = [
         swarming.cache(
-            name = 'builder',
-            path = 'linux_debug',
+            name = "builder",
+            path = "linux_debug",
         ),
     ],
     goma_jobs = goma.jobs.J150,
@@ -385,131 +380,128 @@
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_dbg_ng',
+    name = "linux_chromium_dbg_ng",
     caches = [
         swarming.cache(
-            name = 'builder',
-            path = 'linux_debug',
+            name = "builder",
+            path = "linux_debug",
         ),
     ],
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/build/.*check_gn_headers.*',
+            ".+/[+]/build/.*check_gn_headers.*",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_chromium_tsan_rel_ng',
+    name = "linux_chromium_tsan_rel_ng",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_layout_tests_composite_after_paint',
+    name = "linux_layout_tests_composite_after_paint",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/third_party/blink/renderer/core/paint/.+',
-            '.+/[+]/third_party/blink/renderer/core/svg/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
-            '.+/[+]/third_party/blink/web_tests/.+',
+            ".+/[+]/third_party/blink/renderer/core/paint/.+",
+            ".+/[+]/third_party/blink/renderer/core/svg/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/.+",
+            ".+/[+]/third_party/blink/web_tests/.+",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_layout_tests_layout_ng_disabled',
+    name = "linux_layout_tests_layout_ng_disabled",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/third_party/blink/renderer/core/editing/.+',
-            '.+/[+]/third_party/blink/renderer/core/layout/.+',
-            '.+/[+]/third_party/blink/renderer/core/paint/.+',
-            '.+/[+]/third_party/blink/renderer/core/svg/.+',
-            '.+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/.+',
-            '.+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng',
-            '.+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+',
+            ".+/[+]/third_party/blink/renderer/core/editing/.+",
+            ".+/[+]/third_party/blink/renderer/core/layout/.+",
+            ".+/[+]/third_party/blink/renderer/core/paint/.+",
+            ".+/[+]/third_party/blink/renderer/core/svg/.+",
+            ".+/[+]/third_party/blink/renderer/platform/fonts/shaping/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/.+",
+            ".+/[+]/third_party/blink/web_tests/FlagExpectations/disable-layout-ng",
+            ".+/[+]/third_party/blink/web_tests/flag-specific/disable-layout-ng/.+",
         ],
     ),
 )
 
 try_.chromium_linux_builder(
-    name = 'linux_vr',
+    name = "linux_vr",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
         ],
     ),
 )
 
-
 try_.chromium_mac_builder(
-    name = 'mac-rel',
+    name = "mac-rel",
     goma_jobs = goma.jobs.J150,
     os = os.MAC_10_13,
     tryjob = try_.job(),
 )
 
 try_.chromium_mac_builder(
-    name = 'mac_chromium_compile_dbg_ng',
+    name = "mac_chromium_compile_dbg_ng",
     goma_jobs = goma.jobs.J150,
     os = os.MAC_10_13,
     tryjob = try_.job(),
 )
 
-
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator',
-    executable = 'recipe:chromium_trybot',
+    name = "ios-simulator",
+    executable = "recipe:chromium_trybot",
     properties = {
-        'xcode_build_version': '11e146',
+        "xcode_build_version": "11e146",
     },
     tryjob = try_.job(),
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator-cronet',
-    executable = 'recipe:chromium_trybot',
+    name = "ios-simulator-cronet",
+    executable = "recipe:chromium_trybot",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/components/cronet/.+',
-            '.+/[+]/components/grpc_support/.+',
-            '.+/[+]/ios/.+',
+            ".+/[+]/components/cronet/.+",
+            ".+/[+]/components/grpc_support/.+",
+            ".+/[+]/ios/.+",
         ],
         location_regexp_exclude = [
-            '.+/[+]/components/cronet/android/.+',
+            ".+/[+]/components/cronet/android/.+",
         ],
     ),
 )
 
 try_.chromium_mac_ios_builder(
-    name = 'ios-simulator-full-configs',
-    executable = 'recipe:chromium_trybot',
+    name = "ios-simulator-full-configs",
+    executable = "recipe:chromium_trybot",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/ios/.+',
+            ".+/[+]/ios/.+",
         ],
     ),
 )
 
-
 try_.chromium_win_builder(
-    name = 'win-libfuzzer-asan-rel',
+    name = "win-libfuzzer-asan-rel",
     builderless = False,
-    executable = 'recipe:chromium_libfuzzer_trybot',
+    executable = "recipe:chromium_libfuzzer_trybot",
     os = os.WINDOWS_ANY,
     tryjob = try_.job(cancel_stale = False),
 )
 
 try_.chromium_win_builder(
-    name = 'win_chromium_compile_dbg_ng',
+    name = "win_chromium_compile_dbg_ng",
     goma_jobs = goma.jobs.J150,
     tryjob = try_.job(cancel_stale = False),
 )
 
 try_.chromium_win_builder(
-    name = 'win10_chromium_x64_rel_ng',
+    name = "win10_chromium_x64_rel_ng",
     goma_jobs = goma.jobs.J150,
     os = os.WINDOWS_10,
     ssd = True,
@@ -517,98 +509,94 @@
     tryjob = try_.job(cancel_stale = False),
 )
 
-
 try_.gpu_chromium_android_builder(
-    name = 'android_optional_gpu_tests_rel',
+    name = "android_optional_gpu_tests_rel",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/cc/.+',
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/components/viz/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/services/viz/.+',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
+            ".+/[+]/cc/.+",
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/components/viz/.+",
+            ".+/[+]/content/test/gpu/.+",
+            ".+/[+]/gpu/.+",
+            ".+/[+]/media/audio/.+",
+            ".+/[+]/media/filters/.+",
+            ".+/[+]/media/gpu/.+",
+            ".+/[+]/services/viz/.+",
+            ".+/[+]/testing/trigger_scripts/.+",
+            ".+/[+]/third_party/blink/renderer/modules/webgl/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/.+",
         ],
     ),
 )
 
-
 try_.gpu_chromium_linux_builder(
-    name = 'linux_optional_gpu_tests_rel',
+    name = "linux_optional_gpu_tests_rel",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/content/test/gpu/.+",
+            ".+/[+]/gpu/.+",
+            ".+/[+]/media/audio/.+",
+            ".+/[+]/media/filters/.+",
+            ".+/[+]/media/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.gpu.fyi.json",
+            ".+/[+]/testing/trigger_scripts/.+",
+            ".+/[+]/third_party/blink/renderer/modules/webgl/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/.+",
         ],
     ),
 )
 
-
 try_.gpu_chromium_mac_builder(
-    name = 'mac_optional_gpu_tests_rel',
+    name = "mac_optional_gpu_tests_rel",
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/services/shape_detection/.+',
-            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/content/test/gpu/.+",
+            ".+/[+]/gpu/.+",
+            ".+/[+]/media/audio/.+",
+            ".+/[+]/media/filters/.+",
+            ".+/[+]/media/gpu/.+",
+            ".+/[+]/services/shape_detection/.+",
+            ".+/[+]/testing/buildbot/chromium.gpu.fyi.json",
+            ".+/[+]/testing/trigger_scripts/.+",
+            ".+/[+]/third_party/blink/renderer/modules/webgl/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/.+",
         ],
     ),
 )
 
-
 try_.gpu_chromium_win_builder(
-    name = 'win_optional_gpu_tests_rel',
+    name = "win_optional_gpu_tests_rel",
     builderless = True,
     os = os.WINDOWS_DEFAULT,
     tryjob = try_.job(
         location_regexp = [
-            '.+/[+]/chrome/browser/vr/.+',
-            '.+/[+]/content/browser/xr/.+',
-            '.+/[+]/content/test/gpu/.+',
-            '.+/[+]/device/vr/.+',
-            '.+/[+]/gpu/.+',
-            '.+/[+]/media/audio/.+',
-            '.+/[+]/media/filters/.+',
-            '.+/[+]/media/gpu/.+',
-            '.+/[+]/testing/buildbot/chromium.gpu.fyi.json',
-            '.+/[+]/testing/trigger_scripts/.+',
-            '.+/[+]/third_party/blink/renderer/modules/vr/.+',
-            '.+/[+]/third_party/blink/renderer/modules/webgl/.+',
-            '.+/[+]/third_party/blink/renderer/modules/xr/.+',
-            '.+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+',
-            '.+/[+]/tools/clang/scripts/update.py',
-            '.+/[+]/ui/gl/.+',
+            ".+/[+]/chrome/browser/vr/.+",
+            ".+/[+]/content/browser/xr/.+",
+            ".+/[+]/content/test/gpu/.+",
+            ".+/[+]/device/vr/.+",
+            ".+/[+]/gpu/.+",
+            ".+/[+]/media/audio/.+",
+            ".+/[+]/media/filters/.+",
+            ".+/[+]/media/gpu/.+",
+            ".+/[+]/testing/buildbot/chromium.gpu.fyi.json",
+            ".+/[+]/testing/trigger_scripts/.+",
+            ".+/[+]/third_party/blink/renderer/modules/vr/.+",
+            ".+/[+]/third_party/blink/renderer/modules/webgl/.+",
+            ".+/[+]/third_party/blink/renderer/modules/xr/.+",
+            ".+/[+]/third_party/blink/renderer/platform/graphics/gpu/.+",
+            ".+/[+]/tools/clang/scripts/update.py",
+            ".+/[+]/ui/gl/.+",
         ],
     ),
 )
@@ -617,38 +605,38 @@
 # adding them to chromium's cr-buildbucket.cfg. Note that the recipe these
 # builders run allow only known roller accounts when triggered via the CQ.
 def chrome_internal_verifier(
-    *,
-    builder):
-  luci.cq_tryjob_verifier(
-      builder = 'chrome:try/' + builder,
-      cq_group = vars.cq_group,
-      includable_only = True,
-      owner_whitelist = [
-          "googlers",
-          "project-chromium-robot-committers",
-      ],
-  )
+        *,
+        builder):
+    luci.cq_tryjob_verifier(
+        builder = "chrome:try/" + builder,
+        cq_group = vars.cq_group,
+        includable_only = True,
+        owner_whitelist = [
+            "googlers",
+            "project-chromium-robot-committers",
+        ],
+    )
 
 chrome_internal_verifier(
-    builder = 'mac-chrome-beta',
+    builder = "mac-chrome-beta",
 )
 
 chrome_internal_verifier(
-    builder = 'mac-chrome-stable',
+    builder = "mac-chrome-stable",
 )
 
 chrome_internal_verifier(
-    builder = 'win-chrome-beta',
+    builder = "win-chrome-beta",
 )
 
 chrome_internal_verifier(
-    builder = 'win-chrome-stable',
+    builder = "win-chrome-stable",
 )
 
 chrome_internal_verifier(
-    builder = 'win64-chrome-beta',
+    builder = "win64-chrome-beta",
 )
 
 chrome_internal_verifier(
-    builder = 'win64-chrome-stable',
+    builder = "win64-chrome-stable",
 )
diff --git a/infra/config/subprojects/chromium/versioned/m85/vars.star b/infra/config/subprojects/chromium/versioned/m85/vars.star
index 05d16dc..153c0b8 100644
--- a/infra/config/subprojects/chromium/versioned/m85/vars.star
+++ b/infra/config/subprojects/chromium/versioned/m85/vars.star
@@ -4,18 +4,18 @@
 
 vars = struct(
     is_master = False,
-    ref = 'refs/branch-heads/4183',
-    ci_bucket = 'ci-m85',
-    ci_poller = 'm85-gitiles-trigger',
-    main_console_name = 'main-m85',
-    main_console_title = 'Chromium M85 Console',
-    cq_mirrors_console_name = 'mirrors-m85',
-    cq_mirrors_console_title = 'Chromium M85 CQ Mirrors Console',
-    try_bucket = 'try-m85',
+    ref = "refs/branch-heads/4183",
+    ci_bucket = "ci-m85",
+    ci_poller = "m85-gitiles-trigger",
+    main_console_name = "main-m85",
+    main_console_title = "Chromium M85 Console",
+    cq_mirrors_console_name = "mirrors-m85",
+    cq_mirrors_console_title = "Chromium M85 CQ Mirrors Console",
+    try_bucket = "try-m85",
     try_triggering_projects = [],
-    cq_group = 'cq-m85',
-    cq_ref_regexp = 'refs/branch-heads/4183',
-    main_list_view_name = 'try-m85',
-    main_list_view_title = 'Chromium M85 CQ console',
+    cq_group = "cq-m85",
+    cq_ref_regexp = "refs/branch-heads/4183",
+    main_list_view_name = "try-m85",
+    main_list_view_title = "Chromium M85 CQ console",
     tree_status_host = None,
 )
diff --git a/infra/config/subprojects/codesearch/codesearch.star b/infra/config/subprojects/codesearch/codesearch.star
index fa775de..12c3a75 100644
--- a/infra/config/subprojects/codesearch/codesearch.star
+++ b/infra/config/subprojects/codesearch/codesearch.star
@@ -2,73 +2,71 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'cpu', 'goma', 'os')
-load('//lib/try.star', 'try_')
+load("//lib/builders.star", "cpu", "goma", "os")
+load("//lib/try.star", "try_")
 
 luci.bucket(
-    name = 'codesearch',
+    name = "codesearch",
     acls = [
         acl.entry(
             roles = acl.BUILDBUCKET_READER,
-            groups = 'all',
+            groups = "all",
         ),
         acl.entry(
             roles = acl.BUILDBUCKET_TRIGGERER,
-            groups = 'project-chromium-tryjob-access',
+            groups = "project-chromium-tryjob-access",
         ),
         acl.entry(
             roles = acl.BUILDBUCKET_OWNER,
-            groups = 'service-account-chromium-tryserver',
+            groups = "service-account-chromium-tryserver",
         ),
     ],
 )
 
-try_.defaults.bucket.set('codesearch')
+try_.defaults.bucket.set("codesearch")
 try_.defaults.build_numbers.set(True)
 try_.defaults.builderless.set(True)
 try_.defaults.cores.set(8)
 try_.defaults.cpu.set(cpu.X86_64)
-try_.defaults.cq_group.set('cq')
-try_.defaults.executable.set('recipe:chromium_codesearch')
+try_.defaults.cq_group.set("cq")
+try_.defaults.executable.set("recipe:chromium_codesearch")
 try_.defaults.execution_timeout.set(9 * time.hour)
 try_.defaults.expiration_timeout.set(2 * time.hour)
 try_.defaults.goma_backend.set(goma.backend.RBE_PROD)
-try_.defaults.mastername.set('tryserver.chromium.codesearch')
+try_.defaults.mastername.set("tryserver.chromium.codesearch")
 try_.defaults.os.set(os.LINUX_DEFAULT)
-try_.defaults.pool.set('luci.chromium.try')
-try_.defaults.service_account.set('chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com')
-try_.defaults.swarming_tags.set(['vpython:native-python-wrapper'])
+try_.defaults.pool.set("luci.chromium.try")
+try_.defaults.service_account.set("chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com")
+try_.defaults.swarming_tags.set(["vpython:native-python-wrapper"])
 
 try_.defaults.caches.set([
     swarming.cache(
-        name = 'win_toolchain',
-        path = 'win_toolchain',
+        name = "win_toolchain",
+        path = "win_toolchain",
     ),
 ])
 
 try_.builder(
-    name = 'gen-android-try',
+    name = "gen-android-try",
 )
 
 try_.builder(
-    name = 'gen-chromiumos-try',
+    name = "gen-chromiumos-try",
 )
 
 try_.builder(
-    name = 'gen-fuchsia-try',
+    name = "gen-fuchsia-try",
 )
 
 try_.builder(
-    name = 'gen-lacros-try',
+    name = "gen-lacros-try",
 )
 
 try_.builder(
-    name = 'gen-linux-try',
+    name = "gen-linux-try",
 )
 
 try_.builder(
-    name = 'gen-win-try',
+    name = "gen-win-try",
     os = os.WINDOWS_10,
 )
-
-
diff --git a/infra/config/subprojects/codesearch/consoles/luci.chromium.codesearch.star b/infra/config/subprojects/codesearch/consoles/luci.chromium.codesearch.star
index 0f611dd..2ffecb1 100644
--- a/infra/config/subprojects/codesearch/consoles/luci.chromium.codesearch.star
+++ b/infra/config/subprojects/codesearch/consoles/luci.chromium.codesearch.star
@@ -3,13 +3,13 @@
 # found in the LICENSE file.
 
 luci.list_view(
-    name = 'luci.chromium.codesearch',
+    name = "luci.chromium.codesearch",
     entries = [
-      'codesearch/gen-android-try',
-      'codesearch/gen-chromiumos-try',
-      'codesearch/gen-fuchsia-try',
-      'codesearch/gen-lacros-try',
-      'codesearch/gen-linux-try',
-      'codesearch/gen-win-try',
+        "codesearch/gen-android-try",
+        "codesearch/gen-chromiumos-try",
+        "codesearch/gen-fuchsia-try",
+        "codesearch/gen-lacros-try",
+        "codesearch/gen-linux-try",
+        "codesearch/gen-win-try",
     ],
 )
diff --git a/infra/config/subprojects/codesearch/subproject.star b/infra/config/subprojects/codesearch/subproject.star
index 5d0abe28..6532b7882 100644
--- a/infra/config/subprojects/codesearch/subproject.star
+++ b/infra/config/subprojects/codesearch/subproject.star
@@ -2,6 +2,5 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-exec('./codesearch.star')
-exec('./consoles/luci.chromium.codesearch.star')
-
+exec("./codesearch.star")
+exec("./consoles/luci.chromium.codesearch.star")
diff --git a/infra/config/subprojects/findit/consoles/findit.star b/infra/config/subprojects/findit/consoles/findit.star
index b914b7e..f243604e 100644
--- a/infra/config/subprojects/findit/consoles/findit.star
+++ b/infra/config/subprojects/findit/consoles/findit.star
@@ -3,10 +3,10 @@
 # found in the LICENSE file.
 
 luci.list_view(
-    name = 'findit',
+    name = "findit",
     entries = [
-        'findit/findit-rerun',
-        'findit/findit_variable',
-        'findit/linux_chromium_bot_db_exporter',
+        "findit/findit-rerun",
+        "findit/findit_variable",
+        "findit/linux_chromium_bot_db_exporter",
     ],
 )
diff --git a/infra/config/subprojects/findit/findit.star b/infra/config/subprojects/findit/findit.star
index 0fb79e5..a9d98d88 100644
--- a/infra/config/subprojects/findit/findit.star
+++ b/infra/config/subprojects/findit/findit.star
@@ -2,51 +2,49 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'builder', 'defaults', 'goma', 'os')
+load("//lib/builders.star", "builder", "defaults", "goma", "os")
 
 luci.bucket(
-    name = 'findit',
+    name = "findit",
     acls = [
         acl.entry(
             roles = acl.BUILDBUCKET_READER,
-            groups = 'googlers',
-            users = 'findit-builder@chops-service-accounts.iam.gserviceaccount.com',
+            groups = "googlers",
+            users = "findit-builder@chops-service-accounts.iam.gserviceaccount.com",
         ),
         acl.entry(
             roles = acl.BUILDBUCKET_TRIGGERER,
-            groups = 'findit-tryjob-access',
-            users = 'luci-scheduler@appspot.gserviceaccount.com',
+            groups = "findit-tryjob-access",
+            users = "luci-scheduler@appspot.gserviceaccount.com",
         ),
     ],
 )
 
 defaults.auto_builder_dimension.set(False)
-defaults.bucket.set('findit')
+defaults.bucket.set("findit")
 defaults.build_numbers.set(True)
 defaults.builderless.set(True)
 defaults.ssd.set(True)
 defaults.configure_kitchen.set(True)
 defaults.execution_timeout.set(8 * time.hour)
-defaults.pool.set('luci.chromium.findit')
-defaults.service_account.set('findit-builder@chops-service-accounts.iam.gserviceaccount.com')
-defaults.swarming_tags.set(['vpython:native-python-wrapper'])
+defaults.pool.set("luci.chromium.findit")
+defaults.service_account.set("findit-builder@chops-service-accounts.iam.gserviceaccount.com")
+defaults.swarming_tags.set(["vpython:native-python-wrapper"])
 
 defaults.caches.set([
     swarming.cache(
-        name = 'win_toolchain',
-        path = 'win_toolchain',
+        name = "win_toolchain",
+        path = "win_toolchain",
     ),
 ])
 
-
 # Builders are defined in lexicographic order by name
 
-
 # Same as findit_variable, except now with a specified recipe, as this is no
 # longer overridable with Buildbucket V2
 builder(
-    name = 'findit-rerun',
-    executable = 'recipe:findit/chromium/single_revision',
+    name = "findit-rerun",
+    executable = "recipe:findit/chromium/single_revision",
     goma_backend = goma.backend.RBE_PROD,
 )
 
@@ -59,21 +57,21 @@
 #   after they have been configured to use this generic builder, as well as
 #   the findit 'mixin'.
 builder(
-    name = 'findit_variable',
+    name = "findit_variable",
     # Findit app specifies these for each build it schedules. The reason why
     # we specify them here is to pass validation of the buildbucket config.
     # Also, to illustrate the typical use case of this bucket.
-    executable = 'recipe:findit/chromium/compile',
+    executable = "recipe:findit/chromium/compile",
     goma_backend = goma.backend.RBE_PROD,
 )
 
 builder(
-    name = 'linux_chromium_bot_db_exporter',
-    executable = 'recipe:findit/chromium/export_bot_db',
+    name = "linux_chromium_bot_db_exporter",
+    executable = "recipe:findit/chromium/export_bot_db",
     os = os.LINUX_DEFAULT,
     properties = {
-        'gs_bucket': 'findit-for-me',
-        'gs_object': 'bot_db.json',
+        "gs_bucket": "findit-for-me",
+        "gs_object": "bot_db.json",
     },
-    schedule = '0 0,6,12,18 * * *',
+    schedule = "0 0,6,12,18 * * *",
 )
diff --git a/infra/config/subprojects/findit/subproject.star b/infra/config/subprojects/findit/subproject.star
index e4fb679..904f340d 100644
--- a/infra/config/subprojects/findit/subproject.star
+++ b/infra/config/subprojects/findit/subproject.star
@@ -2,5 +2,5 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-exec('./findit.star')
-exec('./consoles/findit.star')
+exec("./findit.star")
+exec("./consoles/findit.star")
diff --git a/infra/config/subprojects/goma/consoles/chromium.goma.fyi.star b/infra/config/subprojects/goma/consoles/chromium.goma.fyi.star
index 267c152..9ace3a66 100644
--- a/infra/config/subprojects/goma/consoles/chromium.goma.fyi.star
+++ b/infra/config/subprojects/goma/consoles/chromium.goma.fyi.star
@@ -3,124 +3,124 @@
 # found in the LICENSE file.
 
 luci.console_view(
-    name = 'chromium.goma.fyi',
-    header = '//chromium-header.textpb',
+    name = "chromium.goma.fyi",
+    header = "//chromium-header.textpb",
     include_experimental_builds = True,
-    repo = 'https://chromium.googlesource.com/chromium/src',
+    repo = "https://chromium.googlesource.com/chromium/src",
     entries = [
         luci.console_view_entry(
-            builder = 'goma/Win Builder Goma Canary',
-            category = 'win|rel',
+            builder = "goma/Win Builder Goma Canary",
+            category = "win|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Win Builder (dbg) Goma Canary',
-            category = 'win|dbg',
+            builder = "goma/Win Builder (dbg) Goma Canary",
+            category = "win|dbg",
         ),
         luci.console_view_entry(
-            builder = 'goma/win32-archive-rel-goma-canary-localoutputcache',
-            category = 'win|rel',
-            short_name = 'loc',
+            builder = "goma/win32-archive-rel-goma-canary-localoutputcache",
+            category = "win|rel",
+            short_name = "loc",
         ),
         luci.console_view_entry(
-            builder = 'goma/Win7 Builder Goma Canary',
-            category = 'win7|rel',
+            builder = "goma/Win7 Builder Goma Canary",
+            category = "win7|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Win7 Builder (dbg) Goma Canary',
-            category = 'win7|dbg',
+            builder = "goma/Win7 Builder (dbg) Goma Canary",
+            category = "win7|dbg",
         ),
         luci.console_view_entry(
-            builder = 'goma/Mac Builder Goma Canary',
-            category = 'mac|rel',
+            builder = "goma/Mac Builder Goma Canary",
+            category = "mac|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Mac Builder (dbg) Goma Canary',
-            category = 'mac|dbg',
+            builder = "goma/Mac Builder (dbg) Goma Canary",
+            category = "mac|dbg",
         ),
         luci.console_view_entry(
-            builder = 'goma/mac-archive-rel-goma-canary',
-            category = 'mac|rel',
-            short_name = 'clb',
+            builder = "goma/mac-archive-rel-goma-canary",
+            category = "mac|rel",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/Mac Builder (dbg) Goma Canary (clobber)',
-            category = 'mac|dbg',
-            short_name = 'clb',
+            builder = "goma/Mac Builder (dbg) Goma Canary (clobber)",
+            category = "mac|dbg",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/mac-archive-rel-goma-canary-localoutputcache',
-            category = 'mac|rel',
-            short_name = 'loc',
+            builder = "goma/mac-archive-rel-goma-canary-localoutputcache",
+            category = "mac|rel",
+            short_name = "loc",
         ),
         luci.console_view_entry(
-            builder = 'goma/chromeos-amd64-generic-rel-goma-canary',
-            category = 'cros|rel',
+            builder = "goma/chromeos-amd64-generic-rel-goma-canary",
+            category = "cros|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Linux Builder Goma Canary',
-            category = 'linux|rel',
+            builder = "goma/Linux Builder Goma Canary",
+            category = "linux|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/linux-archive-rel-goma-canary',
-            category = 'linux|rel',
-            short_name = 'clb',
+            builder = "goma/linux-archive-rel-goma-canary",
+            category = "linux|rel",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/linux-archive-rel-goma-canary-localoutputcache',
-            category = 'linux|rel',
-            short_name = 'loc',
+            builder = "goma/linux-archive-rel-goma-canary-localoutputcache",
+            category = "linux|rel",
+            short_name = "loc",
         ),
         luci.console_view_entry(
-            builder = 'goma/android-archive-dbg-goma-canary',
-            category = 'android|dbg',
+            builder = "goma/android-archive-dbg-goma-canary",
+            category = "android|dbg",
         ),
         luci.console_view_entry(
-            builder = 'goma/ios-device-goma-canary-clobber',
-            category = 'ios|rel',
-            short_name = 'clb',
+            builder = "goma/ios-device-goma-canary-clobber",
+            category = "ios|rel",
+            short_name = "clb",
         ),
         # RBE
         luci.console_view_entry(
-            builder = 'goma/linux-archive-rel-goma-rbe-canary',
-            category = 'rbe|linux|rel',
-            short_name = 'clb',
+            builder = "goma/linux-archive-rel-goma-rbe-canary",
+            category = "rbe|linux|rel",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/linux-archive-rel-goma-rbe-ats-canary',
-            category = 'rbe|linux|rel',
-            short_name = 'ats',
+            builder = "goma/linux-archive-rel-goma-rbe-ats-canary",
+            category = "rbe|linux|rel",
+            short_name = "ats",
         ),
         luci.console_view_entry(
-            builder = 'goma/Linux Builder Goma RBE Canary',
-            category = 'rbe|linux|rel',
+            builder = "goma/Linux Builder Goma RBE Canary",
+            category = "rbe|linux|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/chromeos-amd64-generic-rel-goma-rbe-canary',
-            category = 'rbe|cros|rel',
+            builder = "goma/chromeos-amd64-generic-rel-goma-rbe-canary",
+            category = "rbe|cros|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/android-archive-dbg-goma-rbe-canary',
-            category = 'rbe|android|dbg',
+            builder = "goma/android-archive-dbg-goma-rbe-canary",
+            category = "rbe|android|dbg",
         ),
         luci.console_view_entry(
-            builder = 'goma/android-archive-dbg-goma-rbe-ats-canary',
-            category = 'rbe|android|dbg',
-            short_name = 'ats',
+            builder = "goma/android-archive-dbg-goma-rbe-ats-canary",
+            category = "rbe|android|dbg",
+            short_name = "ats",
         ),
         luci.console_view_entry(
-            builder = 'goma/mac-archive-rel-goma-rbe-canary',
-            category = 'rbe|mac|rel',
-            short_name = 'clb',
+            builder = "goma/mac-archive-rel-goma-rbe-canary",
+            category = "rbe|mac|rel",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/Mac Builder (dbg) Goma RBE Canary (clobber)',
-            category = 'rbe|mac|dbg',
-            short_name = 'clb',
+            builder = "goma/Mac Builder (dbg) Goma RBE Canary (clobber)",
+            category = "rbe|mac|dbg",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/ios-device-goma-rbe-canary-clobber',
-            category = 'rbe|ios',
-            short_name = 'clb',
+            builder = "goma/ios-device-goma-rbe-canary-clobber",
+            category = "rbe|ios",
+            short_name = "clb",
         ),
     ],
 )
diff --git a/infra/config/subprojects/goma/consoles/chromium.goma.migration.star b/infra/config/subprojects/goma/consoles/chromium.goma.migration.star
index c5914b16..4745bfb 100644
--- a/infra/config/subprojects/goma/consoles/chromium.goma.migration.star
+++ b/infra/config/subprojects/goma/consoles/chromium.goma.migration.star
@@ -5,1184 +5,1184 @@
 # These are used for monitoring builders that have recently been migrated to
 # Goma RBE (See crbug.com/950413).
 luci.console_view(
-    name = 'chromium.goma.migration',
-    header = '//chromium-header.textpb',
+    name = "chromium.goma.migration",
+    header = "//chromium-header.textpb",
     include_experimental_builds = True,
-    repo = 'https://chromium.googlesource.com/chromium/src',
+    repo = "https://chromium.googlesource.com/chromium/src",
     entries = [
         luci.console_view_entry(
-            builder = 'ci/VR Linux',
-            category = 'week1|linux',
-            short_name = 'vr',
+            builder = "ci/VR Linux",
+            category = "week1|linux",
+            short_name = "vr",
         ),
         luci.console_view_entry(
-            builder = 'ci/Mojo Linux',
-            category = 'week1|linux',
-            short_name = 'mojo',
+            builder = "ci/Mojo Linux",
+            category = "week1|linux",
+            short_name = "mojo",
         ),
         luci.console_view_entry(
-            builder = 'ci/Linux Builder (dbg)',
-            category = 'week1|linux|dbg',
+            builder = "ci/Linux Builder (dbg)",
+            category = "week1|linux|dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/Linux Builder (dbg)(32)',
-            category = 'week1|linux|dbg',
-            short_name = '32bit',
+            builder = "ci/Linux Builder (dbg)(32)",
+            category = "week1|linux|dbg",
+            short_name = "32bit",
         ),
         luci.console_view_entry(
-            builder = 'ci/Linux CFI',
-            category = 'week1|linux|cfi',
+            builder = "ci/Linux CFI",
+            category = "week1|linux|cfi",
         ),
         luci.console_view_entry(
-            builder = 'ci/Linux MSan Builder',
-            category = 'week1|linux',
-            short_name = 'msan',
+            builder = "ci/Linux MSan Builder",
+            category = "week1|linux",
+            short_name = "msan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Afl Upload Linux ASan',
-            category = 'week1|linux',
-            short_name = 'afl-asan',
+            builder = "ci/Afl Upload Linux ASan",
+            category = "week1|linux",
+            short_name = "afl-asan",
         ),
         luci.console_view_entry(
-            builder = 'ci/WebKit Linux ASAN',
-            category = 'week1|linux|webkit',
-            short_name = 'asan',
+            builder = "ci/WebKit Linux ASAN",
+            category = "week1|linux|webkit",
+            short_name = "asan",
         ),
         luci.console_view_entry(
-            builder = 'ci/WebKit Linux Leak',
-            category = 'week1|linux|webkit',
-            short_name = 'leak',
+            builder = "ci/WebKit Linux Leak",
+            category = "week1|linux|webkit",
+            short_name = "leak",
         ),
         luci.console_view_entry(
-            builder = 'ci/WebKit Linux MSAN',
-            category = 'week1|linux|webkit',
-            short_name = 'msan',
+            builder = "ci/WebKit Linux MSAN",
+            category = "week1|linux|webkit",
+            short_name = "msan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android FYI 32 Vk Release (Pixel 2)',
-            category = 'week2a|android|32',
-            short_name = 'p2',
+            builder = "ci/Android FYI 32 Vk Release (Pixel 2)",
+            category = "week2a|android|32",
+            short_name = "p2",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android FYI 32 dEQP Vk Release (Pixel 2)',
-            category = 'week2a|android|32deqp',
-            short_name = 'p2',
+            builder = "ci/Android FYI 32 dEQP Vk Release (Pixel 2)",
+            category = "week2a|android|32deqp",
+            short_name = "p2",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android FYI 64 Vk Release (Pixel 2)',
-            category = 'week2a|android|64',
-            short_name = 'p2',
+            builder = "ci/Android FYI 64 Vk Release (Pixel 2)",
+            category = "week2a|android|64",
+            short_name = "p2",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android FYI 64 dEQP Vk Release (Pixel 2)',
-            category = 'week2a|android|64deqp',
-            short_name = 'p2',
+            builder = "ci/Android FYI 64 dEQP Vk Release (Pixel 2)",
+            category = "week2a|android|64deqp",
+            short_name = "p2",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android FYI Release (NVIDIA Shield TV)',
-            category = 'week2a|android|rel',
-            short_name = 'shdtv',
+            builder = "ci/Android FYI Release (NVIDIA Shield TV)",
+            category = "week2a|android|rel",
+            short_name = "shdtv",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android FYI Release (Nexus 5)',
-            category = 'week2a|android|rel',
-            short_name = 'n5',
+            builder = "ci/Android FYI Release (Nexus 5)",
+            category = "week2a|android|rel",
+            short_name = "n5",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android FYI Release (Nexus 5X)',
-            category = 'week2a|android|rel',
-            short_name = 'n5x',
+            builder = "ci/Android FYI Release (Nexus 5X)",
+            category = "week2a|android|rel",
+            short_name = "n5x",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android FYI Release (Nexus 6)',
-            category = 'week2a|android|rel',
-            short_name = 'n6',
+            builder = "ci/Android FYI Release (Nexus 6)",
+            category = "week2a|android|rel",
+            short_name = "n6",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android FYI Release (Nexus 6P)',
-            category = 'week2a|android|rel',
-            short_name = 'n6p',
+            builder = "ci/Android FYI Release (Nexus 6P)",
+            category = "week2a|android|rel",
+            short_name = "n6p",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android FYI Release (Nexus 9)',
-            category = 'week2a|android|rel',
-            short_name = 'n9',
+            builder = "ci/Android FYI Release (Nexus 9)",
+            category = "week2a|android|rel",
+            short_name = "n9",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android FYI Release (Pixel 2)',
-            category = 'week2a|android|rel',
-            short_name = 'p2',
+            builder = "ci/Android FYI Release (Pixel 2)",
+            category = "week2a|android|rel",
+            short_name = "p2",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android FYI dEQP Release (Nexus 5X)',
-            category = 'week2a|android|deqp',
-            short_name = 'n5x',
+            builder = "ci/Android FYI dEQP Release (Nexus 5X)",
+            category = "week2a|android|deqp",
+            short_name = "n5x",
         ),
         luci.console_view_entry(
-            builder = 'ci/Deterministic Android',
-            category = 'week2a|android|det',
+            builder = "ci/Deterministic Android",
+            category = "week2a|android|det",
         ),
         luci.console_view_entry(
-            builder = 'ci/Deterministic Android (dbg)',
-            category = 'week2a|android|det',
-            short_name = 'dbg',
+            builder = "ci/Deterministic Android (dbg)",
+            category = "week2a|android|det",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Android Builder',
-            category = 'week2b|android|release',
-            short_name = '32',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Android Builder",
+            category = "week2b|android|release",
+            short_name = "32",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Android Builder (dbg)',
-            category = 'week2b|android|debug|builder',
-            short_name = '32',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Android Builder (dbg)",
+            category = "week2b|android|debug|builder",
+            short_name = "32",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Android Builder ARM64 (dbg)',
-            category = 'week2b|android|debug|builder',
-            short_name = '64',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Android Builder ARM64 (dbg)",
+            category = "week2b|android|debug|builder",
+            short_name = "64",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Linux Builder',
-            category = 'week2b|linux|release',
-            short_name = 'bld',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Linux Builder",
+            category = "week2b|linux|release",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Linux Builder (dbg)',
-            category = 'week2b|linux|debug',
-            short_name = 'bld',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Linux Builder (dbg)",
+            category = "week2b|linux|debug",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Mac Builder',
-            category = 'week2b|mac|release',
-            short_name = 'bld',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Mac Builder",
+            category = "week2b|mac|release",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Mac Builder (dbg)',
-            category = 'week2b|mac|debug',
-            short_name = 'bld',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Mac Builder (dbg)",
+            category = "week2b|mac|debug",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'webrtc/WebRTC Chromium Android Builder',
-            category = 'week2b|android',
-            short_name = 'bld',
+            builder = "webrtc/WebRTC Chromium Android Builder",
+            category = "week2b|android",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'webrtc/WebRTC Chromium Linux Builder',
-            category = 'week2b|linux',
-            short_name = 'bld',
+            builder = "webrtc/WebRTC Chromium Linux Builder",
+            category = "week2b|linux",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'webrtc/WebRTC Chromium Mac Builder',
-            category = 'week2b|mac',
-            short_name = 'bld',
+            builder = "webrtc/WebRTC Chromium Mac Builder",
+            category = "week2b|mac",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'ci/Mac ASAN Release',
-            category = 'week2c|mac|asan',
+            builder = "ci/Mac ASAN Release",
+            category = "week2c|mac|asan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Mac ASAN Release Media',
-            category = 'week2c|mac|asan',
-            short_name = 'media',
+            builder = "ci/Mac ASAN Release Media",
+            category = "week2c|mac|asan",
+            short_name = "media",
         ),
         luci.console_view_entry(
-            builder = 'ci/Mac ASan 64 Builder',
-            category = 'week2c|mac|asan',
-            short_name = '64',
+            builder = "ci/Mac ASan 64 Builder",
+            category = "week2c|mac|asan",
+            short_name = "64",
         ),
         luci.console_view_entry(
-            builder = 'ci/Libfuzzer Upload Mac ASan',
-            category = 'week2c|mac|asan',
-            short_name = 'fuzz',
+            builder = "ci/Libfuzzer Upload Mac ASan",
+            category = "week2c|mac|asan",
+            short_name = "fuzz",
         ),
         luci.console_view_entry(
-            builder = 'ci/WebKit Mac10.13 (retina)',
-            category = 'week2c|mac',
-            short_name = 'webkit',
+            builder = "ci/WebKit Mac10.13 (retina)",
+            category = "week2c|mac",
+            short_name = "webkit",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android CFI',
-            category = 'week2c|android',
-            short_name = 'cfi',
+            builder = "ci/Android CFI",
+            category = "week2c|android",
+            short_name = "cfi",
         ),
         luci.console_view_entry(
-            builder = 'ci/Site Isolation Android',
-            category = 'week2c|android',
-            short_name = 'isolate',
+            builder = "ci/Site Isolation Android",
+            category = "week2c|android",
+            short_name = "isolate",
         ),
         luci.console_view_entry(
-            builder = 'ci/Mojo Android',
-            category = 'week2c|android',
-            short_name = 'mojo',
+            builder = "ci/Mojo Android",
+            category = "week2c|android",
+            short_name = "mojo",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android x64 Builder (dbg)',
-            category = 'week2c|android|dbg',
-            short_name = 'x64',
+            builder = "ci/Android x64 Builder (dbg)",
+            category = "week2c|android|dbg",
+            short_name = "x64",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android x86 Builder (dbg)',
-            category = 'week2c|android|dbg',
-            short_name = 'x86',
+            builder = "ci/Android x86 Builder (dbg)",
+            category = "week2c|android|dbg",
+            short_name = "x86",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android WebView L (dbg)',
-            category = 'week2c|android|dbg|webview',
-            short_name = 'l',
+            builder = "ci/Android WebView L (dbg)",
+            category = "week2c|android|dbg|webview",
+            short_name = "l",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android WebView M (dbg)',
-            category = 'week2c|android|dbg|webview',
-            short_name = 'm',
+            builder = "ci/Android WebView M (dbg)",
+            category = "week2c|android|dbg|webview",
+            short_name = "m",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android WebView N (dbg)',
-            category = 'week2c|android|dbg|webview',
-            short_name = 'n',
+            builder = "ci/Android WebView N (dbg)",
+            category = "week2c|android|dbg|webview",
+            short_name = "n",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android WebView O (dbg)',
-            category = 'week2c|android|dbg|webview',
-            short_name = 'o',
+            builder = "ci/Android WebView O (dbg)",
+            category = "week2c|android|dbg|webview",
+            short_name = "o",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android WebView P FYI (rel)',
-            category = 'week2c|android|rel|webview',
-            short_name = 'p',
+            builder = "ci/Android WebView P FYI (rel)",
+            category = "week2c|android|rel|webview",
+            short_name = "p",
         ),
         luci.console_view_entry(
-            builder = 'ci/Dawn Linux x64 Builder',
-            category = 'week2d|linux|dawn',
+            builder = "ci/Dawn Linux x64 Builder",
+            category = "week2d|linux|dawn",
         ),
         luci.console_view_entry(
-            builder = 'ci/Dawn Linux x64 DEPS Builder',
-            category = 'week2d|linux|dawn',
-            short_name = 'deps',
+            builder = "ci/Dawn Linux x64 DEPS Builder",
+            category = "week2d|linux|dawn",
+            short_name = "deps",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Linux Builder',
-            category = 'week2d|linux|gpu|fyi',
+            builder = "ci/GPU FYI Linux Builder",
+            category = "week2d|linux|gpu|fyi",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Linux Builder (dbg)',
-            category = 'week2d|linux|gpu|fyi',
-            short_name = 'dbg',
+            builder = "ci/GPU FYI Linux Builder (dbg)",
+            category = "week2d|linux|gpu|fyi",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Linux Ozone Builder',
-            category = 'week2d|linux|gpu|fyi',
-            short_name = 'ozone',
+            builder = "ci/GPU FYI Linux Ozone Builder",
+            category = "week2d|linux|gpu|fyi",
+            short_name = "ozone",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Linux dEQP Builder',
-            category = 'week2d|linux|gpu|fyi',
-            short_name = 'deqp',
+            builder = "ci/GPU FYI Linux dEQP Builder",
+            category = "week2d|linux|gpu|fyi",
+            short_name = "deqp",
         ),
         luci.console_view_entry(
-            builder = 'ci/Linux FYI GPU TSAN Release',
-            category = 'week2d|linux|gpu|fyi',
-            short_name = 'tsan',
+            builder = "ci/Linux FYI GPU TSAN Release",
+            category = "week2d|linux|gpu|fyi",
+            short_name = "tsan",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU Linux Builder (dbg)',
-            category = 'week2d|linux|gpu',
-            short_name = 'dbg',
+            builder = "ci/GPU Linux Builder (dbg)",
+            category = "week2d|linux|gpu",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/Linux Viz',
-            category = 'week2d|linux',
-            short_name = 'viz',
+            builder = "ci/Linux Viz",
+            category = "week2d|linux",
+            short_name = "viz",
         ),
         luci.console_view_entry(
-            builder = 'ci/Linux remote_run Builder',
-            category = 'week2d|linux',
-            short_name = 'rem',
+            builder = "ci/Linux remote_run Builder",
+            category = "week2d|linux",
+            short_name = "rem",
         ),
         luci.console_view_entry(
-            builder = 'ci/Closure Compilation Linux',
-            category = 'week2d|linux',
-            short_name = 'clsr',
+            builder = "ci/Closure Compilation Linux",
+            category = "week2d|linux",
+            short_name = "clsr",
         ),
         luci.console_view_entry(
-            builder = 'ci/Deterministic Linux',
-            category = 'week2d|linux|det',
+            builder = "ci/Deterministic Linux",
+            category = "week2d|linux|det",
         ),
         luci.console_view_entry(
-            builder = 'ci/Deterministic Linux (dbg)',
-            category = 'week2d|linux|det',
-            short_name = 'dbg',
+            builder = "ci/Deterministic Linux (dbg)",
+            category = "week2d|linux|det",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/Dawn Mac x64 Builder',
-            category = 'week2d|mac|dawn',
+            builder = "ci/Dawn Mac x64 Builder",
+            category = "week2d|mac|dawn",
         ),
         luci.console_view_entry(
-            builder = 'ci/Dawn Mac x64 DEPS Builder',
-            category = 'week2d|mac|dawn',
-            short_name = 'deps',
+            builder = "ci/Dawn Mac x64 DEPS Builder",
+            category = "week2d|mac|dawn",
+            short_name = "deps",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Mac Builder',
-            category = 'week2d|mac|gpu|fyi',
+            builder = "ci/GPU FYI Mac Builder",
+            category = "week2d|mac|gpu|fyi",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Mac Builder (dbg)',
-            category = 'week2d|mac|gpu|fyi',
-            short_name = 'dbg',
+            builder = "ci/GPU FYI Mac Builder (dbg)",
+            category = "week2d|mac|gpu|fyi",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Mac dEQP Builder',
-            category = 'week2d|mac|gpu|fyi',
-            short_name = 'deqp',
+            builder = "ci/GPU FYI Mac dEQP Builder",
+            category = "week2d|mac|gpu|fyi",
+            short_name = "deqp",
         ),
         luci.console_view_entry(
-            builder = 'ci/Mac FYI GPU ASAN Release',
-            category = 'week2d|mac|gpu|fyi',
-            short_name = 'asan',
+            builder = "ci/Mac FYI GPU ASAN Release",
+            category = "week2d|mac|gpu|fyi",
+            short_name = "asan",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU Mac Builder (dbg)',
-            category = 'week2d|mac|gpu',
-            short_name = 'dbg',
+            builder = "ci/GPU Mac Builder (dbg)",
+            category = "week2d|mac|gpu",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/Mac deterministic',
-            category = 'week2d|mac|det',
+            builder = "ci/Mac deterministic",
+            category = "week2d|mac|det",
         ),
         luci.console_view_entry(
-            builder = 'ci/Mac deterministic (dbg)',
-            category = 'week2d|mac|det',
-            short_name = 'dbg',
+            builder = "ci/Mac deterministic (dbg)",
+            category = "week2d|mac|det",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/Linux Builder',
-            category = 'week2.5|linux',
+            builder = "ci/Linux Builder",
+            category = "week2.5|linux",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU Linux Builder',
-            category = 'week2.5|linux',
-            short_name = 'gpu',
+            builder = "ci/GPU Linux Builder",
+            category = "week2.5|linux",
+            short_name = "gpu",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-ozone-rel',
-            category = 'week3a|linux',
-            short_name = 'ozone',
+            builder = "ci/linux-ozone-rel",
+            category = "week3a|linux",
+            short_name = "ozone",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-annotator-rel',
-            category = 'week3a|linux',
-            short_name = 'anno',
+            builder = "ci/linux-annotator-rel",
+            category = "week3a|linux",
+            short_name = "anno",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-code-coverage',
-            category = 'week3a|linux',
-            short_name = 'code',
+            builder = "ci/linux-code-coverage",
+            category = "week3a|linux",
+            short_name = "code",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-blink-animation-use-time-delta',
-            category = 'week3a|linux|blink',
-            short_name = 'anim',
+            builder = "ci/linux-blink-animation-use-time-delta",
+            category = "week3a|linux|blink",
+            short_name = "anim",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-blink-heap-concurrent-marking-tsan-rel',
-            category = 'week3a|linux|blink',
-            short_name = 'tsan',
+            builder = "ci/linux-blink-heap-concurrent-marking-tsan-rel",
+            category = "week3a|linux|blink",
+            short_name = "tsan",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-blink-heap-verification',
-            category = 'week3a|linux|blink',
-            short_name = 'ver',
+            builder = "ci/linux-blink-heap-verification",
+            category = "week3a|linux|blink",
+            short_name = "ver",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-chromium-tests-staging-builder',
-            category = 'week3a|linux',
-            short_name = 'crtests',
+            builder = "ci/linux-chromium-tests-staging-builder",
+            category = "week3a|linux",
+            short_name = "crtests",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-cronet-arm-dbg',
-            category = 'week3b|android|cronet|arm',
-            short_name = 'dbg',
+            builder = "ci/android-cronet-arm-dbg",
+            category = "week3b|android|cronet|arm",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-cronet-arm-rel',
-            category = 'week3b|android|cronet|arm',
+            builder = "ci/android-cronet-arm-rel",
+            category = "week3b|android|cronet|arm",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-cronet-asan-arm-rel',
-            category = 'week3b|android|cronet|arm',
-            short_name = 'asan',
+            builder = "ci/android-cronet-asan-arm-rel",
+            category = "week3b|android|cronet|arm",
+            short_name = "asan",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-cronet-kitkat-arm-rel',
-            category = 'week3b|android|cronet|arm',
-            short_name = 'kkat',
+            builder = "ci/android-cronet-kitkat-arm-rel",
+            category = "week3b|android|cronet|arm",
+            short_name = "kkat",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-cronet-lollipop-arm-rel',
-            category = 'week3b|android|cronet|arm',
-            short_name = 'lpop',
+            builder = "ci/android-cronet-lollipop-arm-rel",
+            category = "week3b|android|cronet|arm",
+            short_name = "lpop",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-cronet-arm64-rel',
-            category = 'week3b|android|cronet|arm64',
+            builder = "ci/android-cronet-arm64-rel",
+            category = "week3b|android|cronet|arm64",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-cronet-arm64-dbg',
-            category = 'week3b|android|cronet|arm64',
-            short_name = 'dbg',
+            builder = "ci/android-cronet-arm64-dbg",
+            category = "week3b|android|cronet|arm64",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-cronet-marshmallow-arm64-rel',
-            category = 'week3b|android|cronet|arm64',
-            short_name = 'marsh',
+            builder = "ci/android-cronet-marshmallow-arm64-rel",
+            category = "week3b|android|cronet|arm64",
+            short_name = "marsh",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-cronet-marshmallow-arm64-perf-rel',
-            category = 'week3b|android|cronet|arm64',
-            short_name = 'perf',
+            builder = "ci/android-cronet-marshmallow-arm64-perf-rel",
+            category = "week3b|android|cronet|arm64",
+            short_name = "perf",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-cronet-x86-rel',
-            category = 'week3b|android|cronet|x86',
+            builder = "ci/android-cronet-x86-rel",
+            category = "week3b|android|cronet|x86",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-cronet-x86-dbg',
-            category = 'week3b|android|cronet|x86',
-            short_name = 'dbg',
+            builder = "ci/android-cronet-x86-dbg",
+            category = "week3b|android|cronet|x86",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-incremental-dbg',
-            category = 'week3b|android',
-            short_name = 'inc',
+            builder = "ci/android-incremental-dbg",
+            category = "week3b|android",
+            short_name = "inc",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-mojo-webview-rel',
-            category = 'week3b|android',
-            short_name = 'mojo',
+            builder = "ci/android-mojo-webview-rel",
+            category = "week3b|android",
+            short_name = "mojo",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-pie-arm64-dbg',
-            category = 'week3b|linux',
-            short_name = 'pie',
+            builder = "ci/android-pie-arm64-dbg",
+            category = "week3b|linux",
+            short_name = "pie",
         ),
         luci.console_view_entry(
-            builder = 'ci/mac-code-coverage',
-            category = 'week3c|mac',
-            short_name = 'code',
+            builder = "ci/mac-code-coverage",
+            category = "week3c|mac",
+            short_name = "code",
         ),
         luci.console_view_entry(
-            builder = 'ci/mac-hermetic-upgrade-rel',
-            category = 'week3c|mac',
-            short_name = 'herm',
+            builder = "ci/mac-hermetic-upgrade-rel",
+            category = "week3c|mac",
+            short_name = "herm",
         ),
         luci.console_view_entry(
-            builder = 'ci/mac-mojo-rel',
-            category = 'week3c|mac',
-            short_name = 'mojo',
+            builder = "ci/mac-mojo-rel",
+            category = "week3c|mac",
+            short_name = "mojo",
         ),
         luci.console_view_entry(
-            builder = 'ci/mac-osxbeta-rel',
-            category = 'week3c|mac',
-            short_name = 'osx',
+            builder = "ci/mac-osxbeta-rel",
+            category = "week3c|mac",
+            short_name = "osx",
         ),
         luci.console_view_entry(
-            builder = 'ci/Mac Builder',
-            category = 'week3c|mac',
+            builder = "ci/Mac Builder",
+            category = "week3c|mac",
         ),
         luci.console_view_entry(
-            builder = 'ci/Mac Builder (dbg)',
-            category = 'week3c|mac',
-            short_name = 'dbg',
+            builder = "ci/Mac Builder (dbg)",
+            category = "week3c|mac",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU Mac Builder',
-            category = 'week3c|mac',
-            short_name = 'gpu',
+            builder = "ci/GPU Mac Builder",
+            category = "week3c|mac",
+            short_name = "gpu",
         ),
         luci.console_view_entry(
-            builder = 'ci/Libfuzzer Upload Linux ASan',
-            category = 'week4|linux',
-            short_name = 'asan',
+            builder = "ci/Libfuzzer Upload Linux ASan",
+            category = "week4|linux",
+            short_name = "asan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Libfuzzer Upload Linux ASan Debug',
-            category = 'week4|linux',
-            short_name = 'dbg',
+            builder = "ci/Libfuzzer Upload Linux ASan Debug",
+            category = "week4|linux",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/Libfuzzer Upload Linux MSan',
-            category = 'week4|linux',
-            short_name = 'msan',
+            builder = "ci/Libfuzzer Upload Linux MSan",
+            category = "week4|linux",
+            short_name = "msan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Libfuzzer Upload Linux UBSan',
-            category = 'week4|linux',
-            short_name = 'ubsan',
+            builder = "ci/Libfuzzer Upload Linux UBSan",
+            category = "week4|linux",
+            short_name = "ubsan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Libfuzzer Upload Linux V8-ARM64 ASan',
-            category = 'week4|linux|v8arm',
-            short_name = 'asan',
+            builder = "ci/Libfuzzer Upload Linux V8-ARM64 ASan",
+            category = "week4|linux|v8arm",
+            short_name = "asan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Libfuzzer Upload Linux V8-ARM64 ASan Debug',
-            category = 'week4|linux|v8arm',
-            short_name = 'dbg',
+            builder = "ci/Libfuzzer Upload Linux V8-ARM64 ASan Debug",
+            category = "week4|linux|v8arm",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/Libfuzzer Upload Linux32 ASan',
-            category = 'week4|linux32',
-            short_name = 'asan',
+            builder = "ci/Libfuzzer Upload Linux32 ASan",
+            category = "week4|linux32",
+            short_name = "asan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Libfuzzer Upload Linux32 ASan Debug',
-            category = 'week4|linux32',
-            short_name = 'dbg',
+            builder = "ci/Libfuzzer Upload Linux32 ASan Debug",
+            category = "week4|linux32",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/Libfuzzer Upload Linux32 V8-ARM ASan',
-            category = 'week4|linux32|v8arm',
-            short_name = 'asan',
+            builder = "ci/Libfuzzer Upload Linux32 V8-ARM ASan",
+            category = "week4|linux32|v8arm",
+            short_name = "asan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Libfuzzer Upload Linux32 V8-ARM ASan Debug',
-            category = 'week4|linux32|v8arm',
-            short_name = 'dbg',
+            builder = "ci/Libfuzzer Upload Linux32 V8-ARM ASan Debug",
+            category = "week4|linux32|v8arm",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/ASan Debug (32-bit x86 with V8-ARM)',
-            category = 'week5|asan',
-            short_name = 'dbg',
+            builder = "ci/ASan Debug (32-bit x86 with V8-ARM)",
+            category = "week5|asan",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/ASan Release (32-bit x86 with V8-ARM)',
-            category = 'week5|asan',
-            short_name = 'rel',
+            builder = "ci/ASan Release (32-bit x86 with V8-ARM)",
+            category = "week5|asan",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/ASan Release Media (32-bit x86 with V8-ARM)',
-            category = 'week5|asan',
-            short_name = 'media',
+            builder = "ci/ASan Release Media (32-bit x86 with V8-ARM)",
+            category = "week5|asan",
+            short_name = "media",
         ),
         luci.console_view_entry(
-            builder = 'ci/ASAN Debug',
-            category = 'week6|asan',
-            short_name = 'dbg',
+            builder = "ci/ASAN Debug",
+            category = "week6|asan",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/ASAN Release',
-            category = 'week6|asan',
-            short_name = 'rel',
+            builder = "ci/ASAN Release",
+            category = "week6|asan",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/ASAN Release Media',
-            category = 'week6|asan',
-            short_name = 'media',
+            builder = "ci/ASAN Release Media",
+            category = "week6|asan",
+            short_name = "media",
         ),
         luci.console_view_entry(
-            builder = 'ci/MSAN Release (chained origins)',
-            category = 'week7|msan',
-            short_name = 'chain',
+            builder = "ci/MSAN Release (chained origins)",
+            category = "week7|msan",
+            short_name = "chain",
         ),
         luci.console_view_entry(
-            builder = 'ci/MSAN Release (no origins)',
-            category = 'week7|msan',
-            short_name = 'none',
+            builder = "ci/MSAN Release (no origins)",
+            category = "week7|msan",
+            short_name = "none",
         ),
         luci.console_view_entry(
-            builder = 'ci/TSAN Release',
-            category = 'week8|tsan',
-            short_name = 'rel',
+            builder = "ci/TSAN Release",
+            category = "week8|tsan",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/TSAN Debug',
-            category = 'week8|tsan',
-            short_name = 'dbg',
+            builder = "ci/TSAN Debug",
+            category = "week8|tsan",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/UBSan Release',
-            category = 'week9|ubsan',
+            builder = "ci/UBSan Release",
+            category = "week9|ubsan",
         ),
         luci.console_view_entry(
-            builder = 'ci/UBSan vptr Release',
-            category = 'week9|ubsan|vptr',
-            short_name = 'rel',
+            builder = "ci/UBSan vptr Release",
+            category = "week9|ubsan|vptr",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/UBSanVptr Linux',
-            category = 'week9|ubsan|vptr',
-            short_name = 'lnx',
+            builder = "ci/UBSanVptr Linux",
+            category = "week9|ubsan|vptr",
+            short_name = "lnx",
         ),
         luci.console_view_entry(
-            builder = 'ci/Cast Android (dbg)',
-            category = 'week10|android',
+            builder = "ci/Cast Android (dbg)",
+            category = "week10|android",
         ),
         luci.console_view_entry(
-            builder = 'ci/Cast Audio Linux',
-            category = 'week10|linux',
-            short_name = 'audio',
+            builder = "ci/Cast Audio Linux",
+            category = "week10|linux",
+            short_name = "audio",
         ),
         luci.console_view_entry(
-            builder = 'ci/Cast Linux',
-            category = 'week10|linux',
+            builder = "ci/Cast Linux",
+            category = "week10|linux",
         ),
         luci.console_view_entry(
-            builder = 'ci/Fuchsia ARM64',
-            category = 'week11|fuchsia|arm64',
+            builder = "ci/Fuchsia ARM64",
+            category = "week11|fuchsia|arm64",
         ),
         luci.console_view_entry(
-            builder = 'ci/fuchsia-arm64-cast',
-            category = 'week11|fuchsia|arm64',
-            short_name = 'cast',
+            builder = "ci/fuchsia-arm64-cast",
+            category = "week11|fuchsia|arm64",
+            short_name = "cast",
         ),
         luci.console_view_entry(
-            builder = 'ci/Fuchsia x64',
-            category = 'week11|fuchsia|x64',
+            builder = "ci/Fuchsia x64",
+            category = "week11|fuchsia|x64",
         ),
         luci.console_view_entry(
-            builder = 'ci/fuchsia-x64-cast',
-            category = 'week11|fuchsia|x64',
-            short_name = 'cast',
+            builder = "ci/fuchsia-x64-cast",
+            category = "week11|fuchsia|x64",
+            short_name = "cast",
         ),
         luci.console_view_entry(
-            builder = 'ci/fuchsia-fyi-arm64-rel',
-            category = 'week11|fuchsia|fyi',
-            short_name = 'arm64',
+            builder = "ci/fuchsia-fyi-arm64-rel",
+            category = "week11|fuchsia|fyi",
+            short_name = "arm64",
         ),
         luci.console_view_entry(
-            builder = 'ci/fuchsia-fyi-x64-dbg',
-            category = 'week11|fuchsia|fyi',
-            short_name = 'x64 dbg',
+            builder = "ci/fuchsia-fyi-x64-dbg",
+            category = "week11|fuchsia|fyi",
+            short_name = "x64 dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/fuchsia-fyi-x64-rel',
-            category = 'week11|fuchsia|fyi',
-            short_name = 'x64 rel',
+            builder = "ci/fuchsia-fyi-x64-rel",
+            category = "week11|fuchsia|fyi",
+            short_name = "x64 rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-marshmallow-arm64-rel',
-            category = 'week13|android',
-            short_name = 'marsh',
+            builder = "ci/android-marshmallow-arm64-rel",
+            category = "week13|android",
+            short_name = "marsh",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android Release (Nexus 5X)',
-            category = 'week13|android',
-            short_name = 'n5x',
+            builder = "ci/Android Release (Nexus 5X)",
+            category = "week13|android",
+            short_name = "n5x",
         ),
         luci.console_view_entry(
-            builder = 'ci/Linux ASan LSan Builder',
-            category = 'week14a|linux',
-            short_name = 'asanlsan',
+            builder = "ci/Linux ASan LSan Builder",
+            category = "week14a|linux",
+            short_name = "asanlsan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Linux TSan Builder',
-            category = 'week14a|linux',
-            short_name = 'tsan',
+            builder = "ci/Linux TSan Builder",
+            category = "week14a|linux",
+            short_name = "tsan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android ASAN (dbg)',
-            category = 'week14b|android',
-            short_name = 'asanlsan',
+            builder = "ci/Android ASAN (dbg)",
+            category = "week14b|android",
+            short_name = "asanlsan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android arm Builder (dbg)',
-            category = 'week14b|android',
-            short_name = 'tsan',
+            builder = "ci/Android arm Builder (dbg)",
+            category = "week14b|android",
+            short_name = "tsan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android arm64 Builder (dbg)',
-            category = 'week14b|android',
-            short_name = 'tsan',
+            builder = "ci/Android arm64 Builder (dbg)",
+            category = "week14b|android",
+            short_name = "tsan",
         ),
         luci.console_view_entry(
-            builder = 'ci/fuchsia-x64-dbg',
-            category = 'week15a|fuchsia',
-            short_name = 'x64dbg',
+            builder = "ci/fuchsia-x64-dbg",
+            category = "week15a|fuchsia",
+            short_name = "x64dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-archive-dbg',
-            category = 'week15a|linux|archive',
-            short_name = 'dbg',
+            builder = "ci/linux-archive-dbg",
+            category = "week15a|linux|archive",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-archive-rel',
-            category = 'week15a|linux|archive',
-            short_name = 'rel',
+            builder = "ci/linux-archive-rel",
+            category = "week15a|linux|archive",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-bfcache-rel',
-            category = 'week15a|linux',
-            short_name = 'bfc',
+            builder = "ci/linux-bfcache-rel",
+            category = "week15a|linux",
+            short_name = "bfc",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-blink-cors-rel',
-            category = 'week15a|linux',
-            short_name = 'oorcors',
+            builder = "ci/linux-blink-cors-rel",
+            category = "week15a|linux",
+            short_name = "oorcors",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-fieldtrial-rel',
-            category = 'week15a|linux',
-            short_name = 'field',
+            builder = "ci/linux-fieldtrial-rel",
+            category = "week15a|linux",
+            short_name = "field",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android WebView P Blink-CORS FYI (rel)',
-            category = 'week15b|android|webview p',
-            short_name = 'oorcors',
+            builder = "ci/Android WebView P Blink-CORS FYI (rel)",
+            category = "week15b|android|webview p",
+            short_name = "oorcors",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-archive-rel',
-            category = 'week15b|android|archive',
-            short_name = 'rel',
+            builder = "ci/android-archive-rel",
+            category = "week15b|android|archive",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-archive-dbg',
-            category = 'week15b|android|archive',
-            short_name = 'dbg',
+            builder = "ci/android-archive-dbg",
+            category = "week15b|android|archive",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-asan',
-            category = 'week15b|android',
-            short_name = 'asan',
+            builder = "ci/android-asan",
+            category = "week15b|android",
+            short_name = "asan",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-bfcache-rel',
-            category = 'week15b|android',
-            short_name = 'bfc',
+            builder = "ci/android-bfcache-rel",
+            category = "week15b|android",
+            short_name = "bfc",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-code-coverage',
-            category = 'week15b|android',
-            short_name = 'code',
+            builder = "ci/android-code-coverage",
+            category = "week15b|android",
+            short_name = "code",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-pie-arm64-rel',
-            category = 'week15b|android|pie',
-            short_name = 'arm64',
+            builder = "ci/android-pie-arm64-rel",
+            category = "week15b|android|pie",
+            short_name = "arm64",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-pie-x86-rel',
-            category = 'week15b|android|pie',
-            short_name = 'x86',
+            builder = "ci/android-pie-x86-rel",
+            category = "week15b|android|pie",
+            short_name = "x86",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Perf Android 64 Builder',
-            category = 'week15b|android|gpu',
-            short_name = 'perf64',
+            builder = "ci/GPU FYI Perf Android 64 Builder",
+            category = "week15b|android|gpu",
+            short_name = "perf64",
         ),
         luci.console_view_entry(
-            builder = 'ci/mac-archive-rel',
-            category = 'week15b|mac|archive',
-            short_name = 'rel',
+            builder = "ci/mac-archive-rel",
+            category = "week15b|mac|archive",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/mac-archive-dbg',
-            category = 'week15b|mac|archive',
-            short_name = 'dbg',
+            builder = "ci/mac-archive-dbg",
+            category = "week15b|mac|archive",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-marshmallow-x86-fyi-rel',
-            category = 'week16b',
-            short_name = 'marsh',
+            builder = "ci/android-marshmallow-x86-fyi-rel",
+            category = "week16b",
+            short_name = "marsh",
         ),
         luci.console_view_entry(
-            builder = 'ci/Android FYI 64 Perf (Pixel 2)',
-            category = 'week16b',
-            short_name = 'pxl2',
+            builder = "ci/Android FYI 64 Perf (Pixel 2)",
+            category = "week16b",
+            short_name = "pxl2",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-swangle-tot-angle-x64',
-            category = 'week17|swangle|angle',
-            short_name = 'x64',
+            builder = "ci/linux-swangle-tot-angle-x64",
+            category = "week17|swangle|angle",
+            short_name = "x64",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-swangle-tot-angle-x86',
-            category = 'week17|swangle|angle',
-            short_name = 'x86',
+            builder = "ci/linux-swangle-tot-angle-x86",
+            category = "week17|swangle|angle",
+            short_name = "x86",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-swangle-tot-swiftshader-x64',
-            category = 'week17|swangle|swift',
-            short_name = 'x64',
+            builder = "ci/linux-swangle-tot-swiftshader-x64",
+            category = "week17|swangle|swift",
+            short_name = "x64",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-swangle-tot-swiftshader-x86',
-            category = 'week17|swangle|swift',
-            short_name = 'x86',
+            builder = "ci/linux-swangle-tot-swiftshader-x86",
+            category = "week17|swangle|swift",
+            short_name = "x86",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-swangle-x64',
-            category = 'week17|swangle',
-            short_name = 'x64',
+            builder = "ci/linux-swangle-x64",
+            category = "week17|swangle",
+            short_name = "x64",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-swangle-x86',
-            category = 'week17|swangle',
-            short_name = 'x86',
+            builder = "ci/linux-swangle-x86",
+            category = "week17|swangle",
+            short_name = "x86",
         ),
         luci.console_view_entry(
-            builder = 'ci/android-code-coverage-native',
-            category = 'misc|android',
+            builder = "ci/android-code-coverage-native",
+            category = "misc|android",
         ),
         luci.console_view_entry(
-            builder = 'ci/Win ASan Release',
-            category = 'win|week1|asan',
+            builder = "ci/Win ASan Release",
+            category = "win|week1|asan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Win ASan Release Media',
-            category = 'win|week1|asan',
-            short_name = 'media',
+            builder = "ci/Win ASan Release Media",
+            category = "win|week1|asan",
+            short_name = "media",
         ),
         luci.console_view_entry(
-            builder = 'ci/win10-code-coverage',
-            category = 'win|week1.1',
-            short_name = 'code',
+            builder = "ci/win10-code-coverage",
+            category = "win|week1.1",
+            short_name = "code",
         ),
         luci.console_view_entry(
-            builder = 'ci/Win x64 Builder (dbg)',
-            category = 'win|week1.5',
-            short_name = 'dbg',
+            builder = "ci/Win x64 Builder (dbg)",
+            category = "win|week1.5",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/win-archive-dbg',
-            category = 'win|week1.5|archive',
-            short_name = 'dbg',
+            builder = "ci/win-archive-dbg",
+            category = "win|week1.5|archive",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/win-archive-rel',
-            category = 'win|week1.5|archive',
-            short_name = 'rel',
+            builder = "ci/win-archive-rel",
+            category = "win|week1.5|archive",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/Dawn Win10 x64 Builder',
-            category = 'win|week2|dawn',
+            builder = "ci/Dawn Win10 x64 Builder",
+            category = "win|week2|dawn",
         ),
         luci.console_view_entry(
-            builder = 'ci/Dawn Win10 x64 DEPS Builder',
-            category = 'win|week2|dawn',
-            short_name = 'deps',
+            builder = "ci/Dawn Win10 x64 DEPS Builder",
+            category = "win|week2|dawn",
+            short_name = "deps",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU Win x64 Builder (dbg)',
-            category = 'win|week2|gpu',
-            short_name = 'dbg',
+            builder = "ci/GPU Win x64 Builder (dbg)",
+            category = "win|week2|gpu",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI XR Win x64 Builder',
-            category = 'win|week2|gpu|fyi',
-            short_name = 'xr',
+            builder = "ci/GPU FYI XR Win x64 Builder",
+            category = "win|week2|gpu|fyi",
+            short_name = "xr",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Win x64 dEQP Builder',
-            category = 'win|week2|gpu|fyi',
-            short_name = 'deqp',
+            builder = "ci/GPU FYI Win x64 dEQP Builder",
+            category = "win|week2|gpu|fyi",
+            short_name = "deqp",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Win x64 DX12 Vulkan Builder',
-            category = 'win|week2|gpu|fyi|dx12',
-            short_name = 'rel',
+            builder = "ci/GPU FYI Win x64 DX12 Vulkan Builder",
+            category = "win|week2|gpu|fyi|dx12",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Win x64 DX12 Vulkan Builder (dbg)',
-            category = 'win|week2|gpu|fyi|dx12',
-            short_name = 'dbg',
+            builder = "ci/GPU FYI Win x64 DX12 Vulkan Builder (dbg)",
+            category = "win|week2|gpu|fyi|dx12",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Win x64 Builder',
-            category = 'win|week2|gpu|fyi',
-            short_name = 'rel',
+            builder = "ci/GPU FYI Win x64 Builder",
+            category = "win|week2|gpu|fyi",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Win x64 Builder (dbg)',
-            category = 'win|week2|gpu|fyi',
-            short_name = 'dbg',
+            builder = "ci/GPU FYI Win x64 Builder (dbg)",
+            category = "win|week2|gpu|fyi",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/Win Builder',
-            category = 'win|week3',
-            short_name = 'rel',
+            builder = "ci/Win Builder",
+            category = "win|week3",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/Win Builder (dbg)',
-            category = 'win|week3',
-            short_name = 'dbg',
+            builder = "ci/Win Builder (dbg)",
+            category = "win|week3",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Win Builder',
-            category = 'win|week3|gpu|fyi',
-            short_name = 'rel',
+            builder = "ci/GPU FYI Win Builder",
+            category = "win|week3|gpu|fyi",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Win Builder (dbg)',
-            category = 'win|week3|gpu|fyi',
-            short_name = 'dbg',
+            builder = "ci/GPU FYI Win Builder (dbg)",
+            category = "win|week3|gpu|fyi",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU FYI Win dEQP Builder',
-            category = 'win|week3|gpu|fyi',
-            short_name = 'deqp',
+            builder = "ci/GPU FYI Win dEQP Builder",
+            category = "win|week3|gpu|fyi",
+            short_name = "deqp",
         ),
         luci.console_view_entry(
-            builder = 'ci/Dawn Win10 x86 Builder',
-            category = 'win|week3|dawn',
-            short_name = 'rel',
+            builder = "ci/Dawn Win10 x86 Builder",
+            category = "win|week3|dawn",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/Dawn Win10 x86 DEPS Builder',
-            category = 'win|week3|dawn',
-            short_name = 'deps',
+            builder = "ci/Dawn Win10 x86 DEPS Builder",
+            category = "win|week3|dawn",
+            short_name = "deps",
         ),
         luci.console_view_entry(
-            builder = 'ci/win32-archive-rel',
-            category = 'win|week4|win32',
-            short_name = 'rel',
+            builder = "ci/win32-archive-rel",
+            category = "win|week4|win32",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/win32-archive-dbg',
-            category = 'win|week4|win32',
-            short_name = 'dbg',
+            builder = "ci/win32-archive-dbg",
+            category = "win|week4|win32",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/win32-arm64-rel',
-            category = 'win|week4|win32',
-            short_name = 'arm',
+            builder = "ci/win32-arm64-rel",
+            category = "win|week4|win32",
+            short_name = "arm",
         ),
         luci.console_view_entry(
-            builder = 'ci/Libfuzzer Upload Windows ASan',
-            category = 'win|week4',
-            short_name = 'libfuzzer',
+            builder = "ci/Libfuzzer Upload Windows ASan",
+            category = "win|week4",
+            short_name = "libfuzzer",
         ),
         luci.console_view_entry(
-            builder = 'ci/Windows deterministic',
-            category = 'win|week4',
-            short_name = 'det',
+            builder = "ci/Windows deterministic",
+            category = "win|week4",
+            short_name = "det",
         ),
         luci.console_view_entry(
-            builder = 'ci/Mojo Windows',
-            category = 'win|week4',
-            short_name = 'mojo',
+            builder = "ci/Mojo Windows",
+            category = "win|week4",
+            short_name = "mojo",
         ),
         luci.console_view_entry(
-            builder = 'ci/win-celab-builder-rel',
-            category = 'win|week4',
-            short_name = 'celab',
+            builder = "ci/win-celab-builder-rel",
+            category = "win|week4",
+            short_name = "celab",
         ),
         luci.console_view_entry(
-            builder = 'ci/win-asan',
-            category = 'win|week4',
-            short_name = 'asan',
+            builder = "ci/win-asan",
+            category = "win|week4",
+            short_name = "asan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Win 10 Fast Ring',
-            category = 'win|week4',
-            short_name = 'fastring',
+            builder = "ci/Win 10 Fast Ring",
+            category = "win|week4",
+            short_name = "fastring",
         ),
         luci.console_view_entry(
-            builder = 'ci/win-annotator-rel',
-            category = 'win|week4',
-            short_name = 'anno',
+            builder = "ci/win-annotator-rel",
+            category = "win|week4",
+            short_name = "anno",
         ),
         luci.console_view_entry(
-            builder = 'ci/win-pixel-builder-rel',
-            category = 'win|week4',
-            short_name = 'pixel',
+            builder = "ci/win-pixel-builder-rel",
+            category = "win|week4",
+            short_name = "pixel",
         ),
         luci.console_view_entry(
-            builder = 'webrtc/WebRTC Chromium Win Builder',
-            category = 'win|week4|webrtc',
+            builder = "webrtc/WebRTC Chromium Win Builder",
+            category = "win|week4|webrtc",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Win Builder',
-            category = 'win|week4|webrtc|fyi',
-            short_name = 'rel',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Win Builder",
+            category = "win|week4|webrtc|fyi",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Win Builder (dbg)',
-            category = 'win|week4|webrtc|fyi',
-            short_name = 'dbg',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Win Builder (dbg)",
+            category = "win|week4|webrtc|fyi",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/win-swangle-x86',
-            category = 'win|week4|swangle',
-            short_name = 'x86',
+            builder = "ci/win-swangle-x86",
+            category = "win|week4|swangle",
+            short_name = "x86",
         ),
         luci.console_view_entry(
-            builder = 'ci/win-swangle-x64',
-            category = 'win|week4|swangle',
-            short_name = 'x64',
+            builder = "ci/win-swangle-x64",
+            category = "win|week4|swangle",
+            short_name = "x64",
         ),
         luci.console_view_entry(
-            builder = 'ci/win-swangle-tot-angle-x86',
-            category = 'win|week4|swangle|angle',
-            short_name = 'x86',
+            builder = "ci/win-swangle-tot-angle-x86",
+            category = "win|week4|swangle|angle",
+            short_name = "x86",
         ),
         luci.console_view_entry(
-            builder = 'ci/win-swangle-tot-angle-x64',
-            category = 'win|week4|swangle|angle',
-            short_name = 'x64',
+            builder = "ci/win-swangle-tot-angle-x64",
+            category = "win|week4|swangle|angle",
+            short_name = "x64",
         ),
         luci.console_view_entry(
-            builder = 'ci/win-swangle-tot-swiftshader-x86',
-            category = 'win|week4|swangle|swift',
-            short_name = 'x86',
+            builder = "ci/win-swangle-tot-swiftshader-x86",
+            category = "win|week4|swangle|swift",
+            short_name = "x86",
         ),
         luci.console_view_entry(
-            builder = 'ci/win-swangle-tot-swiftshader-x64',
-            category = 'win|week4|swangle|swift',
-            short_name = 'x64',
+            builder = "ci/win-swangle-tot-swiftshader-x64",
+            category = "win|week4|swangle|swift",
+            short_name = "x64",
         ),
         luci.console_view_entry(
-            builder = 'ci/Win x64 Builder',
-            category = 'win|week5',
+            builder = "ci/Win x64 Builder",
+            category = "win|week5",
         ),
         luci.console_view_entry(
-            builder = 'ci/GPU Win x64 Builder',
-            category = 'win|week5',
-            short_name = 'gpu',
+            builder = "ci/GPU Win x64 Builder",
+            category = "win|week5",
+            short_name = "gpu",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-chromeos-dbg',
-            category = 'cros|week1',
-            short_name = 'dbg',
+            builder = "ci/linux-chromeos-dbg",
+            category = "cros|week1",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-chromeos-rel',
-            category = 'cros|week1',
-            short_name = 'rel',
+            builder = "ci/linux-chromeos-rel",
+            category = "cros|week1",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/linux-chromeos-code-coverage',
-            category = 'cros|week1',
-            short_name = 'code',
+            builder = "ci/linux-chromeos-code-coverage",
+            category = "cros|week1",
+            short_name = "code",
         ),
         luci.console_view_entry(
-            builder = 'ci/Linux ChromiumOS Full',
-            category = 'cros|week2',
-            short_name = 'full',
+            builder = "ci/Linux ChromiumOS Full",
+            category = "cros|week2",
+            short_name = "full",
         ),
         luci.console_view_entry(
-            builder = 'ci/ChromiumOS ASAN Release',
-            category = 'cros|week2',
-            short_name = 'asan',
+            builder = "ci/ChromiumOS ASAN Release",
+            category = "cros|week2",
+            short_name = "asan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Linux Chromium OS ASan LSan Builder',
-            category = 'cros|week2',
-            short_name = 'asan lsan',
+            builder = "ci/Linux Chromium OS ASan LSan Builder",
+            category = "cros|week2",
+            short_name = "asan lsan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Linux ChromiumOS MSan Builder',
-            category = 'cros|week2',
-            short_name = 'msan',
+            builder = "ci/Linux ChromiumOS MSan Builder",
+            category = "cros|week2",
+            short_name = "msan",
         ),
         luci.console_view_entry(
-            builder = 'ci/Mojo ChromiumOS',
-            category = 'cros|week2',
-            short_name = 'mojo',
+            builder = "ci/Mojo ChromiumOS",
+            category = "cros|week2",
+            short_name = "mojo",
         ),
         luci.console_view_entry(
-            builder = 'ci/Libfuzzer Upload Chrome OS ASan',
-            category = 'cros|week2',
-            short_name = 'fuzz',
+            builder = "ci/Libfuzzer Upload Chrome OS ASan",
+            category = "cros|week2",
+            short_name = "fuzz",
         ),
         luci.console_view_entry(
-            builder = 'ci/chromeos-amd64-generic-rel',
-            category = 'cros|week3|amd64',
-            short_name = 'rel',
+            builder = "ci/chromeos-amd64-generic-rel",
+            category = "cros|week3|amd64",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/chromeos-amd64-generic-dbg',
-            category = 'cros|week3|amd64',
-            short_name = 'dbg',
+            builder = "ci/chromeos-amd64-generic-dbg",
+            category = "cros|week3|amd64",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/chromeos-amd64-generic-asan-rel',
-            category = 'cros|week3|amd64',
-            short_name = 'asan',
+            builder = "ci/chromeos-amd64-generic-asan-rel",
+            category = "cros|week3|amd64",
+            short_name = "asan",
         ),
         luci.console_view_entry(
-            builder = 'ci/chromeos-amd64-generic-cfi-thin-lto-rel',
-            category = 'cros|week3|amd64',
-            short_name = 'thinlto',
+            builder = "ci/chromeos-amd64-generic-cfi-thin-lto-rel",
+            category = "cros|week3|amd64",
+            short_name = "thinlto",
         ),
         luci.console_view_entry(
-            builder = 'ci/chromeos-arm-generic-rel',
-            category = 'cros|week3|arm',
-            short_name = 'rel',
+            builder = "ci/chromeos-arm-generic-rel",
+            category = "cros|week3|arm",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'ci/chromeos-arm-generic-dbg',
-            category = 'cros|week3|arm',
-            short_name = 'dbg',
+            builder = "ci/chromeos-arm-generic-dbg",
+            category = "cros|week3|arm",
+            short_name = "dbg",
         ),
         luci.console_view_entry(
-            builder = 'ci/chromeos-kevin-rel',
-            category = 'cros|week3|kevin',
-            short_name = 'rel',
+            builder = "ci/chromeos-kevin-rel",
+            category = "cros|week3|kevin",
+            short_name = "rel",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI ios-device',
-            category = 'ios|week1a',
-            short_name = 'dev',
+            builder = "webrtc.fyi/WebRTC Chromium FYI ios-device",
+            category = "ios|week1a",
+            short_name = "dev",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI ios-simulator',
-            category = 'ios|week1a',
-            short_name = 'sim',
+            builder = "webrtc.fyi/WebRTC Chromium FYI ios-simulator",
+            category = "ios|week1a",
+            short_name = "sim",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios-device',
-            category = 'ios|week1b',
-            short_name = 'dev',
+            builder = "ci/ios-device",
+            category = "ios|week1b",
+            short_name = "dev",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios-simulator',
-            category = 'ios|week1b|sim',
+            builder = "ci/ios-simulator",
+            category = "ios|week1b|sim",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios-simulator-full-configs',
-            category = 'ios|week1b|sim',
-            short_name = 'fullconf',
+            builder = "ci/ios-simulator-full-configs",
+            category = "ios|week1b|sim",
+            short_name = "fullconf",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios-simulator-noncq',
-            category = 'ios|week1b|sim',
-            short_name = 'noncq',
+            builder = "ci/ios-simulator-noncq",
+            category = "ios|week1b|sim",
+            short_name = "noncq",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios13-beta-simulator',
-            category = 'ios|week1b|ios13|beta',
-            short_name = 'sim',
+            builder = "ci/ios13-beta-simulator",
+            category = "ios|week1b|ios13|beta",
+            short_name = "sim",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios13-sdk-simulator',
-            category = 'ios|week1b|ios13|sdk',
-            short_name = 'sim',
+            builder = "ci/ios13-sdk-simulator",
+            category = "ios|week1b|ios13|sdk",
+            short_name = "sim",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios-simulator-cronet',
-            category = 'ios|week1c',
-            short_name = 'cro',
+            builder = "ci/ios-simulator-cronet",
+            category = "ios|week1c",
+            short_name = "cro",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios-simulator-cr-recipe',
-            category = 'ios|week1c',
-            short_name = 'crr',
+            builder = "ci/ios-simulator-cr-recipe",
+            category = "ios|week1c",
+            short_name = "crr",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios-webkit-tot',
-            category = 'ios|week1c',
-            short_name = 'webkit',
+            builder = "ci/ios-webkit-tot",
+            category = "ios|week1c",
+            short_name = "webkit",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios13-sdk-device',
-            category = 'ios|week1c|ios13',
-            short_name = 'dev',
+            builder = "ci/ios13-sdk-device",
+            category = "ios|week1c|ios13",
+            short_name = "dev",
         ),
         luci.console_view_entry(
-            builder = 'ci/ios-simulator-code-coverage',
-            category = 'ios|week1d',
-            short_name = 'code',
+            builder = "ci/ios-simulator-code-coverage",
+            category = "ios|week1d",
+            short_name = "code",
         ),
     ],
 )
diff --git a/infra/config/subprojects/goma/consoles/chromium.goma.star b/infra/config/subprojects/goma/consoles/chromium.goma.star
index ed088f6..84dd9b2 100644
--- a/infra/config/subprojects/goma/consoles/chromium.goma.star
+++ b/infra/config/subprojects/goma/consoles/chromium.goma.star
@@ -3,99 +3,99 @@
 # found in the LICENSE file.
 
 luci.console_view(
-    name = 'chromium.goma',
-    header = '//chromium-header.textpb',
+    name = "chromium.goma",
+    header = "//chromium-header.textpb",
     include_experimental_builds = True,
-    repo = 'https://chromium.googlesource.com/chromium/src',
+    repo = "https://chromium.googlesource.com/chromium/src",
     entries = [
         luci.console_view_entry(
-            builder = 'goma/Chromium Linux Goma Staging',
-            category = 'clients5',
-            short_name = 'lnx',
+            builder = "goma/Chromium Linux Goma Staging",
+            category = "clients5",
+            short_name = "lnx",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Mac Goma Staging',
-            category = 'clients5',
-            short_name = 'mac',
+            builder = "goma/Chromium Mac Goma Staging",
+            category = "clients5",
+            short_name = "mac",
         ),
         luci.console_view_entry(
-            builder = 'goma/CrWinGomaStaging',
-            category = 'clients5',
-            short_name = 'win',
+            builder = "goma/CrWinGomaStaging",
+            category = "clients5",
+            short_name = "win",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Linux Goma RBE ToT',
-            category = 'rbe|tot|linux|rel',
+            builder = "goma/Chromium Linux Goma RBE ToT",
+            category = "rbe|tot|linux|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Linux Goma RBE ToT (ATS)',
-            category = 'rbe|tot|linux|rel',
-            short_name = 'ats',
+            builder = "goma/Chromium Linux Goma RBE ToT (ATS)",
+            category = "rbe|tot|linux|rel",
+            short_name = "ats",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Mac Goma RBE ToT',
-            category = 'rbe|tot|mac|rel',
+            builder = "goma/Chromium Mac Goma RBE ToT",
+            category = "rbe|tot|mac|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Win Goma RBE ToT',
-            category = 'rbe|tot|win|rel',
+            builder = "goma/Chromium Win Goma RBE ToT",
+            category = "rbe|tot|win|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium iOS Goma RBE ToT',
-            category = 'rbe|tot|ios|rel',
+            builder = "goma/Chromium iOS Goma RBE ToT",
+            category = "rbe|tot|ios|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Android ARM 32-bit Goma RBE ToT',
-            category = 'rbe|tot|android arm|rel',
+            builder = "goma/Chromium Android ARM 32-bit Goma RBE ToT",
+            category = "rbe|tot|android arm|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Android ARM 32-bit Goma RBE ToT (ATS)',
-            category = 'rbe|tot|android arm|rel',
-            short_name = 'ats',
+            builder = "goma/Chromium Android ARM 32-bit Goma RBE ToT (ATS)",
+            category = "rbe|tot|android arm|rel",
+            short_name = "ats",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Linux Goma RBE Staging (clobber)',
-            category = 'rbe|staging|linux|rel',
-            short_name = 'clb',
+            builder = "goma/Chromium Linux Goma RBE Staging (clobber)",
+            category = "rbe|staging|linux|rel",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Linux Goma RBE Staging',
-            category = 'rbe|staging|linux|rel',
+            builder = "goma/Chromium Linux Goma RBE Staging",
+            category = "rbe|staging|linux|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Linux Goma RBE Staging (dbg) (clobber)',
-            category = 'rbe|staging|linux|debug',
-            short_name = 'clb',
+            builder = "goma/Chromium Linux Goma RBE Staging (dbg) (clobber)",
+            category = "rbe|staging|linux|debug",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Linux Goma RBE Staging (dbg)',
-            category = 'rbe|staging|linux|debug',
+            builder = "goma/Chromium Linux Goma RBE Staging (dbg)",
+            category = "rbe|staging|linux|debug",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Mac Goma RBE Staging (clobber)',
-            category = 'rbe|staging|mac|rel',
-            short_name = 'clb',
+            builder = "goma/Chromium Mac Goma RBE Staging (clobber)",
+            category = "rbe|staging|mac|rel",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Mac Goma RBE Staging',
-            category = 'rbe|staging|mac|rel',
+            builder = "goma/Chromium Mac Goma RBE Staging",
+            category = "rbe|staging|mac|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Mac Goma RBE Staging (dbg)',
-            category = 'rbe|staging|mac|debug',
+            builder = "goma/Chromium Mac Goma RBE Staging (dbg)",
+            category = "rbe|staging|mac|debug",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Win Goma RBE Staging',
-            category = 'rbe|staging|win|rel',
+            builder = "goma/Chromium Win Goma RBE Staging",
+            category = "rbe|staging|win|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Win Goma RBE Staging (clobber)',
-            category = 'rbe|staging|win|rel',
-            short_name = 'clb',
+            builder = "goma/Chromium Win Goma RBE Staging (clobber)",
+            category = "rbe|staging|win|rel",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Android ARM 32-bit Goma RBE Staging',
-            category = 'rbe|staging|android arm|rel',
+            builder = "goma/Chromium Android ARM 32-bit Goma RBE Staging",
+            category = "rbe|staging|android arm|rel",
         ),
     ],
 )
diff --git a/infra/config/subprojects/goma/consoles/goma.latest.star b/infra/config/subprojects/goma/consoles/goma.latest.star
index 3d9885c5..f64d8a0 100644
--- a/infra/config/subprojects/goma/consoles/goma.latest.star
+++ b/infra/config/subprojects/goma/consoles/goma.latest.star
@@ -3,131 +3,131 @@
 # found in the LICENSE file.
 
 luci.console_view(
-    name = 'goma.latest',
-    header = '//chromium-header.textpb',
-    repo = 'https://chromium.googlesource.com/chromium/src',
+    name = "goma.latest",
+    header = "//chromium-header.textpb",
+    repo = "https://chromium.googlesource.com/chromium/src",
     entries = [
         luci.console_view_entry(
-            builder = 'goma/Win Builder Goma Latest Client',
-            category = 'win|rel',
+            builder = "goma/Win Builder Goma Latest Client",
+            category = "win|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Win Builder (dbg) Goma Latest Client',
-            category = 'win|dbg',
+            builder = "goma/Win Builder (dbg) Goma Latest Client",
+            category = "win|dbg",
         ),
         luci.console_view_entry(
-            builder = 'goma/win32-archive-rel-goma-latest-localoutputcache',
-            category = 'win|rel',
-            short_name = 'loc',
+            builder = "goma/win32-archive-rel-goma-latest-localoutputcache",
+            category = "win|rel",
+            short_name = "loc",
         ),
         luci.console_view_entry(
-            builder = 'goma/Win7 Builder Goma Latest Client',
-            category = 'win7|rel',
+            builder = "goma/Win7 Builder Goma Latest Client",
+            category = "win7|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Win7 Builder (dbg) Goma Latest Client',
-            category = 'win7|dbg',
+            builder = "goma/Win7 Builder (dbg) Goma Latest Client",
+            category = "win7|dbg",
         ),
         luci.console_view_entry(
-            builder = 'goma/Mac Builder Goma Latest Client',
-            category = 'mac|rel',
+            builder = "goma/Mac Builder Goma Latest Client",
+            category = "mac|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Mac Builder (dbg) Goma Latest Client',
-            category = 'mac|dbg',
+            builder = "goma/Mac Builder (dbg) Goma Latest Client",
+            category = "mac|dbg",
         ),
         luci.console_view_entry(
-            builder = 'goma/mac-archive-rel-goma-latest',
-            category = 'mac|rel',
-            short_name = 'clb',
+            builder = "goma/mac-archive-rel-goma-latest",
+            category = "mac|rel",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/Mac Builder (dbg) Goma Latest Client (clobber)',
-            category = 'mac|dbg',
-            short_name = 'clb',
+            builder = "goma/Mac Builder (dbg) Goma Latest Client (clobber)",
+            category = "mac|dbg",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/mac-archive-rel-goma-latest-localoutputcache',
-            category = 'mac|rel',
-            short_name = 'loc',
+            builder = "goma/mac-archive-rel-goma-latest-localoutputcache",
+            category = "mac|rel",
+            short_name = "loc",
         ),
         luci.console_view_entry(
-            builder = 'goma/chromeos-amd64-generic-rel-goma-latest',
-            category = 'cros|rel',
+            builder = "goma/chromeos-amd64-generic-rel-goma-latest",
+            category = "cros|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Linux Builder Goma Latest Client',
-            category = 'linux|rel',
+            builder = "goma/Linux Builder Goma Latest Client",
+            category = "linux|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/linux-archive-rel-goma-latest',
-            category = 'linux|rel',
-            short_name = 'clb',
+            builder = "goma/linux-archive-rel-goma-latest",
+            category = "linux|rel",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/linux-archive-rel-goma-latest-localoutputcache',
-            category = 'linux|rel',
-            short_name = 'loc',
+            builder = "goma/linux-archive-rel-goma-latest-localoutputcache",
+            category = "linux|rel",
+            short_name = "loc",
         ),
         luci.console_view_entry(
-            builder = 'goma/android-archive-dbg-goma-latest',
-            category = 'android|dbg',
+            builder = "goma/android-archive-dbg-goma-latest",
+            category = "android|dbg",
         ),
         luci.console_view_entry(
-            builder = 'goma/ios-device-goma-latest-clobber',
-            category = 'ios',
-            short_name = 'clb',
+            builder = "goma/ios-device-goma-latest-clobber",
+            category = "ios",
+            short_name = "clb",
         ),
-  # RBE
+        # RBE
         luci.console_view_entry(
-            builder = 'goma/linux-archive-rel-goma-rbe-latest',
-            category = 'rbe|linux|rel',
-            short_name = 'clb',
+            builder = "goma/linux-archive-rel-goma-rbe-latest",
+            category = "rbe|linux|rel",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/linux-archive-rel-goma-rbe-ats-latest',
-            category = 'rbe|linux|rel',
-            short_name = 'ats',
+            builder = "goma/linux-archive-rel-goma-rbe-ats-latest",
+            category = "rbe|linux|rel",
+            short_name = "ats",
         ),
         luci.console_view_entry(
-            builder = 'goma/Linux Builder Goma RBE Latest Client',
-            category = 'rbe|linux|rel',
+            builder = "goma/Linux Builder Goma RBE Latest Client",
+            category = "rbe|linux|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/chromeos-amd64-generic-rel-goma-rbe-latest',
-            category = 'rbe|cros|rel',
+            builder = "goma/chromeos-amd64-generic-rel-goma-rbe-latest",
+            category = "rbe|cros|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/android-archive-dbg-goma-rbe-latest',
-            category = 'rbe|android|dbg',
+            builder = "goma/android-archive-dbg-goma-rbe-latest",
+            category = "rbe|android|dbg",
         ),
         luci.console_view_entry(
-            builder = 'goma/android-archive-dbg-goma-rbe-ats-latest',
-            category = 'rbe|android|dbg',
-            short_name = 'ats',
+            builder = "goma/android-archive-dbg-goma-rbe-ats-latest",
+            category = "rbe|android|dbg",
+            short_name = "ats",
         ),
         luci.console_view_entry(
-            builder = 'goma/mac-archive-rel-goma-rbe-latest',
-            category = 'rbe|mac|rel',
-            short_name = 'clb',
+            builder = "goma/mac-archive-rel-goma-rbe-latest",
+            category = "rbe|mac|rel",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/Mac Builder (dbg) Goma RBE Latest Client (clobber)',
-            category = 'rbe|mac|dbg',
-            short_name = 'clb',
+            builder = "goma/Mac Builder (dbg) Goma RBE Latest Client (clobber)",
+            category = "rbe|mac|dbg",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/ios-device-goma-rbe-latest-clobber',
-            category = 'rbe|ios',
-            short_name = 'clb',
+            builder = "goma/ios-device-goma-rbe-latest-clobber",
+            category = "rbe|ios",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/Win Builder Goma RBE Latest Client',
-            category = 'rbe|win|rel',
+            builder = "goma/Win Builder Goma RBE Latest Client",
+            category = "rbe|win|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Win Builder (dbg) Goma RBE Latest Client',
-            category = 'rbe|win|dbg',
+            builder = "goma/Win Builder (dbg) Goma RBE Latest Client",
+            category = "rbe|win|dbg",
         ),
     ],
 )
diff --git a/infra/config/subprojects/goma/consoles/luci.chromium.goma.star b/infra/config/subprojects/goma/consoles/luci.chromium.goma.star
index 1de4fac..4caec56b 100644
--- a/infra/config/subprojects/goma/consoles/luci.chromium.goma.star
+++ b/infra/config/subprojects/goma/consoles/luci.chromium.goma.star
@@ -3,43 +3,43 @@
 # found in the LICENSE file.
 
 luci.console_view(
-    name = 'luci.chromium.goma',
-    header = '//chromium-header.textpb',
+    name = "luci.chromium.goma",
+    header = "//chromium-header.textpb",
     include_experimental_builds = True,
-    repo = 'https://chromium.googlesource.com/chromium/src',
+    repo = "https://chromium.googlesource.com/chromium/src",
     entries = [
         luci.console_view_entry(
-            builder = 'goma/Chromium Linux Goma Staging',
-            category = 'clients5',
-            short_name = 'lnx',
+            builder = "goma/Chromium Linux Goma Staging",
+            category = "clients5",
+            short_name = "lnx",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Mac Goma Staging',
-            category = 'clients5',
-            short_name = 'mac',
+            builder = "goma/Chromium Mac Goma Staging",
+            category = "clients5",
+            short_name = "mac",
         ),
         luci.console_view_entry(
-            builder = 'goma/CrWinGomaStaging',
-            category = 'clients5',
-            short_name = 'win',
+            builder = "goma/CrWinGomaStaging",
+            category = "clients5",
+            short_name = "win",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Linux Goma RBE Staging (clobber)',
-            category = 'rbe|rel',
-            short_name = 'clb',
+            builder = "goma/Chromium Linux Goma RBE Staging (clobber)",
+            category = "rbe|rel",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Linux Goma RBE Staging',
-            category = 'rbe|rel',
+            builder = "goma/Chromium Linux Goma RBE Staging",
+            category = "rbe|rel",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Linux Goma RBE Staging (dbg) (clobber)',
-            category = 'rbe|debug',
-            short_name = 'clb',
+            builder = "goma/Chromium Linux Goma RBE Staging (dbg) (clobber)",
+            category = "rbe|debug",
+            short_name = "clb",
         ),
         luci.console_view_entry(
-            builder = 'goma/Chromium Linux Goma RBE Staging (dbg)',
-            category = 'rbe|debug',
+            builder = "goma/Chromium Linux Goma RBE Staging (dbg)",
+            category = "rbe|debug",
         ),
     ],
 )
diff --git a/infra/config/subprojects/goma/goma.star b/infra/config/subprojects/goma/goma.star
index 3aaf83c..58feba0 100644
--- a/infra/config/subprojects/goma/goma.star
+++ b/infra/config/subprojects/goma/goma.star
@@ -2,40 +2,40 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'builder', 'cpu', 'defaults', 'goma', 'os', 'xcode_cache')
+load("//lib/builders.star", "builder", "cpu", "defaults", "goma", "os", "xcode_cache")
 
 luci.bucket(
-    name = 'goma',
+    name = "goma",
     acls = [
         acl.entry(
             roles = acl.BUILDBUCKET_READER,
-            groups = 'all',
+            groups = "all",
         ),
         acl.entry(
             roles = acl.BUILDBUCKET_TRIGGERER,
-            groups = 'project-chromium-ci-schedulers',
+            groups = "project-chromium-ci-schedulers",
         ),
         acl.entry(
             roles = acl.BUILDBUCKET_OWNER,
-            groups = 'google/luci-task-force@google.com',
+            groups = "google/luci-task-force@google.com",
         ),
     ],
 )
 
-defaults.bucket.set('goma')
+defaults.bucket.set("goma")
 defaults.build_numbers.set(True)
 defaults.configure_kitchen.set(True)
 defaults.cores.set(8)
 defaults.cpu.set(cpu.X86_64)
-defaults.executable.set('recipe:chromium')
+defaults.executable.set("recipe:chromium")
 defaults.execution_timeout.set(3 * time.hour)
 defaults.os.set(os.LINUX_DEFAULT)
-defaults.pool.set('luci.chromium.ci')
+defaults.pool.set("luci.chromium.ci")
 defaults.service_account.set(
-        'chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com')
-defaults.swarming_tags.set(['vpython:native-python-wrapper'])
-defaults.triggered_by.set(['master-gitiles-trigger'])
-
+    "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com",
+)
+defaults.swarming_tags.set(["vpython:native-python-wrapper"])
+defaults.triggered_by.set(["master-gitiles-trigger"])
 
 # Builders appear after the function used to define them, with all builders
 # defined using the same function ordered lexicographically by name
@@ -47,487 +47,480 @@
 # latest client, etc.): XXX_YYY_builder where XXX is the part after the last dot
 # in the mastername and YYY is the OS or goma grouping
 
-
 def fyi_goma_canary_builder(*, name, **kwargs):
-  return builder(
-      name = name,
-      mastername = 'chromium.goma.fyi',
-      execution_timeout = 10 * time.hour,
-      **kwargs
-  )
+    return builder(
+        name = name,
+        mastername = "chromium.goma.fyi",
+        execution_timeout = 10 * time.hour,
+        **kwargs
+    )
 
 fyi_goma_canary_builder(
-    name = 'Linux Builder Goma Canary',
+    name = "Linux Builder Goma Canary",
     # keep to use trusty for this until chrome drops support of development
     # on trusty.
     os = os.LINUX_TRUSTY,
 )
 
 fyi_goma_canary_builder(
-    name = 'Mac Builder (dbg) Goma Canary',
+    name = "Mac Builder (dbg) Goma Canary",
     cores = 4,
     os = os.MAC_DEFAULT,
 )
 
 fyi_goma_canary_builder(
-    name = 'Mac Builder (dbg) Goma Canary (clobber)',
+    name = "Mac Builder (dbg) Goma Canary (clobber)",
     cores = 4,
     os = os.MAC_DEFAULT,
 )
 
 fyi_goma_canary_builder(
-    name = 'Mac Builder Goma Canary',
+    name = "Mac Builder Goma Canary",
     cores = 4,
     os = os.MAC_DEFAULT,
 )
 
 fyi_goma_canary_builder(
-    name = 'Win Builder (dbg) Goma Canary',
+    name = "Win Builder (dbg) Goma Canary",
     os = os.WINDOWS_DEFAULT,
 )
 
 fyi_goma_canary_builder(
-    name = 'Win Builder Goma Canary',
+    name = "Win Builder Goma Canary",
     os = os.WINDOWS_DEFAULT,
 )
 
 fyi_goma_canary_builder(
-    name = 'Win7 Builder (dbg) Goma Canary',
+    name = "Win7 Builder (dbg) Goma Canary",
     os = os.WINDOWS_7,
 )
 
 fyi_goma_canary_builder(
-    name = 'Win7 Builder Goma Canary',
+    name = "Win7 Builder Goma Canary",
     os = os.WINDOWS_7,
 )
 
 fyi_goma_canary_builder(
-    name = 'android-archive-dbg-goma-canary',
+    name = "android-archive-dbg-goma-canary",
 )
 
 fyi_goma_canary_builder(
-    name = 'chromeos-amd64-generic-rel-goma-canary',
+    name = "chromeos-amd64-generic-rel-goma-canary",
 )
 
 fyi_goma_canary_builder(
-    name = 'ios-device-goma-canary-clobber',
+    name = "ios-device-goma-canary-clobber",
     caches = [xcode_cache.x11e146],
     cores = None,
     os = os.MAC_ANY,
     properties = {
-      'xcode_build_version': '11e146'
-    }
+        "xcode_build_version": "11e146",
+    },
 )
 
 fyi_goma_canary_builder(
-    name = 'linux-archive-rel-goma-canary',
+    name = "linux-archive-rel-goma-canary",
 )
 
 fyi_goma_canary_builder(
-    name = 'linux-archive-rel-goma-canary-localoutputcache',
+    name = "linux-archive-rel-goma-canary-localoutputcache",
 )
 
 fyi_goma_canary_builder(
-    name = 'mac-archive-rel-goma-canary',
+    name = "mac-archive-rel-goma-canary",
     cores = 4,
     os = os.MAC_DEFAULT,
 )
 
 fyi_goma_canary_builder(
-    name = 'mac-archive-rel-goma-canary-localoutputcache',
+    name = "mac-archive-rel-goma-canary-localoutputcache",
     cores = 4,
     os = os.MAC_DEFAULT,
 )
 
 fyi_goma_canary_builder(
-    name = 'win32-archive-rel-goma-canary-localoutputcache',
+    name = "win32-archive-rel-goma-canary-localoutputcache",
     os = os.WINDOWS_DEFAULT,
 )
 
-
 def fyi_goma_rbe_canary_builder(
-    *,
-    name,
-    goma_backend=goma.backend.RBE_PROD,
-    os=os.LINUX_DEFAULT,
-    **kwargs):
-  return builder(
-      name = name,
-      execution_timeout = 10 * time.hour,
-      goma_backend = goma_backend,
-      mastername = 'chromium.goma.fyi',
-      os = os,
-      **kwargs
-  )
+        *,
+        name,
+        goma_backend = goma.backend.RBE_PROD,
+        os = os.LINUX_DEFAULT,
+        **kwargs):
+    return builder(
+        name = name,
+        execution_timeout = 10 * time.hour,
+        goma_backend = goma_backend,
+        mastername = "chromium.goma.fyi",
+        os = os,
+        **kwargs
+    )
 
 fyi_goma_rbe_canary_builder(
-    name = 'Linux Builder Goma RBE Canary',
+    name = "Linux Builder Goma RBE Canary",
 )
 
 fyi_goma_rbe_canary_builder(
-    name = 'Mac Builder (dbg) Goma RBE Canary (clobber)',
+    name = "Mac Builder (dbg) Goma RBE Canary (clobber)",
     cores = 4,
     goma_jobs = goma.jobs.J80,
     os = os.MAC_DEFAULT,
 )
 
 fyi_goma_rbe_canary_builder(
-    name = 'android-archive-dbg-goma-rbe-ats-canary',
+    name = "android-archive-dbg-goma-rbe-ats-canary",
     goma_enable_ats = True,
 )
 
 fyi_goma_rbe_canary_builder(
-    name = 'android-archive-dbg-goma-rbe-canary',
+    name = "android-archive-dbg-goma-rbe-canary",
 )
 
 fyi_goma_rbe_canary_builder(
-    name = 'chromeos-amd64-generic-rel-goma-rbe-canary',
+    name = "chromeos-amd64-generic-rel-goma-rbe-canary",
     goma_enable_ats = True,
 )
 
 fyi_goma_rbe_canary_builder(
-    name = 'ios-device-goma-rbe-canary-clobber',
+    name = "ios-device-goma-rbe-canary-clobber",
     caches = [xcode_cache.x11e146],
     cores = None,
     os = os.MAC_ANY,
     properties = {
-      'xcode_build_version': '11e146'
-    }
+        "xcode_build_version": "11e146",
+    },
 )
 
 fyi_goma_rbe_canary_builder(
-    name = 'linux-archive-rel-goma-rbe-ats-canary',
+    name = "linux-archive-rel-goma-rbe-ats-canary",
     goma_enable_ats = True,
 )
 
 fyi_goma_rbe_canary_builder(
-    name = 'linux-archive-rel-goma-rbe-canary',
+    name = "linux-archive-rel-goma-rbe-canary",
 )
 
 fyi_goma_rbe_canary_builder(
-    name = 'mac-archive-rel-goma-rbe-canary',
+    name = "mac-archive-rel-goma-rbe-canary",
     cores = 4,
     goma_jobs = goma.jobs.J80,
     os = os.MAC_DEFAULT,
 )
 
-
-def fyi_goma_latest_client_builder(*, name, os=os.LINUX_DEFAULT, **kwargs):
-  return builder(
-      name = name,
-      mastername = 'chromium.goma.fyi',
-      execution_timeout = 10 * time.hour,
-      os = os,
-      **kwargs
-  )
+def fyi_goma_latest_client_builder(*, name, os = os.LINUX_DEFAULT, **kwargs):
+    return builder(
+        name = name,
+        mastername = "chromium.goma.fyi",
+        execution_timeout = 10 * time.hour,
+        os = os,
+        **kwargs
+    )
 
 fyi_goma_latest_client_builder(
-    name = 'Linux Builder Goma Latest Client',
+    name = "Linux Builder Goma Latest Client",
 )
 
 fyi_goma_latest_client_builder(
-    name = 'Mac Builder (dbg) Goma Latest Client',
+    name = "Mac Builder (dbg) Goma Latest Client",
     cores = 4,
     os = os.MAC_DEFAULT,
 )
 
 fyi_goma_latest_client_builder(
-    name = 'Mac Builder (dbg) Goma Latest Client (clobber)',
+    name = "Mac Builder (dbg) Goma Latest Client (clobber)",
     cores = 4,
     os = os.MAC_DEFAULT,
 )
 
 fyi_goma_latest_client_builder(
-    name = 'Mac Builder Goma Latest Client',
+    name = "Mac Builder Goma Latest Client",
     cores = 4,
     os = os.MAC_DEFAULT,
 )
 
 fyi_goma_latest_client_builder(
-    name = 'Win Builder (dbg) Goma Latest Client',
+    name = "Win Builder (dbg) Goma Latest Client",
     os = os.WINDOWS_DEFAULT,
 )
 
 fyi_goma_latest_client_builder(
-    name = 'Win Builder Goma Latest Client',
+    name = "Win Builder Goma Latest Client",
     os = os.WINDOWS_DEFAULT,
 )
 
 fyi_goma_latest_client_builder(
-    name = 'Win7 Builder (dbg) Goma Latest Client',
+    name = "Win7 Builder (dbg) Goma Latest Client",
     os = os.WINDOWS_7,
 )
 
 fyi_goma_latest_client_builder(
-    name = 'Win7 Builder Goma Latest Client',
+    name = "Win7 Builder Goma Latest Client",
     os = os.WINDOWS_7,
 )
 
 fyi_goma_latest_client_builder(
-    name = 'android-archive-dbg-goma-latest',
+    name = "android-archive-dbg-goma-latest",
 )
 
 fyi_goma_latest_client_builder(
-    name = 'chromeos-amd64-generic-rel-goma-latest',
+    name = "chromeos-amd64-generic-rel-goma-latest",
 )
 
 fyi_goma_latest_client_builder(
-    name = 'ios-device-goma-latest-clobber',
+    name = "ios-device-goma-latest-clobber",
     caches = [xcode_cache.x11e146],
     cores = None,
     os = os.MAC_ANY,
     properties = {
-      'xcode_build_version': '11e146'
-    }
+        "xcode_build_version": "11e146",
+    },
 )
 
 fyi_goma_latest_client_builder(
-    name = 'linux-archive-rel-goma-latest',
+    name = "linux-archive-rel-goma-latest",
 )
 
 fyi_goma_latest_client_builder(
-    name = 'linux-archive-rel-goma-latest-localoutputcache',
+    name = "linux-archive-rel-goma-latest-localoutputcache",
 )
 
 fyi_goma_latest_client_builder(
-    name = 'mac-archive-rel-goma-latest',
+    name = "mac-archive-rel-goma-latest",
     cores = 4,
     os = os.MAC_DEFAULT,
 )
 
 fyi_goma_latest_client_builder(
-    name = 'mac-archive-rel-goma-latest-localoutputcache',
+    name = "mac-archive-rel-goma-latest-localoutputcache",
     cores = 4,
     os = os.MAC_DEFAULT,
 )
 
 fyi_goma_latest_client_builder(
-    name = 'win32-archive-rel-goma-latest-localoutputcache',
+    name = "win32-archive-rel-goma-latest-localoutputcache",
     os = os.WINDOWS_DEFAULT,
 )
 
-
 def fyi_goma_rbe_latest_client_builder(
-    *,
-    name,
-    goma_backend=goma.backend.RBE_PROD,
-    os=os.LINUX_DEFAULT,
-    **kwargs):
-  return builder(
-      name = name,
-      execution_timeout = 10 * time.hour,
-      goma_backend = goma_backend,
-      mastername = 'chromium.goma.fyi',
-      os = os,
-      **kwargs
-  )
+        *,
+        name,
+        goma_backend = goma.backend.RBE_PROD,
+        os = os.LINUX_DEFAULT,
+        **kwargs):
+    return builder(
+        name = name,
+        execution_timeout = 10 * time.hour,
+        goma_backend = goma_backend,
+        mastername = "chromium.goma.fyi",
+        os = os,
+        **kwargs
+    )
 
 fyi_goma_rbe_latest_client_builder(
-    name = 'Linux Builder Goma RBE Latest Client',
+    name = "Linux Builder Goma RBE Latest Client",
 )
 
 fyi_goma_rbe_latest_client_builder(
-    name = 'Mac Builder (dbg) Goma RBE Latest Client (clobber)',
+    name = "Mac Builder (dbg) Goma RBE Latest Client (clobber)",
     cores = 4,
     goma_jobs = goma.jobs.J80,
     os = os.MAC_DEFAULT,
 )
 
 fyi_goma_rbe_latest_client_builder(
-    name = 'Win Builder (dbg) Goma RBE Latest Client',
+    name = "Win Builder (dbg) Goma RBE Latest Client",
     goma_backend = goma.backend.RBE_STAGING,
     goma_enable_ats = True,
     os = os.WINDOWS_DEFAULT,
 )
 
 fyi_goma_rbe_latest_client_builder(
-    name = 'Win Builder Goma RBE Latest Client',
+    name = "Win Builder Goma RBE Latest Client",
     goma_backend = goma.backend.RBE_STAGING,
     goma_enable_ats = True,
     os = os.WINDOWS_DEFAULT,
 )
 
 fyi_goma_rbe_latest_client_builder(
-    name = 'android-archive-dbg-goma-rbe-ats-latest',
+    name = "android-archive-dbg-goma-rbe-ats-latest",
     goma_enable_ats = True,
 )
 
 fyi_goma_rbe_latest_client_builder(
-    name = 'android-archive-dbg-goma-rbe-latest',
+    name = "android-archive-dbg-goma-rbe-latest",
 )
 
 fyi_goma_rbe_latest_client_builder(
-    name = 'chromeos-amd64-generic-rel-goma-rbe-latest',
+    name = "chromeos-amd64-generic-rel-goma-rbe-latest",
     goma_enable_ats = True,
 )
 
 fyi_goma_rbe_latest_client_builder(
-    name = 'ios-device-goma-rbe-latest-clobber',
+    name = "ios-device-goma-rbe-latest-clobber",
     caches = [xcode_cache.x11e146],
     cores = None,
     os = os.MAC_ANY,
     properties = {
-      'xcode_build_version': '11e146'
-    }
+        "xcode_build_version": "11e146",
+    },
 )
 
 fyi_goma_rbe_latest_client_builder(
-    name = 'linux-archive-rel-goma-rbe-ats-latest',
+    name = "linux-archive-rel-goma-rbe-ats-latest",
     goma_enable_ats = True,
 )
 
 fyi_goma_rbe_latest_client_builder(
-    name = 'linux-archive-rel-goma-rbe-latest',
+    name = "linux-archive-rel-goma-rbe-latest",
 )
 
 fyi_goma_rbe_latest_client_builder(
-    name = 'mac-archive-rel-goma-rbe-latest',
+    name = "mac-archive-rel-goma-rbe-latest",
     cores = 4,
     goma_jobs = goma.jobs.J80,
     os = os.MAC_DEFAULT,
 )
 
-
-def goma_builder(*, name, builderless=False, os=os.LINUX_DEFAULT, **kwargs):
-  return builder(
-      name = name,
-      builderless = builderless,
-      mastername = 'chromium.goma',
-      os = os,
-      **kwargs
-  )
+def goma_builder(*, name, builderless = False, os = os.LINUX_DEFAULT, **kwargs):
+    return builder(
+        name = name,
+        builderless = builderless,
+        mastername = "chromium.goma",
+        os = os,
+        **kwargs
+    )
 
 goma_builder(
-    name = 'Chromium Android ARM 32-bit Goma RBE Staging',
+    name = "Chromium Android ARM 32-bit Goma RBE Staging",
     goma_backend = goma.backend.RBE_STAGING,
 )
 
 goma_builder(
-    name = 'Chromium Android ARM 32-bit Goma RBE ToT',
+    name = "Chromium Android ARM 32-bit Goma RBE ToT",
     goma_backend = goma.backend.RBE_TOT,
     goma_enable_ats = False,
     goma_use_luci_auth = True,
 )
 
 goma_builder(
-    name = 'Chromium Android ARM 32-bit Goma RBE ToT (ATS)',
+    name = "Chromium Android ARM 32-bit Goma RBE ToT (ATS)",
     goma_backend = goma.backend.RBE_TOT,
     goma_enable_ats = True,
     goma_use_luci_auth = True,
 )
 
 goma_builder(
-    name = 'Chromium Linux Goma RBE Staging',
+    name = "Chromium Linux Goma RBE Staging",
     goma_backend = goma.backend.RBE_STAGING,
 )
 
 goma_builder(
-    name = 'Chromium Linux Goma RBE Staging (clobber)',
+    name = "Chromium Linux Goma RBE Staging (clobber)",
     goma_backend = goma.backend.RBE_STAGING,
 )
 
 goma_builder(
-    name = 'Chromium Linux Goma RBE Staging (dbg)',
+    name = "Chromium Linux Goma RBE Staging (dbg)",
     goma_backend = goma.backend.RBE_STAGING,
 )
 
 goma_builder(
-    name = 'Chromium Linux Goma RBE Staging (dbg) (clobber)',
+    name = "Chromium Linux Goma RBE Staging (dbg) (clobber)",
     goma_backend = goma.backend.RBE_STAGING,
 )
 
 goma_builder(
-    name = 'Chromium Linux Goma Staging',
+    name = "Chromium Linux Goma Staging",
 )
 
 goma_builder(
-    name = 'Chromium Linux Goma RBE ToT',
+    name = "Chromium Linux Goma RBE ToT",
     goma_backend = goma.backend.RBE_TOT,
     goma_enable_ats = False,
     goma_use_luci_auth = True,
 )
 
 goma_builder(
-    name = 'Chromium Linux Goma RBE ToT (ATS)',
+    name = "Chromium Linux Goma RBE ToT (ATS)",
     goma_backend = goma.backend.RBE_TOT,
     goma_enable_ats = True,
     goma_use_luci_auth = True,
 )
 
-
-def goma_mac_builder(*, name, os=os.MAC_DEFAULT, **kwargs):
-  return goma_builder(
-      name = name,
-      cores = 4,
-      goma_jobs = goma.jobs.J80,
-      os = os,
-      **kwargs
-  )
+def goma_mac_builder(*, name, os = os.MAC_DEFAULT, **kwargs):
+    return goma_builder(
+        name = name,
+        cores = 4,
+        goma_jobs = goma.jobs.J80,
+        os = os,
+        **kwargs
+    )
 
 goma_mac_builder(
-    name = 'Chromium iOS Goma RBE ToT',
+    name = "Chromium iOS Goma RBE ToT",
     caches = [xcode_cache.x11e146],
     goma_backend = goma.backend.RBE_TOT,
     goma_use_luci_auth = True,
     os = os.MAC_10_14,
     properties = {
-      'xcode_build_version': "11e146",
-    }
+        "xcode_build_version": "11e146",
+    },
 )
 
 goma_mac_builder(
-    name = 'Chromium Mac Goma RBE Staging',
+    name = "Chromium Mac Goma RBE Staging",
     goma_backend = goma.backend.RBE_STAGING,
 )
 
 goma_mac_builder(
-    name = 'Chromium Mac Goma RBE Staging (clobber)',
+    name = "Chromium Mac Goma RBE Staging (clobber)",
     goma_backend = goma.backend.RBE_STAGING,
 )
 
 goma_mac_builder(
-    name = 'Chromium Mac Goma RBE Staging (dbg)',
+    name = "Chromium Mac Goma RBE Staging (dbg)",
     goma_backend = goma.backend.RBE_STAGING,
 )
 
 goma_mac_builder(
-    name = 'Chromium Mac Goma RBE ToT',
+    name = "Chromium Mac Goma RBE ToT",
     goma_backend = goma.backend.RBE_TOT,
     goma_use_luci_auth = True,
 )
 
 goma_mac_builder(
-    name = 'Chromium Mac Goma Staging',
+    name = "Chromium Mac Goma Staging",
 )
 
-
-def goma_windows_builder(*, name, goma_enable_ats=True, cores=32, **kwargs):
-  return goma_builder(
-      name = name,
-      cores = cores,
-      goma_enable_ats = goma_enable_ats,
-      os = os.WINDOWS_DEFAULT,
-      **kwargs
-  )
+def goma_windows_builder(*, name, goma_enable_ats = True, cores = 32, **kwargs):
+    return goma_builder(
+        name = name,
+        cores = cores,
+        goma_enable_ats = goma_enable_ats,
+        os = os.WINDOWS_DEFAULT,
+        **kwargs
+    )
 
 goma_windows_builder(
-    name = 'Chromium Win Goma RBE Staging',
+    name = "Chromium Win Goma RBE Staging",
     goma_backend = goma.backend.RBE_STAGING,
 )
 
 goma_windows_builder(
-    name = 'Chromium Win Goma RBE Staging (clobber)',
+    name = "Chromium Win Goma RBE Staging (clobber)",
     goma_backend = goma.backend.RBE_STAGING,
 )
 
 goma_windows_builder(
-    name = 'Chromium Win Goma RBE ToT',
+    name = "Chromium Win Goma RBE ToT",
     goma_backend = goma.backend.RBE_TOT,
     goma_use_luci_auth = True,
 )
 
 goma_windows_builder(
-    name = 'CrWinGomaStaging',
+    name = "CrWinGomaStaging",
     cores = 8,
     goma_enable_ats = False,
 )
diff --git a/infra/config/subprojects/goma/subproject.star b/infra/config/subprojects/goma/subproject.star
index 1335fdd..0ff40f4 100644
--- a/infra/config/subprojects/goma/subproject.star
+++ b/infra/config/subprojects/goma/subproject.star
@@ -2,9 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-exec('./goma.star')
-exec('./consoles/chromium.goma.star')
-exec('./consoles/chromium.goma.fyi.star')
-exec('./consoles/chromium.goma.migration.star')
-exec('./consoles/goma.latest.star')
-exec('./consoles/luci.chromium.goma.star')
+exec("./goma.star")
+exec("./consoles/chromium.goma.star")
+exec("./consoles/chromium.goma.fyi.star")
+exec("./consoles/chromium.goma.migration.star")
+exec("./consoles/goma.latest.star")
+exec("./consoles/luci.chromium.goma.star")
diff --git a/infra/config/subprojects/webrtc/consoles/chromium.webrtc.fyi.star b/infra/config/subprojects/webrtc/consoles/chromium.webrtc.fyi.star
index 0a4dffe..a5b390c 100644
--- a/infra/config/subprojects/webrtc/consoles/chromium.webrtc.fyi.star
+++ b/infra/config/subprojects/webrtc/consoles/chromium.webrtc.fyi.star
@@ -3,99 +3,99 @@
 # found in the LICENSE file.
 
 luci.console_view(
-    name = 'chromium.webrtc.fyi',
-    header = '//chromium-header.textpb',
-    repo = 'https://webrtc.googlesource.com/src',
+    name = "chromium.webrtc.fyi",
+    header = "//chromium-header.textpb",
+    repo = "https://webrtc.googlesource.com/src",
     entries = [
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Android Builder (dbg)',
-            category = 'android|debug|builder',
-            short_name = '32',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Android Builder (dbg)",
+            category = "android|debug|builder",
+            short_name = "32",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Android Builder ARM64 (dbg)',
-            category = 'android|debug|builder',
-            short_name = '64',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Android Builder ARM64 (dbg)",
+            category = "android|debug|builder",
+            short_name = "64",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Android Tests (dbg) (L Nexus5)',
-            category = 'android|debug|tester',
-            short_name = 'L',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Android Tests (dbg) (L Nexus5)",
+            category = "android|debug|tester",
+            short_name = "L",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Android Tests (dbg) (M Nexus5X)',
-            category = 'android|debug|tester',
-            short_name = 'M',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Android Tests (dbg) (M Nexus5X)",
+            category = "android|debug|tester",
+            short_name = "M",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Android Builder',
-            category = 'android|release',
-            short_name = '32',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Android Builder",
+            category = "android|release",
+            short_name = "32",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Linux Builder (dbg)',
-            category = 'linux|debug',
-            short_name = 'bld',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Linux Builder (dbg)",
+            category = "linux|debug",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Linux Builder',
-            category = 'linux|release',
-            short_name = 'bld',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Linux Builder",
+            category = "linux|release",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Linux Tester',
-            category = 'linux|release',
-            short_name = 'tst',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Linux Tester",
+            category = "linux|release",
+            short_name = "tst",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Mac Builder (dbg)',
-            category = 'mac|debug',
-            short_name = 'bld',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Mac Builder (dbg)",
+            category = "mac|debug",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Mac Builder',
-            category = 'mac|release',
-            short_name = 'bld',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Mac Builder",
+            category = "mac|release",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Mac Tester',
-            category = 'mac|release',
-            short_name = 'tst',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Mac Tester",
+            category = "mac|release",
+            short_name = "tst",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Win Builder (dbg)',
-            category = 'win|debug',
-            short_name = 'bld',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Win Builder (dbg)",
+            category = "win|debug",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Win Builder',
-            category = 'win|release|builder',
-            short_name = '32',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Win Builder",
+            category = "win|release|builder",
+            short_name = "32",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Win10 Tester',
-            category = 'win|release|tester',
-            short_name = '10',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Win10 Tester",
+            category = "win|release|tester",
+            short_name = "10",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Win7 Tester',
-            category = 'win|release|tester',
-            short_name = '7',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Win7 Tester",
+            category = "win|release|tester",
+            short_name = "7",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI Win8 Tester',
-            category = 'win|release|tester',
-            short_name = '8',
+            builder = "webrtc.fyi/WebRTC Chromium FYI Win8 Tester",
+            category = "win|release|tester",
+            short_name = "8",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI ios-device',
-            category = 'ios',
-            short_name = 'dev',
+            builder = "webrtc.fyi/WebRTC Chromium FYI ios-device",
+            category = "ios",
+            short_name = "dev",
         ),
         luci.console_view_entry(
-            builder = 'webrtc.fyi/WebRTC Chromium FYI ios-simulator',
-            category = 'ios',
-            short_name = 'sim',
+            builder = "webrtc.fyi/WebRTC Chromium FYI ios-simulator",
+            category = "ios",
+            short_name = "sim",
         ),
     ],
 )
diff --git a/infra/config/subprojects/webrtc/consoles/chromium.webrtc.star b/infra/config/subprojects/webrtc/consoles/chromium.webrtc.star
index 4dd2efa..e5d92b63 100644
--- a/infra/config/subprojects/webrtc/consoles/chromium.webrtc.star
+++ b/infra/config/subprojects/webrtc/consoles/chromium.webrtc.star
@@ -3,59 +3,59 @@
 # found in the LICENSE file.
 
 luci.console_view(
-    name = 'chromium.webrtc',
-    header = '//chromium-header.textpb',
-    repo = 'https://chromium.googlesource.com/chromium/src',
+    name = "chromium.webrtc",
+    header = "//chromium-header.textpb",
+    repo = "https://chromium.googlesource.com/chromium/src",
     entries = [
         luci.console_view_entry(
-            builder = 'webrtc/WebRTC Chromium Android Builder',
-            category = 'android',
-            short_name = 'bld',
+            builder = "webrtc/WebRTC Chromium Android Builder",
+            category = "android",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'webrtc/WebRTC Chromium Android Tester',
-            category = 'android',
-            short_name = 'tst',
+            builder = "webrtc/WebRTC Chromium Android Tester",
+            category = "android",
+            short_name = "tst",
         ),
         luci.console_view_entry(
-            builder = 'webrtc/WebRTC Chromium Linux Builder',
-            category = 'linux',
-            short_name = 'bld',
+            builder = "webrtc/WebRTC Chromium Linux Builder",
+            category = "linux",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'webrtc/WebRTC Chromium Linux Tester',
-            category = 'linux',
-            short_name = 'tst',
+            builder = "webrtc/WebRTC Chromium Linux Tester",
+            category = "linux",
+            short_name = "tst",
         ),
         luci.console_view_entry(
-            builder = 'webrtc/WebRTC Chromium Mac Builder',
-            category = 'mac',
-            short_name = 'bld',
+            builder = "webrtc/WebRTC Chromium Mac Builder",
+            category = "mac",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'webrtc/WebRTC Chromium Mac Tester',
-            category = 'mac',
-            short_name = 'tst',
+            builder = "webrtc/WebRTC Chromium Mac Tester",
+            category = "mac",
+            short_name = "tst",
         ),
         luci.console_view_entry(
-            builder = 'webrtc/WebRTC Chromium Win Builder',
-            category = 'win',
-            short_name = 'bld',
+            builder = "webrtc/WebRTC Chromium Win Builder",
+            category = "win",
+            short_name = "bld",
         ),
         luci.console_view_entry(
-            builder = 'webrtc/WebRTC Chromium Win10 Tester',
-            category = 'win',
-            short_name = '10',
+            builder = "webrtc/WebRTC Chromium Win10 Tester",
+            category = "win",
+            short_name = "10",
         ),
         luci.console_view_entry(
-            builder = 'webrtc/WebRTC Chromium Win7 Tester',
-            category = 'win',
-            short_name = '7',
+            builder = "webrtc/WebRTC Chromium Win7 Tester",
+            category = "win",
+            short_name = "7",
         ),
         luci.console_view_entry(
-            builder = 'webrtc/WebRTC Chromium Win8 Tester',
-            category = 'win',
-            short_name = '8',
+            builder = "webrtc/WebRTC Chromium Win8 Tester",
+            category = "win",
+            short_name = "8",
         ),
     ],
 )
diff --git a/infra/config/subprojects/webrtc/subproject.star b/infra/config/subprojects/webrtc/subproject.star
index 30885e4..e722f7e8 100644
--- a/infra/config/subprojects/webrtc/subproject.star
+++ b/infra/config/subprojects/webrtc/subproject.star
@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-exec('./webrtc.star')
-exec('./webrtc.fyi.star')
-exec('./consoles/chromium.webrtc.star')
-exec('./consoles/chromium.webrtc.fyi.star')
+exec("./webrtc.star")
+exec("./webrtc.fyi.star")
+exec("./consoles/chromium.webrtc.star")
+exec("./consoles/chromium.webrtc.fyi.star")
diff --git a/infra/config/subprojects/webrtc/webrtc.fyi.star b/infra/config/subprojects/webrtc/webrtc.fyi.star
index 65573a24..381ff55 100644
--- a/infra/config/subprojects/webrtc/webrtc.fyi.star
+++ b/infra/config/subprojects/webrtc/webrtc.fyi.star
@@ -2,173 +2,171 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'builder', 'cpu', 'defaults', 'goma', 'os', 'xcode_cache')
+load("//lib/builders.star", "builder", "cpu", "defaults", "goma", "os", "xcode_cache")
 
 luci.bucket(
-    name = 'webrtc.fyi',
+    name = "webrtc.fyi",
     acls = [
         acl.entry(
             roles = acl.BUILDBUCKET_READER,
-            groups = 'all',
+            groups = "all",
         ),
         acl.entry(
             roles = acl.BUILDBUCKET_TRIGGERER,
-            groups = 'project-chromium-ci-schedulers',
+            groups = "project-chromium-ci-schedulers",
         ),
         acl.entry(
             roles = acl.BUILDBUCKET_OWNER,
-            groups = 'google/luci-task-force@google.com',
+            groups = "google/luci-task-force@google.com",
         ),
         acl.entry(
             roles = acl.SCHEDULER_OWNER,
-            groups = 'project-webrtc-admins',
+            groups = "project-webrtc-admins",
         ),
     ],
 )
 
 luci.gitiles_poller(
-    name = 'webrtc-gitiles-trigger-master',
-    bucket = 'webrtc',
-    repo = 'https://webrtc.googlesource.com/src/',
+    name = "webrtc-gitiles-trigger-master",
+    bucket = "webrtc",
+    repo = "https://webrtc.googlesource.com/src/",
 )
 
-defaults.bucket.set('webrtc.fyi')
+defaults.bucket.set("webrtc.fyi")
 defaults.builderless.set(None)
 defaults.build_numbers.set(True)
 defaults.cpu.set(cpu.X86_64)
-defaults.executable.set('recipe:chromium')
+defaults.executable.set("recipe:chromium")
 defaults.execution_timeout.set(2 * time.hour)
-defaults.mastername.set('chromium.webrtc.fyi')
+defaults.mastername.set("chromium.webrtc.fyi")
 defaults.os.set(os.LINUX_DEFAULT)
-defaults.pool.set('luci.chromium.webrtc.fyi')
-defaults.service_account.set('chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com')
-defaults.swarming_tags.set(['vpython:native-python-wrapper'])
-defaults.triggered_by.set(['webrtc-gitiles-trigger-master'])
-
+defaults.pool.set("luci.chromium.webrtc.fyi")
+defaults.service_account.set("chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com")
+defaults.swarming_tags.set(["vpython:native-python-wrapper"])
+defaults.triggered_by.set(["webrtc-gitiles-trigger-master"])
 
 # Builders are defined in lexicographic order by name
 
-
 builder(
-    name = 'WebRTC Chromium FYI Android Builder',
+    name = "WebRTC Chromium FYI Android Builder",
     goma_backend = goma.backend.RBE_PROD,
 )
 
 builder(
-    name = 'WebRTC Chromium FYI Android Builder (dbg)',
+    name = "WebRTC Chromium FYI Android Builder (dbg)",
     goma_backend = goma.backend.RBE_PROD,
 )
 
 builder(
-    name = 'WebRTC Chromium FYI Android Builder ARM64 (dbg)',
+    name = "WebRTC Chromium FYI Android Builder ARM64 (dbg)",
     goma_backend = goma.backend.RBE_PROD,
 )
 
 builder(
-    name = 'WebRTC Chromium FYI Android Tests (dbg) (L Nexus5)',
-    triggered_by = ['WebRTC Chromium FYI Android Builder (dbg)'],
+    name = "WebRTC Chromium FYI Android Tests (dbg) (L Nexus5)",
+    triggered_by = ["WebRTC Chromium FYI Android Builder (dbg)"],
 )
 
 builder(
-    name = 'WebRTC Chromium FYI Android Tests (dbg) (M Nexus5X)',
-    triggered_by = ['WebRTC Chromium FYI Android Builder ARM64 (dbg)'],
+    name = "WebRTC Chromium FYI Android Tests (dbg) (M Nexus5X)",
+    triggered_by = ["WebRTC Chromium FYI Android Builder ARM64 (dbg)"],
 )
 
 builder(
-    name = 'WebRTC Chromium FYI Linux Builder',
+    name = "WebRTC Chromium FYI Linux Builder",
     goma_backend = goma.backend.RBE_PROD,
 )
 
 builder(
-    name = 'WebRTC Chromium FYI Linux Builder (dbg)',
+    name = "WebRTC Chromium FYI Linux Builder (dbg)",
     goma_backend = goma.backend.RBE_PROD,
 )
 
 builder(
-    name = 'WebRTC Chromium FYI Linux Tester',
-    triggered_by = ['WebRTC Chromium FYI Linux Builder'],
+    name = "WebRTC Chromium FYI Linux Tester",
+    triggered_by = ["WebRTC Chromium FYI Linux Builder"],
 )
 
 builder(
-    name = 'WebRTC Chromium FYI Mac Builder',
+    name = "WebRTC Chromium FYI Mac Builder",
     cores = 8,
     caches = [xcode_cache.x11c29],
     goma_backend = goma.backend.RBE_PROD,
     os = os.MAC_ANY,
     properties = {
-        'xcode_build_version': '11c29',
+        "xcode_build_version": "11c29",
     },
 )
 
 builder(
-    name = 'WebRTC Chromium FYI Mac Builder (dbg)',
+    name = "WebRTC Chromium FYI Mac Builder (dbg)",
     cores = 8,
     caches = [xcode_cache.x11c29],
     goma_backend = goma.backend.RBE_PROD,
     os = os.MAC_ANY,
     properties = {
-        'xcode_build_version': '11c29',
+        "xcode_build_version": "11c29",
     },
 )
 
 builder(
-    name = 'WebRTC Chromium FYI Mac Tester',
+    name = "WebRTC Chromium FYI Mac Tester",
     caches = [xcode_cache.x11c29],
     os = os.MAC_ANY,
     properties = {
-        'xcode_build_version': '11c29',
+        "xcode_build_version": "11c29",
     },
-    triggered_by = ['WebRTC Chromium FYI Mac Builder'],
+    triggered_by = ["WebRTC Chromium FYI Mac Builder"],
 )
 
 builder(
-    name = 'WebRTC Chromium FYI Win Builder',
+    name = "WebRTC Chromium FYI Win Builder",
     goma_backend = goma.backend.RBE_PROD,
     os = os.WINDOWS_DEFAULT,
 )
 
 builder(
-    name = 'WebRTC Chromium FYI Win Builder (dbg)',
+    name = "WebRTC Chromium FYI Win Builder (dbg)",
     goma_backend = goma.backend.RBE_PROD,
     os = os.WINDOWS_DEFAULT,
 )
 
 builder(
-    name = 'WebRTC Chromium FYI Win10 Tester',
+    name = "WebRTC Chromium FYI Win10 Tester",
     os = os.WINDOWS_DEFAULT,
-    triggered_by = ['WebRTC Chromium FYI Win Builder'],
+    triggered_by = ["WebRTC Chromium FYI Win Builder"],
 )
 
 builder(
-    name = 'WebRTC Chromium FYI Win7 Tester',
+    name = "WebRTC Chromium FYI Win7 Tester",
     os = os.WINDOWS_7,
-    triggered_by = ['WebRTC Chromium FYI Win Builder'],
+    triggered_by = ["WebRTC Chromium FYI Win Builder"],
 )
 
 builder(
-    name = 'WebRTC Chromium FYI Win8 Tester',
+    name = "WebRTC Chromium FYI Win8 Tester",
     os = os.WINDOWS_8_1,
-    triggered_by = ['WebRTC Chromium FYI Win Builder'],
+    triggered_by = ["WebRTC Chromium FYI Win Builder"],
 )
 
 builder(
-    name = 'WebRTC Chromium FYI ios-device',
+    name = "WebRTC Chromium FYI ios-device",
     caches = [xcode_cache.x11e146],
-    executable = 'recipe:webrtc/chromium_ios',
+    executable = "recipe:webrtc/chromium_ios",
     goma_backend = goma.backend.RBE_PROD,
     os = os.MAC_ANY,
     properties = {
-        'xcode_build_version': '11e146',
+        "xcode_build_version": "11e146",
     },
 )
 
 builder(
-    name = 'WebRTC Chromium FYI ios-simulator',
+    name = "WebRTC Chromium FYI ios-simulator",
     caches = [xcode_cache.x11e146],
-    executable = 'recipe:webrtc/chromium_ios',
+    executable = "recipe:webrtc/chromium_ios",
     goma_backend = goma.backend.RBE_PROD,
     os = os.MAC_ANY,
     properties = {
-        'xcode_build_version': '11e146',
+        "xcode_build_version": "11e146",
     },
 )
diff --git a/infra/config/subprojects/webrtc/webrtc.star b/infra/config/subprojects/webrtc/webrtc.star
index 8105b27..b43cb0d 100644
--- a/infra/config/subprojects/webrtc/webrtc.star
+++ b/infra/config/subprojects/webrtc/webrtc.star
@@ -2,103 +2,101 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-load('//lib/builders.star', 'builder', 'cpu', 'defaults', 'goma', 'os')
+load("//lib/builders.star", "builder", "cpu", "defaults", "goma", "os")
 
 luci.bucket(
-    name = 'webrtc',
+    name = "webrtc",
     acls = [
         acl.entry(
             roles = acl.BUILDBUCKET_READER,
-            groups = 'all',
+            groups = "all",
         ),
         acl.entry(
             roles = acl.BUILDBUCKET_TRIGGERER,
-            groups = 'project-chromium-ci-schedulers',
+            groups = "project-chromium-ci-schedulers",
         ),
         acl.entry(
             roles = acl.BUILDBUCKET_OWNER,
-            groups = 'google/luci-task-force@google.com',
+            groups = "google/luci-task-force@google.com",
         ),
         acl.entry(
             roles = acl.SCHEDULER_OWNER,
-            groups = 'project-webrtc-admins',
+            groups = "project-webrtc-admins",
         ),
     ],
 )
 
-defaults.bucket.set('webrtc')
+defaults.bucket.set("webrtc")
 defaults.builderless.set(False)
 defaults.build_numbers.set(True)
 defaults.cpu.set(cpu.X86_64)
-defaults.executable.set('recipe:chromium')
+defaults.executable.set("recipe:chromium")
 defaults.execution_timeout.set(2 * time.hour)
-defaults.mastername.set('chromium.webrtc')
+defaults.mastername.set("chromium.webrtc")
 defaults.os.set(os.LINUX_DEFAULT)
-defaults.service_account.set('chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com')
-defaults.swarming_tags.set(['vpython:native-python-wrapper'])
-defaults.triggered_by.set(['master-gitiles-trigger'])
+defaults.service_account.set("chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com")
+defaults.swarming_tags.set(["vpython:native-python-wrapper"])
+defaults.triggered_by.set(["master-gitiles-trigger"])
 
 defaults.properties.set({
-    'perf_dashboard_machine_group': 'ChromiumWebRTC',
+    "perf_dashboard_machine_group": "ChromiumWebRTC",
 })
 
-
 # Builders are defined in lexicographic order by name
 
-
 builder(
-    name = 'WebRTC Chromium Android Builder',
+    name = "WebRTC Chromium Android Builder",
     goma_backend = goma.backend.RBE_PROD,
 )
 
 builder(
-    name = 'WebRTC Chromium Android Tester',
-    triggered_by = ['WebRTC Chromium Android Builder'],
+    name = "WebRTC Chromium Android Tester",
+    triggered_by = ["WebRTC Chromium Android Builder"],
 )
 
 builder(
-    name = 'WebRTC Chromium Linux Builder',
+    name = "WebRTC Chromium Linux Builder",
     goma_backend = goma.backend.RBE_PROD,
 )
 
 builder(
-    name = 'WebRTC Chromium Linux Tester',
-    triggered_by = ['WebRTC Chromium Linux Builder'],
+    name = "WebRTC Chromium Linux Tester",
+    triggered_by = ["WebRTC Chromium Linux Builder"],
 )
 
 builder(
-    name = 'WebRTC Chromium Mac Builder',
+    name = "WebRTC Chromium Mac Builder",
     cores = 8,
     goma_backend = goma.backend.RBE_PROD,
     os = os.MAC_ANY,
 )
 
 builder(
-    name = 'WebRTC Chromium Mac Tester',
+    name = "WebRTC Chromium Mac Tester",
     os = os.MAC_ANY,
-    triggered_by = ['WebRTC Chromium Mac Builder'],
+    triggered_by = ["WebRTC Chromium Mac Builder"],
 )
 
 builder(
-    name = 'WebRTC Chromium Win Builder',
+    name = "WebRTC Chromium Win Builder",
     goma_backend = goma.backend.RBE_PROD,
     os = os.WINDOWS_ANY,
 )
 
 builder(
-    name = 'WebRTC Chromium Win10 Tester',
+    name = "WebRTC Chromium Win10 Tester",
     os = os.WINDOWS_ANY,
-    triggered_by = ['WebRTC Chromium Win Builder'],
+    triggered_by = ["WebRTC Chromium Win Builder"],
 )
 
 builder(
-    name = 'WebRTC Chromium Win7 Tester',
+    name = "WebRTC Chromium Win7 Tester",
     os = os.WINDOWS_ANY,
-    triggered_by = ['WebRTC Chromium Win Builder'],
+    triggered_by = ["WebRTC Chromium Win Builder"],
 )
 
 builder(
-    name = 'WebRTC Chromium Win8 Tester',
+    name = "WebRTC Chromium Win8 Tester",
     os = os.WINDOWS_ANY,
-    triggered_by = ['WebRTC Chromium Win Builder'],
+    triggered_by = ["WebRTC Chromium Win Builder"],
 )
diff --git a/infra/config/validators/builders-in-consoles.star b/infra/config/validators/builders-in-consoles.star
index 0fa6316..e5c87ea 100644
--- a/infra/config/validators/builders-in-consoles.star
+++ b/infra/config/validators/builders-in-consoles.star
@@ -3,25 +3,26 @@
 # found in the LICENSE file.
 
 def _validate_builders_in_console(ctx):
-  builders = {}
+    builders = {}
 
-  for console in ctx.output['luci-milo.cfg'].consoles:
-    for builder in console.builders:
-      _, long_bucket, builder_name = builder.name.split('/')
-      _, _, bucket = long_bucket.split('.', 2)
-      builders.setdefault(bucket, {})[builder_name] = True
+    for console in ctx.output["luci-milo.cfg"].consoles:
+        for builder in console.builders:
+            _, long_bucket, builder_name = builder.name.split("/")
+            _, _, bucket = long_bucket.split(".", 2)
+            builders.setdefault(bucket, {})[builder_name] = True
 
-  builders_without_console = []
+    builders_without_console = []
 
-  for bucket in ctx.output['cr-buildbucket.cfg'].buckets:
-    bucket_builders = builders.get(bucket.name, {})
-    for builder in bucket.swarming.builders:
-      if builder.name not in bucket_builders:
-        builders_without_console.append(
-            '{}/{}'.format(bucket.name, builder.name))
+    for bucket in ctx.output["cr-buildbucket.cfg"].buckets:
+        bucket_builders = builders.get(bucket.name, {})
+        for builder in bucket.swarming.builders:
+            if builder.name not in bucket_builders:
+                builders_without_console.append(
+                    "{}/{}".format(bucket.name, builder.name),
+                )
 
-  if builders_without_console:
-    fail('The following builders do not appear in any console:\n  '
-         + '\n  '.join([repr(b) for b in builders_without_console]))
+    if builders_without_console:
+        fail("The following builders do not appear in any console:\n  " +
+             "\n  ".join([repr(b) for b in builders_without_console]))
 
 lucicfg.generator(_validate_builders_in_console)
diff --git a/ios/chrome/browser/app_launcher/app_launcher_tab_helper_unittest.mm b/ios/chrome/browser/app_launcher/app_launcher_tab_helper_unittest.mm
index e983e4a..389f779 100644
--- a/ios/chrome/browser/app_launcher/app_launcher_tab_helper_unittest.mm
+++ b/ios/chrome/browser/app_launcher/app_launcher_tab_helper_unittest.mm
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/compiler_specific.h"
+#include "base/files/scoped_temp_dir.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/time/default_clock.h"
diff --git a/ios/chrome/browser/browser_state/test_chrome_browser_state.h b/ios/chrome/browser/browser_state/test_chrome_browser_state.h
index 08f6dec..45b9c37d 100644
--- a/ios/chrome/browser/browser_state/test_chrome_browser_state.h
+++ b/ios/chrome/browser/browser_state/test_chrome_browser_state.h
@@ -10,7 +10,6 @@
 #include <vector>
 
 #include "base/files/file_path.h"
-#include "base/files/scoped_temp_dir.h"
 #include "base/macros.h"
 #include "base/sequenced_task_runner.h"
 #include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
@@ -144,11 +143,6 @@
   // and off-the-record TestChromeBrowserState has been created.
   void Init();
 
-  // We use a temporary directory to store testing browser state data.
-  // This must be declared before anything that may make use of the
-  // directory so as to ensure files are closed before cleanup.
-  base::ScopedTempDir temp_dir_;
-
   // The path to this browser state.
   base::FilePath state_path_;
 
diff --git a/ios/chrome/browser/browser_state/test_chrome_browser_state.mm b/ios/chrome/browser/browser_state/test_chrome_browser_state.mm
index bf753f2..28ad685 100644
--- a/ios/chrome/browser/browser_state/test_chrome_browser_state.mm
+++ b/ios/chrome/browser/browser_state/test_chrome_browser_state.mm
@@ -16,6 +16,7 @@
 #include "base/run_loop.h"
 #include "base/task/post_task.h"
 #include "base/task/thread_pool.h"
+#include "base/test/test_file_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/common/bookmark_constants.h"
@@ -86,33 +87,6 @@
       base::DoNothing());
 }
 
-base::FilePath CreateTempBrowserStateDir(base::ScopedTempDir* temp_dir) {
-  DCHECK(temp_dir);
-  if (!temp_dir->CreateUniqueTempDir()) {
-    // Fallback logic in case we fail to create unique temporary directory.
-    LOG(ERROR) << "Failed to create unique temporary directory.";
-    base::FilePath system_tmp_dir;
-    bool success = base::PathService::Get(base::DIR_TEMP, &system_tmp_dir);
-
-    // We're severely screwed if we can't get the system temporary
-    // directory. Die now to avoid writing to the filesystem root
-    // or other bad places.
-    CHECK(success);
-
-    base::FilePath fallback_dir(
-        system_tmp_dir.Append(FILE_PATH_LITERAL("TestChromeBrowserStatePath")));
-    base::DeletePathRecursively(fallback_dir);
-    base::CreateDirectory(fallback_dir);
-    if (!temp_dir->Set(fallback_dir)) {
-      // That shouldn't happen, but if it does, try to recover.
-      LOG(ERROR) << "Failed to use a fallback temporary directory.";
-
-      // We're screwed if this fails, see CHECK above.
-      CHECK(temp_dir->Set(system_tmp_dir));
-    }
-  }
-  return temp_dir->GetPath();
-}
 }  // namespace
 
 TestChromeBrowserState::TestChromeBrowserState(
@@ -160,12 +134,6 @@
 
   BrowserStateDependencyManager::GetInstance()->DestroyBrowserStateServices(
       this);
-  // The destructor of temp_dir_ will perform IO, so it needs to be deleted
-  // here while |allow_bocking| is still in scope. Keeps the same logic as
-  // ScopedTempDir::~ScopedTempDir().
-  if (temp_dir_.IsValid()) {
-    ignore_result(temp_dir_.Delete());
-  }
 }
 
 void TestChromeBrowserState::Init() {
@@ -178,7 +146,7 @@
          web::WebThread::CurrentlyOn(web::WebThread::UI));
 
   if (state_path_.empty())
-    state_path_ = CreateTempBrowserStateDir(&temp_dir_);
+    state_path_ = base::CreateUniqueTempDirectoryScopedToTest();
 
   if (IsOffTheRecord())
     state_path_ = state_path_.Append(FILE_PATH_LITERAL("OTR"));
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 4f89ce7..9846f9b 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -684,6 +684,10 @@
      flag_descriptions::kIOSLegacyTLSInterstitialsName,
      flag_descriptions::kIOSLegacyTLSInterstitialsDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(web::features::kIOSLegacyTLSInterstitial)},
+    {"enable-autofill-password-reauth-ios",
+     flag_descriptions::kEnableAutofillPasswordReauthIOSName,
+     flag_descriptions::kEnableAutofillPasswordReauthIOSDescription,
+     flags_ui::kOsIos, FEATURE_VALUE_TYPE(kEnableAutofillPasswordReauthIOS)},
 };
 
 bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index 07af8b9..b36d8c11 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -229,6 +229,12 @@
     "If enabled, when a server card is unmasked, its info will be cached until "
     "page navigation to simplify consecutive fills on the same page.";
 
+const char kEnableAutofillPasswordReauthIOSName[] =
+    "Enable Autofill reauth request for passwords";
+const char kEnableAutofillPasswordReauthIOSDescription[] =
+    "If enabled, when a credential will be filled, the browser will require "
+    "the user to authenticate with the device first.";
+
 const char kEnableClipboardProviderImageSuggestionsName[] =
     "Enable copied image provider";
 const char kEnableClipboardProviderImageSuggestionsDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index 731f000..108a1f7 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -192,6 +192,10 @@
 extern const char kEnableAutofillCacheServerCardInfoName[];
 extern const char kEnableAutofillCacheServerCardInfoDescription[];
 
+// Title and description for the flag to enable reauth for filling passwords.
+extern const char kEnableAutofillPasswordReauthIOSName[];
+extern const char kEnableAutofillPasswordReauthIOSDescription[];
+
 // Title and description for the flag to enable the clipboard provider to
 // suggest searchihng for copied images.
 extern const char kEnableClipboardProviderImageSuggestionsName[];
diff --git a/ios/chrome/browser/history/history_tab_helper_unittest.mm b/ios/chrome/browser/history/history_tab_helper_unittest.mm
index f13f165..6220cfc 100644
--- a/ios/chrome/browser/history/history_tab_helper_unittest.mm
+++ b/ios/chrome/browser/history/history_tab_helper_unittest.mm
@@ -6,7 +6,6 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
-#include "base/files/scoped_temp_dir.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind_test_util.h"
@@ -31,10 +30,6 @@
  public:
   void SetUp() override {
     TestChromeBrowserState::Builder test_cbs_builder;
-
-    ASSERT_TRUE(state_dir_.CreateUniqueTempDir());
-    test_cbs_builder.SetPath(state_dir_.GetPath());
-
     chrome_browser_state_ = test_cbs_builder.Build();
     ASSERT_TRUE(chrome_browser_state_->CreateHistoryService());
 
@@ -72,11 +67,6 @@
   }
 
  protected:
-  // A state directory that outlives |task_environment_| is needed because
-  // CreateHistoryService/CreateBookmarkModel use the directory to host
-  // databases. See https://crbug.com/546640 for more details.
-  base::ScopedTempDir state_dir_;
-
   base::test::TaskEnvironment task_environment_;
   std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
   web::TestWebState web_state_;
diff --git a/ios/chrome/browser/ui/first_run/welcome_to_chrome_view.mm b/ios/chrome/browser/ui/first_run/welcome_to_chrome_view.mm
index 21695f97..b992ac8 100644
--- a/ios/chrome/browser/ui/first_run/welcome_to_chrome_view.mm
+++ b/ios/chrome/browser/ui/first_run/welcome_to_chrome_view.mm
@@ -341,7 +341,7 @@
   [self addSubview:self.containerView];
   [self.containerView addSubview:self.titleLabel];
   [self.containerView addSubview:self.imageView];
-  if (@available(iOS 13.0, *)) {
+  if (@available(iOS 13.5, *)) {
     [self.containerView addSubview:self.TOSTextView];
   } else {
     [self.containerView addSubview:self.legacyTOSLabel];
@@ -361,7 +361,7 @@
   [super layoutSubviews];
   [self layoutTitleLabel];
   [self layoutImageView];
-  if (@available(iOS 13.0, *)) {
+  if (@available(iOS 13.5, *)) {
     [self layoutTOSTextView];
   } else {
     [self layoutLegacyTOSLabel];
@@ -472,7 +472,7 @@
       kOptInLabelPadding[[self heightSizeClassIdiom]];
   CGFloat optInLabelOriginX =
       base::i18n::IsRTL() ? 0.0f : optInLabelSidePadding;
-  if (@available(iOS 13.0, *)) {
+  if (@available(iOS 13.5, *)) {
     self.optInLabel.frame = AlignRectOriginAndSizeToPixels(
         CGRectMake(optInLabelOriginX,
                    CGRectGetMaxY(self.TOSTextView.frame) + optInLabelTopPadding,
@@ -554,7 +554,7 @@
   [self configureContainerView];
   [self configureTitleLabel];
   [self configureImageView];
-  if (@available(iOS 13.0, *)) {
+  if (@available(iOS 13.5, *)) {
     [self configureTOSTextView];
   } else {
     [self configureLegacyTOSLabel];
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm
index 640adb64..ff6e9a5 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator_unittest.mm
@@ -4,6 +4,7 @@
 
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_mediator.h"
 
+#include "base/files/scoped_temp_dir.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/time/default_clock.h"
diff --git a/ios/chrome/browser/ui/ui_feature_flags.cc b/ios/chrome/browser/ui/ui_feature_flags.cc
index 99bce04..4163a2f1 100644
--- a/ios/chrome/browser/ui/ui_feature_flags.cc
+++ b/ios/chrome/browser/ui/ui_feature_flags.cc
@@ -62,3 +62,6 @@
 
 const base::Feature kEnableFullPageScreenshot{
     "EnableFullPageScreenshot", base::FEATURE_DISABLED_BY_DEFAULT};
+
+const base::Feature kEnableAutofillPasswordReauthIOS{
+    "EnableAutofillPasswordReauthIOS", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/ui/ui_feature_flags.h b/ios/chrome/browser/ui/ui_feature_flags.h
index cb5a81bf..e7f7f25 100644
--- a/ios/chrome/browser/ui/ui_feature_flags.h
+++ b/ios/chrome/browser/ui/ui_feature_flags.h
@@ -69,4 +69,7 @@
 // Feature flag that enables taking fullpage screenshots of a webpage.
 extern const base::Feature kEnableFullPageScreenshot;
 
+// Feature flag that enables reauth for filling passwords;
+extern const base::Feature kEnableAutofillPasswordReauthIOS;
+
 #endif  // IOS_CHROME_BROWSER_UI_UI_FEATURE_FLAGS_H_
diff --git a/media/gpu/vaapi/vaapi_video_decoder.cc b/media/gpu/vaapi/vaapi_video_decoder.cc
index c5369840..e8afbae 100644
--- a/media/gpu/vaapi/vaapi_video_decoder.cc
+++ b/media/gpu/vaapi/vaapi_video_decoder.cc
@@ -96,17 +96,6 @@
   ClearDecodeTaskQueue(DecodeStatus::ABORTED);
 
   weak_this_factory_.InvalidateWeakPtrs();
-
-  // Destroy explicitly to DCHECK() that |vaapi_wrapper_| references are held
-  // inside the accelerator in |decoder_|, by the |allocated_va_surfaces_| and
-  // of course by this class. To clear |allocated_va_surfaces_| we have to first
-  // DestroyContext().
-  decoder_ = nullptr;
-  vaapi_wrapper_->DestroyContext();
-  allocated_va_surfaces_.clear();
-
-  DCHECK(vaapi_wrapper_->HasOneRef());
-  vaapi_wrapper_ = nullptr;
 }
 
 void VaapiVideoDecoder::Initialize(const VideoDecoderConfig& config,
@@ -134,9 +123,6 @@
     DVLOGF(3) << "Reinitializing decoder";
 
     decoder_ = nullptr;
-    // To clear |allocated_va_surfaces_| we have to first DestroyContext().
-    vaapi_wrapper_->DestroyContext();
-    allocated_va_surfaces_.clear();
     vaapi_wrapper_ = nullptr;
     decoder_delegate_ = nullptr;
     SetState(State::kUninitialized);
@@ -312,29 +298,22 @@
     return nullptr;
   }
 
-  DCHECK(frame->GetGpuMemoryBuffer());
-  const gfx::GpuMemoryBufferId frame_id = frame->GetGpuMemoryBuffer()->GetId();
-  scoped_refptr<VASurface> va_surface;
+  scoped_refptr<gfx::NativePixmap> pixmap =
+      CreateNativePixmapDmaBuf(frame.get());
+  if (!pixmap) {
+    LOG(ERROR) << "Failed to create NativePixmap from VideoFrame";
+    SetState(State::kError);
+    return nullptr;
+  }
 
-  if (!base::Contains(allocated_va_surfaces_, frame_id)) {
-    scoped_refptr<gfx::NativePixmap> pixmap =
-        CreateNativePixmapDmaBuf(frame.get());
-    if (!pixmap) {
-      LOG(ERROR) << "Failed to create NativePixmap from VideoFrame";
-      SetState(State::kError);
-      return nullptr;
-    }
+  // Create VASurface from the native pixmap.
+  scoped_refptr<VASurface> va_surface =
+      vaapi_wrapper_->CreateVASurfaceForPixmap(std::move(pixmap));
 
-    va_surface = vaapi_wrapper_->CreateVASurfaceForPixmap(std::move(pixmap));
-    if (!va_surface || va_surface->id() == VA_INVALID_ID) {
-      LOG(ERROR) << "Failed to create VASurface from VideoFrame";
-      SetState(State::kError);
-      return nullptr;
-    }
-
-    allocated_va_surfaces_[frame_id] = va_surface;
-  } else {
-    va_surface = allocated_va_surfaces_[frame_id];
+  if (!va_surface || va_surface->id() == VA_INVALID_ID) {
+    LOG(ERROR) << "Failed to create VASurface from VideoFrame";
+    SetState(State::kError);
+    return nullptr;
   }
 
   // Store the mapping between surface and video frame, so we know which video
@@ -346,12 +325,14 @@
   output_frames_[surface_id] = frame;
 
   // When the decoder is done using the frame for output or reference, it will
-  // drop its reference to the surface. We can then safely remove the associated
-  // video frame from |output_frames_|. To be notified when this happens we wrap
-  // the surface in another surface with ReleaseVideoFrame() as destruction
-  // observer.
-  VASurface::ReleaseCB release_frame_cb =
-      base::BindOnce(&VaapiVideoDecoder::ReleaseVideoFrame, weak_this_);
+  // drop its reference to the surface. We can then safely destroy the surface
+  // and remove the associated video frame from |output_frames_|. To be notified
+  // when this happens we wrap the surface in another surface that calls
+  // ReleaseFrame() on destruction. The |va_surface| object is bound to the
+  // destruction callback to keep it alive, since the associated VAAPI surface
+  // will be automatically destroyed when we drop the reference.
+  VASurface::ReleaseCB release_frame_cb = base::BindOnce(
+      &VaapiVideoDecoder::ReleaseFrame, weak_this_, std::move(va_surface));
 
   return new VASurface(surface_id, frame->layout().coded_size(),
                        GetVaFormatForVideoCodecProfile(profile_),
@@ -433,11 +414,7 @@
   }
 
   // All pending decode operations will be completed before triggering a
-  // resolution change, so we can safely DestroyContext() here; that, in turn,
-  // allows for clearing the |allocated_va_surfaces_|.
-  vaapi_wrapper_->DestroyContext();
-  allocated_va_surfaces_.clear();
-
+  // resolution change, so we can safely destroy the context here.
   if (profile_ != decoder_->GetProfile()) {
     // When a profile is changed, we need to re-initialize VaapiWrapper.
     profile_ = decoder_->GetProfile();
@@ -450,6 +427,8 @@
     }
     decoder_delegate_->set_vaapi_wrapper(new_vaapi_wrapper.get());
     vaapi_wrapper_ = std::move(new_vaapi_wrapper);
+  } else {
+    vaapi_wrapper_->DestroyContext();
   }
 
   vaapi_wrapper_->CreateContext(pic_size);
@@ -466,8 +445,10 @@
   }
 }
 
-void VaapiVideoDecoder::ReleaseVideoFrame(VASurfaceID surface_id) {
+void VaapiVideoDecoder::ReleaseFrame(scoped_refptr<VASurface> va_surface,
+                                     VASurfaceID surface_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_sequence_checker_);
+  DCHECK_EQ(va_surface->id(), surface_id);
   DVLOGF(4);
 
   // The decoder has finished using the frame associated with |surface_id| for
diff --git a/media/gpu/vaapi/vaapi_video_decoder.h b/media/gpu/vaapi/vaapi_video_decoder.h
index 5cdec2d..5d42041 100644
--- a/media/gpu/vaapi/vaapi_video_decoder.h
+++ b/media/gpu/vaapi/vaapi_video_decoder.h
@@ -15,7 +15,6 @@
 
 #include "base/containers/mru_cache.h"
 #include "base/containers/queue.h"
-#include "base/containers/small_map.h"
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
@@ -30,7 +29,6 @@
 #include "media/video/supported_video_decoder_config.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
-#include "ui/gfx/gpu_memory_buffer.h"
 
 namespace media {
 
@@ -105,11 +103,13 @@
   void ClearDecodeTaskQueue(DecodeStatus status);
 
   // Releases the local reference to the VideoFrame associated with the
-  // specified |surface_id| on the decoder thread. This is called when
-  // |decoder_| has outputted the VideoFrame and stopped using it as a
-  // reference frame. Note that this doesn't mean the frame can be reused
-  // immediately, as it might still be used by the client.
-  void ReleaseVideoFrame(VASurfaceID surface_id);
+  // specified |surface_id| on the decoder thread. This is called when the last
+  // reference to the associated VASurface has been released, which happens when
+  // |decoder_| outputted the video frame, or stopped using it as a reference
+  // frame. Note that this doesn't mean the frame can be reused immediately, as
+  // it might still be used by the client.
+  void ReleaseFrame(scoped_refptr<VASurface> va_surface,
+                    VASurfaceID surface_id);
   // Callback for |frame_pool_| to notify of available resources.
   void NotifyFrameAvailable();
 
@@ -159,15 +159,6 @@
   // The list of frames currently used as output buffers or reference frames.
   std::map<VASurfaceID, scoped_refptr<VideoFrame>> output_frames_;
 
-  // VASurfaces are created via importing |frame_pool_| resources into libva in
-  // CreateSurface(). The following map keeps those VASurfaces for reuse
-  // according to the expectations of libva vaDestroySurfaces(): "Surfaces can
-  // only be destroyed after all contexts using these surfaces have been
-  // destroyed."
-  // TODO(crbug.com/1040291): remove this keep-alive when using SharedImages.
-  base::small_map<std::map<gfx::GpuMemoryBufferId, scoped_refptr<VASurface>>>
-      allocated_va_surfaces_;
-
   // Platform and codec specific video decoder.
   std::unique_ptr<AcceleratedVideoDecoder> decoder_;
   scoped_refptr<VaapiWrapper> vaapi_wrapper_;
diff --git a/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm_traits_specialization_macros.tmpl b/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm_traits_specialization_macros.tmpl
index 7eeddd7..8ccf6241 100644
--- a/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm_traits_specialization_macros.tmpl
+++ b/mojo/public/tools/bindings/generators/mojolpm_templates/mojolpm_traits_specialization_macros.tmpl
@@ -58,7 +58,6 @@
         return {{dataview_type}}::Tag::{{name|upper}};
 {%-    endfor %}
       default:
-        NOTREACHED();
         return static_cast<{{dataview_type}}::Tag>(0);
     }
   }{{"\n"}}
diff --git a/net/http/http_auth_handler_factory.cc b/net/http/http_auth_handler_factory.cc
index c5d5094..783fe37 100644
--- a/net/http/http_auth_handler_factory.cc
+++ b/net/http/http_auth_handler_factory.cc
@@ -84,12 +84,13 @@
 void HttpAuthHandlerRegistryFactory::RegisterSchemeFactory(
     const std::string& scheme,
     HttpAuthHandlerFactory* factory) {
-  factory->set_http_auth_preferences(http_auth_preferences());
   std::string lower_scheme = base::ToLowerASCII(scheme);
-  if (factory)
+  if (factory) {
+    factory->set_http_auth_preferences(http_auth_preferences());
     factory_map_[lower_scheme] = base::WrapUnique(factory);
-  else
+  } else {
     factory_map_.erase(lower_scheme);
+  }
 }
 
 HttpAuthHandlerFactory* HttpAuthHandlerRegistryFactory::GetSchemeFactory(
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index b3b8b9f..50b9542 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -4544,6 +4544,38 @@
         "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/"
       },
       {
+        "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "interactive_ui_tests",
+        "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
+      },
+      {
+        "args": [
+          "--enable-features=StorageServiceOutOfProcess"
+        ],
+        "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "storage_service_unsandboxed_interactive_ui_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "interactive_ui_tests",
+        "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
+      },
+      {
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
diff --git a/testing/buildbot/chromium.ci.json b/testing/buildbot/chromium.ci.json
index b8735f8..29eefaa 100644
--- a/testing/buildbot/chromium.ci.json
+++ b/testing/buildbot/chromium.ci.json
@@ -76979,26 +76979,6 @@
         "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/"
       },
       {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 10
-        },
-        "test": "browser_tests",
-        "test_id_prefix": "ninja://chrome/test:browser_tests/"
-      },
-      {
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
@@ -77741,25 +77721,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "nacl_loader_unittests",
-        "test_id_prefix": "ninja://components/nacl/loader:nacl_loader_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "native_theme_unittests",
         "test_id_prefix": "ninja://ui/native_theme:native_theme_unittests/"
       },
@@ -78480,31 +78441,6 @@
       },
       {
         "args": [
-          "--extra-browser-args=--enable-crashpad"
-        ],
-        "isolate_name": "telemetry_perf_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_perf_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests/"
-      },
-      {
-        "args": [
           "--jobs=1",
           "--extra-browser-args=--disable-gpu"
         ],
@@ -254324,6 +254260,50 @@
         "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/"
       },
       {
+        "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04",
+              "ssd": "0"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "interactive_ui_tests",
+        "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
+      },
+      {
+        "args": [
+          "--enable-features=StorageServiceOutOfProcess"
+        ],
+        "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "storage_service_unsandboxed_interactive_ui_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04",
+              "ssd": "0"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "interactive_ui_tests",
+        "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
+      },
+      {
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -255360,6 +255340,38 @@
         "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/"
       },
       {
+        "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "interactive_ui_tests",
+        "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
+      },
+      {
+        "args": [
+          "--enable-features=StorageServiceOutOfProcess"
+        ],
+        "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "storage_service_unsandboxed_interactive_ui_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "interactive_ui_tests",
+        "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
+      },
+      {
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 4f9b558..cc75a56b 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -60398,6 +60398,50 @@
         "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/"
       },
       {
+        "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04",
+              "ssd": "0"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "interactive_ui_tests",
+        "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
+      },
+      {
+        "args": [
+          "--enable-features=StorageServiceOutOfProcess"
+        ],
+        "experiment_percentage": 100,
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "name": "storage_service_unsandboxed_interactive_ui_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "os": "Ubuntu-16.04",
+              "ssd": "0"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
+        },
+        "test": "interactive_ui_tests",
+        "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
+      },
+      {
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index 26e8488..f6d71a5 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -8625,26 +8625,6 @@
         "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/"
       },
       {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 10
-        },
-        "test": "browser_tests",
-        "test_id_prefix": "ninja://chrome/test:browser_tests/"
-      },
-      {
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
@@ -9387,25 +9367,6 @@
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
-        "test": "nacl_loader_unittests",
-        "test_id_prefix": "ninja://components/nacl/loader:nacl_loader_unittests/"
-      },
-      {
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
         "test": "native_theme_unittests",
         "test_id_prefix": "ninja://ui/native_theme:native_theme_unittests/"
       },
@@ -10126,31 +10087,6 @@
       },
       {
         "args": [
-          "--extra-browser-args=--enable-crashpad"
-        ],
-        "isolate_name": "telemetry_perf_unittests",
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_perf_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "none",
-              "os": "Mac-10.13.6"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests/"
-      },
-      {
-        "args": [
           "--jobs=1",
           "--extra-browser-args=--disable-gpu"
         ],
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index d7599c4..246d88f 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -443,6 +443,7 @@
       'ToTLinuxTSan',  # https://crbug.com/368525
       'Mac10.10 Tests',  # https://crbug.com/828031
       'Mac10.13 Tests',  # https://crbug.com/1042757
+      'Mac10.13 Tests Code Coverage',
       'Linux TSan Tests',  # https://crbug.com/368525
       'Win10 Tests x64 (dbg)',
       'linux-lacros-tester-rel', # https://crbug.com/1111979
@@ -1378,8 +1379,6 @@
   'interactive_ui_tests': {
     'remove_from': [
       'CrWinAsan(dll)', # https://crbug.com/935598
-      'linux-lacros-tester-fyi-rel', # https://crbug.com/1106980
-      'linux-lacros-tester-rel', # https://crbug.com/1106980
     ],
     'modifications': {
       'Linux - Future (dbg)': {  # client.v8.chromium
@@ -1762,6 +1761,7 @@
       'Mac10.11 Tests',
       'Mac10.13 Tests',
       'Mac10.13 Tests (dbg)',
+      'Mac10.13 Tests Code Coverage',
       'Mac ASan 64 Tests (1)',
       'ToTMacASan',
     ],
@@ -1809,6 +1809,7 @@
       'Mac10.11 Tests',
       'Mac10.13 Tests',
       'Mac10.13 Tests (dbg)',
+      'Mac10.13 Tests Code Coverage',
       'Mac ASan 64 Tests (1)',
       'ToTMacASan',
     ],
@@ -1826,6 +1827,7 @@
       'Mac10.11 Tests',
       'Mac10.13 Tests',
       'Mac10.13 Tests (dbg)',
+      'Mac10.13 Tests Code Coverage',
       'Mac ASan 64 Tests (1)',
       'ToTMacASan',
     ],
@@ -1842,6 +1844,7 @@
       'Mac10.11 Tests',
       'Mac10.13 Tests',
       'Mac10.13 Tests (dbg)',
+      'Mac10.13 Tests Code Coverage',
       'Mac ASan 64 Tests (1)',
       'ToTMacASan',
     ],
@@ -1863,6 +1866,7 @@
       'Mac10.11 Tests',
       'Mac10.13 Tests',
       'Mac10.13 Tests (dbg)',
+      'Mac10.13 Tests Code Coverage',
       'Mac ASan 64 Tests (1)',
       'ToTMacASan',
     ],
@@ -2316,9 +2320,6 @@
     ],
   },
   'storage_service_unsandboxed_interactive_ui_tests': {
-    'remove_from': [
-      'linux-lacros-tester-fyi-rel', # https://crbug.com/1106980
-    ],
     'modifications': {
       'linux-chromeos-chrome': {
         # TODO(crbug.com/970649): Remove this filter.
@@ -2471,6 +2472,7 @@
       'Mac10.11 Tests',
       'Mac10.13 Tests',
       'Mac10.13 Tests (dbg)',
+      'Mac10.13 Tests Code Coverage',
       'Linux - Future (dbg)',  # client.v8.chromium
       'Win10 Tests x64',
       'Win10 Tests x64 (dbg)',
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 4e4a057..7b90026 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -3342,6 +3342,12 @@
       'google_apis_unittests': {},
       'gpu_unittests': {},
       'gwp_asan_unittests': {},
+      'interactive_ui_tests': {
+        'swarming': {
+          'shards': 3,
+        },
+        'experiment_percentage': 100,
+      },
       'ipc_tests': {},
       'jingle_unittests': {},
       'latency_unittests': {},
@@ -3388,16 +3394,16 @@
         'test': 'extensions_browsertests',
         'experiment_percentage': 100,
       },
-      # TODO(crbug.com/1104291): Re-enable this.
-      # 'storage_service_unsandboxed_interactive_ui_tests': {
-      #  'args': [
-      #    '--enable-features=StorageServiceOutOfProcess'
-      #  ],
-      #  'swarming': {
-      #    'shards': 3,
-      #  },
-      #  'test': 'interactive_ui_tests',
-      # },
+      'storage_service_unsandboxed_interactive_ui_tests': {
+        'args': [
+          '--enable-features=StorageServiceOutOfProcess'
+        ],
+        'swarming': {
+          'shards': 3,
+        },
+        'test': 'interactive_ui_tests',
+        'experiment_percentage': 100,
+      },
       'storage_unittests': {},
       'sync_integration_tests': {
         'experiment_percentage': 100,
@@ -3421,12 +3427,6 @@
         'experiment_percentage': 100,
       },
       'wtf_unittests': {},
-      # TODO(crbug.com/1104291): Re-enable this.
-      # 'interactive_ui_tests': {
-      #  'swarming': {
-      #    'shards': 3,
-      #  },
-      # },
     },
 
     # END tests which run on the GPU bots
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 0f70fb42..b2de477 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -4340,7 +4340,7 @@
             'no_gpu',
         ],
         'test_suites': {
-          'gtest_tests': 'chromium_mac_gtests',
+          'gtest_tests': 'chromium_mac_gtests_no_nacl',
           'isolated_scripts': 'chromium_mac_rel_isolated_scripts',
         },
       },
diff --git a/testing/scripts/run_performance_tests.py b/testing/scripts/run_performance_tests.py
index 1abcd5f3..5f49b11 100755
--- a/testing/scripts/run_performance_tests.py
+++ b/testing/scripts/run_performance_tests.py
@@ -113,6 +113,10 @@
   'xr.vr.common_perftests',
 ]
 
+BENCHMARKS_TO_SKIP_REF = [
+    'system_health.common_desktop',
+    'system_health.common_mobile'
+]
 
 class OutputFilePaths(object):
   """Provide paths to where results outputs should be written.
@@ -625,7 +629,7 @@
               command_generator, output_paths, options.xvfb)
           overall_return_code = return_code or overall_return_code
           test_results_files.append(output_paths.test_results)
-          if options.run_ref_build:
+          if options.run_ref_build and benchmark not in BENCHMARKS_TO_SKIP_REF:
             reference_benchmark_foldername = benchmark + '.reference'
             reference_output_paths = OutputFilePaths(
                 isolated_out_dir, reference_benchmark_foldername).SetUp()
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index d9a819a..c200eb2 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -2242,25 +2242,6 @@
             ]
         }
     ],
-    "DisableLatencyRecoveryDesktop": [
-        {
-            "platforms": [
-                "chromeos",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "DisabledImplDisabledMain",
-                    "disable_features": [
-                        "ImplLatencyRecovery",
-                        "MainLatencyRecovery"
-                    ]
-                }
-            ]
-        }
-    ],
     "DisableMalwareExtensionsRemotely": [
         {
             "platforms": [
diff --git a/third_party/blink/public/mojom/frame/sudden_termination_disabler_type.mojom b/third_party/blink/public/mojom/frame/sudden_termination_disabler_type.mojom
index 649b3cb2..33141af 100644
--- a/third_party/blink/public/mojom/frame/sudden_termination_disabler_type.mojom
+++ b/third_party/blink/public/mojom/frame/sudden_termination_disabler_type.mojom
@@ -8,5 +8,7 @@
 // renderer process may be prevented.
 enum SuddenTerminationDisablerType {
   kBeforeUnloadHandler,
-  kUnloadHandler
+  kPageHideHandler,
+  kUnloadHandler,
+  kVisibilityChangeHandler
 };
diff --git a/third_party/blink/public/platform/DEPS b/third_party/blink/public/platform/DEPS
index 4d27c82..cad85583 100644
--- a/third_party/blink/public/platform/DEPS
+++ b/third_party/blink/public/platform/DEPS
@@ -58,6 +58,7 @@
     "-third_party/blink/public/web",
     "-third_party/blink/renderer/bindings",
     "+third_party/skia",
+    "+ui/base/ime/ime_text_span.h",
     "+ui/base/ime/text_input_action.h",
     "+ui/base/ime/mojom/virtual_keyboard_types.mojom-shared.h",
     "+ui/base/page_transition_types.h",
diff --git a/third_party/blink/public/platform/web_text_input_info.h b/third_party/blink/public/platform/web_text_input_info.h
index 58a8916..666bc7b 100644
--- a/third_party/blink/public/platform/web_text_input_info.h
+++ b/third_party/blink/public/platform/web_text_input_info.h
@@ -30,6 +30,8 @@
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/platform/web_text_input_mode.h"
 #include "third_party/blink/public/platform/web_text_input_type.h"
+#include "third_party/blink/public/platform/web_vector.h"
+#include "ui/base/ime/ime_text_span.h"
 #include "ui/base/ime/mojom/virtual_keyboard_types.mojom-shared.h"
 #include "ui/base/ime/text_input_action.h"
 
@@ -67,6 +69,9 @@
   ui::mojom::VirtualKeyboardPolicy virtual_keyboard_policy =
       ui::mojom::VirtualKeyboardPolicy::AUTO;
 
+  // The array of ime_text_spans at the current caret position.
+  WebVector<ui::ImeTextSpan> ime_text_spans;
+
   BLINK_PLATFORM_EXPORT bool Equals(const WebTextInputInfo&) const;
 
   WebTextInputInfo()
diff --git a/third_party/blink/public/web/web_settings.h b/third_party/blink/public/web/web_settings.h
index b3a4007..ada5a91 100644
--- a/third_party/blink/public/web/web_settings.h
+++ b/third_party/blink/public/web/web_settings.h
@@ -297,6 +297,7 @@
   virtual void SetPreferredColorScheme(PreferredColorScheme) = 0;
   virtual void SetNavigationControls(NavigationControls) = 0;
   virtual void SetAriaModalPrunesAXTree(bool) = 0;
+  virtual void SetUseAXMenuList(bool) = 0;
 
  protected:
   ~WebSettings() = default;
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni
index 3e7a61e6..6943788 100644
--- a/third_party/blink/renderer/bindings/idl_in_modules.gni
+++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -1043,6 +1043,7 @@
             "//third_party/blink/renderer/modules/canvas/offscreencanvas/offscreen_canvas_module_support_webgl2_compute.idl",
             "//third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context.idl",
             "//third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context_base.idl",
+            "//third_party/blink/renderer/modules/xr/xr_webgl_context_support_webgl2_compute.idl",
           ],
           "abspath")
 } else {
@@ -1050,6 +1051,7 @@
           [
             "//third_party/blink/renderer/modules/canvas/htmlcanvas/html_canvas_element_module.idl",
             "//third_party/blink/renderer/modules/canvas/offscreencanvas/offscreen_canvas_module.idl",
+            "//third_party/blink/renderer/modules/xr/xr_webgl_context.idl",
           ],
           "abspath")
 }
diff --git a/third_party/blink/renderer/bindings/modules/v8/generated.gni b/third_party/blink/renderer/bindings/modules/v8/generated.gni
index ebdb9fa..687417ed2 100644
--- a/third_party/blink/renderer/bindings/modules/v8/generated.gni
+++ b/third_party/blink/renderer/bindings/modules/v8/generated.gni
@@ -113,12 +113,23 @@
   "$bindings_modules_v8_output_dir/usv_string_or_uint32_array.h",
   "$bindings_modules_v8_output_dir/usv_string_or_usv_string_sequence.cc",
   "$bindings_modules_v8_output_dir/usv_string_or_usv_string_sequence.h",
-  "$bindings_modules_v8_output_dir/webgl_rendering_context_or_webgl2_rendering_context.cc",
-  "$bindings_modules_v8_output_dir/webgl_rendering_context_or_webgl2_rendering_context.h",
   "$bindings_modules_v8_output_dir/worklet_animation_effect_or_worklet_group_effect.cc",
   "$bindings_modules_v8_output_dir/worklet_animation_effect_or_worklet_group_effect.h",
 ]
 
+# WebGL2 Compute
+if (support_webgl2_compute_context) {
+  bindings_modules_generated_union_type_files += [
+    "$bindings_modules_v8_output_dir/webgl_rendering_context_or_webgl2_rendering_context_or_webgl2_compute_rendering_context.cc",
+    "$bindings_modules_v8_output_dir/webgl_rendering_context_or_webgl2_rendering_context_or_webgl2_compute_rendering_context.h",
+  ]
+} else {
+  bindings_modules_generated_union_type_files += [
+    "$bindings_modules_v8_output_dir/webgl_rendering_context_or_webgl2_rendering_context.cc",
+    "$bindings_modules_v8_output_dir/webgl_rendering_context_or_webgl2_rendering_context.h",
+  ]
+}
+
 generated_modules_callback_function_files = [
   "$bindings_modules_v8_output_dir/v8_animate_callback.cc",
   "$bindings_modules_v8_output_dir/v8_animate_callback.h",
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py b/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
index 5c483ca1..d44d962 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py
@@ -506,14 +506,18 @@
             ])
 
         nodes = []
-        type_info = blink_type_info(idl_type)
+        arg_type = _format(
+            "decltype(NativeValueTraits<{}>::NativeValue("
+            "std::declval<v8::Isolate*>(), "
+            "std::declval<v8::Local<v8::Value>>(), "
+            "std::declval<ExceptionState&>()))", native_value_tag(idl_type))
         default_expr = make_default_value_expr(idl_type, default_value)
         if default_expr.is_initialization_lightweight:
             nodes.append(
-                F("{} ${{{}}}{{{}}};", type_info.value_t, blink_var_name,
+                F("{} ${{{}}}{{{}}};", arg_type, blink_var_name,
                   default_expr.initializer_expr))
         else:
-            nodes.append(F("{} ${{{}}};", type_info.value_t, blink_var_name))
+            nodes.append(F("{} ${{{}}};", arg_type, blink_var_name))
         assignment = [
             F("${{{}}} = {};", blink_var_name, blink_value_expr),
             CxxUnlikelyIfNode(
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn
index 9a2f433..c34b66b 100644
--- a/third_party/blink/renderer/core/BUILD.gn
+++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1194,6 +1194,7 @@
     "layout/layout_text_fragment_test.cc",
     "layout/layout_text_test.cc",
     "layout/layout_theme_test.cc",
+    "layout/layout_video_test.cc",
     "layout/layout_view_test.cc",
     "layout/line/abstract_inline_text_box_test.cc",
     "layout/line/inline_text_box_test.cc",
diff --git a/third_party/blink/renderer/core/dom/events/event_target.cc b/third_party/blink/renderer/core/dom/events/event_target.cc
index 9b78967..642de5e 100644
--- a/third_party/blink/renderer/core/dom/events/event_target.cc
+++ b/third_party/blink/renderer/core/dom/events/event_target.cc
@@ -943,6 +943,12 @@
   return data->event_listener_map.Find(event_type);
 }
 
+int EventTarget::NumberOfEventListeners(const AtomicString& event_type) const {
+  EventListenerVector* listeners =
+      const_cast<EventTarget*>(this)->GetEventListeners(event_type);
+  return listeners ? listeners->size() : 0;
+}
+
 Vector<AtomicString> EventTarget::EventTypes() {
   EventTargetData* d = GetEventTargetData();
   return d ? d->event_listener_map.EventTypes() : Vector<AtomicString>();
diff --git a/third_party/blink/renderer/core/dom/events/event_target.h b/third_party/blink/renderer/core/dom/events/event_target.h
index d6d9b76..5bf904c 100644
--- a/third_party/blink/renderer/core/dom/events/event_target.h
+++ b/third_party/blink/renderer/core/dom/events/event_target.h
@@ -175,6 +175,9 @@
   bool HasCapturingEventListeners(const AtomicString& event_type);
   bool HasJSBasedEventListeners(const AtomicString& event_type) const;
   EventListenerVector* GetEventListeners(const AtomicString& event_type);
+  // Number of event listeners for |event_type| registered at this event target.
+  int NumberOfEventListeners(const AtomicString& event_type) const;
+
   Vector<AtomicString> EventTypes();
 
   DispatchEventResult FireEventListeners(Event&);
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc
index 9fa8aea..58a42668 100644
--- a/third_party/blink/renderer/core/dom/node.cc
+++ b/third_party/blink/renderer/core/dom/node.cc
@@ -2711,6 +2711,11 @@
   if (auto* frame = GetDocument().GetFrame()) {
     frame->GetEventHandlerRegistry().DidAddEventHandler(
         *this, event_type, registered_listener.Options());
+    // We need to track the existence of the visibilitychange event listeners to
+    // enable/disable sudden terminations.
+    if (IsDocumentNode() && event_type == event_type_names::kVisibilitychange) {
+      frame->AddedSuddenTerminationDisablerListener(*this, event_type);
+    }
   }
 }
 
@@ -2724,6 +2729,11 @@
   if (auto* frame = GetDocument().GetFrame()) {
     frame->GetEventHandlerRegistry().DidRemoveEventHandler(
         *this, event_type, registered_listener.Options());
+    // We need to track the existence of the visibilitychange event listeners to
+    // enable/disable sudden terminations.
+    if (IsDocumentNode() && event_type == event_type_names::kVisibilitychange) {
+      frame->RemovedSuddenTerminationDisablerListener(*this, event_type);
+    }
   }
 }
 
diff --git a/third_party/blink/renderer/core/dom/scripted_idle_task_controller.cc b/third_party/blink/renderer/core/dom/scripted_idle_task_controller.cc
index aa4480f..c7141f3 100644
--- a/third_party/blink/renderer/core/dom/scripted_idle_task_controller.cc
+++ b/third_party/blink/renderer/core/dom/scripted_idle_task_controller.cc
@@ -241,12 +241,19 @@
   DCHECK(paused_);
   paused_ = false;
 
-  // Run any pending timeouts.
-  Vector<CallbackId> pending_timeouts;
-  pending_timeouts_.swap(pending_timeouts);
-  for (auto& id : pending_timeouts)
-    RunCallback(id, base::TimeTicks::Now(),
-                IdleDeadline::CallbackType::kCalledByTimeout);
+  // Run any pending timeouts as separate tasks, since it's not allowed to
+  // execute script from lifecycle callbacks.
+  for (auto& id : pending_timeouts_) {
+    scoped_refptr<internal::IdleRequestCallbackWrapper> callback_wrapper =
+        internal::IdleRequestCallbackWrapper::Create(id, this);
+    GetExecutionContext()
+        ->GetTaskRunner(TaskType::kIdleTask)
+        ->PostTask(
+            FROM_HERE,
+            WTF::Bind(&internal::IdleRequestCallbackWrapper::TimeoutFired,
+                      callback_wrapper));
+  }
+  pending_timeouts_.clear();
 
   // Repost idle tasks for any remaining callbacks.
   for (auto& idle_task : idle_tasks_) {
diff --git a/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc b/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc
index 911c7e2c..6a5130c 100644
--- a/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc
+++ b/third_party/blink/renderer/core/dom/scripted_idle_task_controller_test.cc
@@ -6,10 +6,12 @@
 
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/mojom/frame/lifecycle.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_idle_request_callback.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_idle_request_options.h"
 #include "third_party/blink/renderer/core/testing/null_execution_context.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
+#include "third_party/blink/renderer/platform/scheduler/test/fake_task_runner.h"
 #include "third_party/blink/renderer/platform/testing/scoped_scheduler_overrider.h"
 
 namespace blink {
@@ -38,7 +40,7 @@
   }
   scoped_refptr<base::SingleThreadTaskRunner> DeprecatedDefaultTaskRunner()
       override {
-    return nullptr;
+    return task_runner_;
   }
   void Shutdown() override {}
   bool ShouldYieldForHighPriorityWork() override { return should_yield_; }
@@ -83,9 +85,15 @@
   void RunIdleTask() { std::move(idle_task_).Run(base::TimeTicks()); }
   bool HasIdleTask() const { return !!idle_task_; }
 
+  void AdvanceTimeAndRun(base::TimeDelta delta) {
+    task_runner_->AdvanceTimeAndRun(delta);
+  }
+
  private:
   bool should_yield_;
   Thread::IdleTask idle_task_;
+  scoped_refptr<scheduler::FakeTaskRunner> task_runner_ =
+      base::MakeRefCounted<scheduler::FakeTaskRunner>();
 
   DISALLOW_COPY_AND_ASSIGN(MockScriptedIdleTaskControllerScheduler);
 };
@@ -146,4 +154,36 @@
   EXPECT_TRUE(scheduler.HasIdleTask());
 }
 
+TEST_F(ScriptedIdleTaskControllerTest, RunCallbacksAsyncWhenUnpaused) {
+  MockScriptedIdleTaskControllerScheduler scheduler(ShouldYield::YIELD);
+  ScopedSchedulerOverrider scheduler_overrider(&scheduler);
+  ScriptedIdleTaskController* controller =
+      ScriptedIdleTaskController::Create(execution_context_);
+
+  // Register an idle task with a deadline.
+  Persistent<MockIdleTask> idle_task(MakeGarbageCollected<MockIdleTask>());
+  IdleRequestOptions* options = IdleRequestOptions::Create();
+  options->setTimeout(1);
+  int id = controller->RegisterCallback(idle_task, options);
+  EXPECT_NE(0, id);
+
+  // Hitting the deadline while the frame is paused shouldn't cause any tasks to
+  // run.
+  controller->ContextLifecycleStateChanged(mojom::FrameLifecycleState::kPaused);
+  EXPECT_CALL(*idle_task, invoke(testing::_)).Times(0);
+  scheduler.AdvanceTimeAndRun(base::TimeDelta::FromMilliseconds(1));
+  testing::Mock::VerifyAndClearExpectations(idle_task);
+
+  // Even if we unpause, no tasks should run immediately.
+  EXPECT_CALL(*idle_task, invoke(testing::_)).Times(0);
+  controller->ContextLifecycleStateChanged(
+      mojom::FrameLifecycleState::kRunning);
+  testing::Mock::VerifyAndClearExpectations(idle_task);
+
+  // Idle callback should have been scheduled as an asynchronous task.
+  EXPECT_CALL(*idle_task, invoke(testing::_)).Times(1);
+  scheduler.AdvanceTimeAndRun(base::TimeDelta::FromMilliseconds(0));
+  testing::Mock::VerifyAndClearExpectations(idle_task);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/editing/BUILD.gn b/third_party/blink/renderer/core/editing/BUILD.gn
index 829afcf..31fbacd 100644
--- a/third_party/blink/renderer/core/editing/BUILD.gn
+++ b/third_party/blink/renderer/core/editing/BUILD.gn
@@ -336,7 +336,6 @@
     "visible_units_paragraph.cc",
     "visible_units_sentence.cc",
     "visible_units_word.cc",
-    "writing_direction.h",
   ]
 
   if (is_mac) {
diff --git a/third_party/blink/renderer/core/editing/commands/apply_style_command.cc b/third_party/blink/renderer/core/editing/commands/apply_style_command.cc
index 151283c..f41b19e5 100644
--- a/third_party/blink/renderer/core/editing/commands/apply_style_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/apply_style_command.cc
@@ -48,7 +48,6 @@
 #include "third_party/blink/renderer/core/editing/visible_position.h"
 #include "third_party/blink/renderer/core/editing/visible_selection.h"
 #include "third_party/blink/renderer/core/editing/visible_units.h"
-#include "third_party/blink/renderer/core/editing/writing_direction.h"
 #include "third_party/blink/renderer/core/html/html_font_element.h"
 #include "third_party/blink/renderer/core/html/html_span_element.h"
 #include "third_party/blink/renderer/core/html_names.h"
@@ -566,7 +565,7 @@
 HTMLElement* ApplyStyleCommand::SplitAncestorsWithUnicodeBidi(
     Node* node,
     bool before,
-    WritingDirection allowed_direction) {
+    mojo_base::mojom::blink::TextDirection allowed_direction) {
   // We are allowed to leave the highest ancestor with unicode-bidi unsplit if
   // it is unicode-bidi: embed and direction: allowedDirection. In that case, we
   // return the unsplit ancestor. Otherwise, we return 0.
@@ -597,10 +596,11 @@
 
   HTMLElement* unsplit_ancestor = nullptr;
 
-  WritingDirection highest_ancestor_direction;
+  mojo_base::mojom::blink::TextDirection highest_ancestor_direction;
   auto* highest_ancestor_html_element =
       DynamicTo<HTMLElement>(highest_ancestor_with_unicode_bidi);
-  if (allowed_direction != WritingDirection::kNatural &&
+  if (allowed_direction !=
+          mojo_base::mojom::blink::TextDirection::UNKNOWN_DIRECTION &&
       highest_ancestor_unicode_bidi != CSSValueID::kBidiOverride &&
       highest_ancestor_html_element &&
       MakeGarbageCollected<EditingStyle>(highest_ancestor_with_unicode_bidi,
@@ -750,7 +750,8 @@
   // selection and prevent us from adding redundant ones, as described in:
   // <rdar://problem/3724344> Bolding and unbolding creates extraneous tags
   Position remove_start = MostBackwardCaretPosition(start);
-  WritingDirection text_direction = WritingDirection::kNatural;
+  mojo_base::mojom::blink::TextDirection text_direction =
+      mojo_base::mojom::blink::TextDirection::UNKNOWN_DIRECTION;
   bool has_text_direction = style->GetTextDirection(text_direction);
   EditingStyle* style_without_embedding = nullptr;
   EditingStyle* embedding_style = nullptr;
diff --git a/third_party/blink/renderer/core/editing/commands/apply_style_command.h b/third_party/blink/renderer/core/editing/commands/apply_style_command.h
index de85188..236ef74 100644
--- a/third_party/blink/renderer/core/editing/commands/apply_style_command.h
+++ b/third_party/blink/renderer/core/editing/commands/apply_style_command.h
@@ -38,8 +38,6 @@
 
 enum ShouldIncludeTypingStyle { kIncludeTypingStyle, kIgnoreTypingStyle };
 
-enum class WritingDirection;
-
 class CORE_EXPORT ApplyStyleCommand final : public CompositeEditCommand {
  public:
   enum PropertyLevel { kPropertyDefault, kForceBlockProperties };
@@ -161,7 +159,7 @@
   HTMLElement* SplitAncestorsWithUnicodeBidi(
       Node*,
       bool before,
-      WritingDirection allowed_direction);
+      mojo_base::mojom::blink::TextDirection allowed_direction);
   void RemoveEmbeddingUpToEnclosingBlock(Node*,
                                          HTMLElement* unsplit_ancestor,
                                          EditingState*);
diff --git a/third_party/blink/renderer/core/editing/commands/style_commands.cc b/third_party/blink/renderer/core/editing/commands/style_commands.cc
index 84c26596..c0136e7 100644
--- a/third_party/blink/renderer/core/editing/commands/style_commands.cc
+++ b/third_party/blink/renderer/core/editing/commands/style_commands.cc
@@ -44,7 +44,6 @@
 #include "third_party/blink/renderer/core/editing/ephemeral_range.h"
 #include "third_party/blink/renderer/core/editing/frame_selection.h"
 #include "third_party/blink/renderer/core/editing/visible_position.h"
-#include "third_party/blink/renderer/core/editing/writing_direction.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/html/html_font_element.h"
@@ -417,20 +416,20 @@
          value_id == CSSValueID::kPlaintext;
 }
 
-WritingDirection StyleCommands::TextDirectionForSelection(
+mojo_base::mojom::blink::TextDirection StyleCommands::TextDirectionForSelection(
     const VisibleSelection& selection,
     EditingStyle* typing_style,
     bool& has_nested_or_multiple_embeddings) {
   has_nested_or_multiple_embeddings = true;
 
   if (selection.IsNone())
-    return WritingDirection::kNatural;
+    return mojo_base::mojom::blink::TextDirection::UNKNOWN_DIRECTION;
 
   const Position position = MostForwardCaretPosition(selection.Start());
 
   const Node* anchor_node = position.AnchorNode();
   if (!anchor_node)
-    return WritingDirection::kNatural;
+    return mojo_base::mojom::blink::TextDirection::UNKNOWN_DIRECTION;
 
   Position end;
   if (selection.IsRange()) {
@@ -455,12 +454,12 @@
       const CSSValueID unicode_bidi_value =
           unicode_bidi_identifier_value->GetValueID();
       if (IsUnicodeBidiNestedOrMultipleEmbeddings(unicode_bidi_value))
-        return WritingDirection::kNatural;
+        return mojo_base::mojom::blink::TextDirection::UNKNOWN_DIRECTION;
     }
   }
 
   if (selection.IsCaret()) {
-    WritingDirection direction;
+    mojo_base::mojom::blink::TextDirection direction;
     if (typing_style && typing_style->GetTextDirection(direction)) {
       has_nested_or_multiple_embeddings = false;
       return direction;
@@ -472,7 +471,8 @@
   // The selection is either a caret with no typing attributes or a range in
   // which no embedding is added, so just use the start position to decide.
   const Node* block = EnclosingBlock(anchor_node);
-  WritingDirection found_direction = WritingDirection::kNatural;
+  mojo_base::mojom::blink::TextDirection found_direction =
+      mojo_base::mojom::blink::TextDirection::UNKNOWN_DIRECTION;
 
   for (Node& runner : NodeTraversal::InclusiveAncestorsOf(*anchor_node)) {
     if (runner == block)
@@ -496,7 +496,7 @@
       continue;
 
     if (unicode_bidi_value == CSSValueID::kBidiOverride)
-      return WritingDirection::kNatural;
+      return mojo_base::mojom::blink::TextDirection::UNKNOWN_DIRECTION;
 
     DCHECK(EditingStyleUtilities::IsEmbedOrIsolate(unicode_bidi_value))
         << static_cast<int>(unicode_bidi_value);
@@ -511,17 +511,19 @@
         direction_value != CSSValueID::kRtl)
       continue;
 
-    if (found_direction != WritingDirection::kNatural)
-      return WritingDirection::kNatural;
+    if (found_direction !=
+        mojo_base::mojom::blink::TextDirection::UNKNOWN_DIRECTION)
+      return mojo_base::mojom::blink::TextDirection::UNKNOWN_DIRECTION;
 
     // In the range case, make sure that the embedding element persists until
     // the end of the range.
     if (selection.IsRange() && !end.AnchorNode()->IsDescendantOf(element))
-      return WritingDirection::kNatural;
+      return mojo_base::mojom::blink::TextDirection::UNKNOWN_DIRECTION;
 
-    found_direction = direction_value == CSSValueID::kLtr
-                          ? WritingDirection::kLeftToRight
-                          : WritingDirection::kRightToLeft;
+    found_direction =
+        direction_value == CSSValueID::kLtr
+            ? mojo_base::mojom::blink::TextDirection::LEFT_TO_RIGHT
+            : mojo_base::mojom::blink::TextDirection::RIGHT_TO_LEFT;
   }
   has_nested_or_multiple_embeddings = false;
   return found_direction;
@@ -529,13 +531,14 @@
 
 EditingTriState StyleCommands::StateTextWritingDirection(
     LocalFrame& frame,
-    WritingDirection direction) {
+    mojo_base::mojom::blink::TextDirection direction) {
   frame.GetDocument()->UpdateStyleAndLayout(DocumentUpdateReason::kEditing);
 
   bool has_nested_or_multiple_embeddings;
-  WritingDirection selection_direction = TextDirectionForSelection(
-      frame.Selection().ComputeVisibleSelectionInDOMTreeDeprecated(),
-      frame.GetEditor().TypingStyle(), has_nested_or_multiple_embeddings);
+  mojo_base::mojom::blink::TextDirection selection_direction =
+      TextDirectionForSelection(
+          frame.Selection().ComputeVisibleSelectionInDOMTreeDeprecated(),
+          frame.GetEditor().TypingStyle(), has_nested_or_multiple_embeddings);
   // TODO(editing-dev): We should be returning MixedTriState when
   // selectionDirection == direction && hasNestedOrMultipleEmbeddings
   return (selection_direction == direction &&
@@ -547,19 +550,22 @@
 EditingTriState StyleCommands::StateTextWritingDirectionLeftToRight(
     LocalFrame& frame,
     Event*) {
-  return StateTextWritingDirection(frame, WritingDirection::kLeftToRight);
+  return StateTextWritingDirection(
+      frame, mojo_base::mojom::blink::TextDirection::LEFT_TO_RIGHT);
 }
 
 EditingTriState StyleCommands::StateTextWritingDirectionNatural(
     LocalFrame& frame,
     Event*) {
-  return StateTextWritingDirection(frame, WritingDirection::kNatural);
+  return StateTextWritingDirection(
+      frame, mojo_base::mojom::blink::TextDirection::UNKNOWN_DIRECTION);
 }
 
 EditingTriState StyleCommands::StateTextWritingDirectionRightToLeft(
     LocalFrame& frame,
     Event*) {
-  return StateTextWritingDirection(frame, WritingDirection::kRightToLeft);
+  return StateTextWritingDirection(
+      frame, mojo_base::mojom::blink::TextDirection::RIGHT_TO_LEFT);
 }
 
 EditingTriState StyleCommands::StateUnderline(LocalFrame& frame, Event*) {
diff --git a/third_party/blink/renderer/core/editing/commands/style_commands.h b/third_party/blink/renderer/core/editing/commands/style_commands.h
index 5cfcd1b..9202d3f 100644
--- a/third_party/blink/renderer/core/editing/commands/style_commands.h
+++ b/third_party/blink/renderer/core/editing/commands/style_commands.h
@@ -47,7 +47,6 @@
 
 enum class EditingTriState;
 enum class EditorCommandSource;
-enum class WritingDirection;
 
 // This class provides static functions about commands related to style.
 class StyleCommands {
@@ -204,11 +203,11 @@
 
   // TODO(editing-dev): We should make |textDirectionForSelection()| to take
   // |selectionInDOMTree|.
-  static WritingDirection TextDirectionForSelection(const VisibleSelection&,
-                                                    EditingStyle*,
-                                                    bool&);
-  static EditingTriState StateTextWritingDirection(LocalFrame&,
-                                                   WritingDirection);
+  static mojo_base::mojom::blink::TextDirection
+  TextDirectionForSelection(const VisibleSelection&, EditingStyle*, bool&);
+  static EditingTriState StateTextWritingDirection(
+      LocalFrame&,
+      mojo_base::mojom::blink::TextDirection);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/editing/editing_style.cc b/third_party/blink/renderer/core/editing/editing_style.cc
index 6736935..0dde54d9 100644
--- a/third_party/blink/renderer/core/editing/editing_style.cc
+++ b/third_party/blink/renderer/core/editing/editing_style.cc
@@ -57,7 +57,6 @@
 #include "third_party/blink/renderer/core/editing/position.h"
 #include "third_party/blink/renderer/core/editing/serializers/html_interchange.h"
 #include "third_party/blink/renderer/core/editing/visible_selection.h"
-#include "third_party/blink/renderer/core/editing/writing_direction.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/html/html_font_element.h"
@@ -636,7 +635,8 @@
          font_size_delta_ == kNoFontDelta;
 }
 
-bool EditingStyle::GetTextDirection(WritingDirection& writing_direction) const {
+bool EditingStyle::GetTextDirection(
+    mojo_base::mojom::blink::TextDirection& writing_direction) const {
   if (!mutable_style_)
     return false;
 
@@ -657,14 +657,15 @@
 
     writing_direction =
         direction_identifier_value->GetValueID() == CSSValueID::kLtr
-            ? WritingDirection::kLeftToRight
-            : WritingDirection::kRightToLeft;
+            ? mojo_base::mojom::blink::TextDirection::LEFT_TO_RIGHT
+            : mojo_base::mojom::blink::TextDirection::RIGHT_TO_LEFT;
 
     return true;
   }
 
   if (unicode_bidi_value == CSSValueID::kNormal) {
-    writing_direction = WritingDirection::kNatural;
+    writing_direction =
+        mojo_base::mojom::blink::TextDirection::UNKNOWN_DIRECTION;
     return true;
   }
 
diff --git a/third_party/blink/renderer/core/editing/editing_style.h b/third_party/blink/renderer/core/editing/editing_style.h
index 240cb4bd..08fbbec 100644
--- a/third_party/blink/renderer/core/editing/editing_style.h
+++ b/third_party/blink/renderer/core/editing/editing_style.h
@@ -32,6 +32,7 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_EDITING_STYLE_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_EDITING_STYLE_H_
 
+#include "mojo/public/mojom/base/text_direction.mojom-blink-forward.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/css/css_property_names.h"
 #include "third_party/blink/renderer/core/css_value_keywords.h"
@@ -58,7 +59,6 @@
 class CSSPropertyValueSet;
 enum class EditingTriState;
 enum class SecureContextMode;
-enum class WritingDirection;
 
 class CORE_EXPORT EditingStyle final : public GarbageCollected<EditingStyle> {
  public:
@@ -86,7 +86,7 @@
   EditingStyle(CSSPropertyID, const String& value, SecureContextMode);
 
   MutableCSSPropertyValueSet* Style() { return mutable_style_.Get(); }
-  bool GetTextDirection(WritingDirection&) const;
+  bool GetTextDirection(mojo_base::mojom::blink::TextDirection&) const;
   bool IsEmpty() const;
   void OverrideWithStyle(const CSSPropertyValueSet*);
   void Clear();
diff --git a/third_party/blink/renderer/core/editing/editor.cc b/third_party/blink/renderer/core/editing/editor.cc
index 96dffd1..304e2f10 100644
--- a/third_party/blink/renderer/core/editing/editor.cc
+++ b/third_party/blink/renderer/core/editing/editor.cc
@@ -65,7 +65,6 @@
 #include "third_party/blink/renderer/core/editing/spellcheck/spell_checker.h"
 #include "third_party/blink/renderer/core/editing/visible_position.h"
 #include "third_party/blink/renderer/core/editing/visible_units.h"
-#include "third_party/blink/renderer/core/editing/writing_direction.h"
 #include "third_party/blink/renderer/core/events/keyboard_event.h"
 #include "third_party/blink/renderer/core/events/text_event.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
@@ -633,14 +632,17 @@
   undo_stack_->Redo();
 }
 
-void Editor::SetBaseWritingDirection(WritingDirection direction) {
+void Editor::SetBaseWritingDirection(
+    mojo_base::mojom::blink::TextDirection direction) {
   Element* focused_element = GetFrame().GetDocument()->FocusedElement();
   if (auto* text_control = ToTextControlOrNull(focused_element)) {
-    if (direction == WritingDirection::kNatural)
+    if (direction == mojo_base::mojom::blink::TextDirection::UNKNOWN_DIRECTION)
       return;
     text_control->setAttribute(
         html_names::kDirAttr,
-        direction == WritingDirection::kLeftToRight ? "ltr" : "rtl");
+        direction == mojo_base::mojom::blink::TextDirection::LEFT_TO_RIGHT
+            ? "ltr"
+            : "rtl");
     text_control->DispatchInputEvent();
     return;
   }
@@ -649,9 +651,11 @@
       MakeGarbageCollected<MutableCSSPropertyValueSet>(kHTMLQuirksMode);
   style->SetProperty(
       CSSPropertyID::kDirection,
-      direction == WritingDirection::kLeftToRight
+      direction == mojo_base::mojom::blink::TextDirection::LEFT_TO_RIGHT
           ? "ltr"
-          : direction == WritingDirection::kRightToLeft ? "rtl" : "inherit",
+          : direction == mojo_base::mojom::blink::TextDirection::RIGHT_TO_LEFT
+                ? "rtl"
+                : "inherit",
       /* important */ false, GetFrame().DomWindow()->GetSecureContextMode());
   ApplyParagraphStyleToSelection(
       style, InputEvent::InputType::kFormatSetBlockTextDirection);
diff --git a/third_party/blink/renderer/core/editing/editor.h b/third_party/blink/renderer/core/editing/editor.h
index 23acef1..f61775e 100644
--- a/third_party/blink/renderer/core/editing/editor.h
+++ b/third_party/blink/renderer/core/editing/editor.h
@@ -29,6 +29,7 @@
 #include <memory>
 
 #include "base/macros.h"
+#include "mojo/public/mojom/base/text_direction.mojom-blink-forward.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/editing/editing_style.h"
 #include "third_party/blink/renderer/core/editing/finder/find_options.h"
@@ -59,7 +60,6 @@
 enum class DragSourceType { kHTMLSource, kPlainTextSource };
 enum class EditorParagraphSeparator { kIsDiv, kIsP };
 enum class EditorCommandSource { kMenuOrKeyBinding, kDOM };
-enum class WritingDirection;
 
 class CORE_EXPORT Editor final : public GarbageCollected<Editor> {
  public:
@@ -133,7 +133,7 @@
   // Supposed to be used as |const UndoStack&|.
   UndoStack& GetUndoStack() const { return *undo_stack_; }
 
-  void SetBaseWritingDirection(WritingDirection);
+  void SetBaseWritingDirection(mojo_base::mojom::blink::TextDirection);
 
   // smartInsertDeleteEnabled and selectTrailingWhitespaceEnabled are
   // mutually exclusive, meaning that enabling one will disable the other.
diff --git a/third_party/blink/renderer/core/editing/ime/ime_text_span.cc b/third_party/blink/renderer/core/editing/ime/ime_text_span.cc
index 1293b47..eb8ec30d 100644
--- a/third_party/blink/renderer/core/editing/ime/ime_text_span.cc
+++ b/third_party/blink/renderer/core/editing/ime/ime_text_span.cc
@@ -102,6 +102,19 @@
   return ui::mojom::ImeTextSpanUnderlineStyle::kNone;
 }
 
+ui::ImeTextSpan::Type ConvertImeTextSpanTypeToUiType(ImeTextSpan::Type type) {
+  switch (type) {
+    case ImeTextSpan::Type::kAutocorrect:
+      return ui::ImeTextSpan::Type::kAutocorrect;
+    case ImeTextSpan::Type::kComposition:
+      return ui::ImeTextSpan::Type::kComposition;
+    case ImeTextSpan::Type::kMisspellingSuggestion:
+      return ui::ImeTextSpan::Type::kMisspellingSuggestion;
+    case ImeTextSpan::Type::kSuggestion:
+      return ui::ImeTextSpan::Type::kSuggestion;
+  }
+}
+
 }  // namespace
 
 ImeTextSpan::ImeTextSpan(const ui::ImeTextSpan& ime_text_span)
@@ -118,4 +131,10 @@
                   ime_text_span.interim_char_selection,
                   ConvertStdVectorOfStdStringsToVectorOfStrings(
                       ime_text_span.suggestions)) {}
+
+ui::ImeTextSpan ImeTextSpan::ToUiImeTextSpan() {
+  return ui::ImeTextSpan(ConvertImeTextSpanTypeToUiType(GetType()),
+                         StartOffset(), EndOffset());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/editing/ime/ime_text_span.h b/third_party/blink/renderer/core/editing/ime/ime_text_span.h
index 057a3d22..c3aef45 100644
--- a/third_party/blink/renderer/core/editing/ime/ime_text_span.h
+++ b/third_party/blink/renderer/core/editing/ime/ime_text_span.h
@@ -84,6 +84,8 @@
   bool InterimCharSelection() const { return interim_char_selection_; }
   const Vector<String>& Suggestions() const { return suggestions_; }
 
+  ui::ImeTextSpan ToUiImeTextSpan();
+
  private:
   Type type_;
   unsigned start_offset_;
diff --git a/third_party/blink/renderer/core/editing/ime/input_method_controller.cc b/third_party/blink/renderer/core/editing/ime/input_method_controller.cc
index 03e502f..989e8a8 100644
--- a/third_party/blink/renderer/core/editing/ime/input_method_controller.cc
+++ b/third_party/blink/renderer/core/editing/ime/input_method_controller.cc
@@ -303,6 +303,24 @@
   }
 }
 
+ImeTextSpan::Type ConvertSuggestionMarkerType(
+    SuggestionMarker::SuggestionType type) {
+  switch (type) {
+    case SuggestionMarker::SuggestionType::kAutocorrect:
+      return ImeTextSpan::Type::kAutocorrect;
+    case SuggestionMarker::SuggestionType::kMisspelling:
+      return ImeTextSpan::Type::kMisspellingSuggestion;
+    case SuggestionMarker::SuggestionType::kNotMisspelling:
+      return ImeTextSpan::Type::kSuggestion;
+  }
+}
+
+// ImeTextSpans types that need to be provided to TextInputInfo can be added
+// here.
+bool ShouldGetImeTextSpansAroundPosition(ImeTextSpan::Type type) {
+  return type == ImeTextSpan::Type::kAutocorrect;
+}
+
 }  // anonymous namespace
 
 enum class InputMethodController::TypingContinuation { kContinue, kEnd };
@@ -1544,6 +1562,12 @@
     info.selection_end = selection_plain_text_range.End();
   }
 
+  // Only gets ime text spans when there is no selection range.
+  // ie. the selection range is just a cursor position.
+  if (info.selection_start == info.selection_end) {
+    info.ime_text_spans = GetImeTextSpansAroundPosition(info.selection_start);
+  }
+
   EphemeralRange range = CompositionEphemeralRange();
   PlainTextRange composition_plain_text_range =
       PlainTextRangeForEphemeralRange(range).second;
@@ -1764,4 +1788,44 @@
   ExecutionContextLifecycleObserver::Trace(visitor);
 }
 
+WebVector<ui::ImeTextSpan> InputMethodController::GetImeTextSpansAroundPosition(
+    unsigned position) const {
+  DCHECK(!GetDocument().NeedsLayoutTreeUpdate());
+  Element* target = GetDocument().FocusedElement();
+  if (!target)
+    return WebVector<ui::ImeTextSpan>();
+
+  Element* editable = GetFrame()
+                          .Selection()
+                          .ComputeVisibleSelectionInDOMTreeDeprecated()
+                          .RootEditableElement();
+  if (!editable)
+    return WebVector<ui::ImeTextSpan>();
+
+  WebVector<ui::ImeTextSpan> ime_text_spans;
+  const EphemeralRange range =
+      PlainTextRange(position, position).CreateRange(*editable);
+  const DocumentMarkerVector& marker_list =
+      GetDocument().Markers().MarkersAroundPosition(
+          ToPositionInFlatTree(range.StartPosition()),
+          DocumentMarker::MarkerTypes::All());
+
+  for (DocumentMarker* marker : marker_list) {
+    if (marker->GetType() == DocumentMarker::MarkerType::kSuggestion) {
+      ImeTextSpan::Type type = ConvertSuggestionMarkerType(
+          To<SuggestionMarker>(marker)->GetSuggestionType());
+      if (ShouldGetImeTextSpansAroundPosition(type)) {
+        ime_text_spans.emplace_back(
+            ImeTextSpan(type, marker->StartOffset(), marker->EndOffset(),
+                        Color::kTransparent, ImeTextSpanThickness::kNone,
+                        ImeTextSpanUnderlineStyle::kNone, Color::kTransparent,
+                        Color::kTransparent)
+                .ToUiImeTextSpan());
+      }
+    }
+  }
+
+  return ime_text_spans;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/editing/ime/input_method_controller.h b/third_party/blink/renderer/core/editing/ime/input_method_controller.h
index b4106d9..1de392c 100644
--- a/third_party/blink/renderer/core/editing/ime/input_method_controller.h
+++ b/third_party/blink/renderer/core/editing/ime/input_method_controller.h
@@ -237,6 +237,10 @@
       TypingCommand::TextCompositionType composition_type);
   void DispatchCompositionEndEvent(LocalFrame& frame, const String& text);
 
+  // Gets ime text spans of interest at the cursor position.
+  WebVector<ui::ImeTextSpan> GetImeTextSpansAroundPosition(
+      unsigned position) const;
+
   FRIEND_TEST_ALL_PREFIXES(InputMethodControllerTest,
                            InputModeOfFocusedElement);
   FRIEND_TEST_ALL_PREFIXES(InputMethodControllerTest,
diff --git a/third_party/blink/renderer/core/editing/ime/input_method_controller_test.cc b/third_party/blink/renderer/core/editing/ime/input_method_controller_test.cc
index 6723050..39ee9e2 100644
--- a/third_party/blink/renderer/core/editing/ime/input_method_controller_test.cc
+++ b/third_party/blink/renderer/core/editing/ime/input_method_controller_test.cc
@@ -205,6 +205,31 @@
                 ->GetSuggestionType());
 }
 
+TEST_F(InputMethodControllerTest, GetImeTextSpansAroundPosition) {
+  InsertHTMLElement("<div id='sample' contenteditable>hello world</div>",
+                    "sample");
+  ImeTextSpan span1 = ImeTextSpan(ImeTextSpan::Type::kAutocorrect, 0, 5,
+                                  Color(255, 0, 0), ImeTextSpanThickness::kThin,
+                                  ImeTextSpanUnderlineStyle::kSolid, 0, 0);
+  ImeTextSpan span2 = ImeTextSpan(ImeTextSpan::Type::kComposition, 1, 3,
+                                  Color(255, 0, 0), ImeTextSpanThickness::kThin,
+                                  ImeTextSpanUnderlineStyle::kSolid, 0, 0);
+  ImeTextSpan span3 = ImeTextSpan(
+      ImeTextSpan::Type::kMisspellingSuggestion, 1, 3, Color(255, 0, 0),
+      ImeTextSpanThickness::kThin, ImeTextSpanUnderlineStyle::kSolid, 0, 0);
+
+  Controller().AddImeTextSpansToExistingText({span1, span2, span3}, 0, 5);
+  Controller().SetEditableSelectionOffsets(PlainTextRange(1, 1));
+
+  const WebVector<ui::ImeTextSpan>& ime_text_spans =
+      Controller().TextInputInfo().ime_text_spans;
+
+  EXPECT_EQ(1u, ime_text_spans.size());
+  EXPECT_EQ(0u, ime_text_spans[0].start_offset);
+  EXPECT_EQ(5u, ime_text_spans[0].end_offset);
+  EXPECT_EQ(ui::ImeTextSpan::Type::kAutocorrect, ime_text_spans[0].type);
+}
+
 TEST_F(InputMethodControllerTest, SetCompositionAfterEmoji) {
   // "trophy" = U+1F3C6 = 0xF0 0x9F 0x8F 0x86 (UTF8).
   Element* div = InsertHTMLElement(
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
index 440fbdef..c6c939d6 100644
--- a/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
+++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller.cc
@@ -123,6 +123,19 @@
   ax_object_cache->HandleTextMarkerDataAdded(non_const_node, non_const_node);
 }
 
+PositionInFlatTree SearchAroundPositionStart(
+    const PositionInFlatTree& position) {
+  const PositionInFlatTree start_of_word_or_null =
+      StartOfWordPosition(position, kPreviousWordIfOnBoundary);
+  return start_of_word_or_null.IsNotNull() ? start_of_word_or_null : position;
+}
+
+PositionInFlatTree SearchAroundPositionEnd(const PositionInFlatTree& position) {
+  const PositionInFlatTree end_of_word_or_null =
+      EndOfWordPosition(position, kNextWordIfOnBoundary);
+  return end_of_word_or_null.IsNotNull() ? end_of_word_or_null : position;
+}
+
 }  // namespace
 
 Member<DocumentMarkerList>& DocumentMarkerController::ListForType(
@@ -428,15 +441,8 @@
     DocumentMarker::MarkerTypes types) {
   if (position.IsNull())
     return nullptr;
-
-  const PositionInFlatTree start_of_word_or_null =
-      StartOfWordPosition(position, kPreviousWordIfOnBoundary);
-  const PositionInFlatTree start =
-      start_of_word_or_null.IsNotNull() ? start_of_word_or_null : position;
-  const PositionInFlatTree end_of_word_or_null =
-      EndOfWordPosition(position, kNextWordIfOnBoundary);
-  const PositionInFlatTree end =
-      end_of_word_or_null.IsNotNull() ? end_of_word_or_null : position;
+  const PositionInFlatTree& start = SearchAroundPositionStart(position);
+  const PositionInFlatTree& end = SearchAroundPositionEnd(position);
 
   if (start > end) {
     // TODO(crbug.com/778507): We shouldn't reach here, but currently do due to
@@ -536,6 +542,57 @@
   return nullptr;
 }
 
+DocumentMarkerVector DocumentMarkerController::MarkersAroundPosition(
+    const PositionInFlatTree& position,
+    DocumentMarker::MarkerTypes types) {
+  DocumentMarkerVector result;
+  if (position.IsNull())
+    return result;
+
+  if (!PossiblyHasMarkers(types))
+    return result;
+
+  const PositionInFlatTree& start = SearchAroundPositionStart(position);
+  const PositionInFlatTree& end = SearchAroundPositionEnd(position);
+
+  const Node* const start_node = start.ComputeContainerNode();
+  const unsigned start_offset = start.ComputeOffsetInContainerNode();
+  const Node* const end_node = end.ComputeContainerNode();
+  const unsigned end_offset = end.ComputeOffsetInContainerNode();
+
+  for (const Node& node : EphemeralRangeInFlatTree(start, end).Nodes()) {
+    auto* text_node = DynamicTo<Text>(node);
+    if (!text_node)
+      continue;
+
+    MarkerLists* const markers = markers_.at(text_node);
+    if (!markers)
+      continue;
+
+    const unsigned start_range_offset = node == start_node ? start_offset : 0;
+    const unsigned end_range_offset =
+        node == end_node ? end_offset : text_node->length();
+
+    // Minor optimization: if we have an empty range at a node boundary, it
+    // doesn't fall in the interior of any marker.
+    if (start_range_offset == 0 && end_range_offset == 0)
+      continue;
+    const unsigned node_length = To<CharacterData>(node).length();
+    if (start_range_offset == node_length && end_range_offset == node_length)
+      continue;
+
+    for (DocumentMarker::MarkerType type : types) {
+      const DocumentMarkerList* const list = ListForType(markers, type);
+      if (!list)
+        continue;
+
+      result.AppendVector(
+          list->MarkersIntersectingRange(start_range_offset, end_range_offset));
+    }
+  }
+  return result;
+}
+
 HeapVector<std::pair<Member<const Text>, Member<DocumentMarker>>>
 DocumentMarkerController::MarkersIntersectingRange(
     const EphemeralRangeInFlatTree& range,
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller.h b/third_party/blink/renderer/core/editing/markers/document_marker_controller.h
index b9fd78b..47e590a 100644
--- a/third_party/blink/renderer/core/editing/markers/document_marker_controller.h
+++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller.h
@@ -136,6 +136,15 @@
       unsigned start_offset,
       unsigned end_offset,
       DocumentMarker::MarkerTypes);
+  // If the given position is either at the boundary or inside a word, expands
+  // the position to the surrounding word and then looks for all markers having
+  // the specified type. If the position is neither at the boundary or inside a
+  // word, expands the position to cover the space between the end of the
+  // previous and the start of the next words. If such markers exist, this
+  // method will return all of them. Otherwise, this method will return an empty
+  // list.
+  DocumentMarkerVector MarkersAroundPosition(const PositionInFlatTree& position,
+                                             DocumentMarker::MarkerTypes types);
   // Return all markers of the specified types whose interiors have non-empty
   // overlap with the specified range. Note that the range can be collapsed, in
   // in which case markers containing the position in their interiors are
diff --git a/third_party/blink/renderer/core/editing/markers/document_marker_controller_test.cc b/third_party/blink/renderer/core/editing/markers/document_marker_controller_test.cc
index 7910be5..1d3b4dc 100644
--- a/third_party/blink/renderer/core/editing/markers/document_marker_controller_test.cc
+++ b/third_party/blink/renderer/core/editing/markers/document_marker_controller_test.cc
@@ -477,6 +477,50 @@
   EXPECT_EQ(3u, result->EndOffset());
 }
 
+TEST_F(DocumentMarkerControllerTest, MarkersAroundPosition) {
+  SetBodyContent("<div contenteditable>123 456</div>");
+  Element* div = GetDocument().QuerySelector("div");
+  Node* text = div->firstChild();
+
+  // Add a spelling marker on "123"
+  MarkerController().AddSpellingMarker(
+      EphemeralRange(Position(text, 0), Position(text, 3)));
+  // Add a text match marker on "123"
+  MarkerController().AddTextMatchMarker(
+      EphemeralRange(Position(text, 0), Position(text, 3)),
+      TextMatchMarker::MatchStatus::kInactive);
+  // Add a grammar marker on "456"
+  MarkerController().AddSpellingMarker(
+      EphemeralRange(Position(text, 4), Position(text, 7)));
+
+  // Query for spellcheck markers at the start of "123".
+  const DocumentMarkerVector& list1 = MarkerController().MarkersAroundPosition(
+      PositionInFlatTree(text, 0), DocumentMarker::MarkerTypes::Misspelling());
+
+  EXPECT_EQ(1u, list1.size());
+  EXPECT_EQ(DocumentMarker::kSpelling, list1[0]->GetType());
+  EXPECT_EQ(0u, list1[0]->StartOffset());
+  EXPECT_EQ(3u, list1[0]->EndOffset());
+
+  // Query for spellcheck markers in the middle of "123".
+  const DocumentMarkerVector& list2 = MarkerController().MarkersAroundPosition(
+      PositionInFlatTree(text, 3), DocumentMarker::MarkerTypes::Misspelling());
+
+  EXPECT_EQ(1u, list2.size());
+  EXPECT_EQ(DocumentMarker::kSpelling, list2[0]->GetType());
+  EXPECT_EQ(0u, list2[0]->StartOffset());
+  EXPECT_EQ(3u, list2[0]->EndOffset());
+
+  // Query for spellcheck markers at the end of "123".
+  const DocumentMarkerVector& list3 = MarkerController().MarkersAroundPosition(
+      PositionInFlatTree(text, 3), DocumentMarker::MarkerTypes::Misspelling());
+
+  EXPECT_EQ(1u, list3.size());
+  EXPECT_EQ(DocumentMarker::kSpelling, list3[0]->GetType());
+  EXPECT_EQ(0u, list3[0]->StartOffset());
+  EXPECT_EQ(3u, list3[0]->EndOffset());
+}
+
 TEST_F(DocumentMarkerControllerTest, MarkersIntersectingRange) {
   SetBodyContent("<div contenteditable>123456789</div>");
   Element* div = GetDocument().QuerySelector("div");
diff --git a/third_party/blink/renderer/core/editing/writing_direction.h b/third_party/blink/renderer/core/editing/writing_direction.h
deleted file mode 100644
index af5e583cb9..0000000
--- a/third_party/blink/renderer/core/editing/writing_direction.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2008 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_WRITING_DIRECTION_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_WRITING_DIRECTION_H_
-
-namespace blink {
-
-enum class WritingDirection { kNatural, kLeftToRight, kRightToLeft };
-
-}  // namespace blink
-
-#endif
diff --git a/third_party/blink/renderer/core/execution_context/agent_metrics_collector.cc b/third_party/blink/renderer/core/execution_context/agent_metrics_collector.cc
index 9b56d05..18eff6e 100644
--- a/third_party/blink/renderer/core/execution_context/agent_metrics_collector.cc
+++ b/third_party/blink/renderer/core/execution_context/agent_metrics_collector.cc
@@ -166,7 +166,7 @@
   if (!agent_metrics_collector_host_.is_bound()) {
     blink::Platform::Current()->GetBrowserInterfaceBroker()->GetInterface(
         agent_metrics_collector_host_.BindNewPipeAndPassReceiver(
-            ThreadScheduler::Current()->IPCTaskRunner()));
+            ThreadScheduler::Current()->DeprecatedDefaultTaskRunner()));
   }
   return agent_metrics_collector_host_.get();
 }
diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.cc b/third_party/blink/renderer/core/exported/web_settings_impl.cc
index ed851b4..3e58fd8 100644
--- a/third_party/blink/renderer/core/exported/web_settings_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_settings_impl.cc
@@ -784,6 +784,10 @@
   settings_->SetAriaModalPrunesAXTree(enabled);
 }
 
+void WebSettingsImpl::SetUseAXMenuList(bool enabled) {
+  settings_->SetUseAXMenuList(enabled);
+}
+
 STATIC_ASSERT_ENUM(WebSettings::ImageAnimationPolicy::kAllowed,
                    kImageAnimationPolicyAllowed);
 STATIC_ASSERT_ENUM(WebSettings::ImageAnimationPolicy::kAnimateOnce,
diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.h b/third_party/blink/renderer/core/exported/web_settings_impl.h
index 2c94bd8a..dcd1119 100644
--- a/third_party/blink/renderer/core/exported/web_settings_impl.h
+++ b/third_party/blink/renderer/core/exported/web_settings_impl.h
@@ -224,6 +224,7 @@
   void SetNavigationControls(NavigationControls) override;
 
   void SetAriaModalPrunesAXTree(bool) override;
+  void SetUseAXMenuList(bool) override;
 
   bool RenderVSyncNotificationEnabled() const {
     return render_v_sync_notification_enabled_;
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc
index a99cecf..83d7c4f 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.cc
+++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -132,102 +132,6 @@
 
 namespace blink {
 
-static void UpdateSuddenTerminationStatus(
-    LocalDOMWindow* dom_window,
-    bool added_listener,
-    blink::mojom::SuddenTerminationDisablerType disabler_type) {
-  Platform::Current()->SuddenTerminationChanged(!added_listener);
-  if (dom_window->GetFrame()) {
-    dom_window->GetFrame()
-        ->GetLocalFrameHostRemote()
-        .SuddenTerminationDisablerChanged(added_listener, disabler_type);
-  }
-}
-
-using DOMWindowSet = HeapHashCountedSet<WeakMember<LocalDOMWindow>>;
-
-static DOMWindowSet& WindowsWithUnloadEventListeners() {
-  DEFINE_STATIC_LOCAL(Persistent<DOMWindowSet>,
-                      windows_with_unload_event_listeners,
-                      (MakeGarbageCollected<DOMWindowSet>()));
-  return *windows_with_unload_event_listeners;
-}
-
-static DOMWindowSet& WindowsWithBeforeUnloadEventListeners() {
-  DEFINE_STATIC_LOCAL(Persistent<DOMWindowSet>,
-                      windows_with_before_unload_event_listeners,
-                      (MakeGarbageCollected<DOMWindowSet>()));
-  return *windows_with_before_unload_event_listeners;
-}
-
-static void TrackUnloadEventListener(LocalDOMWindow* dom_window) {
-  DOMWindowSet& set = WindowsWithUnloadEventListeners();
-  if (set.insert(dom_window).is_new_entry) {
-    // The first unload handler was added.
-    UpdateSuddenTerminationStatus(
-        dom_window, true,
-        blink::mojom::SuddenTerminationDisablerType::kUnloadHandler);
-  }
-}
-
-static void UntrackUnloadEventListener(LocalDOMWindow* dom_window) {
-  DOMWindowSet& set = WindowsWithUnloadEventListeners();
-  DOMWindowSet::iterator it = set.find(dom_window);
-  if (it == set.end())
-    return;
-  if (set.erase(it)) {
-    // The last unload handler was removed.
-    UpdateSuddenTerminationStatus(
-        dom_window, false,
-        blink::mojom::SuddenTerminationDisablerType::kUnloadHandler);
-  }
-}
-
-static void UntrackAllUnloadEventListeners(LocalDOMWindow* dom_window) {
-  DOMWindowSet& set = WindowsWithUnloadEventListeners();
-  DOMWindowSet::iterator it = set.find(dom_window);
-  if (it == set.end())
-    return;
-  set.RemoveAll(it);
-  UpdateSuddenTerminationStatus(
-      dom_window, false,
-      blink::mojom::SuddenTerminationDisablerType::kUnloadHandler);
-}
-
-static void TrackBeforeUnloadEventListener(LocalDOMWindow* dom_window) {
-  DOMWindowSet& set = WindowsWithBeforeUnloadEventListeners();
-  if (set.insert(dom_window).is_new_entry) {
-    // The first beforeunload handler was added.
-    UpdateSuddenTerminationStatus(
-        dom_window, true,
-        blink::mojom::SuddenTerminationDisablerType::kBeforeUnloadHandler);
-  }
-}
-
-static void UntrackBeforeUnloadEventListener(LocalDOMWindow* dom_window) {
-  DOMWindowSet& set = WindowsWithBeforeUnloadEventListeners();
-  DOMWindowSet::iterator it = set.find(dom_window);
-  if (it == set.end())
-    return;
-  if (set.erase(it)) {
-    // The last beforeunload handler was removed.
-    UpdateSuddenTerminationStatus(
-        dom_window, false,
-        blink::mojom::SuddenTerminationDisablerType::kBeforeUnloadHandler);
-  }
-}
-
-static void UntrackAllBeforeUnloadEventListeners(LocalDOMWindow* dom_window) {
-  DOMWindowSet& set = WindowsWithBeforeUnloadEventListeners();
-  DOMWindowSet::iterator it = set.find(dom_window);
-  if (it == set.end())
-    return;
-  set.RemoveAll(it);
-  UpdateSuddenTerminationStatus(
-      dom_window, false,
-      blink::mojom::SuddenTerminationDisablerType::kBeforeUnloadHandler);
-}
-
 LocalDOMWindow::LocalDOMWindow(LocalFrame& frame, WindowAgent* agent)
     : DOMWindow(frame),
       ExecutionContext(V8PerIsolateData::MainThreadIsolate(), agent),
@@ -1819,10 +1723,8 @@
 
   if (event_type == event_type_names::kUnload) {
     UseCounter::Count(document(), WebFeature::kDocumentUnloadRegistered);
-    TrackUnloadEventListener(this);
   } else if (event_type == event_type_names::kBeforeunload) {
     UseCounter::Count(document(), WebFeature::kDocumentBeforeUnloadRegistered);
-    TrackBeforeUnloadEventListener(this);
     if (GetFrame() && !GetFrame()->IsMainFrame()) {
       UseCounter::Count(document(),
                         WebFeature::kSubFrameBeforeUnloadRegistered);
@@ -1832,6 +1734,13 @@
   } else if (event_type == event_type_names::kPageshow) {
     UseCounter::Count(document(), WebFeature::kDocumentPageShowRegistered);
   }
+
+  if (!GetFrame() || (event_type != event_type_names::kUnload &&
+                      event_type != event_type_names::kBeforeunload &&
+                      event_type != event_type_names::kPagehide)) {
+    return;
+  }
+  GetFrame()->AddedSuddenTerminationDisablerListener(*this, event_type);
 }
 
 void LocalDOMWindow::RemovedEventListener(
@@ -1847,11 +1756,14 @@
     it->DidRemoveEventListener(this, event_type);
   }
 
-  if (event_type == event_type_names::kUnload) {
-    UntrackUnloadEventListener(this);
-  } else if (event_type == event_type_names::kBeforeunload) {
-    UntrackBeforeUnloadEventListener(this);
+  // Update sudden termination disabler state if we removed a listener for
+  // unload/beforeunload/pagehide.
+  if (!GetFrame() || (event_type != event_type_names::kUnload &&
+                      event_type != event_type_names::kBeforeunload &&
+                      event_type != event_type_names::kPagehide)) {
+    return;
   }
+  GetFrame()->RemovedSuddenTerminationDisablerListener(*this, event_type);
 }
 
 void LocalDOMWindow::DispatchLoadEvent() {
@@ -1904,6 +1816,12 @@
 }
 
 void LocalDOMWindow::RemoveAllEventListeners() {
+  int previous_unload_handlers_count =
+      NumberOfEventListeners(event_type_names::kUnload);
+  int previous_before_unload_handlers_count =
+      NumberOfEventListeners(event_type_names::kBeforeunload);
+  int previous_page_hide_handlers_count =
+      NumberOfEventListeners(event_type_names::kPagehide);
   EventTarget::RemoveAllEventListeners();
 
   for (auto& it : event_listener_observers_) {
@@ -1913,8 +1831,20 @@
   if (GetFrame())
     GetFrame()->GetEventHandlerRegistry().DidRemoveAllEventHandlers(*this);
 
-  UntrackAllUnloadEventListeners(this);
-  UntrackAllBeforeUnloadEventListeners(this);
+  // Update sudden termination disabler state if we previously have listeners
+  // for unload/beforeunload/pagehide.
+  if (GetFrame() && previous_unload_handlers_count) {
+    GetFrame()->RemovedSuddenTerminationDisablerListener(
+        *this, event_type_names::kUnload);
+  }
+  if (GetFrame() && previous_before_unload_handlers_count) {
+    GetFrame()->RemovedSuddenTerminationDisablerListener(
+        *this, event_type_names::kBeforeunload);
+  }
+  if (GetFrame() && previous_page_hide_handlers_count) {
+    GetFrame()->RemovedSuddenTerminationDisablerListener(
+        *this, event_type_names::kPagehide);
+  }
 }
 
 void LocalDOMWindow::FinishedLoading(FrameLoader::NavigationFinishState state) {
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index 0cf3888..f6e09d3 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -91,7 +91,6 @@
 #include "third_party/blink/renderer/core/editing/spellcheck/spell_checker.h"
 #include "third_party/blink/renderer/core/editing/suggestion/text_suggestion_controller.h"
 #include "third_party/blink/renderer/core/editing/surrounding_text.h"
-#include "third_party/blink/renderer/core/editing/writing_direction.h"
 #include "third_party/blink/renderer/core/execution_context/window_agent.h"
 #include "third_party/blink/renderer/core/exported/web_plugin_container_impl.h"
 #include "third_party/blink/renderer/core/fileapi/public_url_manager.h"
@@ -803,15 +802,18 @@
 
   switch (direction) {
     case base::i18n::TextDirection::UNKNOWN_DIRECTION:
-      editor.SetBaseWritingDirection(WritingDirection::kNatural);
+      editor.SetBaseWritingDirection(
+          mojo_base::mojom::blink::TextDirection::UNKNOWN_DIRECTION);
       break;
 
     case base::i18n::TextDirection::LEFT_TO_RIGHT:
-      editor.SetBaseWritingDirection(WritingDirection::kLeftToRight);
+      editor.SetBaseWritingDirection(
+          mojo_base::mojom::blink::TextDirection::LEFT_TO_RIGHT);
       break;
 
     case base::i18n::TextDirection::RIGHT_TO_LEFT:
-      editor.SetBaseWritingDirection(WritingDirection::kRightToLeft);
+      editor.SetBaseWritingDirection(
+          mojo_base::mojom::blink::TextDirection::RIGHT_TO_LEFT);
       break;
 
     default:
@@ -857,6 +859,53 @@
                                           owner_element);
 }
 
+mojom::blink::SuddenTerminationDisablerType
+SuddenTerminationDisablerTypeForEventType(const AtomicString& event_type) {
+  if (event_type == event_type_names::kUnload) {
+    return mojom::blink::SuddenTerminationDisablerType::kUnloadHandler;
+  }
+  if (event_type == event_type_names::kBeforeunload) {
+    return mojom::blink::SuddenTerminationDisablerType::kBeforeUnloadHandler;
+  }
+  if (event_type == event_type_names::kPagehide) {
+    return mojom::blink::SuddenTerminationDisablerType::kPageHideHandler;
+  }
+  if (event_type == event_type_names::kVisibilitychange) {
+    return mojom::blink::SuddenTerminationDisablerType::
+        kVisibilityChangeHandler;
+  }
+  NOTREACHED();
+  return mojom::blink::SuddenTerminationDisablerType::kUnloadHandler;
+}
+
+void LocalFrame::UpdateSuddenTerminationStatus(
+    bool added_listener,
+    mojom::blink::SuddenTerminationDisablerType disabler_type) {
+  Platform::Current()->SuddenTerminationChanged(!added_listener);
+  GetLocalFrameHostRemote().SuddenTerminationDisablerChanged(added_listener,
+                                                             disabler_type);
+}
+
+void LocalFrame::AddedSuddenTerminationDisablerListener(
+    const EventTarget& event_target,
+    const AtomicString& event_type) {
+  if (event_target.NumberOfEventListeners(event_type) == 1) {
+    // The first handler of this type was added.
+    UpdateSuddenTerminationStatus(
+        true, SuddenTerminationDisablerTypeForEventType(event_type));
+  }
+}
+
+void LocalFrame::RemovedSuddenTerminationDisablerListener(
+    const EventTarget& event_target,
+    const AtomicString& event_type) {
+  if (event_target.NumberOfEventListeners(event_type) == 0) {
+    // The last handler of this type was removed.
+    UpdateSuddenTerminationStatus(
+        false, SuddenTerminationDisablerTypeForEventType(event_type));
+  }
+}
+
 void LocalFrame::DidFocus() {
   GetLocalFrameHostRemote().DidFocusFrame();
 }
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h
index fc086ddd..13c41e2 100644
--- a/third_party/blink/renderer/core/frame/local_frame.h
+++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -432,6 +432,21 @@
     should_send_resource_timing_info_to_parent_ = value;
   }
 
+  // Called when certain event listeners are added for the first time/last time,
+  // making it possible/not possible to terminate the frame suddenly.
+  void UpdateSuddenTerminationStatus(
+      bool added_listener,
+      mojom::blink::SuddenTerminationDisablerType disabler_type);
+
+  // Called when we added an event listener that might affect sudden termination
+  // disabling of the page.
+  void AddedSuddenTerminationDisablerListener(const EventTarget& event_target,
+                                              const AtomicString& event_type);
+  // Called when we removed event listeners that might affect sudden termination
+  // disabling of the page.
+  void RemovedSuddenTerminationDisablerListener(const EventTarget& event_target,
+                                                const AtomicString& event_type);
+
   // TODO(https://crbug.com/578349): provisional frames are a hack that should
   // be removed.
   bool IsProvisional() const;
diff --git a/third_party/blink/renderer/core/frame/settings.json5 b/third_party/blink/renderer/core/frame/settings.json5
index c06cde35..23989e8 100644
--- a/third_party/blink/renderer/core/frame/settings.json5
+++ b/third_party/blink/renderer/core/frame/settings.json5
@@ -1091,5 +1091,15 @@
       initial: false,
       type: "bool",
     },
+    // The AXMenuList class provides a fake implementation of the
+    // select element pop-up menu, which is required on platforms like
+    // Mac and Android that use a native pop-up. On other platforms you
+    // can set this flag to false and expose the actual pop-up menu
+    // instead of letting AXMenuList handle it.
+    {
+      name: "useAXMenuList",
+      initial: true,
+      type: "bool",
+    },
   ],
 }
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_base.cc b/third_party/blink/renderer/core/frame/web_frame_widget_base.cc
index 9d069f8a..4fcaae1 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_base.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_base.cc
@@ -1612,6 +1612,28 @@
   focused_frame->AddImeTextSpansToExistingText(ime_text_spans, start, end);
 }
 
+Vector<ui::mojom::blink::ImeTextSpanInfoPtr>
+WebFrameWidgetBase::GetImeTextSpansInfo(
+    const WebVector<ui::ImeTextSpan>& ime_text_spans) {
+  auto* focused_frame = FocusedWebLocalFrameInWidget();
+  if (!focused_frame)
+    return Vector<ui::mojom::blink::ImeTextSpanInfoPtr>();
+
+  Vector<ui::mojom::blink::ImeTextSpanInfoPtr> ime_text_spans_info;
+
+  for (const auto& ime_text_span : ime_text_spans) {
+    WebRect webrect;
+    unsigned length = ime_text_span.end_offset - ime_text_span.start_offset;
+    focused_frame->FirstRectForCharacterRange(ime_text_span.start_offset,
+                                              length, webrect);
+    Client()->ConvertViewportToWindow(&webrect);
+
+    ime_text_spans_info.push_back(ui::mojom::blink::ImeTextSpanInfo::New(
+        ime_text_span, gfx::Rect(webrect)));
+  }
+  return ime_text_spans_info;
+}
+
 void WebFrameWidgetBase::ClearImeTextSpansByType(uint32_t start,
                                                  uint32_t end,
                                                  ui::ImeTextSpan::Type type) {
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_base.h b/third_party/blink/renderer/core/frame/web_frame_widget_base.h
index d2f9f984c..22e3692 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_base.h
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_base.h
@@ -178,6 +178,8 @@
       uint32_t start,
       uint32_t end,
       const Vector<ui::ImeTextSpan>& ime_text_spans) override;
+  Vector<ui::mojom::blink::ImeTextSpanInfoPtr> GetImeTextSpansInfo(
+      const WebVector<ui::ImeTextSpan>& ime_text_spans) override;
   void ClearImeTextSpansByType(uint32_t start,
                                uint32_t end,
                                ui::ImeTextSpan::Type type) override;
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
index 7783dfe..b8f923e5 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -169,7 +169,6 @@
 #include "third_party/blink/renderer/core/editing/spellcheck/spell_checker.h"
 #include "third_party/blink/renderer/core/editing/text_affinity.h"
 #include "third_party/blink/renderer/core/editing/visible_position.h"
-#include "third_party/blink/renderer/core/editing/writing_direction.h"
 #include "third_party/blink/renderer/core/events/after_print_event.h"
 #include "third_party/blink/renderer/core/events/before_print_event.h"
 #include "third_party/blink/renderer/core/exported/local_frame_client_impl.h"
diff --git a/third_party/blink/renderer/core/html/forms/html_select_element.cc b/third_party/blink/renderer/core/html/forms/html_select_element.cc
index e504a3810..5e27466 100644
--- a/third_party/blink/renderer/core/html/forms/html_select_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_select_element.cc
@@ -1197,6 +1197,10 @@
   return select_type_->InnerElement();
 }
 
+AXObject* HTMLSelectElement::PopupRootAXObject() const {
+  return select_type_->PopupRootAXObject();
+}
+
 HTMLOptionElement* HTMLSelectElement::SpatialNavigationFocusedOption() {
   return select_type_->SpatialNavigationFocusedOption();
 }
diff --git a/third_party/blink/renderer/core/html/forms/html_select_element.h b/third_party/blink/renderer/core/html/forms/html_select_element.h
index 8e5029a3..b9b87282 100644
--- a/third_party/blink/renderer/core/html/forms/html_select_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_select_element.h
@@ -38,6 +38,7 @@
 
 namespace blink {
 
+class AXObject;
 class AutoscrollController;
 class ExceptionState;
 class HTMLHRElement;
@@ -179,8 +180,9 @@
   void CloneNonAttributePropertiesFrom(const Element&,
                                        CloneChildrenFlag) override;
 
-  // This should be called only if UsesMenuList().
+  // These should be called only if UsesMenuList().
   Element& InnerElement() const;
+  AXObject* PopupRootAXObject() const;
 
  private:
   const AtomicString& FormControlType() const override;
diff --git a/third_party/blink/renderer/core/html/forms/internal_popup_menu.cc b/third_party/blink/renderer/core/html/forms/internal_popup_menu.cc
index 68ec8a7..fff7e6d 100644
--- a/third_party/blink/renderer/core/html/forms/internal_popup_menu.cc
+++ b/third_party/blink/renderer/core/html/forms/internal_popup_menu.cc
@@ -500,6 +500,10 @@
   needs_update_ = true;
 }
 
+AXObject* InternalPopupMenu::PopupRootAXObject() const {
+  return popup_ ? popup_->RootAXObject() : nullptr;
+}
+
 void InternalPopupMenu::Update(bool force_update) {
   if (!popup_ || !owner_element_ || (!needs_update_ && !force_update))
     return;
diff --git a/third_party/blink/renderer/core/html/forms/internal_popup_menu.h b/third_party/blink/renderer/core/html/forms/internal_popup_menu.h
index b9eec539..b3429c1 100644
--- a/third_party/blink/renderer/core/html/forms/internal_popup_menu.h
+++ b/third_party/blink/renderer/core/html/forms/internal_popup_menu.h
@@ -11,6 +11,7 @@
 
 namespace blink {
 
+class AXObject;
 class ChromeClient;
 class CSSFontSelector;
 class PagePopup;
@@ -47,6 +48,7 @@
   void Hide() override;
   void DisconnectClient() override;
   void UpdateFromElement(UpdateReason) override;
+  AXObject* PopupRootAXObject() const override;
 
   // PagePopupClient functions:
   void WriteDocument(SharedBuffer*) override;
diff --git a/third_party/blink/renderer/core/html/forms/popup_menu.h b/third_party/blink/renderer/core/html/forms/popup_menu.h
index 0bb4cb92..cf953db 100644
--- a/third_party/blink/renderer/core/html/forms/popup_menu.h
+++ b/third_party/blink/renderer/core/html/forms/popup_menu.h
@@ -26,6 +26,8 @@
 
 namespace blink {
 
+class AXObject;
+
 class PopupMenu : public GarbageCollected<PopupMenu> {
  public:
   virtual ~PopupMenu() = default;
@@ -39,6 +41,7 @@
   };
   virtual void UpdateFromElement(UpdateReason) = 0;
   virtual void DisconnectClient() = 0;
+  virtual AXObject* PopupRootAXObject() const { return nullptr; }
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/select_type.cc b/third_party/blink/renderer/core/html/forms/select_type.cc
index 2c3e764f..0ee6a54 100644
--- a/third_party/blink/renderer/core/html/forms/select_type.cc
+++ b/third_party/blink/renderer/core/html/forms/select_type.cc
@@ -102,6 +102,7 @@
   void PopupDidHide() override;
   bool PopupIsVisible() const override;
   PopupMenu* PopupForTesting() const override;
+  AXObject* PopupRootAXObject() const override;
 
   void DidMutateSubtree();
 
@@ -371,6 +372,10 @@
   return popup_.Get();
 }
 
+AXObject* MenuListSelectType::PopupRootAXObject() const {
+  return popup_ ? popup_->PopupRootAXObject() : nullptr;
+}
+
 void MenuListSelectType::DidSelectOption(
     HTMLOptionElement* element,
     HTMLSelectElement::SelectOptionFlags flags,
@@ -1359,6 +1364,11 @@
   return nullptr;
 }
 
+AXObject* SelectType::PopupRootAXObject() const {
+  NOTREACHED();
+  return nullptr;
+}
+
 // Returns the 1st valid OPTION |skip| items from |list_index| in direction
 // |direction| if there is one.
 // Otherwise, it returns the valid OPTION closest to that boundary which is past
diff --git a/third_party/blink/renderer/core/html/forms/select_type.h b/third_party/blink/renderer/core/html/forms/select_type.h
index e49dad8..4af877b5 100644
--- a/third_party/blink/renderer/core/html/forms/select_type.h
+++ b/third_party/blink/renderer/core/html/forms/select_type.h
@@ -11,6 +11,8 @@
 
 namespace blink {
 
+class AXObject;
+
 // SelectType class is an abstraction of the MenuList behavior and the ListBox
 // behavior of HTMLSelectElement.
 class SelectType : public GarbageCollected<SelectType> {
@@ -65,6 +67,7 @@
   virtual void PopupDidHide();
   virtual bool PopupIsVisible() const;
   virtual PopupMenu* PopupForTesting() const;
+  virtual AXObject* PopupRootAXObject() const;
 
   enum SkipDirection { kSkipBackwards = -1, kSkipForwards = 1 };
   CORE_EXPORT HTMLOptionElement* NextSelectableOption(HTMLOptionElement*) const;
diff --git a/third_party/blink/renderer/core/inspector/inspector_highlight.cc b/third_party/blink/renderer/core/inspector/inspector_highlight.cc
index cfb6371..573e9d1 100644
--- a/third_party/blink/renderer/core/inspector/inspector_highlight.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_highlight.cc
@@ -560,77 +560,6 @@
   return number_positions;
 }
 
-// Deprecated in favor of BuildGridPositiveLineNumberPositions; it will be
-// removed once the frontend is updated.
-std::unique_ptr<protocol::ListValue> BuildGridPositiveLineNumberOffsets(
-    LayoutGrid* layout_grid,
-    const Vector<LayoutUnit>& trackPositions,
-    const LayoutUnit& grid_gap,
-    GridTrackSizingDirection direction,
-    float scale) {
-  std::unique_ptr<protocol::ListValue> number_offsets =
-      protocol::ListValue::create();
-
-  // Find index of the first explicit Grid Line.
-  size_t firstExplicitIndex =
-      layout_grid->ExplicitGridStartForDirection(direction);
-
-  LayoutUnit firstOffset = trackPositions.front();
-
-  // Go line by line, calculating the offset to fall in the middel of gaps
-  // if needed.
-  for (size_t i = firstExplicitIndex; i < trackPositions.size(); ++i) {
-    float gapOffset = grid_gap / 2;
-    // No need for a gap offset if there is no gap, or the first line is
-    // explicit, or this is the last line.
-    if (grid_gap == 0 || i == 0 || i == trackPositions.size() - 1) {
-      gapOffset = 0;
-    }
-
-    number_offsets->pushValue(protocol::FundamentalValue::create(
-        (trackPositions.at(i) - gapOffset - firstOffset) * scale));
-  }
-
-  return number_offsets;
-}
-
-// Deprecated in favor of BuildGridNegativeLineNumberPositions; it will be
-// removed once the frontend is updated.
-std::unique_ptr<protocol::ListValue> BuildGridNegativeLineNumberOffsets(
-    LayoutGrid* layout_grid,
-    const Vector<LayoutUnit>& trackPositions,
-    const LayoutUnit& grid_gap,
-    GridTrackSizingDirection direction,
-    float scale) {
-  std::unique_ptr<protocol::ListValue> number_offsets =
-      protocol::ListValue::create();
-
-  // This is the number of tracks from the start of the grid, to the end of the
-  // explicit grid (including any leading implicit tracks).
-  size_t explicit_grid_end_track_count =
-      layout_grid->ExplicitGridEndForDirection(direction);
-
-  LayoutUnit firstOffset = trackPositions.front();
-
-  // Always start negative numbers at the first line.
-  number_offsets->pushValue(protocol::FundamentalValue::create(0));
-
-  // Then go line by line, calculating the offset to fall in the middle of gaps
-  // if needed.
-  for (size_t i = 1; i <= explicit_grid_end_track_count; i++) {
-    float gapOffset = grid_gap / 2;
-    if (grid_gap == 0 || (i == explicit_grid_end_track_count &&
-                          i == trackPositions.size() - 1)) {
-      gapOffset = 0;
-    }
-
-    number_offsets->pushValue(protocol::FundamentalValue::create(
-        (trackPositions.at(i) - gapOffset - firstOffset) * scale));
-  }
-
-  return number_offsets;
-}
-
 std::unique_ptr<protocol::DictionaryValue> BuildAreaNamePaths(
     LayoutGrid* layout_grid,
     float scale) {
@@ -688,7 +617,6 @@
       direction == kForColumns ? layout_grid->StyleRef().NamedGridColumnLines()
                                : layout_grid->StyleRef().NamedGridRowLines();
   LayoutUnit gap = layout_grid->GridGap(direction);
-  LayoutUnit first_offset = tracks.front();
   const Vector<LayoutUnit>& alt_positions = direction == kForRows
                                                 ? layout_grid->ColumnPositions()
                                                 : layout_grid->RowPositions();
@@ -713,10 +641,6 @@
           LocalToAbsolutePoint(layout_grid, line_name_pos, scale));
 
       line->setString("name", name);
-      // TODO (alexrudenko): offset should be removed once the frontend starts
-      // using absolute positions.
-      line->setValue("offset", protocol::FundamentalValue::create(
-                                   (main_axis_pos - first_offset) * scale));
 
       lines->pushValue(std::move(line));
     }
@@ -750,7 +674,7 @@
   if (!value)
     return result;
 
-  // TODO (alexrudenko): this would not handle track sizes defined using CSS
+  // TODO(alexrudenko): this would not handle track sizes defined using CSS
   // variables.
   const CSSValueList* value_list = DynamicTo<CSSValueList>(value);
 
@@ -821,7 +745,7 @@
     Element* element = DynamicTo<Element>(node);
     DCHECK(element);
     InspectorCSSCascade cascade(element, kPseudoIdNone);
-    // TODO (alexrudenko): caching might be required. Currently, the style
+    // TODO(alexrudenko): caching might be required. Currently, the style
     // resolver is used only for grid layouts when show_track_sizes is on.
     Vector<String> column_authored_values = GetAuthoredGridTrackSizes(
         cascade.GetCascadedProperty(CSSPropertyID::kGridTemplateColumns),
@@ -898,15 +822,6 @@
 
   // Positive Row and column Line positions
   if (grid_highlight_config.show_positive_line_numbers) {
-    // TODO (alexrudenko): offsets should be removed once the frontend is using
-    // positions.
-    grid_info->setValue("positiveRowLineNumberOffsets",
-                        BuildGridPositiveLineNumberOffsets(
-                            layout_grid, rows, row_gap, kForRows, scale));
-    grid_info->setValue(
-        "positiveColumnLineNumberOffsets",
-        BuildGridPositiveLineNumberOffsets(layout_grid, columns, column_gap,
-                                           kForColumns, scale));
     grid_info->setValue("positiveRowLineNumberPositions",
                         BuildGridPositiveLineNumberPositions(
                             layout_grid, rows, row_gap, kForRows, scale));
@@ -918,16 +833,6 @@
 
   // Negative Row and column Line positions
   if (grid_highlight_config.show_negative_line_numbers) {
-    // TODO (alexrudenko): offsets should be removed once the frontend is using
-    // positions.
-    grid_info->setValue("negativeRowLineNumberOffsets",
-                        BuildGridNegativeLineNumberOffsets(
-                            layout_grid, rows, row_gap, kForRows, scale));
-    grid_info->setValue(
-        "negativeColumnLineNumberOffsets",
-        BuildGridNegativeLineNumberOffsets(layout_grid, columns, column_gap,
-                                           kForColumns, scale));
-
     grid_info->setValue("negativeRowLineNumberPositions",
                         BuildGridNegativeLineNumberPositions(
                             layout_grid, rows, row_gap, kForRows, scale));
diff --git a/third_party/blink/renderer/core/layout/layout_video.cc b/third_party/blink/renderer/core/layout/layout_video.cc
index 53e0582..ee2d9d3f 100644
--- a/third_party/blink/renderer/core/layout/layout_video.cc
+++ b/third_party/blink/renderer/core/layout/layout_video.cc
@@ -32,8 +32,14 @@
 
 namespace blink {
 
+namespace {
+
+const float kInitEffectZoom = 1.0f;
+
+}  // namespace
+
 LayoutVideo::LayoutVideo(HTMLVideoElement* video) : LayoutMedia(video) {
-  SetIntrinsicSize(CalculateIntrinsicSize());
+  SetIntrinsicSize(CalculateIntrinsicSize(kInitEffectZoom));
 }
 
 LayoutVideo::~LayoutVideo() = default;
@@ -49,8 +55,7 @@
 }
 
 void LayoutVideo::UpdateIntrinsicSize(bool is_in_layout) {
-  LayoutSize size = CalculateIntrinsicSize();
-  size.Scale(StyleRef().EffectiveZoom());
+  LayoutSize size = CalculateIntrinsicSize(StyleRef().EffectiveZoom());
 
   // Never set the element size to zero when in a media document.
   if (size.IsEmpty() && GetNode()->ownerDocument() &&
@@ -68,13 +73,16 @@
   }
 }
 
-LayoutSize LayoutVideo::CalculateIntrinsicSize() {
+LayoutSize LayoutVideo::CalculateIntrinsicSize(float scale) {
   HTMLVideoElement* video = VideoElement();
   DCHECK(video);
 
   if (RuntimeEnabledFeatures::ExperimentalProductivityFeaturesEnabled()) {
-    if (video->IsDefaultIntrinsicSize())
-      return DefaultSize();
+    if (video->IsDefaultIntrinsicSize()) {
+      LayoutSize size = DefaultSize();
+      size.Scale(scale);
+      return size;
+    }
   }
 
   // Spec text from 4.8.6
@@ -92,15 +100,20 @@
   if (web_media_player &&
       video->getReadyState() >= HTMLVideoElement::kHaveMetadata) {
     IntSize size(web_media_player->NaturalSize());
-    if (!size.IsEmpty())
-      return LayoutSize(size);
+    if (!size.IsEmpty()) {
+      LayoutSize layoutSize = LayoutSize(size);
+      layoutSize.Scale(scale);
+      return layoutSize;
+    }
   }
 
   if (video->IsShowPosterFlagSet() && !cached_image_size_.IsEmpty() &&
       !ImageResource()->ErrorOccurred())
     return cached_image_size_;
 
-  return DefaultSize();
+  LayoutSize size = DefaultSize();
+  size.Scale(scale);
+  return size;
 }
 
 void LayoutVideo::ImageChanged(WrappedImagePtr new_image,
diff --git a/third_party/blink/renderer/core/layout/layout_video.h b/third_party/blink/renderer/core/layout/layout_video.h
index 9d1b0bb..bf28cb53 100644
--- a/third_party/blink/renderer/core/layout/layout_video.h
+++ b/third_party/blink/renderer/core/layout/layout_video.h
@@ -58,7 +58,7 @@
  private:
   void UpdateFromElement() override;
 
-  LayoutSize CalculateIntrinsicSize();
+  LayoutSize CalculateIntrinsicSize(float scale);
   void UpdateIntrinsicSize(bool is_in_layout);
 
   void ImageChanged(WrappedImagePtr, CanDeferInvalidation) override;
diff --git a/third_party/blink/renderer/core/layout/layout_video_test.cc b/third_party/blink/renderer/core/layout/layout_video_test.cc
new file mode 100644
index 0000000..9033efc2
--- /dev/null
+++ b/third_party/blink/renderer/core/layout/layout_video_test.cc
@@ -0,0 +1,68 @@
+// 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 "third_party/blink/renderer/core/layout/layout_video.h"
+
+#include "third_party/blink/renderer/core/layout/layout_image.h"
+#include "third_party/blink/renderer/core/loader/resource/image_resource_content.h"
+#include "third_party/blink/renderer/core/testing/core_unit_test_helper.h"
+#include "third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h"
+#include "third_party/skia/include/core/SkImage.h"
+#include "third_party/skia/include/core/SkSurface.h"
+
+namespace blink {
+
+class LayoutVideoTest : public RenderingTest {
+ public:
+  void CreateAndSetImage(const char* id, int width, int height) {
+    // Create one image with size(width, height)
+    sk_sp<SkColorSpace> src_rgb_color_space = SkColorSpace::MakeSRGB();
+    SkImageInfo raster_image_info =
+        SkImageInfo::MakeN32Premul(width, height, src_rgb_color_space);
+    sk_sp<SkSurface> surface(SkSurface::MakeRaster(raster_image_info));
+    sk_sp<SkImage> image = surface->makeImageSnapshot();
+    ImageResourceContent* image_content = ImageResourceContent::CreateLoaded(
+        UnacceleratedStaticBitmapImage::Create(image).get());
+
+    // Set image to video
+    auto* layout_image = (LayoutImage*)GetLayoutObjectByElementId(id);
+    layout_image->ImageResource()->SetImageResource(image_content);
+  }
+};
+
+TEST_F(LayoutVideoTest, PosterSizeWithNormal) {
+  SetBodyInnerHTML(R"HTML(
+    <style>
+      video {zoom:1}
+    </style>
+    <video id='video' />
+  )HTML");
+
+  CreateAndSetImage("video", 10, 10);
+  UpdateAllLifecyclePhasesForTest();
+
+  int width = ((LayoutBox*)GetLayoutObjectByElementId("video"))
+                  ->AbsoluteBoundingBoxRect()
+                  .Width();
+  EXPECT_EQ(width, 10);
+}
+
+TEST_F(LayoutVideoTest, PosterSizeWithZoom) {
+  SetBodyInnerHTML(R"HTML(
+    <style>
+      video {zoom:1.5}
+    </style>
+    <video id='video' />
+  )HTML");
+
+  CreateAndSetImage("video", 10, 10);
+  UpdateAllLifecyclePhasesForTest();
+
+  int width = ((LayoutBox*)GetLayoutObjectByElementId("video"))
+                  ->AbsoluteBoundingBoxRect()
+                  .Width();
+  EXPECT_EQ(width, 15);
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
index 9e59e6cb..53f687c9 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
@@ -270,7 +270,7 @@
 
   scoped_refptr<const NGLayoutResult> result;
   scoped_refptr<const NGLayoutResult> previous_result;
-  LayoutUnit block_offset = legend_margins.block_start;
+  LayoutUnit block_offset;
   do {
     auto legend_space = CreateConstraintSpaceForLegend(
         legend, ChildAvailableSize(), percentage_size, block_offset);
@@ -296,19 +296,20 @@
 
     // We have already adjusted the legend block offset, no need to adjust
     // again.
-    if (block_offset != legend_margins.block_start) {
+    if (block_offset != LayoutUnit()) {
       // If adjusting the block_offset caused the legend to break, revert back
       // to the previous result.
       if (legend_broke_) {
         result = std::move(previous_result);
-        block_offset = legend_margins.block_start;
+        block_offset = LayoutUnit();
       }
       break;
     }
 
-    LayoutUnit legend_margin_box_block_size =
-        legend_margins.block_start +
+    LayoutUnit legend_border_box_block_size =
         NGFragment(writing_mode_, physical_fragment).BlockSize();
+    LayoutUnit legend_margin_box_block_size =
+        legend_margins.block_start + legend_border_box_block_size;
 
     LayoutUnit block_end_margin = legend_margins.block_end;
     if (ConstraintSpace().HasKnownFragmentainerBlockSize()) {
@@ -317,18 +318,16 @@
     }
     legend_margin_box_block_size += block_end_margin;
 
-    LayoutUnit space_left = borders_.block_start - legend_margin_box_block_size;
-
+    LayoutUnit space_left = borders_.block_start - legend_border_box_block_size;
     if (space_left > LayoutUnit()) {
       // Don't adjust the block-start offset of the legend if the legend broke.
       if (legend_break_token || legend_broke_)
         break;
 
-      // If the border is the larger one, though, it will stay put at the
-      // border-box block-start edge of the fieldset. Then it's the legend
-      // that needs to be pushed. We'll center the margin box in this case, to
-      // make sure that both margins remain within the area occupied by the
-      // border also after adjustment.
+      // https://html.spec.whatwg.org/C/#the-fieldset-and-legend-elements
+      // * The element is expected to be positioned in the block-flow direction
+      //   such that its border box is centered over the border on the
+      //   block-start side of the fieldset element.
       block_offset += space_left / 2;
       if (ConstraintSpace().HasBlockFragmentation()) {
         // Save the previous result in case adjusting the block_offset causes
@@ -336,23 +335,28 @@
         previous_result = std::move(result);
         continue;
       }
-    } else {
-      // If the border is smaller, intrinsic_block_size_ should now be based on
-      // the size of the legend instead of the border.
-      intrinsic_block_size_ = legend_margin_box_block_size;
+    }
+    // If the border is smaller than the block end offset of the legend margin
+    // box, intrinsic_block_size_ should now be based on the the block end
+    // offset of the legend margin box instead of the border.
+    LayoutUnit legend_margin_end_offset = block_offset +
+                                          legend_margin_box_block_size -
+                                          legend_margins.block_start;
+    if (legend_margin_end_offset > borders_.block_start) {
+      intrinsic_block_size_ = legend_margin_end_offset;
 
       is_legend_past_border_ = true;
 
       // Don't adjust the block-start offset of the fragment border if it broke.
       if (BreakToken() || (ConstraintSpace().HasKnownFragmentainerBlockSize() &&
-                           legend_margin_box_block_size >
+                           legend_margin_end_offset >
                                ConstraintSpace().FragmentainerBlockSize()))
         break;
       // If the legend is larger than the width of the fieldset block-start
       // border, the actual padding edge of the fieldset will be moved
       // accordingly. This will be the block-start offset for the fieldset
       // contents anonymous box.
-      borders_.block_start = legend_margin_box_block_size;
+      borders_.block_start = legend_margin_end_offset;
     }
     break;
   } while (true);
@@ -368,9 +372,6 @@
       NGFragment(writing_mode_, result->PhysicalFragment()).InlineSize(),
       legend_margins, Style(), BorderScrollbarPadding().inline_start,
       ChildAvailableSize().inline_size);
-
-  // NOTE: For painting purposes, this must be kept in sync with:
-  // NGFieldsetPainter::PaintFieldsetDecorationBackground
   LogicalOffset legend_offset = {legend_inline_start, block_offset};
 
   container_builder_.AddResult(*result, legend_offset);
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc
index 2c7acd7..3937652a 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc
@@ -156,7 +156,7 @@
   String expectation = R"DUMP(.:: LayoutNG Physical Fragment Tree ::.
   offset:unplaced size:1000x200
     offset:0,0 size:200x200
-      offset:50,10 size:10x10
+      offset:50,15 size:10x10
       offset:40,40 size:120x120
         offset:10,10 size:100x100
 )DUMP";
@@ -180,10 +180,10 @@
 
   String dump = DumpFragmentTree(GetElementById("container"));
   String expectation = R"DUMP(.:: LayoutNG Physical Fragment Tree ::.
-  offset:unplaced size:1000x203
-    offset:0,0 size:126x203
-      offset:43,10 size:10x50
-      offset:3,80 size:120x120
+  offset:unplaced size:1000x193
+    offset:0,0 size:126x193
+      offset:43,0 size:10x50
+      offset:3,70 size:120x120
         offset:10,10 size:100x100
 )DUMP";
   EXPECT_EQ(expectation, dump);
@@ -207,9 +207,9 @@
   String dump = DumpFragmentTree(GetElementById("container"));
   String expectation = R"DUMP(.:: LayoutNG Physical Fragment Tree ::.
   offset:unplaced size:1000x126
-    offset:0,0 size:178x126
-      offset:30,23 size:10x50
-      offset:55,3 size:120x120
+    offset:0,0 size:148x126
+      offset:0,23 size:10x50
+      offset:25,3 size:120x120
         offset:10,10 size:100x100
 )DUMP";
   EXPECT_EQ(expectation, dump);
@@ -233,7 +233,7 @@
   String dump = DumpFragmentTree(GetElementById("container"));
   String expectation = R"DUMP(.:: LayoutNG Physical Fragment Tree ::.
   offset:unplaced size:1000x126
-    offset:0,0 size:178x126
+    offset:0,0 size:163x126
       offset:153,23 size:10x50
       offset:3,3 size:120x120
         offset:10,10 size:100x100
@@ -1530,7 +1530,7 @@
     <div id="container">
       <div style="width:20px; height:90px;"></div>
       <fieldset id="fieldset">
-        <legend id="legend" style="break-before:avoid;"></legend>
+        <legend id="legend" style="break-before:avoid; break-inside:avoid"></legend>
       </fieldset>
     </div>
   )HTML");
@@ -1560,10 +1560,10 @@
 
   dump = DumpFragmentTree(fragment.get());
   expectation = R"DUMP(.:: LayoutNG Physical Fragment Tree ::.
-  offset:unplaced size:1000x55
-    offset:0,0 size:120x55
-      offset:20,10 size:10x25
-      offset:10,45 size:100x0
+  offset:unplaced size:1000x45
+    offset:0,0 size:120x45
+      offset:20,0 size:10x25
+      offset:10,35 size:100x0
 )DUMP";
   EXPECT_EQ(expectation, dump);
 }
@@ -1677,58 +1677,6 @@
   EXPECT_EQ(expectation, dump);
 }
 
-TEST_F(NGFieldsetLayoutAlgorithmTest, MarginTopPastEndOfFragmentainer) {
-  // A block whose border box would start past the end of the current
-  // fragmentainer should start exactly at the start of the next fragmentainer,
-  // discarding what's left of the margin.
-  // https://www.w3.org/TR/css-break-3/#break-margins
-  SetBodyInnerHTML(R"HTML(
-    <style>
-      #fieldset {
-        border:none; margin:0; padding:0px; width: 100px; height: 100px;
-      }
-      #legend {
-        padding:0px; margin:0px;
-      }
-    </style>
-     <fieldset id="fieldset">
-      <legend id="legend" style="margin-top:60px; width:10px; height:20px;"></legend>
-      <div style="width:20px; height:20px;"></div>
-    </fieldset>
-  )HTML");
-
-  LayoutUnit kFragmentainerSpaceAvailable(50);
-
-  NGBlockNode node(ToLayoutBox(GetLayoutObjectByElementId("fieldset")));
-  NGConstraintSpace space = ConstructBlockLayoutTestConstraintSpace(
-      WritingMode::kHorizontalTb, TextDirection::kLtr,
-      LogicalSize(LayoutUnit(1000), kIndefiniteSize), false,
-      node.CreatesNewFormattingContext(), kFragmentainerSpaceAvailable);
-
-  scoped_refptr<const NGPhysicalBoxFragment> fragment =
-      NGBaseLayoutAlgorithmTest::RunFieldsetLayoutAlgorithm(node, space);
-  ASSERT_TRUE(fragment->BreakToken());
-
-  String dump = DumpFragmentTree(fragment.get());
-  String expectation = R"DUMP(.:: LayoutNG Physical Fragment Tree ::.
-  offset:unplaced size:100x50
-)DUMP";
-  EXPECT_EQ(expectation, dump);
-
-  fragment = NGBaseLayoutAlgorithmTest::RunFieldsetLayoutAlgorithm(
-      node, space, fragment->BreakToken());
-  ASSERT_FALSE(fragment->BreakToken());
-
-  dump = DumpFragmentTree(fragment.get());
-  expectation = R"DUMP(.:: LayoutNG Physical Fragment Tree ::.
-  offset:unplaced size:100x50
-    offset:0,0 size:10x20
-    offset:0,20 size:100x30
-      offset:0,0 size:20x20
-)DUMP";
-  EXPECT_EQ(expectation, dump);
-}
-
 TEST_F(NGFieldsetLayoutAlgorithmTest, MarginBottomPastEndOfFragmentainer) {
   // A block whose border box would start past the end of the current
   // fragmentainer should start exactly at the start of the next fragmentainer,
@@ -1982,7 +1930,7 @@
   String dump = DumpFragmentTree(fragment.get());
   String expectation = R"DUMP(.:: LayoutNG Physical Fragment Tree ::.
   offset:unplaced size:220x60
-    offset:60,16 size:10x5
+    offset:60,27.5 size:10x5
 )DUMP";
   EXPECT_EQ(expectation, dump);
 
diff --git a/third_party/blink/renderer/core/paint/ng/ng_fieldset_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_fieldset_painter.cc
index c23d9e82..7a5b6be 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_fieldset_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_fieldset_painter.cc
@@ -5,9 +5,8 @@
 #include "third_party/blink/renderer/core/paint/ng/ng_fieldset_painter.h"
 
 #include "third_party/blink/renderer/core/layout/layout_box.h"
-#include "third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.h"
-#include "third_party/blink/renderer/core/layout/ng/ng_length_utils.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h"
+#include "third_party/blink/renderer/core/layout/ng/ng_relative_utils.h"
 #include "third_party/blink/renderer/core/paint/background_image_geometry.h"
 #include "third_party/blink/renderer/core/paint/box_decoration_data.h"
 #include "third_party/blink/renderer/core/paint/fieldset_paint_info.h"
@@ -58,8 +57,7 @@
   PhysicalRect legend_border_box;
   if (legend) {
     legend_border_box.size = (*legend)->Size();
-
-    // Recalculate the legend offset without the relative position offset.
+    // Unapply relative position of the legend.
     // Note that legend->Offset() is the offset after applying
     // position:relative, but the fieldset border painting needs to avoid
     // the legend position with static position.
@@ -69,27 +67,22 @@
     // >   not be painted behind the rectangle defined as follows, using the
     // >   writing mode of the fieldset: ...
     // >    ... at its static position (ignoring transforms), ...
+    //
+    // The following logic produces wrong results for block direction offsets.
+    // However we don't need them.
     const WritingDirectionMode writing_direction = style.GetWritingDirection();
-    const auto writing_mode = writing_direction.GetWritingMode();
-    const NGBoxStrut border_padding =
-        (fragment.Borders() + fragment.Padding())
-            .ConvertToLogical(writing_direction.GetWritingMode(),
-                              writing_direction.Direction());
-    const LayoutUnit fieldset_content_inline_size =
-        fieldset_size.ConvertToLogical(writing_mode).inline_size -
-        border_padding.InlineSum();
-    const NGBoxStrut legend_margins = ComputeMarginsFor(
-        (*legend)->Style(), fieldset_content_inline_size.ClampNegativeToZero(),
-        writing_direction.GetWritingMode(), writing_direction.Direction());
-
-    const LogicalOffset offset = {
-        NGFieldsetLayoutAlgorithm::ComputeLegendInlineOffset(
-            (*legend)->Style(),
-            legend_border_box.size.ConvertToLogical(writing_mode).inline_size,
-            legend_margins, style, border_padding.inline_start,
-            fieldset_content_inline_size),
-        legend_margins.block_start};
-    legend_border_box.offset = offset.ConvertToPhysical(
+    const LogicalSize logical_fieldset_content_size =
+        (fieldset_size - PhysicalSize(fieldset_borders.Size()) -
+         PhysicalSize(fragment.Padding().HorizontalSum(),
+                      fragment.Padding().VerticalSum()))
+            .ConvertToLogical(writing_direction.GetWritingMode());
+    LogicalOffset relative_offset = ComputeRelativeOffset(
+        (*legend)->Style(), writing_direction, logical_fieldset_content_size);
+    LogicalOffset legend_logical_offset =
+        legend->Offset().ConvertToLogical(writing_direction, fieldset_size,
+                                          (*legend)->Size()) -
+        relative_offset;
+    legend_border_box.offset = legend_logical_offset.ConvertToPhysical(
         writing_direction, fieldset_size, legend_border_box.size);
   }
   FieldsetPaintInfo fieldset_paint_info(style, fieldset_size, fieldset_borders,
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
index 3cee553..e4d4a23da 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -3242,6 +3242,15 @@
 }
 
 void AXNodeObject::AddPopupChildren() {
+  if (!AXObjectCache().UseAXMenuList()) {
+    auto* html_select_element = DynamicTo<HTMLSelectElement>(GetNode());
+    if (!html_select_element || !html_select_element->UsesMenuList())
+      return;
+    if (AXObject* ax_popup = html_select_element->PopupRootAXObject())
+      children_.push_back(ax_popup);
+    return;
+  }
+
   auto* html_input_element = DynamicTo<HTMLInputElement>(GetNode());
   if (!html_input_element)
     return;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
index 4571826..8ff24b4 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -148,6 +148,7 @@
     AddPermissionStatusListener();
   documents_.insert(&document);
   relation_cache_->Init();
+  use_ax_menu_list_ = GetSettings()->GetUseAXMenuList();
 }
 
 AXObjectCacheImpl::~AXObjectCacheImpl() {
@@ -446,9 +447,12 @@
   if (layout_object->IsBoxModelObject()) {
     LayoutBoxModelObject* css_box = ToLayoutBoxModelObject(layout_object);
     if (auto* select_element = DynamicTo<HTMLSelectElement>(node)) {
-      if (select_element->UsesMenuList())
-        return MakeGarbageCollected<AXMenuList>(css_box, *this);
-      return MakeGarbageCollected<AXListBox>(css_box, *this);
+      if (select_element->UsesMenuList()) {
+        if (use_ax_menu_list_)
+          return MakeGarbageCollected<AXMenuList>(css_box, *this);
+      } else {
+        return MakeGarbageCollected<AXListBox>(css_box, *this);
+      }
     }
 
     // progress bar
@@ -466,7 +470,7 @@
 }
 
 AXObject* AXObjectCacheImpl::CreateFromNode(Node* node) {
-  if (IsMenuListOption(node)) {
+  if (IsMenuListOption(node) && use_ax_menu_list_) {
     return MakeGarbageCollected<AXMenuListOption>(To<HTMLOptionElement>(node),
                                                   *this);
   }
@@ -630,6 +634,7 @@
       obj = MakeGarbageCollected<AXSliderThumb>(*this);
       break;
     case ax::mojom::Role::kMenuListPopup:
+      DCHECK(use_ax_menu_list_);
       obj = MakeGarbageCollected<AXMenuListPopup>(*this);
       break;
     default:
@@ -2050,6 +2055,11 @@
 
 void AXObjectCacheImpl::HandleUpdateActiveMenuOption(LayoutObject* menu_list,
                                                      int option_index) {
+  if (!use_ax_menu_list_) {
+    MarkAXObjectDirty(Get(menu_list), false);
+    return;
+  }
+
   auto* ax_object = DynamicTo<AXMenuList>(Get(menu_list));
   if (!ax_object)
     return;
@@ -2060,6 +2070,11 @@
 }
 
 void AXObjectCacheImpl::DidShowMenuListPopup(LayoutObject* menu_list) {
+  if (!use_ax_menu_list_) {
+    MarkAXObjectDirty(Get(menu_list), false);
+    return;
+  }
+
   SCOPED_DISALLOW_LIFECYCLE_TRANSITION(menu_list->GetDocument());
 
   auto* ax_object = DynamicTo<AXMenuList>(Get(menu_list));
@@ -2068,6 +2083,11 @@
 }
 
 void AXObjectCacheImpl::DidHideMenuListPopup(LayoutObject* menu_list) {
+  if (!use_ax_menu_list_) {
+    MarkAXObjectDirty(Get(menu_list), false);
+    return;
+  }
+
   SCOPED_DISALLOW_LIFECYCLE_TRANSITION(menu_list->GetDocument());
 
   auto* ax_object = DynamicTo<AXMenuList>(Get(menu_list));
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
index 250e783c..f32be2a 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -282,6 +282,8 @@
 
   AXObject* GetActiveAriaModalDialog() const;
 
+  bool UseAXMenuList() { return use_ax_menu_list_; }
+
  protected:
   void PostPlatformNotification(
       AXObject* obj,
@@ -497,6 +499,10 @@
   // A set of currently active event intents.
   BlinkAXEventIntentsSet active_event_intents_;
 
+  // If false, exposes the internal accessibility tree of a select pop-up
+  // instead.
+  bool use_ax_menu_list_ = true;
+
   DISALLOW_COPY_AND_ASSIGN(AXObjectCacheImpl);
 
   FRIEND_TEST_ALL_PREFIXES(AccessibilityTest, PauseUpdatesAfterMaxNumberQueued);
diff --git a/third_party/blink/renderer/modules/modules_idl_files.gni b/third_party/blink/renderer/modules/modules_idl_files.gni
index 7544f66..038765a9 100644
--- a/third_party/blink/renderer/modules/modules_idl_files.gni
+++ b/third_party/blink/renderer/modules/modules_idl_files.gni
@@ -42,6 +42,10 @@
 #     # Similar to |modules_dependency_idl_files| but limited to things that are
 #     # exposed only for testing.
 #   ]
+#
+#   modules_typedefs_enums_only_idl_files = [
+#     # IDL files that only have typedefs/enums.
+#   ]
 _idl_imports = [
   "//third_party/blink/renderer/modules/accessibility/idls.gni",
   "//third_party/blink/renderer/modules/animationworklet/idls.gni",
@@ -144,6 +148,7 @@
 modules_dictionary_idl_files = []
 modules_dependency_idl_files = []
 modules_testing_dependency_idl_files = []
+modules_typedefs_enums_only_idl_files = []
 
 foreach(idl_import, _idl_imports) {
   # Avoid reassignment error by assigning to empty scope first.
@@ -191,6 +196,15 @@
                         gni_dir),
             "abspath")
   }
+
+  if (defined(_imported.modules_typedefs_enums_only_idl_files)) {
+    modules_typedefs_enums_only_idl_files +=
+        get_path_info(
+            rebase_path(_imported.modules_typedefs_enums_only_idl_files,
+                        ".",
+                        gni_dir),
+            "abspath")
+  }
 }
 
 bindings_modules_output_dir = "$bindings_output_dir/modules"
@@ -245,7 +259,8 @@
 modules_definition_idl_files = modules_dictionary_idl_files + modules_idl_files
 
 # Static IDL files
-modules_static_interface_idl_files = modules_callback_function_idl_files
+modules_static_interface_idl_files =
+    modules_callback_function_idl_files + modules_typedefs_enums_only_idl_files
 
 modules_static_dependency_idl_files =
     modules_dependency_idl_files + modules_testing_dependency_idl_files
diff --git a/third_party/blink/renderer/modules/webgpu/gpu.cc b/third_party/blink/renderer/modules/webgpu/gpu.cc
index 39b88fc..0df4a21f 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu.cc
@@ -121,7 +121,8 @@
   // For now we choose kHighPerformance by default.
   gpu::webgpu::PowerPreference power_preference =
       gpu::webgpu::PowerPreference::kHighPerformance;
-  if (options->powerPreference() == "low-power") {
+  if (options->hasPowerPreference() &&
+      options->powerPreference() == "low-power") {
     power_preference = gpu::webgpu::PowerPreference::kLowPower;
   }
 
diff --git a/third_party/blink/renderer/modules/xr/BUILD.gn b/third_party/blink/renderer/modules/xr/BUILD.gn
index 34249e8c..e6144d5 100644
--- a/third_party/blink/renderer/modules/xr/BUILD.gn
+++ b/third_party/blink/renderer/modules/xr/BUILD.gn
@@ -96,6 +96,7 @@
     "xr_webgl_binding.h",
     "xr_webgl_layer.cc",
     "xr_webgl_layer.h",
+    "xr_webgl_rendering_context.h",
     "xr_world_information.cc",
     "xr_world_information.h",
     "xr_world_tracking_state.cc",
diff --git a/third_party/blink/renderer/modules/xr/idls.gni b/third_party/blink/renderer/modules/xr/idls.gni
index 3d1876b4..b2be61a 100644
--- a/third_party/blink/renderer/modules/xr/idls.gni
+++ b/third_party/blink/renderer/modules/xr/idls.gni
@@ -2,6 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//third_party/blink/renderer/config.gni")
+
 modules_idl_files = [
   "xr_anchor.idl",
   "xr_anchor_set.idl",
@@ -59,6 +61,16 @@
   "xr_world_tracking_state_init.idl",
 ]
 
+modules_typedefs_enums_only_idl_files = []
+
+# WebGL2 Compute
+if (support_webgl2_compute_context) {
+  modules_typedefs_enums_only_idl_files +=
+      [ "xr_webgl_context_support_webgl2_compute.idl" ]
+} else {
+  modules_typedefs_enums_only_idl_files += [ "xr_webgl_context.idl" ]
+}
+
 modules_dependency_idl_files = [
   "element_xr.idl",
   "navigator_xr.idl",
diff --git a/third_party/blink/renderer/modules/xr/xr_utils.cc b/third_party/blink/renderer/modules/xr/xr_utils.cc
index cb27d77..48d61cb 100644
--- a/third_party/blink/renderer/modules/xr/xr_utils.cc
+++ b/third_party/blink/renderer/modules/xr/xr_utils.cc
@@ -6,10 +6,11 @@
 
 #include <cmath>
 
-#include "third_party/blink/renderer/bindings/modules/v8/webgl_rendering_context_or_webgl2_rendering_context.h"
 #include "third_party/blink/renderer/core/geometry/dom_point_read_only.h"
+#include "third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context.h"
 #include "third_party/blink/renderer/modules/webgl/webgl2_rendering_context.h"
 #include "third_party/blink/renderer/modules/webgl/webgl_rendering_context.h"
+#include "third_party/blink/renderer/modules/xr/xr_webgl_rendering_context.h"
 #include "third_party/blink/renderer/platform/transforms/transformation_matrix.h"
 
 namespace blink {
@@ -67,7 +68,12 @@
 }
 
 WebGLRenderingContextBase* webglRenderingContextBaseFromUnion(
-    const WebGLRenderingContextOrWebGL2RenderingContext& context) {
+    const XRWebGLRenderingContext& context) {
+#if defined(SUPPORT_WEBGL2_COMPUTE_CONTEXT)
+  if (context.IsWebGL2ComputeRenderingContext()) {
+    return context.GetAsWebGL2ComputeRenderingContext();
+  }
+#endif
   if (context.IsWebGL2RenderingContext()) {
     return context.GetAsWebGL2RenderingContext();
   } else {
diff --git a/third_party/blink/renderer/modules/xr/xr_utils.h b/third_party/blink/renderer/modules/xr/xr_utils.h
index c4da10a..1962309 100644
--- a/third_party/blink/renderer/modules/xr/xr_utils.h
+++ b/third_party/blink/renderer/modules/xr/xr_utils.h
@@ -6,8 +6,8 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_UTILS_H_
 
 #include "device/vr/public/mojom/pose.h"
-#include "third_party/blink/renderer/bindings/modules/v8/webgl_rendering_context_or_webgl2_rendering_context.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_typed_array.h"
+#include "third_party/blink/renderer/modules/xr/xr_webgl_rendering_context.h"
 #include "third_party/blink/renderer/platform/wtf/forward.h"
 
 namespace blink {
@@ -29,7 +29,7 @@
                                            double w);
 
 WebGLRenderingContextBase* webglRenderingContextBaseFromUnion(
-    const WebGLRenderingContextOrWebGL2RenderingContext&);
+    const XRWebGLRenderingContext&);
 
 constexpr char kUnableToNormalizeZeroLength[] =
     "Unable to normalize vector of length 0.";
diff --git a/third_party/blink/renderer/modules/xr/xr_webgl_binding.cc b/third_party/blink/renderer/modules/xr/xr_webgl_binding.cc
index 3b40e642..5e9c4e8 100644
--- a/third_party/blink/renderer/modules/xr/xr_webgl_binding.cc
+++ b/third_party/blink/renderer/modules/xr/xr_webgl_binding.cc
@@ -15,15 +15,15 @@
 #include "third_party/blink/renderer/modules/xr/xr_utils.h"
 #include "third_party/blink/renderer/modules/xr/xr_viewer_pose.h"
 #include "third_party/blink/renderer/modules/xr/xr_webgl_layer.h"
+#include "third_party/blink/renderer/modules/xr/xr_webgl_rendering_context.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/graphics/gpu/extensions_3d_util.h"
 
 namespace blink {
 
-XRWebGLBinding* XRWebGLBinding::Create(
-    XRSession* session,
-    const WebGLRenderingContextOrWebGL2RenderingContext& context,
-    ExceptionState& exception_state) {
+XRWebGLBinding* XRWebGLBinding::Create(XRSession* session,
+                                       const XRWebGLRenderingContext& context,
+                                       ExceptionState& exception_state) {
   if (session->ended()) {
     exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
                                       "Cannot create an XRWebGLBinding for an "
diff --git a/third_party/blink/renderer/modules/xr/xr_webgl_binding.h b/third_party/blink/renderer/modules/xr/xr_webgl_binding.h
index 9062c0a..a135e4b 100644
--- a/third_party/blink/renderer/modules/xr/xr_webgl_binding.h
+++ b/third_party/blink/renderer/modules/xr/xr_webgl_binding.h
@@ -5,9 +5,10 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_WEBGL_BINDING_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_WEBGL_BINDING_H_
 
-#include "third_party/blink/renderer/bindings/modules/v8/webgl_rendering_context_or_webgl2_rendering_context.h"
+#include "third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context.h"
 #include "third_party/blink/renderer/modules/webgl/webgl2_rendering_context.h"
 #include "third_party/blink/renderer/modules/webgl/webgl_rendering_context.h"
+#include "third_party/blink/renderer/modules/xr/xr_webgl_rendering_context.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 
 namespace blink {
@@ -27,10 +28,9 @@
   XRWebGLBinding(XRSession*, WebGLRenderingContextBase*, bool webgl2);
   ~XRWebGLBinding() override = default;
 
-  static XRWebGLBinding* Create(
-      XRSession*,
-      const WebGLRenderingContextOrWebGL2RenderingContext&,
-      ExceptionState&);
+  static XRWebGLBinding* Create(XRSession*,
+                                const XRWebGLRenderingContext&,
+                                ExceptionState&);
 
   XRSession* session() const { return session_; }
 
diff --git a/third_party/blink/renderer/modules/xr/xr_webgl_context.idl b/third_party/blink/renderer/modules/xr/xr_webgl_context.idl
new file mode 100644
index 0000000..3c5dcad8
--- /dev/null
+++ b/third_party/blink/renderer/modules/xr/xr_webgl_context.idl
@@ -0,0 +1,6 @@
+// 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.
+
+// https://immersive-web.github.io/webxr/#typedefdef-xrwebglrenderingcontext
+typedef (WebGLRenderingContext or WebGL2RenderingContext) XRWebGLRenderingContext;
diff --git a/third_party/blink/renderer/modules/xr/xr_webgl_context_support_webgl2_compute.idl b/third_party/blink/renderer/modules/xr/xr_webgl_context_support_webgl2_compute.idl
new file mode 100644
index 0000000..0aede13
--- /dev/null
+++ b/third_party/blink/renderer/modules/xr/xr_webgl_context_support_webgl2_compute.idl
@@ -0,0 +1,11 @@
+// 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.
+
+// This is an extension to XRWebGLRenderingContext which enables the use of
+// WebGL2ComputeRenderingContext if it is available. The WebGL 2.0 Compute spec
+// can be found at https://www.khronos.org/registry/webgl/specs/latest/2.0-compute/
+// https://immersive-web.github.io/webxr/#typedefdef-xrwebglrenderingcontext
+typedef (WebGLRenderingContext or
+         WebGL2RenderingContext or
+         WebGL2ComputeRenderingContext) XRWebGLRenderingContext;
diff --git a/third_party/blink/renderer/modules/xr/xr_webgl_layer.cc b/third_party/blink/renderer/modules/xr/xr_webgl_layer.cc
index 849a404f..91601c7d 100644
--- a/third_party/blink/renderer/modules/xr/xr_webgl_layer.cc
+++ b/third_party/blink/renderer/modules/xr/xr_webgl_layer.cc
@@ -16,6 +16,7 @@
 #include "third_party/blink/renderer/modules/xr/xr_utils.h"
 #include "third_party/blink/renderer/modules/xr/xr_view.h"
 #include "third_party/blink/renderer/modules/xr/xr_viewport.h"
+#include "third_party/blink/renderer/modules/xr/xr_webgl_rendering_context.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/geometry/double_size.h"
 #include "third_party/blink/renderer/platform/geometry/float_point.h"
@@ -35,11 +36,10 @@
 
 }  // namespace
 
-XRWebGLLayer* XRWebGLLayer::Create(
-    XRSession* session,
-    const WebGLRenderingContextOrWebGL2RenderingContext& context,
-    const XRWebGLLayerInit* initializer,
-    ExceptionState& exception_state) {
+XRWebGLLayer* XRWebGLLayer::Create(XRSession* session,
+                                   const XRWebGLRenderingContext& context,
+                                   const XRWebGLLayerInit* initializer,
+                                   ExceptionState& exception_state) {
   if (session->ended()) {
     exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
                                       "Cannot create an XRWebGLLayer for an "
diff --git a/third_party/blink/renderer/modules/xr/xr_webgl_layer.h b/third_party/blink/renderer/modules/xr/xr_webgl_layer.h
index 8731621..b9de57d 100644
--- a/third_party/blink/renderer/modules/xr/xr_webgl_layer.h
+++ b/third_party/blink/renderer/modules/xr/xr_webgl_layer.h
@@ -6,11 +6,13 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_WEBGL_LAYER_H_
 
 #include "third_party/blink/renderer/bindings/modules/v8/v8_xr_webgl_layer_init.h"
-#include "third_party/blink/renderer/bindings/modules/v8/webgl_rendering_context_or_webgl2_rendering_context.h"
+#include "third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context.h"
 #include "third_party/blink/renderer/modules/webgl/webgl2_rendering_context.h"
 #include "third_party/blink/renderer/modules/webgl/webgl_rendering_context.h"
 #include "third_party/blink/renderer/modules/xr/xr_layer.h"
+#include "third_party/blink/renderer/modules/xr/xr_utils.h"
 #include "third_party/blink/renderer/modules/xr/xr_view.h"
+#include "third_party/blink/renderer/modules/xr/xr_webgl_rendering_context.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/graphics/gpu/xr_webgl_drawing_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/ref_counted.h"
@@ -40,11 +42,10 @@
                bool ignore_depth_values);
   ~XRWebGLLayer() override;
 
-  static XRWebGLLayer* Create(
-      XRSession*,
-      const WebGLRenderingContextOrWebGL2RenderingContext&,
-      const XRWebGLLayerInit*,
-      ExceptionState&);
+  static XRWebGLLayer* Create(XRSession*,
+                              const XRWebGLRenderingContext&,
+                              const XRWebGLLayerInit*,
+                              ExceptionState&);
 
   WebGLRenderingContextBase* context() const { return webgl_context_; }
 
diff --git a/third_party/blink/renderer/modules/xr/xr_webgl_layer.idl b/third_party/blink/renderer/modules/xr/xr_webgl_layer.idl
index b19379ef..9349e07 100644
--- a/third_party/blink/renderer/modules/xr/xr_webgl_layer.idl
+++ b/third_party/blink/renderer/modules/xr/xr_webgl_layer.idl
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-typedef (WebGLRenderingContext or WebGL2RenderingContext) XRWebGLRenderingContext;
-
 // https://immersive-web.github.io/webxr/#xrwebgllayer-interface
 [
     SecureContext,
diff --git a/third_party/blink/renderer/modules/xr/xr_webgl_rendering_context.h b/third_party/blink/renderer/modules/xr/xr_webgl_rendering_context.h
new file mode 100644
index 0000000..a1a8d88da
--- /dev/null
+++ b/third_party/blink/renderer/modules/xr/xr_webgl_rendering_context.h
@@ -0,0 +1,25 @@
+// 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 THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_WEBGL_RENDERING_CONTEXT_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_WEBGL_RENDERING_CONTEXT_H_
+
+#if defined(SUPPORT_WEBGL2_COMPUTE_CONTEXT)
+#include "third_party/blink/renderer/bindings/modules/v8/webgl_rendering_context_or_webgl2_rendering_context_or_webgl2_compute_rendering_context.h"
+#else
+#include "third_party/blink/renderer/bindings/modules/v8/webgl_rendering_context_or_webgl2_rendering_context.h"
+#endif
+
+namespace blink {
+
+#if defined(SUPPORT_WEBGL2_COMPUTE_CONTEXT)
+using XRWebGLRenderingContext =
+    WebGLRenderingContextOrWebGL2RenderingContextOrWebGL2ComputeRenderingContext;
+#else
+using XRWebGLRenderingContext = WebGLRenderingContextOrWebGL2RenderingContext;
+#endif
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_XR_XR_WEBGL_RENDERING_CONTEXT_H_
diff --git a/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h b/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h
index b0de242..e91e2e1 100644
--- a/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h
+++ b/third_party/blink/renderer/platform/heap/collection_support/heap_hash_table_backing.h
@@ -174,6 +174,61 @@
 
 namespace WTF {
 
+namespace internal {
+
+// ConcurrentBucket is a wrapper for HashTable buckets for concurrent marking.
+// It is used to provide a snapshot view of the bucket key and guarantee
+// that the same key is used for checking empty/deleted buckets and tracing.
+template <typename T>
+class ConcurrentBucket {
+  using KeyExtractionCallback = void (*)(const T&, void*);
+
+ public:
+  using BucketType = T;
+
+  ConcurrentBucket(const T& t, KeyExtractionCallback extract_key) {
+    extract_key(t, &buf_);
+  }
+
+  // for HashTable that don't use KeyValuePair (i.e. *HashSets), the key
+  // and the value are the same.
+  const T* key() const { return reinterpret_cast<const T*>(&buf_); }
+  const T* value() const { return key(); }
+  const T* bucket() const { return key(); }
+
+ private:
+  // Alignment is needed for atomic accesses to |buf_| and to assure |buf_|
+  // can be accessed the same as objects of type T
+  alignas(std::max(alignof(T), sizeof(size_t))) char buf_[sizeof(T)];
+};
+
+template <typename Key, typename Value>
+class ConcurrentBucket<KeyValuePair<Key, Value>> {
+  using KeyExtractionCallback = void (*)(const KeyValuePair<Key, Value>&,
+                                         void*);
+
+ public:
+  using BucketType = ConcurrentBucket;
+
+  ConcurrentBucket(const KeyValuePair<Key, Value>& pair,
+                   KeyExtractionCallback extract_key)
+      : value_(&pair.value) {
+    extract_key(pair, &buf_);
+  }
+
+  const Key* key() const { return reinterpret_cast<const Key*>(&buf_); }
+  const Value* value() const { return value_; }
+  const ConcurrentBucket* bucket() const { return this; }
+
+ private:
+  // Alignment is needed for atomic accesses to |buf_| and to assure |buf_|
+  // can be accessed the same as objects of type Key
+  alignas(std::max(alignof(Key), sizeof(size_t))) char buf_[sizeof(Key)];
+  const Value* value_;
+};
+
+}  // namespace internal
+
 // This trace method is for tracing a HashTableBacking either through regular
 // tracing (via the relevant TraceTraits) or when finding a HashTableBacking
 // through conservative stack scanning (which will treat all references in the
@@ -182,6 +237,7 @@
 struct TraceHashTableBackingInCollectionTrait {
   using Value = typename Table::ValueType;
   using Traits = typename Table::ValueTraits;
+  using Extractor = typename Table::ExtractorType;
 
   static void Trace(blink::Visitor* visitor, const void* self) {
     static_assert(IsTraceableInCollectionTrait<Traits>::value ||
@@ -199,15 +255,17 @@
       // IsEmptyOrDeletedBucket (check performed on a local copy instead
       // of directly on the bucket).
       if (is_concurrent) {
-        if (!HashTableHelper<Value, typename Table::ExtractorType,
-                             typename Table::KeyTraitsType>::
-                IsEmptyOrDeletedBucketSafe(array[i])) {
-          blink::TraceCollectionIfEnabled<WeakHandling, Value, Traits>::Trace(
-              visitor, &array[i]);
+        internal::ConcurrentBucket<Value> concurrent_bucket(
+            array[i], Extractor::ExtractSafe);
+        if (!HashTableHelper<Value, Extractor, typename Table::KeyTraitsType>::
+                IsEmptyOrDeletedBucketForKey(*concurrent_bucket.key())) {
+          blink::TraceCollectionIfEnabled<
+              WeakHandling,
+              typename internal::ConcurrentBucket<Value>::BucketType,
+              Traits>::Trace(visitor, concurrent_bucket.bucket());
         }
       } else {
-        if (!HashTableHelper<Value, typename Table::ExtractorType,
-                             typename Table::KeyTraitsType>::
+        if (!HashTableHelper<Value, Extractor, typename Table::KeyTraitsType>::
                 IsEmptyOrDeletedBucket(array[i])) {
           blink::TraceCollectionIfEnabled<WeakHandling, Value, Traits>::Trace(
               visitor, &array[i]);
@@ -237,12 +295,15 @@
   }
 };
 
-// Trait for strong treatment of KeyValuePair. This is used to handle regular
-// KVP but also for strongification of otherwise weakly handled KVPs.
-template <typename Key, typename Value, typename Traits>
-struct TraceInCollectionTrait<kNoWeakHandling,
-                              KeyValuePair<Key, Value>,
-                              Traits> {
+// This trace method is for tracing a HashTableBacking either through regular
+// tracing (via the relevant TraceTraits) or when finding a HashTableBacking
+// through conservative stack scanning (which will treat all references in the
+// backing strongly).
+template <WTF::WeakHandlingFlag WeakHandling,
+          typename Key,
+          typename Value,
+          typename Traits>
+struct TraceKeyValuePairInCollectionTrait {
   using EphemeronHelper =
       blink::EphemeronKeyValuePair<Key,
                                    Value,
@@ -250,15 +311,17 @@
                                    typename Traits::ValueTraits>;
 
   static void Trace(blink::Visitor* visitor,
-                    const KeyValuePair<Key, Value>& self) {
-    TraceImpl::Trace(visitor, self);
+                    const Key* key,
+                    const Value* value) {
+    TraceImpl::Trace(visitor, key, value);
   }
 
  private:
   struct TraceImplEphemerons {
     // Strongification of ephemerons, i.e., Weak/Strong and Strong/Weak.
     static void Trace(blink::Visitor* visitor,
-                      const KeyValuePair<Key, Value>& self) {
+                      const Key* key,
+                      const Value* value) {
       // Strongification of ephemerons, i.e., Weak/Strong and Strong/Weak.
       // The helper ensures that helper.key always refers to the weak part and
       // helper.value always refers to the dependent part.
@@ -266,12 +329,16 @@
       // users to override visitation behavior. An example is creating a heap
       // snapshot, where it is useful to annotate values as being kept alive
       // from keys rather than the table.
-      EphemeronHelper helper(&self.key, &self.value);
-      // Strongify the weak part.
-      blink::TraceCollectionIfEnabled<
-          kNoWeakHandling, typename EphemeronHelper::KeyType,
-          typename EphemeronHelper::KeyTraits>::Trace(visitor, helper.key);
-      // Strongify the dependent part.
+      EphemeronHelper helper(key, value);
+      if (WeakHandling == kNoWeakHandling) {
+        // Strongify the weak part.
+        blink::TraceCollectionIfEnabled<
+            kNoWeakHandling, typename EphemeronHelper::KeyType,
+            typename EphemeronHelper::KeyTraits>::Trace(visitor, helper.key);
+      }
+      // The following passes on kNoWeakHandling for tracing value as the value
+      // callback is only invoked to keep value alive iff key is alive,
+      // following ephemeron semantics.
       visitor->TraceEphemeron(
           *helper.key, helper.value,
           blink::TraceCollectionIfEnabled<
@@ -282,15 +349,16 @@
 
   struct TraceImplDefault {
     static void Trace(blink::Visitor* visitor,
-                      const KeyValuePair<Key, Value>& self) {
+                      const Key* key,
+                      const Value* value) {
       // Strongification of non-ephemeron KVP, i.e., Strong/Strong or Weak/Weak.
       // Order does not matter here.
       blink::TraceCollectionIfEnabled<
           kNoWeakHandling, Key, typename Traits::KeyTraits>::Trace(visitor,
-                                                                   &self.key);
+                                                                   key);
       blink::TraceCollectionIfEnabled<
-          kNoWeakHandling, Value,
-          typename Traits::ValueTraits>::Trace(visitor, &self.value);
+          kNoWeakHandling, Value, typename Traits::ValueTraits>::Trace(visitor,
+                                                                       value);
     }
   };
 
@@ -301,14 +369,22 @@
       TraceImplDefault>::type;
 };
 
+// Trait for strong treatment of KeyValuePair. This is used to handle regular
+// KVP but also for strongification of otherwise weakly handled KVPs.
+template <typename Key, typename Value, typename Traits>
+struct TraceInCollectionTrait<kNoWeakHandling,
+                              KeyValuePair<Key, Value>,
+                              Traits> {
+  static void Trace(blink::Visitor* visitor,
+                    const KeyValuePair<Key, Value>& self) {
+    TraceKeyValuePairInCollectionTrait<kNoWeakHandling, Key, Value,
+                                       Traits>::Trace(visitor, &self.key,
+                                                      &self.value);
+  }
+};
+
 template <typename Key, typename Value, typename Traits>
 struct TraceInCollectionTrait<kWeakHandling, KeyValuePair<Key, Value>, Traits> {
-  using EphemeronHelper =
-      blink::EphemeronKeyValuePair<Key,
-                                   Value,
-                                   typename Traits::KeyTraits,
-                                   typename Traits::ValueTraits>;
-
   static bool IsAlive(const blink::LivenessBroker& info,
                       const KeyValuePair<Key, Value>& self) {
     // Needed for Weak/Weak, Strong/Weak (reverse ephemeron), and Weak/Strong
@@ -324,15 +400,37 @@
 
   static void Trace(blink::Visitor* visitor,
                     const KeyValuePair<Key, Value>& self) {
-    EphemeronHelper helper(&self.key, &self.value);
-    // The following passes on kNoWeakHandling for tracing value as the value
-    // callback is only invoked to keep value alive iff key is alive, following
-    // ephemeron semantics.
-    visitor->TraceEphemeron(
-        *helper.key, helper.value,
-        blink::TraceCollectionIfEnabled<
-            kNoWeakHandling, typename EphemeronHelper::ValueType,
-            typename EphemeronHelper::ValueTraits>::Trace);
+    TraceKeyValuePairInCollectionTrait<kWeakHandling, Key, Value,
+                                       Traits>::Trace(visitor, &self.key,
+                                                      &self.value);
+  }
+};
+
+template <typename Key, typename Value, typename Traits>
+struct TraceInCollectionTrait<
+    kNoWeakHandling,
+    internal::ConcurrentBucket<KeyValuePair<Key, Value>>,
+    Traits> {
+  static void Trace(
+      blink::Visitor* visitor,
+      const internal::ConcurrentBucket<KeyValuePair<Key, Value>>& self) {
+    TraceKeyValuePairInCollectionTrait<kNoWeakHandling, Key, Value,
+                                       Traits>::Trace(visitor, self.key(),
+                                                      self.value());
+  }
+};
+
+template <typename Key, typename Value, typename Traits>
+struct TraceInCollectionTrait<
+    kWeakHandling,
+    internal::ConcurrentBucket<KeyValuePair<Key, Value>>,
+    Traits> {
+  static void Trace(
+      blink::Visitor* visitor,
+      const internal::ConcurrentBucket<KeyValuePair<Key, Value>>& self) {
+    TraceKeyValuePairInCollectionTrait<kWeakHandling, Key, Value,
+                                       Traits>::Trace(visitor, self.key(),
+                                                      self.value());
   }
 };
 
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
index a3188441..f015e2f 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -1534,6 +1534,8 @@
   new_policy.find_in_page_priority() =
       find_in_page_budget_pool_controller_->CurrentTaskPriority();
 
+  new_policy.should_freeze_compositor_task_queue() = AllPagesFrozen();
+
   // Tracing is done before the early out check, because it's quite possible we
   // will otherwise miss this information in traces.
   CreateTraceEventObjectSnapshotLocked();
@@ -1565,8 +1567,6 @@
     }
   }
 
-  DCHECK(compositor_task_queue_->IsQueueEnabled());
-
   Policy old_policy = main_thread_only().current_policy;
   main_thread_only().current_policy = new_policy;
 
@@ -1596,6 +1596,8 @@
                          current_policy.GetQueuePolicy(queue_class),
                          should_update_priorities);
   }
+  compositor_task_queue_enabled_voter_->SetVoteToEnable(
+      !current_policy.should_freeze_compositor_task_queue());
 }
 
 void MainThreadSchedulerImpl::UpdateTaskQueueState(
@@ -2412,11 +2414,13 @@
     memory_purge_manager_.OnPageCreated(
         page_scheduler->GetPageLifecycleState());
   }
+
   base::AutoLock lock(any_thread_lock_);
   any_thread().waiting_for_any_main_frame_contentful_paint =
       IsAnyMainFrameWaitingForFirstContentfulPaint();
   any_thread().waiting_for_any_main_frame_meaningful_paint =
       IsAnyMainFrameWaitingForFirstMeaningfulPaint();
+  UpdatePolicyLocked(UpdateType::kMayEarlyOutIfPolicyUnchanged);
 }
 
 void MainThreadSchedulerImpl::RemovePageScheduler(
@@ -2428,11 +2432,13 @@
     memory_purge_manager_.OnPageDestroyed(
         page_scheduler->GetPageLifecycleState());
   }
+
   base::AutoLock lock(any_thread_lock_);
   any_thread().waiting_for_any_main_frame_contentful_paint =
       IsAnyMainFrameWaitingForFirstContentfulPaint();
   any_thread().waiting_for_any_main_frame_meaningful_paint =
       IsAnyMainFrameWaitingForFirstMeaningfulPaint();
+  UpdatePolicyLocked(UpdateType::kMayEarlyOutIfPolicyUnchanged);
 }
 
 void MainThreadSchedulerImpl::OnFrameAdded(
@@ -2453,10 +2459,12 @@
 
 void MainThreadSchedulerImpl::OnPageFrozen() {
   memory_purge_manager_.OnPageFrozen();
+  UpdatePolicy();
 }
 
 void MainThreadSchedulerImpl::OnPageResumed() {
   memory_purge_manager_.OnPageResumed();
+  UpdatePolicy();
 }
 
 void MainThreadSchedulerImpl::BroadcastIntervention(const String& message) {
@@ -2802,6 +2810,16 @@
   main_thread_only().on_task_completion_callbacks.clear();
 }
 
+bool MainThreadSchedulerImpl::AllPagesFrozen() const {
+  if (main_thread_only().page_schedulers.IsEmpty())
+    return false;
+  for (const auto* scheduler : main_thread_only().page_schedulers) {
+    if (!scheduler->IsFrozen())
+      return false;
+  }
+  return true;
+}
+
 // static
 const char* MainThreadSchedulerImpl::UseCaseToString(UseCase use_case) {
   switch (use_case) {
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
index b2b7914a..76404752 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
@@ -566,6 +566,13 @@
       return should_prioritize_loading_with_compositing_;
     }
 
+    bool& should_freeze_compositor_task_queue() {
+      return should_freeze_compositor_task_queue_;
+    }
+    bool should_freeze_compositor_task_queue() const {
+      return should_freeze_compositor_task_queue_;
+    }
+
     base::sequence_manager::TaskQueue::QueuePriority& compositor_priority() {
       return compositor_priority_;
     }
@@ -591,6 +598,8 @@
              frozen_when_backgrounded_ == other.frozen_when_backgrounded_ &&
              should_prioritize_loading_with_compositing_ ==
                  other.should_prioritize_loading_with_compositing_ &&
+             should_freeze_compositor_task_queue_ ==
+                 other.should_freeze_compositor_task_queue_ &&
              compositor_priority_ == other.compositor_priority_ &&
              find_in_page_priority_ == other.find_in_page_priority_ &&
              use_case_ == other.use_case_;
@@ -603,6 +612,7 @@
     bool should_disable_throttling_;
     bool frozen_when_backgrounded_;
     bool should_prioritize_loading_with_compositing_;
+    bool should_freeze_compositor_task_queue_{false};
 
     // Priority of task queues belonging to the compositor class (Check
     // MainThread::QueueClass).
@@ -797,6 +807,8 @@
   void AsValueIntoLocked(base::trace_event::TracedValue*,
                          base::TimeTicks optional_now) const;
 
+  bool AllPagesFrozen() const;
+
   // Indicates that scheduler has been shutdown.
   // It should be accessed only on the main thread, but couldn't be a member
   // of MainThreadOnly struct because last might be destructed before we
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
index 6ee6e345..6d0131b 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
@@ -40,6 +40,7 @@
 #include "third_party/blink/renderer/platform/scheduler/main_thread/find_in_page_budget_pool_controller.h"
 #include "third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h"
 #include "third_party/blink/renderer/platform/scheduler/main_thread/frame_task_queue_controller.h"
+#include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h"
 #include "third_party/blink/renderer/platform/scheduler/test/recording_task_time_observer.h"
 #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
 #include "v8/include/v8.h"
@@ -3386,6 +3387,51 @@
 }
 #endif  // defined(OS_ANDROID)
 
+TEST_F(MainThreadSchedulerImplTest, FreezesCompositorQueueWhenAllPagesFrozen) {
+  main_frame_scheduler_.reset();
+  page_scheduler_.reset();
+
+  std::unique_ptr<PageScheduler> sched_1 =
+      scheduler_->CreatePageScheduler(nullptr);
+  sched_1->SetPageVisible(false);
+  std::unique_ptr<PageScheduler> sched_2 =
+      scheduler_->CreatePageScheduler(nullptr);
+  sched_2->SetPageVisible(false);
+
+  Vector<String> run_order;
+
+  sched_1->SetPageVisible(false);
+  sched_1->SetPageFrozen(true);
+  PostTestTasks(&run_order, "D1 C1");
+  base::RunLoop().RunUntilIdle();
+  EXPECT_THAT(run_order, testing::ElementsAre("D1", "C1"));
+
+  run_order.clear();
+  sched_2->SetPageFrozen(true);
+  PostTestTasks(&run_order, "D2 C2");
+  base::RunLoop().RunUntilIdle();
+  EXPECT_THAT(run_order, testing::ElementsAre("D2"));
+
+  run_order.clear();
+  std::unique_ptr<PageScheduler> sched_3 =
+      scheduler_->CreatePageScheduler(nullptr);
+  sched_3->SetPageVisible(false);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_THAT(run_order, testing::ElementsAre("C2"));
+
+  run_order.clear();
+  PostTestTasks(&run_order, "D3 C3");
+  sched_3.reset();
+  base::RunLoop().RunUntilIdle();
+  EXPECT_THAT(run_order, testing::ElementsAre("D3"));
+
+  run_order.clear();
+  sched_1.reset();
+  sched_2.reset();
+  base::RunLoop().RunUntilIdle();
+  EXPECT_THAT(run_order, testing::ElementsAre("C3"));
+}
+
 class MainThreadSchedulerImplWithInitalVirtualTimeTest
     : public MainThreadSchedulerImplTest {
  public:
diff --git a/third_party/blink/renderer/platform/testing/scoped_scheduler_overrider.cc b/third_party/blink/renderer/platform/testing/scoped_scheduler_overrider.cc
index 8aa156c..a96ee82 100644
--- a/third_party/blink/renderer/platform/testing/scoped_scheduler_overrider.cc
+++ b/third_party/blink/renderer/platform/testing/scoped_scheduler_overrider.cc
@@ -18,6 +18,10 @@
 
   ThreadScheduler* Scheduler() override { return scheduler_; }
 
+  scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() const override {
+    return scheduler_->DeprecatedDefaultTaskRunner();
+  }
+
  private:
   ThreadScheduler* scheduler_;
 };
diff --git a/third_party/blink/renderer/platform/widget/frame_widget.h b/third_party/blink/renderer/platform/widget/frame_widget.h
index 9db3653..c0f0d5a 100644
--- a/third_party/blink/renderer/platform/widget/frame_widget.h
+++ b/third_party/blink/renderer/platform/widget/frame_widget.h
@@ -14,6 +14,7 @@
 #include "third_party/blink/public/web/web_swap_result.h"
 #include "third_party/blink/public/web/web_widget_client.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
+#include "ui/base/ime/mojom/text_input_state.mojom-blink.h"
 #include "ui/base/ime/mojom/virtual_keyboard_types.mojom-blink.h"
 
 namespace cc {
@@ -123,6 +124,10 @@
       Vector<gfx::Rect>* bounds) = 0;
 
   virtual gfx::Range CompositionRange() = 0;
+  // Returns ime_text_spans and corresponding window coordinates for the list
+  // of given spans.
+  virtual Vector<ui::mojom::blink::ImeTextSpanInfoPtr> GetImeTextSpansInfo(
+      const WebVector<ui::ImeTextSpan>& ime_text_spans) = 0;
   virtual WebTextInputInfo TextInputInfo() = 0;
   virtual ui::mojom::blink::VirtualKeyboardVisibilityRequest
   GetLastVirtualKeyboardVisibilityRequest() = 0;
diff --git a/third_party/blink/renderer/platform/widget/widget_base.cc b/third_party/blink/renderer/platform/widget/widget_base.cc
index eb4b8bc..2bdaa01 100644
--- a/third_party/blink/renderer/platform/widget/widget_base.cc
+++ b/third_party/blink/renderer/platform/widget/widget_base.cc
@@ -538,7 +538,7 @@
   // shown.
   if (show_virtual_keyboard || reply_to_request ||
       text_input_type_ != new_type || text_input_mode_ != new_mode ||
-      text_input_info_ != new_info ||
+      text_input_info_ != new_info || !new_info.ime_text_spans.empty() ||
       can_compose_inline_ != new_can_compose_inline ||
       always_hide_ime_ != always_hide_ime || vk_policy_ != new_vk_policy ||
       (new_vk_policy == ui::mojom::VirtualKeyboardPolicy::MANUAL &&
@@ -552,6 +552,10 @@
     params->flags = new_info.flags;
     params->vk_policy = new_vk_policy;
     params->last_vk_visibility_request = last_vk_visibility_request;
+    if (!new_info.ime_text_spans.empty()) {
+      params->ime_text_spans_info =
+          frame_widget->GetImeTextSpansInfo(new_info.ime_text_spans);
+    }
     if (frame_widget) {
       frame_widget->GetEditContextBoundsInWindow(
           &params->edit_context_control_bounds,
diff --git a/third_party/blink/renderer/platform/wtf/hash_map.h b/third_party/blink/renderer/platform/wtf/hash_map.h
index db9948d..b58e647 100644
--- a/third_party/blink/renderer/platform/wtf/hash_map.h
+++ b/third_party/blink/renderer/platform/wtf/hash_map.h
@@ -46,9 +46,8 @@
   }
   // Assumes out points to a buffer of size at least sizeof(T::KeyType).
   template <typename T>
-  static const typename T::KeyType& ExtractSafe(const T& p, void* out) {
+  static void ExtractSafe(const T& p, void* out) {
     AtomicReadMemcpy<sizeof(typename T::KeyType)>(out, &p.key);
-    return *reinterpret_cast<typename T::KeyType*>(out);
   }
 };
 
diff --git a/third_party/blink/renderer/platform/wtf/hash_set.h b/third_party/blink/renderer/platform/wtf/hash_set.h
index abef964..5ebc941 100644
--- a/third_party/blink/renderer/platform/wtf/hash_set.h
+++ b/third_party/blink/renderer/platform/wtf/hash_set.h
@@ -155,9 +155,8 @@
   }
   // Assumes out points to a buffer of size at least sizeof(T).
   template <typename T>
-  static const T& ExtractSafe(const T& t, void* out) {
+  static void ExtractSafe(const T& t, void* out) {
     AtomicReadMemcpy<sizeof(T)>(out, &t);
-    return *reinterpret_cast<T*>(out);
   }
 };
 
diff --git a/third_party/blink/renderer/platform/wtf/hash_table.h b/third_party/blink/renderer/platform/wtf/hash_table.h
index 732a890d..f179286e 100644
--- a/third_party/blink/renderer/platform/wtf/hash_table.h
+++ b/third_party/blink/renderer/platform/wtf/hash_table.h
@@ -668,14 +668,12 @@
   static bool IsDeletedBucket(const Key& key) {
     return KeyTraits::IsDeletedValue(key);
   }
-  static bool IsEmptyOrDeletedBucket(const Value& value) {
-    const Key& key = Extractor::Extract(value);
+  static bool IsEmptyOrDeletedBucketForKey(const Key& key) {
     return IsEmptyBucket(key) || IsDeletedBucket(key);
   }
-  static bool IsEmptyOrDeletedBucketSafe(const Value& value) {
-    alignas(std::max(alignof(Key), sizeof(size_t))) char buf[sizeof(Key)];
-    const Key& key = Extractor::ExtractSafe(value, &buf);
-    return IsEmptyBucket(key) || IsDeletedBucket(key);
+  static bool IsEmptyOrDeletedBucket(const Value& value) {
+    const Key& key = Extractor::Extract(value);
+    return IsEmptyOrDeletedBucketForKey(key);
   }
 };
 
diff --git a/third_party/blink/renderer/platform/wtf/vector_backed_linked_list.h b/third_party/blink/renderer/platform/wtf/vector_backed_linked_list.h
index 666e9c7a..5f6ca5c 100644
--- a/third_party/blink/renderer/platform/wtf/vector_backed_linked_list.h
+++ b/third_party/blink/renderer/platform/wtf/vector_backed_linked_list.h
@@ -280,15 +280,17 @@
   }
   wtf_size_t UsedLastIndex() const { return nodes_[anchor_index_].prev_index_; }
 
-  iterator MakeIterator(wtf_size_t index) { return iterator(index, this); }
+  iterator MakeIterator(wtf_size_t index) {
+    return iterator(&nodes_[index], this);
+  }
   const_iterator MakeConstIterator(wtf_size_t index) const {
-    return const_iterator(index, this);
+    return const_iterator(&nodes_[index], this);
   }
   reverse_iterator MakeReverseIterator(wtf_size_t index) {
-    return reverse_iterator(index, this);
+    return reverse_iterator(&nodes_[index], this);
   }
   const_reverse_iterator MakeConstReverseIterator(wtf_size_t index) const {
-    return const_reverse_iterator(index, this);
+    return const_reverse_iterator(&nodes_[index], this);
   }
 
   bool IsIndexValid(wtf_size_t index) const {
@@ -334,6 +336,8 @@
   DISALLOW_NEW();
   using ReferenceType = typename VectorBackedLinkedListType::Value&;
   using PointerType = typename VectorBackedLinkedListType::Value*;
+  using Node = typename VectorBackedLinkedListConstIterator<
+      VectorBackedLinkedListType>::Node;
   using const_iterator =
       VectorBackedLinkedListConstIterator<VectorBackedLinkedListType>;
 
@@ -365,9 +369,9 @@
   operator const_iterator() const { return iterator_; }
 
  private:
-  VectorBackedLinkedListIterator(wtf_size_t index,
+  VectorBackedLinkedListIterator(const Node* node,
                                  VectorBackedLinkedListType* container)
-      : iterator_(index, container) {}
+      : iterator_(node, container) {}
 
   PointerType Get() const { return const_cast<PointerType>(iterator_.Get()); }
   wtf_size_t GetIndex() const { return iterator_.GetIndex(); }
@@ -387,31 +391,31 @@
 
  public:
   PointerType Get() const {
-    DCHECK(container_->IsIndexValid(index_));
-    DCHECK(!container_->IsAnchor(index_));
+    DCHECK(!container_->IsAnchor(GetIndex()));
     CheckModifications();
-    const Node& node = container_->nodes_[index_];
-    return &node.value_;
+    return &node_->value_;
   }
 
   ReferenceType operator*() const { return *Get(); }
   PointerType operator->() const { return Get(); }
 
-  wtf_size_t GetIndex() const { return index_; }
+  wtf_size_t GetIndex() const {
+    return static_cast<wtf_size_t>(node_ - &container_->nodes_[0]);
+  }
 
   VectorBackedLinkedListConstIterator& operator++() {
-    DCHECK(container_->IsIndexValid(index_));
     CheckModifications();
-    index_ = container_->nodes_[index_].next_index_;
-    DCHECK(container_->IsIndexValid(index_));
+    wtf_size_t next_index = node_->next_index_;
+    DCHECK(container_->IsIndexValid(next_index));
+    node_ = &container_->nodes_[next_index];
     return *this;
   }
 
   VectorBackedLinkedListConstIterator& operator--() {
-    DCHECK(container_->IsIndexValid(index_));
     CheckModifications();
-    index_ = container_->nodes_[index_].prev_index_;
-    DCHECK(container_->IsIndexValid(index_));
+    wtf_size_t prev_index = node_->prev_index_;
+    DCHECK(container_->IsIndexValid(prev_index));
+    node_ = &container_->nodes_[prev_index];
     return *this;
   }
 
@@ -420,7 +424,7 @@
 
   bool operator==(const VectorBackedLinkedListConstIterator& other) const {
     DCHECK_EQ(container_, other.container_);
-    return index_ == other.index_ && container_ == other.container_;
+    return node_ == other.node_;
   }
 
   bool operator!=(const VectorBackedLinkedListConstIterator& other) const {
@@ -429,20 +433,21 @@
 
  protected:
   VectorBackedLinkedListConstIterator(
-      wtf_size_t index,
+      const Node* node,
       const VectorBackedLinkedListType* container)
-      : index_(index),
+      : node_(node),
         container_(container)
 #if DCHECK_IS_ON()
         ,
         container_modifications_(container->modifications_)
 #endif
   {
-    DCHECK(container_->IsIndexValid(index_));
   }
 
  private:
-  wtf_size_t index_;
+  // The raw pointer is safe here because the conservative stack scanning will
+  // strongly trace container_ and thus trace all the nodes including node_.
+  const Node* node_;
   const VectorBackedLinkedListType* container_;
 #if DCHECK_IS_ON()
   void CheckModifications() const {
@@ -462,6 +467,8 @@
 class VectorBackedLinkedListReverseIterator {
   using ReferenceType = typename VectorBackedLinkedListType::Value&;
   using PointerType = typename VectorBackedLinkedListType::Value*;
+  using Node = typename VectorBackedLinkedListConstIterator<
+      VectorBackedLinkedListType>::Node;
   using const_reverse_iterator =
       VectorBackedLinkedListConstReverseIterator<VectorBackedLinkedListType>;
 
@@ -493,9 +500,9 @@
   operator const_reverse_iterator() const { return iterator_; }
 
  private:
-  VectorBackedLinkedListReverseIterator(wtf_size_t index,
+  VectorBackedLinkedListReverseIterator(const Node* node,
                                         VectorBackedLinkedListType* container)
-      : iterator_(index, container) {}
+      : iterator_(node, container) {}
 
   PointerType Get() const { return const_cast<PointerType>(iterator_.Get()); }
   wtf_size_t GetIndex() const { return iterator_.GetIndex(); }
@@ -511,6 +518,7 @@
     : public VectorBackedLinkedListConstIterator<VectorBackedLinkedListType> {
   using Superclass =
       VectorBackedLinkedListConstIterator<VectorBackedLinkedListType>;
+  using Node = typename Superclass::Node;
 
  public:
   VectorBackedLinkedListConstReverseIterator& operator++() {
@@ -528,9 +536,9 @@
 
  private:
   VectorBackedLinkedListConstReverseIterator(
-      wtf_size_t index,
+      const Node* node,
       const VectorBackedLinkedListType* container)
-      : Superclass(index, container) {}
+      : Superclass(node, container) {}
 
   template <typename T, typename Allocator>
   friend class VectorBackedLinkedList;
@@ -604,7 +612,7 @@
   nodes_[prev_index].next_index_ = new_entry_index;
   nodes_[position_index].prev_index_ = new_entry_index;
   size_++;
-  return iterator(new_entry_index, this);
+  return MakeIterator(new_entry_index);
 }
 
 template <typename T, typename Allocator>
@@ -652,7 +660,7 @@
   free_head_index_ = position_index;
 
   size_--;
-  return iterator(next_index, this);
+  return MakeIterator(next_index);
 }
 
 template <typename T, typename Allocator>
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 1d5a611..f98abce 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1308,10 +1308,6 @@
 # Fieldset in NG
 #
 
-### virtual/layout_ng_fieldset/fast/forms/fieldset/
-crbug.com/875235 virtual/layout_ng_fieldset/fast/forms/fieldset/legend-small-after-margin-before-border-horizontal-mode.html [ Failure ]
-crbug.com/875235 virtual/layout_ng_fieldset/fast/forms/fieldset/legend-after-margin-with-before-border-horizontal-mode.html [ Failure ]
-
 ## Fieldseet in NG - Passing reference tests
 crbug.com/875235 virtual/layout_ng_fieldset/external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-vertical.html [ Pass ]
 
@@ -2693,6 +2689,7 @@
 crbug.com/1078474 external/wpt/css/css-pseudo/cascade-highlight-002.html [ Failure ]
 crbug.com/1024156 external/wpt/css/css-pseudo/cascade-highlight-004.html [ Failure ]
 crbug.com/1086855 external/wpt/css/css-pseudo/file-chooser-button-001.tentative.html [ Failure ]
+crbug.com/1113004 external/wpt/css/css-pseudo/active-selection-043.html [ Failure ]
 crbug.com/1100119 [ Mac ] external/wpt/css/css-pseudo/active-selection-051.html [ Failure ]
 crbug.com/1100119 [ Mac ] external/wpt/css/css-pseudo/active-selection-052.html [ Failure ]
 crbug.com/1100119 [ Mac ] external/wpt/css/css-pseudo/active-selection-053.html [ Failure ]
@@ -2700,11 +2697,11 @@
 crbug.com/1018465 external/wpt/css/css-pseudo/active-selection-056.html [ Failure ]
 crbug.com/1078474 external/wpt/css/css-pseudo/active-selection-012.html [ Failure ]
 crbug.com/932343 external/wpt/css/css-pseudo/active-selection-014.html [ Failure ]
-crbug.com/1111008 external/wpt/css/css-pseudo/active-selection-018.html [ Failure ]
+crbug.com/1078474 external/wpt/css/css-pseudo/active-selection-018.html [ Failure ]
 crbug.com/1110495 external/wpt/css/css-pseudo/selection-input-011.html [ Failure ]
 crbug.com/1110495 external/wpt/css/css-pseudo/selection-textarea-011.html [ Failure ]
-crbug.com/1110504 external/wpt/css/css-pseudo/selection-intercharacter-011.html [ Failure ]
-crbug.com/1110504 external/wpt/css/css-pseudo/selection-intercharacter-012.html [ Failure ]
+crbug.com/1078474 external/wpt/css/css-pseudo/selection-intercharacter-011.html [ Failure ]
+crbug.com/1078474 external/wpt/css/css-pseudo/selection-intercharacter-012.html [ Failure ]
 crbug.com/1110512 external/wpt/css/css-pseudo/selection-contenteditable-011.html [ Failure ]
 
 crbug.com/1105958 external/wpt/payment-request/payment-is-showing.https.html [ Timeout ]
@@ -2722,9 +2719,6 @@
 crbug.com/626703 [ Linux ] virtual/layout-ng-grid/external/wpt/css/css-grid/layout-algorithm/flex-and-intrinsic-sizes-002.html [ Failure ]
 crbug.com/626703 [ Mac ] virtual/layout-ng-grid/external/wpt/css/css-grid/layout-algorithm/flex-and-intrinsic-sizes-002.html [ Failure ]
 crbug.com/626703 [ Win ] virtual/layout-ng-grid/external/wpt/css/css-grid/layout-algorithm/flex-and-intrinsic-sizes-002.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/css/css-pseudo/active-selection-043.html [ Failure ]
-crbug.com/626703 [ Mac ] external/wpt/css/css-pseudo/active-selection-043.html [ Failure ]
-crbug.com/626703 [ Win ] external/wpt/css/css-pseudo/active-selection-043.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html [ Timeout ]
 crbug.com/626703 [ Mac ] external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html [ Timeout ]
 crbug.com/626703 [ Win ] external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_navigation_download_allow_downloads.sub.tentative.html [ Timeout ]
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/reporting-observer-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/reporting-observer-expected.txt
index 9dadb68..036442d6 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/reporting-observer-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/reporting-observer-expected.txt
@@ -1,5 +1,7 @@
 This is a testharness.js-based test.
 FAIL Opener COOP assert_equals: No report received. expected 1 but got 0
 FAIL Openee COOP assert_equals: No report received. expected 1 but got 0
+FAIL Access from same-origin iframe assert_not_equals: No report received. got disallowed value "timeout"
+PASS Access from cross-site iframe
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/reporting-observer.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/reporting-observer.html
index 4d1eda94..decad097 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/reporting-observer.html
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/access-reporting/reporting-observer.html
@@ -1,3 +1,6 @@
+<!doctype html>
+<meta charset="utf-8">
+<meta name="timeout" content="long">
 <title>
   Check the ReportingObserver(s) are notified about the coop-access-violation
   events.
@@ -12,8 +15,10 @@
 
 const directory = "/html/cross-origin-opener-policy/reporting";
 const executor_path = directory + "/resources/executor.html?pipe=";
-const https = get_host_info().HTTPS_ORIGIN;
+const same_origin = get_host_info().HTTPS_ORIGIN;
+const cross_site = get_host_info().HTTPS_NOTSAMESITE_ORIGIN;
 const coep_header = '|header(Cross-Origin-Embedder-Policy,require-corp)';
+const corp_header = '|header(Cross-Origin-Resource-Policy,cross-origin)';
 
 promise_test(async t => {
   // This test window.
@@ -22,13 +27,13 @@
   // The "opener" window, using COOP-Report-Only and a reporter.
   const opener_token = token();
   const opener_reportTo = reportToHeaders(token());
-  const opener_url = https + executor_path + opener_reportTo.header +
+  const opener_url = same_origin + executor_path + opener_reportTo.header +
     opener_reportTo.coopReportOnlySameOriginHeader + coep_header +
     `&uuid=${opener_token}`;
 
   // The "openee" window, NOT using COOP.
   const openee_token = token();
-  const openee_url = https + executor_path + `&uuid=${openee_token}`;
+  const openee_url = same_origin + executor_path + `&uuid=${openee_token}`;
 
   // 1. Create the opener window.
   window.open(opener_url);
@@ -82,12 +87,12 @@
 
   // The "opener" window, NOT using COOP.
   const opener_token = token();
-  const opener_url = https + executor_path + `&uuid=${opener_token}`;
+  const opener_url = same_origin + executor_path + `&uuid=${opener_token}`;
 
   // The "openee" window, using COOP-Report-Only and a reporter.
   const openee_token = token();
   const openee_reportTo = reportToHeaders(token());
-  const openee_url = https + executor_path + openee_reportTo.header +
+  const openee_url = same_origin + executor_path + openee_reportTo.header +
     openee_reportTo.coopReportOnlySameOriginHeader + coep_header +
     `&uuid=${openee_token}`;
 
@@ -132,4 +137,126 @@
   let report_access_to = JSON.parse(await receive(this_window_token));
   assert_equals(report_access_to.length, 0, "Unexpected report received.");
 }, "Openee COOP");
+
+promise_test(async t => {
+  // This test window.
+  const this_window_token = token();
+
+  // The "opener" window, using COOP-Report-Only and a reporter.
+  const opener_token = token();
+  const opener_reportTo = reportToHeaders(token());
+  const opener_url = same_origin + executor_path + opener_reportTo.header +
+    opener_reportTo.coopReportOnlySameOriginHeader + coep_header +
+    `&uuid=${opener_token}`;
+
+  // The "opener's iframe", same-origin with its parent.
+  const opener_iframe_token = token();
+  const opener_iframe_url = same_origin + executor_path + coep_header +
+    `&uuid=${opener_iframe_token}`;
+
+  // The "openee" window, NOT using COOP.
+  const openee_token = token();
+  const openee_url = same_origin + executor_path + coep_header +
+    `&uuid=${openee_token}`;
+
+  // 1. Create the opener window.
+  window.open(opener_url);
+  t.add_cleanup(() => send(opener_token, "window.close();"));
+
+  // 2. The opener opens an iframe, and install a ReportingObserver to catch
+  //    future accesses.
+  send(opener_token, `
+    iframe = document.createElement("iframe");
+    iframe.src = "${opener_iframe_url}";
+    document.body.appendChild(iframe);
+
+    let observer = new ReportingObserver(reports => {
+      send("${this_window_token}", JSON.stringify(reports));
+      observer.disconnect();
+    });
+    observer.observe();
+  `);
+
+  // 3. The iframe opens the openee.
+  send(opener_iframe_token, `openee = window.open('${openee_url}');`);
+  t.add_cleanup(() => send(openee_token, `window.close();`));
+
+  // 4. Wait for the openee to load its document.
+  send(openee_token, `send("${this_window_token}", "Ready");`);
+  assert_equals(await receive(this_window_token), "Ready");
+
+  // 4. The opener's iframe tries to access the openee. This is an
+  //    "access-from-coop-page" from a same-origin iframe, so the
+  //    ReportingObserver(s) are notified.
+  send(opener_iframe_token, `tryAccess(openee);`);
+
+  let reports = await receive(this_window_token);
+  assert_not_equals(reports, "timeout", "No report received.");
+  reports = JSON.parse(reports);
+  assert_equals(reports.length, 1, "No report received.");
+  assert_equals(reports[0].type, "coop-access-violation");
+  assert_equals(reports[0].url, opener_url.replace(/"/g, '%22'));
+  assert_true(reports[0].body.sourceFile.includes("try-access.js"));
+  assert_equals(reports[0].body.lineNumber, 6);
+  assert_equals(reports[0].body.columnNumber, 7);
+  assert_equals(reports[0].body.property, "blur");
+}, "Access from same-origin iframe")
+
+promise_test(async t => {
+  // This test window.
+  const this_window_token = token();
+
+  // The "opener" window, using COOP-Report-Only and a reporter.
+  const opener_token = token();
+  const opener_reportTo = reportToHeaders(token());
+  const opener_url = same_origin + executor_path + opener_reportTo.header +
+    opener_reportTo.coopReportOnlySameOriginHeader + coep_header +
+    `&uuid=${opener_token}`;
+
+  // The "opener's iframe", same-origin with its parent.
+  const opener_iframe_token = token();
+  const opener_iframe_url = cross_site + executor_path + coep_header +
+    corp_header +
+    `&uuid=${opener_iframe_token}`;
+
+  // The "openee" window, NOT using COOP.
+  const openee_token = token();
+  const openee_url = same_origin + executor_path + coep_header +
+    `&uuid=${openee_token}`;
+
+  // 1. Create the opener window.
+  window.open(opener_url);
+  t.add_cleanup(() => send(opener_token, "window.close();"));
+
+  // 2. The opener opens an iframe, and install a ReportingObserver to catch
+  //    future accesses.
+  send(opener_token, `
+    iframe = document.createElement("iframe");
+    iframe.src = "${opener_iframe_url}";
+    document.body.appendChild(iframe);
+
+    let observer = new ReportingObserver(reports => {
+      send("${this_window_token}", JSON.stringify(reports));
+      observer.disconnect();
+    });
+    observer.observe();
+  `);
+
+  // 3. The iframe opens the openee.
+  send(opener_iframe_token, `openee = window.open('${openee_url}');`);
+  t.add_cleanup(() => send(openee_token, `window.close();`));
+
+  // 4. Wait for the openee to load its document.
+  send(openee_token, `send("${this_window_token}", "Ready");`);
+  assert_equals(await receive(this_window_token), "Ready");
+
+  // 5. The opener's iframe tries to access the openee. This is an
+  //    "access-from-coop-page" from a cross-site iframe. The ReportingObservers
+  //    from the main document aren't notified.
+  send(opener_iframe_token, `tryAccess(openee);`);
+
+  let reports = await receive(this_window_token);
+  assert_equals(reports, "timeout", "Unexpected report received.");
+}, "Access from cross-site iframe")
+
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/resources/dispatcher.py b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/resources/dispatcher.py
index 2617361..e77583e 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/resources/dispatcher.py
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-opener-policy/reporting/resources/dispatcher.py
@@ -9,12 +9,19 @@
         return b''
 
     uuid = request.GET[b'uuid']
+    stash = request.server.stash;
+    with stash.lock:
+        queue = stash.take(uuid)
+        if queue is None:
+            queue = []
 
-    if request.method == u'POST':
-        return request.server.stash.put(uuid, request.body)
-    else:
-        body = request.server.stash.take(uuid)
-        if body is None:
-            return b'not ready'
+        if request.method == u'POST':
+            queue.append(request.body)
+            ret = b'done'
         else:
-            return body
+            if len(queue) == 0:
+                ret = b'not ready'
+            else:
+                ret = queue.pop(0)
+        stash.put(uuid, queue)
+    return ret;
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/base-url-worker-importScripts-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/base-url-worker-importScripts-expected.txt
new file mode 100644
index 0000000..8134ddf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/base-url-worker-importScripts-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+FAIL Relative URL-like from same-origin importScripts() assert_equals: expected "gamma/import.js" but got "beta/import.js"
+PASS Absolute URL-like from same-origin importScripts()
+FAIL Relative URL-like from cross-origin importScripts() assert_equals: Relative URL-like specifier resolution should fail expected "(unreached)" but got "beta/import.js"
+PASS Absolute URL-like from cross-origin importScripts()
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/base-url-worker-importScripts.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/base-url-worker-importScripts.html
new file mode 100644
index 0000000..817cf6d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/base-url-worker-importScripts.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<title>Base URLs used in resolving specifiers in dynamic imports from importScripts()</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+fetch_tests_from_worker(new Worker("./worker-importScripts.sub.js"));
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/base-url-worker.sub.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/base-url-worker.sub.html
new file mode 100644
index 0000000..a122042
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/base-url-worker.sub.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<title>Base URLs used in resolving specifiers in dynamic imports from workers</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+fetch_tests_from_worker(new Worker(
+    "../beta/redirect.py?location=http://{{host}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/dynamic-import/gamma/base-url.sub.js"));
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/base-url.sub-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/base-url.sub-expected.txt
new file mode 100644
index 0000000..15485c46
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/base-url.sub-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+FAIL Relative URL-like from same origin classic <script> assert_equals: expected "gamma/import.js" but got "beta/import.js"
+PASS Absolute URL-like from same origin classic <script>
+FAIL Relative URL-like from cross origin classic <script> without crossorigin attribute assert_equals: Relative URL-like specifier resolution should fail expected "(unreached)" but got "beta/import.js"
+PASS Absolute URL-like from cross origin classic <script> without crossorigin attribute
+FAIL Relative URL-like from cross origin classic <script> with crossorigin attribute assert_equals: expected "gamma/import.js" but got "beta/import.js"
+PASS Absolute URL-like from cross origin classic <script> with crossorigin attribute
+PASS Relative URL-like from cross origin module <script>
+PASS Absolute URL-like from cross origin module <script>
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/base-url.sub.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/base-url.sub.html
new file mode 100644
index 0000000..f7d4927
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/base-url.sub.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<title>Base URLs used in resolving specifiers in dynamic imports</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+self.testName = "same origin classic <script>";
+self.baseUrlSanitized = false;
+</script>
+<script src="../beta/redirect.py?location=http://{{host}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/dynamic-import/gamma/base-url.sub.js"></script>
+
+<script>
+self.testName = "cross origin classic <script> without crossorigin attribute";
+self.baseUrlSanitized = true;
+</script>
+<script src="../beta/redirect.py?location=http://{{hosts[alt][]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/dynamic-import/gamma/base-url.sub.js"></script>
+
+<script>
+self.testName = "cross origin classic <script> with crossorigin attribute";
+self.baseUrlSanitized = false;
+</script>
+<script src="../beta/redirect.py?location=http://{{hosts[alt][]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/dynamic-import/gamma/base-url.sub.js%3Fpipe=header(Access-Control-Allow-Origin,*)" crossorigin></script>
+
+<script>
+self.testName = "cross origin module <script>";
+self.baseUrlSanitized = false;
+</script>
+<script src="../beta/redirect.py?location=http://{{hosts[alt][]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/dynamic-import/gamma/base-url.sub.js%3Fpipe=header(Access-Control-Allow-Origin,*)" type="module"></script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/import.js b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/import.js
new file mode 100644
index 0000000..b2ac52d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/import.js
@@ -0,0 +1 @@
+export const A = { "from": "alpha/import.js" };
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/worker-importScripts.sub.js b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/worker-importScripts.sub.js
new file mode 100644
index 0000000..904d32f9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/alpha/worker-importScripts.sub.js
@@ -0,0 +1,15 @@
+"use strict";
+
+importScripts("/resources/testharness.js");
+
+// CORS-same-origin
+self.testName = "same-origin importScripts()";
+self.baseUrlSanitized = false;
+importScripts("../beta/redirect.py?location=http://{{host}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/dynamic-import/gamma/base-url.sub.js");
+
+// CORS-cross-origin
+self.testName = "cross-origin importScripts()";
+self.baseUrlSanitized = true;
+importScripts("../beta/redirect.py?location=http://{{hosts[alt][]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/dynamic-import/gamma/base-url.sub.js");
+
+done();
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/beta/import.js b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/beta/import.js
new file mode 100644
index 0000000..7de1c68
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/beta/import.js
@@ -0,0 +1 @@
+export const A = { "from": "beta/import.js" };
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/beta/redirect.py b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/beta/redirect.py
new file mode 100644
index 0000000..f2fd1ebd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/beta/redirect.py
@@ -0,0 +1,19 @@
+def main(request, response):
+    """Simple handler that causes redirection.
+
+    The request should typically have two query parameters:
+    status - The status to use for the redirection. Defaults to 302.
+    location - The resource to redirect to.
+    """
+    status = 302
+    if b"status" in request.GET:
+        try:
+            status = int(request.GET.first(b"status"))
+        except ValueError:
+            pass
+
+    response.status = status
+
+    location = request.GET.first(b"location")
+
+    response.headers.set(b"Location", location)
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/gamma/base-url.sub.js b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/gamma/base-url.sub.js
new file mode 100644
index 0000000..ec77849
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/gamma/base-url.sub.js
@@ -0,0 +1,58 @@
+"use strict";
+
+// This script triggers import(), and thus the base URL of this script
+// (either loaded by `<script>` or `importScripts()`) is used as the base URL
+// of resolving relative URL-like specifiers in `import()`.
+
+// The following fields should be set by the callers of this script
+// (unless loaded as the worker top-level script):
+// - self.testName (string)
+// - self.baseUrlSanitized (boolean)
+
+// When this script is loaded as the worker top-level script:
+if ('DedicatedWorkerGlobalScope' in self &&
+    self instanceof DedicatedWorkerGlobalScope &&
+    !self.testName) {
+  importScripts("/resources/testharness.js");
+  self.testName = 'worker top-level script';
+  // Worker top-level scripts are always same-origin.
+  self.baseUrlSanitized = false;
+}
+
+{
+  // This could change by the time the test is executed, so we save it now.
+  // As this script is loaded multiple times, savedBaseUrlSanitized is scoped.
+  const savedBaseUrlSanitized = self.baseUrlSanitized;
+
+  promise_test(() => {
+      const promise = import("./import.js?pipe=header(Access-Control-Allow-Origin,*)&label=relative-" + self.testName);
+      if (savedBaseUrlSanitized) {
+        // The base URL is "about:blank" and thus import() here should fail.
+        return promise.then(module => {
+            // This code should be unreached, but assert_equals() is used here
+            // to log `module.A["from"]` in case of unexpected resolution.
+            assert_equals(module.A["from"], "(unreached)",
+              "Relative URL-like specifier resolution should fail");
+            assert_unreached();
+          },
+          () => {});
+      } else {
+        // The base URL is the response URL of this script, i.e.
+        // `.../gamma/base-url.sub.js`.
+        return promise.then(module => {
+            assert_equals(module.A["from"], "gamma/import.js");
+          });
+      }
+    },
+    "Relative URL-like from " + self.testName);
+}
+
+promise_test(() => {
+    return import("http://{{hosts[alt][]}}:{{ports[http][0]}}/html/semantics/scripting-1/the-script-element/module/dynamic-import/gamma/import.js?pipe=header(Access-Control-Allow-Origin,*)&label=absolute-" + self.testName)
+      .then(module => {
+          assert_equals(module.A["from"], "gamma/import.js");
+        })
+  },
+  "Absolute URL-like from " + self.testName);
+
+done();
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/gamma/import.js b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/gamma/import.js
new file mode 100644
index 0000000..435c136
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/gamma/import.js
@@ -0,0 +1 @@
+export const A = { "from": "gamma/import.js" };
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-area-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-area-expected.txt
index acdf751..fad35b8 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-area-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-area-expected.txt
@@ -208,16 +208,6 @@
         601,
         "Z"
       ],
-      "positiveRowLineNumberOffsets": [
-        0,
-        300.5,
-        601
-      ],
-      "positiveColumnLineNumberOffsets": [
-        0,
-        200.5,
-        401
-      ],
       "positiveRowLineNumberPositions": [
         {
           "x": 0,
@@ -246,16 +236,6 @@
           "y": 0
         }
       ],
-      "negativeRowLineNumberOffsets": [
-        0,
-        300.5,
-        601
-      ],
-      "negativeColumnLineNumberOffsets": [
-        0,
-        200.5,
-        401
-      ],
       "negativeRowLineNumberPositions": [
         {
           "x": 401,
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-expected.txt
index 2408dc8..8832914 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-expected.txt
@@ -207,16 +207,6 @@
         358,
         "Z"
       ],
-      "positiveRowLineNumberOffsets": [
-        0,
-        32.5,
-        65
-      ],
-      "positiveColumnLineNumberOffsets": [
-        0,
-        62.5,
-        275
-      ],
       "positiveRowLineNumberPositions": [
         {
           "x": 173,
@@ -245,14 +235,6 @@
           "y": 133
         }
       ],
-      "negativeRowLineNumberOffsets": [
-        0
-      ],
-      "negativeColumnLineNumberOffsets": [
-        0,
-        62.5,
-        275
-      ],
       "negativeRowLineNumberPositions": [
         {
           "x": 173,
@@ -508,16 +490,6 @@
         1058,
         "Z"
       ],
-      "positiveRowLineNumberOffsets": [
-        0,
-        25,
-        50
-      ],
-      "positiveColumnLineNumberOffsets": [
-        0,
-        50,
-        250
-      ],
       "positiveRowLineNumberPositions": [
         {
           "x": 228,
@@ -546,14 +518,6 @@
           "y": 858
         }
       ],
-      "negativeRowLineNumberOffsets": [
-        0
-      ],
-      "negativeColumnLineNumberOffsets": [
-        0,
-        50,
-        250
-      ],
       "negativeRowLineNumberPositions": [
         {
           "x": 228,
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-huge-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-huge-expected.txt
index 5522bd5..3058750 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-huge-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-huge-expected.txt
@@ -6284,212 +6284,6 @@
         1003,
         "Z"
       ],
-      "positiveRowLineNumberOffsets": [
-        0,
-        7.5,
-        17.5,
-        27.5,
-        37.5,
-        47.5,
-        57.5,
-        67.5,
-        77.5,
-        87.5,
-        97.5,
-        107.5,
-        117.5,
-        127.5,
-        137.5,
-        147.5,
-        157.5,
-        167.5,
-        177.5,
-        187.5,
-        197.5,
-        207.5,
-        217.5,
-        227.5,
-        237.5,
-        247.5,
-        257.5,
-        267.5,
-        277.5,
-        287.5,
-        297.5,
-        307.5,
-        317.5,
-        327.5,
-        337.5,
-        347.5,
-        357.5,
-        367.5,
-        377.5,
-        387.5,
-        397.5,
-        407.5,
-        417.5,
-        427.5,
-        437.5,
-        447.5,
-        457.5,
-        467.5,
-        477.5,
-        487.5,
-        497.5,
-        507.5,
-        517.5,
-        527.5,
-        537.5,
-        547.5,
-        557.5,
-        567.5,
-        577.5,
-        587.5,
-        597.5,
-        607.5,
-        617.5,
-        627.5,
-        637.5,
-        647.5,
-        657.5,
-        667.5,
-        677.5,
-        687.5,
-        697.5,
-        707.5,
-        717.5,
-        727.5,
-        737.5,
-        747.5,
-        757.5,
-        767.5,
-        777.5,
-        787.5,
-        797.5,
-        807.5,
-        817.5,
-        827.5,
-        837.5,
-        847.5,
-        857.5,
-        867.5,
-        877.5,
-        887.5,
-        897.5,
-        907.5,
-        917.5,
-        927.5,
-        937.5,
-        947.5,
-        957.5,
-        967.5,
-        977.5,
-        987.5,
-        995
-      ],
-      "positiveColumnLineNumberOffsets": [
-        0,
-        7.5,
-        17.5,
-        27.5,
-        37.5,
-        47.5,
-        57.5,
-        67.5,
-        77.5,
-        87.5,
-        97.5,
-        107.5,
-        117.5,
-        127.5,
-        137.5,
-        147.5,
-        157.5,
-        167.5,
-        177.5,
-        187.5,
-        197.5,
-        207.5,
-        217.5,
-        227.5,
-        237.5,
-        247.5,
-        257.5,
-        267.5,
-        277.5,
-        287.5,
-        297.5,
-        307.5,
-        317.5,
-        327.5,
-        337.5,
-        347.5,
-        357.5,
-        367.5,
-        377.5,
-        387.5,
-        397.5,
-        407.5,
-        417.5,
-        427.5,
-        437.5,
-        447.5,
-        457.5,
-        467.5,
-        477.5,
-        487.5,
-        497.5,
-        507.5,
-        517.5,
-        527.5,
-        537.5,
-        547.5,
-        557.5,
-        567.5,
-        577.5,
-        587.5,
-        597.5,
-        607.5,
-        617.5,
-        627.5,
-        637.5,
-        647.5,
-        657.5,
-        667.5,
-        677.5,
-        687.5,
-        697.5,
-        707.5,
-        717.5,
-        727.5,
-        737.5,
-        747.5,
-        757.5,
-        767.5,
-        777.5,
-        787.5,
-        797.5,
-        807.5,
-        817.5,
-        827.5,
-        837.5,
-        847.5,
-        857.5,
-        867.5,
-        877.5,
-        887.5,
-        897.5,
-        907.5,
-        917.5,
-        927.5,
-        937.5,
-        947.5,
-        957.5,
-        967.5,
-        977.5,
-        987.5,
-        995
-      ],
       "positiveRowLineNumberPositions": [
         {
           "x": 8,
@@ -7302,212 +7096,6 @@
           "y": 8
         }
       ],
-      "negativeRowLineNumberOffsets": [
-        0,
-        7.5,
-        17.5,
-        27.5,
-        37.5,
-        47.5,
-        57.5,
-        67.5,
-        77.5,
-        87.5,
-        97.5,
-        107.5,
-        117.5,
-        127.5,
-        137.5,
-        147.5,
-        157.5,
-        167.5,
-        177.5,
-        187.5,
-        197.5,
-        207.5,
-        217.5,
-        227.5,
-        237.5,
-        247.5,
-        257.5,
-        267.5,
-        277.5,
-        287.5,
-        297.5,
-        307.5,
-        317.5,
-        327.5,
-        337.5,
-        347.5,
-        357.5,
-        367.5,
-        377.5,
-        387.5,
-        397.5,
-        407.5,
-        417.5,
-        427.5,
-        437.5,
-        447.5,
-        457.5,
-        467.5,
-        477.5,
-        487.5,
-        497.5,
-        507.5,
-        517.5,
-        527.5,
-        537.5,
-        547.5,
-        557.5,
-        567.5,
-        577.5,
-        587.5,
-        597.5,
-        607.5,
-        617.5,
-        627.5,
-        637.5,
-        647.5,
-        657.5,
-        667.5,
-        677.5,
-        687.5,
-        697.5,
-        707.5,
-        717.5,
-        727.5,
-        737.5,
-        747.5,
-        757.5,
-        767.5,
-        777.5,
-        787.5,
-        797.5,
-        807.5,
-        817.5,
-        827.5,
-        837.5,
-        847.5,
-        857.5,
-        867.5,
-        877.5,
-        887.5,
-        897.5,
-        907.5,
-        917.5,
-        927.5,
-        937.5,
-        947.5,
-        957.5,
-        967.5,
-        977.5,
-        987.5,
-        995
-      ],
-      "negativeColumnLineNumberOffsets": [
-        0,
-        7.5,
-        17.5,
-        27.5,
-        37.5,
-        47.5,
-        57.5,
-        67.5,
-        77.5,
-        87.5,
-        97.5,
-        107.5,
-        117.5,
-        127.5,
-        137.5,
-        147.5,
-        157.5,
-        167.5,
-        177.5,
-        187.5,
-        197.5,
-        207.5,
-        217.5,
-        227.5,
-        237.5,
-        247.5,
-        257.5,
-        267.5,
-        277.5,
-        287.5,
-        297.5,
-        307.5,
-        317.5,
-        327.5,
-        337.5,
-        347.5,
-        357.5,
-        367.5,
-        377.5,
-        387.5,
-        397.5,
-        407.5,
-        417.5,
-        427.5,
-        437.5,
-        447.5,
-        457.5,
-        467.5,
-        477.5,
-        487.5,
-        497.5,
-        507.5,
-        517.5,
-        527.5,
-        537.5,
-        547.5,
-        557.5,
-        567.5,
-        577.5,
-        587.5,
-        597.5,
-        607.5,
-        617.5,
-        627.5,
-        637.5,
-        647.5,
-        657.5,
-        667.5,
-        677.5,
-        687.5,
-        697.5,
-        707.5,
-        717.5,
-        727.5,
-        737.5,
-        747.5,
-        757.5,
-        767.5,
-        777.5,
-        787.5,
-        797.5,
-        807.5,
-        817.5,
-        827.5,
-        837.5,
-        847.5,
-        857.5,
-        867.5,
-        877.5,
-        887.5,
-        897.5,
-        907.5,
-        917.5,
-        927.5,
-        937.5,
-        947.5,
-        957.5,
-        967.5,
-        977.5,
-        987.5,
-        995
-      ],
       "negativeRowLineNumberPositions": [
         {
           "x": 1003,
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-line-names-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-line-names-expected.txt
index 817c27f0..c4c7b32 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-line-names-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-line-names-expected.txt
@@ -301,19 +301,6 @@
         830,
         "Z"
       ],
-      "positiveRowLineNumberOffsets": [
-        0,
-        205,
-        415,
-        625,
-        830
-      ],
-      "positiveColumnLineNumberOffsets": [
-        0,
-        105,
-        615,
-        640
-      ],
       "positiveRowLineNumberPositions": [
         {
           "x": 0,
@@ -354,19 +341,6 @@
           "y": 0
         }
       ],
-      "negativeRowLineNumberOffsets": [
-        0,
-        205,
-        415,
-        625,
-        830
-      ],
-      "negativeColumnLineNumberOffsets": [
-        0,
-        105,
-        615,
-        640
-      ],
       "negativeRowLineNumberPositions": [
         {
           "x": 640,
@@ -412,82 +386,69 @@
         {
           "x": 0,
           "y": 205,
-          "name": "article",
-          "offset": 205
+          "name": "article"
         },
         {
           "x": 0,
           "y": 0,
-          "name": "header",
-          "offset": 0
+          "name": "header"
         },
         {
           "x": 0,
           "y": 205,
-          "name": "main",
-          "offset": 205
+          "name": "main"
         },
         {
           "x": 0,
           "y": 830,
-          "name": "end",
-          "offset": 830
+          "name": "end"
         },
         {
           "x": 0,
           "y": 205,
-          "name": "section",
-          "offset": 205
+          "name": "section"
         },
         {
           "x": 0,
           "y": 415,
-          "name": "section",
-          "offset": 415
+          "name": "section"
         },
         {
           "x": 0,
           "y": 625,
-          "name": "section",
-          "offset": 625
+          "name": "section"
         },
         {
           "x": 0,
           "y": 205,
-          "name": "images",
-          "offset": 205
+          "name": "images"
         }
       ],
       "columnLineNameOffsets": [
         {
           "x": 105,
           "y": 0,
-          "name": "header",
-          "offset": 105
+          "name": "header"
         },
         {
           "x": 105,
           "y": 0,
-          "name": "content-start",
-          "offset": 105
+          "name": "content-start"
         },
         {
           "x": 640,
           "y": 0,
-          "name": "fullpage-end",
-          "offset": 640
+          "name": "fullpage-end"
         },
         {
           "x": 0,
           "y": 0,
-          "name": "fullpage-start",
-          "offset": 0
+          "name": "fullpage-start"
         },
         {
           "x": 615,
           "y": 0,
-          "name": "content-end",
-          "offset": 615
+          "name": "content-end"
         }
       ],
       "gridBorder": [
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-huge-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-huge-expected.txt
index 6a0d341..f89da30 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-huge-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-huge-expected.txt
@@ -6190,212 +6190,6 @@
         1003,
         "Z"
       ],
-      "positiveRowLineNumberOffsets": [
-        0,
-        7.5,
-        17.5,
-        27.5,
-        37.5,
-        47.5,
-        57.5,
-        67.5,
-        77.5,
-        87.5,
-        97.5,
-        107.5,
-        117.5,
-        127.5,
-        137.5,
-        147.5,
-        157.5,
-        167.5,
-        177.5,
-        187.5,
-        197.5,
-        207.5,
-        217.5,
-        227.5,
-        237.5,
-        247.5,
-        257.5,
-        267.5,
-        277.5,
-        287.5,
-        297.5,
-        307.5,
-        317.5,
-        327.5,
-        337.5,
-        347.5,
-        357.5,
-        367.5,
-        377.5,
-        387.5,
-        397.5,
-        407.5,
-        417.5,
-        427.5,
-        437.5,
-        447.5,
-        457.5,
-        467.5,
-        477.5,
-        487.5,
-        497.5,
-        507.5,
-        517.5,
-        527.5,
-        537.5,
-        547.5,
-        557.5,
-        567.5,
-        577.5,
-        587.5,
-        597.5,
-        607.5,
-        617.5,
-        627.5,
-        637.5,
-        647.5,
-        657.5,
-        667.5,
-        677.5,
-        687.5,
-        697.5,
-        707.5,
-        717.5,
-        727.5,
-        737.5,
-        747.5,
-        757.5,
-        767.5,
-        777.5,
-        787.5,
-        797.5,
-        807.5,
-        817.5,
-        827.5,
-        837.5,
-        847.5,
-        857.5,
-        867.5,
-        877.5,
-        887.5,
-        897.5,
-        907.5,
-        917.5,
-        927.5,
-        937.5,
-        947.5,
-        957.5,
-        967.5,
-        977.5,
-        987.5,
-        995
-      ],
-      "positiveColumnLineNumberOffsets": [
-        0,
-        7.5,
-        17.5,
-        27.5,
-        37.5,
-        47.5,
-        57.5,
-        67.5,
-        77.5,
-        87.5,
-        97.5,
-        107.5,
-        117.5,
-        127.5,
-        137.5,
-        147.5,
-        157.5,
-        167.5,
-        177.5,
-        187.5,
-        197.5,
-        207.5,
-        217.5,
-        227.5,
-        237.5,
-        247.5,
-        257.5,
-        267.5,
-        277.5,
-        287.5,
-        297.5,
-        307.5,
-        317.5,
-        327.5,
-        337.5,
-        347.5,
-        357.5,
-        367.5,
-        377.5,
-        387.5,
-        397.5,
-        407.5,
-        417.5,
-        427.5,
-        437.5,
-        447.5,
-        457.5,
-        467.5,
-        477.5,
-        487.5,
-        497.5,
-        507.5,
-        517.5,
-        527.5,
-        537.5,
-        547.5,
-        557.5,
-        567.5,
-        577.5,
-        587.5,
-        597.5,
-        607.5,
-        617.5,
-        627.5,
-        637.5,
-        647.5,
-        657.5,
-        667.5,
-        677.5,
-        687.5,
-        697.5,
-        707.5,
-        717.5,
-        727.5,
-        737.5,
-        747.5,
-        757.5,
-        767.5,
-        777.5,
-        787.5,
-        797.5,
-        807.5,
-        817.5,
-        827.5,
-        837.5,
-        847.5,
-        857.5,
-        867.5,
-        877.5,
-        887.5,
-        897.5,
-        907.5,
-        917.5,
-        927.5,
-        937.5,
-        947.5,
-        957.5,
-        967.5,
-        977.5,
-        987.5,
-        995
-      ],
       "positiveRowLineNumberPositions": [
         {
           "x": 8,
@@ -7208,212 +7002,6 @@
           "y": 8
         }
       ],
-      "negativeRowLineNumberOffsets": [
-        0,
-        7.5,
-        17.5,
-        27.5,
-        37.5,
-        47.5,
-        57.5,
-        67.5,
-        77.5,
-        87.5,
-        97.5,
-        107.5,
-        117.5,
-        127.5,
-        137.5,
-        147.5,
-        157.5,
-        167.5,
-        177.5,
-        187.5,
-        197.5,
-        207.5,
-        217.5,
-        227.5,
-        237.5,
-        247.5,
-        257.5,
-        267.5,
-        277.5,
-        287.5,
-        297.5,
-        307.5,
-        317.5,
-        327.5,
-        337.5,
-        347.5,
-        357.5,
-        367.5,
-        377.5,
-        387.5,
-        397.5,
-        407.5,
-        417.5,
-        427.5,
-        437.5,
-        447.5,
-        457.5,
-        467.5,
-        477.5,
-        487.5,
-        497.5,
-        507.5,
-        517.5,
-        527.5,
-        537.5,
-        547.5,
-        557.5,
-        567.5,
-        577.5,
-        587.5,
-        597.5,
-        607.5,
-        617.5,
-        627.5,
-        637.5,
-        647.5,
-        657.5,
-        667.5,
-        677.5,
-        687.5,
-        697.5,
-        707.5,
-        717.5,
-        727.5,
-        737.5,
-        747.5,
-        757.5,
-        767.5,
-        777.5,
-        787.5,
-        797.5,
-        807.5,
-        817.5,
-        827.5,
-        837.5,
-        847.5,
-        857.5,
-        867.5,
-        877.5,
-        887.5,
-        897.5,
-        907.5,
-        917.5,
-        927.5,
-        937.5,
-        947.5,
-        957.5,
-        967.5,
-        977.5,
-        987.5,
-        995
-      ],
-      "negativeColumnLineNumberOffsets": [
-        0,
-        7.5,
-        17.5,
-        27.5,
-        37.5,
-        47.5,
-        57.5,
-        67.5,
-        77.5,
-        87.5,
-        97.5,
-        107.5,
-        117.5,
-        127.5,
-        137.5,
-        147.5,
-        157.5,
-        167.5,
-        177.5,
-        187.5,
-        197.5,
-        207.5,
-        217.5,
-        227.5,
-        237.5,
-        247.5,
-        257.5,
-        267.5,
-        277.5,
-        287.5,
-        297.5,
-        307.5,
-        317.5,
-        327.5,
-        337.5,
-        347.5,
-        357.5,
-        367.5,
-        377.5,
-        387.5,
-        397.5,
-        407.5,
-        417.5,
-        427.5,
-        437.5,
-        447.5,
-        457.5,
-        467.5,
-        477.5,
-        487.5,
-        497.5,
-        507.5,
-        517.5,
-        527.5,
-        537.5,
-        547.5,
-        557.5,
-        567.5,
-        577.5,
-        587.5,
-        597.5,
-        607.5,
-        617.5,
-        627.5,
-        637.5,
-        647.5,
-        657.5,
-        667.5,
-        677.5,
-        687.5,
-        697.5,
-        707.5,
-        717.5,
-        727.5,
-        737.5,
-        747.5,
-        757.5,
-        767.5,
-        777.5,
-        787.5,
-        797.5,
-        807.5,
-        817.5,
-        827.5,
-        837.5,
-        847.5,
-        857.5,
-        867.5,
-        877.5,
-        887.5,
-        897.5,
-        907.5,
-        917.5,
-        927.5,
-        937.5,
-        947.5,
-        957.5,
-        967.5,
-        977.5,
-        987.5,
-        995
-      ],
       "negativeRowLineNumberPositions": [
         {
           "x": 1003,
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-multiple-css-grid-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-multiple-css-grid-expected.txt
index 237aeb6..7e17d144 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-multiple-css-grid-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-multiple-css-grid-expected.txt
@@ -112,16 +112,6 @@
         358,
         "Z"
       ],
-      "positiveRowLineNumberOffsets": [
-        0,
-        32.5,
-        65
-      ],
-      "positiveColumnLineNumberOffsets": [
-        0,
-        62.5,
-        275
-      ],
       "positiveRowLineNumberPositions": [
         {
           "x": 173,
@@ -150,14 +140,6 @@
           "y": 133
         }
       ],
-      "negativeRowLineNumberOffsets": [
-        0
-      ],
-      "negativeColumnLineNumberOffsets": [
-        0,
-        62.5,
-        275
-      ],
       "negativeRowLineNumberPositions": [
         {
           "x": 173,
@@ -326,16 +308,6 @@
         1158,
         "Z"
       ],
-      "positiveRowLineNumberOffsets": [
-        0,
-        110,
-        220
-      ],
-      "positiveColumnLineNumberOffsets": [
-        0,
-        75,
-        1300
-      ],
       "positiveRowLineNumberPositions": [
         {
           "x": 108,
@@ -364,14 +336,6 @@
           "y": -92
         }
       ],
-      "negativeRowLineNumberOffsets": [
-        0
-      ],
-      "negativeColumnLineNumberOffsets": [
-        0,
-        75,
-        1300
-      ],
       "negativeRowLineNumberPositions": [
         {
           "x": 108,
diff --git a/third_party/tint/README.chromium b/third_party/tint/README.chromium
index ad7d782..e13c7f2 100644
--- a/third_party/tint/README.chromium
+++ b/third_party/tint/README.chromium
@@ -2,7 +2,7 @@
 Short Name: tint
 URL: https://dawn.googlesource.com/tint
 Version: 0
-Revision: 88f0ae369fef96b6118e1c99a8e97f9ff0a79e8f
+Revision: f18d737b4e9318a1817126852edb6cc596ff1f5e
 License: Apache 2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 7247cf7f..0967d30 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -3399,6 +3399,7 @@
   <int value="18" label="App started from Kiosk Next Home"/>
   <int value="19" label="Interaction with gamepad"/>
   <int value="20" label="App started from URL in the Omnibox"/>
+  <int value="21" label="App started from sharesheet"/>
 </enum>
 
 <enum name="ArcVideoDecodeAcceleratorResult">
@@ -21352,6 +21353,8 @@
   <int value="759" label="NoteTakingAppsLockScreenAllowlist"/>
   <int value="760" label="CCTToSDialogEnabled"/>
   <int value="761" label="NearbyShareAllowed"/>
+  <int value="762" label="PerAppTimeLimitsAllowlist"/>
+  <int value="763" label="DeviceShowLowDiskSpaceNotification"/>
 </enum>
 
 <enum name="EnterprisePolicyDeviceIdValidity">
@@ -63098,6 +63101,11 @@
   <int value="7" label="NO_CONTEXT_ERROR"/>
 </enum>
 
+<enum name="ServiceWorkerInternalsLinkQuery">
+  <int value="0" label="Accessed from DevTools"/>
+  <int value="1" label="Accessed from outside DevTools"/>
+</enum>
+
 <enum name="ServiceWorkerMainResourceRequestDestination">
   <obsolete>
     Not used since November 2018
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index b3e1b0ea..b053341 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -18232,7 +18232,7 @@
 </histogram>
 
 <histogram name="BackgroundSync.Wakeup.DelayTime" units="ms"
-    expires_after="2020-08-31">
+    expires_after="2021-07-31">
   <owner>nator@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <owner>rayankans@chromium.org</owner>
@@ -39340,7 +39340,7 @@
 </histogram>
 
 <histogram name="DevTools.ActionTaken" enum="DevToolsAction"
-    expires_after="M85">
+    expires_after="2021-07-31">
   <owner>alph@chromium.org</owner>
   <owner>yangguo@chromium.org</owner>
   <owner>bmeurer@chromium.org</owner>
@@ -39432,7 +39432,7 @@
   </summary>
 </histogram>
 
-<histogram name="DevTools.InspectElement" units="ms" expires_after="M85">
+<histogram name="DevTools.InspectElement" units="ms" expires_after="2021-07-31">
   <owner>alph@chromium.org</owner>
   <owner>yangguo@chromium.org</owner>
   <owner>bmeurer@chromium.org</owner>
@@ -39491,7 +39491,8 @@
   <summary>Specified DevTools panel was closed.</summary>
 </histogram>
 
-<histogram name="DevTools.PanelShown" enum="DevToolsPanel" expires_after="M85">
+<histogram name="DevTools.PanelShown" enum="DevToolsPanel"
+    expires_after="2021-07-31">
   <owner>alph@chromium.org</owner>
   <owner>yangguo@chromium.org</owner>
   <owner>bmeurer@chromium.org</owner>
@@ -39499,7 +39500,7 @@
 </histogram>
 
 <histogram name="DevTools.SettingChanged" enum="DevToolsSetting"
-    expires_after="M85">
+    expires_after="2021-07-31">
   <owner>alph@chromium.org</owner>
   <owner>yangguo@chromium.org</owner>
   <owner>bmeurer@chromium.org</owner>
@@ -70672,6 +70673,16 @@
   </summary>
 </histogram>
 
+<histogram name="InputMethod.Assistive.TimeToAccept.PersonalInfo" units="ms"
+    expires_after="2021-01-01">
+  <owner>jiwan@google.com</owner>
+  <owner>essential-inputs-team@google.com</owner>
+  <summary>
+    The duration from when personal info suggestions show up to when users
+    accept a suggestion. Recorded when users accept the suggestion.
+  </summary>
+</histogram>
+
 <histogram name="InputMethod.Assistive.TimeToDismiss.Emoji" units="ms"
     expires_after="2021-01-01">
   <owner>myy@google.com</owner>
@@ -70682,6 +70693,16 @@
   </summary>
 </histogram>
 
+<histogram name="InputMethod.Assistive.TimeToDismiss.PersonalInfo" units="ms"
+    expires_after="2021-01-01">
+  <owner>jiwan@google.com</owner>
+  <owner>essential-inputs-team@google.com</owner>
+  <summary>
+    The duration from when personal info suggestions show up to when users
+    dismiss a suggestion. Recorded when users dismiss the suggestion.
+  </summary>
+</histogram>
+
 <histogram name="InputMethod.Assistive.UserPref.Emoji" enum="BooleanEnabled"
     expires_after="2021-01-01">
   <owner>myy@google.com</owner>
@@ -158297,6 +158318,18 @@
   <summary>The result of dispatching the install event to the worker.</summary>
 </histogram>
 
+<histogram name="ServiceWorker.InternalsPageAccessed"
+    enum="ServiceWorkerInternalsLinkQuery" expires_after="M87">
+  <owner>nidhijaju@google.com</owner>
+  <owner>bashi@chromium.org</owner>
+  <summary>
+    The method that the user takes to arrive at
+    chrome://serviceworker-internals, based on the query string. Specifically,
+    it logs if a user accessed it through the DevTools link in the Application
+    Panel, or not.
+  </summary>
+</histogram>
+
 <histogram
     name="ServiceWorker.LoadTiming.MainFrame.MainResource.FetchHandlerEndToFallbackNetwork"
     units="ms" expires_after="2021-10-31">
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 57980c6c..d69c429 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -1,16 +1,16 @@
 {
     "trace_processor_shell": {
         "win": {
-            "hash": "80b5e25a6e577a2be1fc35689406db65b821a568",
-            "remote_path": "perfetto_binaries/trace_processor_shell/win/b156b016f22bbd24370ff2dc1bcc0a7b3edf7ee4/trace_processor_shell.exe"
+            "hash": "d94d3898064c776de447e27514ca76bfdd3aacef",
+            "remote_path": "perfetto_binaries/trace_processor_shell/win/23c5b63d1c68730cf0a6bb2a904dbd67f288508c/trace_processor_shell.exe"
         },
         "mac": {
-            "hash": "f2ababab87ba7a0db590374ad04a1d08325604aa",
-            "remote_path": "perfetto_binaries/trace_processor_shell/mac/b156b016f22bbd24370ff2dc1bcc0a7b3edf7ee4/trace_processor_shell"
+            "hash": "d51d9099a4c464ecc614f59d3f9ea33af095a91f",
+            "remote_path": "perfetto_binaries/trace_processor_shell/mac/23c5b63d1c68730cf0a6bb2a904dbd67f288508c/trace_processor_shell"
         },
         "linux": {
-            "hash": "1f57c64fd764e42c7fa3bd16d9313ca091d7358b",
-            "remote_path": "perfetto_binaries/trace_processor_shell/linux/7176f54720e6f5ff087e1fe6407191b5692a7aa2/trace_processor_shell"
+            "hash": "3de97a08c91a58eed6aee36f74ae49808f8a3c69",
+            "remote_path": "perfetto_binaries/trace_processor_shell/linux/23c5b63d1c68730cf0a6bb2a904dbd67f288508c/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index d3c4282..7abcd4fb 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -306,6 +306,7 @@
 crbug.com/1044956 [ android-pixel-2 ] system_health.common_mobile/background:tools:gmail:2019 [ Skip ]
 crbug.com/1098223 [ android-go android-webview ] system_health.common_mobile/load:tools:dropbox:2019 [ Skip ]
 crbug.com/1098225 [ android-go android-webview ] system_health.common_mobile/browse:news:globo:2019 [ Skip ]
+crbug.com/1112337 [ android ] system_health.common_mobile/browse:news:cricbuzz:2019 [ Skip ]
 
 # Benchmark: system_health.memory_desktop
 crbug.com/984599 [ linux ] system_health.memory_desktop/long_running:tools:gmail-foreground [ Skip ]
@@ -364,6 +365,7 @@
 crbug.com/1044956 [ android-pixel-2 ] system_health.memory_mobile/background:tools:gmail:2019 [ Skip ]
 crbug.com/1049984 [ android-go android-webview ] system_health.memory_mobile/browse:social:instagram:2019 [ Skip ]
 crbug.com/1097719 [ android-nexus-5x android-webview ] system_health.memory_mobile/browse:social:instagram:2019 [ Skip ]
+crbug.com/1112337 [ android ] system_health.memory_mobile/browse:news:cricbuzz:2019 [ Skip ]
 
 # Benchmark: tab_switching.typical_25
 crbug.com/747026 [ mac ] tab_switching.typical_25/multitab:misc:typical24 [ Skip ]
@@ -415,11 +417,13 @@
 crbug.com/1039801 [ android-go ] v8.browsing_mobile/browse:social:pinterest_infinite_scroll:2019 [ Skip ]
 crbug.com/1064284 [ android-pixel-2 ] v8.browsing_mobile/browse:social:pinterest_infinite_scroll:2019 [ Skip ]
 crbug.com/1088419 [ android-nexus-5x android-webview ] v8.browsing_mobile/browse:media:imgur:2019 [ Skip ]
+crbug.com/1112337 [ android ] v8.browsing_mobile/browse:news:cricbuzz:2019 [ Skip ]
 
 # Benchmark: v8.browsing_mobile-future
 crbug.com/1036141 [ android-webview ] v8.browsing_mobile-future/browse:shopping:lazada:2019 [ Skip ]
 crbug.com/1036143 [ android-pixel-2 ] v8.browsing_mobile-future/browse:chrome:omnibox:2019 [ Skip ]
 crbug.com/1064658 [ android ] v8.browsing_mobile-future/browse:tech:discourse_infinite_scroll:2018 [ Skip ]
+crbug.com/1112337 [ android ] v8.browsing_mobile-future/browse:news:cricbuzz:2019 [ Skip ]
 
 # Benchmark: v8.runtime_stats.top_25
 crbug.com/954229 [ mac ] v8.runtime_stats.top_25/* [ Skip ]
diff --git a/ui/accessibility/accessibility_switches.cc b/ui/accessibility/accessibility_switches.cc
index 44405f0..f7feae3 100644
--- a/ui/accessibility/accessibility_switches.cc
+++ b/ui/accessibility/accessibility_switches.cc
@@ -91,4 +91,8 @@
 #endif
 }
 
+// Optionally disable AXMenuList, which makes the internal pop-up menu
+// UI for a select element directly accessible.
+const char kDisableAXMenuList[] = "disable-ax-menu-list";
+
 }  // namespace switches
diff --git a/ui/accessibility/accessibility_switches.h b/ui/accessibility/accessibility_switches.h
index 3513a6a..add7667 100644
--- a/ui/accessibility/accessibility_switches.h
+++ b/ui/accessibility/accessibility_switches.h
@@ -52,6 +52,10 @@
 // Returns true if Switch Access point scanning is enabled.
 AX_BASE_EXPORT bool IsSwitchAccessPointScanningEnabled();
 
+// Optionally disable AXMenuList, which makes the internal pop-up menu
+// UI for a select element directly accessible.
+AX_BASE_EXPORT extern const char kDisableAXMenuList[];
+
 }  // namespace switches
 
 #endif  // UI_ACCESSIBILITY_ACCESSIBILITY_SWITCHES_H_
diff --git a/ui/base/ime/chromeos/input_method_chromeos.cc b/ui/base/ime/chromeos/input_method_chromeos.cc
index 0785b01..94fb16a 100644
--- a/ui/base/ime/chromeos/input_method_chromeos.cc
+++ b/ui/base/ime/chromeos/input_method_chromeos.cc
@@ -231,8 +231,14 @@
     composition_head = caret_rect;
   if (candidate_window)
     candidate_window->SetCursorBounds(caret_rect, composition_head);
-  if (assistive_window)
-    assistive_window->SetBounds(caret_rect);
+
+  if (assistive_window) {
+    chromeos::Bounds bounds;
+    bounds.caret = caret_rect;
+    bounds.autocorrect = client->GetAutocorrectCharacterBounds();
+    assistive_window->SetBounds(bounds);
+  }
+
   gfx::Range text_range;
   gfx::Range selection_range;
   base::string16 surrounding_text;
diff --git a/ui/base/ime/ime_assistive_window_handler_interface.h b/ui/base/ime/ime_assistive_window_handler_interface.h
index d400f29..6acb99da 100644
--- a/ui/base/ime/ime_assistive_window_handler_interface.h
+++ b/ui/base/ime/ime_assistive_window_handler_interface.h
@@ -9,10 +9,7 @@
 
 #include "base/component_export.h"
 #include "base/strings/string16.h"
-
-namespace gfx {
-class Rect;
-}  // namespace gfx
+#include "ui/gfx/geometry/rect.h"
 
 namespace ui {
 namespace ime {
@@ -25,6 +22,14 @@
 
 struct AssistiveWindowProperties;
 
+// Contains bounds for windows controlled by handler.
+struct Bounds {
+  // Position of the cursor.
+  gfx::Rect caret;
+  // Position of the autocorrect span, empty if not present.
+  gfx::Rect autocorrect;
+};
+
 // A interface to handle the assistive windows related method call.
 class COMPONENT_EXPORT(UI_BASE_IME) IMEAssistiveWindowHandlerInterface {
  public:
@@ -56,7 +61,7 @@
   virtual size_t GetConfirmedLength() const = 0;
 
   // Called when the application changes its caret bounds.
-  virtual void SetBounds(const gfx::Rect& cursor_bounds) = 0;
+  virtual void SetBounds(const Bounds& bounds) = 0;
 
   // Called when the text field's focus state is changed.
   virtual void FocusStateChanged() {}
diff --git a/ui/base/ime/mojom/text_input_state.mojom b/ui/base/ime/mojom/text_input_state.mojom
index 63746cb..d52feb42 100644
--- a/ui/base/ime/mojom/text_input_state.mojom
+++ b/ui/base/ime/mojom/text_input_state.mojom
@@ -11,6 +11,12 @@
 import "ui/gfx/geometry/mojom/geometry.mojom";
 import "ui/gfx/range/mojom/range.mojom";
 
+// This structure contains ime text span and its bounds.
+struct ImeTextSpanInfo {
+  ui.mojom.ImeTextSpan span;
+  gfx.mojom.Rect bounds;
+};
+
 // This structure represents the current editing state.
 struct TextInputState {
   // Type of the input field.
@@ -64,5 +70,8 @@
   // authors when the virtualkeyboardpolicy is manual.
   ui.mojom.VirtualKeyboardVisibilityRequest last_vk_visibility_request =
     ui.mojom.VirtualKeyboardVisibilityRequest.NONE;
+
+  // Information of ime text spans at the cursor position.
+  array<ImeTextSpanInfo> ime_text_spans_info;
 };
 
diff --git a/ui/base/x/BUILD.gn b/ui/base/x/BUILD.gn
index b98d099..c49432e9 100644
--- a/ui/base/x/BUILD.gn
+++ b/ui/base/x/BUILD.gn
@@ -74,6 +74,7 @@
     "//net",
     "//skia",
     "//ui/base:data_exchange",
+    "//ui/base:features",
     "//ui/base:hit_test",
     "//ui/base:wm_role_names",
     "//ui/base/clipboard:clipboard_types",
diff --git a/ui/base/x/x11_window.cc b/ui/base/x/x11_window.cc
index d9a1f4f..24dbb602 100644
--- a/ui/base/x/x11_window.cc
+++ b/ui/base/x/x11_window.cc
@@ -17,6 +17,7 @@
 #include "net/base/network_interfaces.h"
 #include "third_party/skia/include/core/SkRegion.h"
 #include "ui/base/hit_test_x11.h"
+#include "ui/base/ui_base_features.h"
 #include "ui/base/wm_role_names_linux.h"
 #include "ui/base/x/x11_menu_registrar.h"
 #include "ui/base/x/x11_pointer_grab.h"
@@ -216,7 +217,6 @@
   if (!activatable_ || config.override_redirect)
     req.override_redirect = x11::Bool32(true);
 
-#if !defined(USE_X11)
   // It seems like there is a difference how tests are instantiated in case of
   // non-Ozone X11 and Ozone. See more details in
   // EnableTestConfigForPlatformWindows. The reason why this must be here is
@@ -227,9 +227,8 @@
   // PlatformWindow, and non-Ozone X11 uses it, we have to add this workaround
   // here. Otherwise, tests for non-Ozone X11 fail.
   // TODO(msisov): figure out usage of this for non-Ozone X11.
-  if (UseTestConfigForPlatformWindows())
+  if (features::IsUsingOzonePlatform() && UseTestConfigForPlatformWindows())
     req.override_redirect = x11::Bool32(true);
-#endif
 
   override_redirect_ = req.override_redirect.has_value();
 
diff --git a/ui/events/BUILD.gn b/ui/events/BUILD.gn
index 19914b0..c933b0d4 100644
--- a/ui/events/BUILD.gn
+++ b/ui/events/BUILD.gn
@@ -621,14 +621,6 @@
       data_deps = [ "//third_party/mesa_headers" ]
     }
 
-    if (use_x11) {
-      sources += [ "devices/x11/device_data_manager_x11_unittest.cc" ]
-      deps += [
-        "//ui/events/devices/x11",
-        "//ui/events/x:unittests",
-      ]
-    }
-
     if (use_x11 || use_ozone) {
       sources += [ "devices/device_data_manager_unittest.cc" ]
     }
diff --git a/ui/events/blink/web_input_event_unittest.cc b/ui/events/blink/web_input_event_unittest.cc
index 5b7821a..e3a815473 100644
--- a/ui/events/blink/web_input_event_unittest.cc
+++ b/ui/events/blink/web_input_event_unittest.cc
@@ -10,6 +10,7 @@
 #include "base/stl_util.h"
 #include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/ui_base_features.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/events/blink/blink_event_util.h"
 #include "ui/events/event.h"
@@ -79,6 +80,9 @@
     EXPECT_EQ(static_cast<int>(DomKey::CONTROL), webkit_event.dom_key);
   }
 #if defined(USE_X11)
+  // https://crbug.com/1109112): fix this.
+  if (features::IsUsingOzonePlatform())
+    return;
   const int kLocationModifiers =
       blink::WebInputEvent::kIsLeft | blink::WebInputEvent::kIsRight;
   ScopedXI2Event xev;
@@ -104,6 +108,9 @@
 
 TEST(WebInputEventTest, TestMakeWebKeyboardEventWindowsKeyCode) {
 #if defined(USE_X11)
+  // https://crbug.com/1109112): enable this.
+  if (features::IsUsingOzonePlatform())
+    return;
   ScopedXI2Event xev;
   {
     // Press left Ctrl.
@@ -213,6 +220,9 @@
         << "}, expect: " << test_case.expected_result;
   }
 #if defined(USE_X11)
+  // https://crbug.com/1109112): fix this.
+  if (features::IsUsingOzonePlatform())
+    return;
   ScopedXI2Event xev;
   for (size_t i = 0; i < base::size(kTesCases); ++i) {
     const TestCase& test_case = kTesCases[i];
diff --git a/ui/events/x/BUILD.gn b/ui/events/x/BUILD.gn
index 526b2d7..2abef26 100644
--- a/ui/events/x/BUILD.gn
+++ b/ui/events/x/BUILD.gn
@@ -29,28 +29,3 @@
     "//ui/gfx/x",
   ]
 }
-
-# XEvent translation tests are kept in a separate source_set so that both
-# ozone_x11_unittests and aura/x11 events_unittests can depend on it.
-# TODO(crbug.com/789065): Move this completely into ozone/x11 unit tests once
-# X11 migration to Ozone is complete.
-source_set("unittests") {
-  testonly = true
-  visibility = [
-    "//ui/events:events_unittests",
-    "//ui/ozone/platform/x11:x11_unittests",
-  ]
-  sources = [
-    "events_x_unittest.cc",
-    "x11_event_translation_unittest.cc",
-  ]
-  deps = [
-    "//base/test:test_support",
-    "//testing/gtest",
-    "//ui/base:features",
-    "//ui/events:test_support",
-    "//ui/events/devices/x11",
-    "//ui/events/x:x",
-    "//ui/gfx/x",
-  ]
-}
diff --git a/ui/ozone/platform/x11/BUILD.gn b/ui/ozone/platform/x11/BUILD.gn
index 35b64eb..3845ba0 100644
--- a/ui/ozone/platform/x11/BUILD.gn
+++ b/ui/ozone/platform/x11/BUILD.gn
@@ -102,7 +102,6 @@
     "//ui/events:test_support",
     "//ui/events/devices/x11",
     "//ui/events/platform/x11",
-    "//ui/events/x:unittests",
     "//ui/ozone:platform",
     "//ui/ozone:test_support",
     "//ui/ozone/common",
diff --git a/ui/platform_window/x11/BUILD.gn b/ui/platform_window/x11/BUILD.gn
index a9d6bc3..278a9a30 100644
--- a/ui/platform_window/x11/BUILD.gn
+++ b/ui/platform_window/x11/BUILD.gn
@@ -52,7 +52,12 @@
 }
 
 test("x11_unittests") {
-  sources = [ "test/x11_window_unittest.cc" ]
+  sources = [
+    "test/device_data_manager_x11_unittest.cc",
+    "test/events_x_unittest.cc",
+    "test/x11_event_translation_unittest.cc",
+    "test/x11_window_unittest.cc",
+  ]
   deps = [
     ":x11",
     "//base/test:run_all_unittests",
@@ -60,6 +65,7 @@
     "//skia",
     "//testing/gmock",
     "//testing/gtest",
+    "//ui/base:features",
     "//ui/base/x",
     "//ui/base/x:test_support",
     "//ui/events:test_support",
diff --git a/ui/events/devices/x11/device_data_manager_x11_unittest.cc b/ui/platform_window/x11/test/device_data_manager_x11_unittest.cc
similarity index 100%
rename from ui/events/devices/x11/device_data_manager_x11_unittest.cc
rename to ui/platform_window/x11/test/device_data_manager_x11_unittest.cc
diff --git a/ui/events/x/events_x_unittest.cc b/ui/platform_window/x11/test/events_x_unittest.cc
similarity index 100%
rename from ui/events/x/events_x_unittest.cc
rename to ui/platform_window/x11/test/events_x_unittest.cc
diff --git a/ui/events/x/x11_event_translation_unittest.cc b/ui/platform_window/x11/test/x11_event_translation_unittest.cc
similarity index 100%
rename from ui/events/x/x11_event_translation_unittest.cc
rename to ui/platform_window/x11/test/x11_event_translation_unittest.cc
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index 29ebfd2..aa28399 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -1097,6 +1097,7 @@
     "focus/focus_traversal_unittest.cc",
     "layout/animating_layout_manager_unittest.cc",
     "layout/box_layout_unittest.cc",
+    "layout/composite_layout_tests.cc",
     "layout/fill_layout_unittest.cc",
     "layout/flex_layout_unittest.cc",
     "layout/grid_layout_unittest.cc",
diff --git a/ui/views/layout/animating_layout_manager.cc b/ui/views/layout/animating_layout_manager.cc
index d436f28d..d07358e 100644
--- a/ui/views/layout/animating_layout_manager.cc
+++ b/ui/views/layout/animating_layout_manager.cc
@@ -54,6 +54,27 @@
   kContinuingFade
 };
 
+// Makes a copy of the given layout with only visible child views (non-visible
+// children are omitted).
+ProposedLayout WithOnlyVisibleViews(const ProposedLayout layout) {
+  ProposedLayout result;
+  result.host_size = layout.host_size;
+  std::copy_if(
+      layout.child_layouts.begin(), layout.child_layouts.end(),
+      std::back_inserter(result.child_layouts),
+      [](const ChildLayout& child_layout) { return child_layout.visible; });
+  return result;
+}
+
+// Returns true if the two proposed layouts have the same visible views, with
+// the same parameters, in the same order.
+bool HaveSameVisibleViews(const ProposedLayout& l1, const ProposedLayout& l2) {
+  // There is an approach that uses nested loops and dual iterators that is more
+  // efficient than copying, but since this method is only currently called when
+  // views are added to the layout, clarity is more important than speed.
+  return WithOnlyVisibleViews(l1) == WithOnlyVisibleViews(l2);
+}
+
 }  // namespace
 
 // Holds data about a view that is fading in or out as part of an animation.
@@ -107,6 +128,11 @@
   // invalidating the host to make sure the layout is up to date.
   void MakeReadyForAnimation();
 
+  // Overrides the default animation container with |container|.
+  void SetAnimationContainerForTesting(gfx::AnimationContainer* container) {
+    animation_->SetContainer(container);
+  }
+
  private:
   // Observer used to watch for the host view being parented to a widget.
   class ViewWidgetObserver : public ViewObserver {
@@ -273,6 +299,17 @@
     return;
   }
 
+  // This handles a case where we are in the middle of an animation where we
+  // would have hidden the target view, but haven't hit Layout() yet, so haven't
+  // actually hidden it yet. Because we plan fade-outs off of the current layout
+  // if the view the child view is visible it will not get a proper fade-out and
+  // will remain visible but not properly laid out. We remedy this by hiding the
+  // view immediately.
+  const ChildLayout* const current_layout =
+      FindChildViewInLayout(current_layout_, child_view);
+  if ((!current_layout || !current_layout->visible) && child_view->GetVisible())
+    SetViewVisibility(child_view, false);
+
   // Indicate that the view should become hidden in the layout without
   // immediately changing its visibility. Instead, this triggers an animation
   // which results in the view being hidden.
@@ -462,6 +499,24 @@
   animation_delegate_ = std::make_unique<AnimationDelegate>(this);
 }
 
+bool AnimatingLayoutManager::OnViewAdded(View* host, View* view) {
+  // Handle a case where we add a visible view that shouldn't be visible in the
+  // layout. In this case, there is no animation, no invalidation, and we just
+  // set the view to not be visible.
+  if (view->GetVisible() && cached_layout_size() && !is_animating_) {
+    const gfx::Size target_size = GetAvailableTargetLayoutSize();
+    ProposedLayout proposed_layout =
+        target_layout_manager()->GetProposedLayout(target_size);
+    if (HaveSameVisibleViews(current_layout_, proposed_layout)) {
+      SetViewVisibility(view, false);
+      current_layout_ = target_layout_ = proposed_layout;
+      return false;
+    }
+  }
+
+  return RecalculateTarget();
+}
+
 void AnimatingLayoutManager::OnLayoutChanged() {
   // This replaces the normal behavior of clearing cached layouts.
   RecalculateTarget();
@@ -585,6 +640,7 @@
   // start or update an animation.
   const ProposedLayout proposed_layout =
       target_layout_manager()->GetProposedLayout(target_size);
+
   if (target_layout_ == proposed_layout)
     return false;
 
@@ -605,6 +661,11 @@
     // child views' visibility changing.)
     starting_layout_ = current_layout_;
     starting_offset_ = current_offset_;
+  } else if (starting_layout_ == target_layout_) {
+    // If we initiated but did not show any frames of an animation, and we are
+    // redirected to our starting layout then just reset the layout.
+    ResetLayoutToSize(target_size);
+    return false;
   }
   CalculateFadeInfos();
   UpdateCurrentLayout(0.0);
diff --git a/ui/views/layout/animating_layout_manager.h b/ui/views/layout/animating_layout_manager.h
index 70561eb..cbc7574 100644
--- a/ui/views/layout/animating_layout_manager.h
+++ b/ui/views/layout/animating_layout_manager.h
@@ -202,11 +202,20 @@
   // widget).
   void EnableAnimationForTesting();
 
+  const ProposedLayout& starting_layout_for_testing() const {
+    return starting_layout_;
+  }
+
+  const ProposedLayout& target_layout_for_testing() const {
+    return target_layout_;
+  }
+
  protected:
   // LayoutManagerBase:
   ProposedLayout CalculateProposedLayout(
       const SizeBounds& size_bounds) const override;
   void OnInstalled(View* host) override;
+  bool OnViewAdded(View* host, View* view) override;
   void OnLayoutChanged() override;
   void LayoutImpl() override;
 
diff --git a/ui/views/layout/composite_layout_tests.cc b/ui/views/layout/composite_layout_tests.cc
new file mode 100644
index 0000000..061d0cc
--- /dev/null
+++ b/ui/views/layout/composite_layout_tests.cc
@@ -0,0 +1,1053 @@
+// Copyright (c) 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <memory>
+
+#include "base/test/task_environment.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/animation/animation_container.h"
+#include "ui/gfx/animation/animation_test_api.h"
+#include "ui/gfx/geometry/point.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/views/layout/animating_layout_manager.h"
+#include "ui/views/layout/flex_layout.h"
+#include "ui/views/test/test_views.h"
+#include "ui/views/view.h"
+#include "ui/views/view_class_properties.h"
+#include "ui/views/widget/widget.h"
+
+// This test suite simulates the kind of nested layouts we find in e.g. the
+// toolbar without actually pulling in browser code. It's designed to test
+// interactions between multiple levels of Flex and Animating layouts, in a
+// situation that resembles how they are actually used.
+//
+// The test cases are designed to probe edge cases and interactions that are
+// difficult to simulate in either the FlexLayout or AnimatingLayoutManager unit
+// tests. They are not browser tests however, and uses TaskEnvironment and
+// AnimationContainerTestApi to step animations rather than running them in
+// realtime. This makes these tests as quick as unit tests, so they do not incur
+// the costs associated with browser tests.
+//
+// This suite is part of views_unittests.
+
+namespace views {
+
+namespace {
+
+constexpr base::TimeDelta kDefaultAnimationDuration =
+    base::TimeDelta::FromSeconds(1);
+constexpr int kIconDimension = 20;
+constexpr gfx::Size kIconSize(kIconDimension, kIconDimension);
+constexpr int kLabelWidth = 70;
+constexpr gfx::Size kLabelSize(kLabelWidth, kIconDimension);
+constexpr int kBarMinimumWidth = 70;
+constexpr int kBarPreferredWidth = 200;
+constexpr gfx::Size kBarMinimumSize(kBarMinimumWidth, kIconDimension);
+constexpr gfx::Size kBarPreferredSize(kBarPreferredWidth, kIconDimension);
+constexpr gfx::Size kDefaultToolbarSize(400, kIconDimension);
+
+// Base class for elements in the toolbar that animate; a stand-in for e.g.
+// ToolbarIconContainer.
+class SimulatedToolbarElement : public View {
+ public:
+  AnimatingLayoutManager* layout() {
+    return static_cast<AnimatingLayoutManager*>(GetLayoutManager());
+  }
+  const AnimatingLayoutManager* layout() const {
+    return static_cast<const AnimatingLayoutManager*>(GetLayoutManager());
+  }
+
+ protected:
+  SimulatedToolbarElement() {
+    auto* const animating_layout =
+        SetLayoutManager(std::make_unique<AnimatingLayoutManager>());
+    animating_layout
+        ->SetBoundsAnimationMode(
+            AnimatingLayoutManager::BoundsAnimationMode::kAnimateMainAxis)
+        .SetOrientation(LayoutOrientation::kHorizontal)
+        .SetAnimationDuration(kDefaultAnimationDuration);
+    animating_layout->SetTargetLayoutManager(std::make_unique<FlexLayout>())
+        ->SetOrientation(LayoutOrientation::kHorizontal);
+  }
+
+  void SetAnimationDuration(base::TimeDelta animation_duration) {
+    layout()->SetAnimationDuration(animation_duration);
+  }
+
+  FlexLayout* target_layout() {
+    return static_cast<FlexLayout*>(layout()->target_layout_manager());
+  }
+};
+
+// Simulates an avatar button on the Chrome toolbar, with a fixed-size icon and
+// a label that can animate in and out.
+class SimulatedAvatarButton : public SimulatedToolbarElement {
+ public:
+  SimulatedAvatarButton() {
+    AddChildView(std::make_unique<StaticSizedView>(kIconSize));
+    auto* const status =
+        AddChildView(std::make_unique<StaticSizedView>(kLabelSize));
+    status->SetVisible(false);
+    layout()->SetDefaultFadeMode(
+        AnimatingLayoutManager::FadeInOutMode::kScaleFromZero);
+  }
+
+  ~SimulatedAvatarButton() override = default;
+
+  void FadeLabelIn() {
+    layout()->FadeIn(label());
+    showing_label_ = true;
+  }
+
+  void FadeLabelOut() {
+    layout()->FadeOut(label());
+    showing_label_ = false;
+  }
+
+  // Verifies that the label appears (or does not appear) directly to the right
+  // of the avatar icon, and fills available remaining space in this view. If
+  // the view is not animating, ensures that the label appears (or does not
+  // appear) at the exact size and position it should.
+  void EnsureLayout() const {
+    EXPECT_EQ(gfx::Rect(gfx::Point(), kIconSize), icon()->bounds());
+    if (layout()->is_animating()) {
+      if (label()->GetVisible()) {
+        EXPECT_EQ(0, label()->y());
+        EXPECT_EQ(kIconDimension, label()->height());
+        // TODO(dfried): eliminate potential for rounding error here. Currently
+        // it is possible for the left side of the label to round up a pixel
+        // when it is shrinking down due to how interpolation works, so we need
+        // to account for that in determining if the current state is valid.
+        EXPECT_GE(label()->x(), kIconDimension);
+        EXPECT_LE(label()->x(), kIconDimension + 1);
+        EXPECT_EQ(label()->width(), width() - label()->x());
+      }
+    } else if (showing_label_) {
+      EXPECT_TRUE(label()->GetVisible());
+      EXPECT_EQ(gfx::Rect(gfx::Point(kIconDimension, 0), kLabelSize),
+                label()->bounds());
+    } else {
+      EXPECT_FALSE(label()->GetVisible());
+    }
+  }
+
+ private:
+  // views::View:
+  const char* GetClassName() const override { return "SimulatedAvatarButton"; }
+
+  View* icon() { return children()[0]; }
+  const View* icon() const { return children()[0]; }
+  View* label() { return children()[1]; }
+  const View* label() const { return children()[1]; }
+  bool showing_label_ = false;
+};
+
+// Simulates extensions buttons in the new toolbar extensions view, with a fixed
+// button on the right and buttons to the left that can animate in and out and
+// be hidden if there is insufficient space.
+class SimulatedExtensionsContainer : public SimulatedToolbarElement {
+ public:
+  SimulatedExtensionsContainer() {
+    auto* const main_button =
+        AddChildView(std::make_unique<StaticSizedView>(kIconSize));
+    main_button->SetProperty(kFlexBehaviorKey, FlexSpecification());
+    layout()->SetDefaultFadeMode(
+        AnimatingLayoutManager::FadeInOutMode::kSlideFromTrailingEdge);
+    target_layout()
+        ->SetFlexAllocationOrder(FlexAllocationOrder::kReverse)
+        .SetDefault(
+            kFlexBehaviorKey,
+            FlexSpecification(LayoutOrientation::kHorizontal,
+                              MinimumFlexSizeRule::kPreferredSnapToZero));
+  }
+
+  ~SimulatedExtensionsContainer() override = default;
+
+  void AddIcons(std::vector<bool> visibility) {
+    int insertion_point = children().size() - 1;
+    for (bool visible : visibility)
+      AddIconAt(insertion_point++, visible);
+  }
+
+  void AddIconAt(int position, bool initially_visible) {
+    DCHECK_GE(position, 0);
+    DCHECK_LT(position, int{children().size()});
+    auto new_child = std::make_unique<StaticSizedView>(kIconSize);
+    new_child->SetVisible(initially_visible);
+    if (initially_visible)
+      visible_views_.insert(new_child.get());
+    AddChildViewAt(std::move(new_child), position);
+  }
+
+  void RemoveIconAt(int position) {
+    DCHECK_GE(position, 0);
+    DCHECK_LT(position, int{children().size()} - 1);
+    visible_views_.erase(RemoveChildViewT<View>(children()[position]).get());
+  }
+
+  void SetIconVisibility(int position, bool visible) {
+    DCHECK_GE(position, 0);
+    DCHECK_LT(position, int{children().size()} - 1);
+    auto* const button = children()[position];
+    if (visible) {
+      layout()->FadeIn(button);
+      visible_views_.insert(button);
+    } else {
+      layout()->FadeOut(button);
+      visible_views_.erase(button);
+    }
+  }
+
+  void MoveIcon(int from, int to) {
+    DCHECK_GE(from, 0);
+    DCHECK_GE(to, 0);
+    DCHECK_NE(from, to);
+    DCHECK_LT(from, int{children().size()} - 1);
+    DCHECK_LT(to, int{children().size()} - 1);
+    ReorderChildView(children()[from], to);
+  }
+
+  // Ensures that the extension icons appear with the size and placement and
+  // visibility expected, and that the final "extensions menu" button always
+  // appears and is flush with the right edge of the view:
+  //
+  //   |[pinned][pinned][pinned][menu]|   (unpinned extensions not visible)
+  //
+  // While animating, icons need only be the correct size and in the correct
+  // region of the view, and visible if they are going to be visible in the
+  // final layout (icons which are fading out may also be visible).
+  //
+  // If |expected_num_icons| is specified:
+  // - while animating, serves as a lower bound on the number of icons displayed
+  // - while not animating, must match the number of visible icons exactly
+  void EnsureLayout(base::Optional<int> expected_num_icons) const {
+    if (layout()->is_animating()) {
+      // For animating layouts, we ensure that icons are the correct size and
+      // appear between the left edge of the container and exactly overlapping
+      // the "extensions menu" icon (the final icon in the container).
+      const int available_width = width() - kIconDimension;
+      DCHECK_GE(available_width, 0);
+      int num_visible = 0;
+      for (int i = 0; i < int{children().size()} - 1; ++i) {
+        const View* const child = children()[i];
+        if (child->GetVisible()) {
+          ++num_visible;
+          EXPECT_GE(child->x(), 0) << " icon " << i;
+          EXPECT_LE(child->x(), available_width) << " icon " << i;
+          EXPECT_EQ(kIconSize, child->size()) << " icon " << i;
+        }
+      }
+      if (expected_num_icons.has_value())
+        EXPECT_GE(num_visible, expected_num_icons.value());
+    } else {
+      // Calculate how many icons *should* be visible given the available space.
+      SizeBounds available_size = parent()->GetAvailableSize(this);
+      int num_visible = visible_views_.size();
+      if (available_size.width().has_value()) {
+        num_visible = std::min(
+            num_visible,
+            (available_size.width().value() - kIconDimension) / kIconDimension);
+      }
+      DCHECK_LT(num_visible, int{children().size()});
+      if (expected_num_icons.has_value())
+        EXPECT_EQ(expected_num_icons.value(), num_visible);
+      // Verify that the correct icons are visible and are in the correct place
+      // with the correct size.
+      int x = 0;
+      for (int i = 0; i < int{children().size()} - 1; ++i) {
+        const View* const child = children()[i];
+        if (base::Contains(visible_views_, child)) {
+          if (num_visible > 0) {
+            --num_visible;
+            EXPECT_TRUE(child->GetVisible()) << " icon " << i;
+            EXPECT_EQ(gfx::Rect(gfx::Point(x, 0), kIconSize), child->bounds())
+                << " icon " << i;
+            x += kIconDimension;
+          } else {
+            // This is a pinned extension that overflowed the available space
+            // and therefore should be hidden.
+            EXPECT_FALSE(child->GetVisible())
+                << " icon " << i
+                << " should have been hidden; available size is "
+                << available_size.ToString();
+          }
+        } else {
+          // This icon is explicitly hidden.
+          EXPECT_FALSE(child->GetVisible()) << " icon " << i;
+        }
+      }
+    }
+    EXPECT_TRUE(main_button()->GetVisible());
+    EXPECT_EQ(kIconSize, main_button()->size());
+    EXPECT_EQ(width(), main_button()->bounds().right());
+  }
+
+ private:
+  // views::View:
+  const char* GetClassName() const override {
+    return "SimulatedExtensionsContainer";
+  }
+
+  const View* main_button() const { return children()[children().size() - 1]; }
+
+  std::set<const View*> visible_views_;
+};
+
+// Simulates a toolbar with buttons on either side, a "location bar", and mock
+// versions of the extensions container and avatar button.
+class SimulatedToolbar : public View {
+ public:
+  SimulatedToolbar() {
+    AddChildView(std::make_unique<StaticSizedView>(kIconSize));
+    auto* const bar =
+        AddChildView(std::make_unique<StaticSizedView>(kBarPreferredSize));
+    bar->set_minimum_size(kBarMinimumSize);
+    extensions_ =
+        AddChildView(std::make_unique<SimulatedExtensionsContainer>());
+    avatar_ = AddChildView(std::make_unique<SimulatedAvatarButton>());
+    AddChildView(std::make_unique<StaticSizedView>(kIconSize));
+
+    SetLayoutManager(std::make_unique<FlexLayout>())
+        ->SetOrientation(LayoutOrientation::kHorizontal);
+    avatar_->SetProperty(
+        kFlexBehaviorKey,
+        FlexSpecification(avatar_->layout()->GetDefaultFlexRule())
+            .WithOrder(1));
+    bar->SetProperty(kFlexBehaviorKey,
+                     FlexSpecification(LayoutOrientation::kHorizontal,
+                                       MinimumFlexSizeRule::kScaleToMinimum,
+                                       MaximumFlexSizeRule::kUnbounded)
+                         .WithOrder(2));
+    extensions_->SetProperty(
+        kFlexBehaviorKey,
+        FlexSpecification(extensions_->layout()->GetDefaultFlexRule())
+            .WithOrder(3));
+  }
+
+  SimulatedExtensionsContainer* extensions() { return extensions_; }
+  const SimulatedExtensionsContainer* extensions() const { return extensions_; }
+  SimulatedAvatarButton* avatar() { return avatar_; }
+  const SimulatedAvatarButton* avatar() const { return avatar_; }
+  View* location() { return children()[1]; }
+  const View* location() const { return children()[1]; }
+
+  // Ensures the layout of the toolbar which contains:
+  // - one dummy back/forward/home type button of fixed size
+  // - a location bar with flexible width
+  // - a simulated extensions container
+  // - a simulated avatar button
+  // - one dummy "wrench menu" type button of fixed size
+  //
+  // All child views must be laid out end-to-end adjacent to each other, in the
+  // right order, and at the correct size. Furthermore, EnsureLayout() is called
+  // on the child views that support it.
+  //
+  // The parameter |expected_num_extension_icons| is passed to
+  // SimulatedExtensionsContainer::EnsureLayout().
+  void EnsureLayout(base::Optional<int> expected_num_extension_icons) const {
+    EXPECT_EQ(kIconDimension, height());
+    EXPECT_EQ(gfx::Rect(gfx::Point(), kIconSize), children()[0]->bounds());
+    EXPECT_EQ(gfx::Point(kIconDimension, 0), location()->origin());
+    EXPECT_EQ(kIconDimension, location()->height());
+    EXPECT_GE(location()->width(), kBarMinimumWidth);
+    EXPECT_EQ(gfx::Point(location()->bounds().right(), 0),
+              extensions_->origin());
+    extensions_->EnsureLayout(expected_num_extension_icons);
+    EXPECT_EQ(gfx::Point(extensions_->bounds().right(), 0), avatar_->origin());
+    avatar_->EnsureLayout();
+    EXPECT_EQ(gfx::Rect(gfx::Point(avatar_->bounds().right(), 0), kIconSize),
+              children()[4]->bounds());
+    if (location()->width() == kBarMinimumWidth)
+      EXPECT_LE(width(), children()[4]->bounds().right());
+    else
+      EXPECT_EQ(width(), children()[4]->bounds().right());
+  }
+
+ private:
+  // views::View:
+  const char* GetClassName() const override { return "SimulatedToolbar"; }
+
+  SimulatedExtensionsContainer* extensions_;
+  SimulatedAvatarButton* avatar_;
+};
+
+}  // anonymous namespace
+
+// Test suite. Sets up the mock toolbar and ties animation of all child elements
+// together so they can be controlled for testing. Use the utility methods here
+// as much as possible rather than calling methods on the individual Views.
+class CompositeLayoutTest : public testing::Test {
+ public:
+  void SetUp() override {
+    toolbar_ = std::make_unique<SimulatedToolbar>();
+    toolbar_->SetSize(kDefaultToolbarSize);
+    extensions_test_api_ = std::make_unique<gfx::AnimationContainerTestApi>(
+        extensions()->layout()->GetAnimationContainerForTesting());
+    avatar_test_api_ = std::make_unique<gfx::AnimationContainerTestApi>(
+        avatar()->layout()->GetAnimationContainerForTesting());
+  }
+
+  SimulatedAvatarButton* avatar() { return toolbar_->avatar(); }
+  const SimulatedAvatarButton* avatar() const { return toolbar_->avatar(); }
+  SimulatedExtensionsContainer* extensions() { return toolbar_->extensions(); }
+  const SimulatedExtensionsContainer* extensions() const {
+    return toolbar_->extensions();
+  }
+  SimulatedToolbar* toolbar() { return toolbar_.get(); }
+  const SimulatedToolbar* toolbar() const { return toolbar_.get(); }
+
+  void SetWidth(int width) {
+    toolbar()->SetSize(gfx::Size(width, kIconDimension));
+  }
+
+  void ChangeWidth(int delta) {
+    toolbar()->SetSize(
+        gfx::Size(std::max(0, toolbar()->width() + delta), kIconDimension));
+  }
+
+  void AdvanceAnimations(int ms) {
+    const auto delta = base::TimeDelta::FromMilliseconds(ms);
+    if (avatar()->layout()->is_animating())
+      avatar_test_api_->IncrementTime(delta);
+    if (extensions()->layout()->is_animating())
+      extensions_test_api_->IncrementTime(delta);
+    toolbar_->Layout();
+  }
+
+  void ResetAnimation() {
+    avatar()->layout()->ResetLayout();
+    extensions()->layout()->ResetLayout();
+    toolbar()->Layout();
+  }
+
+  bool IsAnimating() const {
+    return avatar()->layout()->is_animating() ||
+           extensions()->layout()->is_animating();
+  }
+
+  void FinishAnimations() {
+    // Advance the animation an unreasonable amount of times and fail if that
+    // doesn't actually cause the animation to complete. It's possible that one
+    // animation could lead to another so basing our limit only on the current
+    // animation durations is not necessarily reliable.
+    for (int i = 0; i < 100; ++i) {
+      if (!IsAnimating())
+        return;
+      // Advance by a small but significant step (1/10 of a second).
+      AdvanceAnimations(100);
+    }
+    GTEST_FAIL()
+        << "Animations did not complete in a reasonable amount of time.";
+  }
+
+  // Ensures the toolbar layout and all child view layouts are as expected.
+  // If |expected_num_extension_icons| is specified, then exactly that many (or
+  // at minimum that many if animating) simulated extension icons must be
+  // visible.
+  void EnsureLayout(
+      base::Optional<int> expected_num_extension_icons = base::nullopt) {
+    toolbar_->EnsureLayout(expected_num_extension_icons);
+  }
+
+ private:
+  base::test::TaskEnvironment task_environment_;
+  std::unique_ptr<gfx::AnimationContainerTestApi> extensions_test_api_;
+  std::unique_ptr<gfx::AnimationContainerTestApi> avatar_test_api_;
+  std::unique_ptr<SimulatedToolbar> toolbar_;
+};
+
+// ------------
+// Basic tests.
+
+TEST_F(CompositeLayoutTest, InitialLayout) {
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, SmallResize) {
+  toolbar()->SetSize(gfx::Size(300, kIconDimension));
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ShrinkLocationBar) {
+  toolbar()->SetSize(
+      gfx::Size(4 * kIconDimension + kBarMinimumWidth, kIconDimension));
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ShrinkLocationBarTooSmall) {
+  toolbar()->SetSize(
+      gfx::Size(4 * kIconDimension + kBarMinimumWidth - 20, kIconDimension));
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ProfileAnimates) {
+  avatar()->FadeLabelIn();
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+  avatar()->FadeLabelOut();
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ProfileAnimationInterrupted) {
+  avatar()->FadeLabelIn();
+  EXPECT_TRUE(IsAnimating());
+  AdvanceAnimations(500);
+  EnsureLayout();
+  avatar()->FadeLabelOut();
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ProfileAnimationInterruptedImmediately) {
+  avatar()->FadeLabelIn();
+  avatar()->FadeLabelOut();
+  EXPECT_FALSE(IsAnimating());
+  EnsureLayout();
+}
+
+// ----------------------------------------------------------
+// Tests which add/remove extension icons from the container.
+
+TEST_F(CompositeLayoutTest, ExtensionsAnimateOnAdd) {
+  extensions()->AddIconAt(0, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+  extensions()->AddIconAt(0, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  extensions()->AddIconAt(2, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ExtensionsAnimateOnAddMultiple) {
+  extensions()->AddIconAt(0, true);
+  extensions()->AddIconAt(0, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+  extensions()->AddIconAt(1, true);
+  extensions()->AddIconAt(3, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ExtensionsAnimateOnAddMultipleStaggered) {
+  extensions()->AddIconAt(0, true);
+  EXPECT_TRUE(IsAnimating());
+  AdvanceAnimations(200);
+  EnsureLayout();
+  EXPECT_TRUE(IsAnimating());
+  extensions()->AddIconAt(0, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+  extensions()->AddIconAt(1, true);
+  EXPECT_TRUE(IsAnimating());
+  AdvanceAnimations(200);
+  EnsureLayout();
+  EXPECT_TRUE(IsAnimating());
+  extensions()->AddIconAt(3, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ExtensionRemovedDuringAnimation) {
+  extensions()->AddIconAt(0, true);
+  AdvanceAnimations(200);
+  EnsureLayout();
+  extensions()->AddIconAt(0, true);
+  AdvanceAnimations(200);
+  EnsureLayout();
+  extensions()->AddIconAt(2, true);
+  AdvanceAnimations(200);
+  EnsureLayout();
+  extensions()->RemoveIconAt(1);
+  AdvanceAnimations(200);
+  EnsureLayout();
+  extensions()->AddIconAt(0, true);
+  AdvanceAnimations(200);
+  EnsureLayout();
+  extensions()->RemoveIconAt(2);
+  AdvanceAnimations(200);
+  EnsureLayout();
+  extensions()->RemoveIconAt(0);
+  FinishAnimations();
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ExtensionRemovedImmediately) {
+  extensions()->AddIconAt(0, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+  extensions()->AddIconAt(1, true);
+  extensions()->RemoveIconAt(1);
+  EXPECT_FALSE(IsAnimating());
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ExtensionRemovedImmediatelyDuringAnimation) {
+  extensions()->AddIconAt(0, true);
+  EXPECT_TRUE(IsAnimating());
+  AdvanceAnimations(500);
+  EnsureLayout();
+  extensions()->AddIconAt(1, true);
+  extensions()->RemoveIconAt(1);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+}
+
+// -----------------------------------------------
+// Tests which show/hide existing extension icons.
+
+TEST_F(CompositeLayoutTest, ExtensionsAnimateOnShow) {
+  extensions()->AddIcons({false, true, false});
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+  extensions()->SetIconVisibility(0, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  extensions()->AddIconAt(2, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ExtensionsAnimateOnShowMultiple) {
+  extensions()->AddIcons({true, false, true, false});
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+  extensions()->SetIconVisibility(1, true);
+  extensions()->SetIconVisibility(3, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ExtensionsAnimateOnShowMultipleStaggered) {
+  extensions()->AddIcons({false, false, true, false});
+  EXPECT_TRUE(IsAnimating());
+  AdvanceAnimations(200);
+  EnsureLayout();
+  EXPECT_TRUE(IsAnimating());
+  extensions()->SetIconVisibility(0, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+  extensions()->SetIconVisibility(1, true);
+  EXPECT_TRUE(IsAnimating());
+  AdvanceAnimations(200);
+  EnsureLayout();
+  EXPECT_TRUE(IsAnimating());
+  extensions()->SetIconVisibility(3, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ExtensionHiddenDuringAnimation) {
+  extensions()->AddIcons({false, false, true, false});
+  AdvanceAnimations(200);
+  EnsureLayout();
+  extensions()->SetIconVisibility(1, true);
+  AdvanceAnimations(200);
+  EnsureLayout();
+  extensions()->SetIconVisibility(3, true);
+  AdvanceAnimations(200);
+  EnsureLayout();
+  extensions()->SetIconVisibility(2, false);
+  AdvanceAnimations(200);
+  EnsureLayout();
+  extensions()->SetIconVisibility(0, true);
+  AdvanceAnimations(200);
+  EnsureLayout();
+  extensions()->SetIconVisibility(3, false);
+  AdvanceAnimations(200);
+  EnsureLayout();
+  extensions()->SetIconVisibility(0, false);
+  FinishAnimations();
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ExtensionHiddenImmediately) {
+  extensions()->AddIcons({true, false});
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+  extensions()->SetIconVisibility(1, true);
+  extensions()->SetIconVisibility(1, false);
+  EXPECT_FALSE(IsAnimating());
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ExtensionHiddenImmediatelyDuringAnimation) {
+  extensions()->AddIcons({true, false});
+  EXPECT_TRUE(IsAnimating());
+  AdvanceAnimations(500);
+  EnsureLayout();
+  extensions()->SetIconVisibility(1, true);
+  extensions()->SetIconVisibility(1, false);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+}
+
+// ----------------------------------
+// Tests where child views are moved.
+
+TEST_F(CompositeLayoutTest, ExtensionOrderChanged) {
+  extensions()->AddIcons({true, true, true});
+  FinishAnimations();
+  EnsureLayout();
+  extensions()->MoveIcon(1, 2);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ExtensionHiddenAndPoppedOutImmediate) {
+  extensions()->AddIcons({true, true, true});
+  FinishAnimations();
+  EnsureLayout();
+  extensions()->SetIconVisibility(1, false);
+  extensions()->MoveIcon(1, 2);
+  extensions()->SetIconVisibility(2, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ExtensionHiddenAndPoppedOutDelayed) {
+  extensions()->AddIcons({true, true, true});
+  FinishAnimations();
+  EnsureLayout();
+  extensions()->SetIconVisibility(1, false);
+  extensions()->MoveIcon(1, 2);
+  AdvanceAnimations(500);
+  extensions()->SetIconVisibility(2, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ExtensionPinned) {
+  extensions()->AddIcons({true, true, false, false});
+  FinishAnimations();
+  EnsureLayout();
+  extensions()->MoveIcon(3, 0);
+  extensions()->SetIconVisibility(0, true);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, VisibleExtensionMoved) {
+  extensions()->AddIcons({true, true, false, false});
+  FinishAnimations();
+  EnsureLayout();
+  extensions()->MoveIcon(1, 0);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, InvisibleExtensionMoved) {
+  extensions()->AddIcons({true, true, false, false});
+  FinishAnimations();
+  EnsureLayout();
+  extensions()->MoveIcon(2, 3);
+  EXPECT_FALSE(IsAnimating());
+  EnsureLayout();
+}
+
+// -----------------------------------------------
+// Tests combining two different animating views.
+
+TEST_F(CompositeLayoutTest, ExtensionsAndAvatarAnimateSimultaneously) {
+  // Expand both views.
+  extensions()->AddIcons({true, true});
+  avatar()->FadeLabelIn();
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EXPECT_FALSE(IsAnimating());
+  EnsureLayout();
+  // Expand one, contract the other.
+  extensions()->AddIcons({true});
+  avatar()->FadeLabelOut();
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout();
+  EXPECT_FALSE(IsAnimating());
+  // Then vice-versa.
+  extensions()->SetIconVisibility(1, false);
+  avatar()->FadeLabelIn();
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EXPECT_FALSE(IsAnimating());
+  EnsureLayout();
+}
+
+TEST_F(CompositeLayoutTest, ExtensionsAndAvatarAnimateStaggered) {
+  // Expand both views.
+  extensions()->AddIcons({true, true});
+  AdvanceAnimations(500);
+  EnsureLayout();
+  avatar()->FadeLabelIn();
+  FinishAnimations();
+  EnsureLayout();
+  // Expand one, contract the other.
+  extensions()->AddIcons({true});
+  AdvanceAnimations(500);
+  EnsureLayout();
+  avatar()->FadeLabelOut();
+  FinishAnimations();
+  EnsureLayout();
+  // Then vice-versa.
+  extensions()->SetIconVisibility(1, false);
+  AdvanceAnimations(500);
+  avatar()->FadeLabelIn();
+  FinishAnimations();
+  EnsureLayout();
+}
+
+// -----------------------
+// Tests in limited space.
+
+TEST_F(CompositeLayoutTest, ExtensionsNotShownWhenSpaceConstrained) {
+  // At the minimum size for the toolbar, no icons should be displayed.
+  toolbar()->SizeToPreferredSize();
+  extensions()->AddIcons({true, true});
+  EXPECT_FALSE(IsAnimating());
+  EnsureLayout(0);
+
+  // Increase the size gradually, exposing pinned icons.
+  // We don't really care if the individual icons animate out or not; as long as
+  // the correct number are displayed at each step.
+  ChangeWidth(kIconDimension / 2);
+  EXPECT_FALSE(IsAnimating());
+  EnsureLayout(0);
+  ChangeWidth(kIconDimension / 2);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout(1);
+  ChangeWidth(kIconDimension / 2);
+  EXPECT_FALSE(IsAnimating());
+  EnsureLayout(1);
+  ChangeWidth(kIconDimension / 2);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout(2);
+}
+
+TEST_F(CompositeLayoutTest, SomeExtensionsNotShownWhenSpaceConstrained) {
+  // Provide room for one of two icons.
+  SetWidth(toolbar()->GetPreferredSize().width() + kIconDimension);
+  extensions()->AddIcons({true, true});
+  FinishAnimations();
+  EnsureLayout(1);
+
+  // Increase the size gradually, exposing pinned icons.
+  // We don't really care if the individual icons animate out or not; as long as
+  // the correct number are displayed at each step.
+  ChangeWidth(kIconDimension / 2);
+  EXPECT_FALSE(IsAnimating());
+  EnsureLayout(1);
+  ChangeWidth(kIconDimension / 2);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout(2);
+}
+
+TEST_F(CompositeLayoutTest, ExtensionsShownSnapsWhenSpaceShrinks) {
+  // Provide room for both icons.
+  SetWidth(toolbar()->GetPreferredSize().width() + 2 * kIconDimension);
+  extensions()->AddIcons({true, true});
+  FinishAnimations();
+  EnsureLayout(2);
+
+  ChangeWidth(-kIconDimension);
+  EXPECT_FALSE(IsAnimating());
+  EnsureLayout(1);
+
+  ChangeWidth(-kIconDimension);
+  EXPECT_FALSE(IsAnimating());
+  EnsureLayout(0);
+}
+
+TEST_F(CompositeLayoutTest,
+       ExtensionsShowingAnimationRedirectsDueToSmallerAvailableSpace) {
+  // Provide room for both icons.
+  SetWidth(toolbar()->GetPreferredSize().width() + 2 * kIconDimension);
+  extensions()->AddIcons({true, true});
+  AdvanceAnimations(400);
+
+  // The icons are fading in, but not enough that the animation would be reset
+  // by changing the toolbar width by one icon width.
+  ChangeWidth(-kIconDimension);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout(1);
+}
+
+TEST_F(CompositeLayoutTest,
+       ExtensionsShowingAnimationCancelsDueToSmallerAvailableSpace) {
+  // Provide room for both icons.
+  SetWidth(toolbar()->GetPreferredSize().width() + 2 * kIconDimension);
+  extensions()->AddIcons({true, true});
+  AdvanceAnimations(800);
+
+  // The icons are fading in, far enough that the animation is reset by changing
+  // the toolbar width by one icon width.
+  ChangeWidth(-kIconDimension);
+  EXPECT_FALSE(IsAnimating());
+  EnsureLayout(1);
+}
+
+TEST_F(CompositeLayoutTest,
+       ExtensionsShowingAnimationRedirectsDueToLargerAvailableSpace) {
+  // Provide room for one of two icons.
+  SetWidth(toolbar()->GetPreferredSize().width() + kIconDimension);
+  extensions()->AddIcons({true, true});
+  AdvanceAnimations(400);
+
+  // Make room for the second icon; the animation should continue.
+  ChangeWidth(kIconDimension);
+  EXPECT_TRUE(IsAnimating());
+  FinishAnimations();
+  EnsureLayout(2);
+}
+
+TEST_F(CompositeLayoutTest, ExtensionsHiddenWhenAvatarExpands) {
+  extensions()->AddIcons({true, true, true, true, true});
+  ResetAnimation();
+  EnsureLayout(5);
+  toolbar()->SizeToPreferredSize();
+  EXPECT_FALSE(IsAnimating());
+
+  avatar()->FadeLabelIn();
+
+  // Halfway through, the label will have displaced 35 pixels, or two icons.
+  AdvanceAnimations(500);
+  EnsureLayout(3);
+
+  // At its largest, 70 pixels and four icons.
+  FinishAnimations();
+  EnsureLayout(1);
+}
+
+TEST_F(CompositeLayoutTest, ExtensionsShownWhenAvatarCollapses) {
+  extensions()->AddIcons({true});
+  avatar()->FadeLabelIn();
+  ResetAnimation();
+  toolbar()->SizeToPreferredSize();
+  // These should all be hidden.
+  extensions()->AddIcons({true, true, true, true});
+  EnsureLayout(1);
+
+  avatar()->FadeLabelOut();
+
+  // Halfway through, the label will cede back 35 pixels - enough to display an
+  // additional icon.
+  AdvanceAnimations(500);
+  EnsureLayout(2);
+
+  // Finish everything - this will include icons revealed at the very end. Since
+  // 70 pixels total are ceded back, three of the four newly-added icons can be
+  // shown.
+  FinishAnimations();
+  EnsureLayout(4);
+}
+
+TEST_F(CompositeLayoutTest, ExtensionsHideAndShowWhenAvatarAnimates) {
+  extensions()->AddIcons({true, true, true, true, true});
+  ResetAnimation();
+  EnsureLayout(5);
+  toolbar()->SizeToPreferredSize();
+  EXPECT_FALSE(IsAnimating());
+
+  avatar()->FadeLabelIn();
+
+  // Halfway through, the label will have displaced 35 pixels, or two icons.
+  AdvanceAnimations(500);
+  EnsureLayout(3);
+
+  // Interrupt most of the way through.
+  AdvanceAnimations(200);
+  EnsureLayout(2);
+
+  // Fade the label out and make sure all of the extensions reappeared.
+  avatar()->FadeLabelOut();
+  FinishAnimations();
+  EnsureLayout(5);
+}
+
+TEST_F(CompositeLayoutTest, ExtensionsShowAndHideWhenAvatarAnimates) {
+  extensions()->AddIcons({true});
+  avatar()->FadeLabelIn();
+  ResetAnimation();
+  toolbar()->SizeToPreferredSize();
+  // These should all be hidden.
+  extensions()->AddIcons({true, true, true, true});
+  ResetAnimation();
+
+  // Halfway through, the label will have ceded 35 pixels, or one icon.
+  avatar()->FadeLabelOut();
+  AdvanceAnimations(500);
+  EnsureLayout(2);
+
+  // Interrupt most of the way through.
+  AdvanceAnimations(200);
+  EnsureLayout(3);
+
+  // Fade the label back in and make sure all of the extensions re-hide.
+  avatar()->FadeLabelIn();
+  FinishAnimations();
+  EnsureLayout(1);
+}
+
+TEST_F(CompositeLayoutTest, MultipleAnimationAndLayoutChanges) {
+  extensions()->AddIcons({true});
+  avatar()->FadeLabelIn();
+  ResetAnimation();
+  toolbar()->SizeToPreferredSize();
+  // These should all be hidden.
+  extensions()->AddIcons({true, true, true});
+  ResetAnimation();
+
+  // Halfway through, the label will have ceded 35 pixels, or one icon.
+  avatar()->FadeLabelOut();
+  AdvanceAnimations(500);
+  EnsureLayout(2);
+
+  // Interrupt most of the way through to add a random icon.
+  AdvanceAnimations(100);
+  extensions()->AddIconAt(2, true);
+  AdvanceAnimations(100);
+  EnsureLayout(3);
+
+  extensions()->SetIconVisibility(1, false);
+  extensions()->SetIconVisibility(3, false);
+  FinishAnimations();
+  EnsureLayout(3);
+
+  // Fade the label back in and make sure all of the extensions re-hide.
+  avatar()->FadeLabelIn();
+  FinishAnimations();
+  EnsureLayout(1);
+}
+
+}  // namespace views
diff --git a/ui/views/layout/layout_manager_base.cc b/ui/views/layout/layout_manager_base.cc
index 5bc2708..cdab637 100644
--- a/ui/views/layout/layout_manager_base.cc
+++ b/ui/views/layout/layout_manager_base.cc
@@ -175,6 +175,8 @@
     // events that wouldn't do anything useful).
     if (new_available_size != cached_available_size_ || child_layout.visible ||
         !child_layout.bounds.IsEmpty()) {
+      const bool size_changed =
+          child_view->bounds().size() != child_layout.bounds.size();
       if (child_view->bounds() != child_layout.bounds)
         child_view->SetBoundsRect(child_layout.bounds);
       // Child layouts which are not invalid will not be laid out by the default
@@ -182,7 +184,7 @@
       // constraint it's important that the child view be laid out. So we'll do
       // it here.
       // TODO(dfried): figure out a better way to handle this.
-      else if (child_layout.available_size != SizeBounds())
+      if (!size_changed && child_layout.available_size != SizeBounds())
         child_view->Layout();
     }
   }
diff --git a/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.cc b/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.cc
index ab68d6d..80b7084 100644
--- a/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.cc
+++ b/ui/views/widget/desktop_aura/desktop_drag_drop_client_ozone.cc
@@ -22,6 +22,7 @@
 #include "ui/base/dragdrop/drag_drop_types.h"
 #include "ui/base/dragdrop/drop_target_event.h"
 #include "ui/base/layout.h"
+#include "ui/base/ui_base_features.h"
 #include "ui/display/screen.h"
 #include "ui/ozone/public/ozone_platform.h"
 #include "ui/platform_window/platform_window_delegate.h"
@@ -45,14 +46,13 @@
 
 bool DragImageIsNeeded() {
 #if defined(USE_OZONE)
-  return !ui::OzonePlatform::GetInstance()
-              ->GetPlatformProperties()
-              .platform_shows_drag_image;
-#elif defined(USE_X11)
-  return true;
-#else
-#error "This file must not be compiled out of Ozone or X11."
+  if (features::IsUsingOzonePlatform()) {
+    return !ui::OzonePlatform::GetInstance()
+                ->GetPlatformProperties()
+                .platform_shows_drag_image;
+  }
 #endif
+  return true;
 }
 
 // Returns true if |image| has any visible regions (defined as having a pixel
diff --git a/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc b/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc
index dd72ed8d9..b014bb2 100644
--- a/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc
+++ b/ui/views/widget/desktop_aura/desktop_screen_x11_unittest.cc
@@ -16,6 +16,7 @@
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/base/hit_test.h"
+#include "ui/base/ui_base_features.h"
 #include "ui/base/x/x11_display_manager.h"
 #include "ui/base/x/x11_util.h"
 #include "ui/display/display.h"
@@ -70,6 +71,9 @@
   // Overridden from testing::Test:
   void SetUp() override {
     ViewsTestBase::SetUp();
+    // TODO(msisov): rewrite desktop screen tests for ozone and non-ozone Linux.
+    if (features::IsUsingOzonePlatform())
+      GTEST_SKIP();
     // Initialize the world to the single monitor case.
     std::vector<display::Display> displays;
     displays.emplace_back(kFirstDisplay, gfx::Rect(0, 0, 640, 480));
diff --git a/ui/views/widget/desktop_aura/x11_drag_drop_client_unittest.cc b/ui/views/widget/desktop_aura/x11_drag_drop_client_unittest.cc
index 882fc751..9d64b437e 100644
--- a/ui/views/widget/desktop_aura/x11_drag_drop_client_unittest.cc
+++ b/ui/views/widget/desktop_aura/x11_drag_drop_client_unittest.cc
@@ -487,6 +487,9 @@
     set_native_widget_type(NativeWidgetType::kDesktop);
 
     ViewsTestBase::SetUp();
+    // TODO(msisov): rewrite these tests for ozone and non-ozone Linux.
+    if (features::IsUsingOzonePlatform())
+      GTEST_SKIP();
 
     // Create widget to initiate the drags.
     widget_ = std::make_unique<Widget>();