diff --git a/DEPS b/DEPS
index 7d84c93..e588d6b1 100644
--- a/DEPS
+++ b/DEPS
@@ -171,11 +171,11 @@
   # 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': '57bc977e124cb20258268157e5010e9c787c6fe0',
+  'skia_revision': '02497d40161fc75c46fa47c28e6fef30310147b4',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': 'a66f0bf66ea25ae7448b35fe74cef5642cdc0310',
+  'v8_revision': 'f6d87d0ff881338e5998a4c7177490292619d55b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -183,7 +183,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': '8b73596fe7046921a5c145db16ff68ede6b71133',
+  'angle_revision': '959d077f605ee90652362033240188223f5c2816',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -191,7 +191,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': 'd41bcabd124f06c919f38849d6258960eb635f20',
+  'pdfium_revision': 'c93fa1ff01942209632af85a005d27b9be9c5236',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -242,7 +242,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': 'e1d7a0fe6ffbde5ea6fe9bd664d15f994880d03c',
+  'devtools_frontend_revision': 'e0897515da03963f98a43f92b8809118397c416f',
   # 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.
@@ -298,7 +298,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': 'bc34d908f60d458c6d9e416a7404eac4703e1192',
+  'dawn_revision': '33466973bc4c52effb520832d538b48c38695ca5',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -338,7 +338,7 @@
   # once libassistant's copy of buildtools rolls up to the rename.
   'libcxx_revision_v2':       'd9040c75cfea5928c804ab7c235fed06a63f743a',
   'libcxxabi_revision_v2':    '196ba1aaa8ac285d94f4ea8d9836390a45360533',
-  'libunwind_revision_v2':    'd999d54f4bca789543a2eb6c995af2d9b5a1f3ed',
+  'libunwind_revision_v2':    '43bb9f872232f531bac80093ceb4de61c64b9ab7',
 }
 
 # Only these hosts are allowed for dependencies in this DEPS file.
@@ -1242,7 +1242,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '5ca404665a4c706b64d9fd74663984f87c800572',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '3bde4517dec7e1b528202a4709785aa798abe480',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1518,7 +1518,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@5d5361f3bf54910df23a7d2f006e99c2f10f0ede',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@207c622c1ef0b060d7641c9e4f56352330e1c97a',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/WATCHLISTS b/WATCHLISTS
index 4db850b..d666f10 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -158,7 +158,8 @@
       'filepath': 'ash/',
     },
     'assistant': {
-      'filepath': 'ash/app_list/views/assistant/'\
+      'filepath': 'ash/ambient/ui/.*assistant.*'\
+                  '|ash/app_list/views/assistant/'\
                   '|ash/assistant/'\
                   '|chromeos/assistant/'\
                   '|chromeos/services/assistant/'\
@@ -1546,6 +1547,11 @@
     'push_messaging': {
       'filepath': 'push_messaging'
     },
+    'quick_answers': {
+      'filepath': 'ash/quick_answers/'\
+                  '|chrome/browser/renderer_context_menu/quick_answers.*'\
+                  '|chromeos/components/quick_answers/'
+    },
     'reading_list': {
       'filepath': 'components/reading_list|'\
                   'ios/chrome/browser/reading_list|'\
@@ -2633,6 +2639,7 @@
     'preview_features': ['chrome-lite-pages+watch@google.com'],
     'print_preview': ['print-reviews+preview@chromium.org'],
     'push_messaging': ['peter@chromium.org'],
+    'quick_answers': ['croissant-eng+reviews@chromium.org'],
     'reading_list': ['stkhapugin@chromium.org'],
     'relaunch_notification': ['grt+watch@chromium.org'],
     'remoteplayback': ['mfoltz+watch@chromium.org'],
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java
index bd7f8ed..bcfd255 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnPageFinishedTest.java
@@ -8,6 +8,7 @@
 
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.MediumTest;
+import android.util.Pair;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -24,6 +25,8 @@
 import org.chromium.content_public.common.ContentUrlConstants;
 import org.chromium.net.test.util.TestWebServer;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.CountDownLatch;
 
 /**
@@ -563,4 +566,53 @@
             webServer.shutdown();
         }
     }
+
+    /**
+     * Ensure the case when max number of redirects is reached using an SXG fallback
+     * url does not crash and results in an error page (due to net::ERR_TO_MANY_REDIRECTS).
+     */
+    @Test
+    @MediumTest
+    @Feature({"AndroidWebView"})
+    public void testMaxRedirect_SXG() throws Throwable {
+        TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
+                mContentsClient.getOnPageFinishedHelper();
+
+        TestWebServer webServer = TestWebServer.startSsl();
+        try {
+            List<Pair<String, String>> signedExchangeHeaders =
+                    new ArrayList<Pair<String, String>>();
+            signedExchangeHeaders.add(
+                    Pair.create("Content-Type", "application/signed-exchange;v=b3"));
+            signedExchangeHeaders.add(Pair.create("X-Content-Type-Options", "nosniff"));
+            final String fallbackUrl = webServer.setResponseWithNotFoundStatus("/404.html");
+            final String webpageNotAvailable = "Webpage not available";
+
+            StringBuilder sb = new StringBuilder();
+            sb.append("sxg1-b3");
+            sb.append((char) 0);
+            sb.append((char) 0);
+            sb.append((char) fallbackUrl.length());
+            sb.append(fallbackUrl);
+            final String sxgContents = sb.toString();
+
+            final String emptyResp =
+                    webServer.setResponse("/foo.sxg", sxgContents, signedExchangeHeaders);
+            final String redirectUrl = webServer.setRedirect("/302.html", "/redirect_1");
+            for (int i = 1; i < 18; i++) {
+                String redirectUrlLoop =
+                        webServer.setRedirect("/redirect_" + i, "/redirect_" + (i + 1));
+            }
+
+            String finalRedirect = webServer.setRedirect("/redirect_18", "/foo.sxg");
+
+            // Note the current SXG redirect fallback implementation does not
+            // result in onPageFinished, onReceivedError callbacks, see crbug.com/1052242.
+            mActivityTestRule.loadUrlAsync(mAwContents, redirectUrl);
+            mActivityTestRule.waitForVisualStateCallback(mAwContents);
+            Assert.assertEquals(webpageNotAvailable, mAwContents.getTitle());
+        } finally {
+            webServer.shutdown();
+        }
+    }
 }
diff --git a/ash/app_list/views/app_list_view.cc b/ash/app_list/views/app_list_view.cc
index 7231043..1a8aed5 100644
--- a/ash/app_list/views/app_list_view.cc
+++ b/ash/app_list/views/app_list_view.cc
@@ -425,8 +425,8 @@
   void OnImplicitAnimationsCompleted() override {
     StopObservingImplicitAnimations();
     view_->OnBoundsAnimationCompleted();
-    TRACE_EVENT_ASYNC_END1("ui", "AppList::StateTransitionAnimations", this,
-                           "state", target_state_.value());
+    TRACE_EVENT_NESTABLE_ASYNC_END1("ui", "AppList::StateTransitionAnimations",
+                                    this, "state", target_state_.value());
     target_state_ = base::nullopt;
   }
 
@@ -1705,8 +1705,8 @@
   animation.SetPreemptionStrategy(
       ui::LayerAnimator::IMMEDIATELY_SET_NEW_TARGET);
   animation.SetAnimationMetricsReporter(GetStateTransitionMetricsReporter());
-  TRACE_EVENT_ASYNC_BEGIN0("ui", "AppList::StateTransitionAnimations",
-                           bounds_animation_observer_.get());
+  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("ui", "AppList::StateTransitionAnimations",
+                                    bounds_animation_observer_.get());
   bounds_animation_observer_->set_target_state(target_state);
   animation.AddObserver(bounds_animation_observer_.get());
   if (animation_observer) {
diff --git a/ash/login/login_screen_controller.cc b/ash/login/login_screen_controller.cc
index 64b3432..1cba4cd 100644
--- a/ash/login/login_screen_controller.cc
+++ b/ash/login/login_screen_controller.cc
@@ -274,11 +274,16 @@
   client_->FocusLockScreenApps(reverse);
 }
 
-void LoginScreenController::ShowGaiaSignin(bool can_close,
-                                           const AccountId& prefilled_account) {
+void LoginScreenController::ShowGaiaSignin(const AccountId& prefilled_account) {
   if (!client_)
     return;
-  client_->ShowGaiaSignin(can_close, prefilled_account);
+  client_->ShowGaiaSignin(prefilled_account);
+}
+
+void LoginScreenController::HideGaiaSignin() {
+  if (!client_)
+    return;
+  client_->HideGaiaSignin();
 }
 
 void LoginScreenController::OnRemoveUserWarningShown() {
diff --git a/ash/login/login_screen_controller.h b/ash/login/login_screen_controller.h
index 1dad569..772d62f 100644
--- a/ash/login/login_screen_controller.h
+++ b/ash/login/login_screen_controller.h
@@ -82,7 +82,8 @@
   void LoginAsGuest();
   void OnMaxIncorrectPasswordAttempted(const AccountId& account_id);
   void FocusLockScreenApps(bool reverse);
-  void ShowGaiaSignin(bool can_close, const AccountId& prefilled_account);
+  void ShowGaiaSignin(const AccountId& prefilled_account);
+  void HideGaiaSignin();
   void OnRemoveUserWarningShown();
   void RemoveUser(const AccountId& account_id);
   void LaunchPublicSession(const AccountId& account_id,
diff --git a/ash/login/mock_login_screen_client.h b/ash/login/mock_login_screen_client.h
index ebe2255..abe15a0 100644
--- a/ash/login/mock_login_screen_client.h
+++ b/ash/login/mock_login_screen_client.h
@@ -103,8 +103,9 @@
   MOCK_METHOD(void, FocusLockScreenApps, (bool reverse), (override));
   MOCK_METHOD(void,
               ShowGaiaSignin,
-              (bool can_close, const AccountId& prefilled_account),
+              (const AccountId& prefilled_account),
               (override));
+  MOCK_METHOD(void, HideGaiaSignin, (), (override));
   MOCK_METHOD(void, OnRemoveUserWarningShown, (), (override));
   MOCK_METHOD(void, RemoveUser, (const AccountId& account_id), (override));
   MOCK_METHOD(void,
diff --git a/ash/login/ui/lock_contents_view.cc b/ash/login/ui/lock_contents_view.cc
index 26d14e4..b6ef902 100644
--- a/ash/login/ui/lock_contents_view.cc
+++ b/ash/login/ui/lock_contents_view.cc
@@ -775,12 +775,18 @@
     else
       new_users.push_back(UserState(user));
   }
+
+  // Hide gaia signin dialog if it was open due to empty user list and the list
+  // is not empty anymore.
+  const bool hide_gaia_signin = users_.empty() && !new_users.empty() &&
+                                screen_type_ == LockScreen::ScreenType::kLogin;
+
   users_ = std::move(new_users);
 
   // If there are no users, show gaia signin if login.
   if (users.empty() && screen_type_ == LockScreen::ScreenType::kLogin) {
     Shell::Get()->login_screen_controller()->ShowGaiaSignin(
-        false /*can_close*/, EmptyAccountId() /*prefilled_account*/);
+        EmptyAccountId() /*prefilled_account*/);
     return;
   }
 
@@ -814,6 +820,9 @@
   PreferredSizeChanged();
   Layout();
 
+  if (hide_gaia_signin)
+    Shell::Get()->login_screen_controller()->HideGaiaSignin();
+
   // If one of the child views had focus before we deleted them, then this view
   // will get focused. Move focus back to the primary big view.
   if (primary_big_view_ && HasFocus())
@@ -1854,7 +1863,6 @@
   if (screen_type_ == LockScreen::ScreenType::kLogin &&
       unlock_attempt_ >= kLoginAttemptsBeforeGaiaDialog) {
     Shell::Get()->login_screen_controller()->ShowGaiaSignin(
-        true /*can_close*/,
         big_view->auth_user()->current_user().basic_user_info.account_id);
     return;
   }
diff --git a/ash/login/ui/lock_contents_view_unittest.cc b/ash/login/ui/lock_contents_view_unittest.cc
index e37899e7..db62039 100644
--- a/ash/login/ui/lock_contents_view_unittest.cc
+++ b/ash/login/ui/lock_contents_view_unittest.cc
@@ -1065,7 +1065,7 @@
   };
 
   // ShowGaiaSignin is never triggered.
-  EXPECT_CALL(*client, ShowGaiaSignin(_, _)).Times(0);
+  EXPECT_CALL(*client, ShowGaiaSignin(_)).Times(0);
   for (int i = 0; i < LockContentsView::kLoginAttemptsBeforeGaiaDialog + 1; ++i)
     submit_password();
 }
@@ -1091,14 +1091,13 @@
   };
 
   // The first n-1 attempts do not trigger ShowGaiaSignin.
-  EXPECT_CALL(*client, ShowGaiaSignin(_, _)).Times(0);
+  EXPECT_CALL(*client, ShowGaiaSignin(_)).Times(0);
   for (int i = 0; i < LockContentsView::kLoginAttemptsBeforeGaiaDialog - 1; ++i)
     submit_password();
   Mock::VerifyAndClearExpectations(client.get());
 
   // The final attempt triggers ShowGaiaSignin.
-  EXPECT_CALL(*client, ShowGaiaSignin(true /*can_close*/,
-                                      users()[0].basic_user_info.account_id))
+  EXPECT_CALL(*client, ShowGaiaSignin(users()[0].basic_user_info.account_id))
       .Times(1);
   submit_password();
   Mock::VerifyAndClearExpectations(client.get());
@@ -2886,6 +2885,7 @@
       std::make_unique<FakeLoginDetachableBaseModel>(DataDispatcher()));
   std::unique_ptr<views::Widget> widget = CreateWidgetWithContent(contents);
   LockContentsView::TestApi test_api(contents);
+  DataDispatcher()->SetUserList(users());
 
   // Verify that primary big view is null.
   EXPECT_THAT(test_api.primary_big_view(), IsNull());
@@ -2893,4 +2893,22 @@
   EXPECT_TRUE(test_api.main_view()->children().empty());
 }
 
+TEST_F(LockContentsViewUnitTest, ToggleGaiaOnUsersChanged) {
+  auto* contents = new LockContentsView(
+      mojom::TrayActionState::kNotAvailable, LockScreen::ScreenType::kLogin,
+      DataDispatcher(),
+      std::make_unique<FakeLoginDetachableBaseModel>(DataDispatcher()));
+  std::unique_ptr<views::Widget> widget = CreateWidgetWithContent(contents);
+  LockContentsView::TestApi test_api(contents);
+  auto client = std::make_unique<MockLoginScreenClient>();
+  // Expect Gaia to show when there is no users.
+  EXPECT_CALL(*client, ShowGaiaSignin(_)).Times(1);
+  AddUsers(0);
+  Mock::VerifyAndClearExpectations(client.get());
+
+  // Hide Gaia when users added.
+  EXPECT_CALL(*client, HideGaiaSignin()).Times(1);
+  AddPublicAccountUsers(1);
+}
+
 }  // namespace ash
diff --git a/ash/login/ui/login_auth_user_view.cc b/ash/login/ui/login_auth_user_view.cc
index f312d9a2..e9581cd 100644
--- a/ash/login/ui/login_auth_user_view.cc
+++ b/ash/login/ui/login_auth_user_view.cc
@@ -1415,7 +1415,7 @@
 
 void LoginAuthUserView::OnOnlineSignInMessageTap() {
   Shell::Get()->login_screen_controller()->ShowGaiaSignin(
-      true /*can_close*/, current_user().basic_user_info.account_id);
+      current_user().basic_user_info.account_id);
 }
 
 void LoginAuthUserView::OnPinBack() {
diff --git a/ash/login/ui/login_auth_user_view_unittest.cc b/ash/login/ui/login_auth_user_view_unittest.cc
index 4c2d610..b88500c5 100644
--- a/ash/login/ui/login_auth_user_view_unittest.cc
+++ b/ash/login/ui/login_auth_user_view_unittest.cc
@@ -144,8 +144,7 @@
   // Clicking the message triggers |ShowGaiaSignin|.
   EXPECT_CALL(
       *client,
-      ShowGaiaSignin(true /*can_close*/,
-                     user_view->current_user().basic_user_info.account_id));
+      ShowGaiaSignin(user_view->current_user().basic_user_info.account_id));
   const ui::MouseEvent event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
                              ui::EventTimeForNow(), 0, 0);
   view_->ButtonPressed(online_sign_in_message, event);
diff --git a/ash/login/ui/login_expanded_public_account_view.cc b/ash/login/ui/login_expanded_public_account_view.cc
index 746de0f..8d8495b 100644
--- a/ash/login/ui/login_expanded_public_account_view.cc
+++ b/ash/login/ui/login_expanded_public_account_view.cc
@@ -442,7 +442,7 @@
       // take selected_language_item_.value, selected_keyboard_item_.value too.
       if (current_user_.public_account_info->using_saml) {
         Shell::Get()->login_screen_controller()->ShowGaiaSignin(
-            true /*can_close*/, current_user_.basic_user_info.account_id);
+            current_user_.basic_user_info.account_id);
       } else {
         Shell::Get()->login_screen_controller()->LaunchPublicSession(
             current_user_.basic_user_info.account_id,
diff --git a/ash/perftests/overview_animations_preftest.cc b/ash/perftests/overview_animations_preftest.cc
index cb698f4..6872469c 100644
--- a/ash/perftests/overview_animations_preftest.cc
+++ b/ash/perftests/overview_animations_preftest.cc
@@ -71,7 +71,7 @@
 };
 
 ASH_CONTENT_TEST_P(OverviewAnimationsTest, EnterExit) {
-  TRACE_EVENT_ASYNC_BEGIN0("ui", "Interaction.ui_Overview", this);
+  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("ui", "Interaction.ui_Overview", this);
   // Browser window is used just to identify display.
   ui_controls::SendKeyPress(window(), ui::VKEY_MEDIA_LAUNCH_APP1,
                             /*control=*/false,
@@ -88,7 +88,7 @@
                             /*command=*/false);
   ash::ShellTestApi().WaitForOverviewAnimationState(
       ash::OverviewAnimationState::kExitAnimationComplete);
-  TRACE_EVENT_ASYNC_END0("ui", "Interaction.ui_Overview", this);
+  TRACE_EVENT_NESTABLE_ASYNC_END0("ui", "Interaction.ui_Overview", this);
 }
 
 INSTANTIATE_TEST_SUITE_P(All,
diff --git a/ash/public/cpp/login_screen_client.h b/ash/public/cpp/login_screen_client.h
index 772562c..44a3b1d 100644
--- a/ash/public/cpp/login_screen_client.h
+++ b/ash/public/cpp/login_screen_client.h
@@ -111,11 +111,13 @@
   // Passes focus to the OOBE dialog if it is showing. No-op otherwise.
   virtual void FocusOobeDialog() = 0;
 
-  // Show the gaia sign-in dialog. If |can_close| is true, the dialog can be
-  // closed. The value in |prefilled_account| will be used to prefill the
-  // sign-in dialog so the user does not need to type the account email.
-  virtual void ShowGaiaSignin(bool can_close,
-                              const AccountId& prefilled_account) = 0;
+  // Show the gaia sign-in dialog.
+  // The value in |prefilled_account| will be used to prefill the sign-in dialog
+  // so the user does not need to type the account email.
+  virtual void ShowGaiaSignin(const AccountId& prefilled_account) = 0;
+
+  // Hides the Gaia sign-in dialog if it was open.
+  virtual void HideGaiaSignin() = 0;
 
   // Notification that the remove user warning was shown.
   virtual void OnRemoveUserWarningShown() = 0;
diff --git a/ash/shelf/login_shelf_view.cc b/ash/shelf/login_shelf_view.cc
index 8b0c940..0db0b1e 100644
--- a/ash/shelf/login_shelf_view.cc
+++ b/ash/shelf/login_shelf_view.cc
@@ -240,7 +240,7 @@
 
 void StartAddUser() {
   Shell::Get()->login_screen_controller()->ShowGaiaSignin(
-      true /*can_close*/, EmptyAccountId() /*prefilled_account*/);
+      EmptyAccountId() /*prefilled_account*/);
 }
 
 bool DialogStateGuestAllowed(OobeDialogState state) {
diff --git a/ash/shelf/login_shelf_view_unittest.cc b/ash/shelf/login_shelf_view_unittest.cc
index b6045f9..86bb43d4 100644
--- a/ash/shelf/login_shelf_view_unittest.cc
+++ b/ash/shelf/login_shelf_view_unittest.cc
@@ -422,9 +422,8 @@
 
 // Tests that shutdown button can be clicked on the lock screen for active
 // session that starts with side shelf. See https://crbug.com/1050192.
-// The test is flaky: https://crbug.com/1053980
 TEST_F(LoginShelfViewTest,
-       DISABLED_ClickShutdownButtonOnLockScreenWithVerticalInSessionShelf) {
+       ClickShutdownButtonOnLockScreenWithVerticalInSessionShelf) {
   CreateUserSessions(1);
   SetShelfAlignmentPref(
       Shell::Get()->session_controller()->GetPrimaryUserPrefService(),
diff --git a/ash/wm/overview/overview_controller.cc b/ash/wm/overview/overview_controller.cc
index ddbc765..5b245f13 100644
--- a/ash/wm/overview/overview_controller.cc
+++ b/ash/wm/overview/overview_controller.cc
@@ -307,7 +307,8 @@
 
   if (InOverviewSession()) {
     DCHECK(CanEndOverview(type));
-    TRACE_EVENT_ASYNC_BEGIN0("ui", "OverviewController::ExitOverview", this);
+    TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("ui", "OverviewController::ExitOverview",
+                                      this);
 
     // Suspend occlusion tracker until the exit animation is complete.
     PauseOcclusionTracker();
@@ -370,7 +371,8 @@
       OnEndingAnimationComplete(/*canceled=*/false);
   } else {
     DCHECK(CanEnterOverview());
-    TRACE_EVENT_ASYNC_BEGIN0("ui", "OverviewController::EnterOverview", this);
+    TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("ui", "OverviewController::EnterOverview",
+                                      this);
 
     // Clear any animations that may be running from last overview end.
     for (const auto& animation : delayed_animations_)
@@ -508,8 +510,8 @@
   overview_session_->OnStartingAnimationComplete(canceled,
                                                  should_focus_overview_);
   UnpauseOcclusionTracker(kOcclusionPauseDurationForStart);
-  TRACE_EVENT_ASYNC_END1("ui", "OverviewController::EnterOverview", this,
-                         "canceled", canceled);
+  TRACE_EVENT_NESTABLE_ASYNC_END1("ui", "OverviewController::EnterOverview",
+                                  this, "canceled", canceled);
 }
 
 void OverviewController::OnEndingAnimationComplete(bool canceled) {
@@ -522,8 +524,8 @@
   for (auto& observer : observers_)
     observer.OnOverviewModeEndingAnimationComplete(canceled);
   UnpauseOcclusionTracker(occlusion_pause_duration_for_end_);
-  TRACE_EVENT_ASYNC_END1("ui", "OverviewController::ExitOverview", this,
-                         "canceled", canceled);
+  TRACE_EVENT_NESTABLE_ASYNC_END1("ui", "OverviewController::ExitOverview",
+                                  this, "canceled", canceled);
 }
 
 void OverviewController::ResetPauser() {
diff --git a/base/android/jni_generator/README.md b/base/android/jni_generator/README.md
index 3f0c89d..67056c3 100644
--- a/base/android/jni_generator/README.md
+++ b/base/android/jni_generator/README.md
@@ -58,25 +58,15 @@
 
 ### Calling Java -> Native
 
-There are two ways to call native methods:
-
-**Method 1 - Using the 'native' keyword (soon to be deprecated)**
-
-- Works for both static and non-static methods.
-- Methods marked as `native` will have stubs generated for them that forward
-  calls to C++ function (that you must write).
-- If the first parameter is a C++ object (e.g. `long mNativePointer`), then the
-  bindings will automatically generate the appropriate cast and call into C++
-  code (JNI itself is only C).
-
-**Method 2 - Using an interface annotated with @NativeMethods**
-
 - Declare methods using a nested interface annotated with `@NativeMethods`.
 - The JNI annotation processor generates a class named `${OriginalClassName}Jni`
   with a `get()` method that returns an implementation of the annotated
   interface. The C++ function that it routes to is the same as if it would be
   in the legacy method.
-- See example below for usage.
+- For each JNI method:
+  - C++ stubs are generated that forward to C++ functions that you must write.
+  - If the first parameter is a C++ object (e.g. `long mNativePointer`), then
+    the bindings will generate the appropriate cast and call into C++ code.
 
 To add JNI to a class:
 
@@ -97,32 +87,7 @@
 
 Example:
 ```java
-// The following classes would have the same generated native bindings (with the
-// exception of differing class names).
-
-// Legacy/deprecated static methods
-class Legacy {
-  static native void nativeFoo();
-  static native double nativeBar(int a, int b);
-
-  // Either the |ClassName| part of the |nativeClassName| parameter name must
-  // match the native class name exactly, or the method annotation
-  // @NativeClassQualifiedName("ClassName") must be used.
-  //
-  // If the native class is nested, use
-  // @NativeClassQualifiedName("FooClassName::BarClassName") and call the
-  // parameter |nativePointer|.
-  native void nativeNonStatic(long nativeClassName);
-
-  void callNatives() {
-    nativeFoo()
-    nativeBar(1,2);
-    nativeNonStatic(mNativePointer);
-  }
-}
-
-// Equivalent using new style:
-class NewStyle {
+class MyClass {
   // Cannot be private. Must be package or public.
   @NativeMethods
   /* package */ interface Natives {
@@ -150,6 +115,13 @@
 }
 ```
 
+**Using the 'native' keyword**
+
+- The binding generator also looks for `native` JNI method declarations and
+  generates stubs for them. This used to be the norm, but is now obsolete.
+- If you have native methods that you don't want stubs generated for, you should
+  add @JniIgnoreNatives to the class.
+
 #### Testing Mockable Natives
 
 1. Add the `JniMocker` rule to your test.
diff --git a/build/android/apk_operations.py b/build/android/apk_operations.py
index cb7a309..8ed169f 100755
--- a/build/android/apk_operations.py
+++ b/build/android/apk_operations.py
@@ -66,9 +66,9 @@
 def _InstallApk(devices, apk, install_dict):
   def install(device):
     if install_dict:
-      installer.Install(device, install_dict, apk=apk)
+      installer.Install(device, install_dict, apk=apk, permissions=[])
     else:
-      device.Install(apk, allow_downgrade=True, reinstall=True)
+      device.Install(apk, permissions=[], allow_downgrade=True, reinstall=True)
 
   logging.info('Installing %sincremental apk.', '' if install_dict else 'non-')
   device_utils.DeviceUtils.parallel(devices).pMap(install)
@@ -151,6 +151,7 @@
 
     device.Install(
         apk_helper_instance,
+        permissions=[],
         modules=modules,
         fake_modules=fake_modules,
         allow_downgrade=True)
diff --git a/build/android/gyp/compile_resources.py b/build/android/gyp/compile_resources.py
index cb44909b..0a84f46 100755
--- a/build/android/gyp/compile_resources.py
+++ b/build/android/gyp/compile_resources.py
@@ -556,7 +556,9 @@
         _JETIFY_SCRIPT_PATH, '-i', temp_archive.name, '-o', temp_archive.name,
         '-l', 'error'
     ]
-    subprocess.check_call(jetify_cmd)
+    env = os.environ.copy()
+    env['JAVA_HOME'] = build_utils.JAVA_HOME
+    subprocess.check_call(jetify_cmd, env=env)
     with zipfile.ZipFile(temp_archive.name) as zf:
       zf.extractall(output_path)
 
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 49d8f48e..85bc736 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -1527,6 +1527,13 @@
           "-Wno-range-loop-analysis",
         ]
 
+        if (is_android) {
+          cflags += [
+            # TODO(https://crbug.com/1016947) Clean up, enable.
+            "-Wno-bitwise-conditional-parentheses",
+          ]
+        }
+
         if (llvm_force_head_revision) {
           cflags += [
             # TODO(https://crbug.com/1050281): Clean up, enable.
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index baf39ad3..69a614d5 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-0.20200224.0.1
\ No newline at end of file
+0.20200224.1.1
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 0a4a022b..baf39ad3 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-0.20200222.0.1
\ No newline at end of file
+0.20200224.0.1
\ No newline at end of file
diff --git a/build/linux/sysroot_scripts/sysroot-creator.sh b/build/linux/sysroot_scripts/sysroot-creator.sh
index 9d47ddb..b9c2842 100644
--- a/build/linux/sysroot_scripts/sysroot-creator.sh
+++ b/build/linux/sysroot_scripts/sysroot-creator.sh
@@ -356,7 +356,7 @@
 
   # fcntl64() was introduced in glibc 2.28.  Make sure to use fcntl() instead.
   local fcntl_h="${INSTALL_ROOT}/usr/include/fcntl.h"
-  sed -i '{N; s/#ifndef \(__USE_FILE_OFFSET64\nextern int fcntl\)/#ifdef \1/}' \
+  sed -i '{N; s/#ifndef __USE_FILE_OFFSET64\(\nextern int fcntl\)/#if 1\1/}' \
       "${fcntl_h}"
   # On i386, fcntl() was updated in glibc 2.28.
   nm -D --defined-only --with-symbol-versions "${libc_so}" | \
diff --git a/build/linux/sysroot_scripts/sysroots.json b/build/linux/sysroot_scripts/sysroots.json
index 1b8a78be..ba915a9 100644
--- a/build/linux/sysroot_scripts/sysroots.json
+++ b/build/linux/sysroot_scripts/sysroots.json
@@ -1,36 +1,36 @@
 {
     "sid_amd64": {
-        "Sha1Sum": "9c905c99558f10e19cc878b5dca1d4bd58c607ae",
+        "Sha1Sum": "79a7783607a69b6f439add567eb6fcb48877085c",
         "SysrootDir": "debian_sid_amd64-sysroot",
         "Tarball": "debian_sid_amd64_sysroot.tar.xz"
     },
     "sid_arm": {
-        "Sha1Sum": "917c75b57e18baf9e34c8dfd493bcf555df4f183",
+        "Sha1Sum": "3fcc1d4e44127006318371002a0f421a4fde2ab4",
         "SysrootDir": "debian_sid_arm-sysroot",
         "Tarball": "debian_sid_arm_sysroot.tar.xz"
     },
     "sid_arm64": {
-        "Sha1Sum": "2ee3fb715f031df95b079ce6d2c8f5e8ba2cc6e4",
+        "Sha1Sum": "2cade9ee1ca9186b28ac768c19e1ab7c45ee0600",
         "SysrootDir": "debian_sid_arm64-sysroot",
         "Tarball": "debian_sid_arm64_sysroot.tar.xz"
     },
     "sid_armel": {
-        "Sha1Sum": "3c67dc4c2180665f57587a82984fa6fc1443d970",
+        "Sha1Sum": "72aecf0a5603919b41cfb0766fe511c34933e915",
         "SysrootDir": "debian_sid_armel-sysroot",
         "Tarball": "debian_sid_armel_sysroot.tar.xz"
     },
     "sid_i386": {
-        "Sha1Sum": "06de352631feeb333ee9daa571e9e0646c2ef1ed",
+        "Sha1Sum": "e954fb79fcddf64bc39d721c9a5b652b6da549fa",
         "SysrootDir": "debian_sid_i386-sysroot",
         "Tarball": "debian_sid_i386_sysroot.tar.xz"
     },
     "sid_mips": {
-        "Sha1Sum": "ea6d37e2f389bb417572ddf1552a4a3995932832",
+        "Sha1Sum": "ca96bbdba7cc36f09790c09694fd61da44e54f06",
         "SysrootDir": "debian_sid_mips-sysroot",
         "Tarball": "debian_sid_mips_sysroot.tar.xz"
     },
     "sid_mips64el": {
-        "Sha1Sum": "9279b28027ba31a60a21db1fde01e76e67814893",
+        "Sha1Sum": "4c1f3e3f4a11f820e152faffc49ccdfa1c435cc0",
         "SysrootDir": "debian_sid_mips64el-sysroot",
         "Tarball": "debian_sid_mips64el_sysroot.tar.xz"
     }
diff --git a/buildtools/DEPS b/buildtools/DEPS
index 1d1ccb5..04f42e3f 100644
--- a/buildtools/DEPS
+++ b/buildtools/DEPS
@@ -22,7 +22,7 @@
   # once libassistant's copy of buildtools rolls up to the rename.
   'libcxx_revision_v2':       'd9040c75cfea5928c804ab7c235fed06a63f743a',
   'libcxxabi_revision_v2':    '196ba1aaa8ac285d94f4ea8d9836390a45360533',
-  'libunwind_revision_v2':    'd999d54f4bca789543a2eb6c995af2d9b5a1f3ed',
+  'libunwind_revision_v2':    '43bb9f872232f531bac80093ceb4de61c64b9ab7',
 }
 
 deps = {
diff --git a/cc/trees/ukm_manager.cc b/cc/trees/ukm_manager.cc
index 04901432..5973c3f 100644
--- a/cc/trees/ukm_manager.cc
+++ b/cc/trees/ukm_manager.cc
@@ -95,7 +95,7 @@
     FrameSequenceTrackerType tracker_type,
     FrameSequenceMetrics::ThreadType thread_type,
     int64_t throughput) const {
-  ukm::builders::Graphics_Smoothness_Throughput builder(source_id_);
+  ukm::builders::Graphics_Smoothness_PercentDroppedFrames builder(source_id_);
   switch (thread_type) {
     case FrameSequenceMetrics::ThreadType::kMain: {
       switch (tracker_type) {
diff --git a/chrome/android/features/tab_ui/java/res/layout/tasks_view_layout.xml b/chrome/android/features/tab_ui/java/res/layout/tasks_view_layout.xml
index bd59291..f1e2cf4c 100644
--- a/chrome/android/features/tab_ui/java/res/layout/tasks_view_layout.xml
+++ b/chrome/android/features/tab_ui/java/res/layout/tasks_view_layout.xml
@@ -10,7 +10,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent">
 
-    <android.support.design.widget.AppBarLayout
+    <com.google.android.material.appbar.AppBarLayout
         android:id="@+id/task_surface_header"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
@@ -77,7 +77,7 @@
             android:layout_marginStart="@dimen/tab_carousel_start_margin"
             android:visibility="gone"
             app:layout_scrollFlags="scroll"/>
-    </android.support.design.widget.AppBarLayout>
+    </com.google.android.material.appbar.AppBarLayout>
     <FrameLayout
         android:id="@+id/tasks_surface_body"
         android:layout_width="match_parent"
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java
index 28d6f76..fd4603b6 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksSurfaceMediator.java
@@ -12,11 +12,12 @@
 import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.IS_VOICE_RECOGNITION_BUTTON_VISIBLE;
 import static org.chromium.chrome.browser.tasks.TasksSurfaceProperties.VOICE_SEARCH_BUTTON_CLICK_LISTENER;
 
-import android.support.annotation.Nullable;
 import android.text.Editable;
 import android.text.TextWatcher;
 import android.view.View;
 
+import androidx.annotation.Nullable;
+
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.browser.ntp.FakeboxDelegate;
 import org.chromium.chrome.browser.omnibox.LocationBar;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java
index bea5e64..775a3df 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/TasksView.java
@@ -6,7 +6,6 @@
 
 import android.content.Context;
 import android.content.res.Resources;
-import android.support.design.widget.AppBarLayout;
 import android.text.TextWatcher;
 import android.util.AttributeSet;
 import android.view.View;
@@ -17,6 +16,8 @@
 
 import androidx.annotation.Nullable;
 
+import com.google.android.material.appbar.AppBarLayout;
+
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.browser.coordinator.CoordinatorLayoutForPointer;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/NewTabTileView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/NewTabTileView.java
index 7a75de2..f9a08d0 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/NewTabTileView.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/NewTabTileView.java
@@ -5,12 +5,13 @@
 package org.chromium.chrome.browser.tasks.tab_management;
 
 import android.content.Context;
-import android.support.v4.view.ViewCompat;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.RelativeLayout;
 
+import androidx.core.view.ViewCompat;
+
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.tab_ui.R;
 
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SelectableTabGridView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SelectableTabGridView.java
index 71ddec11..df4cb28 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SelectableTabGridView.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/SelectableTabGridView.java
@@ -7,11 +7,12 @@
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.InsetDrawable;
-import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
-import android.support.v4.content.res.ResourcesCompat;
 import android.util.AttributeSet;
 import android.widget.ImageView;
 
+import androidx.core.content.res.ResourcesCompat;
+import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
+
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.components.browser_ui.widget.selectable_list.SelectableItemView;
 
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
index 2df2df9..0f93fa1 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
@@ -8,13 +8,13 @@
 
 import android.content.Context;
 import android.content.res.ColorStateList;
-import android.support.v7.content.res.AppCompatResources;
 import android.text.Editable;
 import android.text.TextWatcher;
 import android.view.View;
 
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
+import androidx.appcompat.content.res.AppCompatResources;
 
 import org.chromium.base.Callback;
 import org.chromium.base.metrics.RecordUserAction;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuCoordinator.java
index 56193ed1..d2cc33066 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMenuCoordinator.java
@@ -9,11 +9,12 @@
 import android.content.Context;
 import android.content.res.Configuration;
 import android.graphics.Rect;
-import android.support.annotation.IntDef;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.ListView;
 
+import androidx.annotation.IntDef;
+
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.Callback;
 import org.chromium.base.LifetimeAssert;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParent.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParent.java
index 8e72b3b4..77c37af 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParent.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogParent.java
@@ -16,9 +16,6 @@
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.GradientDrawable;
-import android.support.v4.content.ContextCompat;
-import android.support.v4.graphics.drawable.DrawableCompat;
-import android.support.v4.widget.ImageViewCompat;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -32,6 +29,9 @@
 import androidx.annotation.IntDef;
 import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
+import androidx.core.content.ContextCompat;
+import androidx.core.graphics.drawable.DrawableCompat;
+import androidx.core.widget.ImageViewCompat;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.Callback;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphDialogParent.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphDialogParent.java
index c2b9f31..c6cd1a29 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphDialogParent.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIphDialogParent.java
@@ -10,8 +10,6 @@
 import android.graphics.drawable.Animatable;
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
-import android.support.graphics.drawable.Animatable2Compat;
-import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -22,6 +20,8 @@
 import android.widget.TextView;
 
 import androidx.annotation.VisibleForTesting;
+import androidx.vectordrawable.graphics.drawable.Animatable2Compat;
+import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
 
 import org.chromium.chrome.browser.widget.ScrimView;
 import org.chromium.chrome.tab_ui.R;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
index 976f2a0..f71fddc 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
@@ -11,10 +11,6 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.InsetDrawable;
 import android.os.Build;
-import android.support.graphics.drawable.AnimatedVectorDrawableCompat;
-import android.support.v4.content.res.ResourcesCompat;
-import android.support.v4.graphics.drawable.DrawableCompat;
-import android.support.v4.view.ViewCompat;
 import android.text.TextUtils;
 import android.view.View;
 import android.view.ViewGroup;
@@ -22,6 +18,10 @@
 import android.widget.TextView;
 
 import androidx.annotation.Nullable;
+import androidx.core.content.res.ResourcesCompat;
+import androidx.core.graphics.drawable.DrawableCompat;
+import androidx.core.view.ViewCompat;
+import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.Callback;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView.java
index 8227fc6..cc45521 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiToolbarView.java
@@ -7,7 +7,6 @@
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.graphics.Color;
-import android.support.v4.widget.TextViewCompat;
 import android.text.TextWatcher;
 import android.util.AttributeSet;
 import android.view.Gravity;
@@ -17,6 +16,8 @@
 import android.widget.FrameLayout;
 import android.widget.LinearLayout;
 
+import androidx.core.widget.TextViewCompat;
+
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.ui.widget.ChromeImageView;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider.java
index 4898fa3..5e18e3a4 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListFaviconProvider.java
@@ -10,9 +10,9 @@
 import android.graphics.Canvas;
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
-import android.support.v7.content.res.AppCompatResources;
 
 import androidx.annotation.ColorInt;
+import androidx.appcompat.content.res.AppCompatResources;
 
 import org.chromium.base.Callback;
 import org.chromium.chrome.browser.favicon.FaviconHelper;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewBinder.java
index 9c245c2..6da5fae 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewBinder.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewBinder.java
@@ -8,13 +8,13 @@
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.InsetDrawable;
 import android.os.Build;
-import android.support.v4.content.res.ResourcesCompat;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.TextView;
 
 import androidx.annotation.Nullable;
+import androidx.core.content.res.ResourcesCompat;
 
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.ui.modelutil.PropertyKey;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java
index f19f27c..a6e13cc4 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java
@@ -7,12 +7,12 @@
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.graphics.Rect;
-import android.support.annotation.ColorInt;
-import android.support.v7.content.res.AppCompatResources;
 import android.view.View;
 
+import androidx.annotation.ColorInt;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.appcompat.content.res.AppCompatResources;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.browser.tab.Tab;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java
index 78df541..2f33529 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java
@@ -6,11 +6,12 @@
 
 import android.content.Context;
 import android.content.res.ColorStateList;
-import android.support.annotation.ColorInt;
-import android.support.v7.content.res.AppCompatResources;
 import android.util.AttributeSet;
 import android.widget.Button;
 
+import androidx.annotation.ColorInt;
+import androidx.appcompat.content.res.AppCompatResources;
+
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.components.browser_ui.widget.NumberRollView;
 import org.chromium.components.browser_ui.widget.TintedDrawable;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabStripViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabStripViewBinder.java
index 4a0fbb0..ccca398 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabStripViewBinder.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabStripViewBinder.java
@@ -5,13 +5,13 @@
 package org.chromium.chrome.browser.tasks.tab_management;
 
 import android.graphics.drawable.Drawable;
-import android.support.v4.content.res.ResourcesCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v7.content.res.AppCompatResources;
 import android.view.ViewGroup;
 import android.widget.ImageButton;
 
 import androidx.annotation.Nullable;
+import androidx.appcompat.content.res.AppCompatResources;
+import androidx.core.content.res.ResourcesCompat;
+import androidx.core.view.ViewCompat;
 
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.ui.modelutil.PropertyKey;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiColorProvider.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiColorProvider.java
index 4c47fa5..4c229fd00 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiColorProvider.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiColorProvider.java
@@ -7,9 +7,9 @@
 import android.content.Context;
 import android.content.res.ColorStateList;
 import android.graphics.drawable.Drawable;
-import android.support.v7.content.res.AppCompatResources;
 
 import androidx.annotation.ColorInt;
+import androidx.appcompat.content.res.AppCompatResources;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.tab_ui.R;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java
index 9eaf212..fdf9b7b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java
@@ -16,7 +16,6 @@
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.permissions.AndroidPermissionRequester;
 import org.chromium.chrome.browser.tab.Tab;
@@ -250,7 +249,7 @@
     @CalledByNative
     private static void onDownloadStarted() {
         if (!BrowserStartupController.getInstance().isFullBrowserStarted()) return;
-        if (CachedFeatureFlags.isDownloadProgressInfoBarEnabled()) return;
+        if (ChromeFeatureList.isEnabled(ChromeFeatureList.DOWNLOAD_PROGRESS_INFOBAR)) return;
         DownloadUtils.showDownloadStartToast(ContextUtils.getApplicationContext());
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfoBarController.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfoBarController.java
index 3ed46c97..0478834 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfoBarController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadInfoBarController.java
@@ -23,7 +23,6 @@
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.DeviceConditions;
 import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.infobar.DownloadProgressInfoBar;
 import org.chromium.chrome.browser.infobar.IPHInfoBarSupport;
@@ -418,7 +417,7 @@
      */
     private void computeNextStepForUpdate(OfflineItem updatedItem, boolean forceShowDownloadStarted,
             boolean userCancel, boolean itemWasRemoved) {
-        if (!CachedFeatureFlags.isDownloadProgressInfoBarEnabled()) return;
+        if (!ChromeFeatureList.isEnabled(ChromeFeatureList.DOWNLOAD_PROGRESS_INFOBAR)) return;
 
         if (updatedItem != null && mIgnoredItems.contains(updatedItem.id)) return;
 
@@ -753,7 +752,7 @@
      */
     @VisibleForTesting
     protected void showInfoBar(@DownloadInfoBarState int state, DownloadProgressInfoBarData info) {
-        if (!CachedFeatureFlags.isDownloadProgressInfoBarEnabled()) return;
+        if (!ChromeFeatureList.isEnabled(ChromeFeatureList.DOWNLOAD_PROGRESS_INFOBAR)) return;
 
         mCurrentInfo = info;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java b/chrome/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
index a38fdc57..9753ef6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
@@ -201,7 +201,6 @@
      */
     public static void cacheAdditionalNativeFlags() {
         cacheNightModeAvailable();
-        cacheNightModeDefaultToLight();
         cacheNetworkServiceWarmUpEnabled();
         cacheNativeTabSwitcherUiFlags();
         cacheReachedCodeProfilerTrialGroup();
@@ -308,46 +307,6 @@
     }
 
     /**
-     * Cache whether or not to default to the light theme when the night mode feature is enabled.
-     */
-    public static void cacheNightModeDefaultToLight() {
-        // Do not cache on Q (where defaulting to light theme does not apply) or if night mode is
-        // not enabled.
-        if (BuildInfo.isAtLeastQ()
-                || !ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_NIGHT_MODE)) {
-            return;
-        }
-
-        String lightModeDefaultParam = "default_light_theme";
-        boolean lightModeAsDefault = ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean(
-                ChromeFeatureList.ANDROID_NIGHT_MODE, lightModeDefaultParam, true);
-
-        SharedPreferencesManager.getInstance().writeBoolean(
-                ChromePreferenceKeys.FLAGS_CACHED_NIGHT_MODE_DEFAULT_TO_LIGHT, lightModeAsDefault);
-    }
-
-    /**
-     * @return Whether or not to default to the light theme when the night mode feature is enabled.
-     */
-    public static boolean isNightModeDefaultToLight() {
-        if (BuildInfo.isAtLeastQ()) {
-            return false;
-        }
-        return getConsistentBooleanValue(
-                ChromePreferenceKeys.FLAGS_CACHED_NIGHT_MODE_DEFAULT_TO_LIGHT, true);
-    }
-
-    /**
-     * Toggles whether the night mode experiment is enabled for testing. Should be reset back to
-     * null after the test has finished.
-     */
-    @VisibleForTesting
-    public static void setNightModeDefaultToLightForTesting(@Nullable Boolean available) {
-        sBoolValuesReturned.put(
-                ChromePreferenceKeys.FLAGS_CACHED_NIGHT_MODE_DEFAULT_TO_LIGHT, available);
-    }
-
-    /**
      * @return Whether or not night mode experiment is enabled (i.e. night mode experiment is
      *         enabled) for custom tabs.
      */
@@ -367,13 +326,6 @@
         return isEnabled(ChromeFeatureList.COMMAND_LINE_ON_NON_ROOTED);
     }
 
-    /**
-     * @return Whether or not the download progress infobar is enabled.
-     */
-    public static boolean isDownloadProgressInfoBarEnabled() {
-        return ChromeFeatureList.isEnabled(ChromeFeatureList.DOWNLOAD_PROGRESS_INFOBAR);
-    }
-
     private static void cacheStartSurfaceVariation() {
         String feature = ChromeFeatureList.getFieldTrialParamByFeature(
                 ChromeFeatureList.START_SURFACE_ANDROID, "start_surface_variation");
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionInfoBar.java
index d7d49a0c..bcc9336c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionInfoBar.java
@@ -13,16 +13,15 @@
 import org.chromium.chrome.browser.settings.SettingsLauncher;
 import org.chromium.chrome.browser.settings.website.SingleCategorySettings;
 import org.chromium.chrome.browser.settings.website.SiteSettingsCategory;
-import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.ui.base.WindowAndroid;
 
 /**
  * An infobar used for prompting the user to grant a web API permission.
  */
 public class PermissionInfoBar
         extends ConfirmInfoBar implements AndroidPermissionRequester.RequestDelegate {
-
-    /** The tab which this infobar will be displayed upon. */
-    protected final Tab mTab;
+    /** The window which this infobar will be displayed upon. */
+    protected final WindowAndroid mWindow;
 
     /** The content settings types corresponding to the permission requested in this infobar. */
     protected int[] mContentSettingsTypes;
@@ -42,12 +41,12 @@
     /** The secondary text shown below the message in the expanded state. */
     private String mDescription;
 
-    protected PermissionInfoBar(Tab tab, int[] contentSettingsTypes, int iconDrawableId,
-            String compactMessage, String compactLinkText, String message, String description,
-            String primaryButtonText, String secondaryButtonText) {
+    protected PermissionInfoBar(WindowAndroid window, int[] contentSettingsTypes,
+            int iconDrawableId, String compactMessage, String compactLinkText, String message,
+            String description, String primaryButtonText, String secondaryButtonText) {
         super(iconDrawableId, R.color.infobar_icon_drawable_color, null /* iconBitmap */, message,
                 null /* linkText */, primaryButtonText, secondaryButtonText);
-        mTab = tab;
+        mWindow = window;
         mContentSettingsTypes = contentSettingsTypes;
         mManageButtonLastClicked = false;
         mIsExpanded = false;
@@ -88,7 +87,7 @@
             // requestAndroidPermissions will call back into this class to finalize the action if it
             // returns true.
             if (AndroidPermissionRequester.requestAndroidPermissions(
-                        mTab, mContentSettingsTypes.clone(), this)) {
+                        mWindow, mContentSettingsTypes.clone(), this)) {
                 return;
             }
         } else {
@@ -137,7 +136,7 @@
 
     /**
      * Creates and begins the process for showing a PermissionInfoBar.
-     * @param tab                   The owning tab for the infobar.
+     * @param window                The window this infobar will be displayed upon.
      * @param contentSettingsTypes  The list of ContentSettingTypes being requested by this infobar.
      * @param enumeratedIconId      ID corresponding to the icon that will be shown for the infobar.
      *                              The ID must have been mapped using the ResourceMapper class
@@ -150,12 +149,12 @@
      * @param buttonManage          String to display on the Manage button.
      */
     @CalledByNative
-    private static PermissionInfoBar create(Tab tab, int[] contentSettingsTypes,
+    private static PermissionInfoBar create(WindowAndroid window, int[] contentSettingsTypes,
             int enumeratedIconId, String compactMessage, String compactLinkText, String message,
             String description, String buttonOk, String buttonManage) {
         int drawableId = ResourceId.mapToDrawableId(enumeratedIconId);
 
-        PermissionInfoBar infoBar = new PermissionInfoBar(tab, contentSettingsTypes, drawableId,
+        PermissionInfoBar infoBar = new PermissionInfoBar(window, contentSettingsTypes, drawableId,
                 compactMessage, compactLinkText, message, description, buttonOk, buttonManage);
 
         return infoBar;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeUtils.java
index 45e569c..2c3a400 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeUtils.java
@@ -16,8 +16,8 @@
 import androidx.annotation.StyleRes;
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.base.BuildInfo;
 import org.chromium.chrome.browser.ChromeBaseAppCompatActivity;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 
 /**
@@ -25,6 +25,7 @@
  */
 public class NightModeUtils {
     private static Boolean sNightModeSupportedForTest;
+    private static Boolean sNightModeDefaultToLightForTesting;
 
     /**
      * Due to Lemon issues on resources access, night mode is disabled on Kitkat until the issue is
@@ -137,8 +138,7 @@
     public static @ThemeType int getThemeSetting() {
         int userSetting = SharedPreferencesManager.getInstance().readInt(UI_THEME_SETTING, -1);
         if (userSetting == -1) {
-            return CachedFeatureFlags.isNightModeDefaultToLight() ? ThemeType.LIGHT
-                                                                  : ThemeType.SYSTEM_DEFAULT;
+            return isNightModeDefaultToLight() ? ThemeType.LIGHT : ThemeType.SYSTEM_DEFAULT;
         } else {
             return userSetting;
         }
@@ -148,4 +148,23 @@
     public static void setNightModeSupportedForTesting(@Nullable Boolean nightModeSupported) {
         sNightModeSupportedForTest = nightModeSupported;
     }
+
+    /**
+     * @return Whether or not to default to the light theme when the night mode feature is enabled.
+     */
+    public static boolean isNightModeDefaultToLight() {
+        if (sNightModeDefaultToLightForTesting != null) {
+            return sNightModeDefaultToLightForTesting;
+        }
+        return !BuildInfo.isAtLeastQ();
+    }
+
+    /**
+     * Toggles whether the night mode experiment is enabled for testing. Should be reset back to
+     * null after the test has finished.
+     */
+    @VisibleForTesting
+    public static void setNightModeDefaultToLightForTesting(@Nullable Boolean available) {
+        sNightModeDefaultToLightForTesting = available;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageDownloadBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageDownloadBridge.java
index 0ef500e..fabacee 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageDownloadBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageDownloadBridge.java
@@ -31,7 +31,7 @@
 import org.chromium.chrome.browser.download.DownloadNotifier;
 import org.chromium.chrome.browser.download.DownloadSharedPreferenceEntry;
 import org.chromium.chrome.browser.download.DownloadSharedPreferenceHelper;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.offlinepages.OfflinePageOrigin;
 import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
 import org.chromium.chrome.browser.tab.Tab;
@@ -233,7 +233,7 @@
      */
     @CalledByNative
     public static void showDownloadingToast() {
-        if (CachedFeatureFlags.isDownloadProgressInfoBarEnabled()) {
+        if (ChromeFeatureList.isEnabled(ChromeFeatureList.DOWNLOAD_PROGRESS_INFOBAR)) {
             DownloadManagerService.getDownloadManagerService()
                     .getInfoBarController(false)
                     .onDownloadStarted();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageNotificationBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageNotificationBridge.java
index 24796120..2dd1cd97 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageNotificationBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageNotificationBridge.java
@@ -14,7 +14,7 @@
 import org.chromium.chrome.browser.download.DownloadSharedPreferenceEntry;
 import org.chromium.chrome.browser.download.DownloadSharedPreferenceHelper;
 import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.offlinepages.OfflinePageOrigin;
 import org.chromium.components.offline_items_collection.ContentId;
 import org.chromium.components.offline_items_collection.FailState;
@@ -207,7 +207,7 @@
      */
     @CalledByNative
     public static void showDownloadingToast() {
-        if (CachedFeatureFlags.isDownloadProgressInfoBarEnabled()) {
+        if (ChromeFeatureList.isEnabled(ChromeFeatureList.DOWNLOAD_PROGRESS_INFOBAR)) {
             intializeOfflineItemsCollection();
             DownloadManagerService.getDownloadManagerService()
                     .getInfoBarController(false)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewTabHelper.java
index 8061207e..a07f2d0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewTabHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewTabHelper.java
@@ -6,7 +6,6 @@
 
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.content_public.browser.NavigationHandle;
 
 /**
  * Manages the Paint Preview component for a given {@link Tab}. Destroyed together with the tab.
@@ -26,7 +25,7 @@
     }
 
     @Override
-    public void onDidFinishNavigation(Tab tab, NavigationHandle navigationHandle) {
+    public void onPageLoadFinished(Tab tab, String url) {
         if (qualifiesForCapture(tab)) {
             PaintPreviewExperiments.runCaptureExperiment(tab.getWebContents());
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java
index 61d7578..1b1587f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java
@@ -25,11 +25,13 @@
 import org.chromium.IsReadyToPayServiceCallback;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.ThreadUtils;
+import org.chromium.base.task.PostTask;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.components.payments.ErrorStrings;
 import org.chromium.components.url_formatter.SchemeDisplay;
 import org.chromium.components.url_formatter.UrlFormatter;
+import org.chromium.content_public.browser.UiThreadTaskTraits;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.payments.mojom.PaymentCurrencyAmount;
 import org.chromium.payments.mojom.PaymentDetailsModifier;
@@ -239,6 +241,7 @@
     }
 
     private void respondToIsReadyToPayQuery(boolean isReadyToPay) {
+        ThreadUtils.assertOnUiThread();
         if (mServiceConnection != null) {
             if (mIsServiceBindingInitiated) {
                 // mServiceConnection "parameter must not be null."
@@ -255,12 +258,14 @@
     }
 
     private void sendIsReadyToPayIntentToPaymentApp(IsReadyToPayService isReadyToPayService) {
+        ThreadUtils.assertOnUiThread();
         if (mIsReadyToPayCallback == null) return;
         mIsReadyToPayQueried = true;
         IsReadyToPayServiceCallback.Stub callback = new IsReadyToPayServiceCallback.Stub() {
             @Override
             public void handleIsReadyToPay(boolean isReadyToPay) throws RemoteException {
-                respondToIsReadyToPayQuery(isReadyToPay);
+                PostTask.runOrPostTask(
+                        UiThreadTaskTraits.DEFAULT, () -> respondToIsReadyToPayQuery(isReadyToPay));
             }
         };
         try {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/permissions/AndroidPermissionRequester.java b/chrome/android/java/src/org/chromium/chrome/browser/permissions/AndroidPermissionRequester.java
index c3b01531..609eb2d67 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/permissions/AndroidPermissionRequester.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/permissions/AndroidPermissionRequester.java
@@ -15,7 +15,6 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.metrics.WebApkUma;
 import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
-import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.webapps.WebApkActivity;
 import org.chromium.components.content_settings.ContentSettingsType;
 import org.chromium.ui.base.PermissionCallback;
@@ -89,9 +88,8 @@
      * If true is returned, this method will asynchronously request the necessary permissions using
      * a dialog, running methods on the RequestDelegate when the user has made a decision.
      */
-    public static boolean requestAndroidPermissions(
-            final Tab tab, final int[] contentSettingsTypes, final RequestDelegate delegate) {
-        final WindowAndroid windowAndroid = tab.getWindowAndroid();
+    public static boolean requestAndroidPermissions(final WindowAndroid windowAndroid,
+            final int[] contentSettingsTypes, final RequestDelegate delegate) {
         if (windowAndroid == null) return false;
 
         final SparseArray<String[]> contentSettingsTypesToPermissionsMap =
@@ -149,7 +147,9 @@
                                     + deniedContentSettings;
 
                     showMissingPermissionDialog(activity, deniedStringId,
-                            () -> requestAndroidPermissions(tab, contentSettingsTypes, delegate),
+                            ()
+                                    -> requestAndroidPermissions(
+                                            windowAndroid, contentSettingsTypes, delegate),
                             delegate::onAndroidPermissionCanceled);
                 } else if (deniedContentSettings.isEmpty()) {
                     delegate.onAndroidPermissionAccepted();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogController.java b/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogController.java
index dd84e2e..c41f326 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogController.java
@@ -5,13 +5,12 @@
 package org.chromium.chrome.browser.permissions;
 
 import android.annotation.SuppressLint;
+import android.app.Activity;
 
 import androidx.annotation.IntDef;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.chrome.browser.ChromeActivity;
-import org.chromium.chrome.browser.tab.TabImpl;
 import org.chromium.ui.modaldialog.DialogDismissalCause;
 import org.chromium.ui.modaldialog.ModalDialogManager;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
@@ -138,7 +137,7 @@
         assert mState == State.NOT_SHOWING;
 
         mDialogDelegate = mRequestQueue.remove(0);
-        ChromeActivity activity = ((TabImpl) mDialogDelegate.getTab()).getActivity();
+        Activity activity = mDialogDelegate.getWindow().getActivity().get();
 
         // It's possible for the activity to be null if we reach here just after the user
         // backgrounds the browser and cleanup has happened. In that case, we can't show a prompt,
@@ -158,8 +157,7 @@
             return;
         }
 
-        mModalDialogManager =
-                ((TabImpl) mDialogDelegate.getTab()).getActivity().getModalDialogManager();
+        mModalDialogManager = mDialogDelegate.getWindow().getModalDialogManager();
         mDialogModel = PermissionDialogModel.getModel(this, mDialogDelegate);
         mModalDialogManager.showDialog(mDialogModel, ModalDialogManager.ModalDialogType.TAB);
         mState = State.PROMPT_OPEN;
@@ -205,7 +203,7 @@
             // no system level permissions need to be requested, so just run the
             // accept callback.
             mState = State.REQUEST_ANDROID_PERMISSIONS;
-            if (!AndroidPermissionRequester.requestAndroidPermissions(mDialogDelegate.getTab(),
+            if (!AndroidPermissionRequester.requestAndroidPermissions(mDialogDelegate.getWindow(),
                         mDialogDelegate.getContentSettingsTypes(),
                         PermissionDialogController.this)) {
                 onAndroidPermissionAccepted();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogDelegate.java
index 07d4099..d0287e3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogDelegate.java
@@ -7,7 +7,7 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.ResourceId;
-import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.ui.base.WindowAndroid;
 
 /**
  * Delegate class for modal permission dialogs. Contains all of the data displayed in a prompt,
@@ -24,8 +24,8 @@
     /** The controller for this class */
     private PermissionDialogController mDialogController;
 
-    /** The tab for which to create the dialog. */
-    private Tab mTab;
+    /** The window for which to create the dialog. */
+    private WindowAndroid mWindow;
 
     /** The icon to display in the dialog. */
     private int mDrawableId;
@@ -42,8 +42,8 @@
     /** The {@link ContentSettingsType}s requested in this dialog.  */
     private int[] mContentSettingsTypes;
 
-    public Tab getTab() {
-        return mTab;
+    public WindowAndroid getWindow() {
+        return mWindow;
     }
 
     public int[] getContentSettingsTypes() {
@@ -105,7 +105,7 @@
      * Called from C++ by |nativeDelegatePtr| to instantiate this class.
      *
      * @param nativeDelegatePtr     The native counterpart that this object owns.
-     * @param tab                   The tab to create the dialog for.
+     * @param window                   The window to create the dialog for.
      * @param contentSettingsTypes  The content settings types requested by this dialog.
      * @param iconResourceId        The id of the icon to display in the dialog.
      * @param message               The message to display in the dialog.
@@ -113,21 +113,21 @@
      * @param secondaryTextButton   The text to display on the primary button.
      */
     @CalledByNative
-    private static PermissionDialogDelegate create(long nativeDelegatePtr, Tab tab,
+    private static PermissionDialogDelegate create(long nativeDelegatePtr, WindowAndroid window,
             int[] contentSettingsTypes, int enumeratedIconId, String message,
             String primaryButtonText, String secondaryButtonText) {
-        return new PermissionDialogDelegate(nativeDelegatePtr, tab, contentSettingsTypes,
+        return new PermissionDialogDelegate(nativeDelegatePtr, window, contentSettingsTypes,
                 enumeratedIconId, message, primaryButtonText, secondaryButtonText);
     }
 
     /**
      * Upon construction, this class takes ownership of the passed in native delegate.
      */
-    private PermissionDialogDelegate(long nativeDelegatePtr, Tab tab, int[] contentSettingsTypes,
-            int enumeratedIconId, String message, String primaryButtonText,
-            String secondaryButtonText) {
+    private PermissionDialogDelegate(long nativeDelegatePtr, WindowAndroid window,
+            int[] contentSettingsTypes, int enumeratedIconId, String message,
+            String primaryButtonText, String secondaryButtonText) {
         mNativeDelegatePtr = nativeDelegatePtr;
-        mTab = tab;
+        mWindow = window;
         mContentSettingsTypes = contentSettingsTypes;
         mDrawableId = ResourceId.mapToDrawableId(enumeratedIconId);
         mMessageText = message;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogModel.java b/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogModel.java
index f620466..ebb0c3e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogModel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/permissions/PermissionDialogModel.java
@@ -12,7 +12,6 @@
 import android.widget.TextView;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.tab.TabImpl;
 import org.chromium.ui.modaldialog.ModalDialogProperties;
 import org.chromium.ui.modelutil.PropertyModel;
 
@@ -22,7 +21,8 @@
 class PermissionDialogModel {
     public static PropertyModel getModel(
             ModalDialogProperties.Controller controller, PermissionDialogDelegate delegate) {
-        Context context = ((TabImpl) delegate.getTab()).getActivity();
+        Context context = delegate.getWindow().getActivity().get();
+        assert context != null;
         LayoutInflater inflater = LayoutInflater.from(context);
         View customView = inflater.inflate(R.layout.permission_dialog, null);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webauth/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/webauth/OWNERS
index 50890b7..99c79f6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webauth/OWNERS
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webauth/OWNERS
@@ -1,5 +1,4 @@
-kenrb@chromium.org
-kpaulhamus@chromium.org
+file://device/fido/OWNERS
 
-# COMPONENT: Blink>WebAuthentication
 # TEAM: identity-dev@chromium.org
+# COMPONENT: Blink>WebAuthentication
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/settings/ThemeSettingsFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/settings/ThemeSettingsFragmentTest.java
index c0dd0f2..dab5d73 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/settings/ThemeSettingsFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/settings/ThemeSettingsFragmentTest.java
@@ -24,7 +24,6 @@
 import org.chromium.base.test.params.ParameterizedRunner;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.night_mode.NightModeUtils;
 import org.chromium.chrome.browser.night_mode.ThemeType;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
@@ -60,7 +59,7 @@
 
     public ThemeSettingsFragmentTest(boolean defaultToLight) {
         mDefaultToLight = defaultToLight;
-        CachedFeatureFlags.setNightModeDefaultToLightForTesting(defaultToLight);
+        NightModeUtils.setNightModeDefaultToLightForTesting(defaultToLight);
     }
 
     @Override
@@ -83,7 +82,7 @@
             SharedPreferencesManager.getInstance().removeKey(UI_THEME_DARKEN_WEBSITES_ENABLED);
         });
 
-        CachedFeatureFlags.setNightModeDefaultToLightForTesting(null);
+        NightModeUtils.setNightModeDefaultToLightForTesting(null);
         super.tearDownTest();
     }
 
@@ -95,7 +94,7 @@
             // Default to light parameter is only applicable pre-Q.
             if (mDefaultToLight && BuildInfo.isAtLeastQ()) {
                 Assert.assertFalse("Q should not default to light.",
-                        CachedFeatureFlags.isNightModeDefaultToLight());
+                        NightModeUtils.isNightModeDefaultToLight());
                 return;
             }
 
@@ -140,7 +139,7 @@
             // Default to light parameter is only applicable pre-Q.
             if (mDefaultToLight && BuildInfo.isAtLeastQ()) {
                 Assert.assertFalse("Q should not default to light.",
-                        CachedFeatureFlags.isNightModeDefaultToLight());
+                        NightModeUtils.isNightModeDefaultToLight());
                 return;
             }
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateControllerTest.java
index 49c88f4..94583e7b 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateControllerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateControllerTest.java
@@ -30,7 +30,6 @@
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.DisableIf;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 
 /**
@@ -110,13 +109,13 @@
     @Test
     @DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.P)
     public void testUpdateNightMode_PowerSaveMode_DefaultsToLight() {
-        CachedFeatureFlags.setNightModeDefaultToLightForTesting(true);
+        NightModeUtils.setNightModeDefaultToLightForTesting(true);
 
         // Enable power save mode and verify night mode is not enabled.
         setIsPowerSaveMode(true);
         assertFalse(mGlobalNightModeStateController.isInNightMode());
 
-        CachedFeatureFlags.setNightModeDefaultToLightForTesting(null);
+        NightModeUtils.setNightModeDefaultToLightForTesting(null);
     }
 
     @Test
@@ -137,13 +136,13 @@
     @Test
     @DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.P)
     public void testUpdateNightMode_SystemNightMode_DefaultsToLight() {
-        CachedFeatureFlags.setNightModeDefaultToLightForTesting(true);
+        NightModeUtils.setNightModeDefaultToLightForTesting(true);
 
         // Enable system night mode and verify night mode is not enabled.
         setSystemNightMode(true);
         assertFalse(mGlobalNightModeStateController.isInNightMode());
 
-        CachedFeatureFlags.setNightModeDefaultToLightForTesting(null);
+        NightModeUtils.setNightModeDefaultToLightForTesting(null);
     }
 
     @Test
diff --git a/chrome/app/chrome_command_ids.h b/chrome/app/chrome_command_ids.h
index 6f1d335..edd20f8 100644
--- a/chrome/app/chrome_command_ids.h
+++ b/chrome/app/chrome_command_ids.h
@@ -59,8 +59,6 @@
 #define IDC_MINIMIZE_WINDOW             34046
 #define IDC_MAXIMIZE_WINDOW             34047
 #define IDC_ALL_WINDOWS_FRONT           34048
-#define IDC_VISIT_DESKTOP_OF_LRU_USER_2 34049
-#define IDC_VISIT_DESKTOP_OF_LRU_USER_3 34050
 
 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
 #define IDC_USE_SYSTEM_TITLE_BAR        34051
@@ -80,6 +78,14 @@
 // Terminal system app commands
 #define IDC_TERMINAL_SPLIT_HORIZONTAL   34070
 #define IDC_TERMINAL_SPLIT_VERTICAL     34071
+
+// Move window to other user commands
+#define IDC_VISIT_DESKTOP_OF_LRU_USER_2 34080
+#define IDC_VISIT_DESKTOP_OF_LRU_USER_3 34081
+#define IDC_VISIT_DESKTOP_OF_LRU_USER_4 34082
+#define IDC_VISIT_DESKTOP_OF_LRU_USER_5 34083
+#define IDC_VISIT_DESKTOP_OF_LRU_USER_NEXT IDC_VISIT_DESKTOP_OF_LRU_USER_2
+#define IDC_VISIT_DESKTOP_OF_LRU_USER_LAST IDC_VISIT_DESKTOP_OF_LRU_USER_5
 #endif
 
 // Page-related commands
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 66427a5..98e0be2 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -2652,7 +2652,7 @@
     Successful enrollment illustration
   </message>
   <message name="IDS_ENTERPRISE_ENROLLMENT_SUCCESS_DOMAIN" desc="Success message to be shown once enterprise enrollment completes.">
-    This <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> will be managed by <ph name="BEGIN_BOLD">&lt;strong&gt;</ph><ph name="DOMAIN">$2<ex>acmecorp.com</ex></ph><ph name="END_BOLD">&lt;/strong&gt;</ph>.
+    This <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> will be managed by <ph name="DOMAIN">$2<ex>acmecorp.com</ex></ph>.
   </message>
   <message name="IDS_ENTERPRISE_ENROLLMENT_SUCCESS_ABE_SUPPORT" desc="Recommendation to contact support. Shown once attestation-based enterprise enrollment completes.">
     If this is unexpected, please contact support.
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index 8e8560e6..45d2c40c 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -1920,6 +1920,9 @@
   <message name="IDS_SETTINGS_WAKE_ON_WIFI_DESCRIPTION" desc="In the settings tab, the text next to the checkbox for enabling quickly reconnecting to known Wi-Fi SSIDs.">
     Keep Wi-Fi on during sleep
   </message>
+  <message name="IDS_SETTINGS_PERMISSIONS" desc="Name of the settings page which allows users to manage permissions and site content settings">
+    Permissions and content settings
+  </message>
   <message name="IDS_SETTINGS_SECURITY" desc="Name of the settings page which allows
   users to manage security settings">
     Security
@@ -1975,6 +1978,48 @@
   <message name="IDS_SETTINGS_SYNC_AND_GOOGLE_SERVICES_PRIVACY_DESC_UNIFIED_CONSENT" desc="The description of the 'Sync and Google services' row in the privacy section">
     More settings that relate to privacy, security, and data collection
   </message>
+  <message name="IDS_SETTINGS_RECENT_PERMISSIONS_NO_CHANGES" desc="Text shown to a user when they have not changed any site permissions instead of showing recently changed permissions">
+    No recently changed permissions
+  </message>
+  <message name="IDS_SETTINGS_RECENT_PERMISSIONS_CHANGE_AUTOBLOCKED_SENTENCE_START" desc="An indicator that a specific permission has been automatically blocked by the browser, This will be used to start a sentence or by itself">
+    Automatically blocked <ph name="PERMISSION">$1<ex>Notifications</ex></ph>
+  </message>
+  <message name="IDS_SETTINGS_RECENT_PERMISSIONS_CHANGE_BLOCKED_SENTENCE_START" desc="An indicator that a specific permission has been blocked for a website by the user. This will be used to start a sentence or by itself">
+    Blocked <ph name="PERMISSION">$1<ex>Location</ex></ph>
+  </message>
+  <message name="IDS_SETTINGS_RECENT_PERMISSIONS_CHANGE_ALLOWED_SENTENCE_START" desc="An indicator that a specific permission has been allowed for a website by the user. This will be used to start a sentence or by itself">
+    Allowed <ph name="PERMISSION">$1<ex>Camera</ex></ph>
+  </message>
+  <message name="IDS_SETTINGS_RECENT_PERMISSIONS_CHANGE_AUTOBLOCKED" desc="An indicator that a specific permission has been automatically blocked by the browser, This will be used inside a sentance">
+    automatically blocked <ph name="PERMISSION">$1<ex>Notifications</ex></ph>
+  </message>
+  <message name="IDS_SETTINGS_RECENT_PERMISSIONS_CHANGE_BLOCKED" desc="An indicator that a specific permission has been blocked for a website by the user. This will be used inside a sentance">
+    blocked <ph name="PERMISSION">$1<ex>Location</ex></ph>
+  </message>
+  <message name="IDS_SETTINGS_RECENT_PERMISSIONS_CHANGE_ALLOWED" desc="An indicator that a specific permission has been allowed for a website by the user. This will be used inside of a sentance">
+    allowed <ph name="PERMISSION">$1<ex>Camera</ex></ph>
+  </message>
+  <message name="IDS_SETTINGS_RECENT_PERMISSIONS_TWO_ITEMS" desc="A list containing two permissions which have recently changed">
+    <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START">$1<ex>Automatically blocked Notifications</ex></ph>, <ph name="RECENT_PERMISSIONS_CHANGE">$2<ex>blocked Location</ex></ph>
+  </message>
+  <message name="IDS_SETTINGS_RECENT_PERMISSIONS_THREE_ITEMS" desc="A list containing three permissions which have recently changed">
+    <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START">$1<ex>Automatically blocked Notifications</ex></ph>, <ph name="RECENT_PERMISSIONS_CHANGE_1">$2<ex>blocked Location</ex></ph>, <ph name="RECENT_PERMISSIONS_CHANGE_2">$3<ex>allowed Camera</ex></ph>
+  </message>
+  <message name="IDS_SETTINGS_RECENT_PERMISSIONS_OVER_THREE_ITEMS" desc="A list containing three permissions that have recently changed, but indicating that more have also changed recently">
+    <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START">$1<ex>Automatically blocked Notifications</ex></ph>, <ph name="RECENT_PERMISSIONS_CHANGE_1">$2<ex>blocked Location</ex></ph>, <ph name="RECENT_PERMISSIONS_CHANGE_2">$3<ex>allowed Camera</ex></ph>, and more
+  </message>
+  <message name="IDS_SETTINGS_RECENT_PERMISSIONS_ONE_ITEM_INCOGNITO" desc="A list containing a single permission which has recently changed in the users incognito session">
+    Current incognito session: <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START">$1<ex>automatically blocked Notifications</ex></ph>
+  </message>
+  <message name="IDS_SETTINGS_RECENT_PERMISSIONS_TWO_ITEMS_INCOGNITO" desc="A list containing two permissions which have recently changed in the users incognito session">
+    Current incognito session: <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START">$1<ex>automatically blocked Notifications</ex></ph>, <ph name="RECENT_PERMISSIONS_CHANGE_1">$2<ex>blocked Location</ex></ph>
+  </message>
+  <message name="IDS_SETTINGS_RECENT_PERMISSIONS_THREE_ITEMS_INCOGNITO" desc="A list containing three permissions which have recently changed in the users incognito session">
+    Current incognito session: <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START">$1<ex>automatically blocked Notifications</ex></ph>, <ph name="RECENT_PERMISSIONS_CHANGE_1">$2<ex>blocked Location</ex></ph>, <ph name="RECENT_PERMISSIONS_CHANGE_2">$3<ex>allowed Camera</ex></ph>
+  </message>
+  <message name="IDS_SETTINGS_RECENT_PERMISSIONS_OVER_THREE_ITEMS_INCOGNITO" desc="A list containing three permissions that have recently changed, but indicating that more have also changed recently">
+    Current incognito session: <ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START">$1<ex>automatically blocked Notifications</ex></ph>, <ph name="RECENT_PERMISSIONS_CHANGE_1">$2<ex>blocked Location</ex></ph>, <ph name="RECENT_PERMISSIONS_CHANGE_2">$3<ex>allowed Camera</ex></ph>, and more
+  </message>
 
   <!-- Reset Settings Page -->
   <message name="IDS_SETTINGS_RESET" desc="Title for an item in the 'Reset and clean up' section of Chrome Settings. If the user clicks this option, browser settings will be returned to their default values, after a confirmation by the user." meaning="Chrome Cleanup feature. Try to use the same translation for 'Reset' in 'Reset and cleanup' string.">
@@ -2322,6 +2367,9 @@
       Allow identifiers for protected content (computer restart may be required)
     </message>
   </if>
+  <message name="IDS_SETTINGS_SITE_SETTINGS_RECENT_ACTIVITY" desc="Label for the section which contains the user's recent permissions changes">
+    Recent activity
+  </message>
   <message name="IDS_SETTINGS_SITE_SETTINGS_UNSANDBOXED_PLUGINS" desc="Label for the unsandboxed plugin access site settings.">
     Unsandboxed plugin access
   </message>
@@ -3369,7 +3417,7 @@
     <message name="IDS_SETTINGS_KEYBOARD_SHOW_LANGUAGE_AND_INPUT" desc="The link to navigate to the language and input method settings.">
       Change language and input settings
     </message>
-    
+
     <!-- Display -->
     <message name="IDS_SETTINGS_DISPLAY_TITLE" desc="In Device Settings, the title for display settings.">
       Displays
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index dce271a..21687f0 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -627,6 +627,7 @@
     "installable/installable_manager.h",
     "installable/installable_metrics.cc",
     "installable/installable_metrics.h",
+    "installable/installable_params.cc",
     "installable/installable_params.h",
     "installable/installable_task_queue.cc",
     "installable/installable_task_queue.h",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 063cd333..324a9a2 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -3335,13 +3335,6 @@
          "HTTPReallyBadFinal")},
 
 #if !defined(OS_ANDROID)
-    {"enable-web-authentication-testing-api",
-     flag_descriptions::kEnableWebAuthenticationTestingAPIName,
-     flag_descriptions::kEnableWebAuthenticationTestingAPIDescription,
-     kOsDesktop, SINGLE_VALUE_TYPE(switches::kEnableWebAuthTestingAPI)},
-#endif  // !defined(OS_ANDROID)
-
-#if !defined(OS_ANDROID)
     {"enable-web-authentication-cable-v2-support",
      flag_descriptions::kEnableWebAuthenticationCableV2SupportName,
      flag_descriptions::kEnableWebAuthenticationCableV2SupportDescription,
@@ -3479,10 +3472,6 @@
      flag_descriptions::kBuiltInModuleAllDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kBuiltInModuleAll)},
 
-    {"enable-display-locking", flag_descriptions::kEnableDisplayLockingName,
-     flag_descriptions::kEnableDisplayLockingDescription, kOsAll,
-     FEATURE_VALUE_TYPE(blink::features::kDisplayLocking)},
-
     {"enable-layout-ng", flag_descriptions::kEnableLayoutNGName,
      flag_descriptions::kEnableLayoutNGDescription, kOsAll,
      FEATURE_VALUE_TYPE(blink::features::kLayoutNG)},
@@ -3878,11 +3867,6 @@
 #endif  // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
         // defined(OS_CHROMEOS)
 
-    {"shared-clipboard-receiver",
-     flag_descriptions::kSharedClipboardReceiverName,
-     flag_descriptions::kSharedClipboardReceiverDescription, kOsAll,
-     FEATURE_VALUE_TYPE(kSharedClipboardReceiver)},
-
     {"shared-clipboard-ui", flag_descriptions::kSharedClipboardUIName,
      flag_descriptions::kSharedClipboardUIDescription, kOsAll,
      FEATURE_VALUE_TYPE(kSharedClipboardUI)},
diff --git a/chrome/browser/android/shortcut_helper.cc b/chrome/browser/android/shortcut_helper.cc
index fb766b6..dde3a09 100644
--- a/chrome/browser/android/shortcut_helper.cc
+++ b/chrome/browser/android/shortcut_helper.cc
@@ -228,12 +228,6 @@
   return g_minimum_splash_image_size;
 }
 
-int ShortcutHelper::GetIdealBadgeIconSizeInPx() {
-  if (g_ideal_badge_icon_size == -1)
-    GetIconSizes();
-  return g_ideal_badge_icon_size;
-}
-
 int ShortcutHelper::GetIdealAdaptiveLauncherIconSizeInPx() {
   if (g_ideal_adaptive_launcher_icon_size == -1)
     GetIconSizes();
diff --git a/chrome/browser/android/shortcut_helper.h b/chrome/browser/android/shortcut_helper.h
index d5026e3..b8ed8d4a 100644
--- a/chrome/browser/android/shortcut_helper.h
+++ b/chrome/browser/android/shortcut_helper.h
@@ -60,9 +60,6 @@
   // screen.
   static int GetMinimumSplashImageSizeInPx();
 
-  // Returns the ideal size for a badge icon of a WebAPK.
-  static int GetIdealBadgeIconSizeInPx();
-
   // Returns the ideal size for an adaptive launcher icon of a WebAPK
   static int GetIdealAdaptiveLauncherIconSizeInPx();
 
diff --git a/chrome/browser/android/webapps/add_to_homescreen_data_fetcher_unittest.cc b/chrome/browser/android/webapps/add_to_homescreen_data_fetcher_unittest.cc
index 8e2f5dc..43969ce 100644
--- a/chrome/browser/android/webapps/add_to_homescreen_data_fetcher_unittest.cc
+++ b/chrome/browser/android/webapps/add_to_homescreen_data_fetcher_unittest.cc
@@ -467,10 +467,9 @@
   EXPECT_EQ(fetcher->shortcut_info().best_primary_icon_url,
             GURL(kDefaultIconUrl));
 
-  // Check that the badge icon is requested.
-  EXPECT_FALSE(fetcher->badge_icon().drawsNothing());
-  EXPECT_EQ(fetcher->shortcut_info().best_badge_icon_url,
-            GURL(kDefaultIconUrl));
+  // No badge icon as InstallableManager does not fetch badge icon.
+  EXPECT_TRUE(fetcher->badge_icon().drawsNothing());
+  EXPECT_TRUE(fetcher->shortcut_info().best_badge_icon_url.is_empty());
   CheckHistograms(histograms);
 }
 
diff --git a/chrome/browser/chromeos/login/saml/saml_browsertest.cc b/chrome/browser/chromeos/login/saml/saml_browsertest.cc
index fcddb737..90f4396 100644
--- a/chrome/browser/chromeos/login/saml/saml_browsertest.cc
+++ b/chrome/browser/chromeos/login/saml/saml_browsertest.cc
@@ -1798,7 +1798,7 @@
 // successful log in - but only if the appropriate policy is enabled.
 IN_PROC_BROWSER_TEST_P(SAMLPasswordAttributesTest, LoginSucceeded) {
   // LoginDisplayHostMojo does not show Oobe dialog by default.
-  LoginDisplayHost::default_host()->ShowGaiaDialog(true, EmptyAccountId());
+  LoginDisplayHost::default_host()->ShowGaiaDialog(EmptyAccountId());
 
   fake_saml_idp()->SetLoginHTMLTemplate("saml_login.html");
   fake_saml_idp()->SetSamlResponseFile("saml_with_password_attributes.xml");
@@ -1833,7 +1833,7 @@
 // Verify that no password attributes are stored when login fails.
 IN_PROC_BROWSER_TEST_P(SAMLPasswordAttributesTest, LoginFailed) {
   // LoginDisplayHostMojo does not show Oobe dialog by default.
-  LoginDisplayHost::default_host()->ShowGaiaDialog(true, EmptyAccountId());
+  LoginDisplayHost::default_host()->ShowGaiaDialog(EmptyAccountId());
 
   fake_saml_idp()->SetLoginHTMLTemplate("saml_login.html");
   fake_saml_idp()->SetSamlResponseFile("saml_with_password_attributes.xml");
diff --git a/chrome/browser/chromeos/login/ui/fake_login_display_host.cc b/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
index 6b32ff61..746acb2 100644
--- a/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
+++ b/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
@@ -114,8 +114,7 @@
   return false;
 }
 
-void FakeLoginDisplayHost::ShowGaiaDialog(bool can_close,
-                                          const AccountId& prefilled_account) {}
+void FakeLoginDisplayHost::ShowGaiaDialog(const AccountId& prefilled_account) {}
 
 void FakeLoginDisplayHost::HideOobeDialog() {}
 
diff --git a/chrome/browser/chromeos/login/ui/fake_login_display_host.h b/chrome/browser/chromeos/login/ui/fake_login_display_host.h
index 2990687..6907ff6 100644
--- a/chrome/browser/chromeos/login/ui/fake_login_display_host.h
+++ b/chrome/browser/chromeos/login/ui/fake_login_display_host.h
@@ -54,8 +54,7 @@
   void LoadWallpaper(const AccountId& account_id) override;
   void LoadSigninWallpaper() override;
   bool IsUserWhitelisted(const AccountId& account_id) override;
-  void ShowGaiaDialog(bool can_close,
-                      const AccountId& prefilled_account) override;
+  void ShowGaiaDialog(const AccountId& prefilled_account) override;
   void HideOobeDialog() override;
   void UpdateOobeDialogState(ash::OobeDialogState state) override;
   const user_manager::UserList GetUsers() override;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host.h b/chrome/browser/chromeos/login/ui/login_display_host.h
index e80a646e..a3a5c60 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host.h
+++ b/chrome/browser/chromeos/login/ui/login_display_host.h
@@ -134,10 +134,9 @@
   // Starts web kiosk splash screen.
   virtual void StartWebKiosk(const AccountId& account_id) = 0;
 
-  // Show the gaia dialog. |can_close| determines if the user is allowed to
-  // close the dialog. If available, |account| is preloaded in the gaia dialog.
-  virtual void ShowGaiaDialog(bool can_close,
-                              const AccountId& prefilled_account) = 0;
+  // Show the gaia dialog. If available, |account| is preloaded in the gaia
+  // dialog.
+  virtual void ShowGaiaDialog(const AccountId& prefilled_account) = 0;
 
   // Hide any visible oobe dialog.
   virtual void HideOobeDialog() = 0;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
index cec0aae..75026dd3 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
@@ -254,15 +254,8 @@
   NOTIMPLEMENTED();
 }
 
-void LoginDisplayHostMojo::ShowGaiaDialog(bool can_close,
-                                          const AccountId& prefilled_account) {
+void LoginDisplayHostMojo::ShowGaiaDialog(const AccountId& prefilled_account) {
   DCHECK(GetOobeUI());
-  can_close_dialog_ = can_close;
-
-  // Always disabling closing if there are no users, otherwise a blank screen
-  // will be displayed.
-  if (users_.empty())
-    can_close_dialog_ = false;
 
   ShowGaiaDialogCommon(prefilled_account);
 
@@ -271,8 +264,6 @@
 
 void LoginDisplayHostMojo::HideOobeDialog() {
   DCHECK(dialog_);
-  if (!can_close_dialog_)
-    return;
 
   // The dialog can not be hidden if there are no users on the login screen.
   // Reload it instead.
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.h b/chrome/browser/chromeos/login/ui/login_display_host_mojo.h
index d3257e4..cad1666 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.h
+++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.h
@@ -83,8 +83,7 @@
   void OnPreferencesChanged() override;
   void OnStartAppLaunch() override;
   void OnBrowserCreated() override;
-  void ShowGaiaDialog(bool can_close,
-                      const AccountId& prefilled_account) override;
+  void ShowGaiaDialog(const AccountId& prefilled_account) override;
   void HideOobeDialog() override;
   void UpdateOobeDialogState(ash::OobeDialogState state) override;
   const user_manager::UserList GetUsers() override;
@@ -176,7 +175,6 @@
   // Called after host deletion.
   std::vector<base::OnceClosure> completion_callbacks_;
   OobeUIDialogDelegate* dialog_ = nullptr;  // Not owned.
-  bool can_close_dialog_ = true;
   std::unique_ptr<WizardController> wizard_controller_;
 
   // Users that are visible in the views login screen.
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
index 6a487b5..df4ff48 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
@@ -949,8 +949,7 @@
   }
 }
 
-void LoginDisplayHostWebUI::ShowGaiaDialog(bool can_close,
-                                           const AccountId& prefilled_account) {
+void LoginDisplayHostWebUI::ShowGaiaDialog(const AccountId& prefilled_account) {
   // This is a special case, when WebUI sign-in screen shown with Views-based
   // launch bar. Then "Add user" button will be Views-based, and user click
   // will result in this call.
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.h b/chrome/browser/chromeos/login/ui/login_display_host_webui.h
index ef757fa..0221c32 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_webui.h
+++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.h
@@ -81,8 +81,7 @@
   void OnPreferencesChanged() override;
   void OnStartAppLaunch() override;
   void OnBrowserCreated() override;
-  void ShowGaiaDialog(bool can_close,
-                      const AccountId& prefilled_account) override;
+  void ShowGaiaDialog(const AccountId& prefilled_account) override;
   void HideOobeDialog() override;
   void UpdateOobeDialogState(ash::OobeDialogState state) override;
   const user_manager::UserList GetUsers() override;
@@ -91,7 +90,6 @@
   void HandleDisplayCaptivePortal() override;
   void UpdateAddUserButtonStatus() override;
   void RequestSystemInfoUpdate() override;
-
   void OnCancelPasswordChangedFlow() override;
 
   // Trace id for ShowLoginWebUI event (since there exists at most one login
diff --git a/chrome/browser/chromeos/login/ui/mock_login_display_host.h b/chrome/browser/chromeos/login/ui/mock_login_display_host.h
index b1c8cb8..1441757c 100644
--- a/chrome/browser/chromeos/login/ui/mock_login_display_host.h
+++ b/chrome/browser/chromeos/login/ui/mock_login_display_host.h
@@ -52,7 +52,7 @@
   MOCK_METHOD0(StartDemoAppLaunch, void(void));
   MOCK_METHOD1(StartArcKiosk, void(const AccountId&));
   MOCK_METHOD1(StartWebKiosk, void(const AccountId&));
-  MOCK_METHOD2(ShowGaiaDialog, void(bool, const AccountId&));
+  MOCK_METHOD1(ShowGaiaDialog, void(const AccountId&));
   MOCK_METHOD0(HideOobeDialog, void());
   MOCK_METHOD1(UpdateOobeDialogState, void(ash::OobeDialogState state));
   MOCK_METHOD0(GetUsers, const user_manager::UserList(void));
diff --git a/chrome/browser/chromeos/policy/device_login_screen_policy_browsertest.cc b/chrome/browser/chromeos/policy/device_login_screen_policy_browsertest.cc
index 64fabcdb..5a59e9b 100644
--- a/chrome/browser/chromeos/policy/device_login_screen_policy_browsertest.cc
+++ b/chrome/browser/chromeos/policy/device_login_screen_policy_browsertest.cc
@@ -5,6 +5,7 @@
 #include <string>
 
 #include "ash/public/cpp/ash_pref_names.h"
+#include "ash/public/cpp/login_screen_test_api.h"
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/command_line.h"
@@ -17,12 +18,15 @@
 #include "base/values.h"
 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
 #include "chrome/browser/chromeos/accessibility/magnification_manager.h"
+#include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
+#include "chrome/browser/chromeos/login/test/test_predicate_waiter.h"
 #include "chrome/browser/chromeos/policy/device_policy_builder.h"
 #include "chrome/browser/chromeos/policy/device_policy_cros_browser_test.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h"
 #include "chrome/common/pref_names.h"
 #include "chromeos/constants/chromeos_switches.h"
 #include "components/policy/core/common/policy_types.h"
@@ -196,4 +200,36 @@
   prefs->SetBoolean(prefs::kPrimaryMouseButtonRight, false);
   EXPECT_EQ(base::Value(false), GetPrefValue(prefs::kPrimaryMouseButtonRight));
 }
+
+// Tests that enabling/disabling public accounts correctly reflects in the login
+// UI.
+IN_PROC_BROWSER_TEST_F(DeviceLoginScreenPolicyBrowsertest, DeviceLocalAccount) {
+  chromeos::OobeScreenWaiter(chromeos::GaiaView::kScreenId).Wait();
+
+  // Wait for Gaia dialog to be open.
+  chromeos::test::TestPredicateWaiter(base::BindRepeating([]() {
+    return ash::LoginScreenTestApi::IsOobeDialogVisible();
+  })).Wait();
+
+  em::ChromeDeviceSettingsProto& proto(device_policy()->payload());
+  auto* account = proto.mutable_device_local_accounts()->add_account();
+  account->set_account_id("test");
+  account->set_type(
+      em::DeviceLocalAccountInfoProto_AccountType_ACCOUNT_TYPE_PUBLIC_SESSION);
+  RefreshDevicePolicy();
+
+  // Wait for Gaia dialog to be hidden.
+  chromeos::test::TestPredicateWaiter(base::BindRepeating([]() {
+    return !ash::LoginScreenTestApi::IsOobeDialogVisible();
+  })).Wait();
+
+  proto.clear_device_local_accounts();
+  RefreshDevicePolicy();
+
+  // Wait for Gaia dialog to be open.
+  chromeos::test::TestPredicateWaiter(base::BindRepeating([]() {
+    return ash::LoginScreenTestApi::IsOobeDialogVisible();
+  })).Wait();
+}
+
 }  // namespace policy
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
index 259a849..8f2fe3f0 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
@@ -23,13 +23,17 @@
 #include "chrome/browser/ui/browser_navigator.h"
 #include "chrome/browser/ui/browser_navigator_params.h"
 #include "chrome/browser/ui/tab_contents/tab_contents_iterator.h"
+#include "chrome/common/chrome_switches.h"
 #include "chrome/grit/browser_resources.h"
 #include "components/guest_view/browser/guest_view_base.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
+#include "components/keep_alive_registry/scoped_keep_alive.h"
 #include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/devtools_agent_host_client_channel.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/common/content_switches.h"
 #include "extensions/browser/extension_host.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/process_manager.h"
@@ -88,6 +92,18 @@
 ChromeDevToolsManagerDelegate::ChromeDevToolsManagerDelegate() {
   DCHECK(!g_instance);
   g_instance = this;
+
+  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
+  if (command_line->HasSwitch(switches::kNoStartupWindow) &&
+      (command_line->HasSwitch(switches::kRemoteDebuggingPipe) ||
+       command_line->HasSwitch(switches::kRemoteDebuggingPort))) {
+    // If running without a startup window with remote debugging,
+    // we are controlled entirely by the automation process.
+    // Keep the application running until explicit close through DevTools
+    // protocol.
+    keep_alive_.reset(new ScopedKeepAlive(KeepAliveOrigin::REMOTE_DEBUGGING,
+                                          KeepAliveRestartOption::DISABLED));
+  }
 }
 
 ChromeDevToolsManagerDelegate::~ChromeDevToolsManagerDelegate() {
@@ -319,3 +335,9 @@
   // task using a raw pointer to the DeviceManager we just deleted.
   device_discovery_.reset();
 }
+
+void ChromeDevToolsManagerDelegate::BrowserCloseRequested() {
+  // Do not keep the application running anymore, we got an explicit request
+  // to close.
+  keep_alive_.reset();
+}
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.h b/chrome/browser/devtools/chrome_devtools_manager_delegate.h
index 8098398..0db17bc 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.h
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.h
@@ -20,6 +20,7 @@
 #include "net/base/host_port_pair.h"
 
 class ChromeDevToolsSession;
+class ScopedKeepAlive;
 using RemoteLocations = std::set<net::HostPortPair>;
 
 namespace extensions {
@@ -53,6 +54,8 @@
   std::vector<content::BrowserContext*> GetBrowserContexts() override;
   content::BrowserContext* GetDefaultBrowserContext() override;
 
+  void BrowserCloseRequested();
+
  private:
   friend class DevToolsManagerDelegateTest;
 
@@ -90,6 +93,7 @@
   std::unique_ptr<DevToolsDeviceDiscovery> device_discovery_;
   content::DevToolsAgentHost::List remote_agent_hosts_;
   RemoteLocations remote_locations_;
+  std::unique_ptr<ScopedKeepAlive> keep_alive_;
 
   DISALLOW_COPY_AND_ASSIGN(ChromeDevToolsManagerDelegate);
 };
diff --git a/chrome/browser/devtools/devtools_sanity_browsertest.cc b/chrome/browser/devtools/devtools_sanity_browsertest.cc
index 69c84807..4f8f968 100644
--- a/chrome/browser/devtools/devtools_sanity_browsertest.cc
+++ b/chrome/browser/devtools/devtools_sanity_browsertest.cc
@@ -39,9 +39,11 @@
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/unpacked_installer.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
+#include "chrome/browser/lifetime/browser_shutdown.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
 #include "chrome/browser/policy/developer_tools_policy_handler.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/browser_list.h"
@@ -61,6 +63,8 @@
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/javascript_dialogs/app_modal_dialog_controller.h"
 #include "components/javascript_dialogs/app_modal_dialog_view.h"
+#include "components/keep_alive_registry/keep_alive_registry.h"
+#include "components/keep_alive_registry/keep_alive_types.h"
 #include "components/policy/core/common/mock_configuration_policy_provider.h"
 #include "components/policy/core/common/policy_map.h"
 #include "components/policy/policy_constants.h"
@@ -2358,6 +2362,8 @@
 }
 
 IN_PROC_BROWSER_TEST_F(InProcessBrowserTest, BrowserCloseWithBeforeUnload) {
+  EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsOriginRegistered(
+      KeepAliveOrigin::REMOTE_DEBUGGING));
   ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL));
   WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
   ASSERT_TRUE(content::ExecuteScript(
@@ -2370,6 +2376,30 @@
   ui_test_utils::WaitForBrowserToClose(browser());
 }
 
+class KeepAliveDevToolsTest : public InProcessBrowserTest {
+ protected:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    command_line->AppendSwitchASCII(switches::kRemoteDebuggingPort, "0");
+    command_line->AppendSwitch(switches::kNoStartupWindow);
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(KeepAliveDevToolsTest, KeepsAliveUntilBrowserClose) {
+  EXPECT_FALSE(browser_shutdown::IsTryingToQuit());
+  EXPECT_TRUE(BrowserList::GetInstance()->empty());
+  EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
+  EXPECT_TRUE(KeepAliveRegistry::GetInstance()->IsOriginRegistered(
+      KeepAliveOrigin::REMOTE_DEBUGGING));
+  chrome::NewEmptyWindow(ProfileManager::GetLastUsedProfile());
+  EXPECT_FALSE(BrowserList::GetInstance()->empty());
+  BrowserHandler handler(nullptr, std::string());
+  handler.Close();
+  ui_test_utils::WaitForBrowserToClose();
+  EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsKeepingAlive());
+  EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsOriginRegistered(
+      KeepAliveOrigin::REMOTE_DEBUGGING));
+}
+
 class DevToolsPolicyTest : public InProcessBrowserTest {
  protected:
   DevToolsPolicyTest() {
diff --git a/chrome/browser/devtools/protocol/browser_handler.cc b/chrome/browser/devtools/protocol/browser_handler.cc
index 79a6a57d..c3abe25 100644
--- a/chrome/browser/devtools/protocol/browser_handler.cc
+++ b/chrome/browser/devtools/protocol/browser_handler.cc
@@ -112,8 +112,12 @@
 }
 
 Response BrowserHandler::Close() {
-  base::PostTask(FROM_HERE, {content::BrowserThread::UI},
-                 base::BindOnce([]() { chrome::ExitIgnoreUnloadHandlers(); }));
+  base::PostTask(
+      FROM_HERE, {content::BrowserThread::UI}, base::BindOnce([]() {
+        if (ChromeDevToolsManagerDelegate::GetInstance())
+          ChromeDevToolsManagerDelegate::GetInstance()->BrowserCloseRequested();
+        chrome::ExitIgnoreUnloadHandlers();
+      }));
   return Response::OK();
 }
 
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
index 9799da4b..699711a 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -25,6 +25,7 @@
 #include "components/password_manager/core/browser/password_list_sorter.h"
 #include "components/password_manager/core/browser/password_manager_util.h"
 #include "components/password_manager/core/browser/password_ui_utils.h"
+#include "components/password_manager/core/browser/ui/plaintext_reason.h"
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/web_contents.h"
@@ -223,25 +224,39 @@
     return;
   }
 
-  if (reason == api::passwords_private::PLAINTEXT_REASON_COPY) {
-    // In case of copy we don't need to give password back to UI. callback
-    // will receive either empty string in case of success or null otherwise.
-    // Copying occurs here so javascript doesn't need plaintext password.
-    callback = base::BindOnce(
-        [](PlaintextPasswordCallback callback,
-           base::Optional<base::string16> password) {
-          if (!password) {
-            std::move(callback).Run(base::nullopt);
-            return;
-          }
-          ui::ScopedClipboardWriter(ui::ClipboardBuffer::kCopyPaste)
-              .WriteText(*password);
-          std::move(callback).Run(base::string16());
-        },
-        std::move(callback));
+  password_manager::PlaintextReason presenter_reason =
+      password_manager::PlaintextReason::kView;
+
+  switch (reason) {
+    case api::passwords_private::PLAINTEXT_REASON_VIEW:
+      break;
+    case api::passwords_private::PLAINTEXT_REASON_COPY:
+      presenter_reason = password_manager::PlaintextReason::kCopy;
+      // In case of copy we don't need to give password back to UI. callback
+      // will receive either empty string in case of success or null otherwise.
+      // Copying occurs here so javascript doesn't need plaintext password.
+      callback = base::BindOnce(
+          [](PlaintextPasswordCallback callback,
+             base::Optional<base::string16> password) {
+            if (!password) {
+              std::move(callback).Run(base::nullopt);
+              return;
+            }
+            ui::ScopedClipboardWriter(ui::ClipboardBuffer::kCopyPaste)
+                .WriteText(*password);
+            std::move(callback).Run(base::string16());
+          },
+          std::move(callback));
+      break;
+    case api::passwords_private::PLAINTEXT_REASON_EDIT:
+      presenter_reason = password_manager::PlaintextReason::kEdit;
+      break;
+    case api::passwords_private::PLAINTEXT_REASON_NONE:
+      NOTREACHED();
+      break;
   }
-  password_manager_presenter_->RequestPlaintextPassword(*sort_key,
-                                                        std::move(callback));
+  password_manager_presenter_->RequestPlaintextPassword(
+      *sort_key, presenter_reason, std::move(callback));
 }
 
 bool PasswordsPrivateDelegateImpl::OsReauthCall(
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
index b1f50a2..992496f 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
@@ -14,6 +14,7 @@
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind_test_util.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/mock_callback.h"
 #include "base/values.h"
 #include "chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h"
@@ -25,6 +26,7 @@
 #include "chrome/test/base/testing_profile.h"
 #include "components/autofill/core/common/password_form.h"
 #include "components/password_manager/core/browser/password_list_sorter.h"
+#include "components/password_manager/core/browser/password_manager_metrics_util.h"
 #include "components/password_manager/core/browser/password_manager_test_utils.h"
 #include "components/password_manager/core/browser/reauth_purpose.h"
 #include "components/password_manager/core/browser/test_password_store.h"
@@ -41,11 +43,12 @@
 using ::testing::Ne;
 using ::testing::Return;
 using ::testing::StrictMock;
-
 namespace extensions {
 
 namespace {
 
+constexpr char kHistogramName[] = "PasswordManager.AccessPasswordInSettings";
+
 using MockPlaintextPasswordCallback =
     base::MockCallback<PasswordsPrivateDelegate::PlaintextPasswordCallback>;
 
@@ -117,6 +120,8 @@
   // PasswordsPrivateEventRouter.
   void SetUpRouters();
 
+  base::HistogramTester& histogram_tester() { return histogram_tester_; }
+
  protected:
   content::BrowserTaskEnvironment task_environment_;
   TestingProfile profile_;
@@ -125,6 +130,7 @@
       ui::TestClipboard::CreateForCurrentThread();
 
  private:
+  base::HistogramTester histogram_tester_;
   DISALLOW_COPY_AND_ASSIGN(PasswordsPrivateDelegateImplTest);
 };
 
@@ -266,6 +272,10 @@
   base::string16 result;
   test_clipboard_->ReadText(ui::ClipboardBuffer::kCopyPaste, &result);
   EXPECT_EQ(form.password_value, result);
+
+  histogram_tester().ExpectUniqueSample(
+      kHistogramName, password_manager::metrics_util::ACCESS_PASSWORD_COPIED,
+      1);
 }
 
 TEST_F(PasswordsPrivateDelegateImplTest, TestCopyPasswordCallbackResultFail) {
@@ -292,6 +302,9 @@
   test_clipboard_->ReadText(ui::ClipboardBuffer::kCopyPaste, &result);
   EXPECT_EQ(base::string16(), result);
   EXPECT_EQ(before_call, test_clipboard_->GetLastModifiedTime());
+
+  // Since Reauth had failed password was not copied and metric wasn't recorded
+  histogram_tester().ExpectTotalCount(kHistogramName, 0);
 }
 
 TEST_F(PasswordsPrivateDelegateImplTest, TestPassedReauthOnView) {
@@ -313,6 +326,10 @@
   delegate.RequestPlaintextPassword(
       0, api::passwords_private::PLAINTEXT_REASON_VIEW, password_callback.Get(),
       nullptr);
+
+  histogram_tester().ExpectUniqueSample(
+      kHistogramName, password_manager::metrics_util::ACCESS_PASSWORD_VIEWED,
+      1);
 }
 
 TEST_F(PasswordsPrivateDelegateImplTest, TestFailedReauthOnView) {
@@ -334,6 +351,9 @@
   delegate.RequestPlaintextPassword(
       0, api::passwords_private::PLAINTEXT_REASON_VIEW, password_callback.Get(),
       nullptr);
+
+  // Since Reauth had failed password was not viewed and metric wasn't recorded
+  histogram_tester().ExpectTotalCount(kHistogramName, 0);
 }
 
 TEST_F(PasswordsPrivateDelegateImplTest, TestReauthOnExport) {
diff --git a/chrome/browser/extensions/api/webrtc_from_web_accessible_resource_browsertest.cc b/chrome/browser/extensions/api/webrtc_from_web_accessible_resource_browsertest.cc
index 9d3a7661..34702924 100644
--- a/chrome/browser/extensions/api/webrtc_from_web_accessible_resource_browsertest.cc
+++ b/chrome/browser/extensions/api/webrtc_from_web_accessible_resource_browsertest.cc
@@ -8,46 +8,13 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/permissions/permission_request_manager.h"
+#include "components/permissions/test/permission_request_observer.h"
 #include "extensions/test/result_catcher.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 
 namespace extensions {
 
-namespace {
-
-// Used to observe the creation of permission prompt without responding.
-class PermissionRequestObserver
-    : public permissions::PermissionRequestManager::Observer {
- public:
-  explicit PermissionRequestObserver(content::WebContents* web_contents)
-      : request_manager_(permissions::PermissionRequestManager::FromWebContents(
-            web_contents)),
-        request_shown_(false) {
-    request_manager_->AddObserver(this);
-  }
-  ~PermissionRequestObserver() override {
-    // Safe to remove twice if it happens.
-    request_manager_->RemoveObserver(this);
-  }
-
-  bool request_shown() const { return request_shown_; }
-
- private:
-  // PermissionRequestManager::Observer
-  void OnBubbleAdded() override {
-    request_shown_ = true;
-    request_manager_->RemoveObserver(this);
-  }
-
-  permissions::PermissionRequestManager* request_manager_;
-  bool request_shown_;
-
-  DISALLOW_COPY_AND_ASSIGN(PermissionRequestObserver);
-};
-
-}  // namespace
-
 class WebRtcFromWebAccessibleResourceTest : public ExtensionApiTest {
  public:
   WebRtcFromWebAccessibleResourceTest() {}
@@ -94,7 +61,8 @@
       permissions::PermissionRequestManager::FromWebContents(web_contents);
   request_manager->set_auto_response_for_test(
       permissions::PermissionRequestManager::ACCEPT_ALL);
-  PermissionRequestObserver permission_request_observer(web_contents);
+  permissions::PermissionRequestObserver permission_request_observer(
+      web_contents);
   extensions::ResultCatcher catcher;
   ui_test_utils::NavigateToURL(browser(), url);
 
@@ -117,7 +85,8 @@
       permissions::PermissionRequestManager::FromWebContents(web_contents);
   request_manager->set_auto_response_for_test(
       permissions::PermissionRequestManager::DENY_ALL);
-  PermissionRequestObserver permission_request_observer(web_contents);
+  permissions::PermissionRequestObserver permission_request_observer(
+      web_contents);
   extensions::ResultCatcher catcher;
   ui_test_utils::NavigateToURL(browser(), url);
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index c58adeb..25fba19 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -30,7 +30,7 @@
 [
   {
     "name": "accessibility-internals-page-improvements",
-    "owners": [ "abigailbklein" ],
+    "owners": [ "abigailbklein@google.com" ],
     "expiry_milestone": 82
   },
   {
@@ -485,7 +485,7 @@
   {
     "name": "click-to-call-ui",
     "owners": [ "//chrome/browser/sharing/OWNERS" ],
-    "expiry_milestone": 82
+    "expiry_milestone": 85
   },
   {
     "name": "click-to-open-pdf",
@@ -599,42 +599,42 @@
   },
   {
     "name": "crostini-disk-resizing",
-    "owners": [ "davidmunro", "nverne", "clumptini" ],
+    "owners": [ "davidmunro@google.com", "nverne" ],
     "expiry_milestone": 83
   },
   {
     "name": "crostini-gpu-support",
-    "owners": [ "nverne", "benwells", "clumptini" ],
+    "owners": [ "nverne", "benwells" ],
     "expiry_milestone": 85
   },
   {
     "name": "crostini-port-forwarding",
-    "owners": [ "matterchen", "davidmunro", "hollingum" ],
+    "owners": [ "matterchen", "davidmunro@google.com", "hollingum@google.com" ],
     "expiry_milestone": 84
   },
   {
     "name": "crostini-usb-allow-unsupported",
-    "owners": [ "nverne", "benwells", "clumptini" ],
+    "owners": [ "nverne", "benwells" ],
     "expiry_milestone": 85
   },
   {
     "name": "crostini-usb-support",
-    "owners": [ "jopra", "nverne", "benwells", "clumptini" ],
+    "owners": [ "jopra", "nverne", "benwells" ],
     "expiry_milestone": 76
   },
   {
     "name": "crostini-use-buster-image",
-    "owners": [ "davidmunro", "benwells", "clumptini" ],
+    "owners": [ "davidmunro@google.com", "benwells" ],
     "expiry_milestone": 82
   },
   {
     "name": "crostini-username",
-    "owners": [ "davidmunro", "lxj", "clumptini" ],
+    "owners": [ "davidmunro@google.com", "lxj" ],
     "expiry_milestone": 83
   },
   {
     "name": "crostini-webui-upgrader",
-    "owners": [ "nverne", "davidmunro", "benwells", "clumptini" ],
+    "owners": [ "nverne", "davidmunro@google.com", "benwells" ],
     "expiry_milestone": 84
   },
   {
@@ -1452,7 +1452,7 @@
   },
   {
     "name": "enable-history-favicons-google-server-query",
-    "owners": ["victorvianna", "jkrcal"],
+    "owners": [ "jkrcal" ],
     "expiry_milestone": 79
   },
   {
@@ -1991,7 +1991,7 @@
   {
     "name": "enable-unsafe-webgpu",
     "owners": [ "//third_party/blink/renderer/modules/webgpu/OWNERS" ],
-    "expiry_milestone": 82
+    "expiry_milestone": 90
   },
   {
     "name": "enable-usbguard",
@@ -2045,12 +2045,6 @@
     "expiry_milestone": 84
   },
   {
-    "name": "enable-web-authentication-testing-api",
-    "owners": [ "webauthn-team@google.com" ],
-    // This is required for testing.
-    "expiry_milestone": -1
-  },
-  {
     "name": "enable-web-bluetooth-new-permissions-backend",
     "owners": [ "web-bluetooth@google.com" ],
     "expiry_milestone": 90
@@ -2207,7 +2201,7 @@
   },
   {
     "name": "exo-pointer-lock",
-    "owners": [ "hollingum" ],
+    "owners": [ "hollingum@google.com" ],
     "expiry_milestone": 82
   },
   {
@@ -2360,7 +2354,7 @@
   },
   {
     "name": "gaia-action-buttons",
-    "owners": [ "jeroendh", "rsorokin" ],
+    "owners": [ "jeroendh@google.com", "rsorokin" ],
     "expiry_milestone": 79
   },
   {
@@ -3267,12 +3261,12 @@
   {
     "name": "shared-clipboard-ui",
     "owners": [ "//chrome/browser/sharing/OWNERS" ],
-    "expiry_milestone": 82
+    "expiry_milestone": 85
   },
   {
     "name": "sharing-derive-vapid-key",
     "owners": [ "//chrome/browser/sharing/OWNERS" ],
-    "expiry_milestone": 82
+    "expiry_milestone": 85
   },
   {
     "name": "sharing-device-expiration",
@@ -3595,7 +3589,7 @@
   },
   {
     "name": "translate-ui-bubble-options",
-    "owners": [ "hhw", "anthonyvd", "chrome-language@google.com" ],
+    "owners": [ "anthonyvd", "chrome-language@google.com" ],
     "expiry_milestone": 82
   },
   {
@@ -3621,7 +3615,7 @@
   {
     "name": "turn-off-streaming-media-caching",
     "owners": [ "shawnpi@microsoft.com" ],
-    "expiry_milestone": 82
+    "expiry_milestone": 86
   },
   {
     "name": "ui-disable-partial-swap",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 970df0f..0eefbe8 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -659,11 +659,6 @@
 const char kDownloadAutoResumptionNativeDescription[] =
     "Enables download auto-resumption in native";
 
-const char kEnableDisplayLockingName[] = "Enable Display Locking";
-const char kEnableDisplayLockingDescription[] =
-    "Enable Display Locking JavaScript API. The syntax and the APIs exposed "
-    "are experimental and may change.";
-
 const char kEnableLayoutNGName[] = "Enable LayoutNG";
 const char kEnableLayoutNGDescription[] =
     "Enable Blink's next generation layout engine.";
@@ -1677,12 +1672,6 @@
     "Enables browser process logic related to service workers to run on the UI "
     "thread rather than the IO thread.";
 
-const char kSharedClipboardReceiverName[] =
-    "Enable receiver device to handle shared clipboard feature";
-const char kSharedClipboardReceiverDescription[] =
-    "Enables receiver device to handle shared clipboard feature by showing a "
-    "notification to receive the clipboard to share.";
-
 const char kSharedClipboardUIName[] =
     "Enable shared clipboard feature signals to be handled";
 const char kSharedClipboardUIDescription[] =
@@ -2737,13 +2726,6 @@
     "Allows viewing of simplified web pages by selecting 'Customize and "
     "control Chrome'>'Distill page'";
 
-const char kEnableWebAuthenticationTestingAPIName[] =
-    "Web Authentication Testing API";
-const char kEnableWebAuthenticationTestingAPIDescription[] =
-    "Enable Web Authentication Testing API support, which disconnects the API "
-    "implementation from the real world, and allows configuring virtual "
-    "authenticator devices for testing";
-
 const char kEnterpriseReportingInBrowserName[] =
     "Enterprise cloud reporting in browser";
 const char kEnterpriseReportingInBrowserDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 64758bef..6b80b94 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -385,9 +385,6 @@
 extern const char kBuiltInModuleKvStorageName[];
 extern const char kBuiltInModuleKvStorageDescription[];
 
-extern const char kEnableDisplayLockingName[];
-extern const char kEnableDisplayLockingDescription[];
-
 extern const char kEnableLayoutNGName[];
 extern const char kEnableLayoutNGDescription[];
 
@@ -977,9 +974,6 @@
 extern const char kServiceWorkerOnUIName[];
 extern const char kServiceWorkerOnUIDescription[];
 
-extern const char kSharedClipboardReceiverName[];
-extern const char kSharedClipboardReceiverDescription[];
-
 extern const char kSharedClipboardUIName[];
 extern const char kSharedClipboardUIDescription[];
 
@@ -1571,9 +1565,6 @@
 extern const char kEnableReaderModeName[];
 extern const char kEnableReaderModeDescription[];
 
-extern const char kEnableWebAuthenticationTestingAPIName[];
-extern const char kEnableWebAuthenticationTestingAPIDescription[];
-
 extern const char kEnterpriseReportingInBrowserName[];
 extern const char kEnterpriseReportingInBrowserDescription[];
 
diff --git a/chrome/browser/geolocation/geolocation_browsertest.cc b/chrome/browser/geolocation/geolocation_browsertest.cc
index 5c511d8..f4f172d 100644
--- a/chrome/browser/geolocation/geolocation_browsertest.cc
+++ b/chrome/browser/geolocation/geolocation_browsertest.cc
@@ -31,6 +31,7 @@
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/permissions/features.h"
 #include "components/permissions/permission_request_manager.h"
+#include "components/permissions/test/permission_request_observer.h"
 #include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/notification_details.h"
 #include "content/public/browser/notification_service.h"
@@ -134,44 +135,6 @@
     base::RunLoop::QuitCurrentWhenIdleDeprecated();
 }
 
-// PermissionRequestObserver ---------------------------------------------------
-
-// Used to observe the creation of a single permission request without
-// responding.
-class PermissionRequestObserver
-    : public permissions::PermissionRequestManager::Observer {
- public:
-  explicit PermissionRequestObserver(content::WebContents* web_contents)
-      : request_manager_(permissions::PermissionRequestManager::FromWebContents(
-            web_contents)),
-        request_shown_(false),
-        message_loop_runner_(new content::MessageLoopRunner) {
-    request_manager_->AddObserver(this);
-  }
-  ~PermissionRequestObserver() override {
-    // Safe to remove twice if it happens.
-    request_manager_->RemoveObserver(this);
-  }
-
-  void Wait() { message_loop_runner_->Run(); }
-
-  bool request_shown() { return request_shown_; }
-
- private:
-  // PermissionRequestManager::Observer
-  void OnBubbleAdded() override {
-    request_shown_ = true;
-    request_manager_->RemoveObserver(this);
-    message_loop_runner_->Quit();
-  }
-
-  permissions::PermissionRequestManager* request_manager_;
-  bool request_shown_;
-  scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
-
-  DISALLOW_COPY_AND_ASSIGN(PermissionRequestObserver);
-};
-
 }  // namespace
 
 
@@ -377,7 +340,7 @@
 
 void GeolocationBrowserTest::WatchPositionAndObservePermissionRequest(
     bool request_should_display) {
-  PermissionRequestObserver observer(
+  permissions::PermissionRequestObserver observer(
       current_browser_->tab_strip_model()->GetActiveWebContents());
   if (request_should_display) {
     // Control will return as soon as the API call is made, and then the
diff --git a/chrome/browser/installable/installable_data.cc b/chrome/browser/installable/installable_data.cc
index 13d093b1..74d2374 100644
--- a/chrome/browser/installable/installable_data.cc
+++ b/chrome/browser/installable/installable_data.cc
@@ -12,8 +12,8 @@
                                  const GURL& primary_icon_url,
                                  const SkBitmap* primary_icon,
                                  bool has_maskable_primary_icon,
-                                 const GURL& badge_icon_url,
-                                 const SkBitmap* badge_icon,
+                                 const GURL& splash_icon_url,
+                                 const SkBitmap* splash_icon,
                                  bool valid_manifest,
                                  bool has_worker)
     : errors(std::move(errors)),
@@ -22,8 +22,10 @@
       primary_icon_url(primary_icon_url),
       primary_icon(primary_icon),
       has_maskable_primary_icon(has_maskable_primary_icon),
-      badge_icon_url(badge_icon_url),
-      badge_icon(badge_icon),
+      badge_icon_url(GURL::EmptyGURL()),
+      badge_icon(nullptr),
+      splash_icon_url(splash_icon_url),
+      splash_icon(splash_icon),
       valid_manifest(valid_manifest),
       has_worker(has_worker) {}
 
diff --git a/chrome/browser/installable/installable_data.h b/chrome/browser/installable/installable_data.h
index d327999..dbb5f86 100644
--- a/chrome/browser/installable/installable_data.h
+++ b/chrome/browser/installable/installable_data.h
@@ -25,8 +25,8 @@
                   const GURL& primary_icon_url,
                   const SkBitmap* primary_icon,
                   bool has_maskable_primary_icon,
-                  const GURL& badge_icon_url,
-                  const SkBitmap* badge_icon,
+                  const GURL& splash_icon_url,
+                  const SkBitmap* splash_icon,
                   bool valid_manifest,
                   bool has_worker);
   ~InstallableData();
@@ -66,6 +66,17 @@
   // using it.
   const SkBitmap* badge_icon;
 
+  // The URL of the chosen splash icon.
+  const GURL& splash_icon_url;
+
+  // nullptr if the most appropriate splash icon couldn't be determined or
+  // downloaded. The underlying splash icon is owned by the InstallableManager;
+  // clients must copy the bitmap if they want to use it. Since the splash
+  // icon is optional, no error code is set if it cannot be fetched, and clients
+  // specifying |valid_splash_icon| must check that the bitmap exists before
+  // using it.
+  const SkBitmap* splash_icon;
+
   // true if the site has a valid, installable web app manifest. If
   // |valid_manifest| or |has_worker| was true and the site isn't installable,
   // the reason will be in |errors|.
diff --git a/chrome/browser/installable/installable_manager.cc b/chrome/browser/installable/installable_manager.cc
index 3af20e32..bda3f2bd 100644
--- a/chrome/browser/installable/installable_manager.cc
+++ b/chrome/browser/installable/installable_manager.cc
@@ -56,10 +56,6 @@
 // resized).
 const int kMinimumPrimaryAdaptiveLauncherIconSizeInPx = 83;
 
-#if !defined(OS_ANDROID)
-const int kMinimumBadgeIconSizeInPx = 72;
-#endif
-
 int GetIdealPrimaryIconSizeInPx() {
 #if defined(OS_ANDROID)
   return ShortcutHelper::GetIdealHomescreenIconSizeInPx();
@@ -76,14 +72,6 @@
 #endif
 }
 
-int GetIdealBadgeIconSizeInPx() {
-#if defined(OS_ANDROID)
-  return ShortcutHelper::GetIdealBadgeIconSizeInPx();
-#else
-  return kMinimumBadgeIconSizeInPx;
-#endif
-}
-
 int GetIdealPrimaryAdaptiveLauncherIconSizeInPx() {
 #if defined(OS_ANDROID)
   return ShortcutHelper::GetIdealAdaptiveLauncherIconSizeInPx();
@@ -92,6 +80,22 @@
 #endif
 }
 
+int GetIdealSplashIconSizeInPx() {
+#if defined(OS_ANDROID)
+  return ShortcutHelper::GetIdealSplashImageSizeInPx();
+#else
+  return kMinimumPrimaryIconSizeInPx;
+#endif
+}
+
+int GetMinimumSplashIconSizeInPx() {
+#if defined(OS_ANDROID)
+  return ShortcutHelper::GetMinimumSplashImageSizeInPx();
+#else
+  return kMinimumPrimaryIconSizeInPx;
+#endif
+}
+
 using IconPurpose = blink::Manifest::ImageResource::Purpose;
 
 struct ImageTypeDetails {
@@ -211,7 +215,10 @@
 InstallableManager::ValidManifestProperty::~ValidManifestProperty() = default;
 
 InstallableManager::IconProperty::IconProperty()
-    : error(NO_ERROR_DETECTED), url(), icon(), fetched(false) {}
+    : error(NO_ERROR_DETECTED),
+      purpose(IconPurpose::ANY),
+      icon(),
+      fetched(false) {}
 
 InstallableManager::IconProperty::IconProperty(IconProperty&& other) = default;
 
@@ -316,36 +323,33 @@
           base::BindOnce(OnDidCompleteGetPrimaryIcon, std::move(callback)));
 }
 
-bool InstallableManager::IsIconFetched(const IconPurpose purpose) const {
-  const auto it = icons_.find(purpose);
-  return it != icons_.end() && it->second.fetched;
-}
+bool InstallableManager::IsIconFetchComplete(const IconUsage usage) const {
+  const auto it = icons_.find(usage);
+  if (it == icons_.end() || !it->second.fetched)
+    return false;
 
-bool InstallableManager::IsPrimaryIconFetched(
-    const InstallableParams& params) const {
-  return IsIconFetched(GetPrimaryIconPurpose(params));
-}
-
-void InstallableManager::SetIconFetched(const IconPurpose purpose) {
-  icons_[purpose].fetched = true;
-}
-
-IconPurpose InstallableManager::GetPrimaryIconPurpose(
-    const InstallableParams& params) const {
-  if (params.prefer_maskable_icon) {
-    const auto it = icons_.find(IconPurpose::MASKABLE);
-
-    // If we haven't attempted fetching the maskable icon yet, we still plan
-    // to use that one for primary.
-    if (it == icons_.end() || !it->second.fetched)
-      return IconPurpose::MASKABLE;
-
-    // If fetching was successful, use MASKABLE.
-    if (it->second.error == NO_ERROR_DETECTED)
-      return IconPurpose::MASKABLE;
+  // If we fetched maskable icon, but fetching was not success, do not consider
+  // it's completed since we want to fallback to fetch ANY icon.
+  if (it->second.purpose == IconPurpose::MASKABLE &&
+      it->second.error != NO_ERROR_DETECTED) {
+    return false;
   }
-  // Otherwise fall back to ANY.
-  return IconPurpose::ANY;
+
+  return true;
+}
+
+bool InstallableManager::IsMaskableIconFetched(const IconUsage usage) const {
+  const auto it = icons_.find(usage);
+  if (it == icons_.end() || !it->second.fetched)
+    return false;
+  // if we fetched MASKABLE icon, or fetched ANY icon for fallback, consider
+  // maskable icon is fetched.
+  return it->second.purpose == IconPurpose::MASKABLE ||
+         it->second.purpose == IconPurpose::ANY;
+}
+
+void InstallableManager::SetIconFetched(const IconUsage usage) {
+  icons_[usage].fetched = true;
 }
 
 std::vector<InstallableStatusCode> InstallableManager::GetErrors(
@@ -369,17 +373,21 @@
     errors.push_back(worker_->error);
 
   if (params.valid_primary_icon) {
-    IconProperty& icon = icons_[GetPrimaryIconPurpose(params)];
-    if (icon.error != NO_ERROR_DETECTED)
+    IconProperty& icon = icons_[IconUsage::kPrimary];
+    // If the icon is MASKABLE, ignore any error since we want to fallback to
+    // fetch IconPurpose::ANY.
+    if (icon.error != NO_ERROR_DETECTED &&
+        icon.purpose != IconPurpose::MASKABLE)
       errors.push_back(icon.error);
   }
 
-  if (params.valid_badge_icon) {
-    IconProperty& icon = icons_[IconPurpose::BADGE];
+  if (params.valid_splash_icon) {
+    IconProperty& icon = icons_[IconUsage::kSplash];
 
-    // If the error is NO_ACCEPTABLE_ICON, there is no icon suitable as a badge
-    // in the manifest. Ignore this case since we only want to fail the check if
-    // there was a suitable badge icon specified and we couldn't fetch it.
+    // If the error is NO_ACCEPTABLE_ICON, there is no icon suitable as a splash
+    // icon in the manifest. Ignore this case since we only want to fail the
+    // check if there was a suitable splash icon specified and we couldn't fetch
+    // it.
     if (icon.error != NO_ERROR_DETECTED && icon.error != NO_ACCEPTABLE_ICON)
       errors.push_back(icon.error);
   }
@@ -412,17 +420,16 @@
   return worker_->error;
 }
 
-InstallableStatusCode InstallableManager::icon_error(
-    const IconPurpose purpose) {
-  return icons_[purpose].error;
+InstallableStatusCode InstallableManager::icon_error(const IconUsage usage) {
+  return icons_[usage].error;
 }
 
-GURL& InstallableManager::icon_url(const IconPurpose purpose) {
-  return icons_[purpose].url;
+GURL& InstallableManager::icon_url(const IconUsage usage) {
+  return icons_[usage].url;
 }
 
-const SkBitmap* InstallableManager::icon(const IconPurpose purpose) {
-  return icons_[purpose].icon.get();
+const SkBitmap* InstallableManager::icon(const IconUsage usage) {
+  return icons_[usage].icon.get();
 }
 
 content::WebContents* InstallableManager::GetWebContents() {
@@ -440,8 +447,9 @@
          manifest_->fetched &&
          (!params.valid_manifest || valid_manifest_->fetched) &&
          (!params.has_worker || worker_->fetched) &&
-         (!params.valid_primary_icon || IsPrimaryIconFetched(params)) &&
-         (!params.valid_badge_icon || IsIconFetched(IconPurpose::BADGE));
+         (!params.valid_primary_icon ||
+          IsIconFetchComplete(IconUsage::kPrimary)) &&
+         (!params.valid_splash_icon || IsIconFetchComplete(IconUsage::kSplash));
 }
 
 void InstallableManager::Reset() {
@@ -464,9 +472,8 @@
 void InstallableManager::SetManifestDependentTasksComplete() {
   valid_manifest_->fetched = true;
   worker_->fetched = true;
-  SetIconFetched(IconPurpose::ANY);
-  SetIconFetched(IconPurpose::BADGE);
-  SetIconFetched(IconPurpose::MASKABLE);
+  SetIconFetched(IconUsage::kPrimary);
+  SetIconFetched(IconUsage::kSplash);
 }
 
 void InstallableManager::CleanupAndStartNextTask() {
@@ -487,20 +494,20 @@
   IconProperty null_icon;
   IconProperty* primary_icon = &null_icon;
   bool has_maskable_primary_icon = false;
-  IconProperty* badge_icon = &null_icon;
+  IconProperty* splash_icon = &null_icon;
 
-  IconPurpose purpose = GetPrimaryIconPurpose(params);
-  if (params.valid_primary_icon && IsIconFetched(purpose)) {
-    primary_icon = &icons_[purpose];
-    has_maskable_primary_icon = (purpose == IconPurpose::MASKABLE);
+  if (params.valid_primary_icon && IsIconFetchComplete(IconUsage::kPrimary)) {
+    primary_icon = &icons_[IconUsage::kPrimary];
+    has_maskable_primary_icon =
+        (primary_icon->purpose == IconPurpose::MASKABLE);
   }
-  if (params.valid_badge_icon && IsIconFetched(IconPurpose::BADGE))
-    badge_icon = &icons_[IconPurpose::BADGE];
+  if (params.valid_splash_icon && IsIconFetchComplete(IconUsage::kSplash))
+    splash_icon = &icons_[IconUsage::kSplash];
 
   InstallableData data = {
       std::move(errors),   manifest_url(),           &manifest(),
       primary_icon->url,   primary_icon->icon.get(), has_maskable_primary_icon,
-      badge_icon->url,     badge_icon->icon.get(),   valid_manifest_->is_valid,
+      splash_icon->url,    splash_icon->icon.get(),  valid_manifest_->is_valid,
       worker_->has_worker,
   };
 
@@ -532,21 +539,25 @@
   } else if (!manifest_->fetched) {
     FetchManifest();
   } else if (params.valid_primary_icon && params.prefer_maskable_icon &&
-             !IsIconFetched(IconPurpose::MASKABLE)) {
+             !IsMaskableIconFetched(IconUsage::kPrimary)) {
     CheckAndFetchBestIcon(GetIdealPrimaryAdaptiveLauncherIconSizeInPx(),
                           kMinimumPrimaryAdaptiveLauncherIconSizeInPx,
-                          IconPurpose::MASKABLE);
-  } else if (params.valid_primary_icon && !IsIconFetched(IconPurpose::ANY)) {
+                          IconPurpose::MASKABLE, IconUsage::kPrimary);
+  } else if (params.valid_primary_icon &&
+             !IsIconFetchComplete(IconUsage::kPrimary)) {
     CheckAndFetchBestIcon(GetIdealPrimaryIconSizeInPx(),
-                          GetMinimumPrimaryIconSizeInPx(), IconPurpose::ANY);
+                          GetMinimumPrimaryIconSizeInPx(), IconPurpose::ANY,
+                          IconUsage::kPrimary);
   } else if (params.valid_manifest && !valid_manifest_->fetched) {
     CheckManifestValid(params.check_webapp_manifest_display,
                        params.prefer_maskable_icon);
   } else if (params.has_worker && !worker_->fetched) {
     CheckServiceWorker();
-  } else if (params.valid_badge_icon && !IsIconFetched(IconPurpose::BADGE)) {
-    CheckAndFetchBestIcon(GetIdealBadgeIconSizeInPx(),
-                          GetIdealBadgeIconSizeInPx(), IconPurpose::BADGE);
+  } else if (params.valid_splash_icon &&
+             !IsIconFetchComplete(IconUsage::kSplash)) {
+    CheckAndFetchBestIcon(GetIdealSplashIconSizeInPx(),
+                          GetMinimumSplashIconSizeInPx(), IconPurpose::ANY,
+                          IconUsage::kSplash);
   } else {
     NOTREACHED();
   }
@@ -696,11 +707,14 @@
 
 void InstallableManager::CheckAndFetchBestIcon(int ideal_icon_size_in_px,
                                                int minimum_icon_size_in_px,
-                                               const IconPurpose purpose) {
+                                               const IconPurpose purpose,
+                                               const IconUsage usage) {
   DCHECK(!manifest().IsEmpty());
 
-  IconProperty& icon = icons_[purpose];
+  IconProperty& icon = icons_[usage];
   icon.fetched = true;
+  icon.purpose = purpose;
+  icon.error = NO_ERROR_DETECTED;
 
   GURL icon_url = blink::ManifestIconSelector::FindBestMatchingSquareIcon(
       manifest().icons, ideal_icon_size_in_px, minimum_icon_size_in_px,
@@ -713,7 +727,7 @@
         GetWebContents(), icon_url, ideal_icon_size_in_px,
         minimum_icon_size_in_px,
         base::BindOnce(&InstallableManager::OnIconFetched,
-                       weak_factory_.GetWeakPtr(), icon_url, purpose));
+                       weak_factory_.GetWeakPtr(), icon_url, usage));
     if (can_download_icon)
       return;
     icon.error = CANNOT_DOWNLOAD_ICON;
@@ -723,12 +737,12 @@
 }
 
 void InstallableManager::OnIconFetched(const GURL icon_url,
-                                       const IconPurpose purpose,
+                                       const IconUsage usage,
                                        const SkBitmap& bitmap) {
   if (!GetWebContents())
     return;
 
-  IconProperty& icon = icons_[purpose];
+  IconProperty& icon = icons_[usage];
   if (bitmap.drawsNothing()) {
     icon.error = NO_ICON_AVAILABLE;
   } else {
diff --git a/chrome/browser/installable/installable_manager.h b/chrome/browser/installable/installable_manager.h
index e04d5a4..469cec2d 100644
--- a/chrome/browser/installable/installable_manager.h
+++ b/chrome/browser/installable/installable_manager.h
@@ -95,6 +95,8 @@
 
   using IconPurpose = blink::Manifest::ImageResource::Purpose;
 
+  enum class IconUsage { kPrimary, kSplash };
+
   struct EligiblityProperty {
     EligiblityProperty();
     ~EligiblityProperty();
@@ -133,6 +135,7 @@
     IconProperty& operator=(IconProperty&& other);
 
     InstallableStatusCode error;
+    IconPurpose purpose;
     GURL url;
     std::unique_ptr<SkBitmap> icon;
     bool fetched;
@@ -142,16 +145,17 @@
     DISALLOW_COPY_AND_ASSIGN(IconProperty);
   };
 
-  // Returns true if |purpose| matches any fetched icon, or false if no icon has
-  // been requested yet or there is no match.
-  bool IsIconFetched(const IconPurpose purpose) const;
-  bool IsPrimaryIconFetched(const InstallableParams& params) const;
+  // Returns true if an icon for the given usage is fetched successfully, or
+  // doesn't need to fallback to another icon purpose (i.e. MASKABLE icon
+  // allback to ANY icon).
+  bool IsIconFetchComplete(const IconUsage usage) const;
 
-  // Sets the icon matching |purpose| as fetched.
-  void SetIconFetched(const IconPurpose purpose);
+  // Returns true if we have tried fetching maskable icon. Note that this also
+  // returns true if the fallback icon(IconPurpose::ANY) is fetched.
+  bool IsMaskableIconFetched(const IconUsage usage) const;
 
-  // Gets the purpose of the icon to use as a primary icon.
-  IconPurpose GetPrimaryIconPurpose(const InstallableParams& params) const;
+  // Sets the icon matching |usage| as fetched.
+  void SetIconFetched(const IconUsage usage);
 
   // Returns a vector with all errors encountered for the resources requested in
   // |params|, or an empty vector if there is no error.
@@ -163,9 +167,9 @@
   InstallableStatusCode valid_manifest_error() const;
   void set_valid_manifest_error(InstallableStatusCode error_code);
   InstallableStatusCode worker_error() const;
-  InstallableStatusCode icon_error(const IconPurpose purpose);
-  GURL& icon_url(const IconPurpose purpose);
-  const SkBitmap* icon(const IconPurpose purpose);
+  InstallableStatusCode icon_error(const IconUsage usage);
+  GURL& icon_url(const IconUsage usage);
+  const SkBitmap* icon(const IconUsage usage);
 
   // Returns the WebContents to which this object is attached, or nullptr if the
   // WebContents doesn't exist or is currently being destroyed.
@@ -205,9 +209,10 @@
 
   void CheckAndFetchBestIcon(int ideal_icon_size_in_px,
                              int minimum_icon_size_in_px,
-                             const IconPurpose purpose);
+                             const IconPurpose purpose,
+                             const IconUsage usage);
   void OnIconFetched(const GURL icon_url,
-                     const IconPurpose purpose,
+                     const IconUsage usage,
                      const SkBitmap& bitmap);
 
   // content::ServiceWorkerContextObserver overrides
@@ -232,7 +237,7 @@
   std::unique_ptr<ManifestProperty> manifest_;
   std::unique_ptr<ValidManifestProperty> valid_manifest_;
   std::unique_ptr<ServiceWorkerProperty> worker_;
-  std::map<IconPurpose, IconProperty> icons_;
+  std::map<IconUsage, IconProperty> icons_;
 
   // Owned by the storage partition attached to the content::WebContents which
   // this object is scoped to.
diff --git a/chrome/browser/installable/installable_manager_browsertest.cc b/chrome/browser/installable/installable_manager_browsertest.cc
index 4097affa9..a4324fc4 100644
--- a/chrome/browser/installable/installable_manager_browsertest.cc
+++ b/chrome/browser/installable/installable_manager_browsertest.cc
@@ -24,8 +24,6 @@
 #include "content/public/test/browser_test_utils.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 
-using IconPurpose = blink::Manifest::ImageResource::Purpose;
-
 namespace {
 
 const char kInsecureOrigin[] = "http://www.google.com";
@@ -56,10 +54,10 @@
   return params;
 }
 
-InstallableParams GetPrimaryIconAndBadgeIconParams() {
+InstallableParams GetPrimaryIconAndSplashIconParams() {
   InstallableParams params = GetManifestParams();
   params.valid_primary_icon = true;
-  params.valid_badge_icon = true;
+  params.valid_splash_icon = true;
   params.wait_for_worker = true;
   return params;
 }
@@ -72,6 +70,15 @@
   return params;
 }
 
+InstallableParams GetPrimaryIconPreferMaskableAndSplashIconParams() {
+  InstallableParams params = GetManifestParams();
+  params.valid_primary_icon = true;
+  params.prefer_maskable_icon = true;
+  params.valid_splash_icon = true;
+  params.wait_for_worker = true;
+  return params;
+}
+
 }  // anonymous namespace
 
 // Used only for testing pages with no service workers. This class will dispatch
@@ -126,9 +133,9 @@
     if (data.primary_icon)
       primary_icon_.reset(new SkBitmap(*data.primary_icon));
     has_maskable_primary_icon_ = data.has_maskable_primary_icon;
-    badge_icon_url_ = data.badge_icon_url;
-    if (data.badge_icon)
-      badge_icon_.reset(new SkBitmap(*data.badge_icon));
+    splash_icon_url_ = data.splash_icon_url;
+    if (data.splash_icon)
+      splash_icon_.reset(new SkBitmap(*data.splash_icon));
     valid_manifest_ = data.valid_manifest;
     has_worker_ = data.has_worker;
     base::SequencedTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure_);
@@ -140,8 +147,8 @@
   const GURL& primary_icon_url() const { return primary_icon_url_; }
   const SkBitmap* primary_icon() const { return primary_icon_.get(); }
   bool has_maskable_primary_icon() const { return has_maskable_primary_icon_; }
-  const GURL& badge_icon_url() const { return badge_icon_url_; }
-  const SkBitmap* badge_icon() const { return badge_icon_.get(); }
+  const GURL& splash_icon_url() const { return splash_icon_url_; }
+  const SkBitmap* splash_icon() const { return splash_icon_.get(); }
   bool valid_manifest() const { return valid_manifest_; }
   bool has_worker() const { return has_worker_; }
 
@@ -153,8 +160,8 @@
   GURL primary_icon_url_;
   std::unique_ptr<SkBitmap> primary_icon_;
   bool has_maskable_primary_icon_;
-  GURL badge_icon_url_;
-  std::unique_ptr<SkBitmap> badge_icon_;
+  GURL splash_icon_url_;
+  std::unique_ptr<SkBitmap> splash_icon_;
   bool valid_manifest_;
   bool has_worker_;
 };
@@ -361,8 +368,8 @@
   EXPECT_FALSE(tester->has_maskable_primary_icon());
   EXPECT_FALSE(tester->valid_manifest());
   EXPECT_FALSE(tester->has_worker());
-  EXPECT_TRUE(tester->badge_icon_url().is_empty());
-  EXPECT_EQ(nullptr, tester->badge_icon());
+  EXPECT_TRUE(tester->splash_icon_url().is_empty());
+  EXPECT_EQ(nullptr, tester->splash_icon());
   EXPECT_EQ(std::vector<InstallableStatusCode>{NO_MANIFEST}, tester->errors());
 }
 
@@ -386,8 +393,8 @@
   EXPECT_FALSE(tester->has_maskable_primary_icon());
   EXPECT_FALSE(tester->valid_manifest());
   EXPECT_FALSE(tester->has_worker());
-  EXPECT_TRUE(tester->badge_icon_url().is_empty());
-  EXPECT_EQ(nullptr, tester->badge_icon());
+  EXPECT_TRUE(tester->splash_icon_url().is_empty());
+  EXPECT_EQ(nullptr, tester->splash_icon());
   EXPECT_EQ(std::vector<InstallableStatusCode>{MANIFEST_EMPTY},
             tester->errors());
 }
@@ -410,8 +417,8 @@
   EXPECT_FALSE(tester->has_maskable_primary_icon());
   EXPECT_FALSE(tester->valid_manifest());
   EXPECT_FALSE(tester->has_worker());
-  EXPECT_TRUE(tester->badge_icon_url().is_empty());
-  EXPECT_EQ(nullptr, tester->badge_icon());
+  EXPECT_TRUE(tester->splash_icon_url().is_empty());
+  EXPECT_EQ(nullptr, tester->splash_icon());
   EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
 }
 
@@ -436,8 +443,8 @@
   EXPECT_FALSE(tester->has_maskable_primary_icon());
   EXPECT_FALSE(tester->valid_manifest());
   EXPECT_FALSE(tester->has_worker());
-  EXPECT_TRUE(tester->badge_icon_url().is_empty());
-  EXPECT_EQ(nullptr, tester->badge_icon());
+  EXPECT_TRUE(tester->splash_icon_url().is_empty());
+  EXPECT_EQ(nullptr, tester->splash_icon());
   EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
 }
 
@@ -463,13 +470,13 @@
     EXPECT_EQ(nullptr, tester->primary_icon());
     EXPECT_FALSE(tester->valid_manifest());
     EXPECT_FALSE(tester->has_worker());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{NO_ACCEPTABLE_ICON},
               tester->errors());
   }
 
-  // Ask for everything except badge icon. This should fail with
+  // Ask for everything except splash icon. This should fail with
   // NO_ACCEPTABLE_ICON - the primary icon fetch has already failed, so that
   // cached error stops the installable check from being performed.
   {
@@ -487,20 +494,20 @@
     EXPECT_EQ(nullptr, tester->primary_icon());
     EXPECT_FALSE(tester->valid_manifest());
     EXPECT_FALSE(tester->has_worker());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{NO_ACCEPTABLE_ICON},
               tester->errors());
   }
 
-  // Ask for a badge icon. This should fail to get a badge icon but not record
+  // Ask for a splash icon. This should fail to get a splash icon but not record
   // an error.
   {
     base::RunLoop run_loop;
     std::unique_ptr<CallbackTester> tester(
         new CallbackTester(run_loop.QuitClosure()));
 
-    InstallableParams params = GetPrimaryIconAndBadgeIconParams();
+    InstallableParams params = GetPrimaryIconAndSplashIconParams();
     params.valid_primary_icon = false;
     RunInstallableManager(browser(), tester.get(), params);
     run_loop.Run();
@@ -510,8 +517,8 @@
 
     EXPECT_TRUE(tester->primary_icon_url().is_empty());
     EXPECT_EQ(nullptr, tester->primary_icon());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_FALSE(tester->valid_manifest());
     EXPECT_FALSE(tester->has_worker());
     EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
@@ -541,8 +548,8 @@
     EXPECT_EQ(nullptr, tester->primary_icon());
     EXPECT_FALSE(tester->valid_manifest());
     EXPECT_FALSE(tester->has_worker());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
   }
 
@@ -564,13 +571,13 @@
     EXPECT_EQ(nullptr, tester->primary_icon());
     EXPECT_FALSE(tester->valid_manifest());
     EXPECT_FALSE(tester->has_worker());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{NO_ACCEPTABLE_ICON},
               tester->errors());
   }
 
-  // Ask for everything except badge icon. This should fail with
+  // Ask for everything except splash icon. This should fail with
   // NO_ACCEPTABLE_ICON - the primary icon fetch has already failed, so that
   // cached error stops the installable check from being performed.
   {
@@ -589,8 +596,8 @@
     EXPECT_EQ(nullptr, tester->primary_icon());
     EXPECT_FALSE(tester->valid_manifest());
     EXPECT_FALSE(tester->has_worker());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{NO_ACCEPTABLE_ICON},
               tester->errors());
   }
@@ -613,8 +620,8 @@
 
     EXPECT_TRUE(tester->primary_icon_url().is_empty());
     EXPECT_EQ(nullptr, tester->primary_icon());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_FALSE(tester->valid_manifest());
     EXPECT_FALSE(tester->has_worker());
     EXPECT_EQ(
@@ -644,19 +651,19 @@
     EXPECT_NE(nullptr, tester->primary_icon());
     EXPECT_FALSE(tester->valid_manifest());
     EXPECT_FALSE(tester->has_worker());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
   }
 
-  // Add to homescreen checks for manifest + primary icon + badge icon.
+  // Add to homescreen checks for manifest + primary icon + splash icon.
   {
     base::RunLoop run_loop;
     std::unique_ptr<CallbackTester> tester(
         new CallbackTester(run_loop.QuitClosure()));
 
     RunInstallableManager(browser(), tester.get(),
-                          GetPrimaryIconAndBadgeIconParams());
+                          GetPrimaryIconAndSplashIconParams());
     run_loop.Run();
 
     EXPECT_FALSE(tester->manifest().IsEmpty());
@@ -666,31 +673,30 @@
     EXPECT_NE(nullptr, tester->primary_icon());
     EXPECT_FALSE(tester->valid_manifest());
     EXPECT_FALSE(tester->has_worker());
-    EXPECT_FALSE(tester->badge_icon_url().is_empty());
-    EXPECT_NE(nullptr, tester->badge_icon());
+    EXPECT_FALSE(tester->splash_icon_url().is_empty());
+    EXPECT_NE(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
   }
 
-  // Navigate to a page with a bad badge icon. This should now fail with
-  // NO_ICON_AVAILABLE, but still have the manifest and primary icon.
+  // Navigate to a page with a good maskable icon for primary icon and a bad any
+  // icon for splash icon. This should fail with NO_ICON_AVAILABLE, but still
+  // have the manifest and primary icon.
   {
     base::RunLoop run_loop;
     std::unique_ptr<CallbackTester> tester(
         new CallbackTester(run_loop.QuitClosure()));
-
-    NavigateAndRunInstallableManager(browser(), tester.get(),
-                                     GetPrimaryIconAndBadgeIconParams(),
-                                     GetURLOfPageWithServiceWorkerAndManifest(
-                                         "/banners/manifest_bad_badge.json"));
+    NavigateAndRunInstallableManager(
+        browser(), tester.get(),
+        GetPrimaryIconPreferMaskableAndSplashIconParams(),
+        GetURLOfPageWithServiceWorkerAndManifest(
+            "/banners/manifest_bad_non_maskable_icon.json"));
     run_loop.Run();
-
     EXPECT_FALSE(tester->manifest().IsEmpty());
     EXPECT_FALSE(tester->manifest_url().is_empty());
-
     EXPECT_FALSE(tester->primary_icon_url().is_empty());
     EXPECT_NE(nullptr, tester->primary_icon());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_FALSE(tester->valid_manifest());
     EXPECT_FALSE(tester->has_worker());
     EXPECT_EQ(std::vector<InstallableStatusCode>{NO_ICON_AVAILABLE},
@@ -699,7 +705,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, CheckWebapp) {
-  // Request everything except badge icon.
+  // Request everything except splash icon.
   {
     base::HistogramTester histograms;
     base::RunLoop run_loop;
@@ -719,8 +725,8 @@
     EXPECT_NE(nullptr, tester->primary_icon());
     EXPECT_TRUE(tester->valid_manifest());
     EXPECT_TRUE(tester->has_worker());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
 
     // Verify that the returned state matches manager internal state.
@@ -731,16 +737,19 @@
     EXPECT_TRUE(manager->valid_manifest());
     EXPECT_TRUE(manager->has_worker());
     EXPECT_EQ(1u, manager->icons_.size());
-    EXPECT_FALSE((manager->icon_url(IconPurpose::ANY).is_empty()));
-    EXPECT_NE(nullptr, (manager->icon(IconPurpose::ANY)));
+    EXPECT_FALSE((
+        manager->icon_url(InstallableManager::IconUsage::kPrimary).is_empty()));
+    EXPECT_NE(nullptr,
+              (manager->icon(InstallableManager::IconUsage::kPrimary)));
     EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error());
     EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error());
     EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error());
-    EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(IconPurpose::ANY)));
+    EXPECT_EQ(NO_ERROR_DETECTED,
+              (manager->icon_error(InstallableManager::IconUsage::kPrimary)));
     EXPECT_TRUE(!manager->task_queue_.HasCurrent());
   }
 
-  // Request everything except badge icon again without navigating away. This
+  // Request everything except splash icon again without navigating away. This
   // should work fine.
   {
     base::RunLoop run_loop;
@@ -756,8 +765,8 @@
     EXPECT_NE(nullptr, tester->primary_icon());
     EXPECT_TRUE(tester->valid_manifest());
     EXPECT_TRUE(tester->has_worker());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
 
     // Verify that the returned state matches manager internal state.
@@ -768,12 +777,15 @@
     EXPECT_TRUE(manager->valid_manifest());
     EXPECT_TRUE(manager->has_worker());
     EXPECT_EQ(1u, manager->icons_.size());
-    EXPECT_FALSE((manager->icon_url(IconPurpose::ANY).is_empty()));
-    EXPECT_NE(nullptr, (manager->icon(IconPurpose::ANY)));
+    EXPECT_FALSE((
+        manager->icon_url(InstallableManager::IconUsage::kPrimary).is_empty()));
+    EXPECT_NE(nullptr,
+              (manager->icon(InstallableManager::IconUsage::kPrimary)));
     EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error());
     EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error());
     EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error());
-    EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(IconPurpose::ANY)));
+    EXPECT_EQ(NO_ERROR_DETECTED,
+              (manager->icon_error(InstallableManager::IconUsage::kPrimary)));
     EXPECT_TRUE(!manager->task_queue_.HasCurrent());
   }
 
@@ -820,8 +832,8 @@
 
     EXPECT_FALSE(tester->valid_manifest());
     EXPECT_FALSE(tester->has_worker());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
   }
 
@@ -847,8 +859,8 @@
 
     EXPECT_FALSE(tester->valid_manifest());
     EXPECT_FALSE(tester->has_worker());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
   }
 
@@ -874,8 +886,36 @@
 
     EXPECT_FALSE(tester->valid_manifest());
     EXPECT_FALSE(tester->has_worker());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
+    EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
+  }
+
+  // Checks that we fall back to using an ANY icon if a MASKABLE icon is
+  // requested but the maskable icon is bad.
+  {
+    base::RunLoop run_loop;
+    std::unique_ptr<CallbackTester> tester(
+        new CallbackTester(run_loop.QuitClosure()));
+
+    NavigateAndRunInstallableManager(
+        browser(), tester.get(), GetPrimaryIconPreferMaskableParams(),
+        GetURLOfPageWithServiceWorkerAndManifest(
+            "/banners/manifest_bad_maskable.json"));
+
+    run_loop.Run();
+
+    EXPECT_FALSE(tester->manifest().IsEmpty());
+    EXPECT_FALSE(tester->manifest_url().is_empty());
+
+    EXPECT_FALSE(tester->primary_icon_url().is_empty());
+    EXPECT_NE(nullptr, tester->primary_icon());
+    EXPECT_FALSE(tester->has_maskable_primary_icon());
+
+    EXPECT_FALSE(tester->valid_manifest());
+    EXPECT_FALSE(tester->has_worker());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
   }
 }
@@ -950,8 +990,8 @@
   EXPECT_EQ(nullptr, tester->primary_icon());
   EXPECT_FALSE(tester->valid_manifest());
   EXPECT_FALSE(tester->has_worker());
-  EXPECT_TRUE(tester->badge_icon_url().is_empty());
-  EXPECT_EQ(nullptr, tester->badge_icon());
+  EXPECT_TRUE(tester->splash_icon_url().is_empty());
+  EXPECT_EQ(nullptr, tester->splash_icon());
   EXPECT_EQ(std::vector<InstallableStatusCode>{NO_MANIFEST}, tester->errors());
 }
 
@@ -975,8 +1015,8 @@
     EXPECT_EQ(nullptr, tester->primary_icon());
     EXPECT_FALSE(tester->valid_manifest());
     EXPECT_FALSE(tester->has_worker());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
   }
 
@@ -998,8 +1038,8 @@
     EXPECT_NE(nullptr, tester->primary_icon());
     EXPECT_TRUE(tester->valid_manifest());
     EXPECT_FALSE(tester->has_worker());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{NO_MATCHING_SERVICE_WORKER},
               tester->errors());
   }
@@ -1037,12 +1077,14 @@
   EXPECT_TRUE(manager->valid_manifest());
   EXPECT_FALSE(manager->has_worker());
   EXPECT_EQ(1u, manager->icons_.size());
-  EXPECT_FALSE((manager->icon_url(IconPurpose::ANY).is_empty()));
-  EXPECT_NE(nullptr, (manager->icon(IconPurpose::ANY)));
+  EXPECT_FALSE(
+      (manager->icon_url(InstallableManager::IconUsage::kPrimary).is_empty()));
+  EXPECT_NE(nullptr, (manager->icon(InstallableManager::IconUsage::kPrimary)));
   EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error());
   EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error());
   EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error());
-  EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(IconPurpose::ANY)));
+  EXPECT_EQ(NO_ERROR_DETECTED,
+            (manager->icon_error(InstallableManager::IconUsage::kPrimary)));
   EXPECT_TRUE(!manager->task_queue_.HasCurrent());
   EXPECT_TRUE(!manager->task_queue_.paused_tasks_.empty());
 
@@ -1064,8 +1106,8 @@
     EXPECT_NE(nullptr, nested_tester->primary_icon());
     EXPECT_TRUE(nested_tester->valid_manifest());
     EXPECT_FALSE(nested_tester->has_worker());
-    EXPECT_TRUE(nested_tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, nested_tester->badge_icon());
+    EXPECT_TRUE(nested_tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, nested_tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{}, nested_tester->errors());
   }
 
@@ -1081,8 +1123,8 @@
   EXPECT_NE(nullptr, tester->primary_icon());
   EXPECT_TRUE(tester->valid_manifest());
   EXPECT_TRUE(tester->has_worker());
-  EXPECT_TRUE(tester->badge_icon_url().is_empty());
-  EXPECT_EQ(nullptr, tester->badge_icon());
+  EXPECT_TRUE(tester->splash_icon_url().is_empty());
+  EXPECT_EQ(nullptr, tester->splash_icon());
   EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
 
   // Verify internal state.
@@ -1091,12 +1133,14 @@
   EXPECT_TRUE(manager->valid_manifest());
   EXPECT_TRUE(manager->has_worker());
   EXPECT_EQ(1u, manager->icons_.size());
-  EXPECT_FALSE((manager->icon_url(IconPurpose::ANY).is_empty()));
-  EXPECT_NE(nullptr, (manager->icon(IconPurpose::ANY)));
+  EXPECT_FALSE(
+      (manager->icon_url(InstallableManager::IconUsage::kPrimary).is_empty()));
+  EXPECT_NE(nullptr, (manager->icon(InstallableManager::IconUsage::kPrimary)));
   EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error());
   EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error());
   EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error());
-  EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(IconPurpose::ANY)));
+  EXPECT_EQ(NO_ERROR_DETECTED,
+            (manager->icon_error(InstallableManager::IconUsage::kPrimary)));
   EXPECT_TRUE(!manager->task_queue_.HasCurrent());
   EXPECT_FALSE(!manager->task_queue_.paused_tasks_.empty());
 }
@@ -1140,8 +1184,8 @@
   EXPECT_NE(nullptr, tester->primary_icon());
   EXPECT_TRUE(tester->valid_manifest());
   EXPECT_FALSE(tester->has_worker());
-  EXPECT_TRUE(tester->badge_icon_url().is_empty());
-  EXPECT_EQ(nullptr, tester->badge_icon());
+  EXPECT_TRUE(tester->splash_icon_url().is_empty());
+  EXPECT_EQ(nullptr, tester->splash_icon());
   EXPECT_EQ(std::vector<InstallableStatusCode>{NOT_OFFLINE_CAPABLE},
             tester->errors());
 }
@@ -1223,8 +1267,8 @@
   EXPECT_NE(nullptr, tester->primary_icon());
   EXPECT_TRUE(tester->valid_manifest());
   EXPECT_FALSE(tester->has_worker());
-  EXPECT_TRUE(tester->badge_icon_url().is_empty());
-  EXPECT_EQ(nullptr, tester->badge_icon());
+  EXPECT_TRUE(tester->splash_icon_url().is_empty());
+  EXPECT_EQ(nullptr, tester->splash_icon());
   EXPECT_EQ(std::vector<InstallableStatusCode>{NOT_OFFLINE_CAPABLE},
             tester->errors());
 }
@@ -1248,8 +1292,8 @@
   EXPECT_NE(nullptr, tester->primary_icon());
   EXPECT_TRUE(tester->valid_manifest());
   EXPECT_TRUE(tester->has_worker());
-  EXPECT_TRUE(tester->badge_icon_url().is_empty());
-  EXPECT_EQ(nullptr, tester->badge_icon());
+  EXPECT_TRUE(tester->splash_icon_url().is_empty());
+  EXPECT_EQ(nullptr, tester->splash_icon());
   EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
 }
 
@@ -1272,8 +1316,8 @@
   EXPECT_EQ(144, tester->primary_icon()->width());
   EXPECT_TRUE(tester->valid_manifest());
   EXPECT_TRUE(tester->has_worker());
-  EXPECT_TRUE(tester->badge_icon_url().is_empty());
-  EXPECT_EQ(nullptr, tester->badge_icon());
+  EXPECT_TRUE(tester->splash_icon_url().is_empty());
+  EXPECT_EQ(nullptr, tester->splash_icon());
   EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
 }
 
@@ -1297,8 +1341,8 @@
   EXPECT_EQ(nullptr, tester->primary_icon());
   EXPECT_FALSE(tester->valid_manifest());
   EXPECT_FALSE(tester->has_worker());
-  EXPECT_TRUE(tester->badge_icon_url().is_empty());
-  EXPECT_EQ(nullptr, tester->badge_icon());
+  EXPECT_TRUE(tester->splash_icon_url().is_empty());
+  EXPECT_EQ(nullptr, tester->splash_icon());
   EXPECT_EQ(std::vector<InstallableStatusCode>{NO_ICON_AVAILABLE},
             tester->errors());
 }
@@ -1322,8 +1366,8 @@
     EXPECT_NE(nullptr, tester->primary_icon());
     EXPECT_TRUE(tester->valid_manifest());
     EXPECT_TRUE(tester->has_worker());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
   }
 
@@ -1342,8 +1386,8 @@
     EXPECT_NE(nullptr, tester->primary_icon());
     EXPECT_TRUE(tester->valid_manifest());
     EXPECT_TRUE(tester->has_worker());
-    EXPECT_TRUE(tester->badge_icon_url().is_empty());
-    EXPECT_EQ(nullptr, tester->badge_icon());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
     EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
   }
 }
@@ -1492,6 +1536,37 @@
 }
 
 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest,
+                       DebugModeBadFallbackMaskable) {
+  base::RunLoop run_loop;
+  std::unique_ptr<CallbackTester> tester(
+      new CallbackTester(run_loop.QuitClosure()));
+
+  InstallableParams params = GetPrimaryIconPreferMaskableParams();
+  params.is_debug_mode = true;
+
+  NavigateAndRunInstallableManager(
+      browser(), tester.get(), params,
+      GetURLOfPageWithServiceWorkerAndManifest(
+          "/banners/manifest_one_bad_maskable.json"));
+
+  run_loop.Run();
+
+  EXPECT_FALSE(tester->manifest().IsEmpty());
+  EXPECT_FALSE(tester->manifest_url().is_empty());
+
+  EXPECT_TRUE(tester->primary_icon_url().is_empty());
+  EXPECT_EQ(nullptr, tester->primary_icon());
+  EXPECT_FALSE(tester->has_maskable_primary_icon());
+
+  EXPECT_FALSE(tester->valid_manifest());
+  EXPECT_FALSE(tester->has_worker());
+  EXPECT_TRUE(tester->splash_icon_url().is_empty());
+  EXPECT_EQ(nullptr, tester->splash_icon());
+  EXPECT_EQ(std::vector<InstallableStatusCode>{NO_ACCEPTABLE_ICON},
+            tester->errors());
+}
+
+IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest,
                        GetAllInatallabilityErrorsNoErrors) {
   EXPECT_EQ(std::vector<content::InstallabilityError>{},
             NavigateAndGetAllInstallabilityErrors(
@@ -1554,3 +1629,63 @@
   EXPECT_EQ(std::vector<InstallableStatusCode>({NO_MATCHING_SERVICE_WORKER}),
             tester->errors());
 }
+
+IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest, CheckSplashIcon) {
+  // Checks that InstallableManager chooses the correct splash icon.
+
+  // Test page has a manifest with only one icon, primary icon and splash icon
+  // should be the same one.
+  {
+    base::RunLoop run_loop;
+    std::unique_ptr<CallbackTester> tester(
+        new CallbackTester(run_loop.QuitClosure()));
+
+    NavigateAndRunInstallableManager(browser(), tester.get(),
+                                     GetPrimaryIconAndSplashIconParams(),
+                                     GetURLOfPageWithServiceWorkerAndManifest(
+                                         "/banners/manifest_one_icon.json"));
+
+    run_loop.Run();
+
+    EXPECT_FALSE(tester->manifest().IsEmpty());
+    EXPECT_FALSE(tester->manifest_url().is_empty());
+
+    EXPECT_FALSE(tester->primary_icon_url().is_empty());
+    EXPECT_NE(nullptr, tester->primary_icon());
+    EXPECT_FALSE(tester->valid_manifest());
+    EXPECT_FALSE(tester->has_worker());
+    EXPECT_FALSE(tester->splash_icon_url().is_empty());
+    EXPECT_NE(nullptr, tester->splash_icon());
+    EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
+
+    EXPECT_EQ(tester->primary_icon_url(), tester->splash_icon_url());
+  }
+
+  // Test page has a manifest with only one maskable icon. This should fail to
+  // get a splash icon but not record an error.
+  {
+    base::RunLoop run_loop;
+    std::unique_ptr<CallbackTester> tester(
+        new CallbackTester(run_loop.QuitClosure()));
+
+    NavigateAndRunInstallableManager(
+        browser(), tester.get(),
+        GetPrimaryIconPreferMaskableAndSplashIconParams(),
+        GetURLOfPageWithServiceWorkerAndManifest(
+            "/banners/manifest_one_maskable.json"));
+
+    run_loop.Run();
+
+    EXPECT_FALSE(tester->manifest().IsEmpty());
+    EXPECT_FALSE(tester->manifest_url().is_empty());
+
+    EXPECT_FALSE(tester->primary_icon_url().is_empty());
+    EXPECT_NE(nullptr, tester->primary_icon());
+    EXPECT_TRUE(tester->has_maskable_primary_icon());
+    EXPECT_FALSE(tester->valid_manifest());
+    EXPECT_FALSE(tester->has_worker());
+    EXPECT_TRUE(tester->splash_icon_url().is_empty());
+    EXPECT_EQ(nullptr, tester->splash_icon());
+    EXPECT_EQ(std::vector<InstallableStatusCode>{}, tester->errors());
+  }
+}
diff --git a/chrome/browser/installable/installable_manager_unittest.cc b/chrome/browser/installable/installable_manager_unittest.cc
index d8c0a1d..f142699 100644
--- a/chrome/browser/installable/installable_manager_unittest.cc
+++ b/chrome/browser/installable/installable_manager_unittest.cc
@@ -205,7 +205,7 @@
   blink::Manifest manifest = GetValidManifest();
 
   // The icon MUST have IconPurpose::ANY at least.
-  manifest.icons[0].purpose[0] = IconPurpose::BADGE;
+  manifest.icons[0].purpose[0] = IconPurpose::MASKABLE;
   EXPECT_FALSE(IsManifestValid(manifest));
   EXPECT_EQ(MANIFEST_MISSING_SUITABLE_ICON, GetErrorCode());
 
diff --git a/chrome/browser/installable/installable_params.cc b/chrome/browser/installable/installable_params.cc
new file mode 100644
index 0000000..9eeaf31
--- /dev/null
+++ b/chrome/browser/installable/installable_params.cc
@@ -0,0 +1,8 @@
+// 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/installable/installable_params.h"
+
+InstallableParams::InstallableParams() = default;
+InstallableParams::InstallableParams(const InstallableParams&) = default;
diff --git a/chrome/browser/installable/installable_params.h b/chrome/browser/installable/installable_params.h
index 58b4c357..a55ebdd 100644
--- a/chrome/browser/installable/installable_params.h
+++ b/chrome/browser/installable/installable_params.h
@@ -11,6 +11,8 @@
 // true, otherwise, all tasks will be run and a complete list of errors will be
 // returned.
 struct InstallableParams {
+  InstallableParams();
+  InstallableParams(const InstallableParams&);
   // Check whether the current WebContents is eligible to be installed, i.e it:
   //  - is served over HTTPS
   //  - is a top-level frame
@@ -28,6 +30,10 @@
   // conforming to the badge icon size parameters.
   bool valid_badge_icon = false;
 
+  // Check whether there is a fetchable, non-empty icon in the manifest
+  // conforming to the splash icon size parameters.
+  bool valid_splash_icon = false;
+
   // Check whether the site has a manifest valid for a web app.
   bool valid_manifest = false;
 
diff --git a/chrome/browser/installable/installable_task_queue_unittest.cc b/chrome/browser/installable/installable_task_queue_unittest.cc
index 710c0c7b..f6f96c6 100644
--- a/chrome/browser/installable/installable_task_queue_unittest.cc
+++ b/chrome/browser/installable/installable_task_queue_unittest.cc
@@ -13,7 +13,7 @@
   bool valid_manifest = false;
   bool has_worker = false;
   bool valid_primary_icon = false;
-  bool valid_badge_icon = false;
+  bool valid_splash_icon = false;
 };
 
 // Constructs an InstallableTask, with the supplied bools stored in it.
@@ -22,7 +22,7 @@
   task.params.valid_manifest = params.valid_manifest;
   task.params.has_worker = params.has_worker;
   task.params.valid_primary_icon = params.valid_primary_icon;
-  task.params.valid_badge_icon = params.valid_badge_icon;
+  task.params.valid_splash_icon = params.valid_splash_icon;
   return task;
 }
 
@@ -30,7 +30,7 @@
   return task.params.valid_manifest == params.valid_manifest &&
          task.params.has_worker == params.has_worker &&
          task.params.valid_primary_icon == params.valid_primary_icon &&
-         task.params.valid_badge_icon == params.valid_badge_icon;
+         task.params.valid_splash_icon == params.valid_splash_icon;
 }
 
 class InstallableTaskQueueUnitTest : public testing::Test {};
diff --git a/chrome/browser/media/webrtc/webrtc_browsertest_base.cc b/chrome/browser/media/webrtc/webrtc_browsertest_base.cc
index 963a351ca..806b591 100644
--- a/chrome/browser/media/webrtc/webrtc_browsertest_base.cc
+++ b/chrome/browser/media/webrtc/webrtc_browsertest_base.cc
@@ -28,6 +28,7 @@
 #include "chrome/common/chrome_paths.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/permissions/permission_request_manager.h"
+#include "components/permissions/test/permission_request_observer.h"
 #include "content/public/test/browser_test_utils.h"
 #include "extensions/browser/extension_registry.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -102,43 +103,6 @@
   return false;
 }
 
-// PermissionRequestObserver ---------------------------------------------------
-
-// Used to observe the creation of permission prompt without responding.
-class PermissionRequestObserver
-    : public permissions::PermissionRequestManager::Observer {
- public:
-  explicit PermissionRequestObserver(content::WebContents* web_contents)
-      : request_manager_(permissions::PermissionRequestManager::FromWebContents(
-            web_contents)),
-        request_shown_(false),
-        message_loop_runner_(new content::MessageLoopRunner) {
-    request_manager_->AddObserver(this);
-  }
-  ~PermissionRequestObserver() override {
-    // Safe to remove twice if it happens.
-    request_manager_->RemoveObserver(this);
-  }
-
-  void Wait() { message_loop_runner_->Run(); }
-
-  bool request_shown() const { return request_shown_; }
-
- private:
-  // PermissionRequestManager::Observer
-  void OnBubbleAdded() override {
-    request_shown_ = true;
-    request_manager_->RemoveObserver(this);
-    message_loop_runner_->Quit();
-  }
-
-  permissions::PermissionRequestManager* request_manager_;
-  bool request_shown_;
-  scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
-
-  DISALLOW_COPY_AND_ASSIGN(PermissionRequestObserver);
-};
-
 std::vector<std::string> JsonArrayToVectorOfStrings(
     const std::string& json_array) {
   std::unique_ptr<base::Value> value =
@@ -192,9 +156,9 @@
   permissions::PermissionRequestManager::FromWebContents(tab_contents)
       ->set_auto_response_for_test(
           permissions::PermissionRequestManager::ACCEPT_ALL);
-  PermissionRequestObserver permissionRequestObserver(tab_contents);
+  permissions::PermissionRequestObserver observer(tab_contents);
   GetUserMedia(tab_contents, constraints);
-  EXPECT_TRUE(permissionRequestObserver.request_shown());
+  EXPECT_TRUE(observer.request_shown());
   EXPECT_TRUE(content::ExecuteScriptAndExtractString(
       tab_contents->GetMainFrame(), "obtainGetUserMediaResult();", &result));
   return kOkGotStream == result;
@@ -225,9 +189,9 @@
   permissions::PermissionRequestManager::FromWebContents(tab_contents)
       ->set_auto_response_for_test(
           permissions::PermissionRequestManager::DENY_ALL);
-  PermissionRequestObserver permissionRequestObserver(tab_contents);
+  permissions::PermissionRequestObserver observer(tab_contents);
   GetUserMedia(tab_contents, constraints);
-  EXPECT_TRUE(permissionRequestObserver.request_shown());
+  EXPECT_TRUE(observer.request_shown());
   EXPECT_TRUE(content::ExecuteScriptAndExtractString(
       tab_contents->GetMainFrame(), "obtainGetUserMediaResult();", &result));
   EXPECT_EQ(kFailedWithNotAllowedError, result);
@@ -239,9 +203,9 @@
   permissions::PermissionRequestManager::FromWebContents(tab_contents)
       ->set_auto_response_for_test(
           permissions::PermissionRequestManager::DISMISS);
-  PermissionRequestObserver permissionRequestObserver(tab_contents);
+  permissions::PermissionRequestObserver observer(tab_contents);
   GetUserMedia(tab_contents, kAudioVideoCallConstraints);
-  EXPECT_TRUE(permissionRequestObserver.request_shown());
+  EXPECT_TRUE(observer.request_shown());
   // A dismiss should be treated like a deny.
   EXPECT_TRUE(content::ExecuteScriptAndExtractString(
       tab_contents->GetMainFrame(), "obtainGetUserMediaResult();", &result));
@@ -262,9 +226,9 @@
   permissions::PermissionRequestManager::FromWebContents(tab_contents)
       ->set_auto_response_for_test(
           permissions::PermissionRequestManager::DENY_ALL);
-  PermissionRequestObserver permissionRequestObserver(tab_contents);
+  permissions::PermissionRequestObserver observer(tab_contents);
   GetUserMedia(tab_contents, kAudioVideoCallConstraints);
-  EXPECT_FALSE(permissionRequestObserver.request_shown());
+  EXPECT_FALSE(observer.request_shown());
   EXPECT_TRUE(content::ExecuteScriptAndExtractString(
       tab_contents->GetMainFrame(), "obtainGetUserMediaResult();", &result));
   EXPECT_EQ(kOkGotStream, result);
@@ -284,9 +248,9 @@
   permissions::PermissionRequestManager::FromWebContents(tab_contents)
       ->set_auto_response_for_test(
           permissions::PermissionRequestManager::ACCEPT_ALL);
-  PermissionRequestObserver permissionRequestObserver(tab_contents);
+  permissions::PermissionRequestObserver observer(tab_contents);
   GetUserMedia(tab_contents, kAudioVideoCallConstraints);
-  EXPECT_FALSE(permissionRequestObserver.request_shown());
+  EXPECT_FALSE(observer.request_shown());
   EXPECT_TRUE(content::ExecuteScriptAndExtractString(
       tab_contents->GetMainFrame(), "obtainGetUserMediaResult();", &result));
   EXPECT_EQ(kFailedWithNotAllowedError, result);
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter.cc b/chrome/browser/metrics/process_memory_metrics_emitter.cc
index d3db0b1..8d4984d 100644
--- a/chrome/browser/metrics/process_memory_metrics_emitter.cc
+++ b/chrome/browser/metrics/process_memory_metrics_emitter.cc
@@ -757,7 +757,8 @@
 
   if (memory_dump_in_progress_ || get_process_urls_in_progress_)
     return;
-  DCHECK(global_dump_);
+  if (!global_dump_)
+    return;
 
   uint32_t private_footprint_total_kb = 0;
   uint32_t renderer_private_footprint_total_kb = 0;
@@ -908,8 +909,6 @@
     // processes.
     per_tab_metrics.RecordPmfs(GetUkmRecorder());
   }
-
-  global_dump_ = nullptr;
 }
 
 namespace {
diff --git a/chrome/browser/notifications/notification_interactive_uitest_support.cc b/chrome/browser/notifications/notification_interactive_uitest_support.cc
index 6e1b5eb3..6d05f37 100644
--- a/chrome/browser/notifications/notification_interactive_uitest_support.cc
+++ b/chrome/browser/notifications/notification_interactive_uitest_support.cc
@@ -17,50 +17,12 @@
 #include "components/content_settings/core/common/content_settings.h"
 #include "components/permissions/features.h"
 #include "components/permissions/permission_request_manager.h"
+#include "components/permissions/test/permission_request_observer.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/test/browser_test_utils.h"
 #include "ui/message_center/message_center.h"
 #include "ui/message_center/message_center_observer.h"
 
-namespace {
-
-// Used to observe the creation of permission prompt without responding.
-class PermissionRequestObserver
-    : public permissions::PermissionRequestManager::Observer {
- public:
-  explicit PermissionRequestObserver(content::WebContents* web_contents)
-      : request_manager_(permissions::PermissionRequestManager::FromWebContents(
-            web_contents)),
-        request_shown_(false),
-        message_loop_runner_(new content::MessageLoopRunner) {
-    request_manager_->AddObserver(this);
-  }
-  ~PermissionRequestObserver() override {
-    // Safe to remove twice if it happens.
-    request_manager_->RemoveObserver(this);
-  }
-
-  void Wait() { message_loop_runner_->Run(); }
-
-  bool request_shown() { return request_shown_; }
-
- private:
-  // PermissionRequestManager::Observer
-  void OnBubbleAdded() override {
-    request_shown_ = true;
-    request_manager_->RemoveObserver(this);
-    message_loop_runner_->Quit();
-  }
-
-  permissions::PermissionRequestManager* request_manager_;
-  bool request_shown_;
-  scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
-
-  DISALLOW_COPY_AND_ASSIGN(PermissionRequestObserver);
-};
-
-}  // namespace
-
 class MessageCenterChangeObserver::Impl
     : public message_center::MessageCenterObserver {
  public:
@@ -236,7 +198,7 @@
 bool NotificationsTest::RequestPermissionAndWait(Browser* browser) {
   content::WebContents* web_contents = GetActiveWebContents(browser);
   ui_test_utils::NavigateToURL(browser, GetTestPageURL());
-  PermissionRequestObserver observer(web_contents);
+  permissions::PermissionRequestObserver observer(web_contents);
   std::string result;
   EXPECT_TRUE(content::ExecuteScriptAndExtractString(
       web_contents, "requestPermissionAndRespond();", &result));
diff --git a/chrome/browser/permissions/permission_dialog_delegate.cc b/chrome/browser/permissions/permission_dialog_delegate.cc
index b5aa237..1902483 100644
--- a/chrome/browser/permissions/permission_dialog_delegate.cc
+++ b/chrome/browser/permissions/permission_dialog_delegate.cc
@@ -13,9 +13,6 @@
 #include "chrome/android/chrome_jni_headers/PermissionDialogController_jni.h"
 #include "chrome/android/chrome_jni_headers/PermissionDialogDelegate_jni.h"
 #include "chrome/browser/android/resource_mapper.h"
-#include "chrome/browser/android/tab_android.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/chrome_features.h"
 #include "chrome/grit/generated_resources.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
@@ -30,19 +27,19 @@
     PermissionPromptAndroid* permission_prompt) {
   DCHECK(web_contents);
 
-  // If we don't have a tab, just act as though the prompt was dismissed.
-  TabAndroid* tab = TabAndroid::FromWebContents(web_contents);
-  if (!tab) {
+  // If we don't have a window, just act as though the prompt was dismissed.
+  if (!web_contents->GetTopLevelNativeWindow()) {
     permission_prompt->Closing();
     return;
   }
 
   // Dispatch the dialog to Java, which manages the lifetime of this object.
-  new PermissionDialogDelegate(tab, permission_prompt);
+  new PermissionDialogDelegate(web_contents, permission_prompt);
 }
 
-void PermissionDialogDelegate::CreateJavaDelegate(JNIEnv* env,
-                                                  TabAndroid* tab) {
+void PermissionDialogDelegate::CreateJavaDelegate(
+    JNIEnv* env,
+    content::WebContents* web_contents) {
   base::android::ScopedJavaLocalRef<jstring> primaryButtonText =
       ConvertUTF16ToJavaString(env,
                                l10n_util::GetStringUTF16(IDS_PERMISSION_ALLOW));
@@ -57,7 +54,8 @@
   }
 
   j_delegate_.Reset(Java_PermissionDialogDelegate_create(
-      env, reinterpret_cast<uintptr_t>(this), tab->GetJavaObject(),
+      env, reinterpret_cast<uintptr_t>(this),
+      web_contents->GetTopLevelNativeWindow()->GetJavaObject(),
       base::android::ToJavaIntArray(env, content_settings_types),
       ResourceMapper::MapFromChromiumId(permission_prompt_->GetIconId()),
       ConvertUTF16ToJavaString(env, permission_prompt_->GetMessageText()),
@@ -85,16 +83,15 @@
 }
 
 PermissionDialogDelegate::PermissionDialogDelegate(
-    TabAndroid* tab,
+    content::WebContents* web_contents,
     PermissionPromptAndroid* permission_prompt)
-    : content::WebContentsObserver(tab->web_contents()),
+    : content::WebContentsObserver(web_contents),
       permission_prompt_(permission_prompt) {
-  DCHECK(tab);
   DCHECK(permission_prompt_);
 
   // Create our Java counterpart, which manages our lifetime.
   JNIEnv* env = base::android::AttachCurrentThread();
-  CreateJavaDelegate(env, tab);
+  CreateJavaDelegate(env, web_contents);
 
   // Send the Java delegate to the Java PermissionDialogController for display.
   // The controller takes over lifetime management; when the Java delegate is no
diff --git a/chrome/browser/permissions/permission_dialog_delegate.h b/chrome/browser/permissions/permission_dialog_delegate.h
index 869eba7..6f196aa 100644
--- a/chrome/browser/permissions/permission_dialog_delegate.h
+++ b/chrome/browser/permissions/permission_dialog_delegate.h
@@ -10,7 +10,6 @@
 #include "base/android/scoped_java_ref.h"
 #include "base/callback.h"
 #include "base/macros.h"
-#include "chrome/browser/media/webrtc/media_stream_devices_controller.h"
 #include "chrome/browser/permissions/permission_prompt_android.h"
 #include "components/content_settings/core/common/content_settings_types.h"
 #include "components/permissions/permission_util.h"
@@ -21,7 +20,6 @@
 namespace content {
 class WebContents;
 }
-class TabAndroid;
 
 // Delegate class for displaying a permission prompt as a modal dialog. Used as
 // the native to Java interface to allow Java to communicate the user's
@@ -46,12 +44,11 @@
   void Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj);
 
  private:
-  PermissionDialogDelegate(
-      TabAndroid* tab,
-      PermissionPromptAndroid* permission_prompt);
+  PermissionDialogDelegate(content::WebContents* web_contents,
+                           PermissionPromptAndroid* permission_prompt);
   ~PermissionDialogDelegate() override;
 
-  void CreateJavaDelegate(JNIEnv* env, TabAndroid* tab);
+  void CreateJavaDelegate(JNIEnv* env, content::WebContents* web_contents);
 
   // On navigation or page destruction, hide the dialog.
   void DismissDialog();
diff --git a/chrome/browser/policy/extension_policy_browsertest.cc b/chrome/browser/policy/extension_policy_browsertest.cc
index c6d08c1..7ddfd08 100644
--- a/chrome/browser/policy/extension_policy_browsertest.cc
+++ b/chrome/browser/policy/extension_policy_browsertest.cc
@@ -24,8 +24,10 @@
 #include "chrome/browser/policy/profile_policy_connector_builder.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
+#include "chrome/browser/web_applications/components/app_registrar.h"
 #include "chrome/browser/web_applications/components/app_shortcut_manager.h"
 #include "chrome/browser/web_applications/components/web_app_provider_base.h"
+#include "chrome/browser/web_applications/test/web_app_install_observer.h"
 #include "chrome/common/extensions/extension_test_util.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
 #include "chrome/common/web_application_info.h"
@@ -1493,14 +1495,15 @@
 };
 
 IN_PROC_BROWSER_TEST_F(WebAppInstallForceListPolicyTest, StartUpInstallation) {
-  extensions::TestExtensionRegistryObserver observer(extension_registry());
-  const extensions::Extension* installed_extension =
-      observer.WaitForExtensionWillBeInstalled();
-
-  ASSERT_TRUE(installed_extension);
-  const GURL installed_app_url =
-      extensions::AppLaunchInfo::GetFullLaunchURL(installed_extension);
-  EXPECT_EQ(policy_app_url_, installed_app_url);
+  const web_app::AppRegistrar& registrar =
+      web_app::WebAppProviderBase::GetProviderBase(browser()->profile())
+          ->registrar();
+  web_app::WebAppInstallObserver install_observer(browser()->profile());
+  base::Optional<web_app::AppId> app_id =
+      registrar.FindAppWithUrlInScope(policy_app_url_);
+  if (!app_id)
+    app_id = install_observer.AwaitNextInstall();
+  EXPECT_EQ(policy_app_url_, registrar.GetAppLaunchURL(*app_id));
 }
 
 // Fixture for tests that have two profiles with a different policy for each.
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
index 5f88f93..15d4d42 100644
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -343,12 +343,6 @@
      */
     public static final String FLAGS_CACHED_NIGHT_MODE_CCT_AVAILABLE = "night_mode_cct_available";
     /**
-     * Whether or not night mode should set "light" as the default option.
-     * Default value is false.
-     */
-    public static final String FLAGS_CACHED_NIGHT_MODE_DEFAULT_TO_LIGHT =
-            "night_mode_default_to_light";
-    /**
      * Whether the Paint Preview Capture menu item is enabled.
      * Default value is false.
      */
@@ -744,6 +738,7 @@
                 "home_page_button_force_enabled",
                 "homepage_tile_enabled",
                 "inflate_toolbar_on_background_thread",
+                "night_mode_default_to_light",
                 "ntp_button_enabled",
                 "ntp_button_variant",
                 "physical_web",
@@ -841,7 +836,6 @@
                 FLAGS_CACHED_NETWORK_SERVICE_WARM_UP_ENABLED,
                 FLAGS_CACHED_NIGHT_MODE_AVAILABLE,
                 FLAGS_CACHED_NIGHT_MODE_CCT_AVAILABLE,
-                FLAGS_CACHED_NIGHT_MODE_DEFAULT_TO_LIGHT,
                 FLAGS_CACHED_PRIORITIZE_BOOTSTRAP_TASKS,
                 FLAGS_CACHED_SERVICE_MANAGER_FOR_BACKGROUND_PREFETCH,
                 FLAGS_CACHED_SERVICE_MANAGER_FOR_DOWNLOAD_RESUMPTION,
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index 55fbf20..15ad304 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -715,10 +715,19 @@
                               std::make_unique<PrefsInternalsSource>(this));
 
   if (delegate_) {
-    TRACE_EVENT0("browser", "ProfileImpl::DoFileInit:DelegateOnProfileCreated")
-    delegate_->OnProfileCreated(this, true, IsNewProfile());
+    TRACE_EVENT0("browser", "ProfileImpl::DoFileInit:DelegateOnProfileCreated");
+    // Fails if the browser is shutting down. This is done to avoid
+    // launching new UI, finalising profile creation, etc. which
+    // would trigger a crash down the line. See ...
+    const bool shutting_down = g_browser_process->IsShuttingDown();
+    delegate_->OnProfileCreated(this, !shutting_down, IsNewProfile());
+    // The current Profile may be immediately deleted as part of
+    // the call to OnProfileCreated(...) if the initialisation is
+    // reported as a failure, thus no code should be executed past
+    // that point.
+    if (shutting_down)
+      return;
   }
-
   // Ensure that the SharingService is initialized now that io_data_ is
   // initialized. https://crbug.com/171406
   SharingServiceFactory::GetForBrowserContext(this);
diff --git a/chrome/browser/resources/chromeos/login/enterprise_enrollment.html b/chrome/browser/resources/chromeos/login/enterprise_enrollment.html
index ef66abb..a19ad9e 100644
--- a/chrome/browser/resources/chromeos/login/enterprise_enrollment.html
+++ b/chrome/browser/resources/chromeos/login/enterprise_enrollment.html
@@ -134,17 +134,17 @@
           <hd-iron-icon slot="oobe-icon"
               icon1x="oobe-32:enterprise" icon2x="oobe-64:enterprise">
           </hd-iron-icon>
-          <div slot="footer" class="flex layout vertical center end-justified">
-            <!-- Hide the subtitle if the domain could not be determined. -->
-            <div hidden="[[isEmpty_(enrolledDomain_)]]" class="self-start">
-                <html-echo content=
-                    "[[successText_(locale, deviceName_, enrolledDomain_)]]">
-                </html-echo>
-                <!-- Attestation-based enrollment happens automatically and may
-                      not be wanted by the user. Simple warning. -->
-                <div hidden="[[!isAutoEnroll_]]"
-                    >[[i18nDynamic(locale, 'oauthEnrollAbeSuccessSupport')]]</div>
+          <!-- Hide the subtitle if the domain could not be determined. -->
+          <div hidden="[[isEmpty_(enrolledDomain_)]]" class="self-start"
+              slot="subtitle">
+            <div>[[successText_(locale, deviceName_, enrolledDomain_)]]</div>
+            <!-- Attestation-based enrollment happens automatically and may
+                 not be wanted by the user. Simple warning. -->
+            <div hidden="[[!isAutoEnroll_]]"
+               >[[i18nDynamic(locale, 'oauthEnrollAbeSuccessSupport')]]
             </div>
+          </div>
+          <div slot="footer" class="flex layout vertical center end-justified">
             <img srcset="images/enrollment_success_illustration_1x.png 1x,
                     images/enrollment_success_illustration_2x.png 2x"
                  i18n-values="alt:enrollmentSuccessIllustrationTitle"
diff --git a/chrome/browser/resources/chromeos/login/oobe_buttons.html b/chrome/browser/resources/chromeos/login/oobe_buttons.html
index 00d58c9..395b4034 100644
--- a/chrome/browser/resources/chromeos/login/oobe_buttons.html
+++ b/chrome/browser/resources/chromeos/login/oobe_buttons.html
@@ -66,7 +66,7 @@
       <div id="container"
           class="flex layout horizontal center center-justified self-stretch">
         <slot name="text">
-          <div>[[i18nDynamic(locale, textKey)]]</div>
+          <div class="fallback">[[i18nDynamic(locale, textKey)]]</div>
         </slot>
       </div>
     </cr-button>
@@ -113,7 +113,7 @@
             icon2x="oobe-buttons-40:arrow-forward">
         </hd-iron-icon>
         <slot name="text">
-          <div>[[i18nDynamic(locale, textKey)]]</div>
+          <div class="fallback">[[i18nDynamic(locale, textKey)]]</div>
         </slot>
       </div>
     </cr-button>
@@ -132,7 +132,7 @@
         aria-label$="[[labelForAria_]]" class="action-button">
       <div class="flex horizontal layout start center">
         <slot name="text">
-          <div>[[i18nDynamic(locale, textKey)]]</div>
+          <div class="fallback">[[i18nDynamic(locale, textKey)]]</div>
         </slot>
         <hd-iron-icon
             icon1x="oobe-buttons-20:arrow-forward"
@@ -179,7 +179,7 @@
               class="oobe-icon" hidden>
           </hd-iron-icon>
           <slot name="text">
-            <div>[[i18nDynamic(locale, textKey)]]</div>
+            <div class="fallback">[[i18nDynamic(locale, textKey)]]</div>
           </slot>
         </div>
       </div>
diff --git a/chrome/browser/resources/chromeos/login/oobe_dialog.css b/chrome/browser/resources/chromeos/login/oobe_dialog.css
index b04097f..f02213c 100644
--- a/chrome/browser/resources/chromeos/login/oobe_dialog.css
+++ b/chrome/browser/resources/chromeos/login/oobe_dialog.css
@@ -35,7 +35,11 @@
   padding-top: 20px;
 }
 
-#oobe-title ::slotted(h1) {
+/*
+ * TODO(https://crbug.com/703984): remove the fallback class when fixed.
+ */
+#oobe-title ::slotted(h1),
+#oobe-title .fallback {
   color: var(--oobe-header-text-color);
   @apply --oobe-header-font;
   margin: 0;
@@ -45,7 +49,11 @@
   padding-top: 8px;
 }
 
-#oobe-subtitle ::slotted(*) {
+/*
+ * TODO(https://crbug.com/703984): remove the fallback class when fixed.
+ */
+#oobe-subtitle ::slotted(*),
+#oobe-subtitle .fallback {
   color: var(--oobe-subheader-text-color);
   line-height: var(--subtitle-line-height);
   margin: 0;
diff --git a/chrome/browser/resources/chromeos/login/oobe_dialog.html b/chrome/browser/resources/chromeos/login/oobe_dialog.html
index 8651255..e0e5112 100644
--- a/chrome/browser/resources/chromeos/login/oobe_dialog.html
+++ b/chrome/browser/resources/chromeos/login/oobe_dialog.html
@@ -83,12 +83,12 @@
         <div id="oobe-title" class="slot-container layout vertical
             end-justified">
           <slot name="title">
-            <h1>[[i18nDynamic(locale, titleKey)]]</h1>
+            <h1 class="fallback">[[i18nDynamic(locale, titleKey)]]</h1>
           </slot>
         </div>
         <div id="oobe-subtitle" class="slot-container layout vertical">
           <slot name="subtitle">
-            <div>[[i18nDynamic(locale, subtitleKey)]]</div>
+            <div class="fallback">[[i18nDynamic(locale, subtitleKey)]]</div>
           </slot>
         </div>
         <div id="oobe-progress" class="slot-container layout vertical">
diff --git a/chrome/browser/resources/chromeos/login/oobe_help_dialog.css b/chrome/browser/resources/chromeos/login/oobe_help_dialog.css
index 4bec595..cc995df7 100644
--- a/chrome/browser/resources/chromeos/login/oobe_help_dialog.css
+++ b/chrome/browser/resources/chromeos/login/oobe_help_dialog.css
@@ -14,7 +14,8 @@
   width: 512px;
 }
 
-#help-dialog-title ::slotted(h1) {
+#help-dialog-title ::slotted(h1),
+#help-dialog-title .fallback {
   color: var(--oobe-header-text-color);
   @apply --oobe-help-dialog-header-font;
   margin: 0;
diff --git a/chrome/browser/resources/chromeos/login/oobe_help_dialog.html b/chrome/browser/resources/chromeos/login/oobe_help_dialog.html
index 775dfec..f37107f 100644
--- a/chrome/browser/resources/chromeos/login/oobe_help_dialog.html
+++ b/chrome/browser/resources/chromeos/login/oobe_help_dialog.html
@@ -27,7 +27,7 @@
       <!-- Title -->
       <div id="help-dialog-title">
         <slot name="title">
-            <h1>[[i18nDynamic(locale, titleKey)]]</h1>
+            <h1 class="fallback">[[i18nDynamic(locale, titleKey)]]</h1>
         </slot>
       </div>
       <!-- Content to be shown -->
diff --git a/chrome/browser/resources/chromeos/login/oobe_text_buttons.css b/chrome/browser/resources/chromeos/login/oobe_text_buttons.css
index 28e91ef..104f61b 100644
--- a/chrome/browser/resources/chromeos/login/oobe_text_buttons.css
+++ b/chrome/browser/resources/chromeos/login/oobe_text_buttons.css
@@ -6,11 +6,11 @@
   margin: 0 4px; /* So that two adjacent buttons are 8px separated. */
 }
 
-/* Default slot data is not selected by ::slotted() selector, see
- * https://crbug.com/703984.
+/*
+ * TODO(https://crbug.com/703984): remove the fallback class when fixed.
  */
 :host ::slotted(*),
-#text {
+.fallback {
   font-family: var(--oobe-button-font-family);
   font-size: 12px;
 }
diff --git a/chrome/browser/resources/settings/autofill_page/BUILD.gn b/chrome/browser/resources/settings/autofill_page/BUILD.gn
index c28f9d96..8f0eb9d4 100644
--- a/chrome/browser/resources/settings/autofill_page/BUILD.gn
+++ b/chrome/browser/resources/settings/autofill_page/BUILD.gn
@@ -129,7 +129,10 @@
     "//ui/webui/resources/js:web_ui_listener_behavior",
     "//ui/webui/resources/js/cr/ui:focus_without_ink",
   ]
-  externs_list = [ "$externs_path/passwords_private.js" ]
+  externs_list = [
+    "$externs_path/passwords_private.js",
+    "$externs_path/quick_unlock_private.js",
+  ]
 }
 
 js_library("password_edit_dialog") {
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_section.html b/chrome/browser/resources/settings/autofill_page/passwords_section.html
index 891b287..4c3cb60 100644
--- a/chrome/browser/resources/settings/autofill_page/passwords_section.html
+++ b/chrome/browser/resources/settings/autofill_page/passwords_section.html
@@ -183,7 +183,7 @@
     </template>
 <if expr="chromeos">
     <template is="dom-if" if="[[showPasswordPromptDialog_]]" restamp>
-      <settings-password-prompt-dialog auth-token="{{authToken_}}"
+      <settings-password-prompt-dialog on-token-obtained="onTokenObtained_"
           on-close="onPasswordPromptClosed_">
       </settings-password-prompt-dialog>
     </template>
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_section.js b/chrome/browser/resources/settings/autofill_page/passwords_section.js
index 081387b..771136ba 100644
--- a/chrome/browser/resources/settings/autofill_page/passwords_section.js
+++ b/chrome/browser/resources/settings/autofill_page/passwords_section.js
@@ -140,16 +140,6 @@
     listBlurred_: Boolean,
 
     // <if expr="chromeos">
-    /**
-     * Auth token for retrieving passwords if required by OS.
-     * @private
-     */
-    authToken_: {
-      type: String,
-      value: '',
-      observer: 'onAuthTokenChanged_',
-    },
-
     /** @private */
     showPasswordPromptDialog_: Boolean,
 
@@ -309,24 +299,23 @@
 
   // <if expr="chromeos">
   /**
-   * When |authToken_| changes to a new non-empty value, it means that the
-   * password-prompt-dialog succeeded in creating a fresh token in the
-   * quickUnlockPrivate API. Because new tokens can only ever be created
-   * immediately following a GAIA password check, the passwordsPrivate API can
-   * now safely grant requests for secure data (i.e. saved passwords) for a
-   * limited time. This observer resolves the request, triggering a callback
-   * that requires a fresh auth token to succeed and that was provided to the
-   * BlockingRequestManager by another DOM element seeking secure data.
+   * When this event fired, it means that the password-prompt-dialog succeeded
+   * in creating a fresh token in the quickUnlockPrivate API. Because new tokens
+   * can only ever be created immediately following a GAIA password check, the
+   * passwordsPrivate API can now safely grant requests for secure data (i.e.
+   * saved passwords) for a limited time. This observer resolves the request,
+   * triggering a callback that requires a fresh auth token to succeed and that
+   * was provided to the BlockingRequestManager by another DOM element seeking
+   * secure data.
    *
-   * @param {string} newToken The newly created auth token. Note that its
-   *     precise value is not relevant here, only the facts that it changed and
-   *     that it is non-empty (i.e. not expired).
+   * @param {!CustomEvent<!chrome.quickUnlockPrivate.TokenInfo>} e - Contains
+   *     newly created auth token. Note that its precise value is not relevant
+   *     here, only the facts that it's created.
    * @private
    */
-  onAuthTokenChanged_(newToken) {
-    if (newToken) {
-      this.tokenRequestManager_.resolve();
-    }
+  onTokenObtained_(e) {
+    assert(e.detail);
+    this.tokenRequestManager_.resolve();
   },
 
   onPasswordPromptClosed_() {
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.html
index 7f98a7eb..cc1edae 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.html
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.html
@@ -122,7 +122,7 @@
     </settings-animated-pages>
     <template is="dom-if" if="[[showPasswordPromptDialog_]]" restamp>
       <settings-password-prompt-dialog id="multidevicePasswordPrompt"
-          auth-token="{{authToken_}}">
+          on-token-obtained="onTokenObtained_">
       </settings-password-prompt-dialog>
     </template>
   </template>
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.js
index 54bc233..a63ea1a 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.js
@@ -36,11 +36,10 @@
 
     /**
      * Authentication token provided by password-prompt-dialog.
-     * @private {string}
+     * @private {!chrome.quickUnlockPrivate.TokenInfo|undefined}
      */
     authToken_: {
-      type: String,
-      value: '',
+      type: Object,
     },
 
     /**
@@ -264,13 +263,13 @@
     if (this.authToken_) {
       this.browserProxy_.setFeatureEnabledState(
           this.featureToBeEnabledOnceAuthenticated_, true /* enabled */,
-          this.authToken_);
+          this.authToken_.token);
       settings.recordSettingChange();
 
       // Reset |this.authToken_| now that it has been used. This ensures that
       // users cannot keep an old auth token and reuse it on an subsequent
       // request.
-      this.authToken_ = '';
+      this.authToken_ = undefined;
     }
 
     // Either the feature was enabled above or the user canceled the request by
@@ -381,4 +380,12 @@
     this.pageContentData = newData;
     this.leaveNestedPageIfNoHostIsSet_();
   },
+
+  /**
+   * @param {!CustomEvent<!chrome.quickUnlockPrivate.TokenInfo>} e
+   * @private
+   */
+  onTokenObtained_(e) {
+    this.authToken_ = e.detail;
+  },
 });
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.html
index e44e8f5..7701042 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.html
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.html
@@ -58,7 +58,8 @@
     </iron-collapse>
     <template is="dom-if" if="[[showPasswordPromptDialog_]]" restamp>
       <settings-password-prompt-dialog id="smartLockSignInPasswordPrompt"
-          on-close="onEnableSignInDialogClose_" auth-token="{{authToken_}}">
+          on-close="onEnableSignInDialogClose_"
+          on-token-obtained="onTokenObtained_">
       </settings-password-prompt-dialog>
     </template>
   </template>
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.js
index 83cec76..3727acd 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.js
@@ -69,11 +69,10 @@
 
     /**
      * Authentication token provided by password-prompt-dialog.
-     * @private {string}
+     * @private {!chrome.quickUnlockPrivate.TokenInfo|undefined}
      */
     authToken_: {
-      type: String,
-      value: '',
+      type: Object,
     },
   },
 
@@ -169,13 +168,22 @@
     // If |this.authToken_| is set when the dialog has been closed, this means
     // that the user entered the correct password into the dialog when
     // attempting to enable SignIn with Smart Lock.
-    if (this.authToken_ !== '') {
+    if (this.authToken_) {
       this.browserProxy_.setSmartLockSignInEnabled(
-          true /* enabled */, this.authToken_);
+          true /* enabled */, this.authToken_.token);
       settings.recordSettingChange();
     }
 
     // Always require password entry if re-enabling SignIn with Smart Lock.
-    this.authToken_ = '';
+    this.authToken_ = undefined;
   },
+
+  /**
+   * @param {!CustomEvent<!chrome.quickUnlockPrivate.TokenInfo>} e
+   * @private
+   */
+  onTokenObtained_(e) {
+    this.authToken_ = e.detail;
+  },
+
 });
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js b/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js
index b829562..48fac34 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js
@@ -84,6 +84,7 @@
       if (this.browserProxy_) {
         this.browserProxy_.endCurrentAuthentication();
       }
+      this.showSetupFingerprintDialog_ = false;
     } else if (oldRoute == settings.routes.LOCK_SCREEN) {
       // Start fingerprint authentication when going from LOCK_SCREEN to
       // FINGERPRINT page.
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.html b/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.html
index 79357b1..3a0dbc6 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.html
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.html
@@ -155,7 +155,7 @@
           </div>
           <div class="separator"></div>
           <div class="secondary-action">
-            <cr-button on-click="onEditFingerprints_"
+            <cr-button id="editFingerprints" on-click="onEditFingerprints_"
                 aria-label="$i18n{lockScreenEditFingerprints}"
                 aria-descibedby="lockScreenEditFingerprintsSecondary">
               $i18n{lockScreenSetupFingerprintButton}
@@ -167,8 +167,8 @@
       <template is="dom-if" if="[[showPasswordPromptDialog_]]" restamp>
         <settings-lock-screen-password-prompt-dialog
             id="lockScreenPasswordPrompt"
-            on-close="onPasswordPromptDialogClose_" set-modes="{{setModes_}}"
-            auth-token="{{authToken}}">
+            on-close="onPasswordPromptDialogClose_"
+            on-auth-token-obtained="onAuthTokenObtained_">
         </settings-lock-screen-password-prompt-dialog>
       </template>
 
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js b/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js
index 46dd54c0..27d41b3 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js
@@ -41,11 +41,12 @@
 
     /**
      * Authentication token provided by lock-screen-password-prompt-dialog.
+     * @type {!chrome.quickUnlockPrivate.TokenInfo|undefined}
      */
     authToken: {
-      type: String,
-      value: '',
+      type: Object,
       notify: true,
+      observer: 'onAuthTokenChanged_',
     },
 
     /**
@@ -131,7 +132,10 @@
     },
 
     /** @private */
-    showPasswordPromptDialog_: Boolean,
+    showPasswordPromptDialog_: {
+      type: Boolean,
+      value: false,
+    },
 
     /** @private */
     showSetupPinDialog_: Boolean,
@@ -169,13 +173,6 @@
 
     if (this.shouldAskForPassword_(newRoute)) {
       this.openPasswordPromptDialog_();
-    } else if (
-        newRoute != settings.routes.FINGERPRINT &&
-        oldRoute != settings.routes.FINGERPRINT) {
-      // If the user navigated away from the lock screen settings page they will
-      // have to re-enter their password. An exception is if they are navigating
-      // to or from the fingerprint subpage.
-      this.setModes_ = undefined;
     }
   },
 
@@ -190,7 +187,7 @@
       target.checked = !target.checked;
       return;
     }
-    this.setLockScreenEnabled(this.authToken, target.checked);
+    this.setLockScreenEnabled(this.authToken.token, target.checked);
   },
 
   /**
@@ -215,6 +212,8 @@
 
   /** @private */
   onSetModesChanged_() {
+    this.maybeReturnToLockPage_();
+
     if (this.shouldAskForPassword_(
             settings.Router.getInstance().getCurrentRoute())) {
       this.showSetupPinDialog_ = false;
@@ -223,6 +222,14 @@
   },
 
   /** @private */
+  maybeReturnToLockPage_() {
+    const route = settings.Router.getInstance().getCurrentRoute();
+    if (route == settings.routes.FINGERPRINT && !this.setModes_) {
+      settings.Router.getInstance().navigateTo(settings.routes.LOCK_SCREEN);
+    }
+  },
+
+  /** @private */
   openPasswordPromptDialog_() {
     this.showPasswordPromptDialog_ = true;
   },
@@ -321,4 +328,32 @@
     }
     return this.i18n('lockScreenOptionsLock');
   },
+
+  /**
+   * @param {!CustomEvent<!chrome.quickUnlockPrivate.TokenInfo>} e
+   * @private
+   * */
+  onAuthTokenObtained_(e) {
+    this.authToken = e.detail;
+  },
+
+  /** @private */
+  onAuthTokenChanged_() {
+    if (this.authToken === undefined) {
+      this.setModes_ = undefined;
+      return;
+    }
+    this.setModes_ = (modes, credentials, onComplete) => {
+      this.quickUnlockPrivate.setModes(
+          this.authToken.token, modes, credentials, () => {
+            let result = true;
+            if (chrome.runtime.lastError) {
+              console.error(
+                  'setModes failed: ' + chrome.runtime.lastError.message);
+              result = false;
+            }
+            onComplete(result);
+          });
+    };
+  },
 });
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen_password_prompt_dialog.html b/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen_password_prompt_dialog.html
index 19eef054..8108d3f 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen_password_prompt_dialog.html
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen_password_prompt_dialog.html
@@ -9,7 +9,7 @@
     <settings-password-prompt-dialog
         id="passwordPrompt"
         password-prompt-text="[[selectPasswordPromptEnterPasswordString_(hasPinLogin)]]"
-        auth-token="{{authToken}}">
+        on-token-obtained="onTokenObtained_">
     </settings-password-prompt-dialog>
   </template>
   <script src="lock_screen_password_prompt_dialog.js"></script>
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen_password_prompt_dialog.js b/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen_password_prompt_dialog.js
index b4382c85..8d3292d1 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen_password_prompt_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen_password_prompt_dialog.js
@@ -6,18 +6,14 @@
  * @fileoverview
  *
  * 'settings-lock-screen-password-prompt-dialog' displays a password prompt to
- * the user. Clients can determine if the user has authenticated if either the
- * |authToken| string or |setModes| closure are present.
- *
- * The setModes binding is a wrapper around chrome.quickUnlockPrivate.setModes
- * which has a prebound account password. The account password by itself is not
- * available for other elements to access.
+ * the user. If the user has authenticated the element fires
+ * 'auth-token-obtained' event with |chrome.quickUnlockPrivate.TokenInfo|
+ * object.
  *
  * Example:
  *
  * <settings-lock-screen-password-prompt-dialog
  *   id="lockScreenPasswordPrompt"
- *   set-modes="[[setModes]]">
  * </settings-lock-screen-password-prompt-dialog>
  */
 
@@ -33,29 +29,6 @@
 
   properties: {
     /**
-     * Authentication token returned by quickUnlockPrivate.getAuthToken. Should
-     * be passed to API calls which require authentication.
-     * @type {string}
-     */
-    authToken: {
-      type: String,
-      notify: true,
-      observer: 'authTokenChanged_',
-    },
-
-    /**
-     * A wrapper around chrome.quickUnlockPrivate.setModes with the account
-     * password already supplied. If this is null, the authentication screen
-     * needs to be redisplayed. This property will be cleared after the timeout
-     * returned by quickUnlockPrivate.getAuthToken.
-     * @type {?Function}
-     */
-    setModes: {
-      type: Object,
-      notify: true,
-    },
-
-    /**
      * writeUma_ is a function that handles writing uma stats. It may be
      * overridden for tests.
      *
@@ -76,32 +49,13 @@
   },
 
   /**
-   * Called when the authToken changes. If the authToken is valid, that
-   * indicates the user authenticated successfully.
-   * @param {String} authToken
+   * @param {!CustomEvent<!chrome.quickUnlockPrivate.TokenInfo>} e
    * @private
    */
-  authTokenChanged_(authToken) {
-    if (!this.authToken) {
-      this.setModes = null;
-      return;
-    }
-
+  onTokenObtained_(e) {
     // The user successfully authenticated.
     this.writeUma_(LockScreenProgress.ENTER_PASSWORD_CORRECTLY);
-
-    this.setModes = (modes, credentials, onComplete) => {
-      this.quickUnlockPrivate.setModes(
-          this.authToken, modes, credentials, () => {
-            let result = true;
-            if (chrome.runtime.lastError) {
-              console.error(
-                  'setModes failed: ' + chrome.runtime.lastError.message);
-              result = false;
-            }
-            onComplete(result);
-          });
-    };
+    this.fire('auth-token-obtained', e.detail);
   },
 
   /**
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.js b/chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.js
index 3ea4fbd..fa58641 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.js
@@ -103,7 +103,13 @@
     });
   },
 
-  /** Sets the lock screen enabled state. */
+  /**
+   * Sets the lock screen enabled state.
+   * @param {string} authToken The token returned by
+   *                           QuickUnlockPrivate.getAuthToken
+   * @param {boolean} enabled
+   * @see quickUnlockPrivate.setLockScreenEnabled
+   */
   setLockScreenEnabled(authToken, enabled) {
     this.quickUnlockPrivate.setLockScreenEnabled(authToken, enabled);
   },
@@ -120,4 +126,4 @@
 
 /** @polymerBehavior */
 const LockStateBehavior =
-    [I18nBehavior, WebUIListenerBehavior, LockStateBehaviorImpl];
\ No newline at end of file
+    [I18nBehavior, WebUIListenerBehavior, LockStateBehaviorImpl];
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.html b/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.html
index 401cac7..2054d5c 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.html
@@ -185,7 +185,7 @@
         <settings-subpage
             page-title="[[selectLockScreenTitleString(hasPinLogin)]]"
             associated-control="[[$$('#lock-screen-subpage-trigger')]]">
-          <settings-lock-screen
+          <settings-lock-screen id="lock-screen"
               prefs="{{prefs}}" auth-token="{{authToken_}}">
           </settings-lock-screen>
         </settings-subpage>
@@ -193,7 +193,8 @@
       <template is="dom-if" if="[[fingerprintUnlockEnabled_]]">
         <template is="dom-if" route-path="/lockScreen/fingerprint" no-search>
           <settings-subpage page-title="$i18n{lockScreenFingerprintTitle}">
-            <settings-fingerprint-list auth-token="[[authToken_]]">
+            <settings-fingerprint-list id="fingerprint-list"
+                auth-token="[[authToken_.token]]">
             </settings-fingerprint-list>
           </settings-subpage>
         </template>
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js b/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js
index 9a902fe..1c13efa 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js
@@ -47,11 +47,11 @@
 
     /**
      * Authentication token provided by settings-lock-screen.
-     * @private
+     * @private {!chrome.quickUnlockPrivate.TokenInfo|undefined}
      */
     authToken_: {
-      type: String,
-      value: '',
+      type: Object,
+      observer: 'onAuthTokenChanged_',
     },
 
     /**
@@ -369,4 +369,32 @@
     }
     return this.i18n('lockScreenTitleLock');
   },
+
+  /**
+   * The timeout ID to pass to clearTimeout() to cancel auth token
+   * invalidation.
+   * @private {number|undefined}
+   */
+  clearAccountPasswordTimeoutId_: undefined,
+
+  /** @private */
+  onAuthTokenChanged_() {
+    if (this.clearAuthTokenTimeoutId_) {
+      clearTimeout(this.clearAccountPasswordTimeoutId_);
+    }
+    if (this.authToken_ === undefined) {
+      return;
+    }
+    // Clear |this.authToken_| after
+    // |this.authToken_.tokenInfo.lifetimeSeconds|.
+    // Subtract time from the expiration time to account for IPC delays.
+    // Treat values less than the minimum as 0 for testing.
+    const IPC_SECONDS = 2;
+    const lifetimeMs = this.authToken_.lifetimeSeconds > IPC_SECONDS ?
+        (this.authToken_.lifetimeSeconds - IPC_SECONDS) * 1000 :
+        0;
+    this.clearAccountPasswordTimeoutId_ = setTimeout(() => {
+      this.authToken_ = undefined;
+    }, lifetimeMs);
+  },
 });
diff --git a/chrome/browser/resources/settings/controls/password_prompt_dialog.js b/chrome/browser/resources/settings/controls/password_prompt_dialog.js
index 9182b1f2..872cb3d 100644
--- a/chrome/browser/resources/settings/controls/password_prompt_dialog.js
+++ b/chrome/browser/resources/settings/controls/password_prompt_dialog.js
@@ -35,16 +35,6 @@
     },
 
     /**
-     * Authentication token returned by quickUnlockPrivate.getAuthToken().
-     * Should be passed to API calls which require authentication.
-     * @type {string}
-     */
-    authToken: {
-      type: String,
-      notify: true,
-    },
-
-    /**
      * @private {string}
      */
     inputValue_: {
@@ -101,19 +91,11 @@
   },
 
   /**
-   * The timeout ID to pass to clearTimeout() to cancel auth token
-   * invalidation.
-   * @private {number|undefined}
-   */
-  clearAccountPasswordTimeoutId_: undefined,
-
-  /**
    * Run the account password check.
    * @private
    */
   submitPassword_() {
     this.waitingForPasswordCheck_ = true;
-    clearTimeout(this.clearAccountPasswordTimeoutId_);
 
     const password = this.passwordInput.value;
     // The user might have started entering a password and then deleted it all.
@@ -133,20 +115,9 @@
         return;
       }
 
-      this.authToken = tokenInfo.token;
+      this.fire('token-obtained', tokenInfo);
       this.passwordInvalid_ = false;
 
-      // Clear |this.authToken| after tokenInfo.lifetimeSeconds.
-      // Subtract time from the expiration time to account for IPC delays.
-      // Treat values less than the minimum as 0 for testing.
-      const IPC_SECONDS = 2;
-      const lifetimeMs = tokenInfo.lifetimeSeconds > IPC_SECONDS ?
-          (tokenInfo.lifetimeSeconds - IPC_SECONDS) * 1000 :
-          0;
-      this.clearAccountPasswordTimeoutId_ = setTimeout(() => {
-        this.authToken = '';
-      }, lifetimeMs);
-
       if (this.$.dialog.open) {
         this.$.dialog.close();
       }
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd
index f79129c..9f3aedc 100644
--- a/chrome/browser/resources/settings/settings_resources.grd
+++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -898,6 +898,13 @@
                  file="metrics_browser_proxy.js"
                  type="chrome_html"
                  preprocess="true" />
+      <structure name="IDR_SETTINGS_RECENT_SITE_PERMISSIONS_HTML"
+                 file="site_settings_page/recent_site_permissions.html"
+                 type="chrome_html" />
+      <structure name="IDR_SETTINGS_RECENT_SITE_PERMISSIONS_JS"
+                 file="site_settings_page/recent_site_permissions.js"
+                 preprocess="true"
+                 type="chrome_html" />
       <structure name="IDR_SETTINGS_ROUTE_HTML"
                  file="route.html"
                  type="chrome_html" />
diff --git a/chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.js b/chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.js
index 75f5e92..c4d128e 100644
--- a/chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.js
+++ b/chrome/browser/resources/settings/site_settings/site_settings_prefs_browser_proxy.js
@@ -89,10 +89,10 @@
 /**
  * Represents a list of exceptions recently configured for a site, where recent
  * is defined by the maximum number of sources parameter passed to
- * GetRecentSiterPermissions.
- * @typedef {{origin: string,
+ * GetRecentSitePermissions.
+ * @typedef {{origin: !string,
  *            incognito: boolean,
- *            recentPermissions: Array<RawSiteException>}}
+ *            recentPermissions: !Array<!RawSiteException>}}
  */
 let RecentSitePermissions;
 
diff --git a/chrome/browser/resources/settings/site_settings_page/BUILD.gn b/chrome/browser/resources/settings/site_settings_page/BUILD.gn
index f4c26bb..fd26e1fd 100644
--- a/chrome/browser/resources/settings/site_settings_page/BUILD.gn
+++ b/chrome/browser/resources/settings/site_settings_page/BUILD.gn
@@ -5,11 +5,26 @@
 import("//third_party/closure_compiler/compile_js.gni")
 
 js_type_check("closure_compile") {
-  deps = [ ":site_settings_page" ]
+  deps = [
+    ":recent_site_permissions",
+    ":site_settings_page",
+  ]
+}
+
+js_library("recent_site_permissions") {
+  deps = [
+    "../people_page:sync_browser_proxy",
+    "../prefs:prefs_behavior",
+    "../site_settings:site_settings_behavior",
+    "//ui/webui/resources/js:i18n_behavior",
+    "//ui/webui/resources/js:load_time_data",
+    "//ui/webui/resources/js:web_ui_listener_behavior",
+  ]
 }
 
 js_library("site_settings_page") {
   deps = [
+    ":recent_site_permissions",
     "..:metrics_browser_proxy",
     "..:route",
     "..:router",
diff --git a/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.html b/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.html
new file mode 100644
index 0000000..6fc8ae3
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.html
@@ -0,0 +1,99 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="chrome://resources/cr_elements/policy/cr_tooltip_icon.html">
+<link rel="import" href="chrome://resources/html/i18n_behavior.html">
+<link rel="import" href="chrome://resources/html/load_time_data.html">
+<link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-tooltip/paper-tooltip.html">
+<link rel="import" href="../site_settings/site_settings_behavior.html">
+<link rel="import" href="../settings_shared_css.html">
+
+<dom-module id="settings-recent-site-permissions">
+  <template>
+    <style include="settings-shared">
+      paper-tooltip {
+        --paper-tooltip: var(--cr-tooltip);
+      }
+
+      site-favicon {
+        /** Pad the difference between --cr-link-row-icon-width and
+            site-favicon width to align with link rows */
+        padding-inline-end: 24px;
+      }
+
+      .row-aligned {
+        display: flex;
+        flex-direction: row;
+      }
+
+      .link-button {
+        flex: auto;
+        padding-bottom: var(--cr-section-vertical-padding);
+        padding-top: var(--cr-section-vertical-padding);
+      }
+
+      .link-button[disabled] {
+        cursor: auto;
+        pointer-events: none;
+      }
+
+      .incognito-icon {
+        cursor: auto;
+        pointer-events: auto;
+      }
+
+      .display-name {
+        flex: 1;
+        max-width: 100%;
+      }
+    </style>
+    <div id="noPermissionsText" class="list-frame"
+        hidden$="[[!noRecentPermissions]]">
+      <div class="list-item secondary">$i18n{noRecentPermissions}</div>
+    </div>
+    <template is="dom-repeat" id="recentPermissionsList"
+        items="[[recentSitePermissionsList_]]">
+      <div class$="settings-box [[getClassForIndex_(index)]]">
+        <div class="start row-aligned link-button"
+            on-click="onRecentSitePermissionClick_" actionable
+            disabled$="[[item.incognito]]">
+          <site-favicon url="[[item.origin]]"></site-favicon>
+          <div id="displayName_[[index]]" class="display-name">
+            <div class="site-representation">
+              <span class="url-directionality">[[getDisplayName_(item)]]</span>
+              <span class="secondary"
+                  hidden$="[[!getSiteScheme_(item)]]">
+              &nbsp;$i18nPolymer{siteSettingsSiteRepresentationSeparator}&nbsp;
+              </span>
+              <span class="secondary"
+                  hidden$="[[!getSiteScheme_(item)]]">
+                [[getSiteScheme_(item)]]
+              </span>
+            </div>
+            <div class="second-line secondary">
+                [[getPermissionsText_(item)]]
+            </div>
+          </div>
+          <cr-icon-button class="subpage-arrow"
+              hidden$="[[item.incognito]]"
+              aria-label$="[[getDisplayName_(item)]]"
+              aria-describedby$="displayName_[[index]]"
+              focus-row-control focus-type="show-detail"></cr-icon-button>
+          <cr-tooltip-icon class="incognito-icon"
+              hidden$="[[!item.incognito]]"
+              disabled$="[[item.incognito]]"
+              icon-aria-label="$i18n{incognitoSiteExceptionDesc}"
+              icon-class="settings20:incognito"
+              on-click="onShowIncognitoTooltip_"
+              on-mouseenter="onShowIncognitoTooltip_"
+              on-focus="onShowIncognitoTooltip_"></cr-tooltip-icon>
+        </div>
+      </div>
+    </template>
+    <paper-tooltip id="tooltip" fit-to-visible-bounds manual-mode
+        position="top">
+      $i18n{incognitoSiteExceptionDesc}
+    </paper-tooltip>
+  </template>
+  <script src="recent_site_permissions.js"></script>
+</dom-module
diff --git a/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.js b/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.js
new file mode 100644
index 0000000..bec81c5
--- /dev/null
+++ b/chrome/browser/resources/settings/site_settings_page/recent_site_permissions.js
@@ -0,0 +1,268 @@
+// 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.
+
+Polymer({
+  is: 'settings-recent-site-permissions',
+
+  behaviors: [
+    SiteSettingsBehavior,
+    WebUIListenerBehavior,
+    I18nBehavior,
+  ],
+
+  properties: {
+    /** @type boolean */
+    noRecentPermissions: {
+      type: Boolean,
+      computed: 'noRecentPermissions_(recentSitePermissionsList_)',
+      notify: true,
+    },
+
+    /**
+     * List of recent site permissions grouped by source.
+     * @type {!Array<RecentSitePermissions>}
+     * @private
+     */
+    recentSitePermissionsList_: {
+      type: Array,
+      value: () => [],
+    },
+  },
+
+  /** @override */
+  ready() {
+    this.addWebUIListener(
+        'onIncognitoStatusChanged', this.onIncognitoStatusChanged_.bind(this));
+    this.browserProxy.updateIncognitoStatus();
+  },
+
+  /**
+   * Perform internationalization for the given content settings type.
+   * @return {string} The localised content setting type string
+   * @private
+   */
+  getI18nContentTypeString_(contentSettingsType) {
+    switch (contentSettingsType) {
+      case 'cookies':
+        return this.i18n('siteSettingsCookies');
+      case 'images':
+        return this.i18n('siteSettingsImages');
+      case 'javascript':
+        return this.i18n('siteSettingsJavascript');
+      case 'sound':
+        return this.i18n('siteSettingsSound');
+      case 'popups':
+        return this.i18n('siteSettingsPopups');
+      case 'location':
+        return this.i18n('siteSettingsLocation');
+      case 'notifications':
+        return this.i18n('siteSettingsNotifications');
+      case 'media-stream-mic':
+        return this.i18n('siteSettingsMic');
+      case 'media-stream-camera':
+        return this.i18n('siteSettingsCamera');
+      case 'register-protocol-handler':
+        return this.i18n('siteSettingsHandlers');
+      case 'ppapi-broker':
+        return this.i18n('siteSettingsUnsandboxedPlugins');
+      case 'multiple-automatic-downloads':
+        return this.i18n('siteSettingsAutomaticDownloads');
+      case 'background-sync':
+        return this.i18n('siteSettingsBackgroundSync');
+      case 'midi-sysex':
+        return this.i18n('siteSettingsMidiDevices');
+      case 'usb-devices':
+        return this.i18n('siteSettingsUsbDevices');
+      case 'serial-ports':
+        return this.i18n('siteSettingsSerialPorts');
+      case 'zoom-levels':
+        return this.i18n('siteSettingsZoomLevels');
+      case 'protected-content':
+        return this.i18n('siteSettingsProtectedContent');
+      case 'ads':
+        return this.i18n('siteSettingsAds');
+      case 'clipboard':
+        return this.i18n('siteSettingsClipboard');
+      case 'sensors':
+        return this.i18n('siteSettingsSensors');
+      case 'payment-handler':
+        return this.i18n('siteSettingsPaymentHandler');
+      case 'mixed-script':
+        return this.i18n('siteSettingsInsecureContent');
+      case 'bluetooth-scanning':
+        return this.i18n('siteSettingsBluetoothScanning');
+      case 'native-file-system-write':
+        return this.i18n('siteSettingsNativeFileSystemWrite');
+      case 'hid-devices':
+        return this.i18n('siteSettingsHidDevices');
+      case 'ar':
+        return this.i18n('siteSettingsAr');
+      case 'vr':
+        return this.i18n('siteSettingsVr');
+      default:
+        return '';
+    }
+  },
+
+  /**
+   * Return the display string representing a permission change.
+   * @param {!RawSiteException} rawSiteException
+   * @param {boolean} sentenceStart Whether the returned string will start a
+   *     sentence.
+   * @return {string} The string representing the permission change.
+   * @private
+   */
+  getI18nPermissionChangeString_({setting, source, type}, sentenceStart) {
+    let change;
+    if (setting === settings.ContentSetting.ALLOW) {
+      change = 'Allowed';
+    } else if (setting === settings.ContentSetting.BLOCK) {
+      if (source === settings.SiteSettingSource.EMBARGO) {
+        change = 'Autoblocked';
+      } else if (source === settings.SiteSettingSource.PREFERENCE) {
+        change = 'Blocked';
+      } else {
+        return '';
+      }
+    }
+    const suffix = sentenceStart ? 'SentenceStart' : '';
+    const msgId = `recentPermissionChange${change}${suffix}`;
+    return this.i18n(msgId, this.getI18nContentTypeString_(type));
+  },
+
+  /**
+   * Returns a user-friendly name for the origin a set of recent permissions
+   * is associated with.
+   * @param {!RecentSitePermissions} recentSitePermissions
+   * @return {string} The user-friendly name.
+   * @private
+   */
+  getDisplayName_(recentSitePermissions) {
+    const url = this.toUrl(recentSitePermissions.origin);
+    return url.host;
+  },
+
+  /**
+   * Returns the site scheme for the origin of a set of recent permissions.
+   * @param {!RecentSitePermissions} recentSitePermissions
+   * @return {string} The site scheme.
+   * @private
+   */
+  getSiteScheme_({origin}) {
+    const url = this.toUrl(origin);
+    const scheme = url.protocol.slice(0, -1);
+    return scheme === 'https' ? '' : scheme;
+  },
+
+  /**
+   * Returns the display text which describes the set of recent permissions.
+   * @param {!RecentSitePermissions} recentSitePermissions
+   * @return {string} The display string for set of site permissions.
+   * @private
+   */
+  getPermissionsText_({recentPermissions, incognito}) {
+    const displayStrings = recentPermissions.map(
+        (rp, i) => this.getI18nPermissionChangeString_(rp, i === 0));
+
+    if (recentPermissions.length === 1 && !incognito) {
+      return displayStrings[0];
+    }
+
+    const itemsPart = [
+      'OneItem',
+      'TwoItems',
+      'ThreeItems',
+      'OverThreeItems',
+    ][Math.min(recentPermissions.length, 4) - 1];
+    const suffix = incognito ? 'Incognito' : '';
+    const i18nStringID = `recentPermissions${itemsPart}${suffix}`;
+
+    return this.i18n(i18nStringID, ...displayStrings);
+  },
+
+  /**
+   * Returns the correct class to apply depending on this recent site
+   * permissions entry based on the index.
+   * @param {number} index
+   * @return {string} The CSS class corresponding to the provided index
+   * @private
+   */
+  getClassForIndex_(index) {
+    return index === 0 ? 'first' : '';
+  },
+
+  /**
+   * Returns true if there are no recent site permissions to display
+   * @return {boolean}
+   * @private
+   */
+  noRecentPermissions_() {
+    return this.recentSitePermissionsList_.length === 0;
+  },
+
+  /**
+   * Called for when incognito is enabled or disabled. Only called on change
+   * (opening N incognito windows only fires one message). Another message is
+   * sent when the *last* incognito window closes.
+   * @private
+   */
+  onIncognitoStatusChanged_(hasIncognito) {
+    // We're only interested in the case where we transition out of incognito
+    // and we are currently displaying an incognito entry.
+    if (hasIncognito === false &&
+        this.recentSitePermissionsList_.some(p => p.incognito)) {
+      this.populateList();
+    }
+  },
+
+  /**
+   * A handler for selecting a recent site permissions entry.
+   * @param {!{model: !{index: number}}} e
+   * @private
+   */
+  onRecentSitePermissionClick_(e) {
+    const origin = this.recentSitePermissionsList_[e.model.index].origin;
+    settings.Router.getInstance().navigateTo(
+        settings.routes.SITE_SETTINGS_SITE_DETAILS,
+        new URLSearchParams({site: origin}));
+    this.browserProxy.recordAction(settings.AllSitesAction.ENTER_SITE_DETAILS);
+  },
+
+  /**
+   * @param {!Event} e
+   * @private
+   */
+  onShowIncognitoTooltip_(e) {
+    e.stopPropagation();
+
+    const target = e.target;
+    const tooltip = this.$.tooltip;
+    tooltip.target = target;
+    /** @type {{updatePosition: Function}} */ (tooltip).updatePosition();
+    const hide = () => {
+      /** @type {{hide: Function}} */ (tooltip).hide();
+      target.removeEventListener('mouseleave', hide);
+      target.removeEventListener('blur', hide);
+      target.removeEventListener('tap', hide);
+      tooltip.removeEventListener('mouseenter', hide);
+    };
+    target.addEventListener('mouseleave', hide);
+    target.addEventListener('blur', hide);
+    target.addEventListener('tap', hide);
+    tooltip.addEventListener('mouseenter', hide);
+
+    tooltip.show();
+  },
+
+  /**
+   * Retrieve the list of recently changed permissions and implicitly trigger
+   * the update of the display list.
+   * @private
+   */
+  async populateList() {
+    this.recentSitePermissionsList_ =
+        await this.browserProxy.getRecentSitePermissions(
+            this.getCategoryList(), 3);
+  },
+});
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page.html b/chrome/browser/resources/settings/site_settings_page/site_settings_page.html
index 5d56059..466070f 100644
--- a/chrome/browser/resources/settings/site_settings_page/site_settings_page.html
+++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page.html
@@ -12,6 +12,7 @@
 <link rel="import" href="../site_settings/constants.html">
 <link rel="import" href="../site_settings/site_settings_behavior.html">
 <link rel="import" href="../site_settings/site_settings_prefs_browser_proxy.html">
+<link rel="import" href="recent_site_permissions.html">
 <link rel="import" href="../metrics_browser_proxy.html">
 
 <dom-module id="settings-site-settings-page">
@@ -31,10 +32,23 @@
         border-top: none;
       }
     </style>
-    <div class="settings-box first line-only">
-      <h2 class="first">$i18n{siteSettingsAllSites}</h2>
-    </div>
+    <template is="dom-if" if="[[!privacySettingsRedesignEnabled_]]">
+      <div class="settings-box first line-only">
+        <h2 class="first">$i18n{siteSettingsAllSites}</h2>
+      </div>
+    </template>
+
+    <template is="dom-if" if="[[privacySettingsRedesignEnabled_]]">
+      <div class="settings-box first line-only">
+        <h2 class="first">$i18n{siteSettingsRecentPermissionsSectionLabel}</h2>
+      </div>
+      <settings-recent-site-permissions id="recentSitePermissions"
+          no-recent-permissions="{{noRecentSitePermissions_}}">
+      </settings-recent-site-permissions>
+    </template>
+
     <cr-link-row data-route="SITE_SETTINGS_ALL" id="allSites"
+        class$="[[getClassForSiteSettingsAllLink_(noRecentSitePermissions_)]]"
         label="$i18n{siteSettingsAllSitesDescription}"
         on-click="onTapNavigate_"
         role-description="$i18n{subpageArrowRoleDescription}"></cr-link-row>
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page.js b/chrome/browser/resources/settings/site_settings_page/site_settings_page.js
index 7f5c90c..8977c56 100644
--- a/chrome/browser/resources/settings/site_settings_page/site_settings_page.js
+++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page.js
@@ -40,7 +40,6 @@
    */
   let CategoryListItem;
 
-
   /**
    * @return {!Map<!settings.ContentSettingsTypes, !settings.CategoryListItem>}
    */
@@ -309,7 +308,10 @@
   Polymer({
     is: 'settings-site-settings-page',
 
-    behaviors: [SiteSettingsBehavior, WebUIListenerBehavior, I18nBehavior],
+    behaviors: [
+      SiteSettingsBehavior, WebUIListenerBehavior, I18nBehavior,
+      settings.RouteObserverBehavior
+    ],
 
     properties: {
       /** @private {!Array<!settings.CategoryListItem>} */
@@ -370,6 +372,17 @@
         type: Object,
         observer: 'focusConfigChanged_',
       },
+
+      /** @private */
+      privacySettingsRedesignEnabled_: {
+        type: Boolean,
+        value: loadTimeData.getBoolean('privacySettingsRedesignEnabled'),
+      },
+
+      /* @private */
+      noRecentSitePermissions_: {
+        type: Boolean,
+      },
     },
 
     /**
@@ -467,6 +480,35 @@
     },
 
     /**
+     * Reload the site recent site permission list when the page is navigated
+     * to.
+     * settings.RouteObserverBehavior
+     * @param {!settings.Route} currentRoute
+     * @protected
+     */
+    currentRouteChanged(currentRoute) {
+      if (currentRoute == settings.routes.SITE_SETTINGS &&
+          this.privacySettingsRedesignEnabled_) {
+        // Needs to be async to await the surrounding dom-if, should be removed
+        // when the dom-if is removed.
+        this.async(() => {
+          this.$$('#recentSitePermissions').populateList();
+        });
+      }
+    },
+
+    /**
+     * @return {string} Class for the all site settings link
+     * @private
+     */
+    getClassForSiteSettingsAllLink_() {
+      return (this.privacySettingsRedesignEnabled_ &&
+              !this.noRecentSitePermissions_) ?
+          'hr' :
+          '';
+    },
+
+    /**
      * Navigate to the route specified in the event dataset.
      * @param {!Event} event The tap event.
      * @private
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/OWNERS b/chrome/browser/safe_browsing/cloud_content_scanning/OWNERS
index de4a5c0..0046b2a 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/OWNERS
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/OWNERS
@@ -1,7 +1,7 @@
-per-file deep_scanning_dialog_delegate.cc=rogerta@chromium.org
-per-file deep_scanning_dialog_delegate.h=rogerta@chromium.org
-per-file deep_scanning_dialog_delegate_unittest.cc=rogerta@chromium.org
-per-file fake_deep_scanning_dialog_delegate.cc=rogerta@chromium.org
-per-file fake_deep_scanning_dialog_delegate.h=rogerta@chromium.org
+per-file deep_scanning_dialog_delegate*=rogerta@chromium.org
+per-file fake_deep_scanning_dialog_delegate*=rogerta@chromium.org
+per-file deep_scanning_dialog_views*=rogerta@chromium.org
+per-file deep_scanning_browsertest_base*=rogerta@chromium.org
+per-file deep_scanning_utils*=rogerta@chromium.org
 
 drubery@chromium.org
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc
index bde7b92..4d284d9 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/binary_upload_service.cc
@@ -368,8 +368,8 @@
 
   if (response.has_malware_scan_verdict()) {
     base::UmaHistogramBoolean("SafeBrowsingBinaryUploadRequest.MalwareResult",
-                              response.malware_scan_verdict().status() ==
-                                  MalwareDeepScanningVerdict::SUCCESS);
+                              response.malware_scan_verdict().verdict() !=
+                                  MalwareDeepScanningVerdict::SCAN_FAILURE);
   }
 
   if (response.has_dlp_scan_verdict()) {
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
index 09be2f8..a36d19e 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
@@ -514,12 +514,8 @@
   bool dlp_ok = DlpTriggeredRulesOK(response.dlp_scan_verdict());
   bool malware_ok = true;
   if (response.has_malware_scan_verdict()) {
-    malware_ok = response.malware_scan_verdict().status() ==
-                     MalwareDeepScanningVerdict::SUCCESS &&
-                 response.malware_scan_verdict().verdict() !=
-                     MalwareDeepScanningVerdict::UWS &&
-                 response.malware_scan_verdict().verdict() !=
-                     MalwareDeepScanningVerdict::MALWARE;
+    malware_ok = response.malware_scan_verdict().verdict() ==
+                 MalwareDeepScanningVerdict::CLEAN;
   }
 
   bool file_complies = ResultShouldAllowDataUse(result) && dlp_ok && malware_ok;
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.cc
index 3272ba2f..607bf698 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.cc
@@ -91,8 +91,8 @@
     return;
 
   if (response.has_malware_scan_verdict() &&
-      response.malware_scan_verdict().status() !=
-          MalwareDeepScanningVerdict::SUCCESS) {
+      response.malware_scan_verdict().verdict() ==
+          MalwareDeepScanningVerdict::SCAN_FAILURE) {
     extensions::SafeBrowsingPrivateEventRouterFactory::GetForProfile(profile)
         ->OnUnscannedFileEvent(url, file_name, download_digest_sha256,
                                mime_type, trigger, "malwareScanFailed",
@@ -296,8 +296,6 @@
   }
 
   if (malware_success.has_value()) {
-    response.mutable_malware_scan_verdict()->set_status(
-        MalwareDeepScanningVerdict::SUCCESS);
     if (malware_success.value()) {
       response.mutable_malware_scan_verdict()->set_verdict(
           MalwareDeepScanningVerdict::CLEAN);
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/fake_deep_scanning_dialog_delegate.cc b/chrome/browser/safe_browsing/cloud_content_scanning/fake_deep_scanning_dialog_delegate.cc
index 274e112..89a1f40 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/fake_deep_scanning_dialog_delegate.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/fake_deep_scanning_dialog_delegate.cc
@@ -81,8 +81,6 @@
         DlpDeepScanningVerdict::SUCCESS);
   }
   if (include_malware) {
-    response.mutable_malware_scan_verdict()->set_status(
-        MalwareDeepScanningVerdict::SUCCESS);
     response.mutable_malware_scan_verdict()->set_verdict(
         MalwareDeepScanningVerdict::CLEAN);
   }
@@ -94,8 +92,6 @@
 DeepScanningClientResponse FakeDeepScanningDialogDelegate::MalwareResponse(
     MalwareDeepScanningVerdict::Verdict verdict) {
   DeepScanningClientResponse response;
-  response.mutable_malware_scan_verdict()->set_status(
-      MalwareDeepScanningVerdict::SUCCESS);
   response.mutable_malware_scan_verdict()->set_verdict(verdict);
   return response;
 }
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc
index c1070a5..96ce31b7 100644
--- a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc
+++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc
@@ -36,9 +36,7 @@
 void DeepScanningClientResponseToDownloadCheckResult(
     const DeepScanningClientResponse& response,
     DownloadCheckResult* download_result) {
-  if (response.has_malware_scan_verdict() &&
-      response.malware_scan_verdict().status() ==
-          MalwareDeepScanningVerdict::SUCCESS) {
+  if (response.has_malware_scan_verdict()) {
     if (response.malware_scan_verdict().verdict() ==
         MalwareDeepScanningVerdict::MALWARE) {
       *download_result = DownloadCheckResult::DANGEROUS;
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc
index ecf11bc..72feaf21 100644
--- a/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_request_unittest.cc
@@ -343,8 +343,6 @@
         &download_protection_service_);
 
     DeepScanningClientResponse response;
-    response.mutable_malware_scan_verdict()->set_status(
-        MalwareDeepScanningVerdict::SUCCESS);
     response.mutable_malware_scan_verdict()->set_verdict(
         MalwareDeepScanningVerdict::MALWARE);
     response.mutable_dlp_scan_verdict()->set_status(
@@ -367,8 +365,6 @@
         &download_protection_service_);
 
     DeepScanningClientResponse response;
-    response.mutable_malware_scan_verdict()->set_status(
-        MalwareDeepScanningVerdict::SUCCESS);
     response.mutable_malware_scan_verdict()->set_verdict(
         MalwareDeepScanningVerdict::UWS);
     response.mutable_dlp_scan_verdict()->set_status(
@@ -471,8 +467,8 @@
         &download_protection_service_);
 
     DeepScanningClientResponse response;
-    response.mutable_malware_scan_verdict()->set_status(
-        MalwareDeepScanningVerdict::FAILURE);
+    response.mutable_malware_scan_verdict()->set_verdict(
+        MalwareDeepScanningVerdict::SCAN_FAILURE);
     download_protection_service_.GetFakeBinaryUploadService()->SetResponse(
         BinaryUploadService::Result::SUCCESS, response);
 
diff --git a/chrome/browser/sharing/shared_clipboard/feature_flags.cc b/chrome/browser/sharing/shared_clipboard/feature_flags.cc
index 2fdf694..2e9a2eb 100644
--- a/chrome/browser/sharing/shared_clipboard/feature_flags.cc
+++ b/chrome/browser/sharing/shared_clipboard/feature_flags.cc
@@ -4,9 +4,6 @@
 
 #include "chrome/browser/sharing/shared_clipboard/feature_flags.h"
 
-const base::Feature kSharedClipboardReceiver{"SharedClipboardReceiver",
-                                             base::FEATURE_ENABLED_BY_DEFAULT};
-
 const base::Feature kSharedClipboardUI{"SharedClipboardUI",
                                        base::FEATURE_DISABLED_BY_DEFAULT};
 
diff --git a/chrome/browser/sharing/shared_clipboard/feature_flags.h b/chrome/browser/sharing/shared_clipboard/feature_flags.h
index 40a711f..c466a13 100644
--- a/chrome/browser/sharing/shared_clipboard/feature_flags.h
+++ b/chrome/browser/sharing/shared_clipboard/feature_flags.h
@@ -11,9 +11,6 @@
 #include "base/metrics/field_trial_params.h"
 #include "build/build_config.h"
 
-// Feature to allow devices to receive the shared clipboard message.
-extern const base::Feature kSharedClipboardReceiver;
-
 // Feature to allow shared clipboard gets processed.
 extern const base::Feature kSharedClipboardUI;
 
diff --git a/chrome/browser/sharing/sharing_device_registration.cc b/chrome/browser/sharing/sharing_device_registration.cc
index 8e974ee..eeb1f74c 100644
--- a/chrome/browser/sharing/sharing_device_registration.cc
+++ b/chrome/browser/sharing/sharing_device_registration.cc
@@ -316,7 +316,7 @@
       !pref_service_->GetBoolean(prefs::kSharedClipboardEnabled)) {
     return false;
   }
-  return base::FeatureList::IsEnabled(kSharedClipboardReceiver);
+  return true;
 }
 
 bool SharingDeviceRegistration::IsSmsFetcherSupported() const {
diff --git a/chrome/browser/sharing/sharing_device_registration_unittest.cc b/chrome/browser/sharing/sharing_device_registration_unittest.cc
index ac41146..c54b64f 100644
--- a/chrome/browser/sharing/sharing_device_registration_unittest.cc
+++ b/chrome/browser/sharing/sharing_device_registration_unittest.cc
@@ -16,7 +16,6 @@
 #include "base/test/task_environment.h"
 #include "build/build_config.h"
 #include "chrome/browser/sharing/features.h"
-#include "chrome/browser/sharing/shared_clipboard/feature_flags.h"
 #include "chrome/browser/sharing/sharing_constants.h"
 #include "chrome/browser/sharing/sharing_device_registration_result.h"
 #include "chrome/browser/sharing/sharing_sync_preference.h"
@@ -160,10 +159,6 @@
     pref_service_->SetBoolean(prefs::kSharedClipboardEnabled, val);
   }
 
-  void EnableSharedClipboardReceiverFlag() {
-    scoped_feature_list_.InitAndEnableFeature(kSharedClipboardReceiver);
-  }
-
   void RegisterDeviceSync() {
     base::RunLoop run_loop;
     sharing_device_registration_.RegisterDevice(
@@ -247,14 +242,12 @@
 
 TEST_F(SharingDeviceRegistrationTest, IsSharedClipboardSupported_True) {
   SetSharedClipboardPolicy(true);
-  EnableSharedClipboardReceiverFlag();
 
   EXPECT_TRUE(sharing_device_registration_.IsSharedClipboardSupported());
 }
 
 TEST_F(SharingDeviceRegistrationTest, IsSharedClipboardSupported_False) {
   SetSharedClipboardPolicy(false);
-  EnableSharedClipboardReceiverFlag();
 
   EXPECT_FALSE(sharing_device_registration_.IsSharedClipboardSupported());
 }
diff --git a/chrome/browser/signin/chrome_signin_helper.cc b/chrome/browser/signin/chrome_signin_helper.cc
index 9fb6c4e5..a0d4821 100644
--- a/chrome/browser/signin/chrome_signin_helper.cc
+++ b/chrome/browser/signin/chrome_signin_helper.cc
@@ -11,6 +11,7 @@
 #include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/supports_user_data.h"
@@ -19,6 +20,7 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_io_data.h"
 #include "chrome/browser/signin/account_consistency_mode_manager.h"
 #include "chrome/browser/signin/account_reconcilor_factory.h"
@@ -38,6 +40,7 @@
 #include "components/signin/core/browser/cookie_reminter.h"
 #include "components/signin/public/base/account_consistency_method.h"
 #include "components/signin/public/base/signin_buildflags.h"
+#include "components/signin/public/identity_manager/accounts_cookie_mutator.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "google_apis/gaia/gaia_auth_util.h"
@@ -220,6 +223,23 @@
       return;
     }
 
+    // Child users shouldn't get the re-authentication dialog for primary
+    // account. Log out all accounts to re-mint the cookies.
+    // (See the reason below.)
+    signin::IdentityManager* const identity_manager =
+        IdentityManagerFactory::GetForProfile(profile);
+    CoreAccountInfo primary_account = identity_manager->GetPrimaryAccountInfo(
+        signin::ConsentLevel::kNotRequired);
+    if (profile->IsChild() &&
+        gaia::AreEmailsSame(primary_account.email,
+                            manage_accounts_params.email)) {
+      identity_manager->GetAccountsCookieMutator()->LogOutAllAccounts(
+          gaia::GaiaSource::kChromeOS);
+      UMA_HISTOGRAM_BOOLEAN("AccountManager.MirrorReauthenticationRequest",
+                            true);
+      return;
+    }
+
     // The account's cookie is invalid but the cookie has not been removed by
     // |AccountReconcilor|. Ideally, this should not happen. At this point,
     // |AccountReconcilor| cannot detect this state because its source of truth
@@ -228,8 +248,6 @@
     // invalid, so that if/when this account is re-authenticated, we can force a
     // reconciliation for this account instead of treating it as a no-op.
     // See https://crbug.com/1012649 for details.
-    signin::IdentityManager* const identity_manager =
-        IdentityManagerFactory::GetForProfile(profile);
     base::Optional<AccountInfo> maybe_account_info =
         identity_manager
             ->FindExtendedAccountInfoForAccountWithRefreshTokenByEmailAddress(
diff --git a/chrome/browser/spellchecker/spellcheck_service.cc b/chrome/browser/spellchecker/spellcheck_service.cc
index 0dc509b..8bbc5f5 100644
--- a/chrome/browser/spellchecker/spellcheck_service.cc
+++ b/chrome/browser/spellchecker/spellcheck_service.cc
@@ -74,7 +74,6 @@
   // initialized.
   if (spellcheck::WindowsVersionSupportsSpellchecker()) {
     platform_spell_checker_ = std::make_unique<WindowsSpellChecker>(
-        base::ThreadTaskRunnerHandle::Get(),
         base::CreateCOMSTATaskRunner({base::ThreadPool(), base::MayBlock()}));
   }
 #endif  // defined(OS_WIN) && BUILDFLAG(USE_BROWSER_SPELLCHECKER)
diff --git a/chrome/browser/ssl/ssl_browsertest.cc b/chrome/browser/ssl/ssl_browsertest.cc
index 86c088e..0869285 100644
--- a/chrome/browser/ssl/ssl_browsertest.cc
+++ b/chrome/browser/ssl/ssl_browsertest.cc
@@ -4519,6 +4519,51 @@
   EXPECT_FALSE(state->HasAllowException(https_server_host, tab));
 }
 
+// Verifies that if a bad certificate is seen for a host and the user proceeds
+// through the interstitial, the decision to proceed is not forgotten once blob
+// URLs are loaded (blob loads never have certificate errors).  This is a
+// regression test for https://crbug.com/1049625.
+IN_PROC_BROWSER_TEST_F(SSLUITest, BadCertFollowedByBlobUrl) {
+  ASSERT_TRUE(https_server_expired_.Start());
+  std::string https_server_host =
+      https_server_expired_.GetURL("/ssl/google.html").host();
+
+  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
+  Profile* profile = Profile::FromBrowserContext(tab->GetBrowserContext());
+  ChromeSSLHostStateDelegate* state =
+      reinterpret_cast<ChromeSSLHostStateDelegate*>(
+          profile->GetSSLHostStateDelegate());
+
+  // Proceed through the interstitial, accepting the broken cert.
+  ui_test_utils::NavigateToURL(
+      browser(), https_server_expired_.GetURL("/ssl/google.html"));
+  ProceedThroughInterstitial(tab);
+  ASSERT_TRUE(state->HasAllowException(https_server_host, tab));
+
+  // Load a blob URL.
+  content::WebContentsConsoleObserver console_observer(tab);
+  console_observer.SetPattern("hello from blob");
+  const char kScript[] = R"(
+      new Promise(function (resolvePromise, rejectPromise) {
+          var blob = new Blob(['console.log("hello from blob")'],
+                              {type : 'application/javascript'});
+          script = document.createElement('script');
+          script.onerror = rejectPromise;
+          script.onload = () => resolvePromise('success');
+          script.src = URL.createObjectURL(blob);
+          document.body.appendChild(script);
+      });
+  )";
+  ASSERT_EQ("success", content::EvalJs(tab, kScript));
+
+  // Verify that the script from the blob has successfully run.
+  console_observer.Wait();
+
+  // Verify that the decision to accept the broken cert has not been revoked
+  // (this is a regression test for https://crbug.com/1049625).
+  EXPECT_TRUE(state->HasAllowException(https_server_host, tab));
+}
+
 // Tests that the SSLStatus of a navigation entry for an SSL
 // interstitial matches the navigation entry once the interstitial is
 // clicked through. https://crbug.com/529456
diff --git a/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc b/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc
index f6db5378..bde5311d 100644
--- a/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_polling_sync_test.cc
@@ -54,7 +54,8 @@
 // This test verifies that updates of the poll interval get persisted
 // That's important make sure clients with short live times will eventually poll
 // (e.g. Android).
-IN_PROC_BROWSER_TEST_F(SingleClientPollingSyncTest, ShouldUpdatePollPrefs) {
+IN_PROC_BROWSER_TEST_F(SingleClientPollingSyncTest,
+                       PRE_ShouldUsePollIntervalFromPrefs) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
 
   sync_pb::ClientCommand client_command;
@@ -76,17 +77,12 @@
 
 IN_PROC_BROWSER_TEST_F(SingleClientPollingSyncTest,
                        ShouldUsePollIntervalFromPrefs) {
-  // Setup clients and provide new poll interval via prefs.
-  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
-  SyncPrefs sync_prefs(GetProfile(0)->GetPrefs());
-  sync_prefs.SetPollInterval(base::TimeDelta::FromSeconds(123));
-
   // Execute a sync cycle and verify this cycle used that interval.
   // This test assumes the SyncScheduler reads the actual interval from the
   // context. This is covered in the SyncSchedulerImpl's unittest.
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
   EXPECT_THAT(GetClient(0)->GetLastCycleSnapshot().poll_interval().InSeconds(),
-              Eq(123));
+              Eq(67));
 }
 
 // This test simulates the poll interval expiring between restarts.
diff --git a/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.cc b/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.cc
index 6032931e..54af434 100644
--- a/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.cc
+++ b/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.cc
@@ -8,7 +8,6 @@
 #include "chrome/browser/task_manager/providers/worker_task.h"
 #include "chrome/browser/task_manager/providers/worker_task_provider.h"
 #include "content/public/browser/render_process_host.h"
-#include "content/public/browser/shared_worker_instance.h"
 #include "content/public/browser/storage_partition.h"
 
 namespace task_manager {
@@ -67,16 +66,18 @@
 }
 
 void PerProfileWorkerTaskTracker::OnWorkerStarted(
-    const content::SharedWorkerInstance& instance,
+    content::SharedWorkerId shared_worker_id,
     int worker_process_id,
     const base::UnguessableToken& dev_tools_token) {
-  CreateWorkerTask(instance, Task::Type::SHARED_WORKER, worker_process_id,
-                   instance.url(), &shared_worker_tasks_);
+  // TODO(https://crbug.com/1047787): Make use of the worker's URL when it is
+  //                                  available.
+  CreateWorkerTask(shared_worker_id, Task::Type::SHARED_WORKER,
+                   worker_process_id, GURL(), &shared_worker_tasks_);
 }
 
 void PerProfileWorkerTaskTracker::OnBeforeWorkerTerminated(
-    const content::SharedWorkerInstance& instance) {
-  DeleteWorkerTask(instance, &shared_worker_tasks_);
+    content::SharedWorkerId shared_worker_id) {
+  DeleteWorkerTask(shared_worker_id, &shared_worker_tasks_);
 }
 
 void PerProfileWorkerTaskTracker::OnVersionStartedRunning(
diff --git a/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.h b/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.h
index b1cf84a..a7b5979 100644
--- a/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.h
+++ b/chrome/browser/task_manager/providers/per_profile_worker_task_tracker.h
@@ -49,16 +49,16 @@
       content::GlobalFrameRoutingId ancestor_render_frame_host_id) override;
 
   // content::SharedWorkerService::Observer:
-  void OnWorkerStarted(const content::SharedWorkerInstance& instance,
+  void OnWorkerStarted(content::SharedWorkerId shared_worker_id,
                        int worker_process_id,
                        const base::UnguessableToken& dev_tools_token) override;
   void OnBeforeWorkerTerminated(
-      const content::SharedWorkerInstance& instance) override;
+      content::SharedWorkerId shared_worker_id) override;
   void OnClientAdded(
-      const content::SharedWorkerInstance& instance,
+      content::SharedWorkerId shared_worker_id,
       content::GlobalFrameRoutingId render_frame_host_id) override {}
   void OnClientRemoved(
-      const content::SharedWorkerInstance& instance,
+      content::SharedWorkerId shared_worker_id,
       content::GlobalFrameRoutingId render_frame_host_id) override {}
 
   // content::ServiceWorkerContextObserver:
@@ -104,7 +104,7 @@
                  content::SharedWorkerService::Observer>
       scoped_shared_worker_service_observer_{this};
 
-  base::flat_map<content::SharedWorkerInstance, std::unique_ptr<WorkerTask>>
+  base::flat_map<content::SharedWorkerId, std::unique_ptr<WorkerTask>>
       shared_worker_tasks_;
 
   // For service workers:
diff --git a/chrome/browser/ui/android/infobars/grouped_permission_infobar.cc b/chrome/browser/ui/android/infobars/grouped_permission_infobar.cc
index d8129a9..752576f 100644
--- a/chrome/browser/ui/android/infobars/grouped_permission_infobar.cc
+++ b/chrome/browser/ui/android/infobars/grouped_permission_infobar.cc
@@ -14,6 +14,8 @@
 #include "chrome/browser/android/resource_mapper.h"
 #include "chrome/browser/android/tab_android.h"
 #include "chrome/browser/permissions/grouped_permission_infobar_delegate_android.h"
+#include "content/public/browser/web_contents.h"
+#include "ui/android/window_android.h"
 
 namespace {
 
@@ -23,7 +25,7 @@
 ScopedJavaLocalRef<jobject> CreateRenderInfoBarHelper(
     JNIEnv* env,
     int enumerated_icon_id,
-    const JavaRef<jobject>& tab,
+    const JavaRef<jobject>& window,
     const base::string16& compact_message_text,
     const base::string16& compact_link_text,
     const base::string16& message_text,
@@ -47,7 +49,7 @@
   ScopedJavaLocalRef<jintArray> content_settings_types =
       base::android::ToJavaIntArray(env, content_settings);
   return Java_PermissionInfoBar_create(
-      env, tab, content_settings_types, enumerated_icon_id,
+      env, window, content_settings_types, enumerated_icon_id,
       compact_message_text_java, compact_link_text_java, message_text_java,
       description_text_java, ok_button_text_java, cancel_button_text_java);
 }
@@ -82,9 +84,10 @@
   }
 
   return CreateRenderInfoBarHelper(
-      env, permission_icon, GetTab()->GetJavaObject(), compact_message_text,
-      compact_link_text, message_text, description_text, ok_button_text,
-      cancel_button_text, content_settings_types);
+      env, permission_icon,
+      GetTab()->web_contents()->GetTopLevelNativeWindow()->GetJavaObject(),
+      compact_message_text, compact_link_text, message_text, description_text,
+      ok_button_text, cancel_button_text, content_settings_types);
 }
 
 GroupedPermissionInfoBarDelegate* GroupedPermissionInfoBar::GetDelegate() {
diff --git a/chrome/browser/ui/ash/chrome_new_window_client.cc b/chrome/browser/ui/ash/chrome_new_window_client.cc
index bb39fbe..15d4d86 100644
--- a/chrome/browser/ui/ash/chrome_new_window_client.cc
+++ b/chrome/browser/ui/ash/chrome_new_window_client.cc
@@ -116,7 +116,6 @@
      {ChromePage::STORAGE, chrome::kStorageSubPage},
      {ChromePage::STYLUS, chrome::kStylusSubPage},
      {ChromePage::SWITCHACCESS, chrome::kSwitchAccessSubPage},
-     {ChromePage::SYNCSETUP, chrome::kSyncSetupSubPage},
      {ChromePage::TETHERSETTINGS, chrome::kTetherSettingsSubPage},
      {ChromePage::WIFI, chrome::kWiFiSettingsSubPage}};
 
@@ -130,7 +129,8 @@
         {ChromePage::ONSTARTUP, chrome::kOnStartupSubPage},
         {ChromePage::PASSWORDS, chrome::kPasswordManagerSubPage},
         {ChromePage::PRIVACY, chrome::kPrivacySubPage},
-        {ChromePage::SEARCH, chrome::kSearchSubPage}};
+        {ChromePage::SEARCH, chrome::kSearchSubPage},
+        {ChromePage::SYNCSETUP, chrome::kSyncSetupSubPage}};
 
 constexpr std::pair<arc::mojom::ChromePage, const char*> kAboutPagesMapping[] =
     {{ChromePage::ABOUTBLANK, url::kAboutBlankURL},
diff --git a/chrome/browser/ui/ash/chrome_new_window_client_browsertest.cc b/chrome/browser/ui/ash/chrome_new_window_client_browsertest.cc
index f1351385..e9d38ed8 100644
--- a/chrome/browser/ui/ash/chrome_new_window_client_browsertest.cc
+++ b/chrome/browser/ui/ash/chrome_new_window_client_browsertest.cc
@@ -282,8 +282,6 @@
                      base_url.Resolve(chrome::kResetSubPage));
   TestOpenChromePage(ChromePage::STORAGE,
                      base_url.Resolve(chrome::kStorageSubPage));
-  TestOpenChromePage(ChromePage::SYNCSETUP,
-                     base_url.Resolve(chrome::kSyncSetupSubPage));
   TestOpenChromePage(ChromePage::ACCESSIBILITY,
                      base_url.Resolve(chrome::kAccessibilitySubPage));
   TestOpenChromePage(ChromePage::ACCOUNTMANAGER,
@@ -347,6 +345,8 @@
                      base_url.Resolve(chrome::kPasswordManagerSubPage));
   TestOpenChromePage(ChromePage::SEARCH,
                      base_url.Resolve(chrome::kSearchSubPage));
+  TestOpenChromePage(ChromePage::SYNCSETUP,
+                     base_url.Resolve(chrome::kSyncSetupSubPage));
 }
 
 void TestAllAboutPages() {
diff --git a/chrome/browser/ui/ash/login_screen_client.cc b/chrome/browser/ui/ash/login_screen_client.cc
index 3508c677..b6699f81 100644
--- a/chrome/browser/ui/ash/login_screen_client.cc
+++ b/chrome/browser/ui/ash/login_screen_client.cc
@@ -180,11 +180,16 @@
     delegate_->HandleFocusOobeDialog();
 }
 
-void LoginScreenClient::ShowGaiaSignin(bool can_close,
-                                       const AccountId& prefilled_account) {
+void LoginScreenClient::ShowGaiaSignin(const AccountId& prefilled_account) {
   if (chromeos::LoginDisplayHost::default_host()) {
     chromeos::LoginDisplayHost::default_host()->ShowGaiaDialog(
-        can_close, prefilled_account);
+        prefilled_account);
+  }
+}
+
+void LoginScreenClient::HideGaiaSignin() {
+  if (chromeos::LoginDisplayHost::default_host()) {
+    chromeos::LoginDisplayHost::default_host()->HideOobeDialog();
   }
 }
 
diff --git a/chrome/browser/ui/ash/login_screen_client.h b/chrome/browser/ui/ash/login_screen_client.h
index fb1a109..02baaaec 100644
--- a/chrome/browser/ui/ash/login_screen_client.h
+++ b/chrome/browser/ui/ash/login_screen_client.h
@@ -109,8 +109,8 @@
   void OnMaxIncorrectPasswordAttempted(const AccountId& account_id) override;
   void FocusLockScreenApps(bool reverse) override;
   void FocusOobeDialog() override;
-  void ShowGaiaSignin(bool can_close,
-                      const AccountId& prefilled_account) override;
+  void ShowGaiaSignin(const AccountId& prefilled_account) override;
+  void HideGaiaSignin() override;
   void OnRemoveUserWarningShown() override;
   void RemoveUser(const AccountId& account_id) override;
   void LaunchPublicSession(const AccountId& account_id,
diff --git a/chrome/browser/ui/ash/multi_user/multi_user_context_menu_chromeos.cc b/chrome/browser/ui/ash/multi_user/multi_user_context_menu_chromeos.cc
index 96254df..1e6a531 100644
--- a/chrome/browser/ui/ash/multi_user/multi_user_context_menu_chromeos.cc
+++ b/chrome/browser/ui/ash/multi_user/multi_user_context_menu_chromeos.cc
@@ -84,15 +84,19 @@
       return model;
     auto* menu = new MultiUserContextMenuChromeos(window);
     model.reset(menu);
+    int command_id = IDC_VISIT_DESKTOP_OF_LRU_USER_NEXT;
     for (size_t user_index = 1; user_index < logged_in_users.size();
          ++user_index) {
+      if (command_id > IDC_VISIT_DESKTOP_OF_LRU_USER_LAST) {
+        break;
+      }
       const user_manager::UserInfo* user_info = logged_in_users[user_index];
       menu->AddItem(
-          user_index == 1 ? IDC_VISIT_DESKTOP_OF_LRU_USER_2
-                          : IDC_VISIT_DESKTOP_OF_LRU_USER_3,
+          command_id,
           l10n_util::GetStringFUTF16(
               IDS_VISIT_DESKTOP_OF_LRU_USER, user_info->GetDisplayName(),
               base::ASCIIToUTF16(user_info->GetDisplayEmail())));
+      ++command_id;
     }
   }
   return model;
@@ -101,13 +105,15 @@
 void ExecuteVisitDesktopCommand(int command_id, aura::Window* window) {
   switch (command_id) {
     case IDC_VISIT_DESKTOP_OF_LRU_USER_2:
-    case IDC_VISIT_DESKTOP_OF_LRU_USER_3: {
+    case IDC_VISIT_DESKTOP_OF_LRU_USER_3:
+    case IDC_VISIT_DESKTOP_OF_LRU_USER_4:
+    case IDC_VISIT_DESKTOP_OF_LRU_USER_5: {
       const user_manager::UserList logged_in_users =
           user_manager::UserManager::Get()->GetLRULoggedInUsers();
       // When running the multi user mode on Chrome OS, windows can "visit"
       // another user's desktop.
       const AccountId account_id =
-          logged_in_users[IDC_VISIT_DESKTOP_OF_LRU_USER_2 == command_id ? 1 : 2]
+          logged_in_users[command_id - IDC_VISIT_DESKTOP_OF_LRU_USER_NEXT + 1]
               ->GetAccountId();
       base::OnceCallback<void(bool, bool)> on_accept =
           base::Bind(&OnAcceptTeleportWarning, account_id, window);
diff --git a/chrome/browser/ui/blocked_content/popup_opener_tab_helper.cc b/chrome/browser/ui/blocked_content/popup_opener_tab_helper.cc
index 3be3fdf9..5970e19 100644
--- a/chrome/browser/ui/blocked_content/popup_opener_tab_helper.cc
+++ b/chrome/browser/ui/blocked_content/popup_opener_tab_helper.cc
@@ -10,9 +10,17 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/time/tick_clock.h"
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/blocked_content/tab_under_navigation_throttle.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/content_settings/core/common/content_settings.h"
+#include "components/ukm/content/source_url_recorder.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
+#include "services/metrics/public/cpp/metrics_utils.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
+#include "services/metrics/public/cpp/ukm_recorder.h"
 #include "ui/base/scoped_visibility_tracker.h"
 
 // static
@@ -43,6 +51,7 @@
 
 void PopupOpenerTabHelper::OnOpenedPopup(PopupTracker* popup_tracker) {
   has_opened_popup_since_last_user_gesture_ = true;
+  has_opened_popup_ = true;
   last_popup_open_time_ = tick_clock_->NowTicks();
 }
 
@@ -67,6 +76,28 @@
       web_contents->GetVisibility() != content::Visibility::HIDDEN);
 }
 
+void PopupOpenerTabHelper::WebContentsDestroyed() {
+  // If the user has opened a popup, record the page popup settings ukm.
+  if (has_opened_popup_) {
+    const GURL& url = web_contents()->GetLastCommittedURL();
+    if (!url.is_valid()) {
+      return;
+    }
+
+    const ukm::SourceId source_id =
+        ukm::GetSourceIdForWebContentsDocument(web_contents());
+    Profile* profile =
+        Profile::FromBrowserContext(web_contents()->GetBrowserContext());
+    bool user_allows_popups =
+        HostContentSettingsMapFactory::GetForProfile(profile)
+            ->GetContentSetting(url, url, ContentSettingsType::POPUPS,
+                                std::string()) == CONTENT_SETTING_ALLOW;
+    ukm::builders::Popup_Page(source_id)
+        .SetAllowed(user_allows_popups)
+        .Record(ukm::UkmRecorder::Get());
+  }
+}
+
 void PopupOpenerTabHelper::OnVisibilityChanged(content::Visibility visibility) {
   // TODO(csharrison): Consider handling OCCLUDED tabs the same way as HIDDEN
   // tabs.
diff --git a/chrome/browser/ui/blocked_content/popup_opener_tab_helper.h b/chrome/browser/ui/blocked_content/popup_opener_tab_helper.h
index f8aac1a..ab67992 100644
--- a/chrome/browser/ui/blocked_content/popup_opener_tab_helper.h
+++ b/chrome/browser/ui/blocked_content/popup_opener_tab_helper.h
@@ -59,6 +59,7 @@
                        const base::TickClock* tick_clock);
 
   // content::WebContentsObserver:
+  void WebContentsDestroyed() override;
   void OnVisibilityChanged(content::Visibility visibility) override;
   void DidStartNavigation(
       content::NavigationHandle* navigation_handle) override;
@@ -80,6 +81,9 @@
 
   bool has_opened_popup_since_last_user_gesture_ = false;
 
+  // Whether this WebContents has opened a popup.
+  bool has_opened_popup_ = false;
+
   WEB_CONTENTS_USER_DATA_KEY_DECL();
 
   DISALLOW_COPY_AND_ASSIGN(PopupOpenerTabHelper);
diff --git a/chrome/browser/ui/blocked_content/popup_opener_tab_helper_unittest.cc b/chrome/browser/ui/blocked_content/popup_opener_tab_helper_unittest.cc
index 5366f7f..7f325324 100644
--- a/chrome/browser/ui/blocked_content/popup_opener_tab_helper_unittest.cc
+++ b/chrome/browser/ui/blocked_content/popup_opener_tab_helper_unittest.cc
@@ -17,6 +17,7 @@
 #include "base/test/simple_test_tick_clock.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
 #include "chrome/browser/infobars/infobar_service.h"
 #include "chrome/browser/ui/blocked_content/list_item_position.h"
@@ -320,6 +321,73 @@
   histogram_tester()->ExpectTotalCount(kPopupToTabUnder, 0);
 }
 
+// Navigate to a site without pop-ups, verify the user popup settings are not
+// logged to ukm.
+TEST_F(PopupOpenerTabHelperTest,
+       PageWithNoPopups_NoProfileSettingsLoggedInUkm) {
+  ukm::InitializeSourceUrlRecorderForWebContents(web_contents());
+  ukm::TestAutoSetUkmRecorder test_ukm_recorder;
+
+  const GURL url("https://first.test/");
+  NavigateAndCommitWithoutGesture(url);
+  DeleteContents();
+
+  auto entries =
+      test_ukm_recorder.GetEntriesByName(ukm::builders::Popup_Page::kEntryName);
+  EXPECT_EQ(0u, entries.size());
+}
+
+// Navigate to a site, verify histogram for user site pop up settings
+// when there is at least one popup.
+TEST_F(PopupOpenerTabHelperTest,
+       PageWithDefaultPopupBlocker_ProfileSettingsLoggedInUkm) {
+  ukm::InitializeSourceUrlRecorderForWebContents(web_contents());
+  ukm::TestAutoSetUkmRecorder test_ukm_recorder;
+
+  const GURL url("https://first.test/");
+  NavigateAndCommitWithoutGesture(url);
+  SimulatePopup();
+  DeleteContents();
+
+  auto entries =
+      test_ukm_recorder.GetEntriesByName(ukm::builders::Popup_Page::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+
+  test_ukm_recorder.ExpectEntrySourceHasUrl(entries[0], url);
+  test_ukm_recorder.ExpectEntryMetric(
+      entries[0], ukm::builders::Popup_Page::kAllowedName, false);
+}
+
+// Same as the test with the default pop up blocker, however, with the user
+// explicitly allowing popups on the site.
+TEST_F(PopupOpenerTabHelperTest,
+       PageWithPopupsAllowed_ProfileSettingsLoggedInUkm) {
+  ukm::InitializeSourceUrlRecorderForWebContents(web_contents());
+  ukm::TestAutoSetUkmRecorder test_ukm_recorder;
+
+  const GURL url("https://first.test/");
+
+  // Allow popups on url for the test profile.
+  TestingProfile* test_profile = profile();
+  HostContentSettingsMap* host_content_settings_map =
+      HostContentSettingsMapFactory::GetForProfile(test_profile);
+  host_content_settings_map->SetContentSettingDefaultScope(
+      url, url, ContentSettingsType::POPUPS, std::string(),
+      CONTENT_SETTING_ALLOW);
+
+  NavigateAndCommitWithoutGesture(url);
+  SimulatePopup();
+  DeleteContents();
+
+  auto entries =
+      test_ukm_recorder.GetEntriesByName(ukm::builders::Popup_Page::kEntryName);
+  EXPECT_EQ(1u, entries.size());
+
+  test_ukm_recorder.ExpectEntrySourceHasUrl(entries[0], url);
+  test_ukm_recorder.ExpectEntryMetric(
+      entries[0], ukm::builders::Popup_Page::kAllowedName, true);
+}
+
 class BlockTabUnderTest : public PopupOpenerTabHelperTest {
  public:
   BlockTabUnderTest() {}
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc
index 48713d1..18591ab 100644
--- a/chrome/browser/ui/browser_command_controller.cc
+++ b/chrome/browser/ui/browser_command_controller.cc
@@ -80,6 +80,7 @@
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_context_menu.h"
 #include "chrome/browser/ui/browser_commands_chromeos.h"
+#include "components/session_manager/core/session_manager.h"
 #endif
 
 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
@@ -472,6 +473,8 @@
 #if defined(OS_CHROMEOS)
     case IDC_VISIT_DESKTOP_OF_LRU_USER_2:
     case IDC_VISIT_DESKTOP_OF_LRU_USER_3:
+    case IDC_VISIT_DESKTOP_OF_LRU_USER_4:
+    case IDC_VISIT_DESKTOP_OF_LRU_USER_5:
       ExecuteVisitDesktopCommand(id, window()->GetNativeWindow());
       break;
 #endif
@@ -958,8 +961,19 @@
   command_updater_.UpdateCommandEnabled(IDC_DEBUG_FRAME_TOGGLE, true);
 #if defined(OS_CHROMEOS)
   command_updater_.UpdateCommandEnabled(IDC_MINIMIZE_WINDOW, true);
+  // The VisitDesktop command is only supported for up to 5 logged in users
+  // because that's the max number of user sessions. If that number is increased
+  // the IDC_VISIT_DESKTOP_OF_LRU_USER_ command ids should be updated as well.
+  // crbug.com/940461
+  static_assert(
+      session_manager::kMaximumNumberOfUserSessions <=
+          IDC_VISIT_DESKTOP_OF_LRU_USER_LAST -
+              IDC_VISIT_DESKTOP_OF_LRU_USER_NEXT + 2,
+      "The max number of user sessions exceeds the number of users supported.");
   command_updater_.UpdateCommandEnabled(IDC_VISIT_DESKTOP_OF_LRU_USER_2, true);
   command_updater_.UpdateCommandEnabled(IDC_VISIT_DESKTOP_OF_LRU_USER_3, true);
+  command_updater_.UpdateCommandEnabled(IDC_VISIT_DESKTOP_OF_LRU_USER_4, true);
+  command_updater_.UpdateCommandEnabled(IDC_VISIT_DESKTOP_OF_LRU_USER_5, true);
 #endif
 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
   command_updater_.UpdateCommandEnabled(IDC_MINIMIZE_WINDOW, true);
diff --git a/chrome/browser/ui/passwords/settings/password_manager_presenter.cc b/chrome/browser/ui/passwords/settings/password_manager_presenter.cc
index 93088b3..91dd093 100644
--- a/chrome/browser/ui/passwords/settings/password_manager_presenter.cc
+++ b/chrome/browser/ui/passwords/settings/password_manager_presenter.cc
@@ -345,6 +345,7 @@
 #if !defined(OS_ANDROID)  // This is never called on Android.
 void PasswordManagerPresenter::RequestPlaintextPassword(
     const std::string& sort_key,
+    password_manager::PlaintextReason reason,
     base::OnceCallback<void(base::Optional<base::string16>)> callback) const {
   auto it = password_map_.find(sort_key);
   if (it == password_map_.end()) {
@@ -369,9 +370,12 @@
 
   // Call back the front end to reveal the password.
   std::move(callback).Run(form.password_value);
+  auto metric_type =
+      reason == password_manager::PlaintextReason::kCopy
+          ? password_manager::metrics_util::ACCESS_PASSWORD_COPIED
+          : password_manager::metrics_util::ACCESS_PASSWORD_VIEWED;
   UMA_HISTOGRAM_ENUMERATION(
-      "PasswordManager.AccessPasswordInSettings",
-      password_manager::metrics_util::ACCESS_PASSWORD_VIEWED,
+      "PasswordManager.AccessPasswordInSettings", metric_type,
       password_manager::metrics_util::ACCESS_PASSWORD_COUNT);
 }
 #endif
diff --git a/chrome/browser/ui/passwords/settings/password_manager_presenter.h b/chrome/browser/ui/passwords/settings/password_manager_presenter.h
index 0f68155..b740ade 100644
--- a/chrome/browser/ui/passwords/settings/password_manager_presenter.h
+++ b/chrome/browser/ui/passwords/settings/password_manager_presenter.h
@@ -11,14 +11,15 @@
 #include <memory>
 #include <string>
 #include <vector>
-
 #include "base/callback_forward.h"
 #include "base/macros.h"
 #include "base/optional.h"
 #include "base/strings/string16.h"
+#include "build/build_config.h"
 #include "components/password_manager/core/browser/password_store.h"
 #include "components/password_manager/core/browser/password_store_consumer.h"
 #include "components/password_manager/core/browser/ui/credential_provider_interface.h"
+#include "components/password_manager/core/browser/ui/plaintext_reason.h"
 #include "components/prefs/pref_member.h"
 #include "components/undo/undo_manager.h"
 #include "ui/shell_dialogs/select_file_dialog.h"
@@ -91,6 +92,7 @@
   // Undoes the last saved password or exception removal.
   void UndoRemoveSavedPasswordOrException();
 
+#if !defined(OS_ANDROID)
   // Requests to reveal the plain text password corresponding to |sort_key|. If
   // |sort_key| is a valid key into |password_map_|, runs |callback| with the
   // corresponding value, or nullopt otherwise.
@@ -98,7 +100,9 @@
   // instead.
   void RequestPlaintextPassword(
       const std::string& sort_key,
+      password_manager::PlaintextReason reason,
       base::OnceCallback<void(base::Optional<base::string16>)> callback) const;
+#endif
 
   // Wrapper around |PasswordStore::AddLogin| that adds the corresponding undo
   // action to |undo_manager_|.
diff --git a/chrome/browser/ui/passwords/settings/password_manager_presenter_unittest.cc b/chrome/browser/ui/passwords/settings/password_manager_presenter_unittest.cc
index 02f82eb..7eaa7ef 100644
--- a/chrome/browser/ui/passwords/settings/password_manager_presenter_unittest.cc
+++ b/chrome/browser/ui/passwords/settings/password_manager_presenter_unittest.cc
@@ -15,14 +15,21 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/bind_test_util.h"
+#if !defined(OS_ANDROID)
+#include "base/test/metrics/histogram_tester.h"
+#endif
+#include "base/test/mock_callback.h"
 #include "build/build_config.h"
 #include "chrome/browser/password_manager/password_store_factory.h"
 #include "chrome/browser/ui/passwords/settings/password_ui_view.h"
 #include "chrome/browser/ui/passwords/settings/password_ui_view_mock.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/password_manager/core/browser/password_list_sorter.h"
+#include "components/password_manager/core/browser/password_manager_metrics_util.h"
 #include "components/password_manager/core/browser/password_manager_test_utils.h"
 #include "components/password_manager/core/browser/test_password_store.h"
+#include "components/password_manager/core/browser/ui/plaintext_reason.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -45,7 +52,9 @@
 constexpr char kPassword2[] = "pass2";
 constexpr char kUsername[] = "user";
 constexpr char kUsername2[] = "user2";
-
+#if !defined(OS_ANDROID)
+constexpr char kHistogramName[] = "PasswordManager.AccessPasswordInSettings";
+#endif
 MATCHER(IsNotBlacklisted, "") {
   return !arg->blacklisted_by_user;
 }
@@ -82,9 +91,9 @@
     task_environment_.RunUntilIdle();
   }
 
-  void AddPasswordEntry(const GURL& origin,
-                        base::StringPiece username,
-                        base::StringPiece password) {
+  autofill::PasswordForm AddPasswordEntry(const GURL& origin,
+                                          base::StringPiece username,
+                                          base::StringPiece password) {
     autofill::PasswordForm form;
     form.origin = origin;
     form.signon_realm = origin.GetOrigin().spec();
@@ -93,6 +102,7 @@
     form.password_element = base::ASCIIToUTF16("Passwd");
     form.password_value = base::ASCIIToUTF16(password);
     store_->AddLogin(form);
+    return form;
   }
 
   void AddPasswordException(const GURL& origin) {
@@ -372,4 +382,28 @@
   EXPECT_EQ(kSameOrigin, passwords_for_export[0]->origin);
 }
 
+#if !defined(OS_ANDROID)
+TEST_F(PasswordManagerPresenterTest, TestRequestPlaintextPassword) {
+  base::HistogramTester histogram_tester_;
+  autofill::PasswordForm form =
+      AddPasswordEntry(GURL(kExampleCom), kUsername, kPassword);
+
+  EXPECT_CALL(GetUIController(), SetPasswordList(SizeIs(1)));
+  EXPECT_CALL(GetUIController(), SetPasswordExceptionList(IsEmpty()));
+  UpdatePasswordLists();
+  base::MockOnceCallback<void(base::Optional<base::string16>)>
+      password_callback;
+  EXPECT_CALL(password_callback,
+              Run(testing::Eq(base::ASCIIToUTF16(kPassword))));
+  std::string sort_key = password_manager::CreateSortKey(form);
+  GetUIController().GetPasswordManagerPresenter()->RequestPlaintextPassword(
+      sort_key, password_manager::PlaintextReason::kView,
+      password_callback.Get());
+
+  histogram_tester_.ExpectUniqueSample(
+      kHistogramName, password_manager::metrics_util::ACCESS_PASSWORD_VIEWED,
+      1);
+}
+#endif
+
 }  // namespace
diff --git a/chrome/browser/ui/views/frame/system_menu_model_builder.cc b/chrome/browser/ui/views/frame/system_menu_model_builder.cc
index 6692871c..1b7cc85 100644
--- a/chrome/browser/ui/views/frame/system_menu_model_builder.cc
+++ b/chrome/browser/ui/views/frame/system_menu_model_builder.cc
@@ -165,16 +165,19 @@
     return;
 
   model->AddSeparator(ui::NORMAL_SEPARATOR);
-  DCHECK_LE(logged_in_users.size(), 3u);
+  int command_id = IDC_VISIT_DESKTOP_OF_LRU_USER_NEXT;
   for (size_t user_index = 1; user_index < logged_in_users.size();
        ++user_index) {
+    if (command_id > IDC_VISIT_DESKTOP_OF_LRU_USER_LAST) {
+      break;
+    }
     const user_manager::UserInfo* user_info = logged_in_users[user_index];
     model->AddItem(
-        user_index == 1 ? IDC_VISIT_DESKTOP_OF_LRU_USER_2
-                        : IDC_VISIT_DESKTOP_OF_LRU_USER_3,
+        command_id,
         l10n_util::GetStringFUTF16(
             IDS_VISIT_DESKTOP_OF_LRU_USER, user_info->GetDisplayName(),
             base::ASCIIToUTF16(user_info->GetDisplayEmail())));
+    ++command_id;
   }
 #endif
 }
diff --git a/chrome/browser/ui/views/frame/system_menu_model_builder_browsertest_chromeos.cc b/chrome/browser/ui/views/frame/system_menu_model_builder_browsertest_chromeos.cc
index e7483c7..91d46b5 100644
--- a/chrome/browser/ui/views/frame/system_menu_model_builder_browsertest_chromeos.cc
+++ b/chrome/browser/ui/views/frame/system_menu_model_builder_browsertest_chromeos.cc
@@ -95,6 +95,8 @@
   // Settings window cannot be teleported.
   EXPECT_FALSE(base::Contains(commands, IDC_VISIT_DESKTOP_OF_LRU_USER_2));
   EXPECT_FALSE(base::Contains(commands, IDC_VISIT_DESKTOP_OF_LRU_USER_3));
+  EXPECT_FALSE(base::Contains(commands, IDC_VISIT_DESKTOP_OF_LRU_USER_4));
+  EXPECT_FALSE(base::Contains(commands, IDC_VISIT_DESKTOP_OF_LRU_USER_5));
 }
 
 }  // namespace
diff --git a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
index 049592f..18f1239 100644
--- a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
+++ b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
@@ -71,8 +71,10 @@
   using DelegateNotifyFn = void (Delegate::*)();
   auto notify_delegate = [](ProfileSigninConfirmationDialogViews* dialog,
                             DelegateNotifyFn fn) {
-    (dialog->delegate_.get()->*fn)();
-    dialog->delegate_.reset();
+    if (dialog->delegate_) {
+      (dialog->delegate_.get()->*fn)();
+      dialog->delegate_.reset();
+    }
   };
   DialogDelegate::set_accept_callback(
       base::BindOnce(notify_delegate, base::Unretained(this),
diff --git a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_unittest.cc b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_unittest.cc
new file mode 100644
index 0000000..bddcd57a
--- /dev/null
+++ b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views_unittest.cc
@@ -0,0 +1,67 @@
+// 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 "testing/gtest/include/gtest/gtest.h"
+
+#include "chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.h"
+#include "chrome/test/views/chrome_views_test_base.h"
+#include "ui/views/test/widget_test.h"
+
+namespace {
+
+class TestDelegate : public ui::ProfileSigninConfirmationDelegate {
+ public:
+  TestDelegate(int* cancels, int* continues, int* signins)
+      : cancels_(cancels), continues_(continues), signins_(signins) {}
+  ~TestDelegate() override = default;
+
+  void OnCancelSignin() override { (*cancels_)++; }
+  void OnContinueSignin() override { (*continues_)++; }
+  void OnSigninWithNewProfile() override { (*signins_)++; }
+
+  int* cancels_;
+  int* continues_;
+  int* signins_;
+};
+
+}  // namespace
+
+using ProfileSigninConfirmationDialogTest = ChromeViewsTestBase;
+
+// Regression test for https://crbug.com/1054866
+TEST_F(ProfileSigninConfirmationDialogTest, CloseButtonOnlyCallsDelegateOnce) {
+  int cancels = 0;
+  int continues = 0;
+  int signins = 0;
+
+  auto delegate =
+      std::make_unique<TestDelegate>(&cancels, &continues, &signins);
+  auto dialog = std::make_unique<ProfileSigninConfirmationDialogViews>(
+      nullptr, "foo@bar.com", std::move(delegate), true);
+  ProfileSigninConfirmationDialogViews* weak_dialog = dialog.get();
+
+  views::Widget* widget = views::DialogDelegate::CreateDialogWidget(
+      dialog.release(), GetContext(), nullptr);
+  views::test::WidgetDestroyedWaiter destroy_waiter(widget);
+
+  widget->Show();
+
+  // Press the "continue signin" button.
+  views::Button* button =
+      static_cast<views::Button*>(weak_dialog->GetExtraView());
+  // Synthesize both press & release - different platforms have different
+  // notions about whether buttons activate on press or on release.
+  button->OnKeyPressed(
+      ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_SPACE, ui::EF_NONE));
+  button->OnKeyReleased(
+      ui::KeyEvent(ui::ET_KEY_RELEASED, ui::VKEY_SPACE, ui::EF_NONE));
+  destroy_waiter.Wait();
+
+  // The delegate should *not* have gotten a call back to OnCancelSignin. If the
+  // fix for https://crbug.com/1054866 regresses, either it will, or we'll have
+  // crashed above.
+  EXPECT_EQ(cancels, 0);
+  EXPECT_EQ(continues, 1);
+  EXPECT_EQ(signins, 0);
+}
diff --git a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc
index 14c857b7..804d99d4 100644
--- a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc
+++ b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc
@@ -73,6 +73,10 @@
   DCHECK(!model_->should_dialog_be_closed());
   model_->AddObserver(this);
 
+  DialogDelegate::set_close_callback(
+      base::BindOnce(&AuthenticatorRequestDialogView::OnDialogClosing,
+                     base::Unretained(this)));
+
   // Currently, all sheets have a label on top and controls at the bottom.
   // Consider moving this to AuthenticatorRequestSheetView if this changes.
   SetLayoutManager(std::make_unique<views::FillLayout>());
@@ -113,7 +117,7 @@
   return false;
 }
 
-bool AuthenticatorRequestDialogView::Close() {
+void AuthenticatorRequestDialogView::OnDialogClosing() {
   // To keep the UI responsive, always allow immediately closing the dialog when
   // desired; but still trigger cancelling the AuthenticatorRequest unless it is
   // already complete.
@@ -141,8 +145,6 @@
   // over observers in SetCurrentStep().
   if (!model_->should_dialog_be_closed())
     Cancel();
-
-  return true;
 }
 
 bool AuthenticatorRequestDialogView::IsDialogButtonEnabled(
diff --git a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h
index 69e3678..5663dc6 100644
--- a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h
+++ b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h
@@ -68,7 +68,6 @@
   gfx::Size CalculatePreferredSize() const override;
   bool Accept() override;
   bool Cancel() override;
-  bool Close() override;
   bool IsDialogButtonEnabled(ui::DialogButton button) const override;
   View* GetInitiallyFocusedView() override;
   ui::ModalType GetModalType() const override;
@@ -100,6 +99,8 @@
   // Shows the dialog after creation or after being hidden.
   void Show();
 
+  void OnDialogClosing();
+
   std::unique_ptr<AuthenticatorRequestDialogModel> model_;
 
   AuthenticatorRequestSheetView* sheet_ = nullptr;
diff --git a/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc b/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc
index 62c69b3..240efbc 100644
--- a/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc
+++ b/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/web_applications/components/web_app_id.h"
 #include "chrome/browser/web_applications/components/web_app_provider_base.h"
 #include "chrome/browser/web_applications/test/web_app_install_observer.h"
+#include "content/public/test/browser_test_utils.h"
 #include "url/gurl.h"
 
 namespace web_app {
@@ -126,6 +127,28 @@
   NavigateAndCheckForToolbar(app_browser, popup_url, false);
 }
 
+// Tests that Create Shortcut doesn't timeout on a page that has a delayed
+// iframe load. Context: crbug.com/1046883
+IN_PROC_BROWSER_TEST_P(CreateShortcutBrowserTest, WorksAfterDelayedIFrameLoad) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  NavigateToURLAndWait(browser(), embedded_test_server()->GetURL(
+                                      "/favicon/page_with_favicon.html"));
+
+  // Append an iframe and wait for it to finish loading.
+  const char script[] = R"(
+    const iframe = document.createElement('iframe');
+    iframe.onload = _ => domAutomationController.send('success');
+    iframe.srcdoc = 'inner page';
+    document.body.appendChild(iframe);
+  )";
+  EXPECT_EQ(content::EvalJsWithManualReply(
+                browser()->tab_strip_model()->GetActiveWebContents(), script)
+                .ExtractString(),
+            "success");
+
+  InstallShortcutAppForCurrentUrl();
+}
+
 INSTANTIATE_TEST_SUITE_P(
     All,
     CreateShortcutBrowserTest,
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc
index 8f697e5..e540a1e 100644
--- a/chrome/browser/ui/webui/settings/people_handler.cc
+++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -36,6 +36,7 @@
 #include "chrome/browser/ui/webui/signin/login_ui_service.h"
 #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h"
 #include "chrome/common/url_constants.h"
+#include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/autofill/core/common/autofill_prefs.h"
 #include "components/browsing_data/core/history_notice_utils.h"
@@ -64,9 +65,7 @@
 #include "ui/base/webui/web_ui_util.h"
 #include "ui/gfx/image/image.h"
 
-#if defined(OS_CHROMEOS)
-#include "chromeos/constants/chromeos_features.h"
-#else
+#if !defined(OS_CHROMEOS)
 #include "chrome/browser/ui/webui/profile_helper.h"
 #endif
 
@@ -95,15 +94,7 @@
 };
 
 bool IsSyncSubpage(const GURL& current_url) {
-  if (current_url == chrome::GetSettingsUrl(chrome::kSyncSetupSubPage))
-    return true;
-#if defined(OS_CHROMEOS)
-  if (!chromeos::features::IsSplitSettingsSyncEnabled() &&
-      current_url == chrome::GetOSSettingsUrl(chrome::kSyncSetupSubPage)) {
-    return true;
-  }
-#endif  // defined(OS_CHROMEOS)
-  return false;
+  return current_url == chrome::GetSettingsUrl(chrome::kSyncSetupSubPage);
 }
 
 SyncConfigInfo::SyncConfigInfo()
@@ -893,6 +884,10 @@
   if (!service)
     return;
 
+  // The user opened settings directly to the syncSetup sub-page, because they
+  // clicked "Settings" in the browser sync consent dialog or because they
+  // clicked "Review sync options" in the Chrome OS out-of-box experience.
+  // Don't start syncing until they finish setup.
   if (IsSyncSubpage(web_contents->GetVisibleURL())) {
     sync_blocker_ = service->GetSetupInProgressHandle();
   }
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index 6bf4534..3a1ad68 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -1031,6 +1031,7 @@
       {"privacyPageMore", IDS_SETTINGS_PRIVACY_MORE},
       {"doNotTrack", IDS_SETTINGS_ENABLE_DO_NOT_TRACK},
       {"doNotTrackDialogTitle", IDS_SETTINGS_ENABLE_DO_NOT_TRACK_DIALOG_TITLE},
+      {"permissionsPageTitle", IDS_SETTINGS_PERMISSIONS},
       {"securityPageTitle", IDS_SETTINGS_SECURITY},
       {"securityPageAdvancedSectionLabel",
        IDS_SETTINGS_SECURITY_ADVANCED_SECTION_LABEL},
@@ -1067,6 +1068,32 @@
        IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION},
       {"urlKeyedAnonymizedDataCollectionDesc",
        IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION_DESC},
+      {"noRecentPermissions", IDS_SETTINGS_RECENT_PERMISSIONS_NO_CHANGES},
+      {"recentPermissionChangeAutoblockedSentenceStart",
+       IDS_SETTINGS_RECENT_PERMISSIONS_CHANGE_AUTOBLOCKED_SENTENCE_START},
+      {"recentPermissionChangeBlockedSentenceStart",
+       IDS_SETTINGS_RECENT_PERMISSIONS_CHANGE_BLOCKED_SENTENCE_START},
+      {"recentPermissionChangeAllowedSentenceStart",
+       IDS_SETTINGS_RECENT_PERMISSIONS_CHANGE_ALLOWED_SENTENCE_START},
+      {"recentPermissionChangeAutoblocked",
+       IDS_SETTINGS_RECENT_PERMISSIONS_CHANGE_AUTOBLOCKED},
+      {"recentPermissionChangeBlocked",
+       IDS_SETTINGS_RECENT_PERMISSIONS_CHANGE_BLOCKED},
+      {"recentPermissionChangeAllowed",
+       IDS_SETTINGS_RECENT_PERMISSIONS_CHANGE_ALLOWED},
+      {"recentPermissionsTwoItems", IDS_SETTINGS_RECENT_PERMISSIONS_TWO_ITEMS},
+      {"recentPermissionsThreeItems",
+       IDS_SETTINGS_RECENT_PERMISSIONS_THREE_ITEMS},
+      {"recentPermissionsOverThreeItems",
+       IDS_SETTINGS_RECENT_PERMISSIONS_OVER_THREE_ITEMS},
+      {"recentPermissionsOneItemIncognito",
+       IDS_SETTINGS_RECENT_PERMISSIONS_ONE_ITEM_INCOGNITO},
+      {"recentPermissionsTwoItemsIncognito",
+       IDS_SETTINGS_RECENT_PERMISSIONS_TWO_ITEMS_INCOGNITO},
+      {"recentPermissionsThreeItemsIncognito",
+       IDS_SETTINGS_RECENT_PERMISSIONS_THREE_ITEMS_INCOGNITO},
+      {"recentPermissionsOverThreeItemsIncognito",
+       IDS_SETTINGS_RECENT_PERMISSIONS_OVER_THREE_ITEMS_INCOGNITO},
       {"networkPredictionEnabled",
        IDS_SETTINGS_NETWORK_PREDICTION_ENABLED_LABEL},
       {"networkPredictionEnabledDesc",
@@ -1231,6 +1258,8 @@
     {"sharedWorkerWorker", IDS_SETTINGS_COOKIES_SHARED_WORKER_WORKER_LABEL},
     {"sharedWorkerName", IDS_SETTINGS_COOKIES_COOKIE_NAME_LABEL},
     {"siteSettingsCategoryPageTitle", IDS_SETTINGS_SITE_SETTINGS_CATEGORY},
+    {"siteSettingsRecentPermissionsSectionLabel",
+     IDS_SETTINGS_SITE_SETTINGS_RECENT_ACTIVITY},
     {"siteSettingsCategoryCamera", IDS_SETTINGS_SITE_SETTINGS_CAMERA},
     {"siteSettingsCameraLabel", IDS_SETTINGS_SITE_SETTINGS_CAMERA_LABEL},
     {"cookiePageTitle", IDS_SETTINGS_COOKIES_PAGE},
diff --git a/chrome/browser/wake_lock/wake_lock_browsertest.cc b/chrome/browser/wake_lock/wake_lock_browsertest.cc
index 51be0af..4ecf0d0 100644
--- a/chrome/browser/wake_lock/wake_lock_browsertest.cc
+++ b/chrome/browser/wake_lock/wake_lock_browsertest.cc
@@ -9,7 +9,7 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "components/permissions/permission_request_manager.h"
+#include "components/permissions/test/permission_request_observer.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/test/browser_test_utils.h"
@@ -20,38 +20,6 @@
 
 namespace {
 
-// Trimmed down version of the class found in geolocation_browsertest.cc.
-// Used to observe the creation of a single permission request without
-// responding.
-class PermissionRequestObserver
-    : public permissions::PermissionRequestManager::Observer {
- public:
-  explicit PermissionRequestObserver(content::WebContents* web_contents)
-      : request_manager_(permissions::PermissionRequestManager::FromWebContents(
-            web_contents)),
-        request_shown_(false) {
-    request_manager_->AddObserver(this);
-  }
-  ~PermissionRequestObserver() override {
-    // Safe to remove twice if it happens.
-    request_manager_->RemoveObserver(this);
-  }
-
-  bool request_shown() { return request_shown_; }
-
- private:
-  // PermissionRequestManager::Observer
-  void OnBubbleAdded() override {
-    request_shown_ = true;
-    request_manager_->RemoveObserver(this);
-  }
-
-  permissions::PermissionRequestManager* request_manager_;
-  bool request_shown_;
-
-  DISALLOW_COPY_AND_ASSIGN(PermissionRequestObserver);
-};
-
 // Handles HTTP requests to |path| with |content| as the response body.
 // |content| is expected to be JavaScript; the response mime type is always set
 // to "text/javascript".
@@ -117,7 +85,7 @@
 // https://w3c.github.io/wake-lock/#request-static-method
 // Screen locks are never allowed from workers.
 IN_PROC_BROWSER_TEST_F(WakeLockBrowserTest, RequestScreenLockFromWorker) {
-  PermissionRequestObserver observer(
+  permissions::PermissionRequestObserver observer(
       browser()->tab_strip_model()->GetActiveWebContents());
   const std::string kWorkerScript =
       "navigator.wakeLock.request('screen').catch(err => "
@@ -129,13 +97,13 @@
       "NotAllowedError",
       content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(),
                       "waitForMessage();"));
-  EXPECT_EQ(observer.request_shown(), false);
+  EXPECT_FALSE(observer.request_shown());
 }
 
 // Requests for a system lock should always be denied, and there should be no
 // permission prompt.
 IN_PROC_BROWSER_TEST_F(WakeLockBrowserTest, RequestSystemLockFromWorker) {
-  PermissionRequestObserver observer(
+  permissions::PermissionRequestObserver observer(
       browser()->tab_strip_model()->GetActiveWebContents());
   const std::string kWorkerScript =
       "navigator.wakeLock.request('system').catch(err => "
@@ -147,7 +115,7 @@
       "NotAllowedError",
       content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(),
                       "waitForMessage();"));
-  EXPECT_EQ(observer.request_shown(), false);
+  EXPECT_FALSE(observer.request_shown());
 }
 
 IN_PROC_BROWSER_TEST_F(WakeLockBrowserTest, RequestPermissionScreen) {
@@ -155,13 +123,13 @@
   // permission prompt.
   NavigateToSimplePage();
 
-  PermissionRequestObserver observer(
+  permissions::PermissionRequestObserver observer(
       browser()->tab_strip_model()->GetActiveWebContents());
   EXPECT_EQ("granted", content::EvalJs(
                            browser()->tab_strip_model()->GetActiveWebContents(),
                            "navigator.wakeLock.request('screen').then(lock => {"
                            "    lock.release(); return 'granted'; });"));
-  EXPECT_EQ(observer.request_shown(), false);
+  EXPECT_FALSE(observer.request_shown());
 }
 
 IN_PROC_BROWSER_TEST_F(WakeLockBrowserTest,
@@ -170,7 +138,7 @@
   // permission prompt.
   NavigateToSimplePage();
 
-  PermissionRequestObserver observer(
+  permissions::PermissionRequestObserver observer(
       browser()->tab_strip_model()->GetActiveWebContents());
   EXPECT_EQ(
       "granted",
@@ -178,7 +146,7 @@
                       "navigator.wakeLock.request('screen').then(lock => {"
                       "    lock.release(); return 'granted'; });",
                       content::EvalJsOptions::EXECUTE_SCRIPT_NO_USER_GESTURE));
-  EXPECT_EQ(observer.request_shown(), false);
+  EXPECT_FALSE(observer.request_shown());
 }
 
 IN_PROC_BROWSER_TEST_F(WakeLockBrowserTest, RequestPermissionSystem) {
@@ -186,14 +154,14 @@
   // permission prompt.
   NavigateToSimplePage();
 
-  PermissionRequestObserver observer(
+  permissions::PermissionRequestObserver observer(
       browser()->tab_strip_model()->GetActiveWebContents());
   EXPECT_EQ(
       "NotAllowedError",
       content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(),
                       "navigator.wakeLock.request('system').catch(err => {"
                       "    return err.name; });"));
-  EXPECT_EQ(observer.request_shown(), false);
+  EXPECT_FALSE(observer.request_shown());
 }
 
 IN_PROC_BROWSER_TEST_F(WakeLockBrowserTest,
@@ -202,7 +170,7 @@
   // permission prompt.
   NavigateToSimplePage();
 
-  PermissionRequestObserver observer(
+  permissions::PermissionRequestObserver observer(
       browser()->tab_strip_model()->GetActiveWebContents());
   EXPECT_EQ(
       "NotAllowedError",
@@ -210,5 +178,5 @@
                       "navigator.wakeLock.request('system').catch(err => {"
                       "    return err.name; });",
                       content::EvalJsOptions::EXECUTE_SCRIPT_NO_USER_GESTURE));
-  EXPECT_EQ(observer.request_shown(), false);
+  EXPECT_FALSE(observer.request_shown());
 }
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc
index 99a8852..825a7ec1 100644
--- a/chrome/common/webui_url_constants.cc
+++ b/chrome/common/webui_url_constants.cc
@@ -10,10 +10,6 @@
 #include "components/safe_browsing/core/web_ui/constants.h"
 #include "extensions/buildflags/buildflags.h"
 
-#if defined(OS_CHROMEOS)
-#include "chromeos/constants/chromeos_features.h"
-#endif
-
 namespace chrome {
 
 // Please keep this file in the same order as the header.
@@ -485,6 +481,9 @@
       kStorageSubPage,
       kStylusSubPage,
       kSwitchAccessSubPage,
+      // kSyncSetupSubPage is both an OS and browser sub page, but prefer the
+      // browser version. Delete this comment when SplitSettingsSync is the
+      // default, because it will introduce an "osSync" sub-page.
       kVPNSettingsSubPage,
       kWiFiSettingsSubPage,
   };
@@ -494,12 +493,6 @@
   if (index != std::string::npos)
     sub_page_without_query.resize(index);
 
-  // SplitSettingsSync doesn't use the same sync subpage as browser.
-  if (!chromeos::features::IsSplitSettingsSyncEnabled() &&
-      sub_page_without_query == kSyncSetupSubPage) {
-    return true;
-  }
-
   for (const char* p : kSubPages) {
     if (sub_page_without_query == p)
       return true;
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index b71c6ea..eb50f97 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -5405,6 +5405,7 @@
       sources += [
         "../browser/ui/views/frame/opaque_browser_frame_view_layout_unittest.cc",
         "../browser/ui/views/sync/one_click_signin_dialog_view_unittest.cc",
+        "../browser/ui/views/sync/profile_signin_confirmation_dialog_views_unittest.cc",
       ]
     }
     if ((is_linux && !is_chromeos) || is_win) {
diff --git a/chrome/test/data/banners/manifest_bad_badge.json b/chrome/test/data/banners/manifest_bad_badge.json
deleted file mode 100644
index fc551c7..0000000
--- a/chrome/test/data/banners/manifest_bad_badge.json
+++ /dev/null
@@ -1,39 +0,0 @@
-{
-  "name": "Manifest test app",
-  "icons": [
-    {
-      "src": "launcher-icon-1x.png",
-      "sizes": "48x48",
-      "type": "image/png"
-    },
-    {
-      "src": "launcher-icon-1-5x.png",
-      "sizes": "72x72",
-      "type": "image/png"
-    },
-    {
-      "src": "bad_icon.png",
-      "sizes": "96x96",
-      "type": "image/png",
-      "purpose": "any badge"
-    },
-    {
-      "src": "launcher-icon-3x.png",
-      "sizes": "144x144",
-      "type": "image/png"
-    },
-    {
-      "src": "launcher-icon-4x.png",
-      "sizes": "192x192",
-      "type": "image/png"
-    },
-    {
-      "src": "image-512px.png",
-      "sizes": "512x512",
-      "type": "image/png"
-    }
-  ],
-  "start_url": "manifest_test_page.html",
-  "display": "standalone",
-  "orientation": "landscape"
-}
\ No newline at end of file
diff --git a/chrome/test/data/banners/manifest_bad_maskable.json b/chrome/test/data/banners/manifest_bad_maskable.json
new file mode 100644
index 0000000..70ef118
--- /dev/null
+++ b/chrome/test/data/banners/manifest_bad_maskable.json
@@ -0,0 +1,20 @@
+{
+  "name": "Manifest test app",
+  "icons": [
+    {
+      "src": "bad_icon.png",
+      "sizes": "192x192",
+      "type": "image/png",
+      "purpose": "maskable"
+    },
+    {
+      "src": "launcher-icon-4x.png",
+      "sizes": "192x192",
+      "type": "image/png",
+      "purpose": "any"
+    }
+  ],
+  "start_url": "manifest_test_page.html",
+  "display": "standalone",
+  "orientation": "landscape"
+}
diff --git a/chrome/test/data/banners/manifest_bad_non_maskable_icon.json b/chrome/test/data/banners/manifest_bad_non_maskable_icon.json
new file mode 100644
index 0000000..ae824b2
--- /dev/null
+++ b/chrome/test/data/banners/manifest_bad_non_maskable_icon.json
@@ -0,0 +1,19 @@
+{
+  "name": "Manifest test app",
+  "icons": [
+    {
+      "src": "launcher-icon-4x.png",
+      "sizes": "192x192",
+      "type": "image/png",
+      "purpose": "maskable"
+    },
+    {
+      "src": "bad_icon.png",
+      "sizes": "512x512",
+      "type": "image/png"
+    }
+  ],
+  "start_url": "manifest_test_page.html",
+  "display": "standalone",
+  "orientation": "landscape"
+}
diff --git a/chrome/test/data/banners/manifest_one_bad_maskable.json b/chrome/test/data/banners/manifest_one_bad_maskable.json
new file mode 100644
index 0000000..905f6531
--- /dev/null
+++ b/chrome/test/data/banners/manifest_one_bad_maskable.json
@@ -0,0 +1,14 @@
+{
+  "name": "Manifest test app",
+  "icons": [
+    {
+      "src": "bad_icon.png",
+      "sizes": "192x192",
+      "type": "image/png",
+      "purpose": "maskable"
+    }
+  ],
+  "start_url": "manifest_test_page.html",
+  "display": "standalone",
+  "orientation": "landscape"
+}
diff --git a/chrome/test/data/banners/manifest_one_maskable.json b/chrome/test/data/banners/manifest_one_maskable.json
new file mode 100644
index 0000000..045931f7
--- /dev/null
+++ b/chrome/test/data/banners/manifest_one_maskable.json
@@ -0,0 +1,14 @@
+{
+  "name": "Manifest test app",
+  "icons": [
+    {
+      "src": "image-512px.png",
+      "sizes": "512x512",
+      "type": "image/png",
+      "purpose": "maskable"
+    }
+  ],
+  "start_url": "manifest_test_page.html",
+  "display": "standalone",
+  "orientation": "landscape"
+}
diff --git a/chrome/test/data/webui/settings/chromeos/fake_quick_unlock_private.js b/chrome/test/data/webui/settings/chromeos/fake_quick_unlock_private.js
index f60553f..bd3a9f0 100644
--- a/chrome/test/data/webui/settings/chromeos/fake_quick_unlock_private.js
+++ b/chrome/test/data/webui/settings/chromeos/fake_quick_unlock_private.js
@@ -39,7 +39,7 @@
   FakeQuickUnlockPrivate.prototype = {
     // Public testing methods.
     getFakeToken: function() {
-      return FAKE_TOKEN;
+      return {token: FAKE_TOKEN, lifetime: 0};
     },
 
     // Public fake API implementations.
diff --git a/chrome/test/data/webui/settings/chromeos/multidevice_page_tests.js b/chrome/test/data/webui/settings/chromeos/multidevice_page_tests.js
index 73401a1..ce44e00 100644
--- a/chrome/test/data/webui/settings/chromeos/multidevice_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/multidevice_page_tests.js
@@ -59,8 +59,10 @@
     if (authRequired) {
       assertTrue(multidevicePage.showPasswordPromptDialog_);
       // Simulate the user entering a valid password, then closing the dialog.
-      multidevicePage.$$('#multidevicePasswordPrompt').authToken =
-          'validAuthToken';
+      multidevicePage.$$('#multidevicePasswordPrompt').fire('token-obtained', {
+        token: 'validAuthToken',
+        lifetimeSeconds: 300
+      });
       // Simulate closing the password prompt dialog
       multidevicePage.$$('#multidevicePasswordPrompt').fire('close');
       Polymer.dom.flush();
diff --git a/chrome/test/data/webui/settings/chromeos/os_people_page_test.js b/chrome/test/data/webui/settings/chromeos/os_people_page_test.js
index 74c86a8..ca070a4 100644
--- a/chrome/test/data/webui/settings/chromeos/os_people_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/os_people_page_test.js
@@ -203,5 +203,53 @@
           settings.Router.getInstance().getCurrentRoute(),
           settings.routes.ACCOUNT_MANAGER);
     });
+
+    test('Fingerprint dialog closes when token expires', async () => {
+      loadTimeData.overrideValues({
+        fingerprintUnlockEnabled: true,
+      });
+
+      peoplePage = document.createElement('os-settings-people-page');
+      document.body.appendChild(peoplePage);
+
+      await accountManagerBrowserProxy.whenCalled('getAccounts');
+      await syncBrowserProxy.whenCalled('getSyncStatus');
+      quickUnlockPrivateApi = new settings.FakeQuickUnlockPrivate();
+      peoplePage.authToken_ = quickUnlockPrivateApi.getFakeToken();
+
+      settings.Router.getInstance().navigateTo(settings.routes.LOCK_SCREEN);
+      Polymer.dom.flush();
+
+      const subpageTrigger = peoplePage.$$('#lock-screen-subpage-trigger');
+      // Sub-page trigger navigates to the lock screen page.
+      subpageTrigger.click();
+      Polymer.dom.flush();
+
+      assertEquals(
+          settings.Router.getInstance().getCurrentRoute(),
+          settings.routes.LOCK_SCREEN);
+      const lockScreenPage = assert(peoplePage.$$('#lock-screen'));
+
+      // Password dialog should not open because the authToken_ is set.
+      assertFalse(lockScreenPage.showPasswordPromptDialog_);
+
+      const editFingerprintsTrigger = lockScreenPage.$$('#editFingerprints');
+      editFingerprintsTrigger.click();
+      Polymer.dom.flush();
+
+      assertEquals(
+          settings.Router.getInstance().getCurrentRoute(),
+          settings.routes.FINGERPRINT);
+
+      const fingerprintTrigger =
+          peoplePage.$$('#fingerprint-list').$$('#addFingerprint');
+      fingerprintTrigger.click();
+      peoplePage.authToken_ = undefined;
+
+      assertEquals(
+          settings.Router.getInstance().getCurrentRoute(),
+          settings.routes.LOCK_SCREEN);
+      assertTrue(lockScreenPage.showPasswordPromptDialog_);
+    });
   });
 });
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 42cc0fd8..a5f376d 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -891,10 +891,13 @@
   /** @override */
   get extraLibraries() {
     return super.extraLibraries.concat([
+      BROWSER_SETTINGS_PATH + '../fake_chrome_event.js',
       BROWSER_SETTINGS_PATH + '../test_browser_proxy.js',
       BROWSER_SETTINGS_PATH + 'sync_test_util.js',
       BROWSER_SETTINGS_PATH + 'test_profile_info_browser_proxy.js',
       BROWSER_SETTINGS_PATH + 'test_sync_browser_proxy.js',
+      BROWSER_SETTINGS_PATH +
+          '../settings/chromeos/fake_quick_unlock_private.js',
       'os_people_page_test.js',
     ]);
   }
diff --git a/chrome/test/data/webui/settings/chromeos/quick_unlock_authenticate_browsertest_chromeos.js b/chrome/test/data/webui/settings/chromeos/quick_unlock_authenticate_browsertest_chromeos.js
index 65ae98c..f1a4229 100644
--- a/chrome/test/data/webui/settings/chromeos/quick_unlock_authenticate_browsertest_chromeos.js
+++ b/chrome/test/data/webui/settings/chromeos/quick_unlock_authenticate_browsertest_chromeos.js
@@ -74,6 +74,7 @@
     suite('authenticate', function() {
       let passwordPromptDialog = null;
       let passwordElement = null;
+      let authTokenObtainedFired = false;
 
       setup(function() {
         PolymerTest.clearBody();
@@ -84,6 +85,9 @@
         testElement = document.createElement(
             'settings-lock-screen-password-prompt-dialog');
         testElement.writeUma_ = fakeUma.recordProgress.bind(fakeUma);
+        testElement.addEventListener('auth-token-obtained', (e) => {
+          authTokenObtainedFired = true;
+        });
         document.body.appendChild(testElement);
 
         passwordPromptDialog = getFromElement('#passwordPrompt');
@@ -155,7 +159,7 @@
             0,
             fakeUma.getHistogramValue(
                 LockScreenProgress.ENTER_PASSWORD_CORRECTLY));
-        assertFalse(!!testElement.setModes);
+        assertFalse(authTokenObtainedFired);
       });
 
       // A valid password provides an authenticated setModes object, and a
@@ -170,7 +174,7 @@
             1,
             fakeUma.getHistogramValue(
                 LockScreenProgress.ENTER_PASSWORD_CORRECTLY));
-        assertTrue(!!testElement.setModes);
+        assertTrue(authTokenObtainedFired);
       });
 
       // The setModes objects times out after a delay.
@@ -298,8 +302,8 @@
               Polymer.dom.flush();
 
               testElement.setModes_ = quickUnlockPrivateApi.setModes.bind(
-                  quickUnlockPrivateApi, quickUnlockPrivateApi.getFakeToken(),
-                  [], [], () => {
+                  quickUnlockPrivateApi,
+                  quickUnlockPrivateApi.getFakeToken().token, [], [], () => {
                     return true;
                   });
 
@@ -360,6 +364,7 @@
           assertFalse(isSetupPinButtonVisible());
           assertDeepEquals([], quickUnlockPrivateApi.activeModes);
         }
+        testElement.authToken = quickUnlockPrivateApi.getFakeToken();
 
         // Verify toggling PIN on/off does not disable screen lock.
         setLockScreenPref(true);
@@ -433,7 +438,8 @@
         const testPinKeyboard = testElement.$.pinKeyboard;
         testPinKeyboard.setModes = (modes, credentials, onComplete) => {
           quickUnlockPrivateApi.setModes(
-              quickUnlockPrivateApi.getFakeToken(), modes, credentials, () => {
+              quickUnlockPrivateApi.getFakeToken().token, modes, credentials,
+              () => {
                 onComplete(true);
               });
         };
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index 8b6727f..3ab7c3cb 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -1260,6 +1260,35 @@
 
 /**
  * Test fixture for
+ * chrome/browser/resources/settings/site_settings_page/
+ * recent_site_permissions.js
+ * @constructor
+ * @extends {CrSettingsBrowserTest}
+ */
+function CrSettingsRecentSitePermissionsTest() {}
+
+CrSettingsRecentSitePermissionsTest.prototype = {
+  __proto__: CrSettingsBrowserTest.prototype,
+
+  /** @override */
+  browsePreload: 'chrome://settings/recent_site_permissions.html',
+
+  /** @override */
+  extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
+    '../test_browser_proxy.js',
+    '../test_util.js',
+    'test_site_settings_prefs_browser_proxy.js',
+    'test_util.js',
+    'recent_site_permissions_test.js',
+  ]),
+};
+
+TEST_F('CrSettingsRecentSitePermissionsTest', 'All', function() {
+  mocha.run();
+});
+
+/**
+ * Test fixture for
  * chrome/browser/resources/settings/privacy_page/security_page.html.
  * @constructor
  * @extends {CrSettingsBrowserTest}
diff --git a/chrome/test/data/webui/settings/recent_site_permissions_test.js b/chrome/test/data/webui/settings/recent_site_permissions_test.js
new file mode 100644
index 0000000..be99330b
--- /dev/null
+++ b/chrome/test/data/webui/settings/recent_site_permissions_test.js
@@ -0,0 +1,71 @@
+// 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.
+
+suite('CrSettingsRecentSitePermissionsTest', function() {
+  /**
+   * The mock proxy object to use during test.
+   * @type {TestSiteSettingsPrefsBrowserProxy}
+   */
+  let browserProxy = null;
+
+  /** @type {SettingsRecentSitePermissionsElement} */
+  let testElement;
+
+  setup(function() {
+    browserProxy = new TestSiteSettingsPrefsBrowserProxy();
+    settings.SiteSettingsPrefsBrowserProxyImpl.instance_ = browserProxy;
+
+    PolymerTest.clearBody();
+    testElement = document.createElement('settings-recent-site-permissions');
+    document.body.appendChild(testElement);
+    Polymer.dom.flush();
+  });
+
+  test('No recent permissions', async function() {
+    browserProxy.setResultFor('getRecentSitePermissions', Promise.resolve([]));
+    await testElement.populateList();
+    assertTrue(test_util.isVisible(testElement, '#noPermissionsText'));
+  });
+
+  test('Various recent permissions', async function() {
+    const mock_data = Promise.resolve([
+      {
+        origin: 'https://bar.com',
+        incognito: true,
+        recentPermissions:
+            [{setting: settings.ContentSetting.BLOCK, displayName: 'location'}]
+      },
+      {
+        origin: 'https://bar.com',
+        recentPermissions: [
+          {setting: settings.ContentSetting.ALLOW, displayName: 'notifications'}
+        ]
+      },
+      {
+        origin: 'http://foo.com',
+        recentPermissions: [
+          {setting: settings.ContentSetting.BLOCK, displayName: 'popups'}, {
+            setting: settings.ContentSetting.BLOCK,
+            displayName: 'clipboard',
+            source: settings.SiteSettingSource.EMBARGO
+          }
+        ]
+      },
+    ]);
+    browserProxy.setResultFor('getRecentSitePermissions', mock_data);
+
+    await testElement.populateList();
+    assertFalse(testElement.noRecentPermissions);
+    assertFalse(test_util.isChildVisible(testElement, '#noPermissionsText'));
+
+    const siteEntries = testElement.shadowRoot.querySelectorAll('.link-button');
+    assertEquals(3, siteEntries.length);
+
+    const incognitoIcons =
+        testElement.shadowRoot.querySelectorAll('.incognito-icon');
+    assertTrue(test_util.isVisible(incognitoIcons[0]));
+    assertFalse(test_util.isVisible(incognitoIcons[1]));
+    assertFalse(test_util.isVisible(incognitoIcons[2]));
+  });
+});
diff --git a/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js b/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js
index 52a60643..d5890f4 100644
--- a/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js
+++ b/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js
@@ -28,6 +28,7 @@
       'fetchBlockAutoplayStatus',
       'fetchZoomLevels',
       'getAllSites',
+      'getRecentSitePermissions',
       'getChooserExceptionList',
       'getDefaultValueForContentType',
       'getFormattedBytes',
@@ -237,6 +238,12 @@
   }
 
   /** @override */
+  getRecentSitePermissions(contentTypes, numSources) {
+    this.methodCalled('getRecentSitePermissions', contentTypes);
+    return this.getResultFor('getRecentSitePermissions');
+  }
+
+  /** @override */
   getFormattedBytes(numBytes) {
     this.methodCalled('getFormattedBytes', numBytes);
     return Promise.resolve(`${numBytes} B`);
diff --git a/chromecast/media/cma/backend/android/audio_decoder_android.cc b/chromecast/media/cma/backend/android/audio_decoder_android.cc
index c2b5a188..d9effc8 100644
--- a/chromecast/media/cma/backend/android/audio_decoder_android.cc
+++ b/chromecast/media/cma/backend/android/audio_decoder_android.cc
@@ -313,10 +313,12 @@
   }
 
   // Create a decoder.
-  decoder_ = CastAudioDecoder::Create(
-      task_runner_, config_, kDecoderSampleFormat,
-      base::BindOnce(&AudioDecoderAndroid::OnDecoderInitialized,
-                     base::Unretained(this)));
+  decoder_ =
+      CastAudioDecoder::Create(task_runner_, config_, kDecoderSampleFormat);
+  if (!decoder_) {
+    LOG(INFO) << __func__ << ": Decoder initialization was unsuccessful";
+    delegate_->OnDecoderError();
+  }
 }
 
 void AudioDecoderAndroid::CreateRateShifter(const AudioConfig& config) {
@@ -373,15 +375,6 @@
   return delay;
 }
 
-void AudioDecoderAndroid::OnDecoderInitialized(bool success) {
-  TRACE_FUNCTION_ENTRY0();
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  LOG(INFO) << __func__ << ": Decoder initialization was "
-            << (success ? "successful" : "unsuccessful");
-  if (!success)
-    delegate_->OnDecoderError();
-}
-
 void AudioDecoderAndroid::OnBufferDecoded(
     uint64_t input_bytes,
     CastAudioDecoder::Status status,
diff --git a/chromecast/media/cma/backend/android/audio_decoder_android.h b/chromecast/media/cma/backend/android/audio_decoder_android.h
index aab43905..d03d6dc6 100644
--- a/chromecast/media/cma/backend/android/audio_decoder_android.h
+++ b/chromecast/media/cma/backend/android/audio_decoder_android.h
@@ -79,7 +79,6 @@
   void ResetSinkForNewConfig(const AudioConfig& config);
   void CreateDecoder();
   void CreateRateShifter(const AudioConfig& config);
-  void OnDecoderInitialized(bool success);
   void OnBufferDecoded(uint64_t input_bytes,
                        CastAudioDecoder::Status status,
                        const AudioConfig& config,
diff --git a/chromecast/media/cma/backend/audio_decoder_for_mixer.cc b/chromecast/media/cma/backend/audio_decoder_for_mixer.cc
index 216308a..f1e6ff9 100644
--- a/chromecast/media/cma/backend/audio_decoder_for_mixer.cc
+++ b/chromecast/media/cma/backend/audio_decoder_for_mixer.cc
@@ -144,15 +144,15 @@
 bool AudioDecoderForMixer::Start(int64_t playback_start_pts,
                                  bool start_playback_asap) {
   TRACE_FUNCTION_ENTRY0();
-  DCHECK(IsValidConfig(config_));
-
-  CreateMixerInput(config_, start_playback_asap);
+  DCHECK(IsValidConfig(input_config_));
 
   // Create decoder_ if necessary. This can happen if Stop() was called, and
   // SetConfig() was not called since then.
   if (!decoder_) {
     CreateDecoder();
   }
+  decoded_config_ = (decoder_ ? decoder_->GetOutputConfig() : input_config_);
+  CreateMixerInput(decoded_config_, start_playback_asap);
   playback_start_pts_ = playback_start_pts;
   start_playback_asap_ = start_playback_asap;
 
@@ -316,7 +316,10 @@
     return MediaPipelineBackend::kBufferPending;
   }
 
-  DCHECK(decoder_);
+  if (!decoder_) {
+    return MediaPipelineBackend::kBufferFailed;
+  }
+
   // Decode the buffer.
   decoder_->Decode(std::move(buffer_base),
                    base::BindOnce(&AudioDecoderForMixer::OnBufferDecoded,
@@ -345,18 +348,21 @@
     return false;
   }
 
-  bool changed_config =
-      (config.samples_per_second != config_.samples_per_second ||
-       config.channel_number != config_.channel_number);
-
-  if (mixer_input_ && changed_config) {
-    ResetMixerInputForNewConfig(config);
-  }
-
-  config_ = config;
+  input_config_ = config;
   decoder_.reset();
   CreateDecoder();
 
+  auto decoded_config =
+      (decoder_ ? decoder_->GetOutputConfig() : input_config_);
+  bool changed_config =
+      (decoded_config.samples_per_second !=
+           decoded_config_.samples_per_second ||
+       decoded_config.channel_number != decoded_config_.channel_number);
+  decoded_config_ = decoded_config;
+  if (mixer_input_ && changed_config) {
+    ResetMixerInputForNewConfig(decoded_config);
+  }
+
   if (pending_buffer_complete_ && changed_config) {
     pending_buffer_complete_ = false;
     delegate_->OnPushBufferComplete(MediaPipelineBackend::kBufferSuccess);
@@ -379,7 +385,7 @@
 
 void AudioDecoderForMixer::CreateDecoder() {
   DCHECK(!decoder_);
-  DCHECK(IsValidConfig(config_));
+  DCHECK(IsValidConfig(input_config_));
 
   // No need to create a decoder if the samples are already decoded.
   if (BypassDecoder()) {
@@ -388,10 +394,12 @@
   }
 
   // Create a decoder.
-  decoder_ = CastAudioDecoder::Create(
-      task_runner_, config_, kDecoderSampleFormat,
-      base::BindOnce(&AudioDecoderForMixer::OnDecoderInitialized,
-                     base::Unretained(this)));
+  decoder_ = CastAudioDecoder::Create(task_runner_, input_config_,
+                                      kDecoderSampleFormat);
+  if (!decoder_) {
+    LOG(ERROR) << "Failed to create audio decoder";
+    delegate_->OnDecoderError();
+  }
 }
 
 bool AudioDecoderForMixer::SetVolume(float multiplier) {
@@ -411,7 +419,7 @@
 
   AudioDecoderForMixer::RenderingDelay delay = next_buffer_delay_;
   if (delay.timestamp_microseconds != INT64_MIN) {
-    double usec_per_sample = 1000000.0 / config_.samples_per_second;
+    double usec_per_sample = 1000000.0 / decoded_config_.samples_per_second;
     double queued_output_frames = 0.0;
 
     // Account for data that is in the process of being pushed to the mixer.
@@ -424,15 +432,6 @@
   return delay;
 }
 
-void AudioDecoderForMixer::OnDecoderInitialized(bool success) {
-  TRACE_FUNCTION_ENTRY0();
-  DCHECK(task_runner_->BelongsToCurrentThread());
-  LOG(INFO) << "Decoder initialization was "
-            << (success ? "successful" : "unsuccessful");
-  if (!success)
-    delegate_->OnDecoderError();
-}
-
 void AudioDecoderForMixer::OnBufferDecoded(
     uint64_t input_bytes,
     bool has_config,
@@ -463,29 +462,30 @@
 
   if (has_config) {
     bool changed_config = false;
-    if (config.samples_per_second != config_.samples_per_second) {
+    if (config.samples_per_second != decoded_config_.samples_per_second) {
       LOG(INFO) << "Input sample rate changed from "
-                << config_.samples_per_second << " to "
+                << decoded_config_.samples_per_second << " to "
                 << config.samples_per_second;
-      config_.samples_per_second = config.samples_per_second;
+      decoded_config_.samples_per_second = config.samples_per_second;
       changed_config = true;
     }
-    if (config.channel_number != config_.channel_number) {
-      LOG(INFO) << "Input channel count changed from " << config_.channel_number
-                << " to " << config.channel_number;
-      config_.channel_number = config.channel_number;
+    if (config.channel_number != decoded_config_.channel_number) {
+      LOG(INFO) << "Input channel count changed from "
+                << decoded_config_.channel_number << " to "
+                << config.channel_number;
+      decoded_config_.channel_number = config.channel_number;
       changed_config = true;
     }
     if (changed_config) {
       // Config from actual stream doesn't match supposed config from the
       // container. Update the mixer.
-      ResetMixerInputForNewConfig(config_);
+      ResetMixerInputForNewConfig(decoded_config_);
     }
   }
 
   if (!decoded->end_of_stream()) {
     pending_output_frames_ =
-        decoded->data_size() / (config_.channel_number * sizeof(float));
+        decoded->data_size() / (decoded_config_.channel_number * sizeof(float));
     last_push_pts_ = decoded->timestamp();
     last_push_playout_timestamp_ =
         (next_buffer_delay_.timestamp_microseconds == kInvalidTimestamp
@@ -508,8 +508,8 @@
 bool AudioDecoderForMixer::BypassDecoder() const {
   DCHECK(task_runner_->BelongsToCurrentThread());
   // The mixer input requires planar float PCM data.
-  return (config_.codec == kCodecPCM &&
-          config_.sample_format == kSampleFormatPlanarF32);
+  return (input_config_.codec == kCodecPCM &&
+          input_config_.sample_format == kSampleFormatPlanarF32);
 }
 
 void AudioDecoderForMixer::WritePcm(scoped_refptr<DecoderBufferBase> buffer) {
@@ -523,7 +523,7 @@
     return;
   }
 
-  const int frame_size = sizeof(float) * config_.channel_number;
+  const int frame_size = sizeof(float) * decoded_config_.channel_number;
   const int original_frame_count = buffer->data_size() / frame_size;
   if (original_frame_count == 0) {
     // Don't send empty buffers since it is interpreted as EOS.
@@ -535,7 +535,7 @@
   DCHECK_GT(frame_count, 0);
 
   if (frame_count > buffer_pool_frames_) {
-    CreateBufferPool(config_, frame_count * 2);
+    CreateBufferPool(decoded_config_, frame_count * 2);
   }
 
   auto io_buffer = buffer_pool_->GetBuffer();
diff --git a/chromecast/media/cma/backend/audio_decoder_for_mixer.h b/chromecast/media/cma/backend/audio_decoder_for_mixer.h
index cd65c86..b326aaa 100644
--- a/chromecast/media/cma/backend/audio_decoder_for_mixer.h
+++ b/chromecast/media/cma/backend/audio_decoder_for_mixer.h
@@ -82,7 +82,6 @@
   void ResetMixerInputForNewConfig(const AudioConfig& config);
   void CreateDecoder();
 
-  void OnDecoderInitialized(bool success);
   void OnBufferDecoded(uint64_t input_bytes,
                        bool has_config,
                        CastAudioDecoder::Status status,
@@ -106,7 +105,8 @@
   bool reported_ready_for_playback_ = false;
   RenderingDelay mixer_delay_;
 
-  AudioConfig config_;
+  AudioConfig input_config_;
+  AudioConfig decoded_config_;
   std::unique_ptr<CastAudioDecoder> decoder_;
 
   double av_sync_clock_rate_ = 1.0;
diff --git a/chromecast/media/cma/backend/audio_decoder_software_wrapper.cc b/chromecast/media/cma/backend/audio_decoder_software_wrapper.cc
index ec0fec4d..089d76f 100644
--- a/chromecast/media/cma/backend/audio_decoder_software_wrapper.cc
+++ b/chromecast/media/cma/backend/audio_decoder_software_wrapper.cc
@@ -101,19 +101,7 @@
 
   LOG(INFO) << "Using software decoder for " << config.codec;
 
-  output_config_.codec = media::kCodecPCM;
-  output_config_.sample_format = media::kSampleFormatS16;
-  // The underlying software decoder will always convert mono to stereo,
-  // so set output stereo in the case of mono input.
-  if (config.channel_number == kMonoChannelCount) {
-    output_config_.channel_number = kStereoChannelCount;
-  } else {
-    output_config_.channel_number = config.channel_number;
-  }
-  output_config_.bytes_per_channel = 2;
-  output_config_.samples_per_second = config.samples_per_second;
-  output_config_.encryption_scheme = EncryptionScheme::kUnencrypted;
-  output_config_.channel_layout = config.channel_layout;
+  output_config_ = software_decoder_->GetOutputConfig();
   return backend_decoder_->SetConfig(output_config_);
 }
 
@@ -140,20 +128,13 @@
   // TODO(kmackay) Consider using planar float instead.
   software_decoder_ = media::CastAudioDecoder::Create(
       base::ThreadTaskRunnerHandle::Get(), config,
-      media::CastAudioDecoder::kOutputSigned16,
-      base::BindOnce(&AudioDecoderSoftwareWrapper::OnDecoderInitialized,
-                     base::Unretained(this)));
-  return (software_decoder_.get() != nullptr);
-}
-
-void AudioDecoderSoftwareWrapper::OnDecoderInitialized(bool success) {
-  if (!success) {
+      media::CastAudioDecoder::kOutputSigned16);
+  if (!software_decoder_) {
     decoder_error_ = true;
     LOG(ERROR) << "Failed to initialize software decoder";
-    if (delegate_) {
-      delegate_->OnDecoderError();
-    }
+    return false;
   }
+  return true;
 }
 
 void AudioDecoderSoftwareWrapper::OnDecodedBuffer(
diff --git a/chromecast/media/cma/backend/audio_decoder_software_wrapper.h b/chromecast/media/cma/backend/audio_decoder_software_wrapper.h
index e0cc59cd..5d558815 100644
--- a/chromecast/media/cma/backend/audio_decoder_software_wrapper.h
+++ b/chromecast/media/cma/backend/audio_decoder_software_wrapper.h
@@ -41,7 +41,6 @@
 
  private:
   bool CreateSoftwareDecoder(const AudioConfig& config);
-  void OnDecoderInitialized(bool success);
   void OnDecodedBuffer(CastAudioDecoder::Status status,
                        const media::AudioConfig& config,
                        scoped_refptr<DecoderBufferBase> decoded);
diff --git a/chromecast/media/cma/base/decoder_config_adapter.cc b/chromecast/media/cma/base/decoder_config_adapter.cc
index 6262469..7131b43 100644
--- a/chromecast/media/cma/base/decoder_config_adapter.cc
+++ b/chromecast/media/cma/base/decoder_config_adapter.cc
@@ -220,8 +220,7 @@
   audio_config.sample_format = ToSampleFormat(config.sample_format());
   audio_config.bytes_per_channel = config.bytes_per_channel();
   audio_config.channel_layout = ToChannelLayout(config.channel_layout());
-  audio_config.channel_number =
-      ::media::ChannelLayoutToChannelCount(config.channel_layout()),
+  audio_config.channel_number = config.channels();
   audio_config.samples_per_second = config.samples_per_second();
   audio_config.extra_data = config.extra_data();
   audio_config.encryption_scheme =
@@ -240,11 +239,15 @@
 // static
 ::media::AudioDecoderConfig DecoderConfigAdapter::ToMediaAudioDecoderConfig(
     const AudioConfig& config) {
-  return ::media::AudioDecoderConfig(
+  ::media::AudioDecoderConfig audio_decoder_config(
       ToMediaAudioCodec(config.codec),
       ToMediaSampleFormat(config.sample_format),
       ToMediaChannelLayout(config.channel_layout), config.samples_per_second,
       config.extra_data, ToMediaEncryptionScheme(config.encryption_scheme));
+  if (config.channel_layout == ChannelLayout::DISCRETE) {
+    audio_decoder_config.SetChannelsForDiscrete(config.channel_number);
+  }
+  return audio_decoder_config;
 }
 
 // static
diff --git a/chromecast/media/cma/decoder/cast_audio_decoder.cc b/chromecast/media/cma/decoder/cast_audio_decoder.cc
index 1f06881..e20bcbc 100644
--- a/chromecast/media/cma/decoder/cast_audio_decoder.cc
+++ b/chromecast/media/cma/decoder/cast_audio_decoder.cc
@@ -39,52 +39,53 @@
 class CastAudioDecoderImpl : public CastAudioDecoder {
  public:
   CastAudioDecoderImpl(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-                       InitializedCallback initialized_callback,
                        OutputFormat output_format)
       : task_runner_(std::move(task_runner)),
-        initialized_callback_(std::move(initialized_callback)),
         output_format_(output_format),
-        initialized_(false),
-        decode_pending_(false),
         weak_factory_(this) {
     weak_this_ = weak_factory_.GetWeakPtr();
     DCHECK(task_runner_);
-    DCHECK(initialized_callback_);
   }
 
-  void Initialize(const media::AudioConfig& config) {
+  bool Initialize(const media::AudioConfig& config) {
     DCHECK(task_runner_->RunsTasksInCurrentSequence());
     DCHECK(!initialized_);
 
-    config_ = config;
-    if (config_.is_encrypted()) {
-      LOG(ERROR) << "Cannot decode encrypted audio";
-      // TODO(kmackay) Should call OnInitialized(false) here, but that generally
-      // causes the browsertests to crash since it happens during the render
-      // pipeline initialization.
-      config_.encryption_scheme = EncryptionScheme::kUnencrypted;
-    }
+    input_config_ = config;
+    input_config_.encryption_scheme = EncryptionScheme::kUnencrypted;
+
+    output_config_ = input_config_;
+    output_config_.codec = kCodecPCM;
+    output_config_.sample_format =
+        (output_format_ == kOutputSigned16 ? kSampleFormatS16
+                                           : kSampleFormatPlanarF32);
 
     decoder_ = std::make_unique<::media::FFmpegAudioDecoder>(task_runner_,
                                                              &media_log_);
     decoder_->Initialize(
-        media::DecoderConfigAdapter::ToMediaAudioDecoderConfig(config_),
+        media::DecoderConfigAdapter::ToMediaAudioDecoderConfig(input_config_),
         nullptr,
         base::BindRepeating(&CastAudioDecoderImpl::OnInitialized, weak_this_),
         base::BindRepeating(&CastAudioDecoderImpl::OnDecoderOutput, weak_this_),
         base::NullCallback());
     // Unfortunately there is no result from decoder_->Initialize() until later
     // (the pipeline status callback is posted to the task runner).
+    return true;
   }
 
   // CastAudioDecoder implementation:
+  const AudioConfig& GetOutputConfig() const override { return output_config_; }
+
   void Decode(scoped_refptr<media::DecoderBufferBase> data,
               DecodeCallback decode_callback) override {
     DCHECK(decode_callback);
     DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
-    if (data->decrypt_context() != nullptr) {
-      LOG(ERROR) << "Audio decoder doesn't support encrypted stream";
+    if (data->decrypt_context() != nullptr || error_) {
+      if (data->decrypt_context() != nullptr) {
+        LOG(ERROR) << "Audio decoder doesn't support encrypted stream";
+      }
+
       // Post the task to ensure that |decode_callback| is not called from
       // within a call to Decode().
       task_runner_->PostTask(
@@ -106,7 +107,7 @@
   void CallDecodeCallback(DecodeCallback decode_callback,
                           Status status,
                           scoped_refptr<media::DecoderBufferBase> data) {
-    std::move(decode_callback).Run(status, config_, std::move(data));
+    std::move(decode_callback).Run(status, output_config_, std::move(data));
   }
 
   void DecodeNow(scoped_refptr<media::DecoderBufferBase> data,
@@ -136,26 +137,29 @@
 
   void OnInitialized(bool success) {
     DCHECK(!initialized_);
-    DCHECK(initialized_callback_);
+    initialized_ = true;
     if (success) {
-      initialized_ = true;
       if (!decode_queue_.empty()) {
         auto& d = decode_queue_.front();
         DecodeNow(std::move(d.first), std::move(d.second));
         decode_queue_.pop();
       }
-    } else {
-      LOG(ERROR) << "Failed to initialize FFmpegAudioDecoder";
-      LOG(INFO) << "Config:";
-      LOG(INFO) << "\tEncrypted: "
-                << (config_.is_encrypted() ? "true" : "false");
-      LOG(INFO) << "\tCodec: " << config_.codec;
-      LOG(INFO) << "\tSample format: " << config_.sample_format;
-      LOG(INFO) << "\tChannels: " << config_.channel_number;
-      LOG(INFO) << "\tSample rate: " << config_.samples_per_second;
+      return;
     }
 
-    std::move(initialized_callback_).Run(initialized_);
+    error_ = true;
+    LOG(ERROR) << "Failed to initialize audio decoder";
+    LOG(INFO) << "Config:";
+    LOG(INFO) << "\tCodec: " << input_config_.codec;
+    LOG(INFO) << "\tSample format: " << input_config_.sample_format;
+    LOG(INFO) << "\tChannels: " << input_config_.channel_number;
+    LOG(INFO) << "\tSample rate: " << input_config_.samples_per_second;
+
+    while (!decode_queue_.empty()) {
+      auto& d = decode_queue_.front();
+      std::move(d.second).Run(kDecodeError, output_config_, std::move(d.first));
+      decode_queue_.pop();
+    }
   }
 
   void OnDecodeStatus(base::TimeDelta buffer_timestamp,
@@ -170,13 +174,13 @@
       if (status != ::media::DecodeStatus::OK)
         result_status = kDecodeError;
       decoded = base::MakeRefCounted<media::DecoderBufferAdapter>(
-          config_.id, base::MakeRefCounted<::media::DecoderBuffer>(0));
+          output_config_.id, base::MakeRefCounted<::media::DecoderBuffer>(0));
     }
     decoded_chunks_.clear();
     decoded->set_timestamp(buffer_timestamp);
     base::WeakPtr<CastAudioDecoderImpl> self = weak_factory_.GetWeakPtr();
     std::move(pending_decode_callback_)
-        .Run(result_status, config_, std::move(decoded));
+        .Run(result_status, output_config_, std::move(decoded));
     if (!self)
       return;  // Return immediately if the decode callback deleted this.
 
@@ -196,16 +200,16 @@
   }
 
   void OnDecoderOutput(scoped_refptr<::media::AudioBuffer> decoded) {
-    if (decoded->sample_rate() != config_.samples_per_second) {
+    if (decoded->sample_rate() != output_config_.samples_per_second) {
       LOG(WARNING) << "sample_rate changed to " << decoded->sample_rate()
-                   << " from " << config_.samples_per_second;
-      config_.samples_per_second = decoded->sample_rate();
+                   << " from " << output_config_.samples_per_second;
+      output_config_.samples_per_second = decoded->sample_rate();
     }
 
-    if (decoded->channel_count() != config_.channel_number) {
+    if (decoded->channel_count() != output_config_.channel_number) {
       LOG(WARNING) << "channel_count changed to " << decoded->channel_count()
-                   << " from " << config_.channel_number;
-      config_.channel_number = decoded->channel_count();
+                   << " from " << output_config_.channel_number;
+      output_config_.channel_number = decoded->channel_count();
       decoded_bus_.reset();
     }
 
@@ -220,8 +224,8 @@
 
     // Copy decoded data into an AudioBus for conversion.
     if (!decoded_bus_ || decoded_bus_->frames() < num_frames) {
-      decoded_bus_ =
-          ::media::AudioBus::Create(config_.channel_number, num_frames * 2);
+      decoded_bus_ = ::media::AudioBus::Create(output_config_.channel_number,
+                                               num_frames * 2);
     }
     int bus_frame_offset = 0;
     for (auto& chunk : decoded_chunks_) {
@@ -257,22 +261,23 @@
 
     result->set_duration(base::TimeDelta::FromMicroseconds(
         num_frames * base::Time::kMicrosecondsPerSecond /
-        config_.samples_per_second));
-    return base::MakeRefCounted<media::DecoderBufferAdapter>(config_.id,
+        output_config_.samples_per_second));
+    return base::MakeRefCounted<media::DecoderBufferAdapter>(output_config_.id,
                                                              result);
   }
 
   ::media::NullMediaLog media_log_;
   const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-  InitializedCallback initialized_callback_;
   OutputFormat output_format_;
-  bool initialized_;
-  media::AudioConfig config_;
+  bool initialized_ = false;
+  bool error_ = false;
+  media::AudioConfig input_config_;
+  media::AudioConfig output_config_;
 
   std::unique_ptr<::media::AudioDecoder> decoder_;
   base::queue<DecodeBufferCallbackPair> decode_queue_;
 
-  bool decode_pending_;
+  bool decode_pending_ = false;
   DecodeCallback pending_decode_callback_;
   std::vector<scoped_refptr<::media::AudioBuffer>> decoded_chunks_;
 
@@ -290,12 +295,13 @@
 std::unique_ptr<CastAudioDecoder> CastAudioDecoder::Create(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
     const media::AudioConfig& config,
-    OutputFormat output_format,
-    InitializedCallback initialized_callback) {
-  std::unique_ptr<CastAudioDecoderImpl> decoder(new CastAudioDecoderImpl(
-      std::move(task_runner), std::move(initialized_callback), output_format));
-  decoder->Initialize(config);
-  return std::move(decoder);
+    OutputFormat output_format) {
+  auto decoder = std::make_unique<CastAudioDecoderImpl>(std::move(task_runner),
+                                                        output_format);
+  if (!decoder->Initialize(config)) {
+    decoder.reset();
+  }
+  return decoder;
 }
 
 // static
diff --git a/chromecast/media/cma/decoder/cast_audio_decoder.h b/chromecast/media/cma/decoder/cast_audio_decoder.h
index 30eaeb7..f6c45ee 100644
--- a/chromecast/media/cma/decoder/cast_audio_decoder.h
+++ b/chromecast/media/cma/decoder/cast_audio_decoder.h
@@ -32,13 +32,8 @@
     kOutputPlanarFloat,  // Output planar float samples.
   };
 
-  // The callback that is called when the decoder initialization is complete.
-  // |success| is true if initialization was successful; if |success| is false
-  // then the CastAudioDecoder instance is unusable and should be destroyed.
-  typedef base::OnceCallback<void(bool success)> InitializedCallback;
-
   // Callback called when a buffer has been decoded. |config| is the actual
-  // config of the buffer, which may differ from the config indicated the the
+  // config of the buffer, which may differ from the config indicated by the
   // wrapper format.
   typedef base::OnceCallback<void(
       Status status,
@@ -48,15 +43,11 @@
 
   // Creates a CastAudioDecoder instance for the given |config|. Decoding must
   // occur on the same thread as |task_runner|. Returns an empty unique_ptr if
-  // the decoder could not be created. |initialized_callback| will be called
-  // once initialization completes (either successfully, or if it failed).
-  // The callback will not be called after the CastAudioDecoder instance is
-  // destroyed.
+  // the decoder could not be created.
   static std::unique_ptr<CastAudioDecoder> Create(
       scoped_refptr<base::SingleThreadTaskRunner> task_runner,
       const media::AudioConfig& config,
-      OutputFormat output_format,
-      InitializedCallback initialized_callback);
+      OutputFormat output_format);
 
   // Given a CastAudioDecoder::OutputFormat, return the size of each sample in
   // that OutputFormat in bytes.
@@ -64,6 +55,10 @@
 
   virtual ~CastAudioDecoder() = default;
 
+  // Returns the expected config of the next decoded audio. Note that the config
+  // may change as more audio is decoded.
+  virtual const AudioConfig& GetOutputConfig() const = 0;
+
   // Converts encoded data to the |output_format|. Must be called on the same
   // thread as |task_runner|. Decoded data will be passed to |decode_callback|.
   // It is OK to call Decode before the |initialized_callback| has been called;
diff --git a/components/download/internal/common/download_job_factory.cc b/components/download/internal/common/download_job_factory.cc
index fbb3c72..36c530e 100644
--- a/components/download/internal/common/download_job_factory.cc
+++ b/components/download/internal/common/download_job_factory.cc
@@ -75,8 +75,14 @@
        base::FeatureList::IsEnabled(features::kUseParallelRequestsForQUIC));
   bool http_get_method =
       create_info.method == "GET" && create_info.url().SchemeIsHTTPOrHTTPS();
-  bool partial_response_success =
-      download_item->GetReceivedSlices().empty() || create_info.offset != 0;
+  // If the file is empty, we always assume parallel download is supported.
+  // Otherwise, check if the download already has multiple slices and whether
+  // the http response offset is non-zero.
+  bool can_support_parallel_requests =
+      download_item->GetReceivedBytes() <= 0 ||
+      (download_item->GetReceivedSlices().size() > 0 &&
+       create_info.offset != 0);
+
   bool range_support_allowed =
       create_info.accept_range == RangeRequestSupportType::kSupport ||
       (base::FeatureList::IsEnabled(
@@ -85,7 +91,7 @@
   bool is_parallelizable = has_strong_validator && range_support_allowed &&
                            has_content_length && satisfy_min_file_size &&
                            satisfy_connection_type && http_get_method &&
-                           partial_response_success;
+                           can_support_parallel_requests;
   RecordDownloadConnectionInfo(create_info.connection_info);
 
   if (!IsParallelDownloadEnabled())
@@ -123,7 +129,11 @@
     RecordParallelDownloadCreationEvent(
         ParallelDownloadCreationEvent::FALLBACK_REASON_HTTP_METHOD);
   }
-
+  if (!can_support_parallel_requests) {
+    RecordParallelDownloadCreationEvent(
+        ParallelDownloadCreationEvent::
+            FALLBACK_REASON_RESUMPTION_WITHOUT_SLICES);
+  }
   return is_parallelizable;
 }
 
diff --git a/components/download/public/common/download_stats.h b/components/download/public/common/download_stats.h
index 8d0e9868..1729552 100644
--- a/components/download/public/common/download_stats.h
+++ b/components/download/public/common/download_stats.h
@@ -219,6 +219,9 @@
   // Range support is unknown from the response.
   FALLBACK_REASON_UNKNOWN_RANGE_SUPPORT,
 
+  // Resumed download doesn't have any slices.
+  FALLBACK_REASON_RESUMPTION_WITHOUT_SLICES,
+
   // Last entry of the enum.
   COUNT,
 };
diff --git a/components/keep_alive_registry/keep_alive_types.cc b/components/keep_alive_registry/keep_alive_types.cc
index 582c3d3..68d4fb0 100644
--- a/components/keep_alive_registry/keep_alive_types.cc
+++ b/components/keep_alive_registry/keep_alive_types.cc
@@ -25,6 +25,8 @@
       return out << "LOGIN_DISPLAY_HOST_WEBUI";
     case KeepAliveOrigin::PIN_MIGRATION:
       return out << "PIN_MIGRATION";
+    case KeepAliveOrigin::REMOTE_DEBUGGING:
+      return out << "REMOTE_DEBUGGING";
     case KeepAliveOrigin::NOTIFICATION:
       return out << "NOTIFICATION";
     case KeepAliveOrigin::PENDING_NOTIFICATION_CLICK_EVENT:
diff --git a/components/keep_alive_registry/keep_alive_types.h b/components/keep_alive_registry/keep_alive_types.h
index 22287cc..2ff1dfad 100644
--- a/components/keep_alive_registry/keep_alive_types.h
+++ b/components/keep_alive_registry/keep_alive_types.h
@@ -31,6 +31,9 @@
   LOGIN_DISPLAY_HOST_WEBUI,
   PIN_MIGRATION,
 
+  // c/b/devtools
+  REMOTE_DEBUGGING,
+
   // c/b/extensions
   NATIVE_MESSAGING_HOST_ERROR_REPORT,
 
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn
index ee64f8c..7e52ad35 100644
--- a/components/password_manager/core/browser/BUILD.gn
+++ b/components/password_manager/core/browser/BUILD.gn
@@ -224,6 +224,7 @@
     "ui/export_flow.h",
     "ui/export_progress_status.h",
     "ui/import_flow.h",
+    "ui/plaintext_reason.h",
     "ui/saved_passwords_presenter.cc",
     "ui/saved_passwords_presenter.h",
     "votes_uploader.cc",
diff --git a/components/password_manager/core/browser/ui/plaintext_reason.h b/components/password_manager/core/browser/ui/plaintext_reason.h
new file mode 100644
index 0000000..fa0a533
--- /dev/null
+++ b/components/password_manager/core/browser/ui/plaintext_reason.h
@@ -0,0 +1,19 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_UI_PLAINTEXT_REASON_H_
+#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_UI_PLAINTEXT_REASON_H_
+
+namespace password_manager {
+
+// Possible reasons why a plaintext password was requested.
+enum class PlaintextReason {
+  kView,
+  kCopy,
+  kEdit,
+};
+
+}  // namespace password_manager
+
+#endif  // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_UI_PLAINTEXT_REASON_H_
diff --git a/components/performance_manager/worker_watcher.cc b/components/performance_manager/worker_watcher.cc
index d105ffe..ce64c29 100644
--- a/components/performance_manager/worker_watcher.cc
+++ b/components/performance_manager/worker_watcher.cc
@@ -12,7 +12,6 @@
 #include "components/performance_manager/graph/worker_node_impl.h"
 #include "components/performance_manager/performance_manager_impl.h"
 #include "components/performance_manager/process_node_source.h"
-#include "content/public/browser/shared_worker_instance.h"
 
 namespace performance_manager {
 
@@ -142,20 +141,21 @@
 }
 
 void WorkerWatcher::OnWorkerStarted(
-    const content::SharedWorkerInstance& instance,
+    content::SharedWorkerId shared_worker_id,
     int worker_process_id,
     const base::UnguessableToken& dev_tools_token) {
   auto worker_node = PerformanceManagerImpl::GetInstance()->CreateWorkerNode(
       browser_context_id_, WorkerNode::WorkerType::kShared,
       process_node_source_->GetProcessNode(worker_process_id), dev_tools_token);
   bool inserted =
-      shared_worker_nodes_.emplace(instance, std::move(worker_node)).second;
+      shared_worker_nodes_.emplace(shared_worker_id, std::move(worker_node))
+          .second;
   DCHECK(inserted);
 }
 
 void WorkerWatcher::OnBeforeWorkerTerminated(
-    const content::SharedWorkerInstance& instance) {
-  auto it = shared_worker_nodes_.find(instance);
+    content::SharedWorkerId shared_worker_id) {
+  auto it = shared_worker_nodes_.find(shared_worker_id);
   DCHECK(it != shared_worker_nodes_.end());
 
   auto worker_node = std::move(it->second);
@@ -168,15 +168,16 @@
 }
 
 void WorkerWatcher::OnClientAdded(
-    const content::SharedWorkerInstance& instance,
+    content::SharedWorkerId shared_worker_id,
     content::GlobalFrameRoutingId render_frame_host_id) {
-  AddClientFrame(GetSharedWorkerNode(instance), render_frame_host_id);
+  AddClientFrame(GetSharedWorkerNode(shared_worker_id), render_frame_host_id);
 }
 
 void WorkerWatcher::OnClientRemoved(
-    const content::SharedWorkerInstance& instance,
+    content::SharedWorkerId shared_worker_id,
     content::GlobalFrameRoutingId render_frame_host_id) {
-  RemoveClientFrame(GetSharedWorkerNode(instance), render_frame_host_id);
+  RemoveClientFrame(GetSharedWorkerNode(shared_worker_id),
+                    render_frame_host_id);
 }
 
 void WorkerWatcher::AddClientFrame(
@@ -306,8 +307,8 @@
 }
 
 WorkerNodeImpl* WorkerWatcher::GetSharedWorkerNode(
-    const content::SharedWorkerInstance& instance) {
-  auto it = shared_worker_nodes_.find(instance);
+    content::SharedWorkerId shared_worker_id) {
+  auto it = shared_worker_nodes_.find(shared_worker_id);
   if (it == shared_worker_nodes_.end()) {
     NOTREACHED();
     return nullptr;
diff --git a/components/performance_manager/worker_watcher.h b/components/performance_manager/worker_watcher.h
index 507d798..f19e1f5 100644
--- a/components/performance_manager/worker_watcher.h
+++ b/components/performance_manager/worker_watcher.h
@@ -17,10 +17,6 @@
 #include "content/public/browser/global_routing_id.h"
 #include "content/public/browser/shared_worker_service.h"
 
-namespace content {
-class SharedWorkerInstance;
-}
-
 namespace performance_manager {
 
 class FrameNodeImpl;
@@ -56,16 +52,16 @@
       content::GlobalFrameRoutingId ancestor_render_frame_host_id) override;
 
   // content::SharedWorkerService::Observer:
-  void OnWorkerStarted(const content::SharedWorkerInstance& instance,
+  void OnWorkerStarted(content::SharedWorkerId shared_worker_id,
                        int worker_process_id,
                        const base::UnguessableToken& dev_tools_token) override;
   void OnBeforeWorkerTerminated(
-      const content::SharedWorkerInstance& instance) override;
+      content::SharedWorkerId shared_worker_id) override;
   void OnClientAdded(
-      const content::SharedWorkerInstance& instance,
+      content::SharedWorkerId shared_worker_id,
       content::GlobalFrameRoutingId render_frame_host_id) override;
   void OnClientRemoved(
-      const content::SharedWorkerInstance& instance,
+      content::SharedWorkerId shared_worker_id,
       content::GlobalFrameRoutingId render_frame_host_id) override;
 
  private:
@@ -90,8 +86,7 @@
   // Helper function to retrieve an existing shared worker node.
   WorkerNodeImpl* GetDedicatedWorkerNode(
       content::DedicatedWorkerId dedicated_worker_id);
-  WorkerNodeImpl* GetSharedWorkerNode(
-      const content::SharedWorkerInstance& instance);
+  WorkerNodeImpl* GetSharedWorkerNode(content::SharedWorkerId shared_worker_id);
 
   // The ID of the BrowserContext who owns the shared worker service.
   const std::string browser_context_id_;
@@ -117,8 +112,8 @@
   base::flat_map<content::DedicatedWorkerId, std::unique_ptr<WorkerNodeImpl>>
       dedicated_worker_nodes_;
 
-  // Maps each SharedWorkerInstance to its worker node.
-  base::flat_map<content::SharedWorkerInstance, std::unique_ptr<WorkerNodeImpl>>
+  // Maps each shared worker ID to its worker node.
+  base::flat_map<content::SharedWorkerId, std::unique_ptr<WorkerNodeImpl>>
       shared_worker_nodes_;
 
   // Maps each frame to the shared workers that this frame is a client of. This
diff --git a/components/performance_manager/worker_watcher_unittest.cc b/components/performance_manager/worker_watcher_unittest.cc
index 147279d0..a61452e 100644
--- a/components/performance_manager/worker_watcher_unittest.cc
+++ b/components/performance_manager/worker_watcher_unittest.cc
@@ -23,7 +23,6 @@
 #include "components/performance_manager/graph/worker_node_impl.h"
 #include "components/performance_manager/performance_manager_impl.h"
 #include "components/performance_manager/process_node_source.h"
-#include "content/public/browser/shared_worker_instance.h"
 #include "content/public/browser/shared_worker_service.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -65,7 +64,7 @@
   void RemoveObserver(Observer* observer) override;
   void EnumerateDedicatedWorkers(Observer* observer) override;
 
-  // Starts a new shared worker and returns its instance.
+  // Starts a new dedicated worker and returns its ID.
   content::DedicatedWorkerId StartDedicatedWorker(
       int worker_process_id,
       content::GlobalFrameRoutingId client_render_frame_host_id);
@@ -134,7 +133,7 @@
   for (auto& observer : observer_list_)
     observer.OnBeforeWorkerTerminated(dedicated_worker_id, it->second);
 
-  // Remove the worker instance from the map.
+  // Remove the worker ID from the map.
   dedicated_worker_client_frame_.erase(it);
 }
 
@@ -155,20 +154,20 @@
                        const std::string& name,
                        const url::Origin& constructor_origin) override;
 
-  // Starts a new shared worker and returns its instance.
-  content::SharedWorkerInstance StartSharedWorker(int worker_process_id);
+  // Starts a new shared worker and returns its ID.
+  content::SharedWorkerId StartSharedWorker(int worker_process_id);
 
   // Stops a running shared worker.
-  void StopSharedWorker(const content::SharedWorkerInstance& instance);
+  void StopSharedWorker(content::SharedWorkerId shared_worker_id);
 
   // Adds a new frame client to an existing worker.
   void AddWorkerClient(
-      const content::SharedWorkerInstance& instance,
+      content::SharedWorkerId shared_worker_id,
       content::GlobalFrameRoutingId client_render_frame_host_id);
 
   // Removes an existing frame client from a worker.
   void RemoveWorkerClient(
-      const content::SharedWorkerInstance& instance,
+      content::SharedWorkerId shared_worker_id,
       content::GlobalFrameRoutingId client_render_frame_host_id);
 
  private:
@@ -178,7 +177,7 @@
   content::SharedWorkerId::Generator shared_worker_id_generator_;
 
   // Contains the set of clients for each running workers.
-  base::flat_map<content::SharedWorkerInstance,
+  base::flat_map<content::SharedWorkerId,
                  base::flat_set<content::GlobalFrameRoutingId>>
       shared_worker_client_frames_;
 
@@ -210,34 +209,29 @@
   return false;
 }
 
-content::SharedWorkerInstance TestSharedWorkerService::StartSharedWorker(
+content::SharedWorkerId TestSharedWorkerService::StartSharedWorker(
     int worker_process_id) {
-  // Create a new SharedWorkerInstance and add it to the map.
+  // Create a new DedicatedWorkerId for the worker and add it to the map.
+  content::SharedWorkerId shared_worker_id =
+      shared_worker_id_generator_.GenerateNextId();
   GURL worker_url = GenerateWorkerUrl();
-  content::SharedWorkerInstance instance(
-      shared_worker_id_generator_.GenerateNextId(), worker_url,
-      blink::mojom::ScriptType::kClassic,
-      network::mojom::CredentialsMode::kSameOrigin, "SharedWorker",
-      url::Origin::Create(worker_url), "",
-      network::mojom::ContentSecurityPolicyType::kReport,
-      network::mojom::IPAddressSpace::kPublic,
-      blink::mojom::SharedWorkerCreationContextType::kSecure);
 
-  bool inserted = shared_worker_client_frames_.insert({instance, {}}).second;
+  bool inserted =
+      shared_worker_client_frames_.insert({shared_worker_id, {}}).second;
   DCHECK(inserted);
 
   // Notify observers.
   for (auto& observer : observer_list_) {
-    observer.OnWorkerStarted(instance, worker_process_id,
+    observer.OnWorkerStarted(shared_worker_id, worker_process_id,
                              base::UnguessableToken::Create());
   }
 
-  return instance;
+  return shared_worker_id;
 }
 
 void TestSharedWorkerService::StopSharedWorker(
-    const content::SharedWorkerInstance& instance) {
-  auto it = shared_worker_client_frames_.find(instance);
+    content::SharedWorkerId shared_worker_id) {
+  auto it = shared_worker_client_frames_.find(shared_worker_id);
   DCHECK(it != shared_worker_client_frames_.end());
 
   // A stopping worker should have no clients.
@@ -245,17 +239,17 @@
 
   // Notify observers that the worker is terminating.
   for (auto& observer : observer_list_)
-    observer.OnBeforeWorkerTerminated(instance);
+    observer.OnBeforeWorkerTerminated(shared_worker_id);
 
-  // Remove the worker instance from the map.
+  // Remove the worker ID from the map.
   shared_worker_client_frames_.erase(it);
 }
 
 void TestSharedWorkerService::AddWorkerClient(
-    const content::SharedWorkerInstance& instance,
+    content::SharedWorkerId shared_worker_id,
     content::GlobalFrameRoutingId client_render_frame_host_id) {
   // Add the frame to the set of clients for this worker.
-  auto it = shared_worker_client_frames_.find(instance);
+  auto it = shared_worker_client_frames_.find(shared_worker_id);
   DCHECK(it != shared_worker_client_frames_.end());
 
   base::flat_set<content::GlobalFrameRoutingId>& client_frames = it->second;
@@ -264,18 +258,18 @@
 
   // Then notify observers.
   for (auto& observer : observer_list_)
-    observer.OnClientAdded(instance, client_render_frame_host_id);
+    observer.OnClientAdded(shared_worker_id, client_render_frame_host_id);
 }
 
 void TestSharedWorkerService::RemoveWorkerClient(
-    const content::SharedWorkerInstance& instance,
+    content::SharedWorkerId shared_worker_id,
     content::GlobalFrameRoutingId client_render_frame_host_id) {
   // Notify observers.
   for (auto& observer : observer_list_)
-    observer.OnClientRemoved(instance, client_render_frame_host_id);
+    observer.OnClientRemoved(shared_worker_id, client_render_frame_host_id);
 
   // Then remove the frame from the set of clients of this worker.
-  auto it = shared_worker_client_frames_.find(instance);
+  auto it = shared_worker_client_frames_.find(shared_worker_id);
   DCHECK(it != shared_worker_client_frames_.end());
 
   base::flat_set<content::GlobalFrameRoutingId>& client_frames = it->second;
@@ -486,8 +480,7 @@
   // Retrieves an existing worker node.
   WorkerNodeImpl* GetDedicatedWorkerNode(
       content::DedicatedWorkerId dedicated_worker_id);
-  WorkerNodeImpl* GetSharedWorkerNode(
-      const content::SharedWorkerInstance& instance);
+  WorkerNodeImpl* GetSharedWorkerNode(content::SharedWorkerId shared_worker_id);
 
   PerformanceManagerImpl* performance_manager() {
     return performance_manager_.get();
@@ -570,8 +563,8 @@
 }
 
 WorkerNodeImpl* WorkerWatcherTest::GetSharedWorkerNode(
-    const content::SharedWorkerInstance& instance) {
-  return worker_watcher_->GetSharedWorkerNode(instance);
+    content::SharedWorkerId shared_worker_id) {
+  return worker_watcher_->GetSharedWorkerNode(shared_worker_id);
 }
 
 // This test creates one dedicated worker.
@@ -619,17 +612,17 @@
           process_node_source()->GetProcessNode(render_process_id));
 
   // Create the worker.
-  content::SharedWorkerInstance shared_worker_instance =
+  content::SharedWorkerId shared_worker_id =
       shared_worker_service()->StartSharedWorker(render_process_id);
 
   // Connect the frame to the worker.
-  shared_worker_service()->AddWorkerClient(shared_worker_instance,
+  shared_worker_service()->AddWorkerClient(shared_worker_id,
                                            render_frame_host_id);
 
   // Check expectations on the graph.
   CallOnGraphAndWait(base::BindLambdaForTesting(
       [process_node = process_node_source()->GetProcessNode(render_process_id),
-       worker_node = GetSharedWorkerNode(shared_worker_instance),
+       worker_node = GetSharedWorkerNode(shared_worker_id),
        client_frame_node = frame_node_source()->GetFrameNode(
            render_frame_host_id)](GraphImpl* graph) {
         EXPECT_TRUE(graph->NodeInGraph(worker_node));
@@ -639,9 +632,9 @@
       }));
 
   // Disconnect and clean up the worker.
-  shared_worker_service()->RemoveWorkerClient(shared_worker_instance,
+  shared_worker_service()->RemoveWorkerClient(shared_worker_id,
                                               render_frame_host_id);
-  shared_worker_service()->StopSharedWorker(shared_worker_instance);
+  shared_worker_service()->StopSharedWorker(shared_worker_id);
 }
 
 TEST_F(WorkerWatcherTest, SharedWorkerCrossProcessClient) {
@@ -654,18 +647,18 @@
 
   // Create the worker in a different process.
   int worker_process_id = process_node_source()->CreateProcessNode();
-  content::SharedWorkerInstance shared_worker_instance =
+  content::SharedWorkerId shared_worker_id =
       shared_worker_service()->StartSharedWorker(worker_process_id);
 
   // Connect the frame to the worker.
-  shared_worker_service()->AddWorkerClient(shared_worker_instance,
+  shared_worker_service()->AddWorkerClient(shared_worker_id,
                                            render_frame_host_id);
 
   // Check expectations on the graph.
   CallOnGraphAndWait(base::BindLambdaForTesting(
       [worker_process_node =
            process_node_source()->GetProcessNode(worker_process_id),
-       worker_node = GetSharedWorkerNode(shared_worker_instance),
+       worker_node = GetSharedWorkerNode(shared_worker_id),
        client_process_node =
            process_node_source()->GetProcessNode(frame_process_id),
        client_frame_node = frame_node_source()->GetFrameNode(
@@ -677,16 +670,16 @@
       }));
 
   // Disconnect and clean up the worker.
-  shared_worker_service()->RemoveWorkerClient(shared_worker_instance,
+  shared_worker_service()->RemoveWorkerClient(shared_worker_id,
                                               render_frame_host_id);
-  shared_worker_service()->StopSharedWorker(shared_worker_instance);
+  shared_worker_service()->StopSharedWorker(shared_worker_id);
 }
 
 TEST_F(WorkerWatcherTest, OneSharedWorkerTwoClients) {
   int render_process_id = process_node_source()->CreateProcessNode();
 
   // Create the worker.
-  content::SharedWorkerInstance shared_worker_instance =
+  content::SharedWorkerId shared_worker_id =
       shared_worker_service()->StartSharedWorker(render_process_id);
 
   // Create 2 client frame nodes and connect them to the worker.
@@ -694,19 +687,19 @@
       frame_node_source()->CreateFrameNode(
           render_process_id,
           process_node_source()->GetProcessNode(render_process_id));
-  shared_worker_service()->AddWorkerClient(shared_worker_instance,
+  shared_worker_service()->AddWorkerClient(shared_worker_id,
                                            render_frame_host_id_1);
 
   content::GlobalFrameRoutingId render_frame_host_id_2 =
       frame_node_source()->CreateFrameNode(
           render_process_id,
           process_node_source()->GetProcessNode(render_process_id));
-  shared_worker_service()->AddWorkerClient(shared_worker_instance,
+  shared_worker_service()->AddWorkerClient(shared_worker_id,
                                            render_frame_host_id_2);
 
   // Check expectations on the graph.
   CallOnGraphAndWait(base::BindLambdaForTesting(
-      [worker_node = GetSharedWorkerNode(shared_worker_instance),
+      [worker_node = GetSharedWorkerNode(shared_worker_id),
        client_frame_node_1 =
            frame_node_source()->GetFrameNode(render_frame_host_id_1),
        client_frame_node_2 = frame_node_source()->GetFrameNode(
@@ -722,11 +715,11 @@
       }));
 
   // Disconnect and clean up the worker.
-  shared_worker_service()->RemoveWorkerClient(shared_worker_instance,
+  shared_worker_service()->RemoveWorkerClient(shared_worker_id,
                                               render_frame_host_id_1);
-  shared_worker_service()->RemoveWorkerClient(shared_worker_instance,
+  shared_worker_service()->RemoveWorkerClient(shared_worker_id,
                                               render_frame_host_id_2);
-  shared_worker_service()->StopSharedWorker(shared_worker_instance);
+  shared_worker_service()->StopSharedWorker(shared_worker_id);
 }
 
 TEST_F(WorkerWatcherTest, OneClientTwoSharedWorkers) {
@@ -739,20 +732,20 @@
           process_node_source()->GetProcessNode(render_process_id));
 
   // Create the 2 workers and connect them to the frame.
-  content::SharedWorkerInstance shared_worker_instance_1 =
+  content::SharedWorkerId shared_worker_id_1 =
       shared_worker_service()->StartSharedWorker(render_process_id);
-  shared_worker_service()->AddWorkerClient(shared_worker_instance_1,
+  shared_worker_service()->AddWorkerClient(shared_worker_id_1,
                                            render_frame_host_id);
 
-  content::SharedWorkerInstance shared_worker_instance_2 =
+  content::SharedWorkerId shared_worker_id_2 =
       shared_worker_service()->StartSharedWorker(render_process_id);
-  shared_worker_service()->AddWorkerClient(shared_worker_instance_2,
+  shared_worker_service()->AddWorkerClient(shared_worker_id_2,
                                            render_frame_host_id);
 
   // Check expectations on the graph.
   CallOnGraphAndWait(base::BindLambdaForTesting(
-      [worker_node_1 = GetSharedWorkerNode(shared_worker_instance_1),
-       worker_node_2 = GetSharedWorkerNode(shared_worker_instance_2),
+      [worker_node_1 = GetSharedWorkerNode(shared_worker_id_1),
+       worker_node_2 = GetSharedWorkerNode(shared_worker_id_2),
        client_frame_node = frame_node_source()->GetFrameNode(
            render_frame_host_id)](GraphImpl* graph) {
         // Check worker 1.
@@ -769,13 +762,13 @@
       }));
 
   // Disconnect and clean up the workers.
-  shared_worker_service()->RemoveWorkerClient(shared_worker_instance_1,
+  shared_worker_service()->RemoveWorkerClient(shared_worker_id_1,
                                               render_frame_host_id);
-  shared_worker_service()->StopSharedWorker(shared_worker_instance_1);
+  shared_worker_service()->StopSharedWorker(shared_worker_id_1);
 
-  shared_worker_service()->RemoveWorkerClient(shared_worker_instance_2,
+  shared_worker_service()->RemoveWorkerClient(shared_worker_id_2,
                                               render_frame_host_id);
-  shared_worker_service()->StopSharedWorker(shared_worker_instance_2);
+  shared_worker_service()->StopSharedWorker(shared_worker_id_2);
 }
 
 TEST_F(WorkerWatcherTest, FrameDestroyed) {
@@ -791,17 +784,17 @@
   content::DedicatedWorkerId dedicated_worker_id =
       dedicated_worker_service()->StartDedicatedWorker(render_process_id,
                                                        render_frame_host_id);
-  content::SharedWorkerInstance shared_worker_instance =
+  content::SharedWorkerId shared_worker_id =
       shared_worker_service()->StartSharedWorker(render_process_id);
 
   // Connect the frame to the shared worker.
-  shared_worker_service()->AddWorkerClient(shared_worker_instance,
+  shared_worker_service()->AddWorkerClient(shared_worker_id,
                                            render_frame_host_id);
 
   // Check that everything is wired up correctly.
   CallOnGraphAndWait(base::BindLambdaForTesting(
       [dedicated_worker_node = GetDedicatedWorkerNode(dedicated_worker_id),
-       shared_worker_node = GetSharedWorkerNode(shared_worker_instance),
+       shared_worker_node = GetSharedWorkerNode(shared_worker_id),
        client_frame_node = frame_node_source()->GetFrameNode(
            render_frame_host_id)](GraphImpl* graph) {
         EXPECT_TRUE(graph->NodeInGraph(dedicated_worker_node));
@@ -818,7 +811,7 @@
   CallOnGraphAndWait(base::BindLambdaForTesting(
       [dedicated_worker_node = GetDedicatedWorkerNode(dedicated_worker_id),
        shared_worker_node =
-           GetSharedWorkerNode(shared_worker_instance)](GraphImpl* graph) {
+           GetSharedWorkerNode(shared_worker_id)](GraphImpl* graph) {
         EXPECT_TRUE(graph->NodeInGraph(dedicated_worker_node));
         EXPECT_TRUE(graph->NodeInGraph(shared_worker_node));
         EXPECT_TRUE(dedicated_worker_node->client_frames().empty());
@@ -826,9 +819,9 @@
       }));
 
   // The watcher is still expecting a worker removed notification.
-  shared_worker_service()->RemoveWorkerClient(shared_worker_instance,
+  shared_worker_service()->RemoveWorkerClient(shared_worker_id,
                                               render_frame_host_id);
-  shared_worker_service()->StopSharedWorker(shared_worker_instance);
+  shared_worker_service()->StopSharedWorker(shared_worker_id);
   dedicated_worker_service()->StopDedicatedWorker(dedicated_worker_id);
 }
 
diff --git a/components/permissions/BUILD.gn b/components/permissions/BUILD.gn
index 873e807..4067cac 100644
--- a/components/permissions/BUILD.gn
+++ b/components/permissions/BUILD.gn
@@ -61,6 +61,8 @@
     "test/mock_permission_prompt_factory.h",
     "test/mock_permission_request.cc",
     "test/mock_permission_request.h",
+    "test/permission_request_observer.cc",
+    "test/permission_request_observer.h",
     "test/test_permissions_client.cc",
     "test/test_permissions_client.h",
   ]
diff --git a/components/permissions/test/permission_request_observer.cc b/components/permissions/test/permission_request_observer.cc
new file mode 100644
index 0000000..5a38a98
--- /dev/null
+++ b/components/permissions/test/permission_request_observer.cc
@@ -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.
+
+#include "components/permissions/test/permission_request_observer.h"
+
+namespace permissions {
+
+PermissionRequestObserver::PermissionRequestObserver(
+    content::WebContents* web_contents) {
+  observer_.Add(PermissionRequestManager::FromWebContents(web_contents));
+}
+
+PermissionRequestObserver::~PermissionRequestObserver() = default;
+
+void PermissionRequestObserver::Wait() {
+  loop_.Run();
+}
+
+void PermissionRequestObserver::OnBubbleAdded() {
+  request_shown_ = true;
+  loop_.Quit();
+}
+
+}  // namespace permissions
diff --git a/components/permissions/test/permission_request_observer.h b/components/permissions/test/permission_request_observer.h
new file mode 100644
index 0000000..69d1a72
--- /dev/null
+++ b/components/permissions/test/permission_request_observer.h
@@ -0,0 +1,41 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_PERMISSIONS_TEST_PERMISSION_REQUEST_OBSERVER_H_
+#define COMPONENTS_PERMISSIONS_TEST_PERMISSION_REQUEST_OBSERVER_H_
+
+#include "base/run_loop.h"
+#include "base/scoped_observer.h"
+#include "components/permissions/permission_request_manager.h"
+
+namespace permissions {
+
+// Observer for use in tests that want to detect whether a permission request
+// was shown.  Can be used in a blocking or non-blocking way.
+class PermissionRequestObserver : public PermissionRequestManager::Observer {
+ public:
+  explicit PermissionRequestObserver(content::WebContents* web_contents);
+  PermissionRequestObserver(const PermissionRequestObserver&) = delete;
+  PermissionRequestObserver& operator=(const PermissionRequestObserver&) =
+      delete;
+  ~PermissionRequestObserver() override;
+
+  bool request_shown() const { return request_shown_; }
+
+  // Blocks until a request is shown.
+  void Wait();
+
+  // PermissionRequestManager::Observer:
+  void OnBubbleAdded() override;
+
+ private:
+  ScopedObserver<PermissionRequestManager, PermissionRequestManager::Observer>
+      observer_{this};
+  base::RunLoop loop_;
+  bool request_shown_ = false;
+};
+
+}  // namespace permissions
+
+#endif  // COMPONENTS_PERMISSIONS_TEST_PERMISSION_REQUEST_OBSERVER_H_
diff --git a/components/remote_cocoa/app_shim/browser_native_widget_window_mac.mm b/components/remote_cocoa/app_shim/browser_native_widget_window_mac.mm
index 1ffb647..cf88f696 100644
--- a/components/remote_cocoa/app_shim/browser_native_widget_window_mac.mm
+++ b/components/remote_cocoa/app_shim/browser_native_widget_window_mac.mm
@@ -53,12 +53,6 @@
   return YES;
 }
 
-// The base implementation justs tests [self class] == [NSThemeFrame class].
-- (BOOL)_shouldFlipTrafficLightsForRTL API_AVAILABLE(macos(10.12)) {
-  return [[self window] windowTitlebarLayoutDirection] ==
-         NSUserInterfaceLayoutDirectionRightToLeft;
-}
-
 // On 10.10, this prevents the window server from treating the title bar as an
 // unconditionally-draggable region, and allows -[BridgedContentView hitTest:]
 // to choose case-by-case whether to take a mouse event or let it turn into a
diff --git a/components/remote_cocoa/app_shim/native_widget_mac_nswindow.mm b/components/remote_cocoa/app_shim/native_widget_mac_nswindow.mm
index 9117bd3..c10c6633 100644
--- a/components/remote_cocoa/app_shim/native_widget_mac_nswindow.mm
+++ b/components/remote_cocoa/app_shim/native_widget_mac_nswindow.mm
@@ -65,6 +65,11 @@
 - (BOOL)usesCustomDrawing {
   return NO;
 }
+// The base implementation just tests [self class] == [NSThemeFrame class].
+- (BOOL)_shouldFlipTrafficLightsForRTL API_AVAILABLE(macos(10.12)) {
+  return [[self window] windowTitlebarLayoutDirection] ==
+         NSUserInterfaceLayoutDirectionRightToLeft;
+}
 @end
 
 @implementation NativeWidgetMacNSWindowBorderlessFrame
diff --git a/components/safe_browsing/content/web_ui/safe_browsing_ui.cc b/components/safe_browsing/content/web_ui/safe_browsing_ui.cc
index e38af28a..c57483c 100644
--- a/components/safe_browsing/content/web_ui/safe_browsing_ui.cc
+++ b/components/safe_browsing/content/web_ui/safe_browsing_ui.cc
@@ -1338,18 +1338,6 @@
   if (response.has_malware_scan_verdict()) {
     base::DictionaryValue malware_verdict;
 
-    switch (response.malware_scan_verdict().status()) {
-      case MalwareDeepScanningVerdict::STATUS_UNKNOWN:
-        malware_verdict.SetStringKey("status", "STATUS_UNKNOWN");
-        break;
-      case MalwareDeepScanningVerdict::SUCCESS:
-        malware_verdict.SetStringKey("status", "SUCCESS");
-        break;
-      case MalwareDeepScanningVerdict::FAILURE:
-        malware_verdict.SetStringKey("status", "FAILURE");
-        break;
-    }
-
     switch (response.malware_scan_verdict().verdict()) {
       case MalwareDeepScanningVerdict::VERDICT_UNSPECIFIED:
         malware_verdict.SetStringKey("verdict", "VERDICT_UNSPECIFIED");
@@ -1363,6 +1351,9 @@
       case MalwareDeepScanningVerdict::MALWARE:
         malware_verdict.SetStringKey("verdict", "MALWARE");
         break;
+      case MalwareDeepScanningVerdict::SCAN_FAILURE:
+        malware_verdict.SetStringKey("verdict", "SCAN_FAILURE");
+        break;
     }
 
     response_dict.SetKey("malware_scan_verdict", std::move(malware_verdict));
diff --git a/components/safe_browsing/core/proto/webprotect.proto b/components/safe_browsing/core/proto/webprotect.proto
index 02d39da9..c283525 100644
--- a/components/safe_browsing/core/proto/webprotect.proto
+++ b/components/safe_browsing/core/proto/webprotect.proto
@@ -62,19 +62,14 @@
 
 // Malware-specific response given back for scanned content.
 message MalwareDeepScanningVerdict {
-  // The status of the malware verdict.
-  enum Status {
-    STATUS_UNKNOWN = 0;
-    SUCCESS = 1;
-    FAILURE = 2;
-  }
-  optional Status status = 2;
+  reserved 2;
 
   enum Verdict {
     VERDICT_UNSPECIFIED = 0;
     CLEAN = 1;
     UWS = 2;
     MALWARE = 3;
+    SCAN_FAILURE = 4;
   }
   // Verdict given to scanned content.
   optional Verdict verdict = 1;
diff --git a/components/schema_org/BUILD.gn b/components/schema_org/BUILD.gn
index f8eadfb..8eb8ef1 100644
--- a/components/schema_org/BUILD.gn
+++ b/components/schema_org/BUILD.gn
@@ -4,12 +4,17 @@
 
 source_set("unit_tests") {
   testonly = true
-  sources = [ "generate_schema_org_code_unittest.cc" ]
+  sources = [
+    "extractor_unittest.cc",
+    "generate_schema_org_code_unittest.cc",
+  ]
 
   deps = [
+    ":extractor",
     ":generate_schema_org_code",
     ":schema_org_properties",
     "//base",
+    "//components/schema_org/common:mojom",
     "//testing/gmock",
     "//testing/gtest",
   ]
@@ -55,3 +60,16 @@
 
   deps = [ ":generate_schema_org_code" ]
 }
+
+static_library("extractor") {
+  sources = [
+    "extractor.cc",
+    "extractor.h",
+  ]
+
+  deps = [
+    "//components/schema_org:generate_schema_org_code",
+    "//components/schema_org:schema_org_properties",
+    "//components/schema_org/common:mojom",
+  ]
+}
diff --git a/components/schema_org/extractor.cc b/components/schema_org/extractor.cc
new file mode 100644
index 0000000..ba48e2c2
--- /dev/null
+++ b/components/schema_org/extractor.cc
@@ -0,0 +1,231 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/schema_org/extractor.h"
+
+#include <algorithm>
+#include <memory>
+#include <unordered_set>
+#include <utility>
+#include <vector>
+
+#include "base/json/json_parser.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/values.h"
+#include "components/schema_org/common/metadata.mojom.h"
+#include "components/schema_org/schema_org_entity_names.h"
+
+namespace schema_org {
+
+namespace {
+
+// App Indexing enforces a max nesting depth of 5. Our top level message
+// corresponds to the WebPage, so this only leaves 4 more levels. We will parse
+// entities up to this depth, and ignore any further nesting. If an object at
+// the max nesting depth has a property corresponding to an entity, that
+// property will be dropped. Note that we will still parse json-ld blocks deeper
+// than this, but it won't be passed to App Indexing.
+constexpr int kMaxDepth = 5;
+// Some strings are very long, and we don't currently use those, so limit string
+// length to something reasonable to avoid undue pressure on Icing. Note that
+// App Indexing supports strings up to length 20k.
+constexpr size_t kMaxStringLength = 200;
+// Enforced by App Indexing, so stop processing early if possible.
+constexpr size_t kMaxNumFields = 25;
+// Enforced by App Indexing, so stop processing early if possible.
+constexpr size_t kMaxRepeatedSize = 100;
+
+constexpr char kJSONLDKeyType[] = "@type";
+
+const std::unordered_set<std::string> kSupportedTypes{
+    entity::kVideoObject, entity::kMovie, entity::kTVEpisode, entity::kTVSeason,
+    entity::kTVSeries};
+bool IsSupportedType(const std::string& type) {
+  return kSupportedTypes.find(type) != kSupportedTypes.end();
+}
+
+void ExtractEntity(base::DictionaryValue*, mojom::Entity&, int recursionLevel);
+
+bool ParseRepeatedValue(base::Value::ListView& arr,
+                        mojom::Values& values,
+                        int recursionLevel) {
+  if (arr.empty()) {
+    return false;
+  }
+
+  bool is_first_item = true;
+  base::Value::Type type = base::Value::Type::NONE;
+
+  for (size_t j = 0; j < std::min(arr.size(), kMaxRepeatedSize); ++j) {
+    auto& listItem = arr[j];
+    if (is_first_item) {
+      is_first_item = false;
+      type = listItem.type();
+      switch (type) {
+        case base::Value::Type::BOOLEAN:
+          values.set_bool_values(std::vector<bool>());
+          break;
+        case base::Value::Type::INTEGER:
+          values.set_long_values(std::vector<int64_t>());
+          break;
+        case base::Value::Type::DOUBLE:
+          // App Indexing doesn't support double type, so just encode its
+          // decimal value as a string instead.
+          values.set_string_values(std::vector<std::string>());
+          break;
+        case base::Value::Type::STRING:
+          values.set_string_values(std::vector<std::string>());
+          break;
+        case base::Value::Type::DICTIONARY:
+          if (recursionLevel + 1 >= kMaxDepth) {
+            return false;
+          }
+          values.set_entity_values(std::vector<mojom::EntityPtr>());
+          break;
+        case base::Value::Type::LIST:
+          // App Indexing doesn't support nested arrays.
+          return false;
+        default:
+          // Unknown value type.
+          return false;
+      }
+    }
+
+    if (listItem.type() != type) {
+      // App Indexing doesn't support mixed types. If there are mixed
+      // types in the parsed object, we will drop the property.
+      return false;
+    }
+    switch (listItem.type()) {
+      case base::Value::Type::BOOLEAN: {
+        bool v;
+        listItem.GetAsBoolean(&v);
+        values.get_bool_values().push_back(v);
+      } break;
+      case base::Value::Type::INTEGER: {
+        int v = listItem.GetInt();
+        values.get_long_values().push_back(v);
+      } break;
+      case base::Value::Type::DOUBLE: {
+        // App Indexing doesn't support double type, so just encode its decimal
+        // value as a string instead.
+        double v = listItem.GetDouble();
+        std::string s = base::NumberToString(v);
+        s = s.substr(0, kMaxStringLength);
+        values.get_string_values().push_back(s);
+      } break;
+      case base::Value::Type::STRING: {
+        std::string v = listItem.GetString();
+        v = v.substr(0, kMaxStringLength);
+        values.get_string_values().push_back(v);
+      } break;
+      case base::Value::Type::DICTIONARY: {
+        values.get_entity_values().push_back(mojom::Entity::New());
+
+        base::DictionaryValue* dict_value = nullptr;
+        if (listItem.GetAsDictionary(&dict_value)) {
+          ExtractEntity(dict_value, *(values.get_entity_values().at(j)),
+                        recursionLevel + 1);
+        }
+      } break;
+      default:
+        break;
+    }
+  }
+  return true;
+}
+
+void ExtractEntity(base::DictionaryValue* val,
+                   mojom::Entity& entity,
+                   int recursionLevel) {
+  if (recursionLevel >= kMaxDepth) {
+    return;
+  }
+
+  std::string type = "";
+  val->GetString(kJSONLDKeyType, &type);
+  if (type == "") {
+    type = "Thing";
+  }
+  entity.type = type;
+  for (const auto& entry : val->DictItems()) {
+    if (entity.properties.size() >= kMaxNumFields) {
+      break;
+    }
+    mojom::PropertyPtr property = mojom::Property::New();
+    property->name = entry.first;
+    if (property->name == kJSONLDKeyType) {
+      continue;
+    }
+    property->values = mojom::Values::New();
+
+    if (entry.second.is_bool()) {
+      bool v;
+      val->GetBoolean(entry.first, &v);
+      property->values->set_bool_values({v});
+    } else if (entry.second.is_int()) {
+      int v;
+      val->GetInteger(entry.first, &v);
+      property->values->set_long_values({v});
+    } else if (entry.second.is_double()) {
+      double v;
+      val->GetDouble(entry.first, &v);
+      std::string s = base::NumberToString(v);
+      s = s.substr(0, kMaxStringLength);
+      property->values->set_string_values({s});
+    } else if (entry.second.is_string()) {
+      std::string v;
+      val->GetString(entry.first, &v);
+      v = v.substr(0, kMaxStringLength);
+      property->values->set_string_values({v});
+    } else if (entry.second.is_dict()) {
+      if (recursionLevel + 1 >= kMaxDepth) {
+        continue;
+      }
+      property->values->set_entity_values(std::vector<mojom::EntityPtr>());
+      property->values->get_entity_values().push_back(mojom::Entity::New());
+
+      base::DictionaryValue* dict_value = nullptr;
+      if (!entry.second.GetAsDictionary(&dict_value)) {
+        continue;
+      }
+      ExtractEntity(dict_value, *(property->values->get_entity_values().at(0)),
+                    recursionLevel + 1);
+    } else if (entry.second.is_list()) {
+      base::Value::ListView list_view = entry.second.GetList();
+      if (!ParseRepeatedValue(list_view, *(property->values), recursionLevel)) {
+        continue;
+      }
+    }
+
+    entity.properties.push_back(std::move(property));
+  }
+}
+
+// Extract a JSONObject which corresponds to a single (possibly nested) entity.
+mojom::EntityPtr ExtractTopLevelEntity(base::DictionaryValue* val) {
+  mojom::EntityPtr entity = mojom::Entity::New();
+  std::string type;
+  val->GetString(kJSONLDKeyType, &type);
+  if (!IsSupportedType(type)) {
+    return nullptr;
+  }
+  ExtractEntity(val, *entity, 0);
+  return entity;
+}
+
+}  // namespace
+
+mojom::EntityPtr Extractor::Extract(const std::string& content) {
+  base::Optional<base::Value> value(base::JSONReader::Read(content));
+  base::DictionaryValue* dict_value = nullptr;
+
+  if (!value || !value.value().GetAsDictionary(&dict_value)) {
+    return nullptr;
+  }
+
+  return ExtractTopLevelEntity(dict_value);
+}
+
+}  // namespace schema_org
diff --git a/components/schema_org/extractor.h b/components/schema_org/extractor.h
new file mode 100644
index 0000000..6f0337a
--- /dev/null
+++ b/components/schema_org/extractor.h
@@ -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.
+
+#ifndef COMPONENTS_SCHEMA_ORG_EXTRACTOR_H_
+#define COMPONENTS_SCHEMA_ORG_EXTRACTOR_H_
+
+#include <string>
+
+#include "components/schema_org/common/metadata.mojom-forward.h"
+
+namespace schema_org {
+
+// Extract structured metadata (schema.org in JSON-LD) from text content.
+class Extractor {
+ public:
+  static mojom::EntityPtr Extract(const std::string& content);
+};
+
+}  // namespace schema_org
+
+#endif  // COMPONENTS_SCHEMA_ORG_EXTRACTOR_H_
diff --git a/components/schema_org/extractor_unittest.cc b/components/schema_org/extractor_unittest.cc
new file mode 100644
index 0000000..167d43a
--- /dev/null
+++ b/components/schema_org/extractor_unittest.cc
@@ -0,0 +1,399 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/schema_org/extractor.h"
+
+#include <memory>
+#include <utility>
+#include <vector>
+
+#include "base/strings/string_number_conversions.h"
+#include "components/schema_org/common/metadata.mojom.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace schema_org {
+
+using mojom::Entity;
+using mojom::EntityPtr;
+using mojom::Property;
+using mojom::PropertyPtr;
+using mojom::Values;
+using mojom::ValuesPtr;
+
+class SchemaOrgExtractorTest : public testing::Test {
+ public:
+  SchemaOrgExtractorTest() = default;
+
+ protected:
+  EntityPtr Extract(const std::string& text) {
+    return Extractor::Extract(text);
+  }
+
+  PropertyPtr CreateStringProperty(const std::string& name,
+                                   const std::string& value);
+
+  PropertyPtr CreateBooleanProperty(const std::string& name, const bool& value);
+
+  PropertyPtr CreateLongProperty(const std::string& name, const int64_t& value);
+
+  PropertyPtr CreateEntityProperty(const std::string& name, EntityPtr value);
+};
+
+PropertyPtr SchemaOrgExtractorTest::CreateStringProperty(
+    const std::string& name,
+    const std::string& value) {
+  PropertyPtr property = Property::New();
+  property->name = name;
+  property->values = Values::New();
+  property->values->set_string_values({value});
+  return property;
+}
+
+PropertyPtr SchemaOrgExtractorTest::CreateBooleanProperty(
+    const std::string& name,
+    const bool& value) {
+  PropertyPtr property = Property::New();
+  property->name = name;
+  property->values = Values::New();
+  property->values->set_bool_values({value});
+  return property;
+}
+
+PropertyPtr SchemaOrgExtractorTest::CreateLongProperty(const std::string& name,
+                                                       const int64_t& value) {
+  PropertyPtr property = Property::New();
+  property->name = name;
+  property->values = Values::New();
+  property->values->set_long_values({value});
+  return property;
+}
+
+PropertyPtr SchemaOrgExtractorTest::CreateEntityProperty(
+    const std::string& name,
+    EntityPtr value) {
+  PropertyPtr property = Property::New();
+  property->name = name;
+  property->values = Values::New();
+  property->values->set_entity_values(std::vector<EntityPtr>());
+  property->values->get_entity_values().push_back(std::move(value));
+  return property;
+}
+
+TEST_F(SchemaOrgExtractorTest, Empty) {
+  ASSERT_TRUE(Extract("").is_null());
+}
+
+TEST_F(SchemaOrgExtractorTest, Basic) {
+  EntityPtr extracted =
+      Extract("{\"@type\": \"VideoObject\", \"name\": \"a video!\"}");
+  ASSERT_FALSE(extracted.is_null());
+
+  EntityPtr expected = Entity::New();
+  expected->type = "VideoObject";
+  expected->properties.push_back(CreateStringProperty("name", "a video!"));
+
+  EXPECT_EQ(expected, extracted);
+}
+
+TEST_F(SchemaOrgExtractorTest, booleanValue) {
+  EntityPtr extracted =
+      Extract("{\"@type\": \"VideoObject\", \"requiresSubscription\": true }");
+  ASSERT_FALSE(extracted.is_null());
+
+  EntityPtr expected = Entity::New();
+  expected->type = "VideoObject";
+  expected->properties.push_back(
+      CreateBooleanProperty("requiresSubscription", true));
+
+  EXPECT_EQ(expected, extracted);
+}
+
+TEST_F(SchemaOrgExtractorTest, longValue) {
+  EntityPtr extracted =
+      Extract("{\"@type\": \"VideoObject\", \"position\": 111 }");
+  ASSERT_FALSE(extracted.is_null());
+
+  EntityPtr expected = Entity::New();
+  expected->type = "VideoObject";
+  expected->properties.push_back(CreateLongProperty("position", 111));
+
+  EXPECT_EQ(expected, extracted);
+}
+
+TEST_F(SchemaOrgExtractorTest, doubleValue) {
+  EntityPtr extracted =
+      Extract("{\"@type\": \"VideoObject\", \"width\": 111.5 }");
+  ASSERT_FALSE(extracted.is_null());
+
+  EntityPtr expected = Entity::New();
+  expected->type = "VideoObject";
+  expected->properties.push_back(CreateStringProperty("width", "111.5"));
+
+  EXPECT_EQ(expected, extracted);
+}
+
+TEST_F(SchemaOrgExtractorTest, NestedEntities) {
+  EntityPtr extracted = Extract(
+      "{\"@type\": \"VideoObject\", \"actor\": { \"@type\": \"Person\", "
+      "\"name\": \"Talented Actor\" }  }");
+  ASSERT_FALSE(extracted.is_null());
+
+  EntityPtr expected = Entity::New();
+  expected->type = "VideoObject";
+
+  EntityPtr nested = Entity::New();
+  nested->type = "Person";
+  nested->properties.push_back(CreateStringProperty("name", "Talented Actor"));
+
+  expected->properties.push_back(
+      CreateEntityProperty("actor", std::move(nested)));
+
+  EXPECT_EQ(expected, extracted);
+}
+
+TEST_F(SchemaOrgExtractorTest, RepeatedProperty) {
+  EntityPtr extracted = Extract(
+      "{\"@type\": \"VideoObject\", \"name\": [\"Movie Title\", \"The Second "
+      "One\"] }");
+  ASSERT_FALSE(extracted.is_null());
+
+  EntityPtr expected = Entity::New();
+  expected->type = "VideoObject";
+
+  PropertyPtr name = Property::New();
+  name->name = "name";
+  name->values = Values::New();
+  std::vector<std::string> nameValues;
+  nameValues.push_back("Movie Title");
+  nameValues.push_back("The Second One");
+  name->values->set_string_values(nameValues);
+
+  expected->properties.push_back(std::move(name));
+
+  EXPECT_EQ(expected, extracted);
+}
+
+TEST_F(SchemaOrgExtractorTest, RepeatedObject) {
+  EntityPtr extracted = Extract(
+      "{\"@type\": \"VideoObject\", \"actor\": [ {\"@type\": \"Person\", "
+      "\"name\": \"Talented "
+      "Actor\"}, {\"@type\": \"Person\", \"name\": \"Famous Actor\"} ] }");
+
+  ASSERT_FALSE(extracted.is_null());
+
+  EntityPtr expected = Entity::New();
+  expected->type = "VideoObject";
+  PropertyPtr actorProperty = Property::New();
+  actorProperty->name = "actor";
+  actorProperty->values = Values::New();
+  actorProperty->values->set_entity_values(std::vector<EntityPtr>());
+
+  EntityPtr nested1 = Entity::New();
+  nested1->type = "Person";
+  nested1->properties.push_back(CreateStringProperty("name", "Talented Actor"));
+  actorProperty->values->get_entity_values().push_back(std::move(nested1));
+
+  EntityPtr nested2 = Entity::New();
+  nested2->type = "Person";
+  nested2->properties.push_back(CreateStringProperty("name", "Famous Actor"));
+  actorProperty->values->get_entity_values().push_back(std::move(nested2));
+
+  expected->properties.push_back(std::move(actorProperty));
+
+  EXPECT_EQ(expected, extracted);
+}
+
+TEST_F(SchemaOrgExtractorTest, TruncateLongString) {
+  std::string maxLengthString = "";
+  for (int i = 0; i < 200; ++i) {
+    maxLengthString += "a";
+  }
+  std::string tooLongString;
+  tooLongString.append(maxLengthString);
+  tooLongString.append("a");
+
+  EntityPtr extracted = Extract("{\"@type\": \"VideoObject\", \"name\": \"" +
+                                tooLongString + "\"}");
+  ASSERT_FALSE(extracted.is_null());
+
+  EntityPtr expected = Entity::New();
+  expected->type = "VideoObject";
+  expected->properties.push_back(CreateStringProperty("name", maxLengthString));
+
+  EXPECT_EQ(expected, extracted);
+}
+
+TEST_F(SchemaOrgExtractorTest, EnforceTypeExists) {
+  EntityPtr extracted = Extract("{\"name\": \"a video!\"}");
+  ASSERT_TRUE(extracted.is_null());
+}
+
+TEST_F(SchemaOrgExtractorTest, UnhandledTypeIgnored) {
+  EntityPtr extracted =
+      Extract("{\"@type\": \"UnsupportedType\", \"name\": \"a video!\"}");
+  ASSERT_TRUE(extracted.is_null());
+}
+
+TEST_F(SchemaOrgExtractorTest, TruncateTooManyValuesInField) {
+  std::string largeRepeatedField = "[";
+  for (int i = 0; i < 101; ++i) {
+    largeRepeatedField += "\"a\"";
+    if (i != 100) {
+      largeRepeatedField += ",";
+    }
+  }
+  largeRepeatedField += "]";
+
+  EntityPtr extracted = Extract(
+      "{\"@type\": \"VideoObject\", \"name\": " + largeRepeatedField + "}");
+  ASSERT_FALSE(extracted.is_null());
+
+  EntityPtr expected = Entity::New();
+  expected->type = "VideoObject";
+  PropertyPtr name = Property::New();
+  name->name = "name";
+  name->values = Values::New();
+  std::vector<std::string> nameValues;
+
+  for (int i = 0; i < 100; i++) {
+    nameValues.push_back("a");
+  }
+  name->values->set_string_values(nameValues);
+  expected->properties.push_back(std::move(name));
+
+  EXPECT_EQ(expected, extracted);
+}
+
+TEST_F(SchemaOrgExtractorTest, truncateTooManyFields) {
+  std::stringstream tooManyFields;
+  for (int i = 0; i < 26; ++i) {
+    tooManyFields << "\"" << i << "\": \"a\"";
+    if (i != 25) {
+      tooManyFields << ",";
+    }
+  }
+  EntityPtr extracted =
+      Extract("{\"@type\": \"VideoObject\"," + tooManyFields.str() + "}");
+  ASSERT_FALSE(extracted.is_null());
+
+  EntityPtr expected = Entity::New();
+  expected->type = "VideoObject";
+
+  for (int i = 0; i < 25; ++i) {
+    expected->properties.push_back(
+        CreateStringProperty(base::NumberToString(i), "a"));
+  }
+
+  EXPECT_EQ(expected->properties.size(), extracted->properties.size());
+}
+
+TEST_F(SchemaOrgExtractorTest, IgnorePropertyWithEmptyArray) {
+  EntityPtr extracted = Extract("{\"@type\": \"VideoObject\", \"name\": [] }");
+  ASSERT_FALSE(extracted.is_null());
+
+  EntityPtr expected = Entity::New();
+  expected->type = "VideoObject";
+
+  EXPECT_EQ(expected, extracted);
+}
+
+TEST_F(SchemaOrgExtractorTest, IgnorePropertyWithMixedTypes) {
+  EntityPtr extracted =
+      Extract("{\"@type\": \"VideoObject\", \"name\": [\"Name\", 1] }");
+  ASSERT_FALSE(extracted.is_null());
+
+  EntityPtr expected = Entity::New();
+  expected->type = "VideoObject";
+
+  EXPECT_EQ(expected, extracted);
+}
+
+TEST_F(SchemaOrgExtractorTest, IgnorePropertyWithNestedArray) {
+  EntityPtr extracted =
+      Extract("{\"@type\": \"VideoObject\", \"name\": [[\"Name\"]] }");
+  ASSERT_FALSE(extracted.is_null());
+
+  EntityPtr expected = Entity::New();
+  expected->type = "VideoObject";
+
+  EXPECT_EQ(expected, extracted);
+}
+
+TEST_F(SchemaOrgExtractorTest, EnforceMaxNestingDepth) {
+  EntityPtr extracted = Extract(
+      "{\"@type\": \"VideoObject\", \"name\": \"a video!\","
+      "\"1\": {"
+      "  \"2\": {"
+      "    \"3\": {"
+      "      \"4\": {"
+      "        \"5\": {"
+      "          \"6\": 7"
+      "        }"
+      "      }"
+      "    }"
+      "  }"
+      "}"
+      "}");
+  ASSERT_FALSE(extracted.is_null());
+
+  EntityPtr expected = Entity::New();
+  expected->type = "VideoObject";
+
+  EntityPtr entity1 = Entity::New();
+  entity1->type = "Thing";
+  EntityPtr entity2 = Entity::New();
+  entity2->type = "Thing";
+  EntityPtr entity3 = Entity::New();
+  entity3->type = "Thing";
+  EntityPtr entity4 = Entity::New();
+  entity4->type = "Thing";
+
+  entity3->properties.push_back(CreateEntityProperty("4", std::move(entity4)));
+  entity2->properties.push_back(CreateEntityProperty("3", std::move(entity3)));
+  entity1->properties.push_back(CreateEntityProperty("2", std::move(entity2)));
+  expected->properties.push_back(CreateEntityProperty("1", std::move(entity1)));
+  expected->properties.push_back(CreateStringProperty("name", "a video!"));
+
+  EXPECT_EQ(expected, extracted);
+}
+
+TEST_F(SchemaOrgExtractorTest, MaxNestingDepthWithTerminalProperty) {
+  EntityPtr extracted = Extract(
+      "{\"@type\": \"VideoObject\", \"name\": \"a video!\","
+      "\"1\": {"
+      "  \"2\": {"
+      "    \"3\": {"
+      "      \"4\": {"
+      "        \"5\": 6"
+      "         }"
+      "      }"
+      "    }"
+      "  }"
+      "}");
+  ASSERT_FALSE(extracted.is_null());
+
+  EntityPtr expected = Entity::New();
+  expected->type = "VideoObject";
+
+  EntityPtr entity1 = Entity::New();
+  entity1->type = "Thing";
+  EntityPtr entity2 = Entity::New();
+  entity2->type = "Thing";
+  EntityPtr entity3 = Entity::New();
+  entity3->type = "Thing";
+  EntityPtr entity4 = Entity::New();
+  entity4->type = "Thing";
+
+  entity4->properties.push_back(CreateLongProperty("5", 6));
+  entity3->properties.push_back(CreateEntityProperty("4", std::move(entity4)));
+  entity2->properties.push_back(CreateEntityProperty("3", std::move(entity3)));
+  entity1->properties.push_back(CreateEntityProperty("2", std::move(entity2)));
+
+  expected->properties.push_back(CreateEntityProperty("1", std::move(entity1)));
+  expected->properties.push_back(CreateStringProperty("name", "a video!"));
+
+  EXPECT_EQ(expected, extracted);
+}
+
+}  // namespace schema_org
diff --git a/components/spellcheck/browser/windows_spell_checker.cc b/components/spellcheck/browser/windows_spell_checker.cc
index 8e67f7c7..c285f81 100644
--- a/components/spellcheck/browser/windows_spell_checker.cc
+++ b/components/spellcheck/browser/windows_spell_checker.cc
@@ -24,6 +24,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
 #include "base/task/single_thread_task_runner_thread_mode.h"
+#include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/win/com_init_util.h"
 #include "base/win/core_winrt_util.h"
@@ -38,10 +39,8 @@
 #include "components/spellcheck/spellcheck_buildflags.h"
 
 WindowsSpellChecker::BackgroundHelper::BackgroundHelper(
-    scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> background_task_runner)
-    : main_task_runner_(std::move(main_task_runner)),
-      background_task_runner_(std::move(background_task_runner)) {}
+    : background_task_runner_(std::move(background_task_runner)) {}
 
 WindowsSpellChecker::BackgroundHelper::~BackgroundHelper() {
   DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
@@ -59,30 +58,30 @@
   }
 }
 
-void WindowsSpellChecker::BackgroundHelper::CreateSpellChecker(
-    const std::string& lang_tag,
-    base::OnceCallback<void(bool)> callback) {
+bool WindowsSpellChecker::BackgroundHelper::CreateSpellChecker(
+    const std::string& lang_tag) {
   DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
 
-  bool result = false;
-  if (IsSpellCheckerFactoryInitialized()) {
-    if (SpellCheckerReady(lang_tag)) {
-      result = true;
-    } else if (IsLanguageSupported(lang_tag)) {
-      Microsoft::WRL::ComPtr<ISpellChecker> spell_checker;
-      std::wstring bcp47_language_tag = base::UTF8ToWide(lang_tag);
-      HRESULT hr = spell_checker_factory_->CreateSpellChecker(
-          bcp47_language_tag.c_str(), &spell_checker);
-      if (SUCCEEDED(hr)) {
-        spell_checker_map_.insert({lang_tag, spell_checker});
-        result = true;
-      }
-    }
+  if (!IsSpellCheckerFactoryInitialized())
+    return false;
+
+  if (SpellCheckerReady(lang_tag))
+    return true;
+
+  if (!IsLanguageSupported(lang_tag))
+    return false;
+
+  Microsoft::WRL::ComPtr<ISpellChecker> spell_checker;
+  std::wstring bcp47_language_tag = base::UTF8ToWide(lang_tag);
+  HRESULT hr = spell_checker_factory_->CreateSpellChecker(
+      bcp47_language_tag.c_str(), &spell_checker);
+
+  if (SUCCEEDED(hr)) {
+    spell_checker_map_.insert({lang_tag, spell_checker});
+    return true;
   }
 
-  // Run the callback with result on the main thread.
-  main_task_runner_->PostTask(FROM_HERE,
-                              base::BindOnce(std::move(callback), result));
+  return false;
 }
 
 void WindowsSpellChecker::BackgroundHelper::DisableSpellChecker(
@@ -98,10 +97,10 @@
   }
 }
 
-void WindowsSpellChecker::BackgroundHelper::RequestTextCheckForAllLanguages(
+std::vector<SpellCheckResult>
+WindowsSpellChecker::BackgroundHelper::RequestTextCheckForAllLanguages(
     int document_tag,
-    const base::string16& text,
-    spellcheck_platform::TextCheckCompleteCallback callback) {
+    const base::string16& text) {
   DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
 
   // Construct a map to store spellchecking results. The key of the map is a
@@ -162,14 +161,12 @@
     }
   }
 
-  // Runs the callback on the main thread after spellcheck completed.
-  main_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(std::move(callback), final_results));
+  return final_results;
 }
 
-void WindowsSpellChecker::BackgroundHelper::GetPerLanguageSuggestions(
-    const base::string16& word,
-    spellcheck_platform::GetSuggestionsCallback callback) {
+spellcheck::PerLanguageSuggestions
+WindowsSpellChecker::BackgroundHelper::GetPerLanguageSuggestions(
+    const base::string16& word) {
   DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
   spellcheck::PerLanguageSuggestions suggestions;
   std::vector<base::string16> language_suggestions;
@@ -181,9 +178,7 @@
     suggestions.push_back(language_suggestions);
   }
 
-  // Runs the callback on the main thread after spellcheck completed.
-  main_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(std::move(callback), std::move(suggestions)));
+  return suggestions;
 }
 
 void WindowsSpellChecker::BackgroundHelper::FillSuggestionList(
@@ -263,21 +258,9 @@
   return SUCCEEDED(hr) && is_language_supported;
 }
 
-void WindowsSpellChecker::BackgroundHelper::IsLanguageSupportedWithCallback(
-    const std::string& lang_tag,
-    base::OnceCallback<void(bool)> callback) {
-  DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
-  bool result = IsLanguageSupported(lang_tag);
-
-  // Run the callback with result on the main thread.
-  main_task_runner_->PostTask(FROM_HERE,
-                              base::BindOnce(std::move(callback), result));
-}
-
 #if BUILDFLAG(USE_WINDOWS_PREFERRED_LANGUAGES_FOR_SPELLCHECK)
-void WindowsSpellChecker::BackgroundHelper::
-    GetSupportedWindowsPreferredLanguages(
-        spellcheck_platform::GetSupportedLanguagesCompleteCallback callback) {
+std::vector<std::string>
+WindowsSpellChecker::BackgroundHelper::GetSupportedWindowsPreferredLanguages() {
   DCHECK(background_task_runner_->RunsTasksInCurrentSequence());
   std::vector<std::string> supported_languages;
 
@@ -348,8 +331,7 @@
     }
   }
 
-  main_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(std::move(callback), supported_languages));
+  return supported_languages;
 }
 #endif  // #if BUILDFLAG(USE_WINDOWS_PREFERRED_LANGUAGES_FOR_SPELLCHECK)
 
@@ -434,11 +416,10 @@
 }
 
 WindowsSpellChecker::WindowsSpellChecker(
-    scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> background_task_runner)
     : background_task_runner_(background_task_runner) {
   background_helper_ = std::make_unique<WindowsSpellChecker::BackgroundHelper>(
-      std::move(main_task_runner), std::move(background_task_runner));
+      std::move(background_task_runner));
 
   background_task_runner_->PostTask(
       FROM_HERE, base::BindOnce(&BackgroundHelper::CreateSpellCheckerFactory,
@@ -452,10 +433,11 @@
 void WindowsSpellChecker::CreateSpellChecker(
     const std::string& lang_tag,
     base::OnceCallback<void(bool)> callback) {
-  background_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&BackgroundHelper::CreateSpellChecker,
-                                base::Unretained(background_helper_.get()),
-                                lang_tag, std::move(callback)));
+  base::PostTaskAndReplyWithResult(
+      background_task_runner_.get(), FROM_HERE,
+      base::BindOnce(&BackgroundHelper::CreateSpellChecker,
+                     base::Unretained(background_helper_.get()), lang_tag),
+      std::move(callback));
 }
 
 void WindowsSpellChecker::DisableSpellChecker(const std::string& lang_tag) {
@@ -469,20 +451,22 @@
     int document_tag,
     const base::string16& text,
     spellcheck_platform::TextCheckCompleteCallback callback) {
-  background_task_runner_->PostTask(
-      FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      background_task_runner_.get(), FROM_HERE,
       base::BindOnce(&BackgroundHelper::RequestTextCheckForAllLanguages,
                      base::Unretained(background_helper_.get()), document_tag,
-                     text, std::move(callback)));
+                     text),
+      std::move(callback));
 }
 
 void WindowsSpellChecker::GetPerLanguageSuggestions(
     const base::string16& word,
     spellcheck_platform::GetSuggestionsCallback callback) {
-  background_task_runner_->PostTask(
-      FROM_HERE, base::BindOnce(&BackgroundHelper::GetPerLanguageSuggestions,
-                                base::Unretained(background_helper_.get()),
-                                word, std::move(callback)));
+  base::PostTaskAndReplyWithResult(
+      background_task_runner_.get(), FROM_HERE,
+      base::BindOnce(&BackgroundHelper::GetPerLanguageSuggestions,
+                     base::Unretained(background_helper_.get()), word),
+      std::move(callback));
 }
 
 void WindowsSpellChecker::AddWordForAllLanguages(const base::string16& word) {
@@ -511,11 +495,11 @@
 void WindowsSpellChecker::IsLanguageSupported(
     const std::string& lang_tag,
     base::OnceCallback<void(bool)> callback) {
-  background_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&BackgroundHelper::IsLanguageSupportedWithCallback,
-                     base::Unretained(background_helper_.get()), lang_tag,
-                     std::move(callback)));
+  base::PostTaskAndReplyWithResult(
+      background_task_runner_.get(), FROM_HERE,
+      base::BindOnce(&BackgroundHelper::IsLanguageSupported,
+                     base::Unretained(background_helper_.get()), lang_tag),
+      std::move(callback));
 }
 
 void WindowsSpellChecker::RecordChromeLocalesStats(
@@ -539,10 +523,10 @@
 #if BUILDFLAG(USE_WINDOWS_PREFERRED_LANGUAGES_FOR_SPELLCHECK)
 void WindowsSpellChecker::GetSupportedWindowsPreferredLanguages(
     spellcheck_platform::GetSupportedLanguagesCompleteCallback callback) {
-  background_task_runner_->PostTask(
-      FROM_HERE,
+  base::PostTaskAndReplyWithResult(
+      background_task_runner_.get(), FROM_HERE,
       base::BindOnce(&BackgroundHelper::GetSupportedWindowsPreferredLanguages,
-                     base::Unretained(background_helper_.get()),
-                     std::move(callback)));
+                     base::Unretained(background_helper_.get())),
+      std::move(callback));
 }
 #endif  // BUILDFLAG(USE_WINDOWS_PREFERRED_LANGUAGES_FOR_SPELLCHECK
diff --git a/components/spellcheck/browser/windows_spell_checker.h b/components/spellcheck/browser/windows_spell_checker.h
index e922e2ee..e30c2f9 100644
--- a/components/spellcheck/browser/windows_spell_checker.h
+++ b/components/spellcheck/browser/windows_spell_checker.h
@@ -15,6 +15,7 @@
 #include "components/spellcheck/browser/platform_spell_checker.h"
 #include "components/spellcheck/browser/spellcheck_host_metrics.h"
 #include "components/spellcheck/browser/spellcheck_platform.h"
+#include "components/spellcheck/common/spellcheck_result.h"
 #include "components/spellcheck/spellcheck_buildflags.h"
 
 namespace base {
@@ -27,7 +28,6 @@
 class WindowsSpellChecker : public PlatformSpellChecker {
  public:
   WindowsSpellChecker(
-      scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner> background_task_runner);
 
   WindowsSpellChecker(const WindowsSpellChecker&) = delete;
@@ -79,7 +79,6 @@
   class BackgroundHelper {
    public:
     BackgroundHelper(
-        scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
         scoped_refptr<base::SingleThreadTaskRunner> background_task_runner);
     ~BackgroundHelper();
 
@@ -88,27 +87,25 @@
     void CreateSpellCheckerFactory();
 
     // Creates a native |ISpellchecker| for the given language |lang_tag| and
-    // invokes the given callback with the creation result.
-    void CreateSpellChecker(const std::string& lang_tag,
-                            base::OnceCallback<void(bool)> callback);
+    // returns a boolean indicating success.
+    bool CreateSpellChecker(const std::string& lang_tag);
 
     // Removes the native spell checker for the given language |lang_tag| from
     // the map of active spell checkers.
     void DisableSpellChecker(const std::string& lang_tag);
 
     // Requests spell checking of string |text| for all active spell checkers
-    // (all languages) and invokes the given callback with the results.
-    void RequestTextCheckForAllLanguages(
+    // (all languages) and returns a vector of |SpellCheckResult| containing the
+    // results.
+    std::vector<SpellCheckResult> RequestTextCheckForAllLanguages(
         int document_tag,
-        const base::string16& text,
-        spellcheck_platform::TextCheckCompleteCallback callback);
+        const base::string16& text);
 
     // Gets spelling suggestions for |word| from all active spell checkers (all
-    // languages), keeping the suggestions separate per language, and invokes
-    // the given callback with the results.
-    void GetPerLanguageSuggestions(
-        const base::string16& word,
-        spellcheck_platform::GetSuggestionsCallback callback);
+    // languages), keeping the suggestions separate per language, and returns
+    // the results in a vector of vector of strings.
+    spellcheck::PerLanguageSuggestions GetPerLanguageSuggestions(
+        const base::string16& word);
 
     // Fills the given vector |optional_suggestions| with a number (up to
     // kMaxSuggestions) of suggestions for the string |wrong_word| using the
@@ -135,12 +132,6 @@
     // OS settings.
     bool IsLanguageSupported(const std::string& lang_tag);
 
-    // Checks if a native spell checker is available for the given language
-    // |lang_tag| and invokes the given callback with the result.
-    void IsLanguageSupportedWithCallback(
-        const std::string& lang_tag,
-        base::OnceCallback<void(bool)> callback);
-
     // Returns |true| if an |ISpellCheckerFactory| has been initialized.
     bool IsSpellCheckerFactoryInitialized();
 
@@ -166,8 +157,7 @@
     // Gets the user's preferred languages from the OS settings, filters out
     // languages for which a native spell checker isn't available, and invokes
     // the given callback with the results.
-    void GetSupportedWindowsPreferredLanguages(
-        spellcheck_platform::GetSupportedLanguagesCompleteCallback callback);
+    std::vector<std::string> GetSupportedWindowsPreferredLanguages();
 #endif  // BUILDFLAG(USE_WINDOWS_PREFERRED_LANGUAGES_FOR_SPELLCHECK)
 
     // Sorts the given locales into four buckets based on spell check support
@@ -184,9 +174,6 @@
     std::map<std::string, Microsoft::WRL::ComPtr<ISpellChecker>>
         spell_checker_map_;
 
-    // Task runner used to post callback invocations to the main thread.
-    scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
-
     // Task runner only used to enforce valid sequencing.
     scoped_refptr<base::SingleThreadTaskRunner> background_task_runner_;
   };  // class BackgroundHelper
diff --git a/components/spellcheck/browser/windows_spell_checker_unittest.cc b/components/spellcheck/browser/windows_spell_checker_unittest.cc
index 80170abc..e7ca8d9 100644
--- a/components/spellcheck/browser/windows_spell_checker_unittest.cc
+++ b/components/spellcheck/browser/windows_spell_checker_unittest.cc
@@ -15,7 +15,6 @@
 #include "base/task/post_task.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
-#include "base/threading/thread_task_runner_handle.h"
 #include "base/win/windows_version.h"
 #include "build/build_config.h"
 #include "components/spellcheck/browser/windows_spell_checker.h"
@@ -35,7 +34,6 @@
           spellcheck::kWinUseBrowserSpellChecker);
 
       win_spell_checker_ = std::make_unique<WindowsSpellChecker>(
-          base::ThreadTaskRunnerHandle::Get(),
           base::CreateCOMSTATaskRunner({base::ThreadPool(), base::MayBlock()}));
 
       win_spell_checker_->CreateSpellChecker(
diff --git a/components/sync/base/sync_prefs.cc b/components/sync/base/sync_prefs.cc
index f7962ac..204b720a 100644
--- a/components/sync/base/sync_prefs.cc
+++ b/components/sync/base/sync_prefs.cc
@@ -293,6 +293,10 @@
   }
 #endif
 
+  // The encryption bootstrap token represents a user-entered passphrase.
+  registry->RegisterStringPref(prefs::kSyncEncryptionBootstrapToken,
+                               std::string());
+
   // Internal or bookkeeping prefs.
   registry->RegisterStringPref(prefs::kSyncCacheGuid, std::string());
   registry->RegisterStringPref(prefs::kSyncBirthday, std::string());
@@ -301,8 +305,6 @@
   registry->RegisterInt64Pref(prefs::kSyncLastPollTime, 0);
   registry->RegisterInt64Pref(prefs::kSyncPollIntervalSeconds, 0);
   registry->RegisterBooleanPref(prefs::kSyncManaged, false);
-  registry->RegisterStringPref(prefs::kSyncEncryptionBootstrapToken,
-                               std::string());
   registry->RegisterStringPref(prefs::kSyncKeystoreEncryptionBootstrapToken,
                                std::string());
   registry->RegisterBooleanPref(prefs::kSyncPassphrasePrompted, false);
@@ -347,7 +349,7 @@
   sync_pref_observers_.RemoveObserver(sync_pref_observer);
 }
 
-void SyncPrefs::ClearPreferences() {
+void SyncPrefs::ClearLocalSyncTransportData() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // Clear user's birth year and gender.
@@ -357,31 +359,19 @@
   // even reveal their true birth year.
   pref_service_->ClearPref(prefs::kSyncDemographics);
 
-  ClearDirectoryConsistencyPreferences();
-
   pref_service_->ClearPref(prefs::kSyncLastSyncedTime);
   pref_service_->ClearPref(prefs::kSyncLastPollTime);
   pref_service_->ClearPref(prefs::kSyncPollIntervalSeconds);
-  pref_service_->ClearPref(prefs::kSyncEncryptionBootstrapToken);
   pref_service_->ClearPref(prefs::kSyncKeystoreEncryptionBootstrapToken);
   pref_service_->ClearPref(prefs::kSyncPassphrasePrompted);
   pref_service_->ClearPref(prefs::kSyncInvalidationVersions);
   pref_service_->ClearPref(prefs::kSyncLastRunVersion);
-  // No need to clear kManaged, kEnableLocalSyncBackend or kLocalSyncBackendDir,
-  // since they're never actually set as user preferences.
-
-  // Note: We do *not* clear prefs which are directly user-controlled such as
-  // the set of selected types here, so that if the user ever chooses to enable
-  // Sync again, they start off with their previous settings by default.
-  // We do however require going through first-time setup again.
-  pref_service_->ClearPref(prefs::kSyncFirstSetupComplete);
-}
-
-void SyncPrefs::ClearDirectoryConsistencyPreferences() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   pref_service_->ClearPref(prefs::kSyncCacheGuid);
   pref_service_->ClearPref(prefs::kSyncBirthday);
   pref_service_->ClearPref(prefs::kSyncBagOfChips);
+
+  // No need to clear kManaged, kEnableLocalSyncBackend or kLocalSyncBackendDir,
+  // since they're never actually set as user preferences.
 }
 
 bool SyncPrefs::IsFirstSetupComplete() const {
@@ -394,6 +384,11 @@
   pref_service_->SetBoolean(prefs::kSyncFirstSetupComplete, true);
 }
 
+void SyncPrefs::ClearFirstSetupComplete() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  pref_service_->ClearPref(prefs::kSyncFirstSetupComplete);
+}
+
 bool SyncPrefs::IsSyncRequested() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return pref_service_->GetBoolean(prefs::kSyncRequested);
@@ -556,6 +551,11 @@
   pref_service_->SetString(prefs::kSyncEncryptionBootstrapToken, token);
 }
 
+void SyncPrefs::ClearEncryptionBootstrapToken() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  pref_service_->ClearPref(prefs::kSyncEncryptionBootstrapToken);
+}
+
 std::string SyncPrefs::GetKeystoreEncryptionBootstrapToken() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return pref_service_->GetString(prefs::kSyncKeystoreEncryptionBootstrapToken);
diff --git a/components/sync/base/sync_prefs.h b/components/sync/base/sync_prefs.h
index fb90584..75b71e7a 100644
--- a/components/sync/base/sync_prefs.h
+++ b/components/sync/base/sync_prefs.h
@@ -77,19 +77,15 @@
   // Clears "bookkeeping" sync preferences, such as the last synced time,
   // whether the last shutdown was clean, etc. Does *not* clear sync preferences
   // which are directly user-controlled, such as the set of selected types.
-  void ClearPreferences();
-
-  // Clears only the subset of preferences that are redundant with the sync
-  // directory and used only for verifying consistency with prefs.
-  // TODO(crbug.com/923285): Remove this function and instead rely solely on
-  // ClearPreferences() once investigations are finalized are we understand the
-  // source of discrepancies for UMA Sync.DirectoryVsPrefsConsistency.
-  void ClearDirectoryConsistencyPreferences();
+  void ClearLocalSyncTransportData();
 
   // Getters and setters for global sync prefs.
 
+  // First-Setup-Complete is conceptually similar to the user's consent to
+  // enable sync-the-feature.
   bool IsFirstSetupComplete() const;
   void SetFirstSetupComplete();
+  void ClearFirstSetupComplete();
 
   bool IsSyncRequested() const;
   void SetSyncRequested(bool is_requested);
@@ -139,9 +135,14 @@
   // policy, is handled directly in ProfileSyncService.
   bool IsManaged() const;
 
-  // Use this encryption bootstrap token if we're using an explicit passphrase.
+  // The encryption bootstrap token is used for explicit passphrase users
+  // (usually custom passphrase) and represents a user-entered passphrase.
+  // Hence, it gets treated as user-controlled similarly to sync datatype
+  // selection settings (i.e. doesn't get cleared in
+  // ClearLocalSyncTransportData()).
   std::string GetEncryptionBootstrapToken() const override;
   void SetEncryptionBootstrapToken(const std::string& token) override;
+  void ClearEncryptionBootstrapToken();
 
   // Use this keystore bootstrap token if we're not using an explicit
   // passphrase.
@@ -151,10 +152,6 @@
   // Maps |type| to its corresponding preference name.
   static const char* GetPrefNameForType(UserSelectableType type);
 
-  // Copy of various fields historically owned and persisted by the Directory.
-  // This is a future-proof approach to ultimately replace the Directory once
-  // most users have populated prefs and the Directory is about to be removed.
-  // TODO(crbug.com/923287): Figure out if this is an appropriate place.
   void SetCacheGuid(const std::string& cache_guid);
   std::string GetCacheGuid() const;
   void SetBirthday(const std::string& birthday);
diff --git a/components/sync/base/sync_prefs_unittest.cc b/components/sync/base/sync_prefs_unittest.cc
index 3bb06474..da2e6880 100644
--- a/components/sync/base/sync_prefs_unittest.cc
+++ b/components/sync/base/sync_prefs_unittest.cc
@@ -122,9 +122,7 @@
 
   sync_prefs_->SetFirstSetupComplete();
   EXPECT_TRUE(sync_prefs_->IsFirstSetupComplete());
-  // There's no direct way to clear the first-setup-complete bit, so just reset
-  // all prefs instead.
-  sync_prefs_->ClearPreferences();
+  sync_prefs_->ClearFirstSetupComplete();
   EXPECT_FALSE(sync_prefs_->IsFirstSetupComplete());
 
   sync_prefs_->SetSyncRequested(true);
@@ -148,24 +146,32 @@
 }
 #endif
 
-TEST_F(SyncPrefsTest, ClearPreferences) {
-  EXPECT_FALSE(sync_prefs_->IsFirstSetupComplete());
-  EXPECT_EQ(base::Time(), sync_prefs_->GetLastSyncedTime());
-  EXPECT_TRUE(sync_prefs_->GetEncryptionBootstrapToken().empty());
+TEST_F(SyncPrefsTest, ClearLocalSyncTransportData) {
+  ASSERT_FALSE(sync_prefs_->IsFirstSetupComplete());
+  ASSERT_EQ(base::Time(), sync_prefs_->GetLastSyncedTime());
+  ASSERT_TRUE(sync_prefs_->GetEncryptionBootstrapToken().empty());
 
   sync_prefs_->SetFirstSetupComplete();
   sync_prefs_->SetLastSyncedTime(base::Time::Now());
-  sync_prefs_->SetEncryptionBootstrapToken("token");
+  sync_prefs_->SetEncryptionBootstrapToken("explicit_passphrase_token");
+  sync_prefs_->SetKeystoreEncryptionBootstrapToken("keystore_token");
 
-  EXPECT_TRUE(sync_prefs_->IsFirstSetupComplete());
-  EXPECT_NE(base::Time(), sync_prefs_->GetLastSyncedTime());
-  EXPECT_EQ("token", sync_prefs_->GetEncryptionBootstrapToken());
+  ASSERT_TRUE(sync_prefs_->IsFirstSetupComplete());
+  ASSERT_NE(base::Time(), sync_prefs_->GetLastSyncedTime());
+  ASSERT_EQ("explicit_passphrase_token",
+            sync_prefs_->GetEncryptionBootstrapToken());
+  ASSERT_EQ("keystore_token",
+            sync_prefs_->GetKeystoreEncryptionBootstrapToken());
 
-  sync_prefs_->ClearPreferences();
+  sync_prefs_->ClearLocalSyncTransportData();
 
-  EXPECT_FALSE(sync_prefs_->IsFirstSetupComplete());
   EXPECT_EQ(base::Time(), sync_prefs_->GetLastSyncedTime());
-  EXPECT_TRUE(sync_prefs_->GetEncryptionBootstrapToken().empty());
+  EXPECT_TRUE(sync_prefs_->GetKeystoreEncryptionBootstrapToken().empty());
+
+  // User-entered field should not have been cleared.
+  EXPECT_TRUE(sync_prefs_->IsFirstSetupComplete());
+  EXPECT_EQ("explicit_passphrase_token",
+            sync_prefs_->GetEncryptionBootstrapToken());
 }
 
 TEST_F(SyncPrefsTest, ReadDemographicsWithRandomOffset) {
@@ -221,7 +227,7 @@
     ASSERT_TRUE(demographics_result.IsSuccess());
   }
 
-  sync_prefs_->ClearPreferences();
+  sync_prefs_->ClearLocalSyncTransportData();
 
   // Verify that demographics are not provided and kSyncDemographics is cleared.
   // Note that we retain kSyncDemographicsBirthYearOffset. If the user resumes
diff --git a/components/sync/driver/profile_sync_service.cc b/components/sync/driver/profile_sync_service.cc
index dd3df1e..30a51a6 100644
--- a/components/sync/driver/profile_sync_service.cc
+++ b/components/sync/driver/profile_sync_service.cc
@@ -516,9 +516,7 @@
   // updates requires that the request either has a birthday, or there should be
   // no progress marker).
   if (sync_prefs_.GetCacheGuid().empty() || sync_prefs_.GetBirthday().empty()) {
-    // TODO(crbug.com/923285): This doesn't seem to belong here, or if it does,
-    // all preferences should be cleared via SyncPrefs::ClearPreferences().
-    sync_prefs_.ClearDirectoryConsistencyPreferences();
+    sync_prefs_.ClearLocalSyncTransportData();
     sync_prefs_.SetCacheGuid(GenerateCacheGUID());
   }
 
@@ -625,6 +623,7 @@
             base::BindOnce(&syncable::Directory::DeleteDirectoryFiles,
                            sync_client_->GetSyncDataPath()));
       }
+      sync_prefs_.ClearLocalSyncTransportData();
     }
     return;
   }
@@ -679,6 +678,10 @@
     auth_manager_->ConnectionClosed();
   }
 
+  if (reason == ShutdownReason::DISABLE_SYNC) {
+    sync_prefs_.ClearLocalSyncTransportData();
+  }
+
   NotifyObservers();
 }
 
@@ -690,11 +693,15 @@
     case CLEAR_DATA:
       ClearUnrecoverableError();
       ShutdownImpl(DISABLE_SYNC);
-      // Clear prefs (including SyncSetupHasCompleted) before shutting down so
-      // PSS clients don't think we're set up while we're shutting down.
-      // Note: We do this after shutting down, so that notifications about the
-      // changed pref values don't mess up our state.
-      sync_prefs_.ClearPreferences();
+      // Note: ShutdownImpl(DISABLE_SYNC) does *not* clear prefs which are
+      // directly user-controlled such as the set of selected types here, so
+      // that if the user ever chooses to enable Sync again, they start off
+      // with their previous settings by default. We do however require going
+      // through first-time setup again.
+      sync_prefs_.ClearFirstSetupComplete();
+      // For explicit passphrase users, clear the encryption key, such that they
+      // will need to reenter it if sync gets re-enabled.
+      sync_prefs_.ClearEncryptionBootstrapToken();
       break;
   }
 }
@@ -854,15 +861,6 @@
 
   // Shut all data types down.
   ShutdownImpl(DISABLE_SYNC);
-
-  // This is the equivalent for Directory::DeleteDirectoryFiles(), guaranteed
-  // to be called, either directly in ShutdownImpl(), or later in
-  // SyncEngineBackend::DoShutdown().
-  // TODO(crbug.com/923285): This doesn't seem to belong here, or if it does,
-  // all preferences should be cleared via SyncPrefs::ClearPreferences(),
-  // which is done by some of the callers (but not all). Care must be taken
-  // however for scenarios like custom passphrase being set.
-  sync_prefs_.ClearDirectoryConsistencyPreferences();
 }
 
 void ProfileSyncService::DataTypePreconditionChanged(ModelType type) {
@@ -1060,27 +1058,9 @@
       // restart.
       sync_disabled_by_admin_ = true;
       ShutdownImpl(DISABLE_SYNC);
-      // This is the equivalent for Directory::DeleteDirectoryFiles(),
-      // guaranteed to be called, either directly in ShutdownImpl(), or later in
-      // SyncEngineBackend::DoShutdown().
-      // TODO(crbug.com/923285): This doesn't seem to belong here, or if it
-      // does, all preferences should be cleared via
-      // SyncPrefs::ClearPreferences(), which is done by some of the callers
-      // (but not all). Care must be taken however for scenarios like custom
-      // passphrase being set.
-      sync_prefs_.ClearDirectoryConsistencyPreferences();
       break;
     case RESET_LOCAL_SYNC_DATA:
       ShutdownImpl(DISABLE_SYNC);
-      // This is the equivalent for Directory::DeleteDirectoryFiles(),
-      // guaranteed to be called, either directly in ShutdownImpl(), or later in
-      // SyncEngineBackend::DoShutdown().
-      // TODO(crbug.com/923285): This doesn't seem to belong here, or if it
-      // does, all preferences should be cleared via
-      // SyncPrefs::ClearPreferences(), which is done by some of the callers
-      // (but not all). Care must be taken however for scenarios like custom
-      // passphrase being set.
-      sync_prefs_.ClearDirectoryConsistencyPreferences();
       startup_controller_->TryStart(/*force_immediate=*/true);
       break;
     case UNKNOWN_ACTION:
diff --git a/components/sync/driver/profile_sync_service_unittest.cc b/components/sync/driver/profile_sync_service_unittest.cc
index 8bcaa84..f768888 100644
--- a/components/sync/driver/profile_sync_service_unittest.cc
+++ b/components/sync/driver/profile_sync_service_unittest.cc
@@ -54,6 +54,7 @@
 constexpr int kOldEnoughForDemographicsUserBirthYear = 1983;
 
 constexpr char kTestUser[] = "test_user@gmail.com";
+constexpr char kTestCacheGuid[] = "test_cache_guid";
 
 // Now time in string format.
 constexpr char kNowTimeInStringFormat[] = "23 Mar 2019 16:00:00 UDT";
@@ -231,6 +232,8 @@
   void InitializeForNthSync() {
     // Set first sync time before initialize to simulate a complete sync setup.
     SyncPrefs sync_prefs(prefs());
+    sync_prefs.SetCacheGuid(kTestCacheGuid);
+    sync_prefs.SetBirthday(FakeSyncEngine::kTestBirthday);
     sync_prefs.SetLastSyncedTime(base::Time::Now());
     sync_prefs.SetSyncRequested(true);
     sync_prefs.SetSelectedTypes(
@@ -387,13 +390,18 @@
   CreateService(ProfileSyncService::MANUAL_START);
 
   SyncPrefs sync_prefs(prefs());
-  base::Time now = base::Time::Now();
-  sync_prefs.SetLastSyncedTime(now);
   sync_prefs.SetSyncRequested(true);
   sync_prefs.SetSelectedTypes(
       /*keep_everything_synced=*/true,
       /*registered_types=*/UserSelectableTypeSet::All(),
       /*selected_types=*/UserSelectableTypeSet::All());
+
+  // Mimic a sync cycle (transport-only) having completed earlier.
+  const base::Time kLastSyncedTime = base::Time::Now();
+  sync_prefs.SetLastSyncedTime(kLastSyncedTime);
+  sync_prefs.SetCacheGuid(kTestCacheGuid);
+  sync_prefs.SetBirthday(FakeSyncEngine::kTestBirthday);
+
   service()->Initialize();
 
   EXPECT_EQ(SyncService::DisableReasonSet(), service()->GetDisableReasons());
@@ -404,10 +412,9 @@
   EXPECT_FALSE(service()->IsSyncFeatureActive());
   EXPECT_FALSE(service()->IsSyncFeatureEnabled());
 
-  // The last sync time shouldn't be cleared.
-  // TODO(zea): figure out a way to check that the directory itself wasn't
-  // cleared.
-  EXPECT_EQ(now, sync_prefs.GetLastSyncedTime());
+  // The local sync data shouldn't be cleared.
+  EXPECT_EQ(kTestCacheGuid, sync_prefs.GetCacheGuid());
+  EXPECT_EQ(kLastSyncedTime, sync_prefs.GetLastSyncedTime());
 }
 
 // Verify that the SetSetupInProgress function call updates state
diff --git a/components/viz/common/display/renderer_settings.h b/components/viz/common/display/renderer_settings.h
index f4d5e4d..a27d84c 100644
--- a/components/viz/common/display/renderer_settings.h
+++ b/components/viz/common/display/renderer_settings.h
@@ -49,6 +49,14 @@
   // The maximum number of occluding Rects to track during occlusion culling.
   int kMaximumOccluderComplexity = 10;
 
+  // The maximum number (exclusive) of quads one draw quad may be split into
+  // during occlusion culling. e.g. an L-shaped visible region split into two
+  // quads
+  int quad_split_limit = 5;
+  // The minimum number of fragments that would not be drawn if a quads was
+  // split into multiple quads during occlusion culling.
+  int minimum_fragments_reduced = 128 * 128;
+
 #if defined(OS_ANDROID)
   // The screen size at renderer creation time.
   gfx::Size initial_screen_size = gfx::Size(0, 0);
diff --git a/components/viz/common/quads/render_pass.cc b/components/viz/common/quads/render_pass.cc
index 0418e51..2e08e45 100644
--- a/components/viz/common/quads/render_pass.cc
+++ b/components/viz/common/quads/render_pass.cc
@@ -60,6 +60,63 @@
                       needs_blending, SK_ColorTRANSPARENT, true);
 }
 
+QuadList::Iterator QuadList::InsertCopyBeforeDrawQuad(Iterator at,
+                                                      size_t count) {
+  DCHECK(at->shared_quad_state);
+  switch (at->material) {
+    case DrawQuad::Material::kDebugBorder: {
+      const auto copy = *DebugBorderDrawQuad::MaterialCast(*at);
+      return InsertBeforeAndInvalidateAllPointers<DebugBorderDrawQuad>(
+          at, count, copy);
+    }
+    case DrawQuad::Material::kPictureContent: {
+      const auto copy = *PictureDrawQuad::MaterialCast(*at);
+      return InsertBeforeAndInvalidateAllPointers<PictureDrawQuad>(at, count,
+                                                                   copy);
+    }
+    case DrawQuad::Material::kTextureContent: {
+      const auto copy = *TextureDrawQuad::MaterialCast(*at);
+      return InsertBeforeAndInvalidateAllPointers<TextureDrawQuad>(at, count,
+                                                                   copy);
+    }
+    case DrawQuad::Material::kSolidColor: {
+      const auto copy = *SolidColorDrawQuad::MaterialCast(*at);
+      return InsertBeforeAndInvalidateAllPointers<SolidColorDrawQuad>(at, count,
+                                                                      copy);
+    }
+    case DrawQuad::Material::kTiledContent: {
+      const auto copy = *TileDrawQuad::MaterialCast(*at);
+      return InsertBeforeAndInvalidateAllPointers<TileDrawQuad>(at, count,
+                                                                copy);
+    }
+    case DrawQuad::Material::kStreamVideoContent: {
+      const auto copy = *StreamVideoDrawQuad::MaterialCast(*at);
+      return InsertBeforeAndInvalidateAllPointers<StreamVideoDrawQuad>(
+          at, count, copy);
+    }
+    case DrawQuad::Material::kSurfaceContent: {
+      const auto copy = *SurfaceDrawQuad::MaterialCast(*at);
+      return InsertBeforeAndInvalidateAllPointers<SurfaceDrawQuad>(at, count,
+                                                                   copy);
+    }
+    case DrawQuad::Material::kVideoHole: {
+      const auto copy = *VideoHoleDrawQuad::MaterialCast(*at);
+      return InsertBeforeAndInvalidateAllPointers<VideoHoleDrawQuad>(at, count,
+                                                                     copy);
+    }
+    case DrawQuad::Material::kYuvVideoContent: {
+      const auto copy = *YUVVideoDrawQuad::MaterialCast(*at);
+      return InsertBeforeAndInvalidateAllPointers<YUVVideoDrawQuad>(at, count,
+                                                                    copy);
+    }
+    // RenderPass quads should not be copied.
+    case DrawQuad::Material::kRenderPass:
+    case DrawQuad::Material::kInvalid:
+      NOTREACHED();  // Invalid DrawQuad material.
+      return at;
+  }
+}
+
 std::unique_ptr<RenderPass> RenderPass::Create() {
   return base::WrapUnique(new RenderPass());
 }
diff --git a/components/viz/common/quads/render_pass.h b/components/viz/common/quads/render_pass.h
index 4bf737d3..c020979 100644
--- a/components/viz/common/quads/render_pass.h
+++ b/components/viz/common/quads/render_pass.h
@@ -54,6 +54,7 @@
   // This function is used by overlay algorithm to fill the backbuffer with
   // transparent black.
   void ReplaceExistingQuadWithOpaqueTransparentSolidColor(Iterator at);
+  Iterator InsertCopyBeforeDrawQuad(Iterator at, size_t count);
 };
 
 using SharedQuadStateList = cc::ListContainer<SharedQuadState>;
diff --git a/components/viz/service/display/display.cc b/components/viz/service/display/display.cc
index 7155d337..41dcaf61 100644
--- a/components/viz/service/display/display.cc
+++ b/components/viz/service/display/display.cc
@@ -10,6 +10,7 @@
 #include "base/debug/dump_without_crashing.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/optional.h"
+#include "base/stl_util.h"
 #include "base/timer/elapsed_timer.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
@@ -47,6 +48,18 @@
 
 namespace {
 
+const DrawQuad::Material kNonSplittableMaterials[] = {
+    // Exclude debug quads from quad splitting
+    DrawQuad::Material::kDebugBorder,
+    // Exclude possible overlay candidates from quad splitting
+    // See OverlayCandidate::FromDrawQuad
+    DrawQuad::Material::kStreamVideoContent,
+    DrawQuad::Material::kTextureContent,
+    DrawQuad::Material::kVideoHole,
+    // See DCLayerOverlayProcessor::ProcessRenderPass
+    DrawQuad::Material::kYuvVideoContent,
+};
+
 constexpr base::TimeDelta kAllowedDeltaFromFuture =
     base::TimeDelta::FromMilliseconds(16);
 
@@ -145,6 +158,28 @@
   return safe_rect;
 }
 
+// TODO(sashamcintosh): consider moving to cc::Region
+int ComputeRegionArea(const cc::Region& region) {
+  int area = 0;
+  for (const auto& r : region)
+    area += r.size().GetArea();
+  return area;
+}
+
+bool CanSplitQuad(const DrawQuad::Material m,
+                  const cc::Region& visible_region,
+                  const int quad_split_limit,
+                  const int minimum_fragments_reduced,
+                  const int device_scale_factor,
+                  const bool enable_quad_splitting) {
+  return enable_quad_splitting && !base::Contains(kNonSplittableMaterials, m) &&
+         visible_region.GetRegionComplexity() < quad_split_limit &&
+         (visible_region.bounds().size().GetArea() -
+          ComputeRegionArea(visible_region)) *
+                 device_scale_factor * device_scale_factor >
+             minimum_fragments_reduced;
+}
+
 }  // namespace
 
 constexpr base::TimeDelta Display::kDrawToSwapMin;
@@ -319,7 +354,7 @@
 }
 
 void Display::Resize(const gfx::Size& size) {
-  disable_draw_until_resize_ = false;
+  disable_swap_until_resize_ = false;
 
   if (size == current_surface_size_)
     return;
@@ -341,7 +376,7 @@
   TRACE_EVENT0("viz", "Display::DisableSwapUntilResize");
   DCHECK(no_pending_swaps_callback_.is_null());
 
-  if (!disable_draw_until_resize_) {
+  if (!disable_swap_until_resize_) {
     DCHECK(scheduler_);
 
     if (!swapped_since_resize_)
@@ -353,7 +388,7 @@
       no_pending_swaps_callback_ = std::move(no_pending_swaps_callback);
     }
 
-    disable_draw_until_resize_ = true;
+    disable_swap_until_resize_ = true;
   }
 
   // There are no pending swaps for current size so immediately run callback.
@@ -583,8 +618,7 @@
   if (!size_matches)
     TRACE_EVENT_INSTANT0("viz", "Size mismatch.", TRACE_EVENT_SCOPE_THREAD);
 
-  bool should_draw = !disable_draw_until_resize_ &&
-                     (have_copy_requests || (have_damage && size_matches));
+  bool should_draw = have_copy_requests || (have_damage && size_matches);
   client_->DisplayWillDrawAndSwap(should_draw, &frame.render_pass_list);
 
   base::Optional<base::ElapsedTimer> draw_timer;
@@ -631,7 +665,7 @@
     TRACE_EVENT_INSTANT0("viz", "Draw skipped.", TRACE_EVENT_SCOPE_THREAD);
   }
 
-  bool should_swap = should_draw && size_matches;
+  bool should_swap = !disable_swap_until_resize_ && should_draw && size_matches;
   if (should_swap) {
     PresentationGroupTiming presentation_group_timing;
     presentation_group_timing.OnDraw(draw_timer->Begin());
@@ -987,10 +1021,27 @@
         // Case 2: for simple transforms, if the quad is partially shown on
         // screen and the region formed by (occlusion region - visible_rect) is
         // a rect, then update visible_rect to the resulting rect.
-        cc::Region origin_rect = quad->visible_rect;
-        origin_rect.Subtract(occlusion_in_quad_content_space);
-        quad->visible_rect = origin_rect.bounds();
-        ++quad;
+        cc::Region visible_region = quad->visible_rect;
+        visible_region.Subtract(occlusion_in_quad_content_space);
+        quad->visible_rect = visible_region.bounds();
+
+        // Split quad into multiple draw quads when area can be reduce by
+        // more than X fragments.
+        const bool should_split_quads = CanSplitQuad(
+            quad->material, visible_region, settings_.quad_split_limit,
+            settings_.minimum_fragments_reduced, device_scale_factor_,
+            !overlay_processor_->DisableSplittingQuads());
+        if (should_split_quads) {
+          auto new_quad = pass->quad_list.InsertCopyBeforeDrawQuad(
+              quad, visible_region.GetRegionComplexity() - 1);
+          for (const auto& visible_rect : visible_region) {
+            new_quad->visible_rect = visible_rect;
+            ++new_quad;
+          }
+          quad = new_quad;
+        } else {
+          ++quad;
+        }
       } else if (occlusion_in_quad_content_space.IsEmpty() &&
                  occlusion_in_target_space.Contains(
                      cc::MathUtil::MapEnclosingClippedRect(
diff --git a/components/viz/service/display/display.h b/components/viz/service/display/display.h
index 5a867ca..10c7a00 100644
--- a/components/viz/service/display/display.h
+++ b/components/viz/service/display/display.h
@@ -253,7 +253,7 @@
   base::circular_deque<Display::PresentationGroupTiming>
       pending_presentation_group_timings_;
 
-  bool disable_draw_until_resize_ = true;
+  bool disable_swap_until_resize_ = true;
 
   // Callback that will be run after all pending swaps have acked.
   base::OnceClosure no_pending_swaps_callback_;
diff --git a/components/viz/service/display/display_unittest.cc b/components/viz/service/display/display_unittest.cc
index 9812289..dd8f700 100644
--- a/components/viz/service/display/display_unittest.cc
+++ b/components/viz/service/display/display_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/null_task_runner.h"
 #include "cc/base/math_util.h"
+#include "cc/base/region.h"
 #include "cc/test/scheduler_test_common.h"
 #include "components/viz/common/frame_sinks/begin_frame_source.h"
 #include "components/viz/common/frame_sinks/copy_output_request.h"
@@ -4116,6 +4117,99 @@
   TearDownDisplay();
 }
 
+TEST_F(DisplayTest, DrawOcclusionSplit) {
+  SetUpGpuDisplay(RendererSettings());
+
+  StubDisplayClient client;
+  display_->Initialize(&client, manager_.surface_manager());
+
+  // The two partially occluded quads will be split into two additional quads,
+  // preserving only the visible regions.
+  CompositorFrame frame = MakeDefaultCompositorFrame();
+
+  //  +--------------------------------+
+  //  |***+----------------------+ <- Large occluding Rect
+  //  +---|-  -   -  - +  -  -  -|-----+
+  //  |***|            .         |*****|
+  //  |***+----------------------+*****|
+  //  |****************|***************|
+  //  +----------------+---------------+
+  //
+  // * -> Visible rect for the quads.
+
+  const gfx::Rect occluding_rect(10, 10, 1000, 490);
+  const gfx::Rect quad_rects[3] = {
+      gfx::Rect(0, 0, 1200, 20),
+      gfx::Rect(0, 20, 600, 490),
+      gfx::Rect(600, 20, 600, 490),
+  };
+  gfx::Rect occluded_sqs_rect(0, 0, 1200, 510);
+
+  const bool is_clipped = false;
+  const bool are_contents_opaque = true;
+  const float opacity = 1.f;
+  SharedQuadState* shared_quad_state_occluder =
+      frame.render_pass_list.front()->CreateAndAppendSharedQuadState();
+  SharedQuadState* shared_quad_state_occluded =
+      frame.render_pass_list.front()->CreateAndAppendSharedQuadState();
+
+  SolidColorDrawQuad* quads[4];
+  for (auto*& quad : quads) {
+    quad = frame.render_pass_list.front()
+               ->quad_list.AllocateAndConstruct<SolidColorDrawQuad>();
+  }
+
+  {
+    shared_quad_state_occluder->SetAll(
+        gfx::Transform(), occluding_rect, occluding_rect, gfx::RRectF(),
+        occluding_rect, is_clipped, are_contents_opaque, opacity,
+        SkBlendMode::kSrcOver, 0);
+    quads[0]->SetNew(shared_quad_state_occluder, occluding_rect, occluding_rect,
+                     SK_ColorRED, false);
+
+    shared_quad_state_occluded->SetAll(
+        gfx::Transform(), occluded_sqs_rect, occluded_sqs_rect, gfx::RRectF(),
+        occluded_sqs_rect, is_clipped, are_contents_opaque, opacity,
+        SkBlendMode::kSrcOver, 0);
+    for (int i = 1; i < 4; i++) {
+      quads[i]->SetNew(shared_quad_state_occluded, quad_rects[i - 1],
+                       quad_rects[i - 1], SK_ColorRED, false);
+    }
+
+    EXPECT_EQ(4u, frame.render_pass_list.front()->quad_list.size());
+    display_->RemoveOverdrawQuads(&frame);
+    ASSERT_EQ(6u, frame.render_pass_list.front()->quad_list.size());
+    EXPECT_EQ(occluding_rect.ToString(), frame.render_pass_list.front()
+                                             ->quad_list.ElementAt(0)
+                                             ->visible_rect.ToString());
+
+    // Computed the expected quads
+    //  +--------------------------------+
+    //  |                1               |
+    //  +---+----------------------+-----+
+    //  | 2 |                      |  3  |
+    //  +---+------------+---------+-----+
+    //  |        4       |        5      |
+    //  +----------------+---------------+
+    const gfx::Rect expected_visible_rects[5]{
+        // The occluded region of rest one is small, so we do not split the
+        // quad.
+        quad_rects[0],
+        gfx::Rect(0, 20, 10, 480),
+        gfx::Rect(0, 500, 600, 10),
+        gfx::Rect(1010, 20, 190, 480),
+        gfx::Rect(600, 500, 600, 10),
+    };
+
+    const QuadList& quad_list = frame.render_pass_list.front()->quad_list;
+    for (int i = 0; i < 5; i++) {
+      EXPECT_EQ(expected_visible_rects[i],
+                quad_list.ElementAt(i + 1)->visible_rect);
+    }
+  }
+  TearDownDisplay();
+}
+
 TEST_F(DisplayTest, DrawOcclusionWithRoundedCornerPartialOcclude) {
   SetUpGpuDisplay(RendererSettings());
 
@@ -4139,7 +4233,7 @@
   //      |                      |
   //      +----------------------+
   //
-  // * -> Visiblg rect for the quads.
+  // * -> Visible rect for the quads.
   gfx::Rect quad_rect(10, 10, 1000, 1000);
   gfx::RRectF rounded_corner_bounds(gfx::RectF(quad_rect), 10.f);
   gfx::Rect occluded_quad_rect_1(0, 20, 600, 490);
diff --git a/components/viz/service/display/overlay_processor_interface.cc b/components/viz/service/display/overlay_processor_interface.cc
index b346114..2762495 100644
--- a/components/viz/service/display/overlay_processor_interface.cc
+++ b/components/viz/service/display/overlay_processor_interface.cc
@@ -136,6 +136,10 @@
 #endif
 }
 
+bool OverlayProcessorInterface::DisableSplittingQuads() const {
+  return false;
+}
+
 OverlayProcessorInterface::OutputSurfaceOverlayPlane
 OverlayProcessorInterface::ProcessOutputSurfaceAsOverlay(
     const gfx::Size& viewport_size,
diff --git a/components/viz/service/display/overlay_processor_interface.h b/components/viz/service/display/overlay_processor_interface.h
index 145cd2f..2806e60 100644
--- a/components/viz/service/display/overlay_processor_interface.h
+++ b/components/viz/service/display/overlay_processor_interface.h
@@ -52,6 +52,8 @@
   using FilterOperationsMap =
       base::flat_map<RenderPassId, cc::FilterOperations*>;
 
+  virtual bool DisableSplittingQuads() const;
+
   // Used by Window's DCLayerOverlay system and OverlayProcessorUsingStrategy.
   static void RecordOverlayDamageRectHistograms(
       bool is_overlay,
diff --git a/components/viz/service/display/overlay_processor_mac.cc b/components/viz/service/display/overlay_processor_mac.cc
index 62ca44d..d972c98 100644
--- a/components/viz/service/display/overlay_processor_mac.cc
+++ b/components/viz/service/display/overlay_processor_mac.cc
@@ -29,6 +29,10 @@
 
 OverlayProcessorMac::~OverlayProcessorMac() = default;
 
+bool OverlayProcessorMac::DisableSplittingQuads() const {
+  return true;
+}
+
 bool OverlayProcessorMac::IsOverlaySupported() const {
   return could_overlay_;
 }
diff --git a/components/viz/service/display/overlay_processor_mac.h b/components/viz/service/display/overlay_processor_mac.h
index 462b41a..03a8112 100644
--- a/components/viz/service/display/overlay_processor_mac.h
+++ b/components/viz/service/display/overlay_processor_mac.h
@@ -32,6 +32,8 @@
       std::unique_ptr<CALayerOverlayProcessor> ca_layer_overlay_processor);
   ~OverlayProcessorMac() override;
 
+  bool DisableSplittingQuads() const override;
+
   bool IsOverlaySupported() const override;
   gfx::Rect GetAndResetOverlayDamage() override;
 
diff --git a/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc b/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc
index 44fdc63..1e733bf 100644
--- a/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc
+++ b/components/viz/service/display_embedder/skia_output_device_buffer_queue.cc
@@ -542,8 +542,8 @@
     std::unique_ptr<gfx::GpuFence> gpu_fence) {
   DCHECK(!gpu_fence);
 
-  PageFlipComplete(image.get());
   FinishSwapBuffers(result, size, latency_info);
+  PageFlipComplete(image.get());
 }
 
 bool SkiaOutputDeviceBufferQueue::Reshape(const gfx::Size& size,
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
index 749e70e..3e4d2ee4 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
@@ -55,8 +55,8 @@
 #include "gpu/vulkan/buildflags.h"
 #include "skia/buildflags.h"
 #include "skia/ext/image_operations.h"
+#include "third_party/skia/include/core/SkDeferredDisplayList.h"
 #include "third_party/skia/include/core/SkPixelRef.h"
-#include "third_party/skia/include/private/SkDDLTmpRedirect.h"
 #include "ui/gfx/color_space.h"
 #include "ui/gfx/geometry/rect_conversions.h"
 #include "ui/gfx/skia_util.h"
diff --git a/components/viz/service/gl/gpu_service_impl.cc b/components/viz/service/gl/gpu_service_impl.cc
index 5cb82bd4..2a2b5ea 100644
--- a/components/viz/service/gl/gpu_service_impl.cc
+++ b/components/viz/service/gl/gpu_service_impl.cc
@@ -195,7 +195,7 @@
       gpu_feature_info_.status_values[gpu::GPU_FEATURE_TYPE_OOP_RASTERIZATION] =
           gpu::kGpuFeatureStatusEnabled;
     } else {
-      DLOG(WARNING) << "Failed to create Vulkan context provider.";
+      DLOG(ERROR) << "Failed to create Vulkan context provider.";
     }
   }
 #endif
@@ -208,7 +208,7 @@
       gpu_feature_info_.status_values[gpu::GPU_FEATURE_TYPE_OOP_RASTERIZATION] =
           gpu::kGpuFeatureStatusEnabled;
     } else {
-      DLOG(WARNING) << "Failed to create Dawn context provider.";
+      DLOG(ERROR) << "Failed to create Dawn context provider.";
     }
   }
 #endif
diff --git a/content/app/content_main_runner_impl.cc b/content/app/content_main_runner_impl.cc
index 2ce220c8..62af126 100644
--- a/content/app/content_main_runner_impl.cc
+++ b/content/app/content_main_runner_impl.cc
@@ -680,7 +680,16 @@
   //
   // Startup tracing flags are not (and should not be) passed to Zygote
   // processes. We will enable tracing when forked, if needed.
-  if (process_type != service_manager::switches::kZygoteProcess)
+  bool enable_startup_tracing =
+      process_type != service_manager::switches::kZygoteProcess;
+#if BUILDFLAG(USE_ZYGOTE_HANDLE)
+  // In the browser process, we have to enable startup tracing after
+  // InitializeZygoteSandboxForBrowserProcess() is run below, because that
+  // function forks and may call trace macros in the forked process.
+  if (process_type.empty())
+    enable_startup_tracing = false;
+#endif  // BUILDFLAG(USE_ZYGOTE_HANDLE)
+  if (enable_startup_tracing)
     tracing::EnableStartupTracingIfNeeded();
 
 #if defined(OS_WIN)
@@ -820,6 +829,13 @@
       // SandboxInitialized().
       InitializeZygoteSandboxForBrowserProcess(
           *base::CommandLine::ForCurrentProcess());
+
+      // We can only enable startup tracing after
+      // InitializeZygoteSandboxForBrowserProcess(), because the latter may fork
+      // and run code that calls trace event macros in the forked process (which
+      // could cause all sorts of issues, like writing to the same tracing SMB
+      // from two processes).
+      tracing::EnableStartupTracingIfNeeded();
     }
 #endif  // BUILDFLAG(USE_ZYGOTE_HANDLE)
 
diff --git a/content/browser/DEPS b/content/browser/DEPS
index 412200b..108e441e 100644
--- a/content/browser/DEPS
+++ b/content/browser/DEPS
@@ -99,6 +99,7 @@
   "+third_party/blink/public/platform/web_cursor_info.h",
   "+third_party/blink/public/platform/web_drag_operation.h",
   "+third_party/blink/public/platform/web_fullscreen_video_status.h",
+  "+third_party/blink/public/platform/web_insecure_request_policy.h",
   "+third_party/blink/public/platform/web_intrinsic_sizing_info.h",
   "+third_party/blink/public/platform/web_mixed_content_context_type.h",
   "+third_party/blink/public/platform/web_screen_info.h",
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
index 70b7666..64fb826 100644
--- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -75,7 +75,7 @@
         switches::kEnableBlinkFeatures, "AccessibilityObjectModel");
     // Enable display locking, used in some tests.
     base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
-        switches::kEnableBlinkFeatures, "DisplayLocking");
+        switches::kEnableBlinkFeatures, "CSSRenderSubtree");
   }
 
   void RunAriaTest(const base::FilePath::CharType* file_path) {
@@ -2273,7 +2273,9 @@
   RunHtmlTest(FILE_PATH_LITERAL("delete-selection-crash.html"));
 }
 
-IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, DisplayLockingActivatable) {
+// crbug.com/1053526: Disabled pending the referenced bug fix.
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest,
+                       DISABLED_DisplayLockingActivatable) {
   RunDisplayLockingTest(FILE_PATH_LITERAL("activatable.html"));
 }
 
diff --git a/content/browser/appcache/appcache_disk_cache_ops.cc b/content/browser/appcache/appcache_disk_cache_ops.cc
index f40f7d4..81a2cf2 100644
--- a/content/browser/appcache/appcache_disk_cache_ops.cc
+++ b/content/browser/appcache/appcache_disk_cache_ops.cc
@@ -46,13 +46,16 @@
 
 // HttpResponseInfoIOBuffer ------------------------------------------
 
+// static
+constexpr int HttpResponseInfoIOBuffer::kUnknownResponseDataSize;
+
 HttpResponseInfoIOBuffer::HttpResponseInfoIOBuffer()
-    : response_data_size(kUnknownResponseDataSize) {}
+    : response_data_size(HttpResponseInfoIOBuffer::kUnknownResponseDataSize) {}
 
 HttpResponseInfoIOBuffer::HttpResponseInfoIOBuffer(
     std::unique_ptr<net::HttpResponseInfo> info)
     : http_info(std::move(info)),
-      response_data_size(kUnknownResponseDataSize) {}
+      response_data_size(HttpResponseInfoIOBuffer::kUnknownResponseDataSize) {}
 
 HttpResponseInfoIOBuffer::~HttpResponseInfoIOBuffer() = default;
 
diff --git a/content/browser/appcache/appcache_disk_cache_ops.h b/content/browser/appcache/appcache_disk_cache_ops.h
index 1e846878..f81c0d0 100644
--- a/content/browser/appcache/appcache_disk_cache_ops.h
+++ b/content/browser/appcache/appcache_disk_cache_ops.h
@@ -22,12 +22,12 @@
 class AppCacheDiskCache;
 class AppCacheDiskCacheEntry;
 
-static const int kUnknownResponseDataSize = -1;
-
 // A refcounted wrapper for HttpResponseInfo so we can apply the
 // refcounting semantics used with IOBuffer with these structures too.
 struct CONTENT_EXPORT HttpResponseInfoIOBuffer
     : public base::RefCountedThreadSafe<HttpResponseInfoIOBuffer> {
+  static constexpr int kUnknownResponseDataSize = -1;
+
   std::unique_ptr<net::HttpResponseInfo> http_info;
   int response_data_size;
 
diff --git a/content/browser/appcache/appcache_storage_unittest.cc b/content/browser/appcache/appcache_storage_unittest.cc
index 05121dd0..8f727a9 100644
--- a/content/browser/appcache/appcache_storage_unittest.cc
+++ b/content/browser/appcache/appcache_storage_unittest.cc
@@ -68,7 +68,8 @@
   scoped_refptr<AppCacheResponseInfo> info =
       base::MakeRefCounted<AppCacheResponseInfo>(
           service.storage()->GetWeakPtr(), kManifestUrl, 111,
-          std::make_unique<net::HttpResponseInfo>(), kUnknownResponseDataSize);
+          std::make_unique<net::HttpResponseInfo>(),
+          HttpResponseInfoIOBuffer::kUnknownResponseDataSize);
 
   EXPECT_EQ(info.get(),
             service.storage()->working_set()->GetResponseInfo(111));
@@ -89,7 +90,8 @@
     const GURL kManifestUrl("http://origin/");
     info = base::MakeRefCounted<AppCacheResponseInfo>(
         service.storage()->GetWeakPtr(), kManifestUrl, 111,
-        std::make_unique<net::HttpResponseInfo>(), kUnknownResponseDataSize);
+        std::make_unique<net::HttpResponseInfo>(),
+        HttpResponseInfoIOBuffer::kUnknownResponseDataSize);
 
     EXPECT_EQ(info.get(),
               service.storage()->working_set()->GetResponseInfo(111));
diff --git a/content/browser/compositor/viz_process_transport_factory.cc b/content/browser/compositor/viz_process_transport_factory.cc
index 1b1badb00..165294a 100644
--- a/content/browser/compositor/viz_process_transport_factory.cc
+++ b/content/browser/compositor/viz_process_transport_factory.cc
@@ -324,15 +324,21 @@
   worker_context_provider_.reset();
   main_context_provider_.reset();
 
+  // ReleaseAcceleratedWidget() removes an entry from |compositor_data_map_|,
+  // so first copy the compositors to a new set.
+  base::flat_set<ui::Compositor*> all_compositors;
+  all_compositors.reserve(compositor_data_map_.size());
+  for (auto& pair : compositor_data_map_)
+    all_compositors.insert(pair.first);
+
   // Remove the FrameSink from every compositor that needs to fall back to
   // software compositing.
-  for (auto& pair : compositor_data_map_) {
-    ui::Compositor* compositor = pair.first;
+  for (auto* compositor : all_compositors) {
     // The |guilty_compositor| is in the process of setting up its FrameSink
     // so removing it from |compositor_data_map_| would be both pointless and
     // the cause of a crash.
     // Compositors with force_software_compositor() do not follow the global
-    // compositing mode, so they do not need to changed.
+    // compositing mode, so they do not need to be changed.
     if (compositor == guilty_compositor ||
         compositor->force_software_compositor())
       continue;
diff --git a/content/browser/devtools/devtools_pipe_handler.cc b/content/browser/devtools/devtools_pipe_handler.cc
index 5510538..ed19058 100644
--- a/content/browser/devtools/devtools_pipe_handler.cc
+++ b/content/browser/devtools/devtools_pipe_handler.cc
@@ -295,7 +295,8 @@
   if (!write_thread_) {
     base::PostTask(
         FROM_HERE,
-        {base::ThreadPool(), base::MayBlock(), base::TaskPriority::BEST_EFFORT},
+        {base::ThreadPool(), base::MayBlock(), base::WithBaseSyncPrimitives(),
+         base::TaskPriority::BEST_EFFORT},
         base::BindOnce([](base::Thread* rthread) { delete rthread; },
                        read_thread_.release()));
     return;
@@ -326,7 +327,8 @@
   // Post background task that would join and destroy the threads.
   base::PostTask(
       FROM_HERE,
-      {base::ThreadPool(), base::MayBlock(), base::TaskPriority::BEST_EFFORT},
+      {base::ThreadPool(), base::MayBlock(), base::WithBaseSyncPrimitives(),
+       base::TaskPriority::BEST_EFFORT},
       base::BindOnce(
           [](base::Thread* rthread, base::Thread* wthread) {
             delete rthread;
diff --git a/content/browser/download/download_browsertest.cc b/content/browser/download/download_browsertest.cc
index f709f2e..60304f5 100644
--- a/content/browser/download/download_browsertest.cc
+++ b/content/browser/download/download_browsertest.cc
@@ -1259,6 +1259,12 @@
       file.Close();
     }
 
+    // Parallel download should create more than 1 slices in most cases. If
+    // there is only one slice, consider this is a regular download and remove
+    // all slices.
+    download::DownloadItem::ReceivedSlices parallel_slices;
+    if (slices.size() != 1 || slices[0].offset != 0)
+      parallel_slices = slices;
     download::DownloadItem* download =
         DownloadManagerForShell(shell())->CreateDownloadItem(
             "F7FB1F59-7DE1-4845-AFDB-8A688F70F583", 1, path, base::FilePath(),
@@ -1269,7 +1275,7 @@
             std::string(), download::DownloadItem::INTERRUPTED,
             download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
             download::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, false,
-            base::Time(), false, slices);
+            base::Time(), false, parallel_slices);
     ClearAutoResumptionCount(download);
     return download;
   }
@@ -4182,6 +4188,18 @@
                     true /* support_partial_response */);
 }
 
+// Verify parallel download resumption when only 1 slice was created in previous
+// attempt.
+IN_PROC_BROWSER_TEST_F(ParallelDownloadTest, ResumptionWithOnlyOneSlice) {
+  // Create the received slices data with only 1 slice.
+  std::vector<download::DownloadItem::ReceivedSlice> received_slices = {
+      download::DownloadItem::ReceivedSlice(0, 1000, false /* finished */)};
+
+  // Only 1 request should be sent.
+  RunResumptionTest(received_slices, 3000000, 1,
+                    true /* support_partial_response */);
+}
+
 // Verifies that if the last slice is finished, but the database record is not
 // finished, which may happen in database migration.
 // When the server sends HTTP range not satisfied, the download can complete.
diff --git a/content/browser/frame_host/frame_tree_node.cc b/content/browser/frame_host/frame_tree_node.cc
index 26e47d7..0386a95 100644
--- a/content/browser/frame_host/frame_tree_node.cc
+++ b/content/browser/frame_host/frame_tree_node.cc
@@ -31,7 +31,6 @@
 #include "content/public/common/navigation_policy.h"
 #include "third_party/blink/public/common/frame/sandbox_flags.h"
 #include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom.h"
 
 namespace content {
 
@@ -120,10 +119,7 @@
           scope,
           name,
           unique_name,
-          blink::mojom::InsecureRequestPolicy::
-              kLeaveInsecureRequestsAlone /* should enforce strict mixed content
-                                             checking */
-          ,
+          false /* should enforce strict mixed content checking */,
           std::vector<uint32_t>()
           /* hashes of hosts for insecure request upgrades */,
           false /* is a potentially trustworthy unique origin */,
@@ -347,7 +343,7 @@
 }
 
 void FrameTreeNode::SetInsecureRequestPolicy(
-    blink::mojom::InsecureRequestPolicy policy) {
+    blink::WebInsecureRequestPolicy policy) {
   if (policy == replication_state_.insecure_request_policy)
     return;
   render_manager_.OnEnforceInsecureRequestPolicy(policy);
diff --git a/content/browser/frame_host/frame_tree_node.h b/content/browser/frame_host/frame_tree_node.h
index 89ba68e8..07208b4 100644
--- a/content/browser/frame_host/frame_tree_node.h
+++ b/content/browser/frame_host/frame_tree_node.h
@@ -25,8 +25,7 @@
 #include "third_party/blink/public/common/frame/user_activation_state.h"
 #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom.h"
 #include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-forward.h"
-
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "url/gurl.h"
 #include "url/origin.h"
 
@@ -190,7 +189,7 @@
 
   // Sets the current insecure request policy, and notifies proxies about the
   // update.
-  void SetInsecureRequestPolicy(blink::mojom::InsecureRequestPolicy policy);
+  void SetInsecureRequestPolicy(blink::WebInsecureRequestPolicy policy);
 
   // Sets the current set of insecure urls to upgrade, and notifies proxies
   // about the update.
diff --git a/content/browser/frame_host/mixed_content_navigation_throttle.cc b/content/browser/frame_host/mixed_content_navigation_throttle.cc
index 608f464..78fdf47 100644
--- a/content/browser/frame_host/mixed_content_navigation_throttle.cc
+++ b/content/browser/frame_host/mixed_content_navigation_throttle.cc
@@ -20,10 +20,7 @@
 #include "content/public/common/origin_util.h"
 #include "content/public/common/web_preferences.h"
 #include "net/base/url_util.h"
-#include "third_party/blink/public/common/security_context/insecure_request_policy.h"
 #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom.h"
-
 #include "url/gurl.h"
 #include "url/origin.h"
 #include "url/url_constants.h"
@@ -147,10 +144,9 @@
   // If we're in strict mode, we'll automagically fail everything, and
   // intentionally skip the client/embedder checks in order to prevent degrading
   // the site's security UI.
-  bool block_all_mixed_content =
-      (mixed_content_node->current_replication_state().insecure_request_policy &
-       blink::mojom::InsecureRequestPolicy::kBlockAllMixedContent) !=
-      blink::mojom::InsecureRequestPolicy::kLeaveInsecureRequestsAlone;
+  bool block_all_mixed_content = !!(
+      mixed_content_node->current_replication_state().insecure_request_policy &
+      blink::kBlockAllMixedContent);
   const WebPreferences& prefs = mixed_content_node->current_frame_host()
                                     ->render_view_host()
                                     ->GetWebkitPreferences();
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc
index 1fd9df6d..2fcd5024 100644
--- a/content/browser/frame_host/navigation_request.cc
+++ b/content/browser/frame_host/navigation_request.cc
@@ -1753,7 +1753,7 @@
       if (cross_origin_embedder_policy ==
           network::mojom::CrossOriginEmbedderPolicy::kNone) {
         OnRequestFailedInternal(
-            network::URLLoaderCompletionStatus(net::ERR_FAILED),
+            network::URLLoaderCompletionStatus(net::ERR_BLOCKED_BY_RESPONSE),
             false /* skip_throttles */, base::nullopt /* error_page_content */,
             false /* collapse_frame */);
         // DO NOT ADD CODE after this. The previous call to
@@ -1772,7 +1772,7 @@
         (frame_tree_node_->pending_frame_policy().sandbox_flags !=
          blink::mojom::WebSandboxFlags::kNone)) {
       OnRequestFailedInternal(
-          network::URLLoaderCompletionStatus(net::ERR_FAILED),
+          network::URLLoaderCompletionStatus(net::ERR_BLOCKED_BY_RESPONSE),
           false /* skip_throttles */, base::nullopt /* error_page_content */,
           false /* collapse_frame */);
       // DO NOT ADD CODE after this. The previous call to
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 0fc04d6..4f63d977 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -212,7 +212,6 @@
 #include "third_party/blink/public/mojom/loader/pause_subresource_loading_handle.mojom.h"
 #include "third_party/blink/public/mojom/loader/resource_load_info.mojom.h"
 #include "third_party/blink/public/mojom/loader/url_loader_factory_bundle.mojom.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
 #include "third_party/blink/public/mojom/sms/sms_receiver.mojom.h"
 #include "third_party/blink/public/mojom/timing/resource_timing.mojom.h"
@@ -3577,7 +3576,7 @@
 }
 
 void RenderFrameHostImpl::EnforceInsecureRequestPolicy(
-    blink::mojom::InsecureRequestPolicy policy) {
+    blink::WebInsecureRequestPolicy policy) {
   frame_tree_node()->SetInsecureRequestPolicy(policy);
 }
 
@@ -7050,13 +7049,10 @@
         receiver) {
 #if !defined(OS_ANDROID)
   if (base::FeatureList::IsEnabled(features::kWebAuth)) {
-    if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-            switches::kEnableWebAuthTestingAPI)) {
-      auto* environment_singleton = AuthenticatorEnvironmentImpl::GetInstance();
-      environment_singleton->EnableVirtualAuthenticatorFor(frame_tree_node_);
-      environment_singleton->AddVirtualAuthenticatorReceiver(
-          frame_tree_node_, std::move(receiver));
-    }
+    auto* environment_singleton = AuthenticatorEnvironmentImpl::GetInstance();
+    environment_singleton->EnableVirtualAuthenticatorFor(frame_tree_node_);
+    environment_singleton->AddVirtualAuthenticatorReceiver(frame_tree_node_,
+                                                           std::move(receiver));
   }
 #endif  // !defined(OS_ANDROID)
 }
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index 052469c..99bda02 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -111,7 +111,6 @@
 #include "third_party/blink/public/mojom/portal/portal.mojom-forward.h"
 #include "third_party/blink/public/mojom/presentation/presentation.mojom.h"
 #include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-forward.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h"
 #include "third_party/blink/public/mojom/sms/sms_receiver.mojom-forward.h"
 #include "third_party/blink/public/mojom/speech/speech_synthesis.mojom-forward.h"
@@ -122,6 +121,7 @@
 #include "third_party/blink/public/mojom/websockets/websocket_connector.mojom.h"
 #include "third_party/blink/public/mojom/webtransport/quic_transport_connector.mojom.h"
 #include "third_party/blink/public/mojom/worker/dedicated_worker_host_factory.mojom.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/public/web/web_tree_scope_type.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/accessibility/ax_action_handler.h"
@@ -1357,7 +1357,7 @@
   void DidAddContentSecurityPolicies(
       std::vector<network::mojom::ContentSecurityPolicyPtr> policies) override;
   void EnforceInsecureRequestPolicy(
-      blink::mojom::InsecureRequestPolicy policy) override;
+      blink::WebInsecureRequestPolicy policy) override;
   void EnforceInsecureNavigationsSet(const std::vector<uint32_t>& set) override;
   void DidChangeActiveSchedulerTrackedFeatures(uint64_t features_mask) override;
   void SuddenTerminationDisablerChanged(
diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc
index b3b3e4b..0686a9ca 100644
--- a/content/browser/frame_host/render_frame_host_manager.cc
+++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -60,7 +60,6 @@
 #include "services/network/public/cpp/features.h"
 #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom.h"
 #include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom.h"
 
 #if defined(OS_MACOSX)
 #include "ui/gfx/mac/scoped_cocoa_disable_screen_updates.h"
@@ -1025,7 +1024,7 @@
 }
 
 void RenderFrameHostManager::OnEnforceInsecureRequestPolicy(
-    blink::mojom::InsecureRequestPolicy policy) {
+    blink::WebInsecureRequestPolicy policy) {
   for (const auto& pair : proxy_hosts_) {
     pair.second->Send(new FrameMsg_EnforceInsecureRequestPolicy(
         pair.second->GetRoutingID(), policy));
diff --git a/content/browser/frame_host/render_frame_host_manager.h b/content/browser/frame_host/render_frame_host_manager.h
index b6482bea..2ff1397 100644
--- a/content/browser/frame_host/render_frame_host_manager.h
+++ b/content/browser/frame_host/render_frame_host_manager.h
@@ -26,7 +26,6 @@
 #include "services/network/public/mojom/content_security_policy.mojom-forward.h"
 #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom-forward.h"
 #include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-forward.h"
 #include "ui/base/page_transition_types.h"
 #include "url/origin.h"
 
@@ -346,8 +345,7 @@
 
   // Sends updated enforcement of insecure request policy to all frame proxies
   // when the frame changes its setting.
-  void OnEnforceInsecureRequestPolicy(
-      blink::mojom::InsecureRequestPolicy policy);
+  void OnEnforceInsecureRequestPolicy(blink::WebInsecureRequestPolicy policy);
 
   // Sends updated enforcement of upgrade insecure navigations set to all frame
   // proxies when the frame changes its setting.
diff --git a/content/browser/frame_host/render_frame_host_manager_unittest.cc b/content/browser/frame_host/render_frame_host_manager_unittest.cc
index 22f8715..e8f39d1 100644
--- a/content/browser/frame_host/render_frame_host_manager_unittest.cc
+++ b/content/browser/frame_host/render_frame_host_manager_unittest.cc
@@ -66,7 +66,7 @@
 #include "third_party/blink/public/common/frame/frame_policy.h"
 #include "third_party/blink/public/mojom/favicon/favicon_url.mojom.h"
 #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "ui/base/page_transition_types.h"
 
 #if defined(OS_ANDROID)
@@ -90,7 +90,7 @@
 // Helper function for strict mixed content checking tests.
 void CheckInsecureRequestPolicyIPC(
     TestRenderFrameHost* rfh,
-    blink::mojom::InsecureRequestPolicy expected_param,
+    blink::WebInsecureRequestPolicy expected_param,
     int expected_routing_id) {
   const IPC::Message* message =
       rfh->GetProcess()->sink().GetUniqueMessageMatching(
@@ -2952,17 +2952,17 @@
   // Change the parent's enforcement of strict mixed content checking,
   // and check that the correct IPC is sent to the child frame's
   // process.
-  EXPECT_EQ(blink::mojom::InsecureRequestPolicy::kLeaveInsecureRequestsAlone,
+  EXPECT_EQ(blink::kLeaveInsecureRequestsAlone,
             root->current_replication_state().insecure_request_policy);
   main_test_rfh()->DidEnforceInsecureRequestPolicy(
-      blink::mojom::InsecureRequestPolicy::kBlockAllMixedContent);
+      blink::kBlockAllMixedContent);
   RenderFrameProxyHost* proxy_to_child =
       root->render_manager()->GetRenderFrameProxyHost(
           child_host->GetSiteInstance());
-  EXPECT_NO_FATAL_FAILURE(CheckInsecureRequestPolicyIPC(
-      child_host, blink::mojom::InsecureRequestPolicy::kBlockAllMixedContent,
-      proxy_to_child->GetRoutingID()));
-  EXPECT_EQ(blink::mojom::InsecureRequestPolicy::kBlockAllMixedContent,
+  EXPECT_NO_FATAL_FAILURE(
+      CheckInsecureRequestPolicyIPC(child_host, blink::kBlockAllMixedContent,
+                                    proxy_to_child->GetRoutingID()));
+  EXPECT_EQ(blink::kBlockAllMixedContent,
             root->current_replication_state().insecure_request_policy);
 
   // Do the same for the child's enforcement. In general, the parent
@@ -2972,18 +2972,16 @@
   // A.com process needs to know B.com's flag so that the grandchild
   // A.com frame can inherit it.
   EXPECT_EQ(
-      blink::mojom::InsecureRequestPolicy::kLeaveInsecureRequestsAlone,
+      blink::kLeaveInsecureRequestsAlone,
       root->child_at(0)->current_replication_state().insecure_request_policy);
-  child_host->DidEnforceInsecureRequestPolicy(
-      blink::mojom::InsecureRequestPolicy::kBlockAllMixedContent);
+  child_host->DidEnforceInsecureRequestPolicy(blink::kBlockAllMixedContent);
   RenderFrameProxyHost* proxy_to_parent =
       child->GetRenderFrameProxyHost(main_test_rfh()->GetSiteInstance());
   EXPECT_NO_FATAL_FAILURE(CheckInsecureRequestPolicyIPC(
-      main_test_rfh(),
-      blink::mojom::InsecureRequestPolicy::kBlockAllMixedContent,
+      main_test_rfh(), blink::kBlockAllMixedContent,
       proxy_to_parent->GetRoutingID()));
   EXPECT_EQ(
-      blink::mojom::InsecureRequestPolicy::kBlockAllMixedContent,
+      blink::kBlockAllMixedContent,
       root->child_at(0)->current_replication_state().insecure_request_policy);
 
   // Check that the flag for the parent's proxy to the child is reset
@@ -2991,11 +2989,10 @@
   main_test_rfh()->GetProcess()->sink().ClearMessages();
   NavigationSimulator::NavigateAndCommitFromDocument(kUrl3, child_host);
   EXPECT_NO_FATAL_FAILURE(CheckInsecureRequestPolicyIPC(
-      main_test_rfh(),
-      blink::mojom::InsecureRequestPolicy::kLeaveInsecureRequestsAlone,
+      main_test_rfh(), blink::kLeaveInsecureRequestsAlone,
       proxy_to_parent->GetRoutingID()));
   EXPECT_EQ(
-      blink::mojom::InsecureRequestPolicy::kLeaveInsecureRequestsAlone,
+      blink::kLeaveInsecureRequestsAlone,
       root->child_at(0)->current_replication_state().insecure_request_policy);
 }
 
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index 1383a8e..a36f9ec 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -124,7 +124,7 @@
 #include "third_party/blink/public/common/frame/sandbox_flags.h"
 #include "third_party/blink/public/common/input/web_input_event.h"
 #include "third_party/blink/public/mojom/frame/frame.mojom-test-utils.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "ui/display/display_switches.h"
 #include "ui/display/screen.h"
 #include "ui/events/base_event_utils.h"
@@ -6951,27 +6951,27 @@
                   SSLStatus::DISPLAYED_INSECURE_CONTENT));
 
   FrameTreeNode* root = web_contents->GetFrameTree()->root();
-  EXPECT_EQ(blink::mojom::InsecureRequestPolicy::kBlockAllMixedContent,
+  EXPECT_EQ(blink::kBlockAllMixedContent,
             root->current_replication_state().insecure_request_policy);
   EXPECT_EQ(
-      blink::mojom::InsecureRequestPolicy::kBlockAllMixedContent,
+      blink::kBlockAllMixedContent,
       root->child_at(0)->current_replication_state().insecure_request_policy);
 
   // When the subframe navigates, it should still be marked as enforcing
   // strict mixed content.
   GURL navigate_url(https_server.GetURL("/title1.html"));
   NavigateFrameToURL(root->child_at(0), navigate_url);
-  EXPECT_EQ(blink::mojom::InsecureRequestPolicy::kBlockAllMixedContent,
+  EXPECT_EQ(blink::kBlockAllMixedContent,
             root->current_replication_state().insecure_request_policy);
   EXPECT_EQ(
-      blink::mojom::InsecureRequestPolicy::kBlockAllMixedContent,
+      blink::kBlockAllMixedContent,
       root->child_at(0)->current_replication_state().insecure_request_policy);
 
   // When the main frame navigates, it should no longer be marked as
   // enforcing strict mixed content.
   EXPECT_TRUE(
       NavigateToURL(shell(), https_server.GetURL("b.com", "/title1.html")));
-  EXPECT_EQ(blink::mojom::InsecureRequestPolicy::kLeaveInsecureRequestsAlone,
+  EXPECT_EQ(blink::kLeaveInsecureRequestsAlone,
             root->current_replication_state().insecure_request_policy);
 }
 
@@ -6995,27 +6995,27 @@
                   SSLStatus::DISPLAYED_INSECURE_CONTENT));
 
   FrameTreeNode* root = web_contents->GetFrameTree()->root();
-  EXPECT_EQ(blink::mojom::InsecureRequestPolicy::kUpgradeInsecureRequests,
+  EXPECT_EQ(blink::kUpgradeInsecureRequests,
             root->current_replication_state().insecure_request_policy);
   EXPECT_EQ(
-      blink::mojom::InsecureRequestPolicy::kUpgradeInsecureRequests,
+      blink::kUpgradeInsecureRequests,
       root->child_at(0)->current_replication_state().insecure_request_policy);
 
   // When the subframe navigates, it should still be marked as upgrading
   // insecure requests.
   GURL navigate_url(https_server.GetURL("/title1.html"));
   NavigateFrameToURL(root->child_at(0), navigate_url);
-  EXPECT_EQ(blink::mojom::InsecureRequestPolicy::kUpgradeInsecureRequests,
+  EXPECT_EQ(blink::kUpgradeInsecureRequests,
             root->current_replication_state().insecure_request_policy);
   EXPECT_EQ(
-      blink::mojom::InsecureRequestPolicy::kUpgradeInsecureRequests,
+      blink::kUpgradeInsecureRequests,
       root->child_at(0)->current_replication_state().insecure_request_policy);
 
   // When the main frame navigates, it should no longer be marked as
   // upgrading insecure requests.
   EXPECT_TRUE(
       NavigateToURL(shell(), https_server.GetURL("b.com", "/title1.html")));
-  EXPECT_EQ(blink::mojom::InsecureRequestPolicy::kLeaveInsecureRequestsAlone,
+  EXPECT_EQ(blink::kLeaveInsecureRequestsAlone,
             root->current_replication_state().insecure_request_policy);
 }
 
diff --git a/content/browser/tracing/background_tracing_manager_browsertest.cc b/content/browser/tracing/background_tracing_manager_browsertest.cc
index cc76603c0..2fece112 100644
--- a/content/browser/tracing/background_tracing_manager_browsertest.cc
+++ b/content/browser/tracing/background_tracing_manager_browsertest.cc
@@ -84,11 +84,10 @@
                 // PosixSystemProducer so this assert ensures that the
                 // static_cast below is safe.
                 ASSERT_FALSE(tracing::PerfettoTracedProcess::Get()
-                                 ->SystemProducerForTesting()
+                                 ->system_producer()
                                  ->IsDummySystemProducerForTesting());
                 auto* producer = static_cast<tracing::PosixSystemProducer*>(
-                    tracing::PerfettoTracedProcess::Get()
-                        ->SystemProducerForTesting());
+                    tracing::PerfettoTracedProcess::Get()->system_producer());
                 producer->SetNewSocketForTesting(producer_socket.c_str());
                 producer->SetDisallowPreAndroidPieForTesting(false);
               },
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 4b85f236..e6abd33d 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -4412,7 +4412,8 @@
 void WebContentsImpl::DidStartNavigation(NavigationHandle* navigation_handle) {
   TRACE_EVENT1("navigation", "WebContentsImpl::DidStartNavigation",
                "navigation_handle", navigation_handle);
-  favicon_urls_.clear();
+  if (navigation_handle->IsInMainFrame())
+    favicon_urls_.clear();
 
   for (auto& observer : observers_)
     observer.DidStartNavigation(navigation_handle);
diff --git a/content/browser/webauth/authenticator_common.cc b/content/browser/webauth/authenticator_common.cc
index ee80cdd..b47691c 100644
--- a/content/browser/webauth/authenticator_common.cc
+++ b/content/browser/webauth/authenticator_common.cc
@@ -32,7 +32,6 @@
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_features.h"
-#include "content/public/common/content_switches.h"
 #include "content/public/common/origin_util.h"
 #include "crypto/sha2.h"
 #include "device/base/features.h"
@@ -372,9 +371,10 @@
   return ret;
 }
 
-base::flat_set<device::FidoTransportProtocol> GetTransportsEnabledByFlags() {
-  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kEnableWebAuthTestingAPI)) {
+base::flat_set<device::FidoTransportProtocol> GetTransportsEnabledByFlags(
+    FrameTreeNode* frame_tree_node) {
+  if (AuthenticatorEnvironmentImpl::GetInstance()->GetVirtualFactoryFor(
+          frame_tree_node)) {
     return device::GetAllTransportProtocols();
   }
   base::flat_set<device::FidoTransportProtocol> transports;
@@ -415,7 +415,9 @@
     RenderFrameHost* render_frame_host,
     std::unique_ptr<base::OneShotTimer> timer)
     : render_frame_host_(render_frame_host),
-      transports_(GetTransportsEnabledByFlags()),
+      transports_(GetTransportsEnabledByFlags(
+          static_cast<RenderFrameHostImpl*>(render_frame_host)
+              ->frame_tree_node())),
       security_checker_(static_cast<RenderFrameHostImpl*>(render_frame_host)
                             ->GetWebAuthRequestSecurityChecker()),
       timer_(std::move(timer)) {
diff --git a/content/browser/webauth/authenticator_environment_impl.cc b/content/browser/webauth/authenticator_environment_impl.cc
index 7bbf7a9..31097df4 100644
--- a/content/browser/webauth/authenticator_environment_impl.cc
+++ b/content/browser/webauth/authenticator_environment_impl.cc
@@ -10,7 +10,6 @@
 #include "base/stl_util.h"
 #include "content/browser/webauth/virtual_discovery.h"
 #include "content/browser/webauth/virtual_fido_discovery_factory.h"
-#include "content/public/common/content_switches.h"
 #include "device/fido/fido_discovery_factory.h"
 
 namespace content {
@@ -26,13 +25,7 @@
   return environment.get();
 }
 
-AuthenticatorEnvironmentImpl::AuthenticatorEnvironmentImpl() {
-  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kEnableWebAuthTestingAPI)) {
-    replaced_discovery_factory_ =
-        std::make_unique<VirtualFidoDiscoveryFactory>();
-  }
-}
+AuthenticatorEnvironmentImpl::AuthenticatorEnvironmentImpl() = default;
 
 AuthenticatorEnvironmentImpl::~AuthenticatorEnvironmentImpl() = default;
 
diff --git a/content/browser/webauth/virtual_fido_discovery_factory.cc b/content/browser/webauth/virtual_fido_discovery_factory.cc
index 35bacc7..d5134db 100644
--- a/content/browser/webauth/virtual_fido_discovery_factory.cc
+++ b/content/browser/webauth/virtual_fido_discovery_factory.cc
@@ -103,19 +103,6 @@
 VirtualFidoDiscoveryFactory::Create(device::FidoTransportProtocol transport) {
   auto discovery = std::make_unique<VirtualFidoDiscovery>(transport);
 
-  if (receivers_.empty() && authenticators_.empty() &&
-      base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kEnableWebAuthTestingAPI)) {
-    // If no bindings are active then create a virtual device. This is a
-    // stop-gap measure for running web-platform tests on the chromium CI.
-    // See crbug.com/1020361
-    CreateAuthenticator(
-        ::device::ProtocolVersion::kCtap2,
-        ::device::FidoTransportProtocol::kUsbHumanInterfaceDevice,
-        ::device::AuthenticatorAttachment::kCrossPlatform,
-        false /* has_resident_key */, false /* has_user_verification */);
-  }
-
   for (auto& authenticator : authenticators_) {
     if (discovery->transport() != authenticator.second->transport())
       continue;
diff --git a/content/browser/webui/web_ui_unittest.cc b/content/browser/webui/web_ui_unittest.cc
new file mode 100644
index 0000000..3fe944f
--- /dev/null
+++ b/content/browser/webui/web_ui_unittest.cc
@@ -0,0 +1,39 @@
+// 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 <utility>
+
+#include "content/public/test/test_web_ui.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+class WebUITest : public testing::Test {
+ public:
+  WebUITest() = default;
+  ~WebUITest() override = default;
+
+  void SetUp() override { web_ui_ = std::make_unique<content::TestWebUI>(); }
+
+  std::unique_ptr<content::TestWebUI> web_ui_;
+};
+
+namespace {
+
+void HandleTestMessage(int number, bool conditional, const std::string& text) {
+  ASSERT_EQ(11, number);
+  ASSERT_TRUE(conditional);
+  ASSERT_EQ("test text", text);
+}
+
+}  // namespace
+
+TEST_F(WebUITest, TestHandler) {
+  web_ui_->RegisterHandlerCallback("testMessage",
+                                   base::BindRepeating(&HandleTestMessage));
+  base::Value args(base::Value::Type::LIST);
+  args.Append(11);
+  args.Append(true);
+  args.Append("test text");
+  web_ui_->HandleReceivedMessage("testMessage",
+                                 &base::Value::AsListValue(args));
+}
diff --git a/content/browser/worker_host/dedicated_worker_host.cc b/content/browser/worker_host/dedicated_worker_host.cc
index d55aeb1..ea1c0ef5b 100644
--- a/content/browser/worker_host/dedicated_worker_host.cc
+++ b/content/browser/worker_host/dedicated_worker_host.cc
@@ -229,7 +229,8 @@
   }
 
   // TODO(https://crbug.com/986188): Check if the main script's final response
-  // URL is commitable.
+  // URL is committable.
+  service_->NotifyWorkerFinalResponseURLDetermined(id_, final_response_url);
 
   // TODO(cammie): Change this approach when we support shared workers
   // creating dedicated workers, as there might be no ancestor frame.
diff --git a/content/browser/worker_host/dedicated_worker_service_impl.cc b/content/browser/worker_host/dedicated_worker_service_impl.cc
index 5b704e6..37d5484 100644
--- a/content/browser/worker_host/dedicated_worker_service_impl.cc
+++ b/content/browser/worker_host/dedicated_worker_service_impl.cc
@@ -4,6 +4,8 @@
 
 #include "content/browser/worker_host/dedicated_worker_service_impl.h"
 
+#include "base/stl_util.h"
+
 namespace content {
 
 DedicatedWorkerServiceImpl::DedicatedWorkerServiceImpl() = default;
@@ -63,4 +65,13 @@
   }
 }
 
+void DedicatedWorkerServiceImpl::NotifyWorkerFinalResponseURLDetermined(
+    DedicatedWorkerId dedicated_worker_id,
+    const GURL& url) {
+  DCHECK(base::Contains(dedicated_worker_infos_, dedicated_worker_id));
+
+  for (Observer& observer : observers_)
+    observer.OnFinalResponseURLDetermined(dedicated_worker_id, url);
+}
+
 }  // namespace content
diff --git a/content/browser/worker_host/dedicated_worker_service_impl.h b/content/browser/worker_host/dedicated_worker_service_impl.h
index bf299b1d..4fb3a35 100644
--- a/content/browser/worker_host/dedicated_worker_service_impl.h
+++ b/content/browser/worker_host/dedicated_worker_service_impl.h
@@ -25,14 +25,21 @@
 
   DedicatedWorkerId GenerateNextDedicatedWorkerId();
 
+  // Notifies all observers about a starting worker.
   void NotifyWorkerStarted(DedicatedWorkerId dedicated_worker_id,
                            int worker_process_id,
                            GlobalFrameRoutingId ancestor_render_frame_host_id);
 
+  // Notifies all observers about a terminating worker.
   void NotifyWorkerTerminating(
       DedicatedWorkerId dedicated_worker_id,
       GlobalFrameRoutingId ancestor_render_frame_host_id);
 
+  // Notifies all observers that a worker's final response URL was determined.
+  void NotifyWorkerFinalResponseURLDetermined(
+      DedicatedWorkerId dedicated_worker_id,
+      const GURL& url);
+
  private:
   // Generates IDs for new dedicated workers.
   DedicatedWorkerId::Generator dedicated_worker_id_generator_;
diff --git a/content/browser/worker_host/dedicated_worker_service_impl_unittest.cc b/content/browser/worker_host/dedicated_worker_service_impl_unittest.cc
index e5572fd..24fa2c0 100644
--- a/content/browser/worker_host/dedicated_worker_service_impl_unittest.cc
+++ b/content/browser/worker_host/dedicated_worker_service_impl_unittest.cc
@@ -173,6 +173,8 @@
     if (on_worker_event_callback_)
       std::move(on_worker_event_callback_).Run();
   }
+  void OnFinalResponseURLDetermined(DedicatedWorkerId dedicated_worker_id,
+                                    const GURL& url) override {}
 
   void RunUntilWorkerEvent() {
     base::RunLoop run_loop;
diff --git a/content/browser/worker_host/shared_worker_host.cc b/content/browser/worker_host/shared_worker_host.cc
index 67407cf..6e6ce87 100644
--- a/content/browser/worker_host/shared_worker_host.cc
+++ b/content/browser/worker_host/shared_worker_host.cc
@@ -88,9 +88,11 @@
 };
 
 SharedWorkerHost::SharedWorkerHost(SharedWorkerServiceImpl* service,
+                                   SharedWorkerId id,
                                    const SharedWorkerInstance& instance,
                                    RenderProcessHost* worker_process_host)
     : service_(service),
+      id_(id),
       instance_(instance),
       worker_process_host_(worker_process_host),
       scoped_process_host_ref_(
@@ -117,9 +119,9 @@
     // Notify the service that each client still connected will be removed and
     // that the worker will terminate.
     for (const auto& client : clients_) {
-      service_->NotifyClientRemoved(instance_, client.render_frame_host_id);
+      service_->NotifyClientRemoved(id_, client.render_frame_host_id);
     }
-    service_->NotifyWorkerTerminating(instance_);
+    service_->NotifyWorkerTerminating(id_);
   } else {
     // Tell clients that this worker failed to start.
     for (const ClientInfo& info : clients_)
@@ -237,10 +239,10 @@
 
   // Notify the service that the worker was started and that some clients were
   // already connected.
-  service_->NotifyWorkerStarted(instance_, worker_process_host_->GetID(),
+  service_->NotifyWorkerStarted(id_, worker_process_host_->GetID(),
                                 dev_tools_token_);
   for (const auto& client : clients_) {
-    service_->NotifyClientAdded(instance_, client.render_frame_host_id);
+    service_->NotifyClientAdded(id_, client.render_frame_host_id);
   }
 }
 
@@ -436,7 +438,7 @@
   // Start() function will handle sending a notification for each existing
   // client.
   if (started_)
-    service_->NotifyClientAdded(instance_, client_render_frame_host_id);
+    service_->NotifyClientAdded(id_, client_render_frame_host_id);
 }
 
 void SharedWorkerHost::SetAppCacheHandle(
@@ -485,7 +487,7 @@
       // Notify the service that a client was removed while the worker was
       // running.
       if (started_) {
-        service_->NotifyClientRemoved(instance_, it->render_frame_host_id);
+        service_->NotifyClientRemoved(id_, it->render_frame_host_id);
       }
       clients_.erase(it);
       break;
diff --git a/content/browser/worker_host/shared_worker_host.h b/content/browser/worker_host/shared_worker_host.h
index cd68309c..065bdd789 100644
--- a/content/browser/worker_host/shared_worker_host.h
+++ b/content/browser/worker_host/shared_worker_host.h
@@ -22,6 +22,7 @@
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_process_host_observer.h"
 #include "content/public/browser/shared_worker_instance.h"
+#include "content/public/browser/shared_worker_service.h"
 #include "media/mojo/mojom/video_decode_perf_history.mojom.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -54,14 +55,14 @@
 class SharedWorkerContentSettingsProxyImpl;
 class SharedWorkerServiceImpl;
 
-// The SharedWorkerHost is the interface that represents the browser side of
-// the browser <-> worker communication channel. This is owned by
-// SharedWorkerServiceImpl and destroyed when the connection to the worker in
-// the renderer is lost, or the RenderProcessHost of the worker is destroyed.
+// SharedWorkerHost is the browser-side host of a single shared worker running
+// in the renderer. This class is owned by the SharedWorkerServiceImpl of the
+// current BrowserContext.
 class CONTENT_EXPORT SharedWorkerHost : public blink::mojom::SharedWorkerHost,
                                         public RenderProcessHostObserver {
  public:
   SharedWorkerHost(SharedWorkerServiceImpl* service,
+                   SharedWorkerId id,
                    const SharedWorkerInstance& instance,
                    RenderProcessHost* worker_process_host);
   ~SharedWorkerHost() override;
@@ -128,6 +129,8 @@
   // Returns true if this worker is connected to at least one client.
   bool HasClients() const;
 
+  SharedWorkerId id() const { return id_; }
+
   const SharedWorkerInstance& instance() const { return instance_; }
 
   const base::UnguessableToken& dev_tools_token() const {
@@ -192,7 +195,13 @@
   mojo::Receiver<blink::mojom::SharedWorkerHost> receiver_{this};
 
   // |service_| owns |this|.
-  SharedWorkerServiceImpl* service_;
+  SharedWorkerServiceImpl* const service_;
+
+  // An identifier for this worker that is unique within a storage partition.
+  SharedWorkerId id_;
+
+  // This holds information used to match a shared worker connection request to
+  // this shared worker.
   SharedWorkerInstance instance_;
   ClientList clients_;
 
diff --git a/content/browser/worker_host/shared_worker_host_unittest.cc b/content/browser/worker_host/shared_worker_host_unittest.cc
index 6e3e4e2e..ec9395e 100644
--- a/content/browser/worker_host/shared_worker_host_unittest.cc
+++ b/content/browser/worker_host/shared_worker_host_unittest.cc
@@ -53,15 +53,15 @@
     GURL url("http://www.example.com/w.js");
 
     SharedWorkerInstance instance(
-        service_.shared_worker_id_generator_.GenerateNextId(), url,
-        blink::mojom::ScriptType::kClassic,
+        url, blink::mojom::ScriptType::kClassic,
         network::mojom::CredentialsMode::kSameOrigin, "name",
         url::Origin::Create(url), /*content_security_policy=*/"",
         network::mojom::ContentSecurityPolicyType::kReport,
         network::mojom::IPAddressSpace::kPublic,
         blink::mojom::SharedWorkerCreationContextType::kSecure);
-    auto host = std::make_unique<SharedWorkerHost>(&service_, instance,
-                                                   &mock_render_process_host_);
+    auto host = std::make_unique<SharedWorkerHost>(
+        &service_, service_.shared_worker_id_generator_.GenerateNextId(),
+        instance, &mock_render_process_host_);
     auto weak_host = host->AsWeakPtr();
     service_.worker_hosts_.insert(std::move(host));
     return weak_host;
diff --git a/content/browser/worker_host/shared_worker_instance_unittest.cc b/content/browser/worker_host/shared_worker_instance_unittest.cc
index 1b75d0b9..7943703 100644
--- a/content/browser/worker_host/shared_worker_instance_unittest.cc
+++ b/content/browser/worker_host/shared_worker_instance_unittest.cc
@@ -22,8 +22,7 @@
                                       const std::string& name,
                                       const url::Origin& constructor_origin) {
     return SharedWorkerInstance(
-        shared_worker_id_generator_.GenerateNextId(), script_url,
-        blink::mojom::ScriptType::kClassic,
+        script_url, blink::mojom::ScriptType::kClassic,
         network::mojom::CredentialsMode::kSameOrigin, name, constructor_origin,
         std::string(), network::mojom::ContentSecurityPolicyType::kReport,
         network::mojom::IPAddressSpace::kPublic,
@@ -42,8 +41,6 @@
   }
 
  private:
-  SharedWorkerId::Generator shared_worker_id_generator_;
-
   DISALLOW_COPY_AND_ASSIGN(SharedWorkerInstanceTest);
 };
 
@@ -273,8 +270,7 @@
       network::mojom::IPAddressSpace::kPublic};
   for (auto address_space : kAddressSpaces) {
     SharedWorkerInstance instance(
-        SharedWorkerId(), GURL("http://example.com/w.js"),
-        blink::mojom::ScriptType::kClassic,
+        GURL("http://example.com/w.js"), blink::mojom::ScriptType::kClassic,
         network::mojom::CredentialsMode::kSameOrigin, "name",
         url::Origin::Create(GURL("http://example.com/")), std::string(),
         network::mojom::ContentSecurityPolicyType::kReport, address_space,
@@ -283,30 +279,4 @@
   }
 }
 
-// This test ensures that 2 distinct SharedWorkerInstance using the same file:
-// script URL have different identities and can be ordered.
-TEST_F(SharedWorkerInstanceTest, StrictWeakOrderingFileURLs) {
-  GURL script_url("file://path/to/script.js");
-  std::string name = "name";
-  url::Origin constructor_origin = url::Origin::Create(script_url);
-
-  SharedWorkerInstance instance1 =
-      CreateInstance(script_url, name, constructor_origin);
-  SharedWorkerInstance instance2 =
-      CreateInstance(script_url, name, constructor_origin);
-
-  // file: URLs are treated as opaque. Both instances should not match.
-  EXPECT_FALSE(instance1.Matches(instance2.url(), instance2.name(),
-                                 instance2.constructor_origin()));
-  EXPECT_FALSE(instance2.Matches(instance1.url(), instance1.name(),
-                                 instance1.constructor_origin()));
-
-  // The instances are not equivalent
-  EXPECT_TRUE(instance1 < instance2 || instance2 < instance1);
-
-  // An instance is equivalent to itself.
-  EXPECT_FALSE(instance1 < instance1);
-  EXPECT_FALSE(instance2 < instance2);
-}
-
 }  // namespace content
diff --git a/content/browser/worker_host/shared_worker_service_impl.cc b/content/browser/worker_host/shared_worker_service_impl.cc
index 2a51956..77149e93 100644
--- a/content/browser/worker_host/shared_worker_service_impl.cc
+++ b/content/browser/worker_host/shared_worker_service_impl.cc
@@ -79,8 +79,7 @@
 void SharedWorkerServiceImpl::EnumerateSharedWorkers(Observer* observer) {
   for (const auto& host : worker_hosts_) {
     if (host->started()) {
-      observer->OnWorkerStarted(host->instance(),
-                                host->GetProcessHost()->GetID(),
+      observer->OnWorkerStarted(host->id(), host->GetProcessHost()->GetID(),
                                 host->dev_tools_token());
     }
   }
@@ -196,12 +195,11 @@
       /*can_be_default=*/true, &storage_domain, &partition_name, &in_memory);
 
   SharedWorkerInstance instance(
-      shared_worker_id_generator_.GenerateNextId(), info->url,
-      info->options->type, info->options->credentials, info->options->name,
-      constructor_origin, info->content_security_policy,
+      info->url, info->options->type, info->options->credentials,
+      info->options->name, constructor_origin, info->content_security_policy,
       info->content_security_policy_type, info->creation_address_space,
       creation_context_type);
-  host = CreateWorker(instance,
+  host = CreateWorker(shared_worker_id_generator_.GenerateNextId(), instance,
                       std::move(info->outside_fetch_client_settings_object),
                       client_render_frame_host_id, storage_domain, message_port,
                       std::move(blob_url_loader_factory));
@@ -216,24 +214,26 @@
 }
 
 void SharedWorkerServiceImpl::NotifyWorkerStarted(
-    const SharedWorkerInstance& instance,
+    SharedWorkerId shared_worker_id,
     int worker_process_id,
     const base::UnguessableToken& dev_tools_token) {
-  for (Observer& observer : observers_)
-    observer.OnWorkerStarted(instance, worker_process_id, dev_tools_token);
+  for (Observer& observer : observers_) {
+    observer.OnWorkerStarted(shared_worker_id, worker_process_id,
+                             dev_tools_token);
+  }
 }
 
 void SharedWorkerServiceImpl::NotifyWorkerTerminating(
-    const SharedWorkerInstance& instance) {
+    SharedWorkerId shared_worker_id) {
   for (Observer& observer : observers_)
-    observer.OnBeforeWorkerTerminated(instance);
+    observer.OnBeforeWorkerTerminated(shared_worker_id);
 }
 
 void SharedWorkerServiceImpl::NotifyClientAdded(
-    const SharedWorkerInstance& instance,
+    SharedWorkerId shared_worker_id,
     GlobalFrameRoutingId client_render_frame_host_id) {
   auto insertion_result = shared_worker_client_counts_.insert(
-      {{instance, client_render_frame_host_id}, 0});
+      {{shared_worker_id, client_render_frame_host_id}, 0});
 
   int& count = insertion_result.first->second;
   ++count;
@@ -242,15 +242,15 @@
   // shared worker.
   if (insertion_result.second) {
     for (Observer& observer : observers_)
-      observer.OnClientAdded(instance, client_render_frame_host_id);
+      observer.OnClientAdded(shared_worker_id, client_render_frame_host_id);
   }
 }
 
 void SharedWorkerServiceImpl::NotifyClientRemoved(
-    const SharedWorkerInstance& instance,
+    SharedWorkerId shared_worker_id,
     GlobalFrameRoutingId client_render_frame_host_id) {
   auto it = shared_worker_client_counts_.find(
-      std::make_pair(instance, client_render_frame_host_id));
+      std::make_pair(shared_worker_id, client_render_frame_host_id));
   DCHECK(it != shared_worker_client_counts_.end());
 
   int& count = it->second;
@@ -262,11 +262,12 @@
   if (count == 0) {
     shared_worker_client_counts_.erase(it);
     for (Observer& observer : observers_)
-      observer.OnClientRemoved(instance, client_render_frame_host_id);
+      observer.OnClientRemoved(shared_worker_id, client_render_frame_host_id);
   }
 }
 
 SharedWorkerHost* SharedWorkerServiceImpl::CreateWorker(
+    SharedWorkerId shared_worker_id,
     const SharedWorkerInstance& instance,
     blink::mojom::FetchClientSettingsObjectPtr
         outside_fetch_client_settings_object,
@@ -286,8 +287,9 @@
   // because we are about to bounce to the IO thread. If another ConnectToWorker
   // request arrives in the meantime, it finds and reuses the host instead of
   // creating a new host and therefore new SharedWorker thread.
-  auto insertion_result = worker_hosts_.insert(
-      std::make_unique<SharedWorkerHost>(this, instance, worker_process_host));
+  auto insertion_result =
+      worker_hosts_.insert(std::make_unique<SharedWorkerHost>(
+          this, shared_worker_id, instance, worker_process_host));
   DCHECK(insertion_result.second);
   SharedWorkerHost* host = insertion_result.first->get();
 
@@ -335,8 +337,7 @@
       std::move(blob_url_loader_factory), url_loader_factory_override_,
       storage_partition_, storage_domain,
       base::BindOnce(&SharedWorkerServiceImpl::StartWorker,
-                     weak_factory_.GetWeakPtr(), instance, weak_host,
-                     message_port,
+                     weak_factory_.GetWeakPtr(), weak_host, message_port,
                      std::move(cloned_outside_fetch_client_settings_object)));
 
   // Ensures that WorkerScriptFetchInitiator::Start() doesn't synchronously
@@ -347,7 +348,6 @@
 }
 
 void SharedWorkerServiceImpl::StartWorker(
-    const SharedWorkerInstance& instance,
     base::WeakPtr<SharedWorkerHost> host,
     const blink::MessagePortChannel& message_port,
     blink::mojom::FetchClientSettingsObjectPtr
@@ -399,6 +399,8 @@
               std::move(subresource_loader_factories), std::move(controller),
               std::move(controller_service_worker_object_host),
               std::move(outside_fetch_client_settings_object));
+  for (Observer& observer : observers_)
+    observer.OnFinalResponseURLDetermined(host->id(), final_response_url);
 }
 
 SharedWorkerHost* SharedWorkerServiceImpl::FindMatchingSharedWorkerHost(
diff --git a/content/browser/worker_host/shared_worker_service_impl.h b/content/browser/worker_host/shared_worker_service_impl.h
index b216a1e4..68828b1 100644
--- a/content/browser/worker_host/shared_worker_service_impl.h
+++ b/content/browser/worker_host/shared_worker_service_impl.h
@@ -74,13 +74,13 @@
   // Virtual for testing.
   virtual void DestroyHost(SharedWorkerHost* host);
 
-  void NotifyWorkerStarted(const SharedWorkerInstance& instance,
+  void NotifyWorkerStarted(SharedWorkerId shared_worker_id,
                            int worker_process_id,
                            const base::UnguessableToken& dev_tools_token);
-  void NotifyWorkerTerminating(const SharedWorkerInstance& instance);
-  void NotifyClientAdded(const SharedWorkerInstance& instance,
+  void NotifyWorkerTerminating(SharedWorkerId shared_worker_id);
+  void NotifyClientAdded(SharedWorkerId shared_worker_id,
                          GlobalFrameRoutingId render_frame_host_id);
-  void NotifyClientRemoved(const SharedWorkerInstance& instance,
+  void NotifyClientRemoved(SharedWorkerId shared_worker_id,
                            GlobalFrameRoutingId render_frame_host_id);
 
   StoragePartitionImpl* storage_partition() { return storage_partition_; }
@@ -93,6 +93,7 @@
 
   // Creates a new worker in the creator's renderer process.
   SharedWorkerHost* CreateWorker(
+      SharedWorkerId shared_worker_id,
       const SharedWorkerInstance& instance,
       blink::mojom::FetchClientSettingsObjectPtr
           outside_fetch_client_settings_object,
@@ -102,7 +103,6 @@
       scoped_refptr<network::SharedURLLoaderFactory> blob_url_loader_factory);
 
   void StartWorker(
-      const SharedWorkerInstance& instance,
       base::WeakPtr<SharedWorkerHost> host,
       const blink::MessagePortChannel& message_port,
       blink::mojom::FetchClientSettingsObjectPtr
@@ -142,7 +142,7 @@
   // duplicate OnClientAdded() notifications if the same frame connects multiple
   // times to the same shared worker. Note that this is a situation unique to
   // shared worker and cannot happen with dedicated workers and service workers.
-  base::flat_map<std::pair<SharedWorkerInstance, GlobalFrameRoutingId>, int>
+  base::flat_map<std::pair<SharedWorkerId, GlobalFrameRoutingId>, int>
       shared_worker_client_counts_;
 
   base::ObserverList<Observer> observers_;
diff --git a/content/browser/worker_host/shared_worker_service_impl_unittest.cc b/content/browser/worker_host/shared_worker_service_impl_unittest.cc
index ec16529..6446dc0 100644
--- a/content/browser/worker_host/shared_worker_service_impl_unittest.cc
+++ b/content/browser/worker_host/shared_worker_service_impl_unittest.cc
@@ -1272,26 +1272,28 @@
   ~TestSharedWorkerServiceObserver() override = default;
 
   // SharedWorkerService::Observer:
-  void OnWorkerStarted(const SharedWorkerInstance& instance,
+  void OnWorkerStarted(SharedWorkerId shared_worker_id,
                        int worker_process_id,
                        const base::UnguessableToken& dev_tools_token) override {
-    EXPECT_TRUE(running_workers_.insert({instance, {}}).second);
+    EXPECT_TRUE(running_workers_.insert({shared_worker_id, {}}).second);
   }
-  void OnBeforeWorkerTerminated(const SharedWorkerInstance& instance) override {
-    EXPECT_EQ(1u, running_workers_.erase(instance));
+  void OnBeforeWorkerTerminated(SharedWorkerId shared_worker_id) override {
+    EXPECT_EQ(1u, running_workers_.erase(shared_worker_id));
   }
+  void OnFinalResponseURLDetermined(SharedWorkerId shared_worker_id,
+                                    const GURL& url) override {}
   void OnClientAdded(
-      const SharedWorkerInstance& instance,
+      SharedWorkerId shared_worker_id,
       GlobalFrameRoutingId client_render_frame_host_id) override {
-    auto it = running_workers_.find(instance);
+    auto it = running_workers_.find(shared_worker_id);
     EXPECT_TRUE(it != running_workers_.end());
     std::set<GlobalFrameRoutingId>& clients = it->second;
     EXPECT_TRUE(clients.insert(client_render_frame_host_id).second);
   }
   void OnClientRemoved(
-      const SharedWorkerInstance& instance,
+      SharedWorkerId shared_worker_id,
       GlobalFrameRoutingId client_render_frame_host_id) override {
-    auto it = running_workers_.find(instance);
+    auto it = running_workers_.find(shared_worker_id);
     EXPECT_TRUE(it != running_workers_.end());
     std::set<GlobalFrameRoutingId>& clients = it->second;
     EXPECT_EQ(1u, clients.erase(client_render_frame_host_id));
@@ -1307,7 +1309,7 @@
   }
 
  private:
-  base::flat_map<SharedWorkerInstance, std::set<GlobalFrameRoutingId>>
+  base::flat_map<SharedWorkerId, std::set<GlobalFrameRoutingId>>
       running_workers_;
 
   DISALLOW_COPY_AND_ASSIGN(TestSharedWorkerServiceObserver);
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 3299027..141ac8d 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -100,6 +100,11 @@
 #endif
 
 #if defined(OS_ANDROID)
+  WebRuntimeFeatures::EnableWebNfc(
+      base::FeatureList::IsEnabled(features::kWebNfc));
+#endif
+
+#if defined(OS_ANDROID)
   // APIs for Web Authentication are not available prior to N.
   WebRuntimeFeatures::EnableWebAuth(
       base::FeatureList::IsEnabled(features::kWebAuth) &&
@@ -274,8 +279,6 @@
           {wf::EnableSkipTouchEventFilter, features::kSkipTouchEventFilter,
            kUseFeatureState},
           {wf::EnableSmsReceiver, features::kSmsReceiver, kDisableOnly},
-          {wf::EnableDisplayLocking, blink::features::kDisplayLocking,
-           kUseFeatureState},
           {wf::EnableConsolidatedMovementXY, features::kConsolidatedMovementXY,
            kUseFeatureState},
           {wf::EnableCooperativeScheduling, features::kCooperativeScheduling,
@@ -307,10 +310,6 @@
            features::kBrowserVerifiedUserActivationMouse, kEnableOnly},
           {wf::EnablePercentBasedScrolling, features::kPercentBasedScrolling,
            kUseFeatureState},
-#if defined(OS_ANDROID)
-          {wf::EnableWebNfc,
-           features::kWebNfc, kDisableOnly},
-#endif
       };
   for (const auto& mapping : blinkFeatureToBaseFeatureMapping) {
     const bool featureEnabled =
@@ -548,7 +547,6 @@
     WebRuntimeFeatures::EnableNetInfoDownlinkMax(true);
     WebRuntimeFeatures::EnableFetchMetadata(true);
     WebRuntimeFeatures::EnableFetchMetadataDestination(true);
-    WebRuntimeFeatures::EnableDisplayLocking(true);
   }
 
   WebRuntimeFeatures::EnableBackForwardCache(
diff --git a/content/common/DEPS b/content/common/DEPS
index 58c9ad0d..cadd92e 100644
--- a/content/common/DEPS
+++ b/content/common/DEPS
@@ -29,6 +29,7 @@
   "+third_party/blink/public/platform/web_fullscreen_video_status.h",
   "+third_party/blink/public/platform/web_http_body.h",
   "+third_party/blink/public/platform/web_history_scroll_restoration_type.h",
+  "+third_party/blink/public/platform/web_insecure_request_policy.h",
   "+third_party/blink/public/platform/web_intrinsic_sizing_info.h",
   "+third_party/blink/public/platform/web_mixed_content_context_type.h",
   "+third_party/blink/public/platform/web_screen_info.h",
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index 71f20d53..fa751d0 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -63,9 +63,9 @@
 #include "third_party/blink/public/mojom/input/focus_type.mojom.h"
 #include "third_party/blink/public/mojom/loader/resource_load_info.mojom-shared.h"
 #include "third_party/blink/public/mojom/scroll/scrollbar_mode.mojom.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom.h"
 #include "third_party/blink/public/mojom/web_feature/web_feature.mojom.h"
 #include "third_party/blink/public/platform/viewport_intersection_state.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/public/platform/web_intrinsic_sizing_info.h"
 #include "third_party/blink/public/web/web_frame_owner_properties.h"
 #include "third_party/blink/public/web/web_tree_scope_type.h"
@@ -137,8 +137,6 @@
                           blink::mojom::WebFeature::kMaxValue)
 IPC_ENUM_TRAITS_MAX_VALUE(network::mojom::RequestDestination,
                           network::mojom::RequestDestination::kMaxValue)
-IPC_ENUM_TRAITS_MAX_VALUE(blink::mojom::InsecureRequestPolicy,
-                          blink::mojom::InsecureRequestPolicy::kMaxValue)
 
 IPC_STRUCT_TRAITS_BEGIN(content::NavigationDownloadPolicy)
   IPC_STRUCT_TRAITS_MEMBER(observed_types)
@@ -323,8 +321,7 @@
   IPC_STRUCT_MEMBER(url::Origin, origin)
 
   // The insecure request policy the document for the load is enforcing.
-  IPC_STRUCT_MEMBER(blink::mojom::InsecureRequestPolicy,
-                    insecure_request_policy)
+  IPC_STRUCT_MEMBER(blink::WebInsecureRequestPolicy, insecure_request_policy)
 
   // The upgrade insecure navigations set the document for the load is
   // enforcing.
@@ -561,7 +558,7 @@
 // Update a proxy's replicated enforcement of insecure request policy.
 // Used when the frame's policy is changed in another process.
 IPC_MESSAGE_ROUTED1(FrameMsg_EnforceInsecureRequestPolicy,
-                    blink::mojom::InsecureRequestPolicy)
+                    blink::WebInsecureRequestPolicy)
 
 // Send to the RenderFrame to set text tracks state and style settings.
 // Sent for top-level frames.
diff --git a/content/common/frame_replication_state.cc b/content/common/frame_replication_state.cc
index abae9b0b..5017cac 100644
--- a/content/common/frame_replication_state.cc
+++ b/content/common/frame_replication_state.cc
@@ -5,7 +5,6 @@
 #include "content/common/frame_replication_state.h"
 
 #include "third_party/blink/public/common/frame/sandbox_flags.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom.h"
 #include "third_party/blink/public/web/web_tree_scope_type.h"
 
 namespace content {
@@ -13,8 +12,7 @@
 FrameReplicationState::FrameReplicationState()
     : active_sandbox_flags(blink::mojom::WebSandboxFlags::kNone),
       scope(blink::WebTreeScopeType::kDocument),
-      insecure_request_policy(
-          blink::mojom::InsecureRequestPolicy::kLeaveInsecureRequestsAlone),
+      insecure_request_policy(blink::kLeaveInsecureRequestsAlone),
       has_potentially_trustworthy_unique_origin(false),
       has_received_user_gesture(false),
       has_received_user_gesture_before_nav(false) {}
@@ -23,7 +21,7 @@
     blink::WebTreeScopeType scope,
     const std::string& name,
     const std::string& unique_name,
-    blink::mojom::InsecureRequestPolicy insecure_request_policy,
+    blink::WebInsecureRequestPolicy insecure_request_policy,
     const std::vector<uint32_t>& insecure_navigations_set,
     bool has_potentially_trustworthy_unique_origin,
     bool has_received_user_gesture,
diff --git a/content/common/frame_replication_state.h b/content/common/frame_replication_state.h
index 98226da..3400ccb2 100644
--- a/content/common/frame_replication_state.h
+++ b/content/common/frame_replication_state.h
@@ -14,7 +14,7 @@
 #include "third_party/blink/public/common/frame/frame_owner_element_type.h"
 #include "third_party/blink/public/common/frame/frame_policy.h"
 #include "third_party/blink/public/mojom/ad_tagging/ad_frame.mojom-shared.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-forward.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "url/origin.h"
 
 namespace blink {
@@ -28,16 +28,15 @@
 // RenderFrame and any of its associated RenderFrameProxies.
 struct CONTENT_EXPORT FrameReplicationState {
   FrameReplicationState();
-  FrameReplicationState(
-      blink::WebTreeScopeType scope,
-      const std::string& name,
-      const std::string& unique_name,
-      blink::mojom::InsecureRequestPolicy insecure_request_policy,
-      const std::vector<uint32_t>& insecure_navigations_set,
-      bool has_potentially_trustworthy_unique_origin,
-      bool has_received_user_gesture,
-      bool has_received_user_gesture_before_nav,
-      blink::FrameOwnerElementType owner_type);
+  FrameReplicationState(blink::WebTreeScopeType scope,
+                        const std::string& name,
+                        const std::string& unique_name,
+                        blink::WebInsecureRequestPolicy insecure_request_policy,
+                        const std::vector<uint32_t>& insecure_navigations_set,
+                        bool has_potentially_trustworthy_unique_origin,
+                        bool has_received_user_gesture,
+                        bool has_received_user_gesture_before_nav,
+                        blink::FrameOwnerElementType owner_type);
   FrameReplicationState(const FrameReplicationState& other);
   ~FrameReplicationState();
 
@@ -124,7 +123,7 @@
   // The insecure request policy that a frame's current document is enforcing.
   // Updates are immediately sent to all frame proxies when frames live in
   // different processes.
-  blink::mojom::InsecureRequestPolicy insecure_request_policy;
+  blink::WebInsecureRequestPolicy insecure_request_policy;
 
   // The upgrade insecure navigations set that a frame's current document is
   // enforcing. Updates are immediately sent to all frame proxies when frames
diff --git a/content/public/browser/dedicated_worker_service.h b/content/public/browser/dedicated_worker_service.h
index 98ac744..6ca048c 100644
--- a/content/public/browser/dedicated_worker_service.h
+++ b/content/public/browser/dedicated_worker_service.h
@@ -10,6 +10,8 @@
 #include "content/common/content_export.h"
 #include "content/public/browser/global_routing_id.h"
 
+class GURL;
+
 namespace content {
 
 using DedicatedWorkerId = util::IdType64<class DedicatedWorkerTag>;
@@ -28,6 +30,14 @@
     virtual void OnBeforeWorkerTerminated(
         DedicatedWorkerId dedicated_worker_id,
         GlobalFrameRoutingId ancestor_render_frame_host_id) = 0;
+
+    // Called when the final response URL (the URL after redirects) was
+    // determined when fetching the worker's script.
+    //
+    // TODO(pmonette): Implement this in derived classes and make it pure.
+    virtual void OnFinalResponseURLDetermined(
+        DedicatedWorkerId dedicated_worker_id,
+        const GURL& url) {}
   };
 
   // Adds/removes an observer.
diff --git a/content/public/browser/shared_worker_instance.cc b/content/public/browser/shared_worker_instance.cc
index 98169913..284730f 100644
--- a/content/public/browser/shared_worker_instance.cc
+++ b/content/public/browser/shared_worker_instance.cc
@@ -4,8 +4,6 @@
 
 #include "content/public/browser/shared_worker_instance.h"
 
-#include <tuple>
-
 #include "base/logging.h"
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/common/content_client.h"
@@ -13,7 +11,6 @@
 namespace content {
 
 SharedWorkerInstance::SharedWorkerInstance(
-    SharedWorkerId id,
     const GURL& url,
     blink::mojom::ScriptType script_type,
     network::mojom::CredentialsMode credentials_mode,
@@ -23,8 +20,7 @@
     network::mojom::ContentSecurityPolicyType security_policy_type,
     network::mojom::IPAddressSpace creation_address_space,
     blink::mojom::SharedWorkerCreationContextType creation_context_type)
-    : id_(id),
-      url_(url),
+    : url_(url),
       script_type_(script_type),
       credentials_mode_(credentials_mode),
       name_(name),
@@ -46,12 +42,6 @@
 SharedWorkerInstance::SharedWorkerInstance(SharedWorkerInstance&& other) =
     default;
 
-SharedWorkerInstance& SharedWorkerInstance::operator=(
-    const SharedWorkerInstance& other) = default;
-
-SharedWorkerInstance& SharedWorkerInstance::operator=(
-    SharedWorkerInstance&& other) = default;
-
 SharedWorkerInstance::~SharedWorkerInstance() = default;
 
 bool SharedWorkerInstance::Matches(
@@ -76,9 +66,4 @@
   return true;
 }
 
-bool operator<(const SharedWorkerInstance& lhs,
-               const SharedWorkerInstance& rhs) {
-  return lhs.id_ < rhs.id_;
-}
-
 }  // namespace content
diff --git a/content/public/browser/shared_worker_instance.h b/content/public/browser/shared_worker_instance.h
index 739550e..b3f1c35 100644
--- a/content/public/browser/shared_worker_instance.h
+++ b/content/public/browser/shared_worker_instance.h
@@ -7,7 +7,6 @@
 
 #include <string>
 
-#include "base/util/type_safety/id_type.h"
 #include "content/common/content_export.h"
 #include "services/network/public/mojom/content_security_policy.mojom.h"
 #include "services/network/public/mojom/fetch_api.mojom.h"
@@ -19,14 +18,17 @@
 
 namespace content {
 
-using SharedWorkerId = util::IdType64<class SharedWorkerTag>;
-
-// SharedWorkerInstance is the browser-side representation of one instance of a
+// This class hold the necessary information to decide if a shared worker
+// connection request (SharedWorkerConnector::Connect()) matches an existing
 // shared worker.
+//
+// Note: There exist one SharedWorkerInstance per SharedWorkerHost but it's
+// possible to have 2 distinct SharedWorkerHost that have an identical
+// SharedWorkerInstance. An example is if |url_| or |constructor_origin| has a
+// "file:" scheme, which is treated as opaque.
 class CONTENT_EXPORT SharedWorkerInstance {
  public:
   SharedWorkerInstance(
-      SharedWorkerId id,
       const GURL& url,
       blink::mojom::ScriptType script_type,
       network::mojom::CredentialsMode credentials_mode,
@@ -38,8 +40,8 @@
       blink::mojom::SharedWorkerCreationContextType creation_context_type);
   SharedWorkerInstance(const SharedWorkerInstance& other);
   SharedWorkerInstance(SharedWorkerInstance&& other);
-  SharedWorkerInstance& operator=(const SharedWorkerInstance& other);
-  SharedWorkerInstance& operator=(SharedWorkerInstance&& other);
+  SharedWorkerInstance& operator=(const SharedWorkerInstance& other) = delete;
+  SharedWorkerInstance& operator=(SharedWorkerInstance&& other) = delete;
   ~SharedWorkerInstance();
 
   // Checks if this SharedWorkerInstance matches the passed url, name, and
@@ -73,34 +75,23 @@
   }
 
  private:
-  // Compares SharedWorkerInstances using the |id_|.
-  CONTENT_EXPORT friend bool operator<(const SharedWorkerInstance& lhs,
-                                       const SharedWorkerInstance& rhs);
-
-  // An internal ID that is unique within a storage partition. It is needed to
-  // differentiate 2 SharedWorkerInstance that have the same url, name and
-  // constructor origin but actually represent different workers. This is
-  // possible with a file: |url| or |constructor_origin| since they are treated
-  // as opaque in this class.
-  SharedWorkerId id_;
-
-  GURL url_;
-  blink::mojom::ScriptType script_type_;
+  const GURL url_;
+  const blink::mojom::ScriptType script_type_;
 
   // Used for fetching the top-level worker script.
-  network::mojom::CredentialsMode credentials_mode_;
+  const network::mojom::CredentialsMode credentials_mode_;
 
-  std::string name_;
+  const std::string name_;
 
   // The origin of the document that created this shared worker instance. Used
   // for security checks. See Matches() for details.
   // https://html.spec.whatwg.org/multipage/workers.html#concept-sharedworkerglobalscope-constructor-origin
-  url::Origin constructor_origin_;
+  const url::Origin constructor_origin_;
 
-  std::string content_security_policy_;
-  network::mojom::ContentSecurityPolicyType content_security_policy_type_;
-  network::mojom::IPAddressSpace creation_address_space_;
-  blink::mojom::SharedWorkerCreationContextType creation_context_type_;
+  const std::string content_security_policy_;
+  const network::mojom::ContentSecurityPolicyType content_security_policy_type_;
+  const network::mojom::IPAddressSpace creation_address_space_;
+  const blink::mojom::SharedWorkerCreationContextType creation_context_type_;
 };
 
 }  // namespace content
diff --git a/content/public/browser/shared_worker_service.h b/content/public/browser/shared_worker_service.h
index e1f5ae1..abc8b85 100644
--- a/content/public/browser/shared_worker_service.h
+++ b/content/public/browser/shared_worker_service.h
@@ -8,6 +8,7 @@
 #include <string>
 
 #include "base/observer_list_types.h"
+#include "base/util/type_safety/id_type.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/global_routing_id.h"
 
@@ -23,7 +24,7 @@
 
 namespace content {
 
-class SharedWorkerInstance;
+using SharedWorkerId = util::IdType64<class SharedWorkerTag>;
 
 // An interface for managing shared workers. These may be run in a separate
 // process, since multiple renderer processes can be talking to a single shared
@@ -38,20 +39,26 @@
     // running in the renderer. This differs a bit from the "started" state of
     // the embedded worker.
     virtual void OnWorkerStarted(
-        const SharedWorkerInstance& instance,
+        SharedWorkerId shared_worker_id,
         int worker_process_id,
         const base::UnguessableToken& dev_tools_token) = 0;
-    virtual void OnBeforeWorkerTerminated(
-        const SharedWorkerInstance& instance) = 0;
+    virtual void OnBeforeWorkerTerminated(SharedWorkerId shared_worker_id) = 0;
+
+    // Called when the final response URL (the URL after redirects) was
+    // determined when fetching the worker's script.
+    //
+    // TODO(pmonette): Implement this in derived classes and make it pure.
+    virtual void OnFinalResponseURLDetermined(SharedWorkerId shared_worker_id,
+                                              const GURL& url) {}
 
     // Called when a frame starts/stop being a client of a shared worker. It is
     // guaranteed that OnWorkerStarted() is called before receiving these
     // notifications.
     virtual void OnClientAdded(
-        const SharedWorkerInstance& instance,
+        SharedWorkerId shared_worker_id,
         content::GlobalFrameRoutingId render_frame_host_id) = 0;
     virtual void OnClientRemoved(
-        const SharedWorkerInstance& instance,
+        SharedWorkerId shared_worker_id,
         content::GlobalFrameRoutingId render_frame_host_id) = 0;
   };
 
diff --git a/content/public/browser/web_ui.h b/content/public/browser/web_ui.h
index 12ea870..4e6aa0e2 100644
--- a/content/public/browser/web_ui.h
+++ b/content/public/browser/web_ui.h
@@ -7,21 +7,19 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 #include <vector>
 
+#include "base/bind.h"
 #include "base/callback.h"
 #include "base/strings/string16.h"
 #include "base/strings/string_piece.h"
+#include "base/values.h"
 #include "content/common/content_export.h"
 #include "ui/base/page_transition_types.h"
 
 class GURL;
 
-namespace base {
-class ListValue;
-class Value;
-}
-
 namespace content {
 
 class WebContents;
@@ -82,6 +80,16 @@
   virtual void RegisterMessageCallback(base::StringPiece message,
                                        const MessageCallback& callback) = 0;
 
+  template <typename... Args>
+  void RegisterHandlerCallback(
+      base::StringPiece message,
+      base::RepeatingCallback<void(Args...)> callback) {
+    RegisterMessageCallback(
+        message, base::BindRepeating(
+                     &Call<std::index_sequence_for<Args...>, Args...>::Impl,
+                     callback, message));
+  }
+
   // This is only needed if an embedder overrides handling of a WebUIMessage and
   // then later wants to undo that, or to route it to a different WebUI object.
   virtual void ProcessWebUIMessage(const GURL& source_url,
@@ -125,6 +133,40 @@
   // Allows mutable access to this WebUI's message handlers for testing.
   virtual std::vector<std::unique_ptr<WebUIMessageHandler>>*
   GetHandlersForTesting() = 0;
+
+ private:
+  template <typename T>
+  static T GetValue(const base::Value& value);
+
+  template <>
+  inline bool GetValue<bool>(const base::Value& value) {
+    return value.GetBool();
+  }
+
+  template <>
+  inline int GetValue<int>(const base::Value& value) {
+    return value.GetInt();
+  }
+
+  template <>
+  inline const std::string& GetValue<const std::string&>(
+      const base::Value& value) {
+    return value.GetString();
+  }
+
+  template <typename Is, typename... Args>
+  struct Call;
+
+  template <size_t... Is, typename... Args>
+  struct Call<std::index_sequence<Is...>, Args...> {
+    static void Impl(base::RepeatingCallback<void(Args...)> callback,
+                     base::StringPiece message,
+                     const base::ListValue* list) {
+      base::span<const base::Value> args = list->GetList();
+      CHECK_EQ(args.size(), sizeof...(Args)) << message;
+      callback.Run(GetValue<Args>(args[Is])...);
+    }
+  };
 };
 
 }  // namespace content
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index a65c846..7bfac85 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -832,10 +832,9 @@
 const base::Feature kForce60HzRefreshRate{"Force60HzRefreshRate",
                                           base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Kill switch for the WebNFC feature. This feature can be enabled for all sites
-// using the kEnableExperimentalWebPlatformFeatures flag or by a particular site
-// if it includes an Origin Trial key.  https://w3c.github.io/web-nfc/
-const base::Feature kWebNfc{"WebNFC", base::FEATURE_ENABLED_BY_DEFAULT};
+// Controls whether the WebNFC API is enabled:
+// https://w3c.github.io/web-nfc/
+const base::Feature kWebNfc{"WebNFC", base::FEATURE_DISABLED_BY_DEFAULT};
 #endif  // defined(OS_ANDROID)
 
 #if defined(OS_CHROMEOS)
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index f7a71a4..3915630b 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -450,10 +450,6 @@
 // Enable the Vtune profiler support.
 const char kEnableVtune[]                   = "enable-vtune-support";
 
-// Enable the Web Authentication Testing API.
-// https://w3c.github.io/webauthn
-const char kEnableWebAuthTestingAPI[] = "enable-web-authentication-testing-api";
-
 // Enable WebGL2 Compute context.
 const char kEnableWebGL2ComputeContext[] = "enable-webgl2-compute-context";
 
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
index cd68675..b2f61c83 100644
--- a/content/public/common/content_switches.h
+++ b/content/public/common/content_switches.h
@@ -140,7 +140,6 @@
 CONTENT_EXPORT extern const char kEnableUseZoomForDSF[];
 CONTENT_EXPORT extern const char kEnableViewport[];
 CONTENT_EXPORT extern const char kEnableVtune[];
-CONTENT_EXPORT extern const char kEnableWebAuthTestingAPI[];
 CONTENT_EXPORT extern const char kEnableWebGL2ComputeContext[];
 CONTENT_EXPORT extern const char kEnableWebGLDraftExtensions[];
 CONTENT_EXPORT extern const char kEnableWebGLImageChromium[];
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc
index 20429a5..f4b6a21 100644
--- a/content/public/test/browser_test_utils.cc
+++ b/content/public/test/browser_test_utils.cc
@@ -2386,6 +2386,10 @@
 
 void RenderProcessHostWatcher::Wait() {
   run_loop_.Run();
+
+  DCHECK(allow_renderer_crashes_)
+      << "RenderProcessHostWatcher::Wait() may only be called once";
+  allow_renderer_crashes_.reset();
 }
 
 void RenderProcessHostWatcher::RenderProcessReady(RenderProcessHost* host) {
diff --git a/content/renderer/input/frame_input_handler_impl.cc b/content/renderer/input/frame_input_handler_impl.cc
index 1d98b814..e0f8cf5 100644
--- a/content/renderer/input/frame_input_handler_impl.cc
+++ b/content/renderer/input/frame_input_handler_impl.cc
@@ -10,7 +10,6 @@
 #include "base/logging.h"
 #include "content/common/input/ime_text_span_conversions.h"
 #include "content/common/input/input_handler.mojom.h"
-#include "content/renderer/compositor/layer_tree_view.h"
 #include "content/renderer/ime_event_guard.h"
 #include "content/renderer/input/widget_input_handler_manager.h"
 #include "content/renderer/render_thread_impl.h"
diff --git a/content/renderer/input/render_widget_input_handler.cc b/content/renderer/input/render_widget_input_handler.cc
index 0d870984..c16638f 100644
--- a/content/renderer/input/render_widget_input_handler.cc
+++ b/content/renderer/input/render_widget_input_handler.cc
@@ -19,7 +19,6 @@
 #include "content/public/common/content_switches.h"
 #include "content/public/common/input_event_ack_state.h"
 #include "content/public/renderer/render_frame.h"
-#include "content/renderer/compositor/layer_tree_view.h"
 #include "content/renderer/ime_event_guard.h"
 #include "content/renderer/input/render_widget_input_handler_delegate.h"
 #include "content/renderer/render_frame_proxy.h"
diff --git a/content/renderer/input/widget_input_handler_impl.cc b/content/renderer/input/widget_input_handler_impl.cc
index 3f99c8a..a0fc212 100644
--- a/content/renderer/input/widget_input_handler_impl.cc
+++ b/content/renderer/input/widget_input_handler_impl.cc
@@ -10,7 +10,6 @@
 #include "base/logging.h"
 #include "content/common/input/ime_text_span_conversions.h"
 #include "content/common/input_messages.h"
-#include "content/renderer/compositor/layer_tree_view.h"
 #include "content/renderer/ime_event_guard.h"
 #include "content/renderer/input/widget_input_handler_manager.h"
 #include "content/renderer/render_thread_impl.h"
diff --git a/content/renderer/input/widget_input_handler_manager.cc b/content/renderer/input/widget_input_handler_manager.cc
index e7d9375..005c531 100644
--- a/content/renderer/input/widget_input_handler_manager.cc
+++ b/content/renderer/input/widget_input_handler_manager.cc
@@ -10,7 +10,6 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "content/common/input_messages.h"
-#include "content/renderer/compositor/layer_tree_view.h"
 #include "content/renderer/ime_event_guard.h"
 #include "content/renderer/input/widget_input_handler_impl.h"
 #include "content/renderer/render_thread_impl.h"
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index dccea8b1..aafa807 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -90,7 +90,6 @@
 #include "content/renderer/accessibility/aom_content_ax_tree.h"
 #include "content/renderer/accessibility/render_accessibility_impl.h"
 #include "content/renderer/accessibility/render_accessibility_manager.h"
-#include "content/renderer/compositor/layer_tree_view.h"
 #include "content/renderer/content_security_policy_util.h"
 #include "content/renderer/context_menu_params_builder.h"
 #include "content/renderer/crash_helpers.h"
@@ -1366,7 +1365,7 @@
   render_frame->InitializeBlameContext(nullptr);
 
   WebLocalFrame* web_frame = WebLocalFrame::CreateMainFrame(
-      render_view->webview(), render_frame,
+      render_view->GetWebView(), render_frame,
       render_frame->blink_interface_registry_.get(), opener,
       // This conversion is a little sad, as this often comes from a
       // WebString...
@@ -1394,7 +1393,7 @@
   // The WebFrame created here was already attached to the Page as its
   // main frame, and the WebFrameWidget has been initialized, so we can call
   // WebViewImpl's DidAttachLocalMainFrame().
-  render_view->webview()->DidAttachLocalMainFrame();
+  render_view->GetWebView()->DidAttachLocalMainFrame();
 
   // The RenderWidget should start with valid VisualProperties, including a
   // non-zero size. While RenderWidget would not normally receive IPCs and
@@ -1992,7 +1991,7 @@
     PepperPluginInstanceImpl* plugin) {
   // Get the URL of the main frame if possible.
   blink::WebURL main_frame_url;
-  WebFrame* main_frame = render_view()->webview()->MainFrame();
+  WebFrame* main_frame = render_view()->GetWebView()->MainFrame();
   if (main_frame->IsWebLocalFrame())
     main_frame_url = main_frame->ToWebLocalFrame()->GetDocument().Url();
 
@@ -2397,7 +2396,7 @@
       frame_->SendPings(custom_context.link_followed);
   }
 
-  render_view()->webview()->DidCloseContextMenu();
+  render_view()->GetWebView()->DidCloseContextMenu();
 }
 
 void RenderFrameImpl::OnCustomContextMenuAction(
@@ -2411,7 +2410,7 @@
       client->OnMenuAction(custom_context.request_id, action);
   } else {
     // Internal request, forward to WebKit.
-    render_view_->webview()->PerformCustomContextMenuAction(action);
+    render_view_->GetWebView()->PerformCustomContextMenuAction(action);
   }
 }
 
@@ -2669,41 +2668,41 @@
   RenderFrameProxy* source_frame =
       RenderFrameProxy::FromRoutingID(source_routing_id);
   if (!source_frame) {
-    render_view_->webview()->SetInitialFocus(
+    render_view_->GetWebView()->SetInitialFocus(
         type == blink::mojom::FocusType::kBackward);
     return;
   }
 
-  render_view_->webview()->AdvanceFocusAcrossFrames(
+  render_view_->GetWebView()->AdvanceFocusAcrossFrames(
       type, source_frame->web_frame(), frame_);
 }
 
 void RenderFrameImpl::OnTextTrackSettingsChanged(
     const FrameMsg_TextTrackSettings_Params& params) {
   DCHECK(!frame_->Parent());
-  if (!render_view_->webview())
+  if (!render_view_->GetWebView())
     return;
 
   if (params.text_tracks_enabled) {
-    render_view_->webview()->GetSettings()->SetTextTrackKindUserPreference(
+    render_view_->GetWebView()->GetSettings()->SetTextTrackKindUserPreference(
         WebSettings::TextTrackKindUserPreference::kCaptions);
   } else {
-    render_view_->webview()->GetSettings()->SetTextTrackKindUserPreference(
+    render_view_->GetWebView()->GetSettings()->SetTextTrackKindUserPreference(
         WebSettings::TextTrackKindUserPreference::kDefault);
   }
-  render_view_->webview()->GetSettings()->SetTextTrackBackgroundColor(
+  render_view_->GetWebView()->GetSettings()->SetTextTrackBackgroundColor(
       WebString::FromUTF8(params.text_track_background_color));
-  render_view_->webview()->GetSettings()->SetTextTrackFontFamily(
+  render_view_->GetWebView()->GetSettings()->SetTextTrackFontFamily(
       WebString::FromUTF8(params.text_track_font_family));
-  render_view_->webview()->GetSettings()->SetTextTrackFontStyle(
+  render_view_->GetWebView()->GetSettings()->SetTextTrackFontStyle(
       WebString::FromUTF8(params.text_track_font_style));
-  render_view_->webview()->GetSettings()->SetTextTrackFontVariant(
+  render_view_->GetWebView()->GetSettings()->SetTextTrackFontVariant(
       WebString::FromUTF8(params.text_track_font_variant));
-  render_view_->webview()->GetSettings()->SetTextTrackTextColor(
+  render_view_->GetWebView()->GetSettings()->SetTextTrackTextColor(
       WebString::FromUTF8(params.text_track_text_color));
-  render_view_->webview()->GetSettings()->SetTextTrackTextShadow(
+  render_view_->GetWebView()->GetSettings()->SetTextTrackTextShadow(
       WebString::FromUTF8(params.text_track_text_shadow));
-  render_view_->webview()->GetSettings()->SetTextTrackTextSize(
+  render_view_->GetWebView()->GetSettings()->SetTextTrackTextSize(
       WebString::FromUTF8(params.text_track_text_size));
 }
 
@@ -4934,7 +4933,7 @@
 }
 
 blink::WebString RenderFrameImpl::UserAgentOverride() {
-  if (!render_view_->webview() || !render_view_->webview()->MainFrame() ||
+  if (!render_view_->GetWebView() || !render_view_->GetWebView()->MainFrame() ||
       render_view_->renderer_preferences_.user_agent_override.empty()) {
     return blink::WebString();
   }
@@ -4943,10 +4942,10 @@
   // WebDocumentLoader associated with it, so the checks below are not valid.
   // Temporarily return early and fix properly as part of
   // https://crbug.com/426555.
-  if (render_view_->webview()->MainFrame()->IsWebRemoteFrame())
+  if (render_view_->GetWebView()->MainFrame()->IsWebRemoteFrame())
     return blink::WebString();
   WebLocalFrame* main_frame =
-      render_view_->webview()->MainFrame()->ToWebLocalFrame();
+      render_view_->GetWebView()->MainFrame()->ToWebLocalFrame();
 
   WebDocumentLoader* document_loader = main_frame->GetDocumentLoader();
   InternalDocumentStateData* internal_data =
@@ -5306,7 +5305,7 @@
   UpdateNavigationHistory(item, commit_type);
 
   if (internal_data->must_reset_scroll_and_scale_state()) {
-    render_view_->webview()->ResetScrollAndScaleState();
+    render_view_->GetWebView()->ResetScrollAndScaleState();
     internal_data->set_must_reset_scroll_and_scale_state(false);
   }
   if (!frame_->Parent()) {  // Only for top frames.
@@ -5341,13 +5340,13 @@
   // existing autoplay flags on the Page. This is because flags are stored at
   // the page level so subframes would only add to them.
   if (!frame_->Parent() && !navigation_state->WasWithinSameDocument()) {
-    render_view_->webview()->ClearAutoplayFlags();
+    render_view_->GetWebView()->ClearAutoplayFlags();
   }
 
   // Set the correct autoplay flags on the Page and wipe the cached origin so
   // this will not be used incorrectly.
   if (url::Origin(frame_->GetSecurityOrigin()) == autoplay_flags_.first) {
-    render_view_->webview()->AddAutoplayFlags(autoplay_flags_.second);
+    render_view_->GetWebView()->AddAutoplayFlags(autoplay_flags_.second);
     autoplay_flags_.first = url::Origin();
   }
 }
@@ -5505,7 +5504,7 @@
     // its main frame, and the WebFrameWidget was previously initialized when
     // the frame was created, so we can call WebViewImpl's
     // DidAttachLocalMainFrame().
-    render_view_->webview()->DidAttachLocalMainFrame();
+    render_view_->GetWebView()->DidAttachLocalMainFrame();
   }
 
   return true;
@@ -6149,7 +6148,9 @@
 
   rect_for_scrolled_focused_editable_node_ = rect;
   has_scrolled_focused_editable_node_into_rect_ = true;
-  if (!GetLocalRootRenderWidget()->HasPendingPageScaleAnimation() &&
+  if (!GetLocalRootRenderWidget()
+           ->layer_tree_host()
+           ->HasPendingPageScaleAnimation() &&
       autofill_client) {
     autofill_client->DidCompleteFocusChangeInFrame();
   }
@@ -6172,7 +6173,7 @@
 void RenderFrameImpl::PrepareRenderViewForNavigation(
     const GURL& url,
     const mojom::CommitNavigationParams& commit_params) {
-  DCHECK(render_view_->webview());
+  DCHECK(render_view_->GetWebView());
 
   render_view_->history_list_offset_ =
       commit_params.current_history_list_offset;
diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc
index 6215eb4..4d0f0abb 100644
--- a/content/renderer/render_frame_impl_browsertest.cc
+++ b/content/renderer/render_frame_impl_browsertest.cc
@@ -157,7 +157,7 @@
   }
 
   static int32_t AutoplayFlagsForFrame(TestRenderFrame* frame) {
-    return frame->render_view()->webview()->AutoplayFlagsForTest();
+    return frame->render_view()->GetWebView()->AutoplayFlagsForTest();
   }
 
 #if defined(OS_ANDROID)
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc
index 60888e8..27cb8bc 100644
--- a/content/renderer/render_frame_proxy.cc
+++ b/content/renderer/render_frame_proxy.cc
@@ -36,7 +36,6 @@
 #include "third_party/blink/public/common/feature_policy/feature_policy.h"
 #include "third_party/blink/public/common/frame/frame_policy.h"
 #include "third_party/blink/public/common/navigation/triggering_event_info.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom.h"
 #include "third_party/blink/public/platform/url_conversion.h"
 #include "third_party/blink/public/platform/web_rect.h"
 #include "third_party/blink/public/platform/web_string.h"
@@ -429,7 +428,7 @@
 }
 
 void RenderFrameProxy::OnEnforceInsecureRequestPolicy(
-    blink::mojom::InsecureRequestPolicy policy) {
+    blink::WebInsecureRequestPolicy policy) {
   web_frame_->SetReplicatedInsecureRequestPolicy(policy);
 }
 
diff --git a/content/renderer/render_frame_proxy.h b/content/renderer/render_frame_proxy.h
index 708d49d..8fce01a 100644
--- a/content/renderer/render_frame_proxy.h
+++ b/content/renderer/render_frame_proxy.h
@@ -26,7 +26,7 @@
 #include "third_party/blink/public/mojom/frame/frame.mojom.h"
 #include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom.h"
 #include "third_party/blink/public/mojom/input/focus_type.mojom-forward.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-forward.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/public/web/web_remote_frame.h"
 #include "third_party/blink/public/web/web_remote_frame_client.h"
 #include "url/origin.h"
@@ -227,8 +227,7 @@
   void OnCompositorFrameSwapped(const IPC::Message& message);
   void OnUpdateOpener(int opener_routing_id);
   void OnDidUpdateName(const std::string& name, const std::string& unique_name);
-  void OnEnforceInsecureRequestPolicy(
-      blink::mojom::InsecureRequestPolicy policy);
+  void OnEnforceInsecureRequestPolicy(blink::WebInsecureRequestPolicy policy);
   void OnTransferUserActivationFrom(int32_t source_routing_id);
 
   // mojom::RenderFrameProxy implementation:
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
index 75b2468..5ec5092 100644
--- a/content/renderer/render_view_browsertest.cc
+++ b/content/renderer/render_view_browsertest.cc
@@ -452,7 +452,7 @@
   }
 
   int GetScrollbarWidth() {
-    blink::WebView* webview = view()->webview();
+    blink::WebView* webview = view()->GetWebView();
     return webview->MainFrameWidget()->Size().width -
            webview->MainFrame()->ToWebLocalFrame()->VisibleContentRect().width;
   }
@@ -467,7 +467,7 @@
     RenderViewImplTest::SetUp();
   }
 
-  blink::WebSettings* settings() { return view()->webview()->GetSettings(); }
+  blink::WebSettings* settings() { return view()->GetWebView()->GetSettings(); }
 
  protected:
   // Blink settings may be specified on the command line, which must
@@ -606,7 +606,7 @@
   args.browser_controls_constraint = cc::BrowserControlsState::kHidden;
   args.scroll_gesture_did_end = false;
 
-  view()->webview()->MainFrameWidget()->ApplyViewportChanges(args);
+  view()->GetWebView()->MainFrameWidget()->ApplyViewportChanges(args);
   EXPECT_TRUE(child_proxy_1->is_pinch_gesture_active_for_testing());
 
   // Create a new remote child, and get its proxy. Unloading will force creation
@@ -623,7 +623,7 @@
 
   // Reset the flag, make sure both children respond.
   args.is_pinch_gesture_active = false;
-  view()->webview()->MainFrameWidget()->ApplyViewportChanges(args);
+  view()->GetWebView()->MainFrameWidget()->ApplyViewportChanges(args);
   EXPECT_FALSE(child_proxy_1->is_pinch_gesture_active_for_testing());
   EXPECT_FALSE(child_proxy_2->is_pinch_gesture_active_for_testing());
 }
@@ -1179,7 +1179,7 @@
       ReconstructReplicationStateForTesting(frame());
   // replication_state.origin = url::Origin(GURL("http://foo.com"));
   frame()->Unload(kProxyRoutingId, true, replication_state);
-  EXPECT_TRUE(view()->webview()->MainFrame()->IsWebRemoteFrame());
+  EXPECT_TRUE(view()->GetWebView()->MainFrame()->IsWebRemoteFrame());
 
   // Do the remote-to-local transition for the proxy, which is to create a
   // provisional local frame.
@@ -1219,7 +1219,8 @@
   base::RunLoop().RunUntilIdle();
 
   EXPECT_EQ(device_scale, view()->GetMainRenderFrame()->GetDeviceScaleFactor());
-  EXPECT_EQ(device_scale, view()->webview()->ZoomFactorForDeviceScaleFactor());
+  EXPECT_EQ(device_scale,
+            view()->GetWebView()->ZoomFactorForDeviceScaleFactor());
 
   double device_pixel_ratio;
   base::string16 get_dpr =
@@ -1232,7 +1233,7 @@
   base::string16 get_width =
       base::ASCIIToUTF16("Number(document.documentElement.clientWidth)");
   EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(get_width, &width));
-  EXPECT_EQ(view()->webview()->MainFrameWidget()->Size().width,
+  EXPECT_EQ(view()->GetWebView()->MainFrameWidget()->Size().width,
             width * device_scale);
 }
 
@@ -1304,7 +1305,7 @@
       static_cast<TestRenderFrame*>(view()->GetMainRenderFrame());
   main_frame->Unload(kProxyRoutingId, true,
                      ReconstructReplicationStateForTesting(main_frame));
-  EXPECT_TRUE(view()->webview()->MainFrame()->IsWebRemoteFrame());
+  EXPECT_TRUE(view()->GetWebView()->MainFrame()->IsWebRemoteFrame());
 }
 
 // Test that our IME backend sends a notification message when the input focus
@@ -2737,8 +2738,8 @@
       "}"
       "</style>");
 
-  EXPECT_EQ(1.f, view()->webview()->PageScaleFactor());
-  EXPECT_EQ(1.f, view()->webview()->MinimumPageScaleFactor());
+  EXPECT_EQ(1.f, view()->GetWebView()->PageScaleFactor());
+  EXPECT_EQ(1.f, view()->GetWebView()->MinimumPageScaleFactor());
 
   WebPreferences prefs;
   prefs.shrinks_viewport_contents_to_fit = true;
@@ -2746,9 +2747,9 @@
   prefs.default_maximum_page_scale_factor = 5.5f;
   view()->SetWebkitPreferences(prefs);
 
-  EXPECT_EQ(1.f, view()->webview()->PageScaleFactor());
-  EXPECT_EQ(1.f, view()->webview()->MinimumPageScaleFactor());
-  EXPECT_EQ(5.5f, view()->webview()->MaximumPageScaleFactor());
+  EXPECT_EQ(1.f, view()->GetWebView()->PageScaleFactor());
+  EXPECT_EQ(1.f, view()->GetWebView()->MinimumPageScaleFactor());
+  EXPECT_EQ(5.5f, view()->GetWebView()->MaximumPageScaleFactor());
 }
 
 TEST_F(RenderViewImplDisableZoomForDSFTest,
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index f935157..1b73997 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -63,7 +63,6 @@
 #include "content/public/renderer/render_view_observer.h"
 #include "content/public/renderer/render_view_visitor.h"
 #include "content/public/renderer/window_features_converter.h"
-#include "content/renderer/compositor/layer_tree_view.h"
 #include "content/renderer/drop_data_builder.h"
 #include "content/renderer/history_serialization.h"
 #include "content/renderer/ime_event_guard.h"
@@ -449,17 +448,17 @@
                              /*compositing_enabled=*/true,
                              opener_frame ? opener_frame->View() : nullptr);
 
-  g_view_map.Get().insert(std::make_pair(webview(), this));
+  g_view_map.Get().insert(std::make_pair(GetWebView(), this));
   g_routing_id_view_map.Get().insert(std::make_pair(GetRoutingID(), this));
 
   bool local_main_frame = params->main_frame_routing_id != MSG_ROUTING_NONE;
 
   // TODO(danakj): Put this in with making the RenderFrame? Does order matter?
   if (local_main_frame)
-    webview()->SetDisplayMode(params->visual_properties.display_mode);
+    GetWebView()->SetDisplayMode(params->visual_properties.display_mode);
 
-  ApplyWebPreferences(webkit_preferences_, webview());
-  ApplyCommandLineToSettings(webview()->GetSettings());
+  ApplyWebPreferences(webkit_preferences_, GetWebView());
+  ApplyCommandLineToSettings(GetWebView()->GetSettings());
 
   if (local_main_frame) {
     main_render_frame_ = RenderFrameImpl::CreateMainFrame(
@@ -473,7 +472,7 @@
 
   // TODO(davidben): Move this state from Blink into content.
   if (params->window_was_created_with_opener)
-    webview()->SetOpenedByDOM();
+    GetWebView()->SetOpenedByDOM();
 
   OnSetRendererPrefs(*params->renderer_preferences);
 
@@ -484,7 +483,7 @@
   // We pass this state to Page, but it's only used by the main frame in the
   // page.
   if (params->inside_portal)
-    webview()->SetInsidePortal(true);
+    GetWebView()->SetInsidePortal(true);
 
 #if defined(OS_ANDROID)
   // TODO(sgurun): crbug.com/325351 Needed only for android webview's deprecated
@@ -1018,19 +1017,11 @@
   observers_.RemoveObserver(observer);
 }
 
-blink::WebView* RenderViewImpl::webview() {
-  return webview_;
-}
-
-const blink::WebView* RenderViewImpl::webview() const {
-  return webview_;
-}
-
 // RenderWidgetOwnerDelegate -----------------------------------------
 
 void RenderViewImpl::SetActiveForWidget(bool active) {
-  if (webview())
-    webview()->SetIsActive(active);
+  if (GetWebView())
+    GetWebView()->SetIsActive(active);
 }
 
 bool RenderViewImpl::SupportsMultipleWindowsForWidget() {
@@ -1048,16 +1039,16 @@
 
 void RenderViewImpl::ApplyNewDisplayModeForWidget(
     blink::mojom::DisplayMode new_display_mode) {
-  webview()->SetDisplayMode(new_display_mode);
+  GetWebView()->SetDisplayMode(new_display_mode);
 }
 
 void RenderViewImpl::ApplyAutoResizeLimitsForWidget(const gfx::Size& min_size,
                                                     const gfx::Size& max_size) {
-  webview()->EnableAutoResizeMode(min_size, max_size);
+  GetWebView()->EnableAutoResizeMode(min_size, max_size);
 }
 
 void RenderViewImpl::DisableAutoResizeForWidget() {
-  webview()->DisableAutoResizeMode();
+  GetWebView()->DisableAutoResizeMode();
 }
 
 void RenderViewImpl::ScrollFocusedNodeIntoViewForWidget() {
@@ -1073,7 +1064,7 @@
   // WebLocalFrame.
   // TODO(ajwong): Can this be removed and just check |delegate_| in
   // RenderWidget instead?
-  CHECK(webview()->MainFrame()->IsWebLocalFrame());
+  CHECK(GetWebView()->MainFrame()->IsWebLocalFrame());
 }
 
 void RenderViewImpl::DidCommitCompositorFrameForWidget() {
@@ -1092,16 +1083,16 @@
 void RenderViewImpl::ResizeWebWidgetForWidget(
     const gfx::Size& widget_size,
     cc::BrowserControlsParams browser_controls_params) {
-  webview()->ResizeWithBrowserControls(widget_size, browser_controls_params);
+  GetWebView()->ResizeWithBrowserControls(widget_size, browser_controls_params);
 }
 
 void RenderViewImpl::SetScreenMetricsEmulationParametersForWidget(
     bool enabled,
     const blink::WebDeviceEmulationParams& params) {
   if (enabled)
-    webview()->EnableDeviceEmulation(params);
+    GetWebView()->EnableDeviceEmulation(params);
   else
-    webview()->DisableDeviceEmulation();
+    GetWebView()->DisableDeviceEmulation();
 }
 
 // IPC message handlers -----------------------------------------
@@ -1126,13 +1117,13 @@
 }
 
 void RenderViewImpl::OnSetInitialFocus(bool reverse) {
-  if (!webview())
+  if (!GetWebView())
     return;
-  webview()->SetInitialFocus(reverse);
+  GetWebView()->SetInitialFocus(reverse);
 }
 
 void RenderViewImpl::OnAudioStateChanged(bool is_audio_playing) {
-  webview()->AudioStateChanged(is_audio_playing);
+  GetWebView()->AudioStateChanged(is_audio_playing);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -1166,7 +1157,7 @@
 // IPC::Listener -------------------------------------------------------------
 
 bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) {
-  WebFrame* main_frame = webview() ? webview()->MainFrame() : nullptr;
+  WebFrame* main_frame = GetWebView() ? GetWebView()->MainFrame() : nullptr;
   if (main_frame) {
     GURL active_url;
     if (main_frame->IsWebLocalFrame())
@@ -1285,7 +1276,7 @@
   // used much in Blink, except to enable web testing... perhaps this should
   // be checked directly in the browser side.
   if (status == mojom::CreateNewWindowStatus::kReuse)
-    return webview();
+    return GetWebView();
 
   DCHECK(reply);
   DCHECK_NE(MSG_ROUTING_NONE, reply->route_id);
@@ -1347,7 +1338,7 @@
       compositor_deps_, std::move(view_params), std::move(show_callback),
       creator->GetTaskRunner(blink::TaskType::kInternalDefault));
 
-  return view->webview();
+  return view->GetWebView();
 }
 
 blink::WebPagePopup* RenderViewImpl::CreatePopup(
@@ -1440,31 +1431,31 @@
   // If we change the zoom level for the view, make sure any subsequent subframe
   // loads reflect the current zoom level.
   page_zoom_level_ = zoom_level;
-  webview()->SetZoomLevel(zoom_level);
+  GetWebView()->SetZoomLevel(zoom_level);
   for (auto& observer : observers_)
     observer.OnZoomLevelChanged();
   return true;
 }
 
 void RenderViewImpl::SetPreferCompositingToLCDTextEnabled(bool prefer) {
-  webview()->GetSettings()->SetPreferCompositingToLCDTextEnabled(prefer);
+  GetWebView()->GetSettings()->SetPreferCompositingToLCDTextEnabled(prefer);
 }
 
 void RenderViewImpl::SetDeviceScaleFactor(bool use_zoom_for_dsf,
                                           float device_scale_factor) {
   if (use_zoom_for_dsf)
-    webview()->SetZoomFactorForDeviceScaleFactor(device_scale_factor);
+    GetWebView()->SetZoomFactorForDeviceScaleFactor(device_scale_factor);
   else
-    webview()->SetDeviceScaleFactor(device_scale_factor);
+    GetWebView()->SetDeviceScaleFactor(device_scale_factor);
 }
 
 void RenderViewImpl::PropagatePageZoomToNewlyAttachedFrame(
     bool use_zoom_for_dsf,
     float device_scale_factor) {
   if (use_zoom_for_dsf)
-    webview()->SetZoomFactorForDeviceScaleFactor(device_scale_factor);
+    GetWebView()->SetZoomFactorForDeviceScaleFactor(device_scale_factor);
   else
-    webview()->SetZoomLevel(page_zoom_level_);
+    GetWebView()->SetZoomLevel(page_zoom_level_);
 }
 
 void RenderViewImpl::SetValidationMessageDirection(
@@ -1648,14 +1639,14 @@
   // We don't always want to send the change messages over IPC, only if we've
   // been put in that mode by getting a |ViewMsg_EnablePreferredSizeChangedMode|
   // message.
-  if (!send_preferred_size_changes_ || !webview() || !main_render_frame_)
+  if (!send_preferred_size_changes_ || !GetWebView() || !main_render_frame_)
     return;
 
   if (!needs_preferred_size_update_)
     return;
   needs_preferred_size_update_ = false;
 
-  blink::WebSize web_size = webview()->ContentsPreferredMinimumSize();
+  blink::WebSize web_size = GetWebView()->ContentsPreferredMinimumSize();
   blink::WebRect web_rect(0, 0, web_size.width, web_size.height);
   main_render_frame_->GetLocalRootRenderWidget()->ConvertViewportToWindow(
       &web_rect);
@@ -1701,7 +1692,7 @@
 }
 
 blink::WebView* RenderViewImpl::GetWebView() {
-  return webview();
+  return webview_;
 }
 
 bool RenderViewImpl::GetContentStateImmediately() {
@@ -1711,7 +1702,7 @@
 void RenderViewImpl::ApplyPageVisibilityState(
     PageVisibilityState visibility_state,
     bool initial_setting) {
-  webview()->SetVisibilityState(visibility_state, initial_setting);
+  GetWebView()->SetVisibilityState(visibility_state, initial_setting);
   for (auto& observer : observers_)
     observer.OnPageVisibilityChanged(visibility_state);
   // Note: RenderWidget visibility is separately set from the IPC handlers, and
@@ -1720,7 +1711,7 @@
 
 void RenderViewImpl::OnUpdateWebPreferences(const WebPreferences& prefs) {
   webkit_preferences_ = prefs;
-  ApplyWebPreferences(webkit_preferences_, webview());
+  ApplyWebPreferences(webkit_preferences_, GetWebView());
 }
 
 void RenderViewImpl::OnEnablePreferredSizeChangedMode() {
@@ -1728,15 +1719,15 @@
     return;
   send_preferred_size_changes_ = true;
 
-  if (!webview())
+  if (!GetWebView())
     return;
 
   needs_preferred_size_update_ = true;
 
   // We need to ensure |UpdatePreferredSize| gets called. If a layout is needed,
   // force an update here which will call |DidUpdateMainFrameLayout|.
-  if (webview()->MainFrameWidget()) {
-    webview()->MainFrameWidget()->UpdateLifecycle(
+  if (GetWebView()->MainFrameWidget()) {
+    GetWebView()->MainFrameWidget()->UpdateLifecycle(
         WebWidget::LifecycleUpdate::kLayout,
         blink::DocumentUpdateReason::kSizeChange);
   }
@@ -1771,8 +1762,8 @@
                               renderer_prefs.active_selection_fg_color,
                               renderer_prefs.inactive_selection_bg_color,
                               renderer_prefs.inactive_selection_fg_color);
-    if (webview() && webview()->MainFrameWidget())
-      webview()->MainFrameWidget()->ThemeChanged();
+    if (GetWebView() && GetWebView()->MainFrameWidget())
+      GetWebView()->MainFrameWidget()->ThemeChanged();
   }
 #endif
 
@@ -1781,15 +1772,15 @@
     blink::SetFocusRingColor(renderer_prefs.focus_ring_color);
   }
 
-  if (webview() &&
+  if (GetWebView() &&
       old_accept_languages != renderer_preferences_.accept_languages) {
-    webview()->AcceptLanguagesChanged();
+    GetWebView()->AcceptLanguagesChanged();
   }
 }
 
 void RenderViewImpl::OnMoveOrResizeStarted() {
-  if (webview())
-    webview()->CancelPagePopup();
+  if (GetWebView())
+    GetWebView()->CancelPagePopup();
 }
 
 void RenderViewImpl::OnPageVisibilityChanged(
@@ -1812,7 +1803,7 @@
   // RenderWidget tree like other VisualProperties do, in order to set the
   // value in each WebView holds a part of the local frame tree.
   if (!main_render_frame_)
-    webview()->Resize(viewport_size_for_blink);
+    GetWebView()->Resize(viewport_size_for_blink);
 }
 
 void RenderViewImpl::ResizeVisualViewportForWidget(
@@ -1822,23 +1813,23 @@
   // here via RenderViewImpl::OnUpdateLocalMainFramePageVisualProperties(). In
   // that case, WebViewImpl will need to implement its Size() function based on
   // something other than the widget size.
-  webview()->ResizeVisualViewport(scaled_viewport_size);
+  GetWebView()->ResizeVisualViewport(scaled_viewport_size);
 }
 
 void RenderViewImpl::SetPageFrozen(bool frozen) {
-  if (webview())
-    webview()->SetPageFrozen(frozen);
+  if (GetWebView())
+    GetWebView()->SetPageFrozen(frozen);
 }
 
 void RenderViewImpl::PutPageIntoBackForwardCache() {
-  if (webview())
-    webview()->PutPageIntoBackForwardCache();
+  if (GetWebView())
+    GetWebView()->PutPageIntoBackForwardCache();
 }
 
 void RenderViewImpl::RestorePageFromBackForwardCache(
     base::TimeTicks navigation_start) {
-  if (webview())
-    webview()->RestorePageFromBackForwardCache(navigation_start);
+  if (GetWebView())
+    GetWebView()->RestorePageFromBackForwardCache(navigation_start);
 }
 
 // This function receives TextAutosizerPageInfo from the main frame's renderer
@@ -1851,17 +1842,17 @@
   // corresponds to a local main frame. Since a local main frame will generate
   // these values for itself, we shouldn't override them with values from
   // another renderer.
-  if (!webview()->MainFrame()->IsWebLocalFrame())
-    webview()->SetTextAutosizePageInfo(page_info);
+  if (!GetWebView()->MainFrame()->IsWebLocalFrame())
+    GetWebView()->SetTextAutosizePageInfo(page_info);
 }
 
 void RenderViewImpl::OnSetInsidePortal(bool inside_portal) {
-  webview()->SetInsidePortal(inside_portal);
+  GetWebView()->SetInsidePortal(inside_portal);
 }
 
 void RenderViewImpl::DidUpdateTextAutosizerPageInfo(
     const blink::WebTextAutosizerPageInfo& page_info) {
-  DCHECK(webview()->MainFrame()->IsWebLocalFrame());
+  DCHECK(GetWebView()->MainFrame()->IsWebLocalFrame());
   Send(new ViewHostMsg_NotifyTextAutosizerPageInfoChangedInLocalMainFrame(
       GetRoutingID(), page_info));
 }
@@ -1935,24 +1926,24 @@
 void RenderViewImpl::OnAnimateDoubleTapZoomInMainFrame(
     const gfx::Point& point,
     const blink::WebRect& bound) {
-  webview()->AnimateDoubleTapZoom(point, bound);
+  GetWebView()->AnimateDoubleTapZoom(point, bound);
 }
 
 void RenderViewImpl::OnZoomToFindInPageRect(
     const blink::WebRect& rect_to_zoom) {
-  webview()->ZoomToFindInPageRect(rect_to_zoom);
+  GetWebView()->ZoomToFindInPageRect(rect_to_zoom);
 }
 
 void RenderViewImpl::OnSetBackgroundOpaque(bool opaque) {
-  if (!webview())
+  if (!GetWebView())
     return;
 
   if (opaque) {
-    webview()->ClearBaseBackgroundColorOverride();
-    webview()->ClearBackgroundColorOverride();
+    GetWebView()->ClearBaseBackgroundColorOverride();
+    GetWebView()->ClearBackgroundColorOverride();
   } else {
-    webview()->SetBaseBackgroundColorOverride(SK_ColorTRANSPARENT);
-    webview()->SetBackgroundColorOverride(SK_ColorTRANSPARENT);
+    GetWebView()->SetBaseBackgroundColorOverride(SK_ColorTRANSPARENT);
+    GetWebView()->SetBackgroundColorOverride(SK_ColorTRANSPARENT);
   }
 }
 
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index 22ff2ca..9c42e83 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -124,10 +124,6 @@
   // Returns the RenderViewImpl for the given routing ID.
   static RenderViewImpl* FromRoutingID(int routing_id);
 
-  // May return NULL when the view is closing.
-  blink::WebView* webview();
-  const blink::WebView* webview() const;
-
   // When true, a hint to all RenderWidgets that they will never be
   // user-visible and thus never need to produce pixels for display. This is
   // separate from page visibility, as background pages can be marked visible in
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index c325637a..f2aeb23 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -1036,10 +1036,6 @@
   return input_handler_->GetFrameSinkIdAtPoint(point, local_point);
 }
 
-bool RenderWidget::HasPendingPageScaleAnimation() const {
-  return layer_tree_host_->HasPendingPageScaleAnimation();
-}
-
 bool RenderWidget::HandleInputEvent(
     const blink::WebCoalescedInputEvent& input_event,
     const ui::LatencyInfo& latency_info,
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index 3b6608f..c398cde 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -570,9 +570,6 @@
     return last_capture_sequence_number_;
   }
 
-  // Returns true if a page scale animation is active.
-  bool HasPendingPageScaleAnimation() const;
-
   // MainThreadEventQueueClient overrides.
   bool HandleInputEvent(const blink::WebCoalescedInputEvent& input_event,
                         const ui::LatencyInfo& latency_info,
diff --git a/content/renderer/render_widget_fullscreen_pepper.cc b/content/renderer/render_widget_fullscreen_pepper.cc
index fd88f94..cbdb2df 100644
--- a/content/renderer/render_widget_fullscreen_pepper.cc
+++ b/content/renderer/render_widget_fullscreen_pepper.cc
@@ -15,7 +15,6 @@
 #include "content/common/widget_messages.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/use_zoom_for_dsf_policy.h"
-#include "content/renderer/compositor/layer_tree_view.h"
 #include "content/renderer/pepper/pepper_plugin_instance_impl.h"
 #include "content/renderer/render_thread_impl.h"
 #include "gpu/ipc/client/gpu_channel_host.h"
diff --git a/content/shell/app/shell_main_delegate.cc b/content/shell/app/shell_main_delegate.cc
index 3fca3c28..b7ddbc7 100644
--- a/content/shell/app/shell_main_delegate.cc
+++ b/content/shell/app/shell_main_delegate.cc
@@ -260,8 +260,6 @@
                                    "MAP *.test. 127.0.0.1,"
                                    "MAP *.test 127.0.0.1");
 
-    command_line.AppendSwitch(switches::kEnableWebAuthTestingAPI);
-
     if (!command_line.HasSwitch(switches::kForceGpuRasterization) &&
         !command_line.HasSwitch(switches::kEnableGpuRasterization)) {
       command_line.AppendSwitch(switches::kDisableGpuRasterization);
diff --git a/content/shell/test_runner/accessibility_controller.cc b/content/shell/test_runner/accessibility_controller.cc
index 0c56252..6ad5b4b 100644
--- a/content/shell/test_runner/accessibility_controller.cc
+++ b/content/shell/test_runner/accessibility_controller.cc
@@ -292,7 +292,7 @@
 }
 
 blink::WebView* AccessibilityController::web_view() {
-  return web_view_test_proxy_->webview();
+  return web_view_test_proxy_->GetWebView();
 }
 
 blink::WebAXObject
diff --git a/content/shell/test_runner/event_sender.cc b/content/shell/test_runner/event_sender.cc
index eda52633..7a0e048 100644
--- a/content/shell/test_runner/event_sender.cc
+++ b/content/shell/test_runner/event_sender.cc
@@ -1824,7 +1824,7 @@
     content::RenderFrameImpl* main_frame = view_proxy->GetMainRenderFrame();
     if (main_frame) {
       main_frame->GetLocalRootRenderWidget()->SetZoomLevelForTesting(
-          view_proxy->webview()->ZoomLevel() + 1);
+          view_proxy->GetWebView()->ZoomLevel() + 1);
     }
   }
 }
@@ -1837,7 +1837,7 @@
     content::RenderFrameImpl* main_frame = view_proxy->GetMainRenderFrame();
     if (main_frame) {
       main_frame->GetLocalRootRenderWidget()->SetZoomLevelForTesting(
-          view_proxy->webview()->ZoomLevel() - 1);
+          view_proxy->GetWebView()->ZoomLevel() - 1);
     }
   }
 }
@@ -2855,11 +2855,11 @@
 }
 
 const blink::WebView* EventSender::view() const {
-  return web_widget_test_proxy_->GetWebViewTestProxy()->webview();
+  return web_widget_test_proxy_->GetWebViewTestProxy()->GetWebView();
 }
 
 blink::WebView* EventSender::view() {
-  return web_widget_test_proxy_->GetWebViewTestProxy()->webview();
+  return web_widget_test_proxy_->GetWebViewTestProxy()->GetWebView();
 }
 
 blink::WebWidget* EventSender::widget() {
diff --git a/content/shell/test_runner/test_runner.cc b/content/shell/test_runner/test_runner.cc
index 2573345..8143419 100644
--- a/content/shell/test_runner/test_runner.cc
+++ b/content/shell/test_runner/test_runner.cc
@@ -1706,7 +1706,7 @@
 
     bool allowed = web_test_runtime_flags_.plugins_allowed();
     for (WebViewTestProxy* window : test_interfaces_->GetWindowList())
-      window->webview()->GetSettings()->SetPluginsEnabled(allowed);
+      window->GetWebView()->GetSettings()->SetPluginsEnabled(allowed);
   }
 }
 
@@ -2167,7 +2167,7 @@
   }
 
   for (WebViewTestProxy* window : test_interfaces_->GetWindowList()) {
-    blink::WebFrame* main_frame = window->webview()->MainFrame();
+    blink::WebFrame* main_frame = window->GetWebView()->MainFrame();
     // TODO(lukasza): Need to make this work for remote frames.
     if (main_frame->IsWebLocalFrame()) {
       bool screen_orientation_changed =
@@ -2264,7 +2264,7 @@
   OnWebTestRuntimeFlagsChanged();
 
   for (WebViewTestProxy* window : test_interfaces_->GetWindowList())
-    window->webview()->AcceptLanguagesChanged();
+    window->GetWebView()->AcceptLanguagesChanged();
 }
 
 void TestRunner::SetPluginsEnabled(bool enabled) {
@@ -2373,7 +2373,7 @@
   web_test_runtime_flags_.set_plugins_allowed(allowed);
 
   for (WebViewTestProxy* window : test_interfaces_->GetWindowList())
-    window->webview()->GetSettings()->SetPluginsEnabled(allowed);
+    window->GetWebView()->GetSettings()->SetPluginsEnabled(allowed);
 
   OnWebTestRuntimeFlagsChanged();
 }
diff --git a/content/shell/test_runner/test_runner_for_specific_view.cc b/content/shell/test_runner/test_runner_for_specific_view.cc
index 43bc1bd4..c22088e 100644
--- a/content/shell/test_runner/test_runner_for_specific_view.cc
+++ b/content/shell/test_runner/test_runner_for_specific_view.cc
@@ -740,7 +740,7 @@
 }
 
 blink::WebView* TestRunnerForSpecificView::web_view() {
-  return web_view_test_proxy_->webview();
+  return web_view_test_proxy_->GetWebView();
 }
 
 WebTestDelegate* TestRunnerForSpecificView::delegate() {
diff --git a/content/shell/test_runner/text_input_controller.cc b/content/shell/test_runner/text_input_controller.cc
index 5a7cbc0..21025fb 100644
--- a/content/shell/test_runner/text_input_controller.cc
+++ b/content/shell/test_runner/text_input_controller.cc
@@ -407,7 +407,7 @@
 }
 
 blink::WebView* TextInputController::view() {
-  return web_view_test_proxy_->webview();
+  return web_view_test_proxy_->GetWebView();
 }
 
 blink::WebInputMethodController*
diff --git a/content/shell/test_runner/web_test_interfaces.cc b/content/shell/test_runner/web_test_interfaces.cc
index 60514094..4816f67 100644
--- a/content/shell/test_runner/web_test_interfaces.cc
+++ b/content/shell/test_runner/web_test_interfaces.cc
@@ -63,7 +63,7 @@
 std::vector<blink::WebView*> WebTestInterfaces::GetWindowList() {
   std::vector<blink::WebView*> result;
   for (WebViewTestProxy* proxy : interfaces_->GetWindowList())
-    result.push_back(proxy->webview());
+    result.push_back(proxy->GetWebView());
   return result;
 }
 
diff --git a/content/shell/test_runner/web_view_test_proxy.cc b/content/shell/test_runner/web_view_test_proxy.cc
index 11524ac..951cf6a7 100644
--- a/content/shell/test_runner/web_view_test_proxy.cc
+++ b/content/shell/test_runner/web_view_test_proxy.cc
@@ -74,7 +74,7 @@
 }
 
 void WebViewTestProxy::DidFocus(blink::WebLocalFrame* calling_frame) {
-  GetTestRunner()->SetFocus(webview(), true);
+  GetTestRunner()->SetFocus(GetWebView(), true);
   RenderViewImpl::DidFocus(calling_frame);
 }
 
@@ -88,7 +88,7 @@
     widget_proxy->Reset();
   }
 
-  for (blink::WebFrame* frame = webview()->MainFrame(); frame;
+  for (blink::WebFrame* frame = GetWebView()->MainFrame(); frame;
        frame = frame->TraverseNext()) {
     if (frame->IsWebLocalFrame())
       delegate_->GetWebWidgetTestProxy(frame->ToWebLocalFrame())->Reset();
diff --git a/content/shell/test_runner/web_widget_test_proxy.cc b/content/shell/test_runner/web_widget_test_proxy.cc
index 20de762..301cfd5 100644
--- a/content/shell/test_runner/web_widget_test_proxy.cc
+++ b/content/shell/test_runner/web_widget_test_proxy.cc
@@ -221,7 +221,7 @@
   // WebView without a main frame, would have no opportunity to execute this
   // method call.
   if (delegate()) {
-    blink::WebView* view = GetWebViewTestProxy()->webview();
+    blink::WebView* view = GetWebViewTestProxy()->GetWebView();
     if (blink::WebPagePopup* popup = view->GetPagePopup()) {
       auto* popup_render_widget =
           static_cast<RenderWidget*>(popup->GetClientForTesting());
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 45bb8f3..08b8ac653 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1854,6 +1854,7 @@
     "../browser/webrtc/webrtc_internals_unittest.cc",
     "../browser/webui/web_ui_data_source_unittest.cc",
     "../browser/webui/web_ui_message_handler_unittest.cc",
+    "../browser/webui/web_ui_unittest.cc",
     "../browser/worker_host/dedicated_worker_service_impl_unittest.cc",
     "../browser/worker_host/mock_shared_worker.cc",
     "../browser/worker_host/mock_shared_worker.h",
diff --git a/content/test/data/accessibility/display-locking/activatable-activated.html b/content/test/data/accessibility/display-locking/activatable-activated.html
index e233996d..72eb623 100644
--- a/content/test/data/accessibility/display-locking/activatable-activated.html
+++ b/content/test/data/accessibility/display-locking/activatable-activated.html
@@ -2,10 +2,10 @@
 @BLINK-ALLOW:offscreen
 -->
 <div>
-  <div id="locked" rendersubtree="invisible skip-viewport-activation">
+  <div id="locked" style="render-subtree: invisible skip-viewport-activation">
     <div>child</div>
-    <div id="nested" rendersubtree="invisible skip-viewport-activation">nested locked element!</div>
-    <div id="nonActivatable" rendersubtree="invisible skip-activation">nested non activatable locked element</div>
+    <div id="nested" style="render-subtree: invisible skip-viewport-activation">nested locked element!</div>
+    <div id="nonActivatable" style="render-subtree: invisible skip-activation">nested non activatable locked element</div>
   </div>
 </div>
 
diff --git a/content/test/data/accessibility/display-locking/activatable.html b/content/test/data/accessibility/display-locking/activatable.html
index a868edf..448f53b 100644
--- a/content/test/data/accessibility/display-locking/activatable.html
+++ b/content/test/data/accessibility/display-locking/activatable.html
@@ -2,9 +2,9 @@
 @BLINK-ALLOW:offscreen
 -->
 <div>
-  <div id="locked" rendersubtree="invisible skip-viewport-activation">
+  <div id="locked" style="render-subtree: invisible skip-viewport-activation">
     <div>child</div>
-    <div id="nested" rendersubtree="invisible skip-viewport-activation">nested locked element!</div>
-    <div id="nonActivatable" rendersubtree="invisible skip-activation">nested non activatable locked element</div>
+    <div id="nested" style="render-subtree: invisible skip-viewport-activation">nested locked element!</div>
+    <div id="nonActivatable" style="render-subtree: invisible skip-activation">nested non activatable locked element</div>
   </div>
 </div>
diff --git a/content/test/data/accessibility/display-locking/all-committed.html b/content/test/data/accessibility/display-locking/all-committed.html
index 5ffc4cf..f4207ad9 100644
--- a/content/test/data/accessibility/display-locking/all-committed.html
+++ b/content/test/data/accessibility/display-locking/all-committed.html
@@ -2,10 +2,10 @@
 @BLINK-ALLOW:offscreen
 -->
 <div>
-  <div id="locked" rendersubtree="invisible skip-viewport-activation">
+  <div id="locked" style="render-subtree: invisible skip-viewport-activation">
     <div>child</div>
-    <div id="nested" rendersubtree="invisible skip-viewport-activation">nested locked element!</div>
-    <div id="nonActivatable" rendersubtree="invisible skip-activation">nested non activatable locked element</div>
+    <div id="nested" style="render-subtree: invisible skip-viewport-activation">nested locked element!</div>
+    <div id="nonActivatable" style="render-subtree: invisible skip-activation">nested non activatable locked element</div>
     <!--
       TODO(rakina): Make display:none, visibility:hidden, aria-hidden nodes
       in locked subtrees get ignored for accessibility/marked invisible.
@@ -21,7 +21,7 @@
 
 <script>
   // Force layout, then commit everything.
-  locked.removeAttribute("rendersubtree");
-  nested.removeAttribute("rendersubtree");
-  nonActivatable.removeAttribute("rendersubtree");
+  locked.removeAttribute("style");
+  nested.removeAttribute("style");
+  nonActivatable.removeAttribute("style");
 </script>
diff --git a/content/test/data/accessibility/display-locking/all.html b/content/test/data/accessibility/display-locking/all.html
index fbdfd07..4095fe6 100644
--- a/content/test/data/accessibility/display-locking/all.html
+++ b/content/test/data/accessibility/display-locking/all.html
@@ -2,10 +2,10 @@
 @BLINK-ALLOW:offscreen
 -->
 <div>
-  <div id="locked" rendersubtree="invisible skip-viewport-activation">
+  <div id="locked" style="render-subtree: invisible skip-viewport-activation">
     <div>child</div>
-    <div id="nested" rendersubtree="invisible skip-viewport-activation">nested locked element!</div>
-    <div id="nonActivatable" rendersubtree="invisible skip-activation">nested non activatable locked element</div>
+    <div id="nested" style="render-subtree: invisible skip-viewport-activation">nested locked element!</div>
+    <div id="nonActivatable" style="render-subtree: invisible skip-activation">nested non activatable locked element</div>
     <!--
       TODO(rakina): Make display:none, visibility:hidden, aria-hidden nodes
       in locked subtrees get ignored for accessibility/marked invisible.
diff --git a/content/test/data/accessibility/display-locking/non-activatable.html b/content/test/data/accessibility/display-locking/non-activatable.html
index 8597805a..482e48e 100644
--- a/content/test/data/accessibility/display-locking/non-activatable.html
+++ b/content/test/data/accessibility/display-locking/non-activatable.html
@@ -2,9 +2,9 @@
 @BLINK-ALLOW:offscreen
 -->
 <div>
-  <div id="locked" rendersubtree="invisible skip-activation">
+  <div id="locked" style="render-subtree: invisible skip-activation">
     <div>child</div>
-    <div id="nested" rendersubtree="invisible skip-activation">nested locked element!</div>
-    <div id="activatable" rendersubtree="invisible skip-viewport-activation">activatable locked element</div>
+    <div id="nested" style="render-subtree: invisible skip-activation">nested locked element!</div>
+    <div id="activatable" style="render-subtree: invisible skip-viewport-activation">activatable locked element</div>
   </div>
 </div>
diff --git a/content/test/test_render_frame_host.cc b/content/test/test_render_frame_host.cc
index 3fc0afe6..2db78c1 100644
--- a/content/test/test_render_frame_host.cc
+++ b/content/test/test_render_frame_host.cc
@@ -38,7 +38,6 @@
 #include "third_party/blink/public/common/frame/frame_policy.h"
 #include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom.h"
 #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom.h"
 #include "third_party/blink/public/platform/web_mixed_content_context_type.h"
 #include "third_party/blink/public/web/web_tree_scope_type.h"
 #include "ui/base/page_transition_types.h"
@@ -359,7 +358,7 @@
 }
 
 void TestRenderFrameHost::DidEnforceInsecureRequestPolicy(
-    blink::mojom::InsecureRequestPolicy policy) {
+    blink::WebInsecureRequestPolicy policy) {
   EnforceInsecureRequestPolicy(policy);
 }
 
diff --git a/content/test/test_render_frame_host.h b/content/test/test_render_frame_host.h
index 4bf93a8..a920a5c 100644
--- a/content/test/test_render_frame_host.h
+++ b/content/test/test_render_frame_host.h
@@ -24,7 +24,6 @@
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "third_party/blink/public/mojom/bluetooth/web_bluetooth.mojom-forward.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-forward.h"
 #include "ui/base/page_transition_types.h"
 
 namespace net {
@@ -121,8 +120,7 @@
 
   void DidChangeOpener(int opener_routing_id);
 
-  void DidEnforceInsecureRequestPolicy(
-      blink::mojom::InsecureRequestPolicy policy);
+  void DidEnforceInsecureRequestPolicy(blink::WebInsecureRequestPolicy policy);
 
   // If set, navigations will appear to have cleared the history list in the
   // RenderFrame
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc
index a3185c6..511416f3 100644
--- a/content/test/test_web_contents.cc
+++ b/content/test/test_web_contents.cc
@@ -30,7 +30,6 @@
 #include "content/public/test/mock_render_process_host.h"
 #include "content/public/test/navigation_simulator.h"
 #include "content/test/test_render_view_host.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom.h"
 #include "ui/base/page_transition_types.h"
 
 namespace content {
@@ -185,8 +184,7 @@
   params.is_overriding_user_agent = false;
   params.history_list_was_cleared = false;
   params.origin = url::Origin::Create(url);
-  params.insecure_request_policy =
-      blink::mojom::InsecureRequestPolicy::kLeaveInsecureRequestsAlone;
+  params.insecure_request_policy = blink::kLeaveInsecureRequestsAlone;
   params.has_potentially_trustworthy_unique_origin = false;
 
   rfh->SendNavigateWithParams(&params, was_within_same_document);
diff --git a/content/test/web_test_support.cc b/content/test/web_test_support.cc
index 0566c922..9a18bdee 100644
--- a/content/test/web_test_support.cc
+++ b/content/test/web_test_support.cc
@@ -241,7 +241,7 @@
   // main frame is remote, and doesn't have a corresponding RenderWidget.
   // Currently none of those tests are run out of headless mode.
   blink::WebFrame* frame =
-      web_widget_test_proxy->GetWebViewTestProxy()->webview()->MainFrame();
+      web_widget_test_proxy->GetWebViewTestProxy()->GetWebView()->MainFrame();
   if (frame->IsWebLocalFrame()) {
     test_runner::WebWidgetTestProxy* root_widget =
         GetWebWidgetTestProxy(frame->ToWebLocalFrame());
diff --git a/device/fido/OWNERS b/device/fido/OWNERS
index 3dacbaf..6a9c2bae 100644
--- a/device/fido/OWNERS
+++ b/device/fido/OWNERS
@@ -1,29 +1,28 @@
-# Webauthn OWNERS
+# WebAuthn OWNERS.
+#
+# Any non-emeriti are reasonable reviewers for WebAuthn-related code. Some
+# people are more familiar with certain areas of the code so, if you spot that
+# your area of alteration is listed, you should prefer to select that person.
 
-# General, esp chrome/ UI and Android integration.
-kpaulhamus@chromium.org
-
-# TouchID, Windows Hello.
+# esp TouchID, Windows Hello.
 martinkr@google.com
 # (Secondary email; prefer google.com address.)
 martinkr@chromium.org
 
-# Attestation and legacy U2F implementation.
+# esp attestation and legacy U2F implementation.
 agl@chromium.org
 
-# Bluetooth.
+# esp Bluetooth.
 kenrb@chromium.org
 
-# chrome/ UI and VirtualAuthenticator environment.
+# esp chrome/ UI and VirtualAuthenticator environment.
 nsatragno@chromium.org
 
+
 # Emeriti; for occasional reviews
-# esp. view & frame lifetimes
-engedy@chromium.org
-# Bluetooth
-jdoerrie@chromium.org
-# CTAP2 implementation
-hongjunchoi@chromium.org
+
+# General, esp chrome/ UI and Android integration.
+kpaulhamus@chromium.org
 
 # TEAM: identity-dev@chromium.org
 # COMPONENT: Blink>WebAuthentication
diff --git a/device/fido/fido_constants.h b/device/fido/fido_constants.h
index e87db48..78c0c3f1 100644
--- a/device/fido/fido_constants.h
+++ b/device/fido/fido_constants.h
@@ -117,7 +117,7 @@
   kCtap2ErrVendorLast = 0xFF
 };
 
-constexpr std::array<CtapDeviceResponseCode, 51> GetCtapResponseCodeList() {
+constexpr std::array<CtapDeviceResponseCode, 49> GetCtapResponseCodeList() {
   return {CtapDeviceResponseCode::kSuccess,
           CtapDeviceResponseCode::kCtap1ErrInvalidCommand,
           CtapDeviceResponseCode::kCtap1ErrInvalidParameter,
@@ -160,6 +160,7 @@
           CtapDeviceResponseCode::kCtap2ErrPinPolicyViolation,
           CtapDeviceResponseCode::kCtap2ErrPinTokenExpired,
           CtapDeviceResponseCode::kCtap2ErrRequestTooLarge,
+          CtapDeviceResponseCode::kCtap2ErrUvBlocked,
           CtapDeviceResponseCode::kCtap2ErrOther,
           CtapDeviceResponseCode::kCtap2ErrSpecLast,
           CtapDeviceResponseCode::kCtap2ErrExtensionFirst,
diff --git a/gpu/command_buffer/service/shared_image_factory.cc b/gpu/command_buffer/service/shared_image_factory.cc
index 76dc5afb..1e052def2 100644
--- a/gpu/command_buffer/service/shared_image_factory.cc
+++ b/gpu/command_buffer/service/shared_image_factory.cc
@@ -9,6 +9,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/trace_event/memory_dump_manager.h"
 #include "build/build_config.h"
+#include "components/viz/common/gpu/vulkan_context_provider.h"
 #include "components/viz/common/resources/resource_format_utils.h"
 #include "gpu/command_buffer/common/gpu_memory_buffer_support.h"
 #include "gpu/command_buffer/common/shared_image_trace_utils.h"
@@ -32,6 +33,7 @@
 #elif defined(OS_ANDROID) && BUILDFLAG(ENABLE_VULKAN)
 #include "gpu/command_buffer/service/external_vk_image_factory.h"
 #include "gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.h"
+#include "gpu/vulkan/vulkan_device_queue.h"
 #elif defined(OS_MACOSX)
 #include "gpu/command_buffer/service/shared_image_backing_factory_iosurface.h"
 #elif defined(OS_CHROMEOS)
@@ -103,9 +105,19 @@
   if (using_vulkan_) {
     external_vk_image_factory_ =
         std::make_unique<ExternalVkImageFactory>(context_state);
+    const auto& enabled_extensions = context_state->vk_context_provider()
+                                         ->GetDeviceQueue()
+                                         ->enabled_extensions();
+    if (gfx::HasExtension(
+            enabled_extensions,
+            VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) {
+      interop_backing_factory_ = std::make_unique<SharedImageBackingFactoryAHB>(
+          workarounds, gpu_feature_info);
+    }
+  } else {
+    interop_backing_factory_ = std::make_unique<SharedImageBackingFactoryAHB>(
+        workarounds, gpu_feature_info);
   }
-  interop_backing_factory_ = std::make_unique<SharedImageBackingFactoryAHB>(
-      workarounds, gpu_feature_info);
 #elif defined(OS_MACOSX)
   // OSX
   DCHECK(!using_vulkan_);
@@ -414,10 +426,6 @@
     return wrapped_sk_image_factory_.get();
 
   if (using_interop_factory) {
-    LOG_IF(ERROR, !interop_backing_factory_)
-        << "Unable to create SharedImage backing: GL / Vulkan interoperability "
-           "is not supported on this platform";
-
     // TODO(crbug.com/969114): Not all shared image factory implementations
     // support concurrent read/write usage.
     if (usage & SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE) {
@@ -431,17 +439,21 @@
     // interop if the format is not supported by the AHB backing factory.
     auto* ahb_backing_factory = static_cast<SharedImageBackingFactoryAHB*>(
         interop_backing_factory_.get());
-    if (!ahb_backing_factory->IsFormatSupported(format) &&
-        external_vk_image_factory_) {
-      if (share_between_threads) {
-        LOG(FATAL) << "ExternalVkImageFactory currently do not support "
-                      "cross-thread usage.";
-      }
-      *allow_legacy_mailbox = false;
-      return external_vk_image_factory_.get();
+    if (ahb_backing_factory && ahb_backing_factory->IsFormatSupported(format))
+      return ahb_backing_factory;
+    if (share_between_threads) {
+      LOG(FATAL) << "ExternalVkImageFactory currently do not support "
+                    "cross-thread usage.";
     }
-#endif
+    *allow_legacy_mailbox = false;
+    return external_vk_image_factory_.get();
+#else   // defined(OS_ANDROID)
+    LOG_IF(ERROR, !interop_backing_factory_)
+        << "Unable to create SharedImage backing: GL / Vulkan interoperability "
+           "is not supported on this platform";
+
     return interop_backing_factory_.get();
+#endif  // !defined(OS_ANDROID)
   }
 
   return gl_backing_factory_.get();
diff --git a/gpu/ipc/service/gpu_init.cc b/gpu/ipc/service/gpu_init.cc
index 0a01ccb..f046b33 100644
--- a/gpu/ipc/service/gpu_init.cc
+++ b/gpu/ipc/service/gpu_init.cc
@@ -217,6 +217,12 @@
     // execute the pre-sandbox steps now.
     sandbox_helper_->PreSandboxStartup();
   }
+#else
+  // For some reasons MacOSX's VideoToolbox might crash when called after
+  // initializing GL, see crbug.com/1047643 and crbug.com/871280. On other
+  // operating systems like Windows and Android the pre-sandbox steps have
+  // always been executed before initializing GL so keep it this way.
+  sandbox_helper_->PreSandboxStartup();
 #endif
 
   // Start the GPU watchdog only after anything that is expected to be time
@@ -313,6 +319,7 @@
     }
   }
 
+#if defined(OS_LINUX)
   // The ContentSandboxHelper is currently the only one implementation of
   // gpu::GpuSandboxHelper and it has no dependency. Except on Linux where
   // VaapiWrapper checks the GL implementation to determine which display
@@ -329,6 +336,7 @@
     if (watchdog_thread_)
       watchdog_thread_->ResumeWatchdog();
   }
+#endif
 
   bool gl_disabled = gl::GetGLImplementation() == gl::kGLImplementationDisabled;
 
diff --git a/gpu/vulkan/android/vulkan_implementation_android.cc b/gpu/vulkan/android/vulkan_implementation_android.cc
index 39d666ff..f59c60c 100644
--- a/gpu/vulkan/android/vulkan_implementation_android.cc
+++ b/gpu/vulkan/android/vulkan_implementation_android.cc
@@ -121,6 +121,11 @@
 
 std::vector<const char*>
 VulkanImplementationAndroid::GetRequiredDeviceExtensions() {
+  return {};
+}
+
+std::vector<const char*>
+VulkanImplementationAndroid::GetOptionalDeviceExtensions() {
   // VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME also requires
   // VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME as per spec.
   return {VK_KHR_SWAPCHAIN_EXTENSION_NAME,
diff --git a/gpu/vulkan/android/vulkan_implementation_android.h b/gpu/vulkan/android/vulkan_implementation_android.h
index 2f141cf9..80d6510 100644
--- a/gpu/vulkan/android/vulkan_implementation_android.h
+++ b/gpu/vulkan/android/vulkan_implementation_android.h
@@ -31,6 +31,7 @@
       const std::vector<VkQueueFamilyProperties>& queue_family_properties,
       uint32_t queue_family_index) override;
   std::vector<const char*> GetRequiredDeviceExtensions() override;
+  std::vector<const char*> GetOptionalDeviceExtensions() override;
   VkFence CreateVkFenceForGpuFence(VkDevice vk_device) override;
   std::unique_ptr<gfx::GpuFence> ExportVkFenceToGpuFence(
       VkDevice vk_device,
diff --git a/gpu/vulkan/vulkan_device_queue.cc b/gpu/vulkan/vulkan_device_queue.cc
index 55266dac..d599cca 100644
--- a/gpu/vulkan/vulkan_device_queue.cc
+++ b/gpu/vulkan/vulkan_device_queue.cc
@@ -30,6 +30,7 @@
     uint32_t options,
     const VulkanInfo& info,
     const std::vector<const char*>& required_extensions,
+    const std::vector<const char*>& optional_extensions,
     bool allow_protected_memory,
     const GetPresentationSupportCallback& get_presentation_support) {
   DCHECK_EQ(static_cast<VkPhysicalDevice>(VK_NULL_HANDLE), vk_physical_device_);
@@ -102,9 +103,35 @@
 #endif  // DCHECK_IS_ON()
 
   std::vector<const char*> enabled_extensions;
-  enabled_extensions.insert(std::end(enabled_extensions),
-                            std::begin(required_extensions),
-                            std::end(required_extensions));
+  for (const char* extension : required_extensions) {
+    const auto it =
+        std::find_if(physical_device_info.extensions.begin(),
+                     physical_device_info.extensions.end(),
+                     [extension](const VkExtensionProperties& p) {
+                       return std::strcmp(extension, p.extensionName) == 0;
+                     });
+    if (it == physical_device_info.extensions.end()) {
+      DLOG(ERROR) << "Required Vulkan extension " << extension
+                  << " is not supported.";
+      return false;
+    }
+    enabled_extensions.push_back(extension);
+  }
+
+  for (const char* extension : optional_extensions) {
+    const auto it =
+        std::find_if(physical_device_info.extensions.begin(),
+                     physical_device_info.extensions.end(),
+                     [extension](const VkExtensionProperties& p) {
+                       return std::strcmp(extension, p.extensionName) == 0;
+                     });
+    if (it == physical_device_info.extensions.end()) {
+      DLOG(ERROR) << "Optional Vulkan extension " << extension
+                  << " is not supported.";
+    } else {
+      enabled_extensions.push_back(extension);
+    }
+  }
 
   uint32_t device_api_version = std::min(
       info.used_api_version, vk_physical_device_properties_.apiVersion);
@@ -185,7 +212,6 @@
   cleanup_helper_ = std::make_unique<VulkanFenceHelper>(this);
 
   allow_protected_memory_ = allow_protected_memory;
-
   return true;
 }
 
diff --git a/gpu/vulkan/vulkan_device_queue.h b/gpu/vulkan/vulkan_device_queue.h
index 3fbc53b2..7e76592 100644
--- a/gpu/vulkan/vulkan_device_queue.h
+++ b/gpu/vulkan/vulkan_device_queue.h
@@ -41,6 +41,7 @@
       uint32_t options,
       const VulkanInfo& info,
       const std::vector<const char*>& required_extensions,
+      const std::vector<const char*>& optional_extensions,
       bool allow_protected_memory,
       const GetPresentationSupportCallback& get_presentation_support);
 
diff --git a/gpu/vulkan/vulkan_implementation.cc b/gpu/vulkan/vulkan_implementation.cc
index 2731519..2dde313 100644
--- a/gpu/vulkan/vulkan_implementation.cc
+++ b/gpu/vulkan/vulkan_implementation.cc
@@ -31,9 +31,11 @@
       base::Unretained(vulkan_implementation));
   std::vector<const char*> required_extensions =
       vulkan_implementation->GetRequiredDeviceExtensions();
+  std::vector<const char*> optional_extensions =
+      vulkan_implementation->GetOptionalDeviceExtensions();
   if (!device_queue->Initialize(
           option, vulkan_implementation->GetVulkanInstance()->vulkan_info(),
-          std::move(required_extensions),
+          std::move(required_extensions), std::move(optional_extensions),
           vulkan_implementation->allow_protected_memory(), callback)) {
     device_queue->Destroy();
     return nullptr;
diff --git a/gpu/vulkan/vulkan_implementation.h b/gpu/vulkan/vulkan_implementation.h
index 3bf07c2..f26d6e7c 100644
--- a/gpu/vulkan/vulkan_implementation.h
+++ b/gpu/vulkan/vulkan_implementation.h
@@ -70,6 +70,7 @@
       uint32_t queue_family_index) = 0;
 
   virtual std::vector<const char*> GetRequiredDeviceExtensions() = 0;
+  virtual std::vector<const char*> GetOptionalDeviceExtensions() = 0;
 
   // Creates a VkFence that is exportable to a gfx::GpuFence.
   virtual VkFence CreateVkFenceForGpuFence(VkDevice vk_device) = 0;
diff --git a/gpu/vulkan/win32/vulkan_implementation_win32.cc b/gpu/vulkan/win32/vulkan_implementation_win32.cc
index 77b8f99cb..8340ae1 100644
--- a/gpu/vulkan/win32/vulkan_implementation_win32.cc
+++ b/gpu/vulkan/win32/vulkan_implementation_win32.cc
@@ -94,6 +94,11 @@
   return {VK_KHR_SWAPCHAIN_EXTENSION_NAME};
 }
 
+std::vector<const char*>
+VulkanImplementationWin32::GetOptionalDeviceExtensions() {
+  return {};
+}
+
 VkFence VulkanImplementationWin32::CreateVkFenceForGpuFence(
     VkDevice vk_device) {
   NOTREACHED();
diff --git a/gpu/vulkan/win32/vulkan_implementation_win32.h b/gpu/vulkan/win32/vulkan_implementation_win32.h
index 4d18e4f6..4c49602b 100644
--- a/gpu/vulkan/win32/vulkan_implementation_win32.h
+++ b/gpu/vulkan/win32/vulkan_implementation_win32.h
@@ -29,6 +29,7 @@
       const std::vector<VkQueueFamilyProperties>& queue_family_properties,
       uint32_t queue_family_index) override;
   std::vector<const char*> GetRequiredDeviceExtensions() override;
+  std::vector<const char*> GetOptionalDeviceExtensions() override;
   VkFence CreateVkFenceForGpuFence(VkDevice vk_device) override;
   std::unique_ptr<gfx::GpuFence> ExportVkFenceToGpuFence(
       VkDevice vk_device,
diff --git a/gpu/vulkan/x/vulkan_implementation_x11.cc b/gpu/vulkan/x/vulkan_implementation_x11.cc
index 4544bca..53ff9bd 100644
--- a/gpu/vulkan/x/vulkan_implementation_x11.cc
+++ b/gpu/vulkan/x/vulkan_implementation_x11.cc
@@ -129,6 +129,11 @@
   return extensions;
 }
 
+std::vector<const char*>
+VulkanImplementationX11::GetOptionalDeviceExtensions() {
+  return {};
+}
+
 VkFence VulkanImplementationX11::CreateVkFenceForGpuFence(VkDevice vk_device) {
   NOTREACHED();
   return VK_NULL_HANDLE;
diff --git a/gpu/vulkan/x/vulkan_implementation_x11.h b/gpu/vulkan/x/vulkan_implementation_x11.h
index 7a4b0c5..a1636fff 100644
--- a/gpu/vulkan/x/vulkan_implementation_x11.h
+++ b/gpu/vulkan/x/vulkan_implementation_x11.h
@@ -30,6 +30,7 @@
       const std::vector<VkQueueFamilyProperties>& queue_family_properties,
       uint32_t queue_family_index) override;
   std::vector<const char*> GetRequiredDeviceExtensions() override;
+  std::vector<const char*> GetOptionalDeviceExtensions() override;
   VkFence CreateVkFenceForGpuFence(VkDevice vk_device) override;
   std::unique_ptr<gfx::GpuFence> ExportVkFenceToGpuFence(
       VkDevice vk_device,
diff --git a/ios/chrome/app/resources/BUILD.gn b/ios/chrome/app/resources/BUILD.gn
index 6fbce16..24111cd 100644
--- a/ios/chrome/app/resources/BUILD.gn
+++ b/ios/chrome/app/resources/BUILD.gn
@@ -121,7 +121,7 @@
   public_deps = [
     ":launchscreen_app_logo",
     ":launchscreen_brand_name",
-    "//ios/chrome/common/colors/resources:background_color",
+    "//ios/chrome/common/ui/colors/resources:background_color",
   ]
 }
 
diff --git a/ios/chrome/browser/BUILD.gn b/ios/chrome/browser/BUILD.gn
index 68e9695..3274c4d 100644
--- a/ios/chrome/browser/BUILD.gn
+++ b/ios/chrome/browser/BUILD.gn
@@ -101,7 +101,6 @@
     "//ios/chrome/browser/drag_and_drop",
     "//ios/chrome/browser/find_in_page:feature_flags",
     "//ios/chrome/browser/itunes_urls",
-    "//ios/chrome/browser/policy",
     "//ios/chrome/browser/signin:feature_flags",
     "//ios/chrome/browser/ssl:feature_flags",
     "//ios/chrome/browser/sync/glue",
@@ -229,6 +228,7 @@
     "//ios/chrome/browser/metrics:expired_histograms_array",
     "//ios/chrome/browser/net",
     "//ios/chrome/browser/open_from_clipboard",
+    "//ios/chrome/browser/policy",
     "//ios/chrome/browser/prefs",
     "//ios/chrome/browser/prefs:browser_prefs",
     "//ios/chrome/browser/send_tab_to_self",
diff --git a/ios/chrome/browser/DEPS b/ios/chrome/browser/DEPS
index f06d218..26a01f4 100644
--- a/ios/chrome/browser/DEPS
+++ b/ios/chrome/browser/DEPS
@@ -56,6 +56,7 @@
   "+components/payments/mojom",
   "+components/policy/core/browser",
   "+components/policy/core/common",
+  "+components/policy/policy_constants.h",
   "+components/pref_registry",
   "+components/prefs",
   "+components/profile_metrics",
diff --git a/ios/chrome/browser/application_context.h b/ios/chrome/browser/application_context.h
index 256f9ae..fcbb243 100644
--- a/ios/chrome/browser/application_context.h
+++ b/ios/chrome/browser/application_context.h
@@ -64,6 +64,7 @@
 }
 
 class ApplicationContext;
+class BrowserPolicyConnectorIOS;
 class IOSChromeIOThread;
 class PrefService;
 
@@ -146,6 +147,10 @@
   // Returns the NetworkConnectionTracker instance for this ApplicationContext.
   virtual network::NetworkConnectionTracker* GetNetworkConnectionTracker() = 0;
 
+  // Returns the BrowserPolicyConnectorIOS that starts and manages the policy
+  // system. May be |nullptr| if policy is not enabled.
+  virtual BrowserPolicyConnectorIOS* GetBrowserPolicyConnector() = 0;
+
  protected:
   // Sets the global ApplicationContext instance.
   static void SetApplicationContext(ApplicationContext* context);
diff --git a/ios/chrome/browser/application_context_impl.cc b/ios/chrome/browser/application_context_impl.cc
index 13280d9c..d418a8d 100644
--- a/ios/chrome/browser/application_context_impl.cc
+++ b/ios/chrome/browser/application_context_impl.cc
@@ -50,6 +50,9 @@
 #include "ios/chrome/browser/history/history_service_factory.h"
 #include "ios/chrome/browser/ios_chrome_io_thread.h"
 #include "ios/chrome/browser/metrics/ios_chrome_metrics_services_manager_client.h"
+#include "ios/chrome/browser/policy/browser_policy_connector_ios.h"
+#include "ios/chrome/browser/policy/configuration_policy_handler_list_factory.h"
+#include "ios/chrome/browser/policy/policy_features.h"
 #include "ios/chrome/browser/pref_names.h"
 #include "ios/chrome/browser/prefs/browser_prefs.h"
 #include "ios/chrome/browser/prefs/ios_chrome_pref_service_factory.h"
@@ -66,6 +69,7 @@
 #include "services/network/network_change_manager.h"
 #include "services/network/public/cpp/network_connection_tracker.h"
 #include "services/network/public/mojom/network_service.mojom.h"
+#include "ui/base/resource/resource_bundle.h"
 
 namespace {
 
@@ -144,6 +148,13 @@
   // Need to clear browser states before the IO thread.
   chrome_browser_state_manager_.reset();
 
+  // The policy providers managed by |browser_policy_connector_| need to shut
+  // down while the IO threads is still alive. The monitoring framework owned by
+  // |browser_policy_connector_| relies on |gcm_driver_|, so this must be
+  // shutdown before |gcm_driver_| below.
+  if (browser_policy_connector_)
+    browser_policy_connector_->Shutdown();
+
   // The GCMDriver must shut down while the IO thread is still alive.
   if (gcm_driver_)
     gcm_driver_->Shutdown();
@@ -371,6 +382,22 @@
   return network_connection_tracker_.get();
 }
 
+BrowserPolicyConnectorIOS* ApplicationContextImpl::GetBrowserPolicyConnector() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+  if (IsEnterprisePolicyEnabled()) {
+    if (!browser_policy_connector_.get()) {
+      // Ensure that the ResourceBundle has already been initialized. If this
+      // DCHECK ever fails, a call to
+      // BrowserPolicyConnector::OnResourceBundleCreated() will need to be added
+      // later in the startup sequence, after the ResourceBundle is initialized.
+      DCHECK(ui::ResourceBundle::HasSharedInstance());
+      browser_policy_connector_ = std::make_unique<BrowserPolicyConnectorIOS>(
+          base::Bind(&BuildPolicyHandlerList));
+    }
+  }
+  return browser_policy_connector_.get();
+}
+
 void ApplicationContextImpl::SetApplicationLocale(const std::string& locale) {
   DCHECK(thread_checker_.CalledOnValidThread());
   application_locale_ = locale;
@@ -389,8 +416,9 @@
   // Register local state preferences.
   RegisterLocalStatePrefs(pref_registry.get());
 
-  local_state_ = ::CreateLocalState(
-      local_state_path, local_state_task_runner_.get(), pref_registry);
+  local_state_ =
+      ::CreateLocalState(local_state_path, local_state_task_runner_.get(),
+                         pref_registry, GetBrowserPolicyConnector());
   DCHECK(local_state_);
 
   sessions::SessionIdGenerator::GetInstance()->Init(local_state_.get());
diff --git a/ios/chrome/browser/application_context_impl.h b/ios/chrome/browser/application_context_impl.h
index e0a53cd..da0b548a 100644
--- a/ios/chrome/browser/application_context_impl.h
+++ b/ios/chrome/browser/application_context_impl.h
@@ -71,6 +71,7 @@
   component_updater::ComponentUpdateService* GetComponentUpdateService()
       override;
   network::NetworkConnectionTracker* GetNetworkConnectionTracker() override;
+  BrowserPolicyConnectorIOS* GetBrowserPolicyConnector() override;
 
  private:
   // Sets the locale used by the application.
@@ -91,6 +92,9 @@
   // |breadcrumb_manager_|. Will be null if breadcrumbs feature is not enabled.
   std::unique_ptr<ApplicationBreadcrumbsLogger> application_breadcrumbs_logger_;
 
+  // Must be destroyed after |local_state_|.
+  std::unique_ptr<BrowserPolicyConnectorIOS> browser_policy_connector_;
+
   std::unique_ptr<PrefService> local_state_;
   std::unique_ptr<net_log::NetExportFileWriter> net_export_file_writer_;
   std::unique_ptr<network_time::NetworkTimeTracker> network_time_tracker_;
diff --git a/ios/chrome/browser/autofill/BUILD.gn b/ios/chrome/browser/autofill/BUILD.gn
index a83d88e4..3c4f4d2 100644
--- a/ios/chrome/browser/autofill/BUILD.gn
+++ b/ios/chrome/browser/autofill/BUILD.gn
@@ -66,7 +66,7 @@
     "//ios/chrome/browser/ui/image_util",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/webdata_services",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/web/common",
     "//ios/web/public/deprecated",
diff --git a/ios/chrome/browser/autofill/form_suggestion_label.mm b/ios/chrome/browser/autofill/form_suggestion_label.mm
index dcc8ef3..b1ca7b3 100644
--- a/ios/chrome/browser/autofill/form_suggestion_label.mm
+++ b/ios/chrome/browser/autofill/form_suggestion_label.mm
@@ -19,7 +19,7 @@
 #import "ios/chrome/browser/autofill/form_suggestion_constants.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/overscroll_actions/BUILD.gn b/ios/chrome/browser/overscroll_actions/BUILD.gn
index 0115f0d2..c786e27 100644
--- a/ios/chrome/browser/overscroll_actions/BUILD.gn
+++ b/ios/chrome/browser/overscroll_actions/BUILD.gn
@@ -28,7 +28,7 @@
     "//base/test:test_support",
     "//ios/chrome/browser/browser_state:test_support",
     "//ios/chrome/browser/ui/overscroll_actions",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/test/fakes",
     "//ios/web/public",
     "//ios/web/public/test",
diff --git a/ios/chrome/browser/overscroll_actions/overscroll_actions_tab_helper_unittest.mm b/ios/chrome/browser/overscroll_actions/overscroll_actions_tab_helper_unittest.mm
index c27428b..f0dc1901 100644
--- a/ios/chrome/browser/overscroll_actions/overscroll_actions_tab_helper_unittest.mm
+++ b/ios/chrome/browser/overscroll_actions/overscroll_actions_tab_helper_unittest.mm
@@ -10,8 +10,8 @@
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
 #import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h"
 #import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/test/fakes/fake_overscroll_actions_controller_delegate.h"
 #import "ios/web/public/test/fakes/test_web_state.h"
 #include "ios/web/public/test/web_task_environment.h"
diff --git a/ios/chrome/browser/policy/BUILD.gn b/ios/chrome/browser/policy/BUILD.gn
index b3d17a42f1..9b44a61 100644
--- a/ios/chrome/browser/policy/BUILD.gn
+++ b/ios/chrome/browser/policy/BUILD.gn
@@ -6,15 +6,21 @@
   sources = [
     "browser_policy_connector_ios.h",
     "browser_policy_connector_ios.mm",
+    "configuration_policy_handler_list_factory.h",
+    "configuration_policy_handler_list_factory.mm",
   ]
 
   deps = [
     "//base",
+    "//components/policy:generated",
     "//components/policy/core/common",
     "//services/network/public/cpp",
   ]
 
-  public_deps = [ "//components/policy/core/browser" ]
+  public_deps = [
+    ":feature_flags",
+    "//components/policy/core/browser",
+  ]
 
   configs += [ "//build/config/compiler:enable_arc" ]
 }
diff --git a/ios/chrome/browser/policy/configuration_policy_handler_list_factory.h b/ios/chrome/browser/policy/configuration_policy_handler_list_factory.h
new file mode 100644
index 0000000..1c57406
--- /dev/null
+++ b/ios/chrome/browser/policy/configuration_policy_handler_list_factory.h
@@ -0,0 +1,19 @@
+// 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 IOS_CHROME_BROWSER_POLICY_CONFIGURATION_POLICY_HANDLER_LIST_FACTORY_H_
+#define IOS_CHROME_BROWSER_POLICY_CONFIGURATION_POLICY_HANDLER_LIST_FACTORY_H_
+
+#include <memory>
+
+namespace policy {
+class ConfigurationPolicyHandlerList;
+class Schema;
+}  // namespace policy
+
+// Builds a policy handler list.
+std::unique_ptr<policy::ConfigurationPolicyHandlerList> BuildPolicyHandlerList(
+    const policy::Schema& chrome_schema);
+
+#endif  // IOS_CHROME_BROWSER_POLICY_CONFIGURATION_POLICY_HANDLER_LIST_FACTORY_H_
diff --git a/ios/chrome/browser/policy/configuration_policy_handler_list_factory.mm b/ios/chrome/browser/policy/configuration_policy_handler_list_factory.mm
new file mode 100644
index 0000000..c642fb2
--- /dev/null
+++ b/ios/chrome/browser/policy/configuration_policy_handler_list_factory.mm
@@ -0,0 +1,34 @@
+// 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 "ios/chrome/browser/policy/configuration_policy_handler_list_factory.h"
+
+#include "base/bind.h"
+#include "base/logging.h"
+#include "components/policy/core/browser/configuration_policy_handler.h"
+#include "components/policy/core/browser/configuration_policy_handler_list.h"
+#include "components/policy/core/browser/configuration_policy_handler_parameters.h"
+#include "components/policy/policy_constants.h"
+#include "ios/chrome/browser/policy/policy_features.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+
+void PopulatePolicyHandlerParameters(
+    policy::PolicyHandlerParameters* parameters) {}
+
+}  // namespace
+
+std::unique_ptr<policy::ConfigurationPolicyHandlerList> BuildPolicyHandlerList(
+    const policy::Schema& chrome_schema) {
+  DCHECK(IsEnterprisePolicyEnabled());
+  std::unique_ptr<policy::ConfigurationPolicyHandlerList> handlers =
+      std::make_unique<policy::ConfigurationPolicyHandlerList>(
+          base::Bind(&PopulatePolicyHandlerParameters),
+          base::Bind(&policy::GetChromePolicyDetails));
+  return handlers;
+}
diff --git a/ios/chrome/browser/prefs/BUILD.gn b/ios/chrome/browser/prefs/BUILD.gn
index d5fd155..eeea0a1d 100644
--- a/ios/chrome/browser/prefs/BUILD.gn
+++ b/ios/chrome/browser/prefs/BUILD.gn
@@ -13,12 +13,14 @@
   deps = [
     "//base",
     "//components/content_settings/core/browser",
+    "//components/policy/core/browser",
     "//components/prefs",
     "//components/prefs/ios",
     "//components/proxy_config",
     "//components/search_engines",
     "//components/sync_preferences",
     "//ios/chrome/browser",
+    "//ios/chrome/browser/policy:feature_flags",
   ]
 }
 
diff --git a/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.cc b/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.cc
index 54794a09..ec1acb6 100644
--- a/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.cc
+++ b/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.cc
@@ -7,8 +7,12 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/feature_list.h"
+#include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
+#include "components/policy/core/browser/browser_policy_connector.h"
+#include "components/policy/core/common/policy_service.h"
 #include "components/prefs/json_pref_store.h"
 #include "components/prefs/persistent_pref_store.h"
 #include "components/prefs/pref_filter.h"
@@ -18,6 +22,7 @@
 #include "components/sync_preferences/pref_service_syncable.h"
 #include "components/sync_preferences/pref_service_syncable_factory.h"
 #include "ios/chrome/browser/application_context.h"
+#include "ios/chrome/browser/policy/policy_features.h"
 #include "ios/chrome/browser/prefs/ios_chrome_pref_model_associator_client.h"
 
 namespace {
@@ -34,7 +39,16 @@
 
 void PrepareFactory(sync_preferences::PrefServiceSyncableFactory* factory,
                     const base::FilePath& pref_filename,
-                    base::SequencedTaskRunner* pref_io_task_runner) {
+                    base::SequencedTaskRunner* pref_io_task_runner,
+                    policy::BrowserPolicyConnector* policy_connector) {
+  if (policy_connector) {
+    DCHECK(IsEnterprisePolicyEnabled());
+    policy::PolicyService* policy_service =
+        policy_connector->GetPolicyService();
+    factory->SetManagedPolicies(policy_service, policy_connector);
+    factory->SetRecommendedPolicies(policy_service, policy_connector);
+  }
+
   factory->set_user_prefs(base::MakeRefCounted<JsonPrefStore>(
       pref_filename, std::unique_ptr<PrefFilter>(), pref_io_task_runner));
 
@@ -48,9 +62,11 @@
 std::unique_ptr<PrefService> CreateLocalState(
     const base::FilePath& pref_filename,
     base::SequencedTaskRunner* pref_io_task_runner,
-    const scoped_refptr<PrefRegistry>& pref_registry) {
+    const scoped_refptr<PrefRegistry>& pref_registry,
+    policy::BrowserPolicyConnector* policy_connector) {
   sync_preferences::PrefServiceSyncableFactory factory;
-  PrepareFactory(&factory, pref_filename, pref_io_task_runner);
+  PrepareFactory(&factory, pref_filename, pref_io_task_runner,
+                 policy_connector);
   return factory.Create(pref_registry.get());
 }
 
@@ -65,7 +81,7 @@
   // on platforms that do not track preference modifications).
   sync_preferences::PrefServiceSyncableFactory factory;
   PrepareFactory(&factory, browser_state_path.Append(kPreferencesFilename),
-                 pref_io_task_runner);
+                 pref_io_task_runner, nullptr);
   std::unique_ptr<sync_preferences::PrefServiceSyncable> pref_service =
       factory.CreateSyncable(pref_registry.get());
   return pref_service;
diff --git a/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.h b/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.h
index 75fb938..6e936c4 100644
--- a/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.h
+++ b/ios/chrome/browser/prefs/ios_chrome_pref_service_factory.h
@@ -17,6 +17,10 @@
 class SequencedTaskRunner;
 }
 
+namespace policy {
+class BrowserPolicyConnector;
+}
+
 namespace sync_preferences {
 class PrefServiceSyncable;
 }
@@ -33,7 +37,8 @@
 std::unique_ptr<PrefService> CreateLocalState(
     const base::FilePath& pref_filename,
     base::SequencedTaskRunner* pref_io_task_runner,
-    const scoped_refptr<PrefRegistry>& pref_registry);
+    const scoped_refptr<PrefRegistry>& pref_registry,
+    policy::BrowserPolicyConnector* policy_connector);
 
 std::unique_ptr<sync_preferences::PrefServiceSyncable> CreateBrowserStatePrefs(
     const base::FilePath& browser_state_path,
diff --git a/ios/chrome/browser/ui/alert_view/BUILD.gn b/ios/chrome/browser/ui/alert_view/BUILD.gn
index 2c33935..32af28c 100644
--- a/ios/chrome/browser/ui/alert_view/BUILD.gn
+++ b/ios/chrome/browser/ui/alert_view/BUILD.gn
@@ -15,7 +15,7 @@
     "//ios/chrome/browser/ui/elements",
     "//ios/chrome/browser/ui/presenters",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
   ]
   libs = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/alert_view/alert_view_controller.mm b/ios/chrome/browser/ui/alert_view/alert_view_controller.mm
index f9dcc7c..230aea0 100644
--- a/ios/chrome/browser/ui/alert_view/alert_view_controller.mm
+++ b/ios/chrome/browser/ui/alert_view/alert_view_controller.mm
@@ -9,8 +9,8 @@
 #import "ios/chrome/browser/ui/elements/gray_highlight_button.h"
 #import "ios/chrome/browser/ui/elements/text_field_configuration.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/appearance/BUILD.gn b/ios/chrome/browser/ui/appearance/BUILD.gn
index ed90b799..f3a5444 100644
--- a/ios/chrome/browser/ui/appearance/BUILD.gn
+++ b/ios/chrome/browser/ui/appearance/BUILD.gn
@@ -12,7 +12,7 @@
   deps = [
     "//ios/chrome/browser/ui/settings:settings_root",
     "//ios/chrome/browser/ui/table_view",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
   ]
   configs += [ "//build/config/compiler:enable_arc" ]
 }
diff --git a/ios/chrome/browser/ui/appearance/appearance_customization.mm b/ios/chrome/browser/ui/appearance/appearance_customization.mm
index 406d09a..6edb91b 100644
--- a/ios/chrome/browser/ui/appearance/appearance_customization.mm
+++ b/ios/chrome/browser/ui/appearance/appearance_customization.mm
@@ -6,7 +6,7 @@
 
 #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
 #import "ios/chrome/browser/ui/table_view/table_view_navigation_controller.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/authentication/BUILD.gn b/ios/chrome/browser/ui/authentication/BUILD.gn
index a030659..df18e10 100644
--- a/ios/chrome/browser/ui/authentication/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/BUILD.gn
@@ -58,7 +58,7 @@
     "//ios/chrome/browser/unified_consent",
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/signin",
diff --git a/ios/chrome/browser/ui/authentication/cells/BUILD.gn b/ios/chrome/browser/ui/authentication/cells/BUILD.gn
index fe89df5..08da6266 100644
--- a/ios/chrome/browser/ui/authentication/cells/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/cells/BUILD.gn
@@ -30,7 +30,7 @@
     "//ios/chrome/browser/ui/table_view:styler",
     "//ios/chrome/browser/ui/table_view/cells",
     "//ios/chrome/browser/ui/table_view/cells:cells_constants",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/signin",
@@ -72,7 +72,7 @@
     "//ios/chrome/browser/ui/signin_interaction/public",
     "//ios/chrome/browser/ui/table_view:styler",
     "//ios/chrome/browser/ui/table_view/cells",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/test:test_support",
     "//ios/public/provider/chrome/browser/signin:test_support",
     "//ios/third_party/material_components_ios",
diff --git a/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm b/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm
index 5302276a..c760973d 100644
--- a/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm
+++ b/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm
@@ -12,8 +12,8 @@
 #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_delegate.h"
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/authentication/cells/table_view_account_item.mm b/ios/chrome/browser/ui/authentication/cells/table_view_account_item.mm
index d4380c59..b022d99 100644
--- a/ios/chrome/browser/ui/authentication/cells/table_view_account_item.mm
+++ b/ios/chrome/browser/ui/authentication/cells/table_view_account_item.mm
@@ -8,8 +8,8 @@
 #import "ios/chrome/browser/ui/settings/cells/settings_cells_constants.h"
 #include "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm b/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm
index a65dab41..d937b7c 100644
--- a/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm
+++ b/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm
@@ -42,9 +42,9 @@
 #import "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #include "ios/chrome/browser/unified_consent/unified_consent_service_factory.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #include "ios/chrome/common/string_util.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
@@ -692,7 +692,9 @@
     // The user can refuse to sign-in into a managed account, so the state
     // returns to "IdentityPicker". In that case, there is no need to create a
     // new UnifiedConsentCoordinator. The current one should be used.
-    _unifiedConsentCoordinator = [[UnifiedConsentCoordinator alloc] init];
+    _unifiedConsentCoordinator = [[UnifiedConsentCoordinator alloc]
+        initWithBaseViewController:nil
+                           browser:self.browser];
     _unifiedConsentCoordinator.delegate = self;
     if (_selectedIdentity)
       _unifiedConsentCoordinator.selectedIdentity = _selectedIdentity;
diff --git a/ios/chrome/browser/ui/authentication/signed_in_accounts_view_controller.mm b/ios/chrome/browser/ui/authentication/signed_in_accounts_view_controller.mm
index b491e75..568f3719 100644
--- a/ios/chrome/browser/ui/authentication/signed_in_accounts_view_controller.mm
+++ b/ios/chrome/browser/ui/authentication/signed_in_accounts_view_controller.mm
@@ -19,7 +19,7 @@
 #import "ios/chrome/browser/ui/collection_view/collection_view_model.h"
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/BUILD.gn b/ios/chrome/browser/ui/authentication/signin/user_signin/BUILD.gn
index c856320..ef27784 100644
--- a/ios/chrome/browser/ui/authentication/signin/user_signin/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/signin/user_signin/BUILD.gn
@@ -17,7 +17,7 @@
     "//ios/chrome/browser/ui/authentication/unified_consent",
     "//ios/chrome/browser/ui/collection_view/cells",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm
index b28e5e4..658d0f5d 100644
--- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm
+++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm
@@ -59,7 +59,9 @@
   self.viewController = [[UserSigninViewController alloc] init];
   self.viewController.delegate = self;
 
-  self.unifiedConsentCoordinator = [[UnifiedConsentCoordinator alloc] init];
+  self.unifiedConsentCoordinator = [[UnifiedConsentCoordinator alloc]
+      initWithBaseViewController:nil
+                         browser:self.browser];
   self.unifiedConsentCoordinator.delegate = self;
 
   // Set UnifiedConsentCoordinator properties.
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_view_controller.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_view_controller.mm
index 93058e8..899be9d 100644
--- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_view_controller.mm
+++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_view_controller.mm
@@ -7,8 +7,8 @@
 #import "base/logging.h"
 #import "ios/chrome/browser/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/third_party/material_components_ios/src/components/ActivityIndicator/src/MaterialActivityIndicator.h"
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn b/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn
index 29001c4..cd2ce80e 100644
--- a/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/unified_consent/BUILD.gn
@@ -16,8 +16,10 @@
     ":unified_consent_ui",
     "//base",
     "//ios/chrome/browser",
+    "//ios/chrome/browser/main:public",
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/ui/authentication/unified_consent/identity_chooser",
+    "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
     "//ios/public/provider/chrome/browser/signin",
   ]
 }
@@ -43,7 +45,7 @@
     "//ios/chrome/browser/ui/colors",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/third_party/material_components_ios",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/BUILD.gn b/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/BUILD.gn
index 1a3a7bd..5c57f37 100644
--- a/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/BUILD.gn
@@ -62,7 +62,7 @@
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/third_party/material_components_ios",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_cell.mm b/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_cell.mm
index d2576bd..0e36fb3 100644
--- a/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_cell.mm
+++ b/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_cell.mm
@@ -7,7 +7,7 @@
 #include "base/i18n/rtl.h"
 #import "ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_view.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_header_item.mm b/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_header_item.mm
index 514ced24..3a46db6f 100644
--- a/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_header_item.mm
+++ b/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_header_item.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_header_item.h"
 
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_view.mm b/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_view.mm
index 7509673..89697f3 100644
--- a/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_view.mm
+++ b/ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_view.mm
@@ -6,7 +6,7 @@
 
 #include "base/logging.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/identity_picker_view.mm b/ios/chrome/browser/ui/authentication/unified_consent/identity_picker_view.mm
index f7382ee..4dbd586 100644
--- a/ios/chrome/browser/ui/authentication/unified_consent/identity_picker_view.mm
+++ b/ios/chrome/browser/ui/authentication/unified_consent/identity_picker_view.mm
@@ -9,7 +9,7 @@
 #import "ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_view.h"
 #import "ios/chrome/browser/ui/authentication/unified_consent/unified_consent_constants.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #import "ios/third_party/material_components_ios/src/components/Ink/src/MaterialInk.h"
 
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_coordinator.h b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_coordinator.h
index eb7c9e68..b9b2b4a8 100644
--- a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_coordinator.h
+++ b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_coordinator.h
@@ -5,7 +5,7 @@
 #ifndef IOS_CHROME_BROWSER_UI_AUTHENTICATION_UNIFIED_CONSENT_UNIFIED_CONSENT_COORDINATOR_H_
 #define IOS_CHROME_BROWSER_UI_AUTHENTICATION_UNIFIED_CONSENT_UNIFIED_CONSENT_COORDINATOR_H_
 
-#import <UIKit/UIKit.h>
+#import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
 
 #include <vector>
 
@@ -42,7 +42,15 @@
 // All the string ids displayed by the view are available with
 // |consentStringIds| and |openSettingsStringId|. Those can be used to record
 // the consent agreed by the user.
-@interface UnifiedConsentCoordinator : NSObject
+@interface UnifiedConsentCoordinator : ChromeCoordinator
+
+// Unavailable, use -initWithBaseViewController:browser:.
+- (instancetype)initWithBaseViewController:(UIViewController*)viewController
+    NS_UNAVAILABLE;
+// Unavailable, use -initWithBaseViewController:browser:.
+- (instancetype)initWithBaseViewController:(UIViewController*)viewController
+                              browserState:(ChromeBrowserState*)browserState
+    NS_UNAVAILABLE;
 
 @property(nonatomic, weak) id<UnifiedConsentCoordinatorDelegate> delegate;
 // Identity selected by the user to sign-in. By default, the first identity from
@@ -66,9 +74,6 @@
 // ChromeSigninViewController.
 @property(nonatomic, assign, getter=isUIDisabled) BOOL uiDisabled;
 
-// Starts this coordinator.
-- (void)start;
-
 // List of string ids used for the user consent. The string ids order matches
 // the way they appear on the screen.
 - (const std::vector<int>&)consentStringIds;
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_coordinator.mm b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_coordinator.mm
index 790fe92..ea948ef 100644
--- a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_coordinator.mm
+++ b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_coordinator.mm
@@ -5,6 +5,7 @@
 #include "ios/chrome/browser/ui/authentication/unified_consent/unified_consent_coordinator.h"
 
 #include "base/logging.h"
+#import "ios/chrome/browser/main/browser.h"
 #import "ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_coordinator.h"
 #import "ios/chrome/browser/ui/authentication/unified_consent/identity_chooser/identity_chooser_coordinator_delegate.h"
 #import "ios/chrome/browser/ui/authentication/unified_consent/unified_consent_mediator.h"
@@ -34,8 +35,9 @@
 
 @implementation UnifiedConsentCoordinator
 
-- (instancetype)init {
-  self = [super init];
+- (instancetype)initWithBaseViewController:(UIViewController*)viewController
+                                   browser:(Browser*)browser {
+  self = [super initWithBaseViewController:nil browser:browser];
   if (self) {
     _unifiedConsentViewController = [[UnifiedConsentViewController alloc] init];
     _unifiedConsentViewController.delegate = self;
diff --git a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm
index 7250e77..085a5098 100644
--- a/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm
+++ b/ios/chrome/browser/ui/authentication/unified_consent/unified_consent_view_controller.mm
@@ -14,9 +14,9 @@
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #import "ios/chrome/browser/ui/util/label_link_controller.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #include "ios/chrome/common/string_util.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/ui/autofill/BUILD.gn b/ios/chrome/browser/ui/autofill/BUILD.gn
index 0a1d517..7dd458f 100644
--- a/ios/chrome/browser/ui/autofill/BUILD.gn
+++ b/ios/chrome/browser/ui/autofill/BUILD.gn
@@ -87,7 +87,7 @@
     "//ios/chrome/browser/ui/list_model",
     "//ios/chrome/browser/ui/table_view/cells",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/third_party/material_components_ios",
     "//ios/web",
     "//ui/base",
@@ -124,7 +124,7 @@
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/third_party/material_components_ios",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/autofill/card_expiration_date_fix_flow_view_bridge.mm b/ios/chrome/browser/ui/autofill/card_expiration_date_fix_flow_view_bridge.mm
index b5d2165..6be2862 100644
--- a/ios/chrome/browser/ui/autofill/card_expiration_date_fix_flow_view_bridge.mm
+++ b/ios/chrome/browser/ui/autofill/card_expiration_date_fix_flow_view_bridge.mm
@@ -17,7 +17,7 @@
 #import "ios/chrome/browser/ui/util/label_link_controller.h"
 #import "ios/chrome/browser/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ui/base/l10n/l10n_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/autofill/card_name_fix_flow_view_bridge.mm b/ios/chrome/browser/ui/autofill/card_name_fix_flow_view_bridge.mm
index ee933ee..dafae96 100644
--- a/ios/chrome/browser/ui/autofill/card_name_fix_flow_view_bridge.mm
+++ b/ios/chrome/browser/ui/autofill/card_name_fix_flow_view_bridge.mm
@@ -16,7 +16,7 @@
 #import "ios/chrome/browser/ui/util/label_link_controller.h"
 #import "ios/chrome/browser/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ui/base/l10n/l10n_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm b/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm
index c544088e..9e24d199 100644
--- a/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm
+++ b/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm
@@ -20,7 +20,7 @@
 #import "ios/chrome/browser/ui/collection_view/collection_view_controller.h"
 #import "ios/chrome/browser/ui/collection_view/collection_view_model.h"
 #import "ios/chrome/browser/ui/util/rtl_geometry.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/browser/ui/autofill/cells/cvc_item.mm b/ios/chrome/browser/ui/autofill/cells/cvc_item.mm
index 1f440d42..f973483 100644
--- a/ios/chrome/browser/ui/autofill/cells/cvc_item.mm
+++ b/ios/chrome/browser/ui/autofill/cells/cvc_item.mm
@@ -6,7 +6,7 @@
 
 #include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
diff --git a/ios/chrome/browser/ui/autofill/cells/legacy_autofill_edit_item.mm b/ios/chrome/browser/ui/autofill/cells/legacy_autofill_edit_item.mm
index 17ff071..f2a44965b 100644
--- a/ios/chrome/browser/ui/autofill/cells/legacy_autofill_edit_item.mm
+++ b/ios/chrome/browser/ui/autofill/cells/legacy_autofill_edit_item.mm
@@ -7,8 +7,8 @@
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
 
diff --git a/ios/chrome/browser/ui/autofill/cells/status_item.mm b/ios/chrome/browser/ui/autofill/cells/status_item.mm
index 0c8bf81..563f917a 100644
--- a/ios/chrome/browser/ui/autofill/cells/status_item.mm
+++ b/ios/chrome/browser/ui/autofill/cells/status_item.mm
@@ -6,7 +6,7 @@
 
 #include "base/logging.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_theme_resources.h"
 #import "ios/third_party/material_components_ios/src/components/ActivityIndicator/src/MaterialActivityIndicator.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/BUILD.gn b/ios/chrome/browser/ui/autofill/form_input_accessory/BUILD.gn
index 93c5ee3..8ad0c52 100644
--- a/ios/chrome/browser/ui/autofill/form_input_accessory/BUILD.gn
+++ b/ios/chrome/browser/ui/autofill/form_input_accessory/BUILD.gn
@@ -56,7 +56,7 @@
     "//ios/chrome/browser/autofill:autofill_shared",
     "//ios/chrome/browser/ui/image_util",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_view.mm b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_view.mm
index b6e3d27..94f41f7 100644
--- a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_view.mm
+++ b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_view.mm
@@ -11,7 +11,7 @@
 #import "ios/chrome/browser/autofill/form_input_navigator.h"
 #import "ios/chrome/browser/ui/image_util/image_util.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn b/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn
index 85ea477..799cebb 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn
+++ b/ios/chrome/browser/ui/autofill/manual_fill/BUILD.gn
@@ -60,7 +60,7 @@
     "//ios/chrome/browser/ui/table_view:table_view",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/web_state_list:web_state_list",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/web/public",
     "//ios/web/public/deprecated",
     "//ios/web/public/js_messaging",
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/chip_button.mm b/ios/chrome/browser/ui/autofill/manual_fill/chip_button.mm
index 8f9de44..cf5238ea 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/chip_button.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/chip_button.mm
@@ -5,7 +5,7 @@
 #import "ios/chrome/browser/ui/autofill/manual_fill/chip_button.h"
 
 #include "base/mac/foundation_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator.mm b/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator.mm
index e6d2421..13984a3 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator.mm
@@ -16,7 +16,7 @@
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller.h"
 #import "ios/chrome/browser/ui/table_view/table_view_navigation_controller.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.mm b/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.mm
index 15f0fb5..80294e3 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller.mm
@@ -9,7 +9,7 @@
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_accessory_view_controller.mm b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_accessory_view_controller.mm
index 0fc645bb..4d33c69 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_accessory_view_controller.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_accessory_view_controller.mm
@@ -6,7 +6,7 @@
 
 #include "base/metrics/user_metrics.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_action_cell.mm b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_action_cell.mm
index 5bb62dc..ae9b705f 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_action_cell.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_action_cell.mm
@@ -7,7 +7,7 @@
 #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_cell_button.h"
 #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_cell_utils.h"
 #import "ios/chrome/browser/ui/list_model/list_model.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_address_cell.mm b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_address_cell.mm
index d423566a..114cf9a5 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_address_cell.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_address_cell.mm
@@ -8,7 +8,7 @@
 #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_cell_utils.h"
 #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_content_injector.h"
 #import "ios/chrome/browser/ui/list_model/list_model.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_card_cell.mm b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_card_cell.mm
index 808820d..61d06bc7 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_card_cell.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_card_cell.mm
@@ -13,7 +13,7 @@
 #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_credit_card.h"
 #import "ios/chrome/browser/ui/list_model/list_model.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_cell_button.mm b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_cell_button.mm
index 14b950b..829ac23 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_cell_button.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_cell_button.mm
@@ -5,7 +5,7 @@
 #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_cell_button.h"
 
 #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_cell_utils.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_cell_utils.mm b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_cell_utils.mm
index 30106fd..928e887 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_cell_utils.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_cell_utils.mm
@@ -7,7 +7,7 @@
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #import "ios/chrome/browser/ui/autofill/manual_fill/chip_button.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_cell.mm b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_cell.mm
index 2c065e5..16aedcbb 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_cell.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_cell.mm
@@ -11,7 +11,7 @@
 #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_content_injector.h"
 #import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_credential.h"
 #import "ios/chrome/browser/ui/list_model/list_model.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/favicon/favicon_view.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/ui/autofill/save_card_infobar_view.mm b/ios/chrome/browser/ui/autofill/save_card_infobar_view.mm
index c7435f4..7c2b95e 100644
--- a/ios/chrome/browser/ui/autofill/save_card_infobar_view.mm
+++ b/ios/chrome/browser/ui/autofill/save_card_infobar_view.mm
@@ -15,7 +15,7 @@
 #import "ios/chrome/browser/ui/util/label_link_controller.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #import "ios/third_party/material_components_ios/src/components/Buttons/src/MaterialButtons.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
diff --git a/ios/chrome/browser/ui/badges/BUILD.gn b/ios/chrome/browser/ui/badges/BUILD.gn
index a28c91c3..a9c7548 100644
--- a/ios/chrome/browser/ui/badges/BUILD.gn
+++ b/ios/chrome/browser/ui/badges/BUILD.gn
@@ -68,7 +68,7 @@
     "//ios/chrome/browser/web",
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/common:timing",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/web/public",
     "//ui/base",
@@ -99,7 +99,7 @@
     "//ios/chrome/browser/ui/table_view:styler",
     "//ios/chrome/browser/ui/table_view/cells",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/badges/badge_button.mm b/ios/chrome/browser/ui/badges/badge_button.mm
index 12aeb72a..b4cab8a 100644
--- a/ios/chrome/browser/ui/badges/badge_button.mm
+++ b/ios/chrome/browser/ui/badges/badge_button.mm
@@ -7,7 +7,7 @@
 #import "base/logging.h"
 #import "ios/chrome/browser/ui/badges/badge_constants.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/badges/badge_button_factory.mm b/ios/chrome/browser/ui/badges/badge_button_factory.mm
index c38a438..b57fc4b 100644
--- a/ios/chrome/browser/ui/badges/badge_button_factory.mm
+++ b/ios/chrome/browser/ui/badges/badge_button_factory.mm
@@ -8,8 +8,8 @@
 #import "ios/chrome/browser/ui/badges/badge_button.h"
 #import "ios/chrome/browser/ui/badges/badge_constants.h"
 #import "ios/chrome/browser/ui/badges/badge_delegate.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/browser/ui/badges/badge_popup_menu_item.mm b/ios/chrome/browser/ui/badges/badge_popup_menu_item.mm
index 7ccb1b3..8151952 100644
--- a/ios/chrome/browser/ui/badges/badge_popup_menu_item.mm
+++ b/ios/chrome/browser/ui/badges/badge_popup_menu_item.mm
@@ -7,7 +7,7 @@
 #import "base/logging.h"
 #import "ios/chrome/browser/ui/list_model/list_model.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/badges/badge_view_controller.mm b/ios/chrome/browser/ui/badges/badge_view_controller.mm
index 9c9b07d..89a0e11 100644
--- a/ios/chrome/browser/ui/badges/badge_view_controller.mm
+++ b/ios/chrome/browser/ui/badges/badge_view_controller.mm
@@ -11,8 +11,8 @@
 #import "ios/chrome/browser/ui/badges/badge_item.h"
 #import "ios/chrome/browser/ui/elements/extended_touch_target_button.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #import "ios/chrome/common/material_timing.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn
index 3fbf3e0a..936c304 100644
--- a/ios/chrome/browser/ui/bookmarks/BUILD.gn
+++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -99,7 +99,7 @@
     "//ios/chrome/browser/undo",
     "//ios/chrome/browser/url_loading",
     "//ios/chrome/browser/web_state_list",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/favicon",
     "//ios/chrome/common/ui/util",
     "//ios/public/provider/chrome/browser",
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.mm
index 69c2ca7..32af208d 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.mm
@@ -36,7 +36,7 @@
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_empty_background.mm b/ios/chrome/browser/ui/bookmarks/bookmark_empty_background.mm
index 9cc8446..1e905b6 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_empty_background.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_empty_background.mm
@@ -5,7 +5,7 @@
 #include "ios/chrome/browser/ui/bookmarks/bookmark_empty_background.h"
 
 #import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.mm
index 2239f66..2cb0770 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.mm
@@ -28,7 +28,7 @@
 #import "ios/chrome/browser/ui/material_components/utils.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_folder_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_folder_view_controller.mm
index 782d5497..1f31f110 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_folder_view_controller.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_folder_view_controller.mm
@@ -18,7 +18,7 @@
 #import "ios/chrome/browser/ui/bookmarks/cells/bookmark_folder_item.h"
 #import "ios/chrome/browser/ui/icons/chrome_icon.h"
 #import "ios/chrome/browser/ui/material_components/utils.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_mediator.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_mediator.mm
index c5b604ce..39f33aa 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_mediator.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_mediator.mm
@@ -22,7 +22,7 @@
 #import "ios/chrome/browser/ui/signin_interaction/public/signin_presenter.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_item.h"
 #import "ios/chrome/browser/ui/table_view/table_view_model.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
index 554d9a77..4e5c3823 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
@@ -52,7 +52,7 @@
 #import "ios/chrome/browser/url_loading/url_loading_service.h"
 #import "ios/chrome/browser/url_loading/url_loading_service_factory.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/favicon/favicon_attributes.h"
 #import "ios/chrome/common/ui/favicon/favicon_view.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.mm
index 0eff335..f09595a 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.mm
@@ -6,7 +6,7 @@
 
 #import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm
index 28c9b0a..e50c7fd9 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.mm
@@ -23,7 +23,7 @@
 #include "ios/chrome/browser/ui/bookmarks/undo_manager_wrapper.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/third_party/material_components_ios/src/components/Snackbar/src/MaterialSnackbar.h"
 #include "third_party/skia/include/core/SkColor.h"
diff --git a/ios/chrome/browser/ui/bookmarks/cells/bookmark_parent_folder_item.mm b/ios/chrome/browser/ui/bookmarks/cells/bookmark_parent_folder_item.mm
index bec0827..36dfac1 100644
--- a/ios/chrome/browser/ui/bookmarks/cells/bookmark_parent_folder_item.mm
+++ b/ios/chrome/browser/ui/bookmarks/cells/bookmark_parent_folder_item.mm
@@ -10,7 +10,7 @@
 #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h"
 #import "ios/chrome/browser/ui/icons/chrome_icon.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/bookmarks/cells/bookmark_text_field_item.mm b/ios/chrome/browser/ui/bookmarks/cells/bookmark_text_field_item.mm
index cee6ed5..0eb0a90 100644
--- a/ios/chrome/browser/ui/bookmarks/cells/bookmark_text_field_item.mm
+++ b/ios/chrome/browser/ui/bookmarks/cells/bookmark_text_field_item.mm
@@ -9,7 +9,7 @@
 #import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
diff --git a/ios/chrome/browser/ui/browser_view/BUILD.gn b/ios/chrome/browser/ui/browser_view/BUILD.gn
index 37d09f0..e3598f7 100644
--- a/ios/chrome/browser/ui/browser_view/BUILD.gn
+++ b/ios/chrome/browser/ui/browser_view/BUILD.gn
@@ -164,7 +164,7 @@
     "//ios/chrome/browser/web_state_list/web_usage_enabler",
     "//ios/chrome/browser/webui",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/ui",
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
index 1bf9ad9..ded7ff6 100644
--- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -15,6 +15,7 @@
 #include "ios/chrome/browser/chrome_url_constants.h"
 #include "ios/chrome/browser/download/download_directory_util.h"
 #import "ios/chrome/browser/download/pass_kit_tab_helper.h"
+#import "ios/chrome/browser/find_in_page/find_tab_helper.h"
 #import "ios/chrome/browser/main/browser.h"
 #import "ios/chrome/browser/store_kit/store_kit_coordinator.h"
 #import "ios/chrome/browser/store_kit/store_kit_tab_helper.h"
@@ -32,11 +33,15 @@
 #import "ios/chrome/browser/ui/commands/application_commands.h"
 #import "ios/chrome/browser/ui/commands/browser_coordinator_commands.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
+#import "ios/chrome/browser/ui/commands/find_in_page_commands.h"
 #import "ios/chrome/browser/ui/commands/infobar_commands.h"
 #import "ios/chrome/browser/ui/commands/page_info_commands.h"
 #import "ios/chrome/browser/ui/commands/password_breach_commands.h"
+#import "ios/chrome/browser/ui/commands/text_zoom_commands.h"
 #import "ios/chrome/browser/ui/download/ar_quick_look_coordinator.h"
 #import "ios/chrome/browser/ui/download/pass_kit_coordinator.h"
+#import "ios/chrome/browser/ui/find_bar/find_bar_controller_ios.h"
+#import "ios/chrome/browser/ui/find_bar/find_bar_coordinator.h"
 #import "ios/chrome/browser/ui/infobars/infobar_feature.h"
 #import "ios/chrome/browser/ui/open_in/open_in_mediator.h"
 #import "ios/chrome/browser/ui/overlays/overlay_container_coordinator.h"
@@ -50,6 +55,9 @@
 #import "ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.h"
 #import "ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_coordinator.h"
 #import "ios/chrome/browser/ui/snackbar/snackbar_coordinator.h"
+#import "ios/chrome/browser/ui/text_zoom/text_zoom_coordinator.h"
+#import "ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_coordinator_delegate.h"
+#import "ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.h"
 #import "ios/chrome/browser/ui/translate/legacy_translate_infobar_coordinator.h"
 #import "ios/chrome/browser/url_loading/url_loading_params.h"
 #import "ios/chrome/browser/url_loading/url_loading_service.h"
@@ -71,6 +79,7 @@
                                   FormInputAccessoryCoordinatorNavigator,
                                   PageInfoCommands,
                                   RepostFormTabHelperDelegate,
+                                  ToolbarAccessoryCoordinatorDelegate,
                                   URLLoadingServiceDelegate,
                                   WebStateListObserving>
 
@@ -105,6 +114,9 @@
 @property(nonatomic, strong)
     BadgePopupMenuCoordinator* badgePopupMenuCoordinator;
 
+// Coordinator for the find bar.
+@property(nonatomic, strong) FindBarCoordinator* findBarCoordinator;
+
 // Coordinator in charge of the presenting autofill options above the
 // keyboard.
 @property(nonatomic, strong)
@@ -118,6 +130,9 @@
 @property(nonatomic, strong)
     ManualFillAllPasswordCoordinator* allPasswordCoordinator;
 
+// Weak reference for the next coordinator to be displayed over the toolbar.
+@property(nonatomic, weak) ChromeCoordinator* nextToolbarCoordinator;
+
 // Coordinator for Page Info UI.
 @property(nonatomic, strong) ChromeCoordinator* pageInfoCoordinator;
 
@@ -150,6 +165,9 @@
 // Coordinator for presenting SKStoreProductViewController.
 @property(nonatomic, strong) StoreKitCoordinator* storeKitCoordinator;
 
+// Coordinator for Text Zoom.
+@property(nonatomic, strong) TextZoomCoordinator* textZoomCoordinator;
+
 // Coordinator for the translate infobar's language selection and translate
 // option popup menus.
 @property(nonatomic, strong)
@@ -187,6 +205,10 @@
   DCHECK(self.browserState);
   DCHECK(!self.viewController);
   [self startBrowserContainer];
+  [self.dispatcher startDispatchingToTarget:self
+                                forProtocol:@protocol(TextZoomCommands)];
+  [self.dispatcher startDispatchingToTarget:self
+                                forProtocol:@protocol(FindInPageCommands)];
   [self createViewController];
   [self startChildCoordinators];
   [self.dispatcher
@@ -394,6 +416,9 @@
   [self.ARQuickLookCoordinator stop];
   self.ARQuickLookCoordinator = nil;
 
+  [self.findBarCoordinator stop];
+  self.findBarCoordinator = nil;
+
   [self.formInputAccessoryCoordinator stop];
   self.formInputAccessoryCoordinator = nil;
   self.injectionHandler = nil;
@@ -429,6 +454,9 @@
   [self.storeKitCoordinator stop];
   self.storeKitCoordinator = nil;
 
+  [self.textZoomCoordinator stop];
+  self.textZoomCoordinator = nil;
+
   [self.translateInfobarCoordinator stop];
   self.translateInfobarCoordinator = nil;
 
@@ -527,6 +555,116 @@
   [self.addCreditCardCoordinator start];
 }
 
+#pragma mark - FindInPageCommands
+
+- (void)openFindInPage {
+  if (!self.canShowFindBar)
+    return;
+
+  self.findBarCoordinator =
+      [[FindBarCoordinator alloc] initWithBaseViewController:self.viewController
+                                                     browser:self.browser];
+  self.findBarCoordinator.presenter =
+      self.viewController.toolbarAccessoryPresenter;
+  self.findBarCoordinator.delegate = self;
+  self.findBarCoordinator.presentationDelegate = self.viewController;
+
+  if (self.viewController.toolbarAccessoryPresenter.isPresenting) {
+    self.nextToolbarCoordinator = self.findBarCoordinator;
+    [self hideTextZoom];
+    return;
+  }
+
+  [self.findBarCoordinator start];
+}
+
+- (void)closeFindInPage {
+  web::WebState* currentWebState =
+      self.browser->GetWebStateList()->GetActiveWebState();
+
+  __weak __typeof(self) weakSelf = self;
+  if (currentWebState) {
+    FindTabHelper* findTabHelper = FindTabHelper::FromWebState(currentWebState);
+    if (findTabHelper->IsFindUIActive()) {
+      findTabHelper->StopFinding(^{
+        [weakSelf.findBarCoordinator stop];
+      });
+    } else {
+      [self.findBarCoordinator stop];
+    }
+  }
+}
+
+- (void)showFindUIIfActive {
+  web::WebState* currentWebState =
+      self.browser->GetWebStateList()->GetActiveWebState();
+  auto* findHelper = FindTabHelper::FromWebState(currentWebState);
+  if (findHelper && findHelper->IsFindUIActive() &&
+      !self.findBarCoordinator.presenter.isPresenting) {
+    [self.findBarCoordinator start];
+  }
+}
+
+- (void)hideFindUI {
+  [self.findBarCoordinator stop];
+}
+
+- (void)defocusFindInPage {
+  [self.findBarCoordinator defocusFindBar];
+}
+
+- (void)searchFindInPage {
+  web::WebState* currentWebState =
+      self.browser->GetWebStateList()->GetActiveWebState();
+  DCHECK(currentWebState);
+  FindTabHelper* helper = FindTabHelper::FromWebState(currentWebState);
+  __weak __typeof(self) weakSelf = self;
+  helper->StartFinding([self.findBarCoordinator.findBarController searchTerm],
+                       ^(FindInPageModel* model) {
+                         [weakSelf.findBarCoordinator.findBarController
+                             updateResultsCount:model];
+                       });
+
+  if (!self.browserState->IsOffTheRecord())
+    helper->PersistSearchTerm();
+}
+
+- (void)findNextStringInPage {
+  web::WebState* currentWebState =
+      self.browser->GetWebStateList()->GetActiveWebState();
+  DCHECK(currentWebState);
+  // TODO(crbug.com/603524): Reshow find bar if necessary.
+  FindTabHelper::FromWebState(currentWebState)
+      ->ContinueFinding(FindTabHelper::FORWARD, ^(FindInPageModel* model) {
+        [self.findBarCoordinator.findBarController updateResultsCount:model];
+      });
+}
+
+- (void)findPreviousStringInPage {
+  web::WebState* currentWebState =
+      self.browser->GetWebStateList()->GetActiveWebState();
+  DCHECK(currentWebState);
+  // TODO(crbug.com/603524): Reshow find bar if necessary.
+  FindTabHelper::FromWebState(currentWebState)
+      ->ContinueFinding(FindTabHelper::REVERSE, ^(FindInPageModel* model) {
+        [self.findBarCoordinator.findBarController updateResultsCount:model];
+      });
+}
+
+#pragma mark - FindInPageCommands Helpers
+
+- (BOOL)canShowFindBar {
+  web::WebState* currentWebState =
+      self.browser->GetWebStateList()->GetActiveWebState();
+  if (!currentWebState) {
+    return NO;
+  }
+
+  auto* helper = FindTabHelper::FromWebState(currentWebState);
+  return (helper && helper->CurrentPageSupportsFindInPage() &&
+          !helper->IsFindUIActive());
+}
+
 #pragma mark - PageInfoCommands
 
 - (void)legacyShowPageInfoForOriginPoint:(CGPoint)originPoint {
@@ -608,6 +746,45 @@
   self.repostFormCoordinator = nil;
 }
 
+#pragma mark - ToolbarAccessoryCoordinatorDelegate
+
+- (void)toolbarAccessoryCoordinatorDidDismissUI:
+    (ChromeCoordinator*)coordinator {
+  if (!self.nextToolbarCoordinator) {
+    return;
+  }
+  if (self.nextToolbarCoordinator == self.findBarCoordinator) {
+    [self openFindInPage];
+    self.nextToolbarCoordinator = nil;
+  } else if (self.nextToolbarCoordinator == self.textZoomCoordinator) {
+    [self showTextZoom];
+    self.nextToolbarCoordinator = nil;
+  }
+}
+
+#pragma mark - TextZoomCommands
+
+- (void)showTextZoom {
+  self.textZoomCoordinator = [[TextZoomCoordinator alloc]
+      initWithBaseViewController:self.viewController
+                         browser:self.browser];
+  self.textZoomCoordinator.presenter =
+      self.viewController.toolbarAccessoryPresenter;
+  self.textZoomCoordinator.delegate = self;
+
+  if (self.viewController.toolbarAccessoryPresenter.isPresenting) {
+    self.nextToolbarCoordinator = self.textZoomCoordinator;
+    [self closeFindInPage];
+    return;
+  }
+
+  [self.textZoomCoordinator start];
+}
+
+- (void)hideTextZoom {
+  [self.textZoomCoordinator stop];
+}
+
 #pragma mark - URLLoadingServiceDelegate
 
 - (void)animateOpenBackgroundTabFromParams:(const UrlLoadParams&)params
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.h b/ios/chrome/browser/ui/browser_view/browser_view_controller.h
index 1e216a02..5e3cf9ba 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.h
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.h
@@ -8,6 +8,7 @@
 #import <UIKit/UIKit.h>
 
 #import "base/ios/block_types.h"
+#import "ios/chrome/browser/ui/find_bar/find_bar_coordinator.h"
 #import "ios/chrome/browser/ui/page_info/requirements/page_info_presentation.h"
 #import "ios/chrome/browser/ui/settings/sync/utils/sync_presenter.h"
 #import "ios/chrome/browser/ui/toolbar/toolbar_coordinator_delegate.h"
@@ -35,6 +36,7 @@
 // which implement the interface.
 @interface BrowserViewController
     : UIViewController <LogoAnimationControllerOwnerOwner,
+                        FindBarPresentationDelegate,
                         PageInfoPresentation,
                         SyncPresenter,
                         ToolbarCoordinatorDelegate>
@@ -96,6 +98,10 @@
 @property(nonatomic, strong)
     UIViewController* infobarModalOverlayContainerViewController;
 
+// Presenter used to display accessories over the toolbar (e.g. Find In Page).
+@property(nonatomic, strong)
+    ToolbarAccessoryPresenter* toolbarAccessoryPresenter;
+
 // Whether the receiver is currently the primary BVC.
 - (void)setPrimary:(BOOL)primary;
 
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index b59e49a..72736f7 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -34,7 +34,6 @@
 #import "ios/chrome/browser/download/download_manager_tab_helper.h"
 #include "ios/chrome/browser/feature_engagement/tracker_factory.h"
 #include "ios/chrome/browser/feature_engagement/tracker_util.h"
-#import "ios/chrome/browser/find_in_page/find_in_page_response_delegate.h"
 #import "ios/chrome/browser/find_in_page/find_tab_helper.h"
 #include "ios/chrome/browser/first_run/first_run.h"
 #import "ios/chrome/browser/geolocation/omnibox_geolocation_controller.h"
@@ -93,9 +92,6 @@
 #import "ios/chrome/browser/ui/dialogs/overlay_java_script_dialog_presenter.h"
 #import "ios/chrome/browser/ui/download/download_manager_coordinator.h"
 #import "ios/chrome/browser/ui/elements/activity_overlay_coordinator.h"
-#import "ios/chrome/browser/ui/find_bar/find_bar_controller_ios.h"
-#import "ios/chrome/browser/ui/find_bar/find_bar_coordinator.h"
-#import "ios/chrome/browser/ui/find_bar/find_bar_view_controller.h"
 #import "ios/chrome/browser/ui/first_run/welcome_to_chrome_view_controller.h"
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_animator.h"
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_controller.h"
@@ -129,8 +125,6 @@
 #import "ios/chrome/browser/ui/tabs/requirements/tab_strip_presentation.h"
 #import "ios/chrome/browser/ui/tabs/switch_to_tab_animation_view.h"
 #import "ios/chrome/browser/ui/tabs/tab_strip_legacy_coordinator.h"
-#import "ios/chrome/browser/ui/text_zoom/text_zoom_coordinator.h"
-#import "ios/chrome/browser/ui/text_zoom/text_zoom_view_controller.h"
 #import "ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_coordinator_delegate.h"
 #import "ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.h"
 #import "ios/chrome/browser/ui/toolbar/adaptive_toolbar_coordinator.h"
@@ -180,7 +174,7 @@
 #import "ios/chrome/browser/webui/net_export_tab_helper.h"
 #import "ios/chrome/browser/webui/net_export_tab_helper_delegate.h"
 #import "ios/chrome/browser/webui/show_mail_composer_context.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
@@ -365,7 +359,7 @@
                                      SigninPresenter,
                                      SnapshotGeneratorDelegate,
                                      TabStripPresentation,
-                                     ToolbarAccessoryCoordinatorDelegate,
+                                     FindBarPresentationDelegate,
                                      ToolbarHeightProviderForFullscreen,
                                      WebStateListObserving,
                                      UIGestureRecognizerDelegate,
@@ -498,8 +492,6 @@
 @property(nonatomic, strong, readonly) DialogPresenter* dialogPresenter;
 // The object that manages keyboard commands on behalf of the BVC.
 @property(nonatomic, strong, readonly) KeyCommandsProvider* keyCommandsProvider;
-// Helper method to check web controller canShowFindBar method.
-@property(nonatomic, assign, readonly) BOOL canShowFindBar;
 // Whether the controller's view is currently available.
 // YES from viewWillAppear to viewWillDisappear.
 @property(nonatomic, assign, getter=isVisible) BOOL visible;
@@ -517,9 +509,6 @@
 // Whether BVC prefers to hide the status bar. This value is used to determine
 // the response from the |prefersStatusBarHidden| method.
 @property(nonatomic, assign) BOOL hideStatusBar;
-// Presenter used to display accessories over the toolbar (e.g. Find In Page).
-@property(nonatomic, strong)
-    ToolbarAccessoryPresenter* toolbarAccessoryPresenter;
 // Coordinator for displaying a modal overlay with activity indicator to prevent
 // the user from interacting with the browser view.
 @property(nonatomic, strong)
@@ -553,16 +542,11 @@
 // Coordinator for the popup menus.
 @property(nonatomic, strong) PopupMenuCoordinator* popupMenuCoordinator;
 
-// Coordinator for find in page.
-@property(nonatomic, strong) FindBarCoordinator* findBarCoordinator;
-
-// Coordinator for text zoom.
-@property(nonatomic, strong) TextZoomCoordinator* textZoomCoordinator;
-
-@property(nonatomic, weak) ChromeCoordinator* nextToolbarCoordinator;
-
 @property(nonatomic, strong) BubblePresenter* bubblePresenter;
 
+// Command handler for text zoom commands
+@property(nonatomic, weak) id<TextZoomCommands> textZoomHandler;
+
 // Primary toolbar.
 @property(nonatomic, strong)
     PrimaryToolbarCoordinator* primaryToolbarCoordinator;
@@ -742,16 +726,12 @@
     _browserContainerViewController = browserContainerViewController;
     _dependencyFactory = factory;
     self.commandDispatcher = browser->GetCommandDispatcher();
+    self.textZoomHandler =
+        HandlerForProtocol(self.commandDispatcher, TextZoomCommands);
     [self.commandDispatcher
         startDispatchingToTarget:self
                      forProtocol:@protocol(BrowserCommands)];
     [self.commandDispatcher
-        startDispatchingToTarget:self
-                     forProtocol:@protocol(FindInPageCommands)];
-    [self.commandDispatcher
-        startDispatchingToTarget:self
-                     forProtocol:@protocol(TextZoomCommands)];
-    [self.commandDispatcher
         startDispatchingToTarget:applicationCommandEndpoint
                      forProtocol:@protocol(ApplicationCommands)];
     // -startDispatchingToTarget:forProtocol: doesn't pick up protocols the
@@ -916,18 +896,6 @@
   return _keyCommandsProvider;
 }
 
-- (BOOL)canShowFindBar {
-  // Make sure web controller can handle find in page.
-  web::WebState* webState = self.currentWebState;
-  if (!webState) {
-    return NO;
-  }
-
-  auto* helper = FindTabHelper::FromWebState(webState);
-  return (helper && helper->CurrentPageSupportsFindInPage() &&
-          !helper->IsFindUIActive());
-}
-
 - (BOOL)canShowTabStrip {
   return IsRegularXRegularSizeClass(self);
 }
@@ -1148,11 +1116,6 @@
                                                         completion:nil];
   }
   [self.bubblePresenter userEnteredTabSwitcher];
-
-  // TODO(crbug.com/1052818): These should not be necessary once the
-  // coordinators are moved up to BrowserCoordinator.
-  [self.dispatcher hideFindUI];
-  [self.textZoomCoordinator stop];
 }
 
 - (void)presentBubblesIfEligible {
@@ -1236,7 +1199,7 @@
   // Keyboard shouldn't overlay the ecoutez window, so dismiss find in page and
   // dismiss the keyboard.
   [self.dispatcher closeFindInPage];
-  [self hideTextZoom];
+  [self.textZoomHandler hideTextZoom];
   [[self viewForWebState:self.currentWebState] endEditing:NO];
 
   // Ensure that voice search objects are created.
@@ -1322,7 +1285,7 @@
       [_ntpCoordinatorsForWebStates[webState] dismissModals];
     }
     [self.dispatcher closeFindInPage];
-    [self.textZoomCoordinator stop];
+    [self.textZoomHandler hideTextZoom];
   }
 
   [self.dispatcher dismissPopupMenuAnimated:NO];
@@ -1717,7 +1680,7 @@
   if (ShouldShowCompactToolbar(previousTraitCollection) !=
       ShouldShowCompactToolbar()) {
     [self.dispatcher hideFindUI];
-    [self.textZoomCoordinator stop];
+    [self.textZoomHandler hideTextZoom];
   }
 
   // Update the toolbar visibility.
@@ -2394,7 +2357,7 @@
   if (!self.inNewTabAnimation) {
     // Hide findbar.  |updateToolbar| will restore the findbar later.
     [self.dispatcher hideFindUI];
-    [self.textZoomCoordinator stop];
+    [self.textZoomHandler hideTextZoom];
 
     // Make new content visible, resizing it first as the orientation may
     // have changed from the last time it was displayed.
@@ -4203,26 +4166,6 @@
   }
 }
 
-- (void)showTextZoom {
-  if (self.toolbarAccessoryPresenter.isPresenting) {
-    self.nextToolbarCoordinator = self.textZoomCoordinator;
-    [self closeFindInPage];
-    return;
-  }
-
-  self.textZoomCoordinator =
-      [[TextZoomCoordinator alloc] initWithBaseViewController:self
-                                                      browser:self.browser];
-  self.textZoomCoordinator.presenter = self.toolbarAccessoryPresenter;
-  self.textZoomCoordinator.delegate = self;
-
-  [self.textZoomCoordinator start];
-}
-
-- (void)hideTextZoom {
-  [self.textZoomCoordinator stop];
-}
-
 #pragma mark - BrowserCommands helpers
 
 // Reloads the original url of the last non-redirect item (including non-history
@@ -4235,92 +4178,6 @@
   navigationManager->ReloadWithUserAgentType(userAgentType);
 }
 
-#pragma mark - FindInPageCommands
-
-- (void)openFindInPage {
-  if (!self.canShowFindBar)
-    return;
-
-  if (self.toolbarAccessoryPresenter.isPresenting) {
-    self.nextToolbarCoordinator = self.findBarCoordinator;
-    [self hideTextZoom];
-    return;
-  }
-
-  self.findBarCoordinator =
-      [[FindBarCoordinator alloc] initWithBaseViewController:self
-                                                     browser:self.browser];
-  self.findBarCoordinator.presenter = self.toolbarAccessoryPresenter;
-  self.findBarCoordinator.delegate = self;
-
-  [self.findBarCoordinator start];
-}
-
-- (void)closeFindInPage {
-  __weak BrowserViewController* weakSelf = self;
-  if (self.currentWebState) {
-    FindTabHelper* findTabHelper =
-        FindTabHelper::FromWebState(self.currentWebState);
-    if (findTabHelper->IsFindUIActive()) {
-      findTabHelper->StopFinding(^{
-        [weakSelf hideFindUI];
-      });
-    } else {
-      [self hideFindUI];
-    }
-  }
-}
-
-- (void)showFindUIIfActive {
-  web::WebState* currentWebState =
-      self.browser->GetWebStateList()->GetActiveWebState();
-  auto* findHelper = FindTabHelper::FromWebState(currentWebState);
-  if (findHelper && findHelper->IsFindUIActive() &&
-      !self.findBarCoordinator.presenter.isPresenting) {
-    [self.findBarCoordinator start];
-  }
-}
-
-- (void)hideFindUI {
-  [self.findBarCoordinator stop];
-}
-
-- (void)defocusFindInPage {
-  [self.findBarCoordinator defocusFindBar];
-}
-
-- (void)searchFindInPage {
-  DCHECK(self.currentWebState);
-  FindTabHelper* helper = FindTabHelper::FromWebState(self.currentWebState);
-  __weak __typeof(self) weakSelf = self;
-  helper->StartFinding([self.findBarCoordinator.findBarController searchTerm],
-                       ^(FindInPageModel* model) {
-                         [weakSelf.findBarCoordinator.findBarController
-                             updateResultsCount:model];
-                       });
-
-  if (!_isOffTheRecord)
-    helper->PersistSearchTerm();
-}
-
-- (void)findNextStringInPage {
-  DCHECK(self.currentWebState);
-  // TODO(crbug.com/603524): Reshow find bar if necessary.
-  FindTabHelper::FromWebState(self.currentWebState)
-      ->ContinueFinding(FindTabHelper::FORWARD, ^(FindInPageModel* model) {
-        [self.findBarCoordinator.findBarController updateResultsCount:model];
-      });
-}
-
-- (void)findPreviousStringInPage {
-  DCHECK(self.currentWebState);
-  // TODO(crbug.com/603524): Reshow find bar if necessary.
-  FindTabHelper::FromWebState(self.currentWebState)
-      ->ContinueFinding(FindTabHelper::REVERSE, ^(FindInPageModel* model) {
-        [self.findBarCoordinator.findBarController updateResultsCount:model];
-      });
-}
-
 #pragma mark - WebStateListObserving methods
 
 // Observer method, active WebState changed.
@@ -4363,7 +4220,7 @@
 
   // Remove the find bar for now.
   [self.dispatcher hideFindUI];
-  [self.textZoomCoordinator stop];
+  [self.textZoomHandler hideTextZoom];
 }
 
 - (void)webStateList:(WebStateList*)webStateList
@@ -4630,7 +4487,7 @@
     // Hide UI accessories such as find bar and first visit overlays
     // for welcome page.
     [self.dispatcher hideFindUI];
-    [self.textZoomCoordinator stop];
+    [self.textZoomHandler hideTextZoom];
     [self.infobarContainerCoordinator hideContainer:YES];
   }
 }
@@ -4803,32 +4660,14 @@
   [[self view] addSubview:tabStripView];
 }
 
-#pragma mark - ToolbarAccessoryCoordinatorDelegate
+#pragma mark - FindBarPresentationDelegate
 
-- (void)setHeadersForToolbarAccessoryCoordinator:
-    (ChromeCoordinator*)toolbarAccessoryCoordinator {
+- (void)setHeadersForFindBarCoordinator:
+    (FindBarCoordinator*)findBarCoordinator {
   [self setFramesForHeaders:[self headerViews]
                    atOffset:[self currentHeaderOffset]];
 }
 
-- (void)toolbarAccessoryCoordinatorDidDismissUI:
-    (ChromeCoordinator*)coordinator {
-  if (!self.nextToolbarCoordinator) {
-    return;
-  }
-  if (self.nextToolbarCoordinator == self.findBarCoordinator) {
-    dispatch_async(dispatch_get_main_queue(), ^{
-      [self openFindInPage];
-    });
-    self.nextToolbarCoordinator = nil;
-  } else if (self.nextToolbarCoordinator == self.textZoomCoordinator) {
-    dispatch_async(dispatch_get_main_queue(), ^{
-      [self showTextZoom];
-    });
-    self.nextToolbarCoordinator = nil;
-  }
-}
-
 #pragma mark - Toolbar Accessory Methods
 
 - (ToolbarAccessoryPresenter*)toolbarAccessoryPresenter {
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm
index 1eaf821..58ebfb81 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm
@@ -29,7 +29,9 @@
 #import "ios/chrome/browser/ui/browser_view/key_commands_provider.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
+#import "ios/chrome/browser/ui/commands/find_in_page_commands.h"
 #import "ios/chrome/browser/ui/commands/page_info_commands.h"
+#import "ios/chrome/browser/ui/commands/text_zoom_commands.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #include "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h"
 #include "ios/chrome/browser/web_state_list/web_state_list.h"
@@ -136,6 +138,17 @@
     SessionRestorationBrowserAgent::CreateForBrowser(
         browser_.get(), [[TestSessionService alloc] init]);
 
+    id mockFindInPageCommandHandler =
+        OCMProtocolMock(@protocol(FindInPageCommands));
+    [browser_->GetCommandDispatcher()
+        startDispatchingToTarget:mockFindInPageCommandHandler
+                     forProtocol:@protocol(FindInPageCommands)];
+    id mockTextZoomCommandHandler =
+        OCMProtocolMock(@protocol(TextZoomCommands));
+    [browser_->GetCommandDispatcher()
+        startDispatchingToTarget:mockTextZoomCommandHandler
+                     forProtocol:@protocol(TextZoomCommands)];
+
     // Create three web states.
     for (int i = 0; i < 3; i++) {
       web::WebState::CreateParams params(chrome_browser_state_.get());
diff --git a/ios/chrome/browser/ui/bubble/BUILD.gn b/ios/chrome/browser/ui/bubble/BUILD.gn
index a3b527d7..d447472 100644
--- a/ios/chrome/browser/ui/bubble/BUILD.gn
+++ b/ios/chrome/browser/ui/bubble/BUILD.gn
@@ -30,7 +30,7 @@
     "//ios/chrome/browser/ui/toolbar/public:feature_flags",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/third_party/material_components_ios",
     "//net",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/bubble/bubble_view.mm b/ios/chrome/browser/ui/bubble/bubble_view.mm
index c741607b..250234e 100644
--- a/ios/chrome/browser/ui/bubble/bubble_view.mm
+++ b/ios/chrome/browser/ui/bubble/bubble_view.mm
@@ -9,7 +9,7 @@
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #include "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/collection_view/BUILD.gn b/ios/chrome/browser/ui/collection_view/BUILD.gn
index 7e652d94..51ea6c1 100644
--- a/ios/chrome/browser/ui/collection_view/BUILD.gn
+++ b/ios/chrome/browser/ui/collection_view/BUILD.gn
@@ -14,7 +14,7 @@
     "//base",
     "//ios/chrome/browser/ui/list_model",
     "//ios/chrome/browser/ui/material_components",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
   ]
   public_deps = [
     "//ios/chrome/browser/ui/collection_view/cells",
diff --git a/ios/chrome/browser/ui/collection_view/cells/BUILD.gn b/ios/chrome/browser/ui/collection_view/cells/BUILD.gn
index 00c7bea..3b8a5931 100644
--- a/ios/chrome/browser/ui/collection_view/cells/BUILD.gn
+++ b/ios/chrome/browser/ui/collection_view/cells/BUILD.gn
@@ -29,7 +29,7 @@
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ui/base",
     "//url",
diff --git a/ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.mm b/ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.mm
index 3d277dd..a6119f5 100644
--- a/ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.mm
+++ b/ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.mm
@@ -5,7 +5,7 @@
 #import "ios/chrome/browser/ui/collection_view/cells/MDCCollectionViewCell+Chrome.h"
 
 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.mm b/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.mm
index 7f8f933..24e3ffc 100644
--- a/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.mm
+++ b/ios/chrome/browser/ui/collection_view/cells/collection_view_account_item.mm
@@ -9,8 +9,8 @@
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.mm b/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.mm
index 77809d45..6a9b8c3 100644
--- a/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.mm
+++ b/ios/chrome/browser/ui/collection_view/cells/collection_view_footer_item.mm
@@ -7,9 +7,9 @@
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/util/label_link_controller.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #import "ios/chrome/common/string_util.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/collection_view/cells/collection_view_switch_item.mm b/ios/chrome/browser/ui/collection_view/cells/collection_view_switch_item.mm
index 1c14626..7aaad74 100644
--- a/ios/chrome/browser/ui/collection_view/cells/collection_view_switch_item.mm
+++ b/ios/chrome/browser/ui/collection_view/cells/collection_view_switch_item.mm
@@ -5,7 +5,7 @@
 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_switch_item.h"
 
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
 #include "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/collection_view/collection_view_controller.mm b/ios/chrome/browser/ui/collection_view/collection_view_controller.mm
index 53d9c49..6d5e741 100644
--- a/ios/chrome/browser/ui/collection_view/collection_view_controller.mm
+++ b/ios/chrome/browser/ui/collection_view/collection_view_controller.mm
@@ -11,7 +11,7 @@
 #import "ios/chrome/browser/ui/collection_view/collection_view_model.h"
 #import "ios/chrome/browser/ui/material_components/chrome_app_bar_view_controller.h"
 #import "ios/chrome/browser/ui/material_components/utils.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #import "ios/third_party/material_components_ios/src/components/CollectionCells/src/MaterialCollectionCells.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/content_suggestions/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
index 3acc2c1..27134ddc 100644
--- a/ios/chrome/browser/ui/content_suggestions/BUILD.gn
+++ b/ios/chrome/browser/ui/content_suggestions/BUILD.gn
@@ -144,7 +144,7 @@
     "//ios/chrome/browser/ui/toolbar/buttons",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/util:util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/favicon",
     "//ios/chrome/common/ui/util",
     "//ios/web/common",
@@ -159,7 +159,7 @@
     "ntp_home_constant.h",
     "ntp_home_constant.mm",
   ]
-  deps = [ "//ios/chrome/common/colors" ]
+  deps = [ "//ios/chrome/common/ui/colors" ]
   configs += [ "//build/config/compiler:enable_arc" ]
 }
 
@@ -181,7 +181,7 @@
     "//ios/chrome/browser/ui/ntp_tile_views:constants",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/third_party/material_components_ios",
     "//ios/web/common",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn b/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn
index 29a80e0..27201983 100644
--- a/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn
+++ b/ios/chrome/browser/ui/content_suggestions/cells/BUILD.gn
@@ -64,7 +64,7 @@
     "//ios/chrome/browser/ui/ntp_tile_views:constants",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/favicon",
     "//ios/chrome/common/ui/util",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_articles_header_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_articles_header_item.mm
index c421806..6a14926d 100644
--- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_articles_header_item.mm
+++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_articles_header_item.mm
@@ -5,8 +5,8 @@
 #import "ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_articles_header_item.h"
 
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cell.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cell.mm
index bf6a2d2..1e5ccfb 100644
--- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cell.mm
+++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_cell.mm
@@ -8,7 +8,7 @@
 #import "ios/chrome/browser/ui/util/i18n_string.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/favicon/favicon_view.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_footer_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_footer_item.mm
index 218f778..b4573c1 100644
--- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_footer_item.mm
+++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_footer_item.mm
@@ -6,7 +6,7 @@
 
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #import "ios/third_party/material_components_ios/src/components/ActivityIndicator/src/MaterialActivityIndicator.h"
 
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_learn_more_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_learn_more_item.mm
index 8ab3c86..511c315 100644
--- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_learn_more_item.mm
+++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_learn_more_item.mm
@@ -7,8 +7,8 @@
 #include "base/logging.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #include "ios/chrome/common/string_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/third_party/material_components_ios/src/components/Palettes/src/MaterialPalettes.h"
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.mm
index 7a5ad32..3480969 100644
--- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.mm
+++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_text_item.mm
@@ -6,7 +6,7 @@
 
 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_text_cell.h"
 #import "ios/chrome/browser/ui/content_suggestions/identifier/content_suggestion_identifier.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.mm b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.mm
index 6dfd6d05..297fbf6 100644
--- a/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.mm
+++ b/ios/chrome/browser/ui/content_suggestions/cells/content_suggestions_whats_new_item.mm
@@ -6,8 +6,8 @@
 
 #include "base/logging.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #include "ios/chrome/common/string_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
 
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.mm
index 73851642b..e552df2b 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_collection_utils.mm
@@ -15,7 +15,7 @@
 #include "ios/chrome/browser/ui/util/dynamic_type_util.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.mm
index 48ce46c..2084917 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view.mm
@@ -24,7 +24,7 @@
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #import "ios/chrome/browser/ui/util/named_guide_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ui/base/l10n/l10n_util.h"
 #import "ui/gfx/ios/NSString+CrStringDrawing.h"
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
index 4eb846e0..b39d1ab9 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.mm
@@ -28,8 +28,8 @@
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_utils.h"
 #import "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_constant.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_constant.mm
index b3d217c..5baa412 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_constant.mm
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_constant.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h"
 
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/download/BUILD.gn b/ios/chrome/browser/ui/download/BUILD.gn
index c8ce8ef..7af83c4 100644
--- a/ios/chrome/browser/ui/download/BUILD.gn
+++ b/ios/chrome/browser/ui/download/BUILD.gn
@@ -48,7 +48,7 @@
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/web:web_internal",
     "//ios/chrome/browser/web_state_list:web_state_list",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/images",
diff --git a/ios/chrome/browser/ui/download/download_manager_view_controller.mm b/ios/chrome/browser/ui/download/download_manager_view_controller.mm
index 73b17ba..f6b9bca 100644
--- a/ios/chrome/browser/ui/download/download_manager_view_controller.mm
+++ b/ios/chrome/browser/ui/download/download_manager_view_controller.mm
@@ -12,7 +12,7 @@
 #include "ios/chrome/browser/ui/download/download_manager_animation_constants.h"
 #import "ios/chrome/browser/ui/download/download_manager_state_view.h"
 #import "ios/chrome/browser/ui/download/radial_progress_view.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
diff --git a/ios/chrome/browser/ui/download/radial_progress_view.mm b/ios/chrome/browser/ui/download/radial_progress_view.mm
index 0d14013..29001868 100644
--- a/ios/chrome/browser/ui/download/radial_progress_view.mm
+++ b/ios/chrome/browser/ui/download/radial_progress_view.mm
@@ -7,7 +7,7 @@
 #import <QuartzCore/QuartzCore.h>
 
 #include "base/mac/foundation_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_dynamic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_dynamic_colors.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/elements/BUILD.gn b/ios/chrome/browser/ui/elements/BUILD.gn
index 93e2645..27a065f 100644
--- a/ios/chrome/browser/ui/elements/BUILD.gn
+++ b/ios/chrome/browser/ui/elements/BUILD.gn
@@ -26,7 +26,7 @@
   deps = [
     "//base",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
   ]
 }
 
@@ -42,7 +42,7 @@
     "//ios/chrome/browser",
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
   ]
 }
 
@@ -88,7 +88,7 @@
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
     "//ios/chrome/browser/ui/material_components",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/third_party/material_components_ios",
   ]
diff --git a/ios/chrome/browser/ui/elements/chrome_activity_overlay_view_controller.mm b/ios/chrome/browser/ui/elements/chrome_activity_overlay_view_controller.mm
index bced3888..874ca7c 100644
--- a/ios/chrome/browser/ui/elements/chrome_activity_overlay_view_controller.mm
+++ b/ios/chrome/browser/ui/elements/chrome_activity_overlay_view_controller.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/elements/chrome_activity_overlay_view_controller.h"
 
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/elements/gray_highlight_button.mm b/ios/chrome/browser/ui/elements/gray_highlight_button.mm
index 352476c..2affe411 100644
--- a/ios/chrome/browser/ui/elements/gray_highlight_button.mm
+++ b/ios/chrome/browser/ui/elements/gray_highlight_button.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/elements/gray_highlight_button.h"
 
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/fancy_ui/BUILD.gn b/ios/chrome/browser/ui/fancy_ui/BUILD.gn
index 755b000a2..cf0070c1 100644
--- a/ios/chrome/browser/ui/fancy_ui/BUILD.gn
+++ b/ios/chrome/browser/ui/fancy_ui/BUILD.gn
@@ -14,7 +14,7 @@
     "//base",
     "//base:i18n",
     "//ios/chrome/browser/ui/colors",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
   ]
   public_deps = [ "//ios/third_party/material_components_ios" ]
   libs = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/fancy_ui/primary_action_button.mm b/ios/chrome/browser/ui/fancy_ui/primary_action_button.mm
index d64dbc47..f197263 100644
--- a/ios/chrome/browser/ui/fancy_ui/primary_action_button.mm
+++ b/ios/chrome/browser/ui/fancy_ui/primary_action_button.mm
@@ -5,8 +5,8 @@
 #import "ios/chrome/browser/ui/fancy_ui/primary_action_button.h"
 
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/find_bar/BUILD.gn b/ios/chrome/browser/ui/find_bar/BUILD.gn
index 2b9f63c..f59a2f0 100644
--- a/ios/chrome/browser/ui/find_bar/BUILD.gn
+++ b/ios/chrome/browser/ui/find_bar/BUILD.gn
@@ -36,7 +36,7 @@
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/web_state_list",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/third_party/material_components_ios",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.mm b/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.mm
index e4a46e1..a961237 100644
--- a/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.mm
+++ b/ios/chrome/browser/ui/find_bar/find_bar_controller_ios.mm
@@ -22,8 +22,8 @@
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 #include "ui/base/resource/resource_bundle.h"
diff --git a/ios/chrome/browser/ui/find_bar/find_bar_coordinator.h b/ios/chrome/browser/ui/find_bar/find_bar_coordinator.h
index 313a233..9e7150bc 100644
--- a/ios/chrome/browser/ui/find_bar/find_bar_coordinator.h
+++ b/ios/chrome/browser/ui/find_bar/find_bar_coordinator.h
@@ -12,6 +12,12 @@
 @class ToolbarAccessoryPresenter;
 @protocol ToolbarAccessoryCoordinatorDelegate;
 
+@protocol FindBarPresentationDelegate
+
+- (void)setHeadersForFindBarCoordinator:(FindBarCoordinator*)findBarCoordinator;
+
+@end
+
 // Coordinator for the Find Bar and the Find In page feature. Currently, this
 // is mostly a collection of code extracted from BrowserViewController and not
 // a good example of the ideal coordinator architecture.
@@ -22,6 +28,8 @@
 
 @property(nonatomic, weak) id<ToolbarAccessoryCoordinatorDelegate> delegate;
 
+@property(nonatomic, weak) id<FindBarPresentationDelegate> presentationDelegate;
+
 // Find bar controller object. This should probably be private, but is not to
 // make the transition easier.
 @property(nonatomic, strong) FindBarControllerIOS* findBarController;
diff --git a/ios/chrome/browser/ui/find_bar/find_bar_coordinator.mm b/ios/chrome/browser/ui/find_bar/find_bar_coordinator.mm
index 4bb11b0..08bc60d5 100644
--- a/ios/chrome/browser/ui/find_bar/find_bar_coordinator.mm
+++ b/ios/chrome/browser/ui/find_bar/find_bar_coordinator.mm
@@ -77,8 +77,6 @@
   }
   [self.findBarController findBarViewWillHide];
   [self.presenter dismissAnimated:animated];
-
-  self.mediator = nil;
 }
 
 - (void)showAnimated:(BOOL)animated shouldFocus:(BOOL)shouldFocus {
@@ -99,7 +97,7 @@
   if (!self.browserState->IsOffTheRecord()) {
     helper->RestoreSearchTerm();
   }
-  [self.delegate setHeadersForToolbarAccessoryCoordinator:self];
+  [self.presentationDelegate setHeadersForFindBarCoordinator:self];
   [self.findBarController updateView:helper->GetFindResult()
                        initialUpdate:YES
                       focusTextfield:shouldFocus];
diff --git a/ios/chrome/browser/ui/find_bar/find_bar_view.mm b/ios/chrome/browser/ui/find_bar/find_bar_view.mm
index 1651ad1..f690e44 100644
--- a/ios/chrome/browser/ui/find_bar/find_bar_view.mm
+++ b/ios/chrome/browser/ui/find_bar/find_bar_view.mm
@@ -8,9 +8,9 @@
 #import "ios/chrome/browser/ui/find_bar/find_bar_constants.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
@@ -110,7 +110,6 @@
     [self.inputField.leadingAnchor
         constraintEqualToAnchor:safeArea.leadingAnchor
                        constant:kPadding],
-
     [self.inputField.trailingAnchor
         constraintEqualToAnchor:self.previousButton.leadingAnchor
                        constant:-kPadding],
diff --git a/ios/chrome/browser/ui/first_run/BUILD.gn b/ios/chrome/browser/ui/first_run/BUILD.gn
index 8b5eb4e..00433ee 100644
--- a/ios/chrome/browser/ui/first_run/BUILD.gn
+++ b/ios/chrome/browser/ui/first_run/BUILD.gn
@@ -48,7 +48,7 @@
     "//ios/chrome/browser/ui/util:terms_util",
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/signin",
     "//ios/third_party/material_components_ios",
diff --git a/ios/chrome/browser/ui/first_run/first_run_chrome_signin_view_controller.mm b/ios/chrome/browser/ui/first_run/first_run_chrome_signin_view_controller.mm
index f7f87c5..16e02930c 100644
--- a/ios/chrome/browser/ui/first_run/first_run_chrome_signin_view_controller.mm
+++ b/ios/chrome/browser/ui/first_run/first_run_chrome_signin_view_controller.mm
@@ -17,7 +17,7 @@
 #import "ios/chrome/browser/ui/promos/signin_promo_view_controller.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
 #import "ios/public/provider/chrome/browser/signin/chrome_identity.h"
diff --git a/ios/chrome/browser/ui/first_run/first_run_egtest.mm b/ios/chrome/browser/ui/first_run/first_run_egtest.mm
index b0ece23..97b52df 100644
--- a/ios/chrome/browser/ui/first_run/first_run_egtest.mm
+++ b/ios/chrome/browser/ui/first_run/first_run_egtest.mm
@@ -119,7 +119,9 @@
 }
 
 // Dismisses the first run screens.
-- (void)testDismissFirstRun {
+// TODO(crbug.com/1055457): Re-enable after updating tests. Button has
+// unexpected text.
+- (void)DISABLED_testDismissFirstRun {
   [FirstRunAppInterface showFirstRunUI];
 
   [[EarlGrey selectElementWithMatcher:FirstRunOptInAcceptButton()]
diff --git a/ios/chrome/browser/ui/first_run/static_file_view_controller.mm b/ios/chrome/browser/ui/first_run/static_file_view_controller.mm
index 51a17df..5464ae3 100644
--- a/ios/chrome/browser/ui/first_run/static_file_view_controller.mm
+++ b/ios/chrome/browser/ui/first_run/static_file_view_controller.mm
@@ -11,7 +11,7 @@
 #import "ios/chrome/browser/ui/icons/chrome_icon.h"
 #import "ios/chrome/browser/ui/material_components/utils.h"
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #import "ios/third_party/material_components_ios/src/components/AppBar/src/MDCAppBarViewController.h"
 #import "ios/web/common/web_view_creation_util.h"
 
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 d9a85af..6e6c66f 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
@@ -14,8 +14,8 @@
 #import "ios/chrome/browser/ui/util/label_observer.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #include "ios/chrome/common/string_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
diff --git a/ios/chrome/browser/ui/history/history_table_view_controller.mm b/ios/chrome/browser/ui/history/history_table_view_controller.mm
index b2261e8..625f111f 100644
--- a/ios/chrome/browser/ui/history/history_table_view_controller.mm
+++ b/ios/chrome/browser/ui/history/history_table_view_controller.mm
@@ -36,8 +36,8 @@
 #import "ios/chrome/browser/url_loading/url_loading_params.h"
 #import "ios/chrome/browser/url_loading/url_loading_service.h"
 #import "ios/chrome/browser/url_loading/url_loading_service_factory.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/favicon/favicon_view.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/ui/infobars/BUILD.gn b/ios/chrome/browser/ui/infobars/BUILD.gn
index 1888dde..1eb4931 100644
--- a/ios/chrome/browser/ui/infobars/BUILD.gn
+++ b/ios/chrome/browser/ui/infobars/BUILD.gn
@@ -89,7 +89,7 @@
     "//ios/chrome/browser/ui/fullscreen:ui",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/public/provider/chrome/browser/ui",
     "//ios/third_party/material_components_ios",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/infobars/banners/BUILD.gn b/ios/chrome/browser/ui/infobars/banners/BUILD.gn
index b662089..5ffff7d 100644
--- a/ios/chrome/browser/ui/infobars/banners/BUILD.gn
+++ b/ios/chrome/browser/ui/infobars/banners/BUILD.gn
@@ -18,7 +18,7 @@
     "//ios/chrome/app/strings:ios_strings_grit",
     "//ios/chrome/browser/infobars:public",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ui/base",
   ]
 }
diff --git a/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller.mm b/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller.mm
index a668448..080baf78 100644
--- a/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller.mm
+++ b/ios/chrome/browser/ui/infobars/banners/infobar_banner_view_controller.mm
@@ -11,7 +11,7 @@
 #import "ios/chrome/browser/ui/infobars/banners/infobar_banner_constants.h"
 #import "ios/chrome/browser/ui/infobars/banners/infobar_banner_delegate.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/browser/ui/infobars/confirm_infobar_view.mm b/ios/chrome/browser/ui/infobars/confirm_infobar_view.mm
index a1b16868..19f4aadc 100644
--- a/ios/chrome/browser/ui/infobars/confirm_infobar_view.mm
+++ b/ios/chrome/browser/ui/infobars/confirm_infobar_view.mm
@@ -19,7 +19,7 @@
 #import "ios/chrome/browser/ui/util/label_link_controller.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_theme_resources.h"
 #import "ios/third_party/material_components_ios/src/components/Buttons/src/MaterialButtons.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/infobars/modals/infobar_modal_view_controller.mm b/ios/chrome/browser/ui/infobars/modals/infobar_modal_view_controller.mm
index 37eaeb52..74c1bd7 100644
--- a/ios/chrome/browser/ui/infobars/modals/infobar_modal_view_controller.mm
+++ b/ios/chrome/browser/ui/infobars/modals/infobar_modal_view_controller.mm
@@ -6,7 +6,7 @@
 
 #import "ios/chrome/browser/ui/infobars/modals/infobar_modal_constants.h"
 #import "ios/chrome/browser/ui/infobars/modals/infobar_modal_delegate.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/infobars/modals/infobar_password_table_view_controller.mm b/ios/chrome/browser/ui/infobars/modals/infobar_password_table_view_controller.mm
index af91e2f..8d39fbd 100644
--- a/ios/chrome/browser/ui/infobars/modals/infobar_password_table_view_controller.mm
+++ b/ios/chrome/browser/ui/infobars/modals/infobar_password_table_view_controller.mm
@@ -17,7 +17,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_edit_item.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/browser/ui/infobars/modals/infobar_save_card_table_view_controller.mm b/ios/chrome/browser/ui/infobars/modals/infobar_save_card_table_view_controller.mm
index 89d598d..4177e79 100644
--- a/ios/chrome/browser/ui/infobars/modals/infobar_save_card_table_view_controller.mm
+++ b/ios/chrome/browser/ui/infobars/modals/infobar_save_card_table_view_controller.mm
@@ -17,7 +17,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_edit_item.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_link_item.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "url/gurl.h"
diff --git a/ios/chrome/browser/ui/infobars/modals/infobar_translate_language_selection_table_view_controller.mm b/ios/chrome/browser/ui/infobars/modals/infobar_translate_language_selection_table_view_controller.mm
index 6dfc40f1..9dcdac3 100644
--- a/ios/chrome/browser/ui/infobars/modals/infobar_translate_language_selection_table_view_controller.mm
+++ b/ios/chrome/browser/ui/infobars/modals/infobar_translate_language_selection_table_view_controller.mm
@@ -11,7 +11,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_item.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/infobars/modals/infobar_translate_table_view_controller.mm b/ios/chrome/browser/ui/infobars/modals/infobar_translate_table_view_controller.mm
index 14ea6b15..6dab48a 100644
--- a/ios/chrome/browser/ui/infobars/modals/infobar_translate_table_view_controller.mm
+++ b/ios/chrome/browser/ui/infobars/modals/infobar_translate_table_view_controller.mm
@@ -14,7 +14,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_edit_item.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_item.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/browser/ui/infobars/presentation/BUILD.gn b/ios/chrome/browser/ui/infobars/presentation/BUILD.gn
index 7d31a0a..930121b 100644
--- a/ios/chrome/browser/ui/infobars/presentation/BUILD.gn
+++ b/ios/chrome/browser/ui/infobars/presentation/BUILD.gn
@@ -24,6 +24,6 @@
     "//base",
     "//ios/chrome/browser/ui/infobars/banners:public",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
   ]
 }
diff --git a/ios/chrome/browser/ui/infobars/presentation/infobar_modal_presentation_controller.mm b/ios/chrome/browser/ui/infobars/presentation/infobar_modal_presentation_controller.mm
index c9f416ca..48a7e67d 100644
--- a/ios/chrome/browser/ui/infobars/presentation/infobar_modal_presentation_controller.mm
+++ b/ios/chrome/browser/ui/infobars/presentation/infobar_modal_presentation_controller.mm
@@ -7,7 +7,7 @@
 #include "base/logging.h"
 #import "ios/chrome/browser/ui/infobars/presentation/infobar_modal_positioner.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/location_bar/BUILD.gn b/ios/chrome/browser/ui/location_bar/BUILD.gn
index 8cda3ee..18bcb57 100644
--- a/ios/chrome/browser/ui/location_bar/BUILD.gn
+++ b/ios/chrome/browser/ui/location_bar/BUILD.gn
@@ -73,7 +73,7 @@
     "//ios/chrome/browser/web",
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/common:timing",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/public/provider/chrome/browser:browser",
     "//ios/public/provider/chrome/browser/voice",
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm b/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm
index 46d72db..a97cac924 100644
--- a/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm
+++ b/ios/chrome/browser/ui/location_bar/location_bar_coordinator.mm
@@ -168,8 +168,6 @@
 
   self.omniboxPopupCoordinator = [self.omniboxCoordinator
       createPopupCoordinator:self.popupPresenterDelegate];
-  self.omniboxPopupCoordinator.dispatcher = self.dispatcher;
-  self.omniboxPopupCoordinator.webStateList = self.webStateList;
   [self.omniboxPopupCoordinator start];
 
   // Create button factory that wil be used by the ViewController to get
diff --git a/ios/chrome/browser/ui/location_bar/location_bar_steady_view.mm b/ios/chrome/browser/ui/location_bar/location_bar_steady_view.mm
index 85aae8f..1b938c0 100644
--- a/ios/chrome/browser/ui/location_bar/location_bar_steady_view.mm
+++ b/ios/chrome/browser/ui/location_bar/location_bar_steady_view.mm
@@ -11,7 +11,7 @@
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h"
 #import "ios/chrome/browser/ui/util/dynamic_type_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/material_components/BUILD.gn b/ios/chrome/browser/ui/material_components/BUILD.gn
index 391c14e..07f22df 100644
--- a/ios/chrome/browser/ui/material_components/BUILD.gn
+++ b/ios/chrome/browser/ui/material_components/BUILD.gn
@@ -17,7 +17,7 @@
     "//base",
     "//build:branding_buildflags",
     "//ios/chrome/browser/ui/colors",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/third_party/material_components_ios",
   ]
   libs = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/ui/material_components/utils.mm b/ios/chrome/browser/ui/material_components/utils.mm
index 6033711..b54b22d 100644
--- a/ios/chrome/browser/ui/material_components/utils.mm
+++ b/ios/chrome/browser/ui/material_components/utils.mm
@@ -7,7 +7,7 @@
 #import <UIKit/UIKit.h>
 
 #include "base/mac/foundation_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #import "ios/third_party/material_components_ios/src/components/AppBar/src/MDCAppBarContainerViewController.h"
 #import "ios/third_party/material_components_ios/src/components/AppBar/src/MaterialAppBar.h"
 #import "ios/third_party/material_components_ios/src/components/FlexibleHeader/src/MaterialFlexibleHeader.h"
diff --git a/ios/chrome/browser/ui/ntp/BUILD.gn b/ios/chrome/browser/ui/ntp/BUILD.gn
index 1c49da3..faf43e5 100644
--- a/ios/chrome/browser/ui/ntp/BUILD.gn
+++ b/ios/chrome/browser/ui/ntp/BUILD.gn
@@ -111,8 +111,8 @@
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/common",
     "//ios/chrome/common/app_group",
-    "//ios/chrome/common/colors",
     "//ios/chrome/common/ntp_tile",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/favicon",
     "//ios/chrome/common/ui/util",
     "//ios/public/provider/chrome/browser",
diff --git a/ios/chrome/browser/ui/ntp/incognito_view.mm b/ios/chrome/browser/ui/ntp/incognito_view.mm
index 642c4ceb..6eac9616 100644
--- a/ios/chrome/browser/ui/ntp/incognito_view.mm
+++ b/ios/chrome/browser/ui/ntp/incognito_view.mm
@@ -14,9 +14,9 @@
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/url_loading/url_loading_params.h"
 #import "ios/chrome/browser/url_loading/url_loading_service.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #import "ios/chrome/common/string_util.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #import "ios/web/public/navigation/navigation_manager.h"
 #include "ios/web/public/navigation/referrer.h"
diff --git a/ios/chrome/browser/ui/ntp/incognito_view_controller.mm b/ios/chrome/browser/ui/ntp/incognito_view_controller.mm
index d5bb512..a0dc7750 100644
--- a/ios/chrome/browser/ui/ntp/incognito_view_controller.mm
+++ b/ios/chrome/browser/ui/ntp/incognito_view_controller.mm
@@ -11,8 +11,8 @@
 #import "ios/chrome/browser/ui/ntp/incognito_view.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/url_loading/url_loading_service.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/ntp_tile_views/BUILD.gn b/ios/chrome/browser/ui/ntp_tile_views/BUILD.gn
index 76e768bb..f5e179b 100644
--- a/ios/chrome/browser/ui/ntp_tile_views/BUILD.gn
+++ b/ios/chrome/browser/ui/ntp_tile_views/BUILD.gn
@@ -23,7 +23,7 @@
     "resources:ntp_recent_icon",
     "//base",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/favicon",
     "//ios/chrome/common/ui/util",
     "//ios/chrome/common/ui/util:dynamic_type_util",
diff --git a/ios/chrome/browser/ui/ntp_tile_views/ntp_shortcut_tile_view.mm b/ios/chrome/browser/ui/ntp_tile_views/ntp_shortcut_tile_view.mm
index 469a3bf..e61e4c4 100644
--- a/ios/chrome/browser/ui/ntp_tile_views/ntp_shortcut_tile_view.mm
+++ b/ios/chrome/browser/ui/ntp_tile_views/ntp_shortcut_tile_view.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/browser/ui/ntp_tile_views/ntp_shortcut_tile_view.h"
 
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
 
diff --git a/ios/chrome/browser/ui/ntp_tile_views/ntp_tile_view.mm b/ios/chrome/browser/ui/ntp_tile_views/ntp_tile_view.mm
index af02261..a25aa981 100644
--- a/ios/chrome/browser/ui/ntp_tile_views/ntp_tile_view.mm
+++ b/ios/chrome/browser/ui/ntp_tile_views/ntp_tile_view.mm
@@ -5,8 +5,8 @@
 #import "ios/chrome/browser/ui/ntp_tile_views/ntp_tile_view.h"
 
 #import "ios/chrome/browser/ui/util/dynamic_type_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/common/ui/util/dynamic_type_util.h"
 
diff --git a/ios/chrome/browser/ui/omnibox/BUILD.gn b/ios/chrome/browser/ui/omnibox/BUILD.gn
index 69d1e89..9c9bc40 100644
--- a/ios/chrome/browser/ui/omnibox/BUILD.gn
+++ b/ios/chrome/browser/ui/omnibox/BUILD.gn
@@ -161,7 +161,7 @@
     "//ios/chrome/browser/ui/toolbar/public:feature_flags",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/favicon",
     "//ios/chrome/common/ui/util:dynamic_type_util",
     "//ios/public/provider/chrome/browser",
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm b/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm
index 38b3597b..e7b2f1f 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm
@@ -161,9 +161,10 @@
   _editView->model()->set_popup_model(popupView->model());
   _editView->SetPopupProvider(popupView.get());
 
-  OmniboxPopupCoordinator* coordinator =
-      [[OmniboxPopupCoordinator alloc] initWithPopupView:std::move(popupView)];
-  coordinator.browserState = self.browser->GetBrowserState();
+  OmniboxPopupCoordinator* coordinator = [[OmniboxPopupCoordinator alloc]
+      initWithBaseViewController:nil
+                         browser:self.browser
+                       popupView:std::move(popupView)];
   coordinator.presenterDelegate = presenterDelegate;
 
   return coordinator;
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm b/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm
index 1d8d3c27..1a9c921f 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.mm
@@ -27,8 +27,8 @@
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #import "ios/chrome/common/material_timing.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/common/ui/util/dynamic_type_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/chrome/grit/ios_theme_resources.h"
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_view_controller.mm b/ios/chrome/browser/ui/omnibox/omnibox_view_controller.mm
index f9b32b9..7d2cdb9 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_view_controller.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_view_controller.mm
@@ -21,8 +21,8 @@
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #include "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/browser/ui/omnibox/popup/BUILD.gn b/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
index e5f9064..690d0a6 100644
--- a/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
+++ b/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
@@ -27,9 +27,11 @@
     "//ios/chrome/browser",
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/favicon",
+    "//ios/chrome/browser/main:public",
     "//ios/chrome/browser/search_engines",
     "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/browser/ui/commands",
+    "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
     "//ios/chrome/browser/ui/ntp:util",
     "//ios/chrome/browser/ui/omnibox:omnibox_util",
     "//ios/chrome/browser/ui/toolbar/buttons",
@@ -37,7 +39,7 @@
     "//ios/chrome/browser/ui/toolbar/public:feature_flags",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/web_state_list:web_state_list",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/favicon",
     "//ios/chrome/common/ui/util",
     "//ios/web/public:public",
@@ -94,7 +96,7 @@
     "//ios/chrome/browser/ui/toolbar/buttons",
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/images",
@@ -120,7 +122,7 @@
     "//ios/chrome/browser/ui/colors",
     "//ios/chrome/browser/ui/omnibox:omnibox_util",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/third_party/material_components_ios",
   ]
   configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/chrome/browser/ui/omnibox/popup/autocomplete_match_formatter.mm b/ios/chrome/browser/ui/omnibox/popup/autocomplete_match_formatter.mm
index 53fba95..8dcfd7c 100644
--- a/ios/chrome/browser/ui/omnibox/popup/autocomplete_match_formatter.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/autocomplete_match_formatter.mm
@@ -14,9 +14,9 @@
 #import "ios/chrome/browser/ui/omnibox/popup/omnibox_icon_formatter.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_coordinator.h b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_coordinator.h
index 28e4946..77b8e90 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_coordinator.h
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_coordinator.h
@@ -5,39 +5,39 @@
 #ifndef IOS_CHROME_BROWSER_UI_OMNIBOX_POPUP_OMNIBOX_POPUP_COORDINATOR_H_
 #define IOS_CHROME_BROWSER_UI_OMNIBOX_POPUP_OMNIBOX_POPUP_COORDINATOR_H_
 
-#import <UIKit/UIKit.h>
+#import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
 
 #include <memory>
 
-class ChromeBrowserState;
-@class CommandDispatcher;
 @protocol OmniboxPopupPresenterDelegate;
 @protocol OmniboxFocuser;
 class OmniboxPopupViewIOS;
-class WebStateList;
 
 // Coordinator for the Omnibox Popup.
-@interface OmniboxPopupCoordinator : NSObject
+@interface OmniboxPopupCoordinator : ChromeCoordinator
 
-- (instancetype)initWithPopupView:
-    (std::unique_ptr<OmniboxPopupViewIOS>)popupView NS_DESIGNATED_INITIALIZER;
-- (instancetype)init NS_UNAVAILABLE;
+- (instancetype)
+    initWithBaseViewController:(UIViewController*)viewController
+                       browser:(Browser*)browser
+                     popupView:(std::unique_ptr<OmniboxPopupViewIOS>)popupView
+    NS_DESIGNATED_INITIALIZER;
 
-// BrowserState.
-@property(nonatomic, assign) ChromeBrowserState* browserState;
+- (instancetype)initWithBaseViewController:(UIViewController*)viewController
+    NS_UNAVAILABLE;
+
+- (instancetype)initWithBaseViewController:(UIViewController*)viewController
+                                   browser:(Browser*)browser NS_UNAVAILABLE;
+
+- (instancetype)initWithBaseViewController:(UIViewController*)viewController
+                              browserState:(ChromeBrowserState*)browserState
+    NS_UNAVAILABLE;
+
 // Positioner for the popup.
 @property(nonatomic, weak) id<OmniboxPopupPresenterDelegate> presenterDelegate;
 // Whether this coordinator has results to show.
 @property(nonatomic, assign, readonly) BOOL hasResults;
 // Whether the popup is open.
 @property(nonatomic, assign, readonly) BOOL isOpen;
-// The dispatcher for this view controller.
-@property(nonatomic, readwrite, weak) CommandDispatcher* dispatcher;
-// The web state list this coordinator is handling.
-@property(nonatomic, assign) WebStateList* webStateList;
-
-- (void)start;
-- (void)stop;
 
 @end
 
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_coordinator.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_coordinator.mm
index 398509f..b1598d44 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_coordinator.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_coordinator.mm
@@ -11,6 +11,7 @@
 #import "components/search_engines/template_url_service.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/favicon/ios_chrome_favicon_loader_factory.h"
+#import "ios/chrome/browser/main/browser.h"
 #include "ios/chrome/browser/search_engines/template_url_service_factory.h"
 #import "ios/chrome/browser/ui/commands/command_dispatcher.h"
 #import "ios/chrome/browser/ui/ntp/ntp_util.h"
@@ -38,16 +39,16 @@
 
 @implementation OmniboxPopupCoordinator
 
-@synthesize browserState = _browserState;
 @synthesize mediator = _mediator;
 @synthesize popupViewController = _popupViewController;
-@synthesize dispatcher = _dispatcher;
 
 #pragma mark - Public
 
-- (instancetype)initWithPopupView:
-    (std::unique_ptr<OmniboxPopupViewIOS>)popupView {
-  self = [super init];
+- (instancetype)
+    initWithBaseViewController:(UIViewController*)viewController
+                       browser:(Browser*)browser
+                     popupView:(std::unique_ptr<OmniboxPopupViewIOS>)popupView {
+  self = [super initWithBaseViewController:nil browser:browser];
   if (self) {
     _popupView = std::move(popupView);
   }
@@ -57,26 +58,31 @@
 - (void)start {
   std::unique_ptr<image_fetcher::IOSImageDataFetcherWrapper> imageFetcher =
       std::make_unique<image_fetcher::IOSImageDataFetcherWrapper>(
-          self.browserState->GetSharedURLLoaderFactory());
+          self.browser->GetBrowserState()->GetSharedURLLoaderFactory());
 
   self.mediator = [[OmniboxPopupMediator alloc]
       initWithFetcher:std::move(imageFetcher)
         faviconLoader:IOSChromeFaviconLoaderFactory::GetForBrowserState(
-                          self.browserState)
+                          self.browser->GetBrowserState())
              delegate:_popupView.get()];
-  self.mediator.dispatcher = (id<BrowserCommands>)self.dispatcher;
-  self.mediator.webStateList = self.webStateList;
+  // TODO(crbug.com/1045047): Use HandlerForProtocol after commands protocol
+  // clean up.
+  self.mediator.dispatcher =
+      static_cast<id<BrowserCommands>>(self.browser->GetCommandDispatcher());
+  self.mediator.webStateList = self.browser->GetWebStateList();
   TemplateURLService* templateURLService =
-      ios::TemplateURLServiceFactory::GetForBrowserState(self.browserState);
+      ios::TemplateURLServiceFactory::GetForBrowserState(
+          self.browser->GetBrowserState());
   self.mediator.defaultSearchEngineIsGoogle =
       templateURLService && templateURLService->GetDefaultSearchProvider() &&
       templateURLService->GetDefaultSearchProvider()->GetEngineType(
           templateURLService->search_terms_data()) == SEARCH_ENGINE_GOOGLE;
 
   self.popupViewController = [[OmniboxPopupViewController alloc] init];
-  self.popupViewController.incognito = self.browserState->IsOffTheRecord();
+  self.popupViewController.incognito =
+      self.browser->GetBrowserState()->IsOffTheRecord();
 
-  BOOL isIncognito = self.browserState->IsOffTheRecord();
+  BOOL isIncognito = self.browser->GetBrowserState()->IsOffTheRecord();
   self.mediator.incognito = isIncognito;
   self.mediator.consumer = self.popupViewController;
   self.mediator.presenter = [[OmniboxPopupPresenter alloc]
@@ -86,7 +92,7 @@
   self.popupViewController.imageRetriever = self.mediator;
   self.popupViewController.faviconRetriever = self.mediator;
   self.popupViewController.delegate = self.mediator;
-  [self.dispatcher
+  [self.browser->GetCommandDispatcher()
       startDispatchingToTarget:self.popupViewController
                    forProtocol:@protocol(OmniboxSuggestionCommands)];
 
@@ -95,7 +101,7 @@
 
 - (void)stop {
   _popupView.reset();
-  [self.dispatcher
+  [self.browser->GetCommandDispatcher()
       stopDispatchingForProtocol:@protocol(OmniboxSuggestionCommands)];
 }
 
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_presenter.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_presenter.mm
index 6cbae41..111b0fa 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_presenter.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_presenter.mm
@@ -10,7 +10,7 @@
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_theme_resources.h"
 #import "ui/gfx/ios/uikit_util.h"
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm
index 6d76426..d4c49a13 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm
@@ -15,8 +15,8 @@
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/chrome/grit/ios_theme_resources.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/omnibox/popup/simple_omnibox_icon.mm b/ios/chrome/browser/ui/omnibox/popup/simple_omnibox_icon.mm
index 5c397f9..1db0123 100644
--- a/ios/chrome/browser/ui/omnibox/popup/simple_omnibox_icon.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/simple_omnibox_icon.mm
@@ -7,8 +7,8 @@
 #import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_suggestion_icon_util.h"
 #import "ios/chrome/browser/ui/ui_feature_flags.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
 #include "ios/public/provider/chrome/browser/images/branded_image_provider.h"
 #import "url/gurl.h"
diff --git a/ios/chrome/browser/ui/open_in/BUILD.gn b/ios/chrome/browser/ui/open_in/BUILD.gn
index 4b457e99..72f37b66 100644
--- a/ios/chrome/browser/ui/open_in/BUILD.gn
+++ b/ios/chrome/browser/ui/open_in/BUILD.gn
@@ -23,7 +23,7 @@
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/web_state_list",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/third_party/material_components_ios",
     "//ios/web/public",
diff --git a/ios/chrome/browser/ui/open_in/open_in_toolbar.mm b/ios/chrome/browser/ui/open_in/open_in_toolbar.mm
index 30d200d..88e3f3e 100644
--- a/ios/chrome/browser/ui/open_in/open_in_toolbar.mm
+++ b/ios/chrome/browser/ui/open_in/open_in_toolbar.mm
@@ -10,7 +10,7 @@
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/third_party/material_components_ios/src/components/Buttons/src/MaterialButtons.h"
diff --git a/ios/chrome/browser/ui/overscroll_actions/BUILD.gn b/ios/chrome/browser/ui/overscroll_actions/BUILD.gn
index 16f783e71..16b576cd 100644
--- a/ios/chrome/browser/ui/overscroll_actions/BUILD.gn
+++ b/ios/chrome/browser/ui/overscroll_actions/BUILD.gn
@@ -32,7 +32,7 @@
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/ui/voice",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/ui",
     "//ios/web/common",
diff --git a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.mm b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.mm
index 95ab2ff22..6ab6f97 100644
--- a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.mm
+++ b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.mm
@@ -12,8 +12,8 @@
 #import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h"
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
 #include "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/chrome/grit/ios_theme_resources.h"
diff --git a/ios/chrome/browser/ui/page_info/BUILD.gn b/ios/chrome/browser/ui/page_info/BUILD.gn
index e46bf92a..0e389d8 100644
--- a/ios/chrome/browser/ui/page_info/BUILD.gn
+++ b/ios/chrome/browser/ui/page_info/BUILD.gn
@@ -29,7 +29,7 @@
     "//ios/chrome/browser/ui/popup_menu",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/web",
     "//ios/web/public/security",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/page_info/legacy_page_info_view_controller.mm b/ios/chrome/browser/ui/page_info/legacy_page_info_view_controller.mm
index 230aaba..1f4f9b1 100644
--- a/ios/chrome/browser/ui/page_info/legacy_page_info_view_controller.mm
+++ b/ios/chrome/browser/ui/page_info/legacy_page_info_view_controller.mm
@@ -21,9 +21,9 @@
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #import "ios/chrome/common/material_timing.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/passwords/BUILD.gn b/ios/chrome/browser/ui/passwords/BUILD.gn
index d22f06f..960f911 100644
--- a/ios/chrome/browser/ui/passwords/BUILD.gn
+++ b/ios/chrome/browser/ui/passwords/BUILD.gn
@@ -28,7 +28,7 @@
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/confirmation_alert",
     "//ios/chrome/common/ui/util",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/passwords/password_breach_learn_more_view_controller.mm b/ios/chrome/browser/ui/passwords/password_breach_learn_more_view_controller.mm
index f409fb5..ebb66ff0 100644
--- a/ios/chrome/browser/ui/passwords/password_breach_learn_more_view_controller.mm
+++ b/ios/chrome/browser/ui/passwords/password_breach_learn_more_view_controller.mm
@@ -6,7 +6,7 @@
 
 #include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/ui/passwords/password_breach_presenter.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/browser/ui/popup_menu/cells/popup_menu_navigation_item.mm b/ios/chrome/browser/ui/popup_menu/cells/popup_menu_navigation_item.mm
index bd6e859..f06e05d0 100644
--- a/ios/chrome/browser/ui/popup_menu/cells/popup_menu_navigation_item.mm
+++ b/ios/chrome/browser/ui/popup_menu/cells/popup_menu_navigation_item.mm
@@ -7,7 +7,7 @@
 #include "base/logging.h"
 #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_ui_constants.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.mm b/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.mm
index fa7e44e..7dabae0 100644
--- a/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.mm
+++ b/ios/chrome/browser/ui/popup_menu/cells/popup_menu_tools_item.mm
@@ -12,8 +12,8 @@
 #import "ios/chrome/browser/ui/reading_list/text_badge_view.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #import "ios/chrome/common/material_timing.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/popup_menu/public/popup_menu_view_controller.mm b/ios/chrome/browser/ui/popup_menu/public/popup_menu_view_controller.mm
index f593b093..165beb7 100644
--- a/ios/chrome/browser/ui/popup_menu/public/popup_menu_view_controller.mm
+++ b/ios/chrome/browser/ui/popup_menu/public/popup_menu_view_controller.mm
@@ -8,7 +8,7 @@
 #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_ui_constants.h"
 #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_view_controller_delegate.h"
 #import "ios/chrome/browser/ui/util/accessibility_close_menu_button.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/promos/BUILD.gn b/ios/chrome/browser/ui/promos/BUILD.gn
index e1356441..145ac7b 100644
--- a/ios/chrome/browser/ui/promos/BUILD.gn
+++ b/ios/chrome/browser/ui/promos/BUILD.gn
@@ -20,7 +20,7 @@
     "//ios/chrome/browser/main",
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/ui/commands",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/signin",
     "//net",
diff --git a/ios/chrome/browser/ui/promos/signin_promo_view_controller.mm b/ios/chrome/browser/ui/promos/signin_promo_view_controller.mm
index ae0f20db..33fc1bda 100644
--- a/ios/chrome/browser/ui/promos/signin_promo_view_controller.mm
+++ b/ios/chrome/browser/ui/promos/signin_promo_view_controller.mm
@@ -17,7 +17,7 @@
 #include "ios/chrome/browser/signin/authentication_service.h"
 #include "ios/chrome/browser/signin/authentication_service_factory.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
 #import "ios/public/provider/chrome/browser/signin/chrome_identity.h"
 #import "ios/public/provider/chrome/browser/signin/chrome_identity_service.h"
diff --git a/ios/chrome/browser/ui/reading_list/BUILD.gn b/ios/chrome/browser/ui/reading_list/BUILD.gn
index c6fcbdd..18abca6 100644
--- a/ios/chrome/browser/ui/reading_list/BUILD.gn
+++ b/ios/chrome/browser/ui/reading_list/BUILD.gn
@@ -118,7 +118,7 @@
     "//ios/chrome/browser/ui/table_view/cells/resources:table_view_cell_check_mark",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/favicon",
     "//ui/base",
     "//ui/strings:ui_strings_grit",
diff --git a/ios/chrome/browser/ui/reading_list/empty_reading_list_message_util.mm b/ios/chrome/browser/ui/reading_list/empty_reading_list_message_util.mm
index 81015f6..43cbea2 100644
--- a/ios/chrome/browser/ui/reading_list/empty_reading_list_message_util.mm
+++ b/ios/chrome/browser/ui/reading_list/empty_reading_list_message_util.mm
@@ -8,7 +8,7 @@
 #include "ios/chrome/browser/system_flags.h"
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_toolbar_button_manager.mm b/ios/chrome/browser/ui/reading_list/reading_list_toolbar_button_manager.mm
index cba43666..ecd4339 100644
--- a/ios/chrome/browser/ui/reading_list/reading_list_toolbar_button_manager.mm
+++ b/ios/chrome/browser/ui/reading_list/reading_list_toolbar_button_manager.mm
@@ -8,7 +8,7 @@
 #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h"
 #import "ios/chrome/browser/ui/reading_list/reading_list_constants.h"
 #import "ios/chrome/browser/ui/reading_list/reading_list_toolbar_button_commands.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
diff --git a/ios/chrome/browser/ui/reading_list/text_badge_view.mm b/ios/chrome/browser/ui/reading_list/text_badge_view.mm
index 7778bd5..544d011 100644
--- a/ios/chrome/browser/ui/reading_list/text_badge_view.mm
+++ b/ios/chrome/browser/ui/reading_list/text_badge_view.mm
@@ -6,7 +6,7 @@
 
 #include "base/logging.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/recent_tabs/BUILD.gn b/ios/chrome/browser/ui/recent_tabs/BUILD.gn
index 7508caad..f8ac7df 100644
--- a/ios/chrome/browser/ui/recent_tabs/BUILD.gn
+++ b/ios/chrome/browser/ui/recent_tabs/BUILD.gn
@@ -89,7 +89,7 @@
     "//ios/chrome/browser/url_loading",
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/browser/web_state_list",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/favicon",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
index 53fc479..19e176f 100644
--- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
+++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
@@ -53,7 +53,7 @@
 #import "ios/chrome/browser/url_loading/url_loading_util.h"
 #include "ios/chrome/browser/web_state_list/web_state_list.h"
 #include "ios/chrome/browser/web_state_list/web_state_opener.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/favicon/favicon_attributes.h"
 #import "ios/chrome/common/ui/favicon/favicon_view.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
diff --git a/ios/chrome/browser/ui/sad_tab/BUILD.gn b/ios/chrome/browser/ui/sad_tab/BUILD.gn
index 24e0085..44ba834 100644
--- a/ios/chrome/browser/ui/sad_tab/BUILD.gn
+++ b/ios/chrome/browser/ui/sad_tab/BUILD.gn
@@ -20,7 +20,7 @@
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/overscroll_actions",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/third_party/material_components_ios",
     "//ios/web",
diff --git a/ios/chrome/browser/ui/sad_tab/sad_tab_view.mm b/ios/chrome/browser/ui/sad_tab/sad_tab_view.mm
index e4e4623..08d2033 100644
--- a/ios/chrome/browser/ui/sad_tab/sad_tab_view.mm
+++ b/ios/chrome/browser/ui/sad_tab/sad_tab_view.mm
@@ -15,7 +15,7 @@
 #import "ios/chrome/browser/ui/util/label_link_controller.h"
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/third_party/material_components_ios/src/components/Buttons/src/MaterialButtons.h"
 #import "ios/third_party/material_components_ios/src/components/Typography/src/MaterialTypography.h"
 #include "ios/web/public/browser_state.h"
diff --git a/ios/chrome/browser/ui/sad_tab/sad_tab_view_controller.mm b/ios/chrome/browser/ui/sad_tab/sad_tab_view_controller.mm
index 1e01ded..e3b7415 100644
--- a/ios/chrome/browser/ui/sad_tab/sad_tab_view_controller.mm
+++ b/ios/chrome/browser/ui/sad_tab/sad_tab_view_controller.mm
@@ -9,7 +9,7 @@
 #import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h"
 #import "ios/chrome/browser/ui/sad_tab/sad_tab_view.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "url/gurl.h"
 
diff --git a/ios/chrome/browser/ui/safe_mode/BUILD.gn b/ios/chrome/browser/ui/safe_mode/BUILD.gn
index 0f2a9ebd..c6ceece1 100644
--- a/ios/chrome/browser/ui/safe_mode/BUILD.gn
+++ b/ios/chrome/browser/ui/safe_mode/BUILD.gn
@@ -21,7 +21,7 @@
     "//ios/chrome/browser/safe_mode",
     "//ios/chrome/browser/ui/fancy_ui",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ui/gfx",
   ]
 
diff --git a/ios/chrome/browser/ui/safe_mode/safe_mode_view_controller.mm b/ios/chrome/browser/ui/safe_mode/safe_mode_view_controller.mm
index bb7e2b2..a65b875 100644
--- a/ios/chrome/browser/ui/safe_mode/safe_mode_view_controller.mm
+++ b/ios/chrome/browser/ui/safe_mode/safe_mode_view_controller.mm
@@ -13,7 +13,7 @@
 #import "ios/chrome/browser/ui/fancy_ui/primary_action_button.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #import "ui/gfx/ios/NSString+CrStringDrawing.h"
 
diff --git a/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn b/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn
index 4ecb4ed..43e1a10 100644
--- a/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn
+++ b/ios/chrome/browser/ui/send_tab_to_self/BUILD.gn
@@ -45,7 +45,7 @@
     "//ios/chrome/browser/ui/table_view:styler",
     "//ios/chrome/browser/ui/table_view/cells",
     "//ios/chrome/browser/ui/table_view/cells:cells_constants",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ui/base",
   ]
 }
diff --git a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_modal_presentation_controller.mm b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_modal_presentation_controller.mm
index 8b3c574..4ec9866 100644
--- a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_modal_presentation_controller.mm
+++ b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_modal_presentation_controller.mm
@@ -7,7 +7,7 @@
 #include "base/logging.h"
 #import "ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_modal_positioner.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_table_view_controller.mm b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_table_view_controller.mm
index 715ca96..9100ca1 100644
--- a/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_table_view_controller.mm
+++ b/ios/chrome/browser/ui/send_tab_to_self/send_tab_to_self_table_view_controller.mm
@@ -20,8 +20,8 @@
 #include "ios/chrome/browser/ui/table_view/cells/table_view_url_item.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/browser/ui/settings/BUILD.gn b/ios/chrome/browser/ui/settings/BUILD.gn
index 080cc9ae..50b34cf8 100644
--- a/ios/chrome/browser/ui/settings/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/BUILD.gn
@@ -23,7 +23,7 @@
     "//ios/chrome/browser/ui/table_view",
     "//ios/chrome/browser/ui/table_view:styler",
     "//ios/chrome/browser/ui/table_view/cells",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/user_feedback",
@@ -172,7 +172,7 @@
     "//ios/chrome/browser/voice",
     "//ios/chrome/browser/web:web",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/favicon",
     "//ios/chrome/common/ui/util",
     "//ios/public/provider/chrome/browser",
diff --git a/ios/chrome/browser/ui/settings/about_chrome_table_view_controller.mm b/ios/chrome/browser/ui/settings/about_chrome_table_view_controller.mm
index 1e8a245..23ab3bd 100644
--- a/ios/chrome/browser/ui/settings/about_chrome_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/about_chrome_table_view_controller.mm
@@ -20,7 +20,7 @@
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #include "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #include "ios/chrome/common/channel_info.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/third_party/material_components_ios/src/components/Snackbar/src/MaterialSnackbar.h"
diff --git a/ios/chrome/browser/ui/settings/autofill/BUILD.gn b/ios/chrome/browser/ui/settings/autofill/BUILD.gn
index 907d658..3318029 100644
--- a/ios/chrome/browser/ui/settings/autofill/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/autofill/BUILD.gn
@@ -56,7 +56,7 @@
     "//ios/chrome/browser/ui/table_view/cells",
     "//ios/chrome/browser/ui/table_view/cells:cells_constants",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ui/base",
   ]
 }
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_view_controller.mm b/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_view_controller.mm
index c29ddf10..7364418 100644
--- a/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_view_controller.mm
@@ -15,8 +15,8 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_item.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.mm b/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.mm
index 72519de..aa6dbd6 100644
--- a/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.mm
@@ -30,7 +30,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_header_footer_item.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm b/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm
index c5ba908..c28641cd60 100644
--- a/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.mm
@@ -27,7 +27,7 @@
 #import "ios/chrome/browser/ui/table_view/table_view_model.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/browser/ui/settings/cells/BUILD.gn b/ios/chrome/browser/ui/settings/cells/BUILD.gn
index 20ace5e..0be2e73 100644
--- a/ios/chrome/browser/ui/settings/cells/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/cells/BUILD.gn
@@ -46,7 +46,7 @@
     "//ios/chrome/browser/ui/table_view/cells",
     "//ios/chrome/browser/ui/table_view/cells:cells_constants",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/signin",
diff --git a/ios/chrome/browser/ui/settings/cells/copied_to_chrome_item.mm b/ios/chrome/browser/ui/settings/cells/copied_to_chrome_item.mm
index 38217b8f..ae22fce8 100644
--- a/ios/chrome/browser/ui/settings/cells/copied_to_chrome_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/copied_to_chrome_item.mm
@@ -7,8 +7,8 @@
 #include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/settings/cells/search_engine_item.mm b/ios/chrome/browser/ui/settings/cells/search_engine_item.mm
index 7b7f7af..eecdde75 100644
--- a/ios/chrome/browser/ui/settings/cells/search_engine_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/search_engine_item.mm
@@ -12,7 +12,7 @@
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #include "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "url/gurl.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/settings/cells/settings_image_detail_text_cell.mm b/ios/chrome/browser/ui/settings/cells/settings_image_detail_text_cell.mm
index a22cee6..264d54ec 100644
--- a/ios/chrome/browser/ui/settings/cells/settings_image_detail_text_cell.mm
+++ b/ios/chrome/browser/ui/settings/cells/settings_image_detail_text_cell.mm
@@ -7,7 +7,7 @@
 #include "base/logging.h"
 #include "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/settings/cells/settings_multiline_detail_item.mm b/ios/chrome/browser/ui/settings/cells/settings_multiline_detail_item.mm
index e73b849..61ee554 100644
--- a/ios/chrome/browser/ui/settings/cells/settings_multiline_detail_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/settings_multiline_detail_item.mm
@@ -7,7 +7,7 @@
 #import "ios/chrome/browser/ui/settings/cells/settings_cells_constants.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/settings/cells/settings_switch_cell.mm b/ios/chrome/browser/ui/settings/cells/settings_switch_cell.mm
index 7698368..afc7cb1 100644
--- a/ios/chrome/browser/ui/settings/cells/settings_switch_cell.mm
+++ b/ios/chrome/browser/ui/settings/cells/settings_switch_cell.mm
@@ -7,8 +7,8 @@
 #import "ios/chrome/browser/ui/settings/cells/settings_cells_constants.h"
 #include "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/settings/cells/table_view_clear_browsing_data_item.mm b/ios/chrome/browser/ui/settings/cells/table_view_clear_browsing_data_item.mm
index 4d65979..ed33e0b 100644
--- a/ios/chrome/browser/ui/settings/cells/table_view_clear_browsing_data_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/table_view_clear_browsing_data_item.mm
@@ -8,7 +8,7 @@
 #include "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #include "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/settings/cells/version_item.mm b/ios/chrome/browser/ui/settings/cells/version_item.mm
index c4830184..90b0fc52 100644
--- a/ios/chrome/browser/ui/settings/cells/version_item.mm
+++ b/ios/chrome/browser/ui/settings/cells/version_item.mm
@@ -7,7 +7,7 @@
 #include "ios/chrome/browser/ui/collection_view/cells/collection_view_cell_constants.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
index 47dbaa96..119db6d 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/BUILD.gn
@@ -54,7 +54,7 @@
     "//ios/chrome/browser/ui/table_view/cells",
     "//ios/chrome/browser/ui/table_view/cells:cells_constants",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/images",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
index ab55d1f..0b03af7 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_manager.mm
@@ -52,7 +52,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_link_item.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #include "ios/chrome/common/channel_info.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
index bc1f2eb..a6e182d2 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_table_view_controller.mm
@@ -29,8 +29,8 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_button_item.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_link_item.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/time_range_selector_table_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/time_range_selector_table_view_controller.mm
index 5a5b92e..0db71e7 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/time_range_selector_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/time_range_selector_table_view_controller.mm
@@ -12,7 +12,7 @@
 #include "components/prefs/pref_service.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_detail_text_item.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
diff --git a/ios/chrome/browser/ui/settings/dataplan_usage_table_view_controller.mm b/ios/chrome/browser/ui/settings/dataplan_usage_table_view_controller.mm
index 0ce02223..3c0d7aa6 100644
--- a/ios/chrome/browser/ui/settings/dataplan_usage_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/dataplan_usage_table_view_controller.mm
@@ -12,7 +12,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_item.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/settings/google_services/BUILD.gn b/ios/chrome/browser/ui/settings/google_services/BUILD.gn
index 1fe29b8b..4d738b5 100644
--- a/ios/chrome/browser/ui/settings/google_services/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/google_services/BUILD.gn
@@ -73,7 +73,7 @@
     "//ios/chrome/browser/ui/table_view",
     "//ios/chrome/browser/ui/table_view/cells:cells_constants",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/images",
     "//ios/public/provider/chrome/browser/signin",
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
index b8c6322b..92356d3 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_mediator.mm
@@ -33,7 +33,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_image_item.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/public/provider/chrome/browser/signin/chrome_identity.h"
diff --git a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
index 12c0095..b20dce5 100644
--- a/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
+++ b/ios/chrome/browser/ui/settings/google_services/manage_sync_settings_mediator.mm
@@ -23,7 +23,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_image_item.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_item.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/browser/ui/settings/language/BUILD.gn b/ios/chrome/browser/ui/settings/language/BUILD.gn
index c068b8d1..2c3ff742 100644
--- a/ios/chrome/browser/ui/settings/language/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/language/BUILD.gn
@@ -54,7 +54,7 @@
     "//ios/chrome/browser/ui/table_view/cells",
     "//ios/chrome/browser/ui/table_view/cells:cells_constants",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/settings/language/add_language_table_view_controller.mm b/ios/chrome/browser/ui/settings/language/add_language_table_view_controller.mm
index c0e9f10f..a6dc40369 100644
--- a/ios/chrome/browser/ui/settings/language/add_language_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/language/add_language_table_view_controller.mm
@@ -14,7 +14,7 @@
 #import "ios/chrome/browser/ui/table_view/table_view_navigation_controller_constants.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/settings/language/language_details_table_view_controller.mm b/ios/chrome/browser/ui/settings/language/language_details_table_view_controller.mm
index b1bd834..17410f2 100644
--- a/ios/chrome/browser/ui/settings/language/language_details_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/language/language_details_table_view_controller.mm
@@ -15,7 +15,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_item.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
diff --git a/ios/chrome/browser/ui/settings/language/language_settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/language/language_settings_table_view_controller.mm
index 6f744aa2..14f7229a 100644
--- a/ios/chrome/browser/ui/settings/language/language_settings_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/language/language_settings_table_view_controller.mm
@@ -24,8 +24,8 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_item.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
diff --git a/ios/chrome/browser/ui/settings/password/BUILD.gn b/ios/chrome/browser/ui/settings/password/BUILD.gn
index 2c2c41b..3244087c 100644
--- a/ios/chrome/browser/ui/settings/password/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/password/BUILD.gn
@@ -43,7 +43,7 @@
     "//ios/chrome/browser/ui/table_view/cells",
     "//ios/chrome/browser/ui/table_view/cells:cells_constants",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/third_party/material_components_ios",
     "//ui/base",
@@ -99,7 +99,7 @@
     "//ios/chrome/browser/ui/table_view/cells:cells_constants",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/web:test_support",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/test/app:test_support",
     "//ios/web/public/test",
     "//ios/web/public/test",
diff --git a/ios/chrome/browser/ui/settings/password/password_details_table_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_details_table_view_controller.mm
index c691b21..8a618d4b 100644
--- a/ios/chrome/browser/ui/settings/password/password_details_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/password/password_details_table_view_controller.mm
@@ -27,7 +27,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_item.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #include "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/third_party/material_components_ios/src/components/Snackbar/src/MaterialSnackbar.h"
 #include "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/settings/password/passwords_table_view_controller.mm b/ios/chrome/browser/ui/settings/password/passwords_table_view_controller.mm
index db86cbf..0ecbf4c 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/password/passwords_table_view_controller.mm
@@ -53,8 +53,8 @@
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
diff --git a/ios/chrome/browser/ui/settings/password/passwords_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/password/passwords_table_view_controller_unittest.mm
index 69b7200..ce124d33 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_table_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/settings/password/passwords_table_view_controller_unittest.mm
@@ -21,8 +21,8 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_detail_text_item.h"
 #include "ios/chrome/browser/ui/table_view/chrome_table_view_controller_test.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/web/public/test/web_task_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
diff --git a/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm
index 0489ee6..d118718 100644
--- a/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_root_table_view_controller.mm
@@ -14,8 +14,8 @@
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
index 388cbe4..f6b04df 100644
--- a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
@@ -71,8 +71,8 @@
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #include "ios/chrome/browser/voice/speech_input_locale_config.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
diff --git a/ios/chrome/browser/ui/settings/sync/BUILD.gn b/ios/chrome/browser/ui/settings/sync/BUILD.gn
index bf8d6498..be7a7c7 100644
--- a/ios/chrome/browser/ui/settings/sync/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/sync/BUILD.gn
@@ -44,7 +44,7 @@
     "//ios/chrome/browser/ui/table_view/cells",
     "//ios/chrome/browser/ui/table_view/cells:cells_constants",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/signin",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/settings/sync/sync_encryption_table_view_controller.mm b/ios/chrome/browser/ui/settings/sync/sync_encryption_table_view_controller.mm
index 4e49e9d..7a932b3 100644
--- a/ios/chrome/browser/ui/settings/sync/sync_encryption_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/sync/sync_encryption_table_view_controller.mm
@@ -29,7 +29,7 @@
 #import "ios/chrome/browser/ui/table_view/table_view_model.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 #include "url/gurl.h"
diff --git a/ios/chrome/browser/ui/settings/table_cell_catalog_view_controller.mm b/ios/chrome/browser/ui/settings/table_cell_catalog_view_controller.mm
index 32f8c89d..36187fb6 100644
--- a/ios/chrome/browser/ui/settings/table_cell_catalog_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/table_cell_catalog_view_controller.mm
@@ -27,8 +27,8 @@
 #import "ios/chrome/browser/ui/table_view/table_view_model.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/public/provider/chrome/browser/chrome_browser_provider.h"
 #import "ios/public/provider/chrome/browser/signin/signin_resources_provider.h"
 #include "url/gurl.h"
diff --git a/ios/chrome/browser/ui/side_swipe/BUILD.gn b/ios/chrome/browser/ui/side_swipe/BUILD.gn
index 30d9d39a..eac6515 100644
--- a/ios/chrome/browser/ui/side_swipe/BUILD.gn
+++ b/ios/chrome/browser/ui/side_swipe/BUILD.gn
@@ -41,7 +41,7 @@
     "//ios/chrome/browser/web:page_placeholder",
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/web/common",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/side_swipe/side_swipe_navigation_view.mm b/ios/chrome/browser/ui/side_swipe/side_swipe_navigation_view.mm
index 09c185d8..f9a0431 100644
--- a/ios/chrome/browser/ui/side_swipe/side_swipe_navigation_view.mm
+++ b/ios/chrome/browser/ui/side_swipe/side_swipe_navigation_view.mm
@@ -14,8 +14,8 @@
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #import "ios/chrome/common/material_timing.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ui/gfx/ios/uikit_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/tab_grid/grid/BUILD.gn b/ios/chrome/browser/ui/tab_grid/grid/BUILD.gn
index 8fdfc808..4f3bfd49 100644
--- a/ios/chrome/browser/ui/tab_grid/grid/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_grid/grid/BUILD.gn
@@ -42,7 +42,7 @@
     "//ios/chrome/browser/ui/elements",
     "//ios/chrome/browser/ui/tab_grid/transitions",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ui/base",
   ]
diff --git a/ios/chrome/browser/ui/tab_grid/grid/grid_cell.mm b/ios/chrome/browser/ui/tab_grid/grid/grid_cell.mm
index 9855f33..be0f63ca 100644
--- a/ios/chrome/browser/ui/tab_grid/grid/grid_cell.mm
+++ b/ios/chrome/browser/ui/tab_grid/grid/grid_cell.mm
@@ -8,7 +8,7 @@
 #import "ios/chrome/browser/ui/elements/top_aligned_image_view.h"
 #import "ios/chrome/browser/ui/tab_grid/grid/grid_constants.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm
index b45cb35..c61e419 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_view_controller.mm
@@ -29,7 +29,7 @@
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/web/public/thread/web_task_traits.h"
diff --git a/ios/chrome/browser/ui/table_view/BUILD.gn b/ios/chrome/browser/ui/table_view/BUILD.gn
index 29cd15b..1362a376 100644
--- a/ios/chrome/browser/ui/table_view/BUILD.gn
+++ b/ios/chrome/browser/ui/table_view/BUILD.gn
@@ -22,7 +22,7 @@
     "//base",
     "//ios/chrome/browser/ui/list_model",
     "//ios/chrome/browser/ui/material_components",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/third_party/material_components_ios",
   ]
   public_deps = [
@@ -49,7 +49,7 @@
   ]
   public_deps = [
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
   ]
 }
 
@@ -85,7 +85,7 @@
     "//ios/chrome/browser/ui/colors",
     "//ios/chrome/browser/ui/material_components",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/third_party/material_components_ios",
   ]
 }
diff --git a/ios/chrome/browser/ui/table_view/cells/BUILD.gn b/ios/chrome/browser/ui/table_view/cells/BUILD.gn
index 7170e98..b51aef8 100644
--- a/ios/chrome/browser/ui/table_view/cells/BUILD.gn
+++ b/ios/chrome/browser/ui/table_view/cells/BUILD.gn
@@ -58,7 +58,7 @@
     "//ios/chrome/browser/ui/table_view:styler",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/favicon",
     "//ios/chrome/common/ui/util",
     "//ios/third_party/material_components_ios",
@@ -99,7 +99,7 @@
     ":cells_constants",
     "//base",
     "//ios/chrome/browser/ui/table_view:styler",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//net:net",
     "//testing/gtest",
     "//third_party/ocmock:ocmock",
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_activity_indicator_header_footer_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_activity_indicator_header_footer_item.mm
index 6bf3fdfe..27904bd0 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_activity_indicator_header_footer_item.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_activity_indicator_header_footer_item.mm
@@ -9,7 +9,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #import "ios/third_party/material_components_ios/src/components/ActivityIndicator/src/MaterialActivityIndicator.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_cell.mm b/ios/chrome/browser/ui/table_view/cells/table_view_cell.mm
index 32fa9c4..6ea0eea 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_cell.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_cell.mm
@@ -7,7 +7,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.mm
index eaf857b..cc2adcf 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_detail_icon_item.mm
@@ -10,7 +10,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_detail_text_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_detail_text_item.mm
index cb1d2fd5..c457b60f 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_detail_text_item.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_detail_text_item.mm
@@ -7,8 +7,8 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_detail_text_item_unittest.mm b/ios/chrome/browser/ui/table_view/cells/table_view_detail_text_item_unittest.mm
index 30adfa2..17ed8a9d 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_detail_text_item_unittest.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_detail_text_item_unittest.mm
@@ -8,7 +8,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/gtest_mac.h"
 #include "testing/platform_test.h"
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_disclosure_header_footer_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_disclosure_header_footer_item.mm
index 4dd91b2..f1f83111 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_disclosure_header_footer_item.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_disclosure_header_footer_item.mm
@@ -10,7 +10,7 @@
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_image_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_image_item.mm
index 0b708894..84b10a8 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_image_item.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_image_item.mm
@@ -9,7 +9,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_link_header_footer_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_link_header_footer_item.mm
index bb47adb9..063fa13 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_link_header_footer_item.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_link_header_footer_item.mm
@@ -6,9 +6,9 @@
 
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #import "ios/chrome/common/string_util.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "net/base/mac/url_conversions.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_multi_detail_text_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_multi_detail_text_item.mm
index b746d8f2..a7e91fd 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_multi_detail_text_item.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_multi_detail_text_item.mm
@@ -6,7 +6,7 @@
 
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_text_button_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_text_button_item.mm
index 136bb95..bc850132 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_text_button_item.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_text_button_item.mm
@@ -8,8 +8,8 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_text_edit_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_text_edit_item.mm
index 66247ce..1906880 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_text_edit_item.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_text_edit_item.mm
@@ -11,8 +11,8 @@
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_text_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_text_item.mm
index 6b78689b..bd968236 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_text_item.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_text_item.mm
@@ -8,7 +8,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_text_item_unittest.mm b/ios/chrome/browser/ui/table_view/cells/table_view_text_item_unittest.mm
index 949f1876..23c7524 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_text_item_unittest.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_text_item_unittest.mm
@@ -8,7 +8,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_cells_constants.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/gtest_mac.h"
 #include "testing/platform_test.h"
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_text_link_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_text_link_item.mm
index 67e2b2a..23adc0d 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_text_link_item.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_text_link_item.mm
@@ -9,9 +9,9 @@
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/util/label_link_controller.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #import "ios/chrome/common/string_util.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "url/gurl.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/table_view/cells/table_view_url_item.mm b/ios/chrome/browser/ui/table_view/cells/table_view_url_item.mm
index 307e173..76e872b0 100644
--- a/ios/chrome/browser/ui/table_view/cells/table_view_url_item.mm
+++ b/ios/chrome/browser/ui/table_view/cells/table_view_url_item.mm
@@ -11,8 +11,8 @@
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/favicon/favicon_view.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "url/gurl.h"
diff --git a/ios/chrome/browser/ui/table_view/chrome_table_view_controller.mm b/ios/chrome/browser/ui/table_view/chrome_table_view_controller.mm
index 9682a58..db7a88e 100644
--- a/ios/chrome/browser/ui/table_view/chrome_table_view_controller.mm
+++ b/ios/chrome/browser/ui/table_view/chrome_table_view_controller.mm
@@ -15,7 +15,7 @@
 #import "ios/chrome/browser/ui/table_view/table_view_loading_view.h"
 #import "ios/chrome/browser/ui/table_view/table_view_model.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/table_view/chrome_table_view_styler.mm b/ios/chrome/browser/ui/table_view/chrome_table_view_styler.mm
index 20937b4d..dcb83af 100644
--- a/ios/chrome/browser/ui/table_view/chrome_table_view_styler.mm
+++ b/ios/chrome/browser/ui/table_view/chrome_table_view_styler.mm
@@ -5,7 +5,7 @@
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/table_view/table_view_empty_view.mm b/ios/chrome/browser/ui/table_view/table_view_empty_view.mm
index 036f4ec..374a937 100644
--- a/ios/chrome/browser/ui/table_view/table_view_empty_view.mm
+++ b/ios/chrome/browser/ui/table_view/table_view_empty_view.mm
@@ -5,7 +5,7 @@
 #import "ios/chrome/browser/ui/table_view/table_view_empty_view.h"
 
 #import "ios/chrome/browser/ui/table_view/table_view_constants.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/table_view/table_view_navigation_controller.mm b/ios/chrome/browser/ui/table_view/table_view_navigation_controller.mm
index c23efe2..e148122c 100644
--- a/ios/chrome/browser/ui/table_view/table_view_navigation_controller.mm
+++ b/ios/chrome/browser/ui/table_view/table_view_navigation_controller.mm
@@ -7,7 +7,7 @@
 #include "base/mac/foundation_util.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller.h"
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/tabs/BUILD.gn b/ios/chrome/browser/ui/tabs/BUILD.gn
index a19066e7..883280b 100644
--- a/ios/chrome/browser/ui/tabs/BUILD.gn
+++ b/ios/chrome/browser/ui/tabs/BUILD.gn
@@ -61,7 +61,7 @@
     "//ios/chrome/browser/web_state_list",
     "//ios/chrome/common",
     "//ios/chrome/common:common_extension",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/third_party/material_components_ios",
     "//ios/web",
diff --git a/ios/chrome/browser/ui/tabs/background_tab_animation_view.mm b/ios/chrome/browser/ui/tabs/background_tab_animation_view.mm
index 1b7982b6a..2705d754 100644
--- a/ios/chrome/browser/ui/tabs/background_tab_animation_view.mm
+++ b/ios/chrome/browser/ui/tabs/background_tab_animation_view.mm
@@ -9,9 +9,9 @@
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #import "ios/chrome/browser/ui/util/named_guide_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #import "ios/chrome/common/material_timing.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/tabs/tab_strip_controller.mm b/ios/chrome/browser/ui/tabs/tab_strip_controller.mm
index caf337c6..24d6a249 100644
--- a/ios/chrome/browser/ui/tabs/tab_strip_controller.mm
+++ b/ios/chrome/browser/ui/tabs/tab_strip_controller.mm
@@ -48,7 +48,7 @@
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/chrome/browser/web_state_list/web_state_list_favicon_driver_observer.h"
 #import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/web/public/navigation/navigation_manager.h"
 #import "ios/web/public/web_state.h"
diff --git a/ios/chrome/browser/ui/tabs/tab_view.mm b/ios/chrome/browser/ui/tabs/tab_view.mm
index 4721b38..dc594e57 100644
--- a/ios/chrome/browser/ui/tabs/tab_view.mm
+++ b/ios/chrome/browser/ui/tabs/tab_view.mm
@@ -18,8 +18,8 @@
 #import "ios/chrome/browser/ui/image_util/image_util.h"
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #import "ios/chrome/common/highlight_button.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/third_party/material_components_ios/src/components/ActivityIndicator/src/MaterialActivityIndicator.h"
diff --git a/ios/chrome/browser/ui/text_zoom/BUILD.gn b/ios/chrome/browser/ui/text_zoom/BUILD.gn
index 845b8e0..0b65da261 100644
--- a/ios/chrome/browser/ui/text_zoom/BUILD.gn
+++ b/ios/chrome/browser/ui/text_zoom/BUILD.gn
@@ -20,7 +20,7 @@
     "//ios/chrome/browser/ui/toolbar/public:constants",
     "//ios/chrome/browser/web",
     "//ios/chrome/browser/web_state_list",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
   ]
   configs += [ "//build/config/compiler:enable_arc" ]
 }
@@ -39,7 +39,7 @@
     "//ios/chrome/app/strings:ios_strings",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ui/base",
   ]
   configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/chrome/browser/ui/text_zoom/text_zoom_coordinator.mm b/ios/chrome/browser/ui/text_zoom/text_zoom_coordinator.mm
index 4ed0069..f9d395d30 100644
--- a/ios/chrome/browser/ui/text_zoom/text_zoom_coordinator.mm
+++ b/ios/chrome/browser/ui/text_zoom/text_zoom_coordinator.mm
@@ -14,8 +14,8 @@
 #import "ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_coordinator_delegate.h"
 #import "ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.h"
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/text_zoom/text_zoom_view_controller.mm b/ios/chrome/browser/ui/text_zoom/text_zoom_view_controller.mm
index 1d7d5f7..3a63be2 100644
--- a/ios/chrome/browser/ui/text_zoom/text_zoom_view_controller.mm
+++ b/ios/chrome/browser/ui/text_zoom/text_zoom_view_controller.mm
@@ -9,8 +9,8 @@
 #import "ios/chrome/browser/ui/commands/text_zoom_commands.h"
 #import "ios/chrome/browser/ui/text_zoom/text_zoom_constants.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 
diff --git a/ios/chrome/browser/ui/toolbar/BUILD.gn b/ios/chrome/browser/ui/toolbar/BUILD.gn
index 39774b94..7a33986 100644
--- a/ios/chrome/browser/ui/toolbar/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/BUILD.gn
@@ -99,7 +99,7 @@
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common:timing",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/third_party/material_components_ios",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/toolbar/accessory/BUILD.gn b/ios/chrome/browser/ui/toolbar/accessory/BUILD.gn
index afd6ce0..c1b1258c 100644
--- a/ios/chrome/browser/ui/toolbar/accessory/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/accessory/BUILD.gn
@@ -17,7 +17,7 @@
     "//ios/chrome/browser/ui/presenters",
     "//ios/chrome/browser/ui/toolbar/public:constants",
     "//ios/chrome/browser/ui/util",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
   ]
 
diff --git a/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_coordinator_delegate.h b/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_coordinator_delegate.h
index 57c3c73..51e9365f 100644
--- a/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_coordinator_delegate.h
+++ b/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_coordinator_delegate.h
@@ -9,9 +9,6 @@
 
 @protocol ToolbarAccessoryCoordinatorDelegate
 
-- (void)setHeadersForToolbarAccessoryCoordinator:
-    (ChromeCoordinator*)toolbarAccessoryCoordinator;
-
 - (void)toolbarAccessoryCoordinatorDidDismissUI:
     (ChromeCoordinator*)toolbarAccessoryCoordinator;
 
diff --git a/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.mm b/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.mm
index d1fc608..25cf8f8 100644
--- a/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.mm
+++ b/ios/chrome/browser/ui/toolbar/accessory/toolbar_accessory_presenter.mm
@@ -13,8 +13,8 @@
 #import "ios/chrome/browser/ui/util/layout_guide_names.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -44,6 +44,10 @@
 // everything around the safe area.
 @property(nonatomic, strong, readwrite) UIView* backgroundView;
 
+// Layout guide to center the presented view below the safe area layout guide on
+// iPhone.
+@property(nonatomic, strong) UILayoutGuide* centeringGuide;
+
 // A constraint that constrains any views to their pre-animation positions.
 // It should be deactiviated during the presentation animation and replaced with
 // a constraint that sets the views to their final position.
@@ -122,13 +126,12 @@
     [weakSelf.presentedViewController.view removeFromSuperview];
     [weakSelf.presentedViewController removeFromParentViewController];
     [weakSelf.backgroundView removeFromSuperview];
+    weakSelf.backgroundView = nil;
+    weakSelf.presenting = NO;
     if ([weakSelf.delegate
             respondsToSelector:@selector(containedPresenterDidDismiss:)]) {
       [weakSelf.delegate containedPresenterDidDismiss:weakSelf];
     }
-    weakSelf.backgroundView = nil;
-    weakSelf.presenting = NO;
-    [weakSelf.delegate containedPresenterDidDismiss:weakSelf];
   };
   if (animated) {
     void (^animation)();
@@ -164,15 +167,23 @@
   self.animationConstraint = [self.backgroundView.bottomAnchor
       constraintEqualToAnchor:self.baseViewController.view.topAnchor];
 
+  // Use this constraint to force the greater than or equal constraint below to
+  // be as small as possible.
+  NSLayoutConstraint* centeringGuideTopConstraint =
+      [self.centeringGuide.topAnchor
+          constraintEqualToAnchor:self.backgroundView.topAnchor];
+  centeringGuideTopConstraint.priority = UILayoutPriorityDefaultLow;
+
   [NSLayoutConstraint activateConstraints:@[
     [self.backgroundView.leadingAnchor
         constraintEqualToAnchor:self.baseViewController.view.leadingAnchor],
     [self.backgroundView.trailingAnchor
         constraintEqualToAnchor:self.baseViewController.view.trailingAnchor],
-    [self.presentedViewController.view.topAnchor
+    [self.centeringGuide.topAnchor
         constraintGreaterThanOrEqualToAnchor:self.backgroundView
                                                  .safeAreaLayoutGuide
                                                  .topAnchor],
+    centeringGuideTopConstraint,
     self.animationConstraint,
   ]];
 }
@@ -233,6 +244,15 @@
   [self.backgroundView.topAnchor
       constraintEqualToAnchor:self.baseViewController.view.topAnchor]
       .active = YES;
+
+  // Make sure the background doesn't shrink when the toolbar goes to fullscreen
+  // mode.
+  UILayoutGuide* toolbarLayoutGuide =
+      [NamedGuide guideWithName:kPrimaryToolbarGuide
+                           view:self.baseViewController.view];
+  [self.backgroundView.bottomAnchor
+      constraintGreaterThanOrEqualToAnchor:toolbarLayoutGuide.bottomAnchor]
+      .active = YES;
 }
 
 // Sets up the constraints on iPhone such that the view is ready to be animated
@@ -265,15 +285,27 @@
 
   [backgroundView addSubview:self.presentedViewController.view];
 
+  self.centeringGuide = [[UILayoutGuide alloc] init];
+  [backgroundView addLayoutGuide:self.centeringGuide];
+
   [NSLayoutConstraint activateConstraints:@[
-    [self.presentedViewController.view.trailingAnchor
+    [self.centeringGuide.trailingAnchor
         constraintEqualToAnchor:backgroundView.trailingAnchor],
-    [self.presentedViewController.view.leadingAnchor
+    [self.centeringGuide.leadingAnchor
         constraintEqualToAnchor:backgroundView.leadingAnchor],
+    [self.centeringGuide.bottomAnchor
+        constraintEqualToAnchor:backgroundView.bottomAnchor],
+    [self.centeringGuide.heightAnchor
+        constraintGreaterThanOrEqualToAnchor:self.presentedViewController.view
+                                                 .heightAnchor],
     [self.presentedViewController.view.heightAnchor
         constraintEqualToConstant:kPrimaryToolbarHeight],
-    [self.presentedViewController.view.bottomAnchor
-        constraintEqualToAnchor:backgroundView.bottomAnchor],
+    [self.presentedViewController.view.leadingAnchor
+        constraintEqualToAnchor:self.centeringGuide.leadingAnchor],
+    [self.presentedViewController.view.trailingAnchor
+        constraintEqualToAnchor:self.centeringGuide.trailingAnchor],
+    [self.presentedViewController.view.centerYAnchor
+        constraintEqualToAnchor:self.centeringGuide.centerYAnchor],
   ]];
 
   return backgroundView;
diff --git a/ios/chrome/browser/ui/toolbar/buttons/BUILD.gn b/ios/chrome/browser/ui/toolbar/buttons/BUILD.gn
index 4b5387d..d0abcf64 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/buttons/BUILD.gn
@@ -52,7 +52,7 @@
     "//ios/chrome/browser/ui/toolbar/public:feature_flags",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/web_state_list",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/images",
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.mm b/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.mm
index 88bbc92..7c89a59 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.mm
+++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_button_factory.mm
@@ -16,8 +16,8 @@
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h"
 #import "ios/chrome/browser/ui/util/rtl_geometry.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/chrome/grit/ios_theme_resources.h"
diff --git a/ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.mm b/ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.mm
index 84e2fa9..46e28318 100644
--- a/ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.mm
+++ b/ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.mm
@@ -9,8 +9,8 @@
 #import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/dynamic_color_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/toolbar/keyboard_assist/BUILD.gn b/ios/chrome/browser/ui/toolbar/keyboard_assist/BUILD.gn
index fcb729a..501df904 100644
--- a/ios/chrome/browser/ui/toolbar/keyboard_assist/BUILD.gn
+++ b/ios/chrome/browser/ui/toolbar/keyboard_assist/BUILD.gn
@@ -31,7 +31,7 @@
     "//ios/chrome/browser/ui/toolbar/public",
     "//ios/chrome/browser/ui/util/",
     "//ios/chrome/browser/voice",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/public/provider/chrome/browser",
     "//ios/public/provider/chrome/browser/voice",
diff --git a/ios/chrome/browser/ui/toolbar/keyboard_assist/toolbar_keyboard_accessory_view.mm b/ios/chrome/browser/ui/toolbar/keyboard_assist/toolbar_keyboard_accessory_view.mm
index de0c3a5..296b74f 100644
--- a/ios/chrome/browser/ui/toolbar/keyboard_assist/toolbar_keyboard_accessory_view.mm
+++ b/ios/chrome/browser/ui/toolbar/keyboard_assist/toolbar_keyboard_accessory_view.mm
@@ -10,7 +10,7 @@
 #import "ios/chrome/browser/ui/toolbar/keyboard_assist/toolbar_assistive_keyboard_views_utils.h"
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/toolbar/primary_toolbar_view.mm b/ios/chrome/browser/ui/toolbar/primary_toolbar_view.mm
index ccd420b..3f9c6426 100644
--- a/ios/chrome/browser/ui/toolbar/primary_toolbar_view.mm
+++ b/ios/chrome/browser/ui/toolbar/primary_toolbar_view.mm
@@ -17,7 +17,7 @@
 #import "ios/chrome/browser/ui/toolbar/toolbar_progress_bar.h"
 #import "ios/chrome/browser/ui/util/dynamic_type_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ui/gfx/ios/uikit_util.h"
 
diff --git a/ios/chrome/browser/ui/toolbar/secondary_toolbar_view.mm b/ios/chrome/browser/ui/toolbar/secondary_toolbar_view.mm
index 92597573..6e25db01 100644
--- a/ios/chrome/browser/ui/toolbar/secondary_toolbar_view.mm
+++ b/ios/chrome/browser/ui/toolbar/secondary_toolbar_view.mm
@@ -14,7 +14,7 @@
 #import "ios/chrome/browser/ui/toolbar_container/toolbar_collapsing.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #include "ios/chrome/browser/ui/util/rtl_geometry.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ui/gfx/ios/uikit_util.h"
 
diff --git a/ios/chrome/browser/ui/translate/BUILD.gn b/ios/chrome/browser/ui/translate/BUILD.gn
index 3034135..681b842 100644
--- a/ios/chrome/browser/ui/translate/BUILD.gn
+++ b/ios/chrome/browser/ui/translate/BUILD.gn
@@ -76,7 +76,7 @@
     "//ios/chrome/browser/ui/translate/resources:translate_options",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/common:common_extension",
-    "//ios/chrome/common/colors:colors",
+    "//ios/chrome/common/ui/colors:colors",
     "//ios/chrome/common/ui/util",
     "//ios/third_party/material_components_ios",
     "//ui/base",
diff --git a/ios/chrome/browser/ui/translate/cells/translate_popup_menu_item.mm b/ios/chrome/browser/ui/translate/cells/translate_popup_menu_item.mm
index 9e5cc68..a0753bc 100644
--- a/ios/chrome/browser/ui/translate/cells/translate_popup_menu_item.mm
+++ b/ios/chrome/browser/ui/translate/cells/translate_popup_menu_item.mm
@@ -6,7 +6,7 @@
 
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_styler.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/translate/translate_infobar_language_tab_view.mm b/ios/chrome/browser/ui/translate/translate_infobar_language_tab_view.mm
index 6d2933b..38ed5cc 100644
--- a/ios/chrome/browser/ui/translate/translate_infobar_language_tab_view.mm
+++ b/ios/chrome/browser/ui/translate/translate_infobar_language_tab_view.mm
@@ -9,8 +9,8 @@
 #import "ios/chrome/browser/ui/translate/translate_infobar_language_tab_strip_view.h"
 #import "ios/chrome/browser/ui/translate/translate_infobar_language_tab_view_delegate.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
 #import "ios/chrome/common/highlight_button.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #import "ios/third_party/material_components_ios/src/components/ActivityIndicator/src/MaterialActivityIndicator.h"
 
diff --git a/ios/chrome/browser/ui/translate/translate_infobar_view.mm b/ios/chrome/browser/ui/translate/translate_infobar_view.mm
index c91e9fcc..b21d95a 100644
--- a/ios/chrome/browser/ui/translate/translate_infobar_view.mm
+++ b/ios/chrome/browser/ui/translate/translate_infobar_view.mm
@@ -21,7 +21,7 @@
 #import "ios/chrome/browser/ui/util/layout_guide_names.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/ios/chrome/common/colors/BUILD.gn b/ios/chrome/common/colors/BUILD.gn
index eb5dfee8..0aaafaf 100644
--- a/ios/chrome/common/colors/BUILD.gn
+++ b/ios/chrome/common/colors/BUILD.gn
@@ -2,19 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//build/config/chrome_build.gni")
-
 source_set("colors") {
-  sources = [
-    "UIColor+cr_dynamic_colors.h",
-    "UIColor+cr_dynamic_colors.mm",
-    "UIColor+cr_semantic_colors.h",
-    "UIColor+cr_semantic_colors.mm",
-    "dynamic_color_util.h",
-    "dynamic_color_util.mm",
-    "semantic_color_names.h",
-    "semantic_color_names.mm",
-  ]
-  deps = [ "resources" ]
   configs += [ "//build/config/compiler:enable_arc" ]
+  sources = [ "semantic_color_names.h" ]
+  deps = [ "//ios/chrome/common/ui/colors" ]
 }
diff --git a/ios/chrome/common/colors/semantic_color_names.h b/ios/chrome/common/colors/semantic_color_names.h
index c09eab1..f02faac 100644
--- a/ios/chrome/common/colors/semantic_color_names.h
+++ b/ios/chrome/common/colors/semantic_color_names.h
@@ -1,82 +1,6 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
+// 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 IOS_CHROME_COMMON_COLORS_SEMANTIC_COLOR_NAMES_H_
-#define IOS_CHROME_COMMON_COLORS_SEMANTIC_COLOR_NAMES_H_
-
-#import <UIKit/UIKit.h>
-
-// Element Colors
-
-extern NSString* const kBackgroundColor;
-extern NSString* const kCloseButtonColor;
-extern NSString* const kDisabledTintColor;
-// Background color used in the rounded squares behind favicons.
-extern NSString* const kFaviconBackgroundColor;
-// Ink color for an MDC button.
-extern NSString* const kMDCInkColor;
-// Ink color for a secondary style MDC button (button with transparent
-// background).
-extern NSString* const kMDCSecondaryInkColor;
-// Color used to tint placeholder images and icons.
-extern NSString* const kPlaceholderImageTintColor;
-extern NSString* const kScrimBackgroundColor;
-extern NSString* const kSeparatorColor;
-extern NSString* const kSolidButtonTextColor;
-extern NSString* const kTableViewRowHighlightColor;
-extern NSString* const kTextPrimaryColor;
-extern NSString* const kTextSecondaryColor;
-extern NSString* const kTextfieldBackgroundColor;
-extern NSString* const kTextfieldPlaceholderColor;
-// Color used for buttons on a toolbar.
-extern NSString* const kToolbarButtonColor;
-// Color used for a shadow/separator next to a toolbar.
-extern NSString* const kToolbarShadowColor;
-
-// Standard Colors
-
-// Standard blue color. This is most commonly used for the tint color on
-// standard buttons and controls.
-extern NSString* const kBlueColor;
-// Lighter blue color sometimes used as background for buttons or views where
-// the main content is |kBlueColor| (e.g the background of the collections
-// shortcuts on the NTP).
-extern NSString* const kBlueHaloColor;
-// Standard green color.
-extern NSString* const kGreenColor;
-// Standard red color. This is most commonly used for the tint color on
-// destructive controls.
-extern NSString* const kRedColor;
-
-// Grey Color Palette.
-extern NSString* const kGrey50Color;
-extern NSString* const kGrey100Color;
-extern NSString* const kGrey200Color;
-extern NSString* const kGrey300Color;
-extern NSString* const kGrey400Color;
-extern NSString* const kGrey500Color;
-extern NSString* const kGrey600Color;
-extern NSString* const kGrey700Color;
-extern NSString* const kGrey800Color;
-extern NSString* const kGrey900Color;
-
-// Temporary colors for iOS 12. Because overridePreferredInterfaceStyle isn't
-// available in iOS 12, any views that should always be dark (e.g. incognito)
-// need to use colorsets that always use the dark variant.
-// TODO(crbug.com/981889): Clean up after iOS 12 support is dropped.
-
-extern NSString* const kBackgroundDarkColor;
-extern NSString* const kCloseButtonDarkColor;
-extern NSString* const kTableViewRowHighlightDarkColor;
-extern NSString* const kTextPrimaryDarkColor;
-extern NSString* const kTextSecondaryDarkColor;
-extern NSString* const kTextfieldBackgroundDarkColor;
-extern NSString* const kTextfieldPlaceholderDarkColor;
-extern NSString* const kToolbarButtonDarkColor;
-
-extern NSString* const kBlueDarkColor;
-extern NSString* const kGreenDarkColor;
-extern NSString* const kRedDarkColor;
-
-#endif  // IOS_CHROME_COMMON_COLORS_SEMANTIC_COLOR_NAMES_H_
+// This file is temporal to not break internal.
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
diff --git a/ios/chrome/common/ui/colors/BUILD.gn b/ios/chrome/common/ui/colors/BUILD.gn
new file mode 100644
index 0000000..eb5dfee8
--- /dev/null
+++ b/ios/chrome/common/ui/colors/BUILD.gn
@@ -0,0 +1,20 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/chrome_build.gni")
+
+source_set("colors") {
+  sources = [
+    "UIColor+cr_dynamic_colors.h",
+    "UIColor+cr_dynamic_colors.mm",
+    "UIColor+cr_semantic_colors.h",
+    "UIColor+cr_semantic_colors.mm",
+    "dynamic_color_util.h",
+    "dynamic_color_util.mm",
+    "semantic_color_names.h",
+    "semantic_color_names.mm",
+  ]
+  deps = [ "resources" ]
+  configs += [ "//build/config/compiler:enable_arc" ]
+}
diff --git a/ios/chrome/common/colors/OWNERS b/ios/chrome/common/ui/colors/OWNERS
similarity index 100%
rename from ios/chrome/common/colors/OWNERS
rename to ios/chrome/common/ui/colors/OWNERS
diff --git a/ios/chrome/common/colors/UIColor+cr_dynamic_colors.h b/ios/chrome/common/ui/colors/UIColor+cr_dynamic_colors.h
similarity index 75%
rename from ios/chrome/common/colors/UIColor+cr_dynamic_colors.h
rename to ios/chrome/common/ui/colors/UIColor+cr_dynamic_colors.h
index 7cac2ce..443f879 100644
--- a/ios/chrome/common/colors/UIColor+cr_dynamic_colors.h
+++ b/ios/chrome/common/ui/colors/UIColor+cr_dynamic_colors.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 IOS_CHROME_COMMON_COLORS_UICOLOR_CR_DYNAMIC_COLORS_H_
-#define IOS_CHROME_COMMON_COLORS_UICOLOR_CR_DYNAMIC_COLORS_H_
+#ifndef IOS_CHROME_COMMON_UI_COLORS_UICOLOR_CR_DYNAMIC_COLORS_H_
+#define IOS_CHROME_COMMON_UI_COLORS_UICOLOR_CR_DYNAMIC_COLORS_H_
 
 #import <UIKit/UIKit.h>
 
@@ -18,4 +18,4 @@
 
 @end
 
-#endif  // IOS_CHROME_COMMON_COLORS_UICOLOR_CR_DYNAMIC_COLORS_H_
+#endif  // IOS_CHROME_COMMON_UI_COLORS_UICOLOR_CR_DYNAMIC_COLORS_H_
diff --git a/ios/chrome/common/colors/UIColor+cr_dynamic_colors.mm b/ios/chrome/common/ui/colors/UIColor+cr_dynamic_colors.mm
similarity index 88%
rename from ios/chrome/common/colors/UIColor+cr_dynamic_colors.mm
rename to ios/chrome/common/ui/colors/UIColor+cr_dynamic_colors.mm
index f88f61aa..ffa4c9b 100644
--- a/ios/chrome/common/colors/UIColor+cr_dynamic_colors.mm
+++ b/ios/chrome/common/ui/colors/UIColor+cr_dynamic_colors.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/common/colors/UIColor+cr_dynamic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_dynamic_colors.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/common/colors/UIColor+cr_semantic_colors.h b/ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h
similarity index 88%
rename from ios/chrome/common/colors/UIColor+cr_semantic_colors.h
rename to ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h
index da9dd0c..c4026725 100644
--- a/ios/chrome/common/colors/UIColor+cr_semantic_colors.h
+++ b/ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.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 IOS_CHROME_COMMON_COLORS_UICOLOR_CR_SEMANTIC_COLORS_H_
-#define IOS_CHROME_COMMON_COLORS_UICOLOR_CR_SEMANTIC_COLORS_H_
+#ifndef IOS_CHROME_COMMON_UI_COLORS_UICOLOR_CR_SEMANTIC_COLORS_H_
+#define IOS_CHROME_COMMON_UI_COLORS_UICOLOR_CR_SEMANTIC_COLORS_H_
 
 #import <UIKit/UIKit.h>
 
@@ -40,4 +40,4 @@
 
 @end
 
-#endif  // IOS_CHROME_COMMON_COLORS_UICOLOR_CR_SEMANTIC_COLORS_H_
+#endif  // IOS_CHROME_COMMON_UI_COLORS_UICOLOR_CR_SEMANTIC_COLORS_H_
diff --git a/ios/chrome/common/colors/UIColor+cr_semantic_colors.mm b/ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.mm
similarity index 98%
rename from ios/chrome/common/colors/UIColor+cr_semantic_colors.mm
rename to ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.mm
index dc670d3..39ced8a 100644
--- a/ios/chrome/common/colors/UIColor+cr_semantic_colors.mm
+++ b/ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
+#import "ios/chrome/common/ui/colors/UIColor+cr_semantic_colors.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/common/colors/dynamic_color_util.h b/ios/chrome/common/ui/colors/dynamic_color_util.h
similarity index 83%
rename from ios/chrome/common/colors/dynamic_color_util.h
rename to ios/chrome/common/ui/colors/dynamic_color_util.h
index c635de8..925b385 100644
--- a/ios/chrome/common/colors/dynamic_color_util.h
+++ b/ios/chrome/common/ui/colors/dynamic_color_util.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 IOS_CHROME_COMMON_COLORS_DYNAMIC_COLOR_UTIL_H_
-#define IOS_CHROME_COMMON_COLORS_DYNAMIC_COLOR_UTIL_H_
+#ifndef IOS_CHROME_COMMON_UI_COLORS_DYNAMIC_COLOR_UTIL_H_
+#define IOS_CHROME_COMMON_UI_COLORS_DYNAMIC_COLOR_UTIL_H_
 
 #import <UIKit/UIKit.h>
 
@@ -23,4 +23,4 @@
 
 }  // namespace color
 
-#endif  // IOS_CHROME_COMMON_COLORS_DYNAMIC_COLOR_UTIL_H_
+#endif  // IOS_CHROME_COMMON_UI_COLORS_DYNAMIC_COLOR_UTIL_H_
diff --git a/ios/chrome/common/colors/dynamic_color_util.mm b/ios/chrome/common/ui/colors/dynamic_color_util.mm
similarity index 90%
rename from ios/chrome/common/colors/dynamic_color_util.mm
rename to ios/chrome/common/ui/colors/dynamic_color_util.mm
index 3fb4e8c3..a96df43 100644
--- a/ios/chrome/common/colors/dynamic_color_util.mm
+++ b/ios/chrome/common/ui/colors/dynamic_color_util.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/common/colors/dynamic_color_util.h"
+#import "ios/chrome/common/ui/colors/dynamic_color_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/common/colors/resources/BUILD.gn b/ios/chrome/common/ui/colors/resources/BUILD.gn
similarity index 100%
rename from ios/chrome/common/colors/resources/BUILD.gn
rename to ios/chrome/common/ui/colors/resources/BUILD.gn
diff --git a/ios/chrome/common/colors/resources/background_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/background_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/background_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/background_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/background_dark_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/background_dark_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/background_dark_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/background_dark_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/blue_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/blue_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/blue_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/blue_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/blue_dark_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/blue_dark_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/blue_dark_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/blue_dark_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/blue_halo_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/blue_halo_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/blue_halo_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/blue_halo_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/close_button_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/close_button_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/close_button_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/close_button_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/close_button_dark_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/close_button_dark_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/close_button_dark_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/close_button_dark_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/disabled_tint_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/disabled_tint_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/disabled_tint_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/disabled_tint_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/favicon_background_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/favicon_background_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/favicon_background_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/favicon_background_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/green_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/green_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/green_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/green_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/green_dark_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/green_dark_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/green_dark_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/green_dark_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/grey_100_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/grey_100_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/grey_100_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/grey_100_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/grey_200_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/grey_200_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/grey_200_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/grey_200_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/grey_300_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/grey_300_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/grey_300_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/grey_300_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/grey_400_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/grey_400_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/grey_400_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/grey_400_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/grey_500_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/grey_500_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/grey_500_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/grey_500_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/grey_50_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/grey_50_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/grey_50_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/grey_50_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/grey_600_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/grey_600_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/grey_600_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/grey_600_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/grey_700_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/grey_700_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/grey_700_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/grey_700_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/grey_800_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/grey_800_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/grey_800_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/grey_800_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/grey_900_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/grey_900_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/grey_900_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/grey_900_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/mdc_ink_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/mdc_ink_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/mdc_ink_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/mdc_ink_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/mdc_secondary_ink_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/mdc_secondary_ink_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/mdc_secondary_ink_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/mdc_secondary_ink_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/placeholder_image_tint_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/placeholder_image_tint_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/placeholder_image_tint_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/placeholder_image_tint_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/red_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/red_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/red_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/red_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/red_dark_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/red_dark_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/red_dark_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/red_dark_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/scrim_background_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/scrim_background_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/scrim_background_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/scrim_background_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/separator_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/separator_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/separator_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/separator_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/solid_button_text_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/solid_button_text_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/solid_button_text_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/solid_button_text_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/table_view_row_highlight_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/table_view_row_highlight_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/table_view_row_highlight_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/table_view_row_highlight_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/table_view_row_highlight_dark_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/table_view_row_highlight_dark_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/table_view_row_highlight_dark_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/table_view_row_highlight_dark_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/text_primary_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/text_primary_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/text_primary_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/text_primary_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/text_primary_dark_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/text_primary_dark_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/text_primary_dark_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/text_primary_dark_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/text_secondary_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/text_secondary_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/text_secondary_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/text_secondary_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/text_secondary_dark_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/text_secondary_dark_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/text_secondary_dark_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/text_secondary_dark_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/textfield_background_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/textfield_background_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/textfield_background_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/textfield_background_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/textfield_background_dark_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/textfield_background_dark_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/textfield_background_dark_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/textfield_background_dark_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/textfield_placeholder_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/textfield_placeholder_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/textfield_placeholder_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/textfield_placeholder_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/textfield_placeholder_dark_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/textfield_placeholder_dark_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/textfield_placeholder_dark_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/textfield_placeholder_dark_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/tint_dark_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/tint_dark_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/tint_dark_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/tint_dark_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/toolbar_button_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/toolbar_button_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/toolbar_button_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/toolbar_button_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/toolbar_button_dark_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/toolbar_button_dark_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/toolbar_button_dark_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/toolbar_button_dark_color.colorset/Contents.json
diff --git a/ios/chrome/common/colors/resources/toolbar_shadow_color.colorset/Contents.json b/ios/chrome/common/ui/colors/resources/toolbar_shadow_color.colorset/Contents.json
similarity index 100%
rename from ios/chrome/common/colors/resources/toolbar_shadow_color.colorset/Contents.json
rename to ios/chrome/common/ui/colors/resources/toolbar_shadow_color.colorset/Contents.json
diff --git a/ios/chrome/common/ui/colors/semantic_color_names.h b/ios/chrome/common/ui/colors/semantic_color_names.h
new file mode 100644
index 0000000..f3975c6
--- /dev/null
+++ b/ios/chrome/common/ui/colors/semantic_color_names.h
@@ -0,0 +1,82 @@
+// 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 IOS_CHROME_COMMON_UI_COLORS_SEMANTIC_COLOR_NAMES_H_
+#define IOS_CHROME_COMMON_UI_COLORS_SEMANTIC_COLOR_NAMES_H_
+
+#import <UIKit/UIKit.h>
+
+// Element Colors
+
+extern NSString* const kBackgroundColor;
+extern NSString* const kCloseButtonColor;
+extern NSString* const kDisabledTintColor;
+// Background color used in the rounded squares behind favicons.
+extern NSString* const kFaviconBackgroundColor;
+// Ink color for an MDC button.
+extern NSString* const kMDCInkColor;
+// Ink color for a secondary style MDC button (button with transparent
+// background).
+extern NSString* const kMDCSecondaryInkColor;
+// Color used to tint placeholder images and icons.
+extern NSString* const kPlaceholderImageTintColor;
+extern NSString* const kScrimBackgroundColor;
+extern NSString* const kSeparatorColor;
+extern NSString* const kSolidButtonTextColor;
+extern NSString* const kTableViewRowHighlightColor;
+extern NSString* const kTextPrimaryColor;
+extern NSString* const kTextSecondaryColor;
+extern NSString* const kTextfieldBackgroundColor;
+extern NSString* const kTextfieldPlaceholderColor;
+// Color used for buttons on a toolbar.
+extern NSString* const kToolbarButtonColor;
+// Color used for a shadow/separator next to a toolbar.
+extern NSString* const kToolbarShadowColor;
+
+// Standard Colors
+
+// Standard blue color. This is most commonly used for the tint color on
+// standard buttons and controls.
+extern NSString* const kBlueColor;
+// Lighter blue color sometimes used as background for buttons or views where
+// the main content is |kBlueColor| (e.g the background of the collections
+// shortcuts on the NTP).
+extern NSString* const kBlueHaloColor;
+// Standard green color.
+extern NSString* const kGreenColor;
+// Standard red color. This is most commonly used for the tint color on
+// destructive controls.
+extern NSString* const kRedColor;
+
+// Grey Color Palette.
+extern NSString* const kGrey50Color;
+extern NSString* const kGrey100Color;
+extern NSString* const kGrey200Color;
+extern NSString* const kGrey300Color;
+extern NSString* const kGrey400Color;
+extern NSString* const kGrey500Color;
+extern NSString* const kGrey600Color;
+extern NSString* const kGrey700Color;
+extern NSString* const kGrey800Color;
+extern NSString* const kGrey900Color;
+
+// Temporary colors for iOS 12. Because overridePreferredInterfaceStyle isn't
+// available in iOS 12, any views that should always be dark (e.g. incognito)
+// need to use colorsets that always use the dark variant.
+// TODO(crbug.com/981889): Clean up after iOS 12 support is dropped.
+
+extern NSString* const kBackgroundDarkColor;
+extern NSString* const kCloseButtonDarkColor;
+extern NSString* const kTableViewRowHighlightDarkColor;
+extern NSString* const kTextPrimaryDarkColor;
+extern NSString* const kTextSecondaryDarkColor;
+extern NSString* const kTextfieldBackgroundDarkColor;
+extern NSString* const kTextfieldPlaceholderDarkColor;
+extern NSString* const kToolbarButtonDarkColor;
+
+extern NSString* const kBlueDarkColor;
+extern NSString* const kGreenDarkColor;
+extern NSString* const kRedDarkColor;
+
+#endif  // IOS_CHROME_COMMON_UI_COLORS_SEMANTIC_COLOR_NAMES_H_
diff --git a/ios/chrome/common/colors/semantic_color_names.mm b/ios/chrome/common/ui/colors/semantic_color_names.mm
similarity index 97%
rename from ios/chrome/common/colors/semantic_color_names.mm
rename to ios/chrome/common/ui/colors/semantic_color_names.mm
index e1a632b..e9185366 100644
--- a/ios/chrome/common/colors/semantic_color_names.mm
+++ b/ios/chrome/common/ui/colors/semantic_color_names.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/common/ui/confirmation_alert/BUILD.gn b/ios/chrome/common/ui/confirmation_alert/BUILD.gn
index 16522a9a..1e70be05 100644
--- a/ios/chrome/common/ui/confirmation_alert/BUILD.gn
+++ b/ios/chrome/common/ui/confirmation_alert/BUILD.gn
@@ -15,7 +15,7 @@
   ]
   deps = [
     ":confirmation_alert_ic_help",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/util",
     "//ios/chrome/common/ui/util:dynamic_type_util",
   ]
diff --git a/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm b/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm
index 16d9ad8..c85c4de 100644
--- a/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm
+++ b/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm
@@ -4,7 +4,7 @@
 
 #import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.h"
 
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_action_handler.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #include "ios/chrome/common/ui/util/dynamic_type_util.h"
diff --git a/ios/chrome/credential_provider_extension/BUILD.gn b/ios/chrome/credential_provider_extension/BUILD.gn
index c73d932..635e62df 100644
--- a/ios/chrome/credential_provider_extension/BUILD.gn
+++ b/ios/chrome/credential_provider_extension/BUILD.gn
@@ -45,7 +45,7 @@
 
   deps = [
     ":system_strings",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
     "//ios/chrome/credential_provider_extension/resources",
     "//ios/chrome/credential_provider_extension/ui",
   ]
diff --git a/ios/chrome/share_extension/BUILD.gn b/ios/chrome/share_extension/BUILD.gn
index 6785a79..8e95c2eb 100644
--- a/ios/chrome/share_extension/BUILD.gn
+++ b/ios/chrome/share_extension/BUILD.gn
@@ -51,7 +51,7 @@
     "//ios/chrome/common/app_group",
     "//ios/chrome/common/app_group:client",
     "//ios/chrome/common/app_group:command",
-    "//ios/chrome/common/colors",
+    "//ios/chrome/common/ui/colors",
   ]
   bundle_deps_filter = [ "//third_party/icu:icudata" ]
 
diff --git a/ios/chrome/share_extension/share_extension_view.mm b/ios/chrome/share_extension/share_extension_view.mm
index a2a6b2f..9c2f0fb 100644
--- a/ios/chrome/share_extension/share_extension_view.mm
+++ b/ios/chrome/share_extension/share_extension_view.mm
@@ -5,7 +5,7 @@
 #import "ios/chrome/share_extension/share_extension_view.h"
 
 #include "base/logging.h"
-#import "ios/chrome/common/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/share_extension/ui_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/test/testing_application_context.h b/ios/chrome/test/testing_application_context.h
index 2b9e143..b027458e 100644
--- a/ios/chrome/test/testing_application_context.h
+++ b/ios/chrome/test/testing_application_context.h
@@ -61,6 +61,7 @@
   component_updater::ComponentUpdateService* GetComponentUpdateService()
       override;
   network::NetworkConnectionTracker* GetNetworkConnectionTracker() override;
+  BrowserPolicyConnectorIOS* GetBrowserPolicyConnector() override;
 
  private:
   base::ThreadChecker thread_checker_;
diff --git a/ios/chrome/test/testing_application_context.mm b/ios/chrome/test/testing_application_context.mm
index e54e9cec..ad7cf52 100644
--- a/ios/chrome/test/testing_application_context.mm
+++ b/ios/chrome/test/testing_application_context.mm
@@ -189,3 +189,12 @@
   DCHECK(thread_checker_.CalledOnValidThread());
   return test_network_connection_tracker_.get();
 }
+
+BrowserPolicyConnectorIOS*
+TestingApplicationContext::GetBrowserPolicyConnector() {
+  DCHECK(thread_checker_.CalledOnValidThread());
+
+  // TODO(crbug.com/1055318): Determine what level of support is needed for
+  // unittesting and return a mock or fake here.
+  return nullptr;
+}
diff --git a/media/audio/wav_audio_handler.cc b/media/audio/wav_audio_handler.cc
index 925e82f..a3426bd8 100644
--- a/media/audio/wav_audio_handler.cc
+++ b/media/audio/wav_audio_handler.cc
@@ -58,10 +58,13 @@
 };
 
 bool ParamsAreValid(const WavAudioParameters& params) {
+  const uint16_t bytes_per_sample = params.bits_per_sample / 8;
   return (params.audio_format == kAudioFormatPCM && params.num_channels != 0u &&
           params.num_channels <= static_cast<uint16_t>(limits::kMaxChannels) &&
           params.sample_rate != 0u && params.bits_per_sample != 0u &&
           params.bits_per_sample % 8u == 0u &&
+          (bytes_per_sample == 1 || bytes_per_sample == 2 ||
+           bytes_per_sample == 4) &&
           (!params.is_extensible ||
            params.valid_bits_per_sample == params.bits_per_sample));
 }
diff --git a/media/base/decryptor.h b/media/base/decryptor.h
index 0aef705..e084056 100644
--- a/media/base/decryptor.h
+++ b/media/base/decryptor.h
@@ -94,14 +94,14 @@
   //
   // First Parameter: Indicates initialization success.
   // - Set to true if initialization was successful. False if an error occurred.
-  typedef base::Callback<void(bool)> DecoderInitCB;
+  using DecoderInitCB = base::OnceCallback<void(bool)>;
 
   // Initializes a decoder with the given |config|, executing the |init_cb|
   // upon completion.
   virtual void InitializeAudioDecoder(const AudioDecoderConfig& config,
-                                      const DecoderInitCB& init_cb) = 0;
+                                      DecoderInitCB init_cb) = 0;
   virtual void InitializeVideoDecoder(const VideoDecoderConfig& config,
-                                      const DecoderInitCB& init_cb) = 0;
+                                      DecoderInitCB init_cb) = 0;
 
   // Helper structure for managing multiple decoded audio buffers per input.
   typedef std::list<scoped_refptr<AudioBuffer> > AudioFrames;
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h
index 0c91d40e..1faccc7 100644
--- a/media/base/mock_filters.h
+++ b/media/base/mock_filters.h
@@ -496,11 +496,9 @@
                     DecryptCB decrypt_cb));
   MOCK_METHOD1(CancelDecrypt, void(StreamType stream_type));
   MOCK_METHOD2(InitializeAudioDecoder,
-               void(const AudioDecoderConfig& config,
-                    const DecoderInitCB& init_cb));
+               void(const AudioDecoderConfig& config, DecoderInitCB init_cb));
   MOCK_METHOD2(InitializeVideoDecoder,
-               void(const VideoDecoderConfig& config,
-                    const DecoderInitCB& init_cb));
+               void(const VideoDecoderConfig& config, DecoderInitCB init_cb));
   MOCK_METHOD2(DecryptAndDecodeAudio,
                void(scoped_refptr<DecoderBuffer> encrypted,
                     const AudioDecodeCB& audio_decode_cb));
diff --git a/media/cdm/aes_decryptor.cc b/media/cdm/aes_decryptor.cc
index 36f46f9..9b49a33 100644
--- a/media/cdm/aes_decryptor.cc
+++ b/media/cdm/aes_decryptor.cc
@@ -524,15 +524,15 @@
 }
 
 void AesDecryptor::InitializeAudioDecoder(const AudioDecoderConfig& config,
-                                          const DecoderInitCB& init_cb) {
+                                          DecoderInitCB init_cb) {
   // AesDecryptor does not support audio decoding.
-  init_cb.Run(false);
+  std::move(init_cb).Run(false);
 }
 
 void AesDecryptor::InitializeVideoDecoder(const VideoDecoderConfig& config,
-                                          const DecoderInitCB& init_cb) {
+                                          DecoderInitCB init_cb) {
   // AesDecryptor does not support video decoding.
-  init_cb.Run(false);
+  std::move(init_cb).Run(false);
 }
 
 void AesDecryptor::DecryptAndDecodeAudio(scoped_refptr<DecoderBuffer> encrypted,
diff --git a/media/cdm/aes_decryptor.h b/media/cdm/aes_decryptor.h
index 7903036d..f96e07a 100644
--- a/media/cdm/aes_decryptor.h
+++ b/media/cdm/aes_decryptor.h
@@ -74,9 +74,9 @@
                DecryptCB decrypt_cb) override;
   void CancelDecrypt(StreamType stream_type) override;
   void InitializeAudioDecoder(const AudioDecoderConfig& config,
-                              const DecoderInitCB& init_cb) override;
+                              DecoderInitCB init_cb) override;
   void InitializeVideoDecoder(const VideoDecoderConfig& config,
-                              const DecoderInitCB& init_cb) override;
+                              DecoderInitCB init_cb) override;
   void DecryptAndDecodeAudio(scoped_refptr<DecoderBuffer> encrypted,
                              const AudioDecodeCB& audio_decode_cb) override;
   void DecryptAndDecodeVideo(scoped_refptr<DecoderBuffer> encrypted,
diff --git a/media/cdm/cdm_adapter.cc b/media/cdm/cdm_adapter.cc
index a492ca5..5ccb0eb 100644
--- a/media/cdm/cdm_adapter.cc
+++ b/media/cdm/cdm_adapter.cc
@@ -238,9 +238,9 @@
   cdm_promise_adapter_.Clear();
 
   if (audio_init_cb_)
-    audio_init_cb_.Run(false);
+    std::move(audio_init_cb_).Run(false);
   if (video_init_cb_)
-    video_init_cb_.Run(false);
+    std::move(video_init_cb_).Run(false);
 }
 
 CdmWrapper* CdmAdapter::CreateCdmInstance(const std::string& key_system) {
@@ -494,7 +494,7 @@
 }
 
 void CdmAdapter::InitializeAudioDecoder(const AudioDecoderConfig& config,
-                                        const DecoderInitCB& init_cb) {
+                                        DecoderInitCB init_cb) {
   DVLOG(2) << __func__ << ": " << config.AsHumanReadableString();
   DCHECK(task_runner_->BelongsToCurrentThread());
   DCHECK(!audio_init_cb_);
@@ -504,7 +504,7 @@
   if (cdm_config.codec == cdm::kUnknownAudioCodec) {
     DVLOG(1) << __func__
              << ": Unsupported config: " << config.AsHumanReadableString();
-    init_cb.Run(false);
+    std::move(init_cb).Run(false);
     return;
   }
 
@@ -512,7 +512,7 @@
   if (status != cdm::kSuccess && status != cdm::kDeferredInitialization) {
     DCHECK(status == cdm::kInitializationError);
     DVLOG(1) << __func__ << ": status = " << status;
-    init_cb.Run(false);
+    std::move(init_cb).Run(false);
     return;
   }
 
@@ -521,15 +521,15 @@
 
   if (status == cdm::kDeferredInitialization) {
     DVLOG(1) << "Deferred initialization in " << __func__;
-    audio_init_cb_ = init_cb;
+    audio_init_cb_ = std::move(init_cb);
     return;
   }
 
-  init_cb.Run(true);
+  std::move(init_cb).Run(true);
 }
 
 void CdmAdapter::InitializeVideoDecoder(const VideoDecoderConfig& config,
-                                        const DecoderInitCB& init_cb) {
+                                        DecoderInitCB init_cb) {
   DVLOG(2) << __func__ << ": " << config.AsHumanReadableString();
   DCHECK(task_runner_->BelongsToCurrentThread());
   DCHECK(!video_init_cb_);
@@ -539,7 +539,7 @@
   if (config.alpha_mode() != VideoDecoderConfig::AlphaMode::kIsOpaque) {
     DVLOG(1) << __func__
              << ": Unsupported config: " << config.AsHumanReadableString();
-    init_cb.Run(false);
+    std::move(init_cb).Run(false);
     return;
   }
 
@@ -550,7 +550,7 @@
   if (cdm_config.codec == cdm::kUnknownVideoCodec) {
     DVLOG(1) << __func__
              << ": Unsupported config: " << config.AsHumanReadableString();
-    init_cb.Run(false);
+    std::move(init_cb).Run(false);
     return;
   }
 
@@ -558,7 +558,7 @@
   if (status != cdm::kSuccess && status != cdm::kDeferredInitialization) {
     DCHECK(status == cdm::kInitializationError);
     DVLOG(1) << __func__ << ": status = " << status;
-    init_cb.Run(false);
+    std::move(init_cb).Run(false);
     return;
   }
 
@@ -567,11 +567,11 @@
 
   if (status == cdm::kDeferredInitialization) {
     DVLOG(1) << "Deferred initialization in " << __func__;
-    video_init_cb_ = init_cb;
+    video_init_cb_ = std::move(init_cb);
     return;
   }
 
-  init_cb.Run(true);
+  std::move(init_cb).Run(true);
 }
 
 void CdmAdapter::DecryptAndDecodeAudio(scoped_refptr<DecoderBuffer> encrypted,
diff --git a/media/cdm/cdm_adapter.h b/media/cdm/cdm_adapter.h
index dceea7a2..b2ecdaa 100644
--- a/media/cdm/cdm_adapter.h
+++ b/media/cdm/cdm_adapter.h
@@ -103,9 +103,9 @@
                DecryptCB decrypt_cb) final;
   void CancelDecrypt(StreamType stream_type) final;
   void InitializeAudioDecoder(const AudioDecoderConfig& config,
-                              const DecoderInitCB& init_cb) final;
+                              DecoderInitCB init_cb) final;
   void InitializeVideoDecoder(const VideoDecoderConfig& config,
-                              const DecoderInitCB& init_cb) final;
+                              DecoderInitCB init_cb) final;
   void DecryptAndDecodeAudio(scoped_refptr<DecoderBuffer> encrypted,
                              const AudioDecodeCB& audio_decode_cb) final;
   void DecryptAndDecodeVideo(scoped_refptr<DecoderBuffer> encrypted,
diff --git a/media/filters/decoder_selector_unittest.cc b/media/filters/decoder_selector_unittest.cc
index eefa460e..092b57bc 100644
--- a/media/filters/decoder_selector_unittest.cc
+++ b/media/filters/decoder_selector_unittest.cc
@@ -27,6 +27,7 @@
 #endif  // !defined(OS_ANDROID)
 
 using ::base::test::RunCallback;
+using ::base::test::RunOnceCallback;
 using ::testing::_;
 using ::testing::IsNull;
 using ::testing::NiceMock;
@@ -232,11 +233,13 @@
     switch (TypeParam::kStreamType) {
       case DemuxerStream::AUDIO:
         EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
-            .WillRepeatedly(RunCallback<1>(capability == kDecryptAndDecode));
+            .WillRepeatedly(
+                RunOnceCallback<1>(capability == kDecryptAndDecode));
         break;
       case DemuxerStream::VIDEO:
         EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
-            .WillRepeatedly(RunCallback<1>(capability == kDecryptAndDecode));
+            .WillRepeatedly(
+                RunOnceCallback<1>(capability == kDecryptAndDecode));
         break;
       default:
         NOTREACHED();
diff --git a/media/filters/decrypting_audio_decoder_unittest.cc b/media/filters/decrypting_audio_decoder_unittest.cc
index acb150e..8a485929 100644
--- a/media/filters/decrypting_audio_decoder_unittest.cc
+++ b/media/filters/decrypting_audio_decoder_unittest.cc
@@ -24,6 +24,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 
 using ::base::test::RunCallback;
+using ::base::test::RunOnceCallback;
 using ::testing::_;
 using ::testing::AtMost;
 using ::testing::Return;
@@ -102,7 +103,7 @@
     SetCdmType(CDM_WITH_DECRYPTOR);
     EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
         .Times(AtMost(1))
-        .WillOnce(RunCallback<1>(true));
+        .WillOnce(RunOnceCallback<1>(true));
     EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kAudio, _))
         .WillOnce(SaveArg<1>(&key_added_cb_));
 
@@ -117,7 +118,7 @@
   void ReinitializeConfigChange(const AudioDecoderConfig& new_config) {
     EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kAudio));
     EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
-        .WillOnce(RunCallback<1>(true));
+        .WillOnce(RunOnceCallback<1>(true));
     EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kAudio, _))
         .WillOnce(SaveArg<1>(&key_added_cb_));
     decoder_->Initialize(new_config, cdm_context_.get(),
@@ -285,7 +286,7 @@
 TEST_F(DecryptingAudioDecoderTest, Initialize_UnsupportedAudioConfig) {
   SetCdmType(CDM_WITH_DECRYPTOR);
   EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
-      .WillOnce(RunCallback<1>(false));
+      .WillOnce(RunOnceCallback<1>(false));
 
   AudioDecoderConfig config(kCodecVorbis, kSampleFormatPlanarF32,
                             CHANNEL_LAYOUT_STEREO, kSampleRate,
@@ -356,7 +357,7 @@
 
   EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
       .Times(AtMost(1))
-      .WillOnce(RunCallback<1>(true));
+      .WillOnce(RunOnceCallback<1>(true));
 
   // The new config is different from the initial config in bits-per-channel,
   // channel layout and samples_per_second.
@@ -378,7 +379,7 @@
 
   EXPECT_CALL(*decryptor_, InitializeAudioDecoder(_, _))
       .Times(AtMost(1))
-      .WillOnce(RunCallback<1>(true));
+      .WillOnce(RunOnceCallback<1>(true));
 
   // The new config is different from the initial config in bits-per-channel,
   // channel layout and samples_per_second.
diff --git a/media/filters/decrypting_video_decoder_unittest.cc b/media/filters/decrypting_video_decoder_unittest.cc
index 3fd7b65..6146cf5b 100644
--- a/media/filters/decrypting_video_decoder_unittest.cc
+++ b/media/filters/decrypting_video_decoder_unittest.cc
@@ -23,11 +23,13 @@
 #include "testing/gmock/include/gmock/gmock.h"
 
 using ::base::test::RunCallback;
+using ::base::test::RunOnceCallback;
 using ::testing::_;
 using ::testing::Invoke;
 using ::testing::Return;
 using ::testing::SaveArg;
 using ::testing::StrictMock;
+using ::testing::WithArg;
 
 namespace media {
 
@@ -89,7 +91,7 @@
   void Initialize() {
     SetCdmType(CDM_WITH_DECRYPTOR);
     EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
-        .WillOnce(RunCallback<1>(true));
+        .WillOnce(RunOnceCallback<1>(true));
     EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kVideo, _))
         .WillOnce(SaveArg<1>(&key_added_cb_));
 
@@ -100,7 +102,7 @@
   void Reinitialize(const VideoDecoderConfig& new_config) {
     EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kVideo));
     EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
-        .WillOnce(RunCallback<1>(true));
+        .WillOnce(RunOnceCallback<1>(true));
     EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kVideo, _))
         .WillOnce(SaveArg<1>(&key_added_cb_));
 
@@ -256,7 +258,7 @@
 TEST_F(DecryptingVideoDecoderTest, Initialize_Failure) {
   SetCdmType(CDM_WITH_DECRYPTOR);
   EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
-      .WillRepeatedly(RunCallback<1>(false));
+      .WillRepeatedly(RunOnceCallback<1>(false));
   EXPECT_CALL(*decryptor_, RegisterNewKeyCB(Decryptor::kVideo, _))
       .WillRepeatedly(SaveArg<1>(&key_added_cb_));
 
@@ -282,7 +284,7 @@
 
   EXPECT_CALL(*decryptor_, DeinitializeDecoder(Decryptor::kVideo));
   EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
-      .WillOnce(RunCallback<1>(false));
+      .WillOnce(RunOnceCallback<1>(false));
 
   // Reinitialize() expects the reinitialization to succeed. Call
   // InitializeAndExpectResult() directly to test the reinitialization failure.
@@ -406,7 +408,9 @@
 TEST_F(DecryptingVideoDecoderTest, Destroy_DuringPendingDecoderInit) {
   SetCdmType(CDM_WITH_DECRYPTOR);
   EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
-      .WillOnce(SaveArg<1>(&pending_init_cb_));
+      .WillOnce(WithArg<1>(Invoke([&](Decryptor::DecoderInitCB init_cb) {
+        pending_init_cb_ = std::move(init_cb);
+      })));
 
   InitializeAndExpectResult(TestVideoConfig::NormalEncrypted(), false);
   EXPECT_FALSE(!pending_init_cb_);
diff --git a/media/filters/video_decoder_stream_unittest.cc b/media/filters/video_decoder_stream_unittest.cc
index b21122e1..abd89199 100644
--- a/media/filters/video_decoder_stream_unittest.cc
+++ b/media/filters/video_decoder_stream_unittest.cc
@@ -27,6 +27,7 @@
 #endif
 
 using ::base::test::RunCallback;
+using ::base::test::RunOnceCallback;
 using ::testing::_;
 using ::testing::AnyNumber;
 using ::testing::Assign;
@@ -104,7 +105,7 @@
       // Decryptor can only decrypt (not decrypt-and-decode) so that
       // DecryptingDemuxerStream will be used.
       EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
-          .WillRepeatedly(RunCallback<1>(false));
+          .WillRepeatedly(RunOnceCallback<1>(false));
       EXPECT_CALL(*decryptor_, Decrypt(_, _, _))
           .WillRepeatedly(Invoke(this, &VideoDecoderStreamTest::Decrypt));
     }
diff --git a/media/fuchsia/cdm/fuchsia_decryptor.cc b/media/fuchsia/cdm/fuchsia_decryptor.cc
index 2d3fe35..b36fcfb 100644
--- a/media/fuchsia/cdm/fuchsia_decryptor.cc
+++ b/media/fuchsia/cdm/fuchsia_decryptor.cc
@@ -59,15 +59,15 @@
 }
 
 void FuchsiaDecryptor::InitializeAudioDecoder(const AudioDecoderConfig& config,
-                                              const DecoderInitCB& init_cb) {
+                                              DecoderInitCB init_cb) {
   // Only decryption is supported.
-  init_cb.Run(false);
+  std::move(init_cb).Run(false);
 }
 
 void FuchsiaDecryptor::InitializeVideoDecoder(const VideoDecoderConfig& config,
-                                              const DecoderInitCB& init_cb) {
+                                              DecoderInitCB init_cb) {
   // Only decryption is supported.
-  init_cb.Run(false);
+  std::move(init_cb).Run(false);
 }
 
 void FuchsiaDecryptor::DecryptAndDecodeAudio(
diff --git a/media/fuchsia/cdm/fuchsia_decryptor.h b/media/fuchsia/cdm/fuchsia_decryptor.h
index 3a88aa9..9b8b71a2 100644
--- a/media/fuchsia/cdm/fuchsia_decryptor.h
+++ b/media/fuchsia/cdm/fuchsia_decryptor.h
@@ -39,9 +39,9 @@
                DecryptCB decrypt_cb) override;
   void CancelDecrypt(StreamType stream_type) override;
   void InitializeAudioDecoder(const AudioDecoderConfig& config,
-                              const DecoderInitCB& init_cb) override;
+                              DecoderInitCB init_cb) override;
   void InitializeVideoDecoder(const VideoDecoderConfig& config,
-                              const DecoderInitCB& init_cb) override;
+                              DecoderInitCB init_cb) override;
   void DecryptAndDecodeAudio(scoped_refptr<DecoderBuffer> encrypted,
                              const AudioDecodeCB& audio_decode_cb) override;
   void DecryptAndDecodeVideo(scoped_refptr<DecoderBuffer> encrypted,
diff --git a/media/gpu/windows/d3d11_decryptor.cc b/media/gpu/windows/d3d11_decryptor.cc
index ec089e2..9f64e0c 100644
--- a/media/gpu/windows/d3d11_decryptor.cc
+++ b/media/gpu/windows/d3d11_decryptor.cc
@@ -212,15 +212,15 @@
 }
 
 void D3D11Decryptor::InitializeAudioDecoder(const AudioDecoderConfig& config,
-                                            const DecoderInitCB& init_cb) {
+                                            DecoderInitCB init_cb) {
   // D3D11Decryptor does not support audio decoding.
-  init_cb.Run(false);
+  std::move(init_cb).Run(false);
 }
 
 void D3D11Decryptor::InitializeVideoDecoder(const VideoDecoderConfig& config,
-                                            const DecoderInitCB& init_cb) {
+                                            DecoderInitCB init_cb) {
   // D3D11Decryptor does not support video decoding.
-  init_cb.Run(false);
+  std::move(init_cb).Run(false);
 }
 
 void D3D11Decryptor::DecryptAndDecodeAudio(
diff --git a/media/gpu/windows/d3d11_decryptor.h b/media/gpu/windows/d3d11_decryptor.h
index 619d50cc..2f49a28 100644
--- a/media/gpu/windows/d3d11_decryptor.h
+++ b/media/gpu/windows/d3d11_decryptor.h
@@ -29,9 +29,9 @@
                DecryptCB decrypt_cb) final;
   void CancelDecrypt(StreamType stream_type) final;
   void InitializeAudioDecoder(const AudioDecoderConfig& config,
-                              const DecoderInitCB& init_cb) final;
+                              DecoderInitCB init_cb) final;
   void InitializeVideoDecoder(const VideoDecoderConfig& config,
-                              const DecoderInitCB& init_cb) final;
+                              DecoderInitCB init_cb) final;
   void DecryptAndDecodeAudio(scoped_refptr<DecoderBuffer> encrypted,
                              const AudioDecodeCB& audio_decode_cb) final;
   void DecryptAndDecodeVideo(scoped_refptr<DecoderBuffer> encrypted,
diff --git a/media/mojo/clients/mojo_decryptor.cc b/media/mojo/clients/mojo_decryptor.cc
index 593389f..de20dd32 100644
--- a/media/mojo/clients/mojo_decryptor.cc
+++ b/media/mojo/clients/mojo_decryptor.cc
@@ -134,23 +134,23 @@
 }
 
 void MojoDecryptor::InitializeAudioDecoder(const AudioDecoderConfig& config,
-                                           const DecoderInitCB& init_cb) {
+                                           DecoderInitCB init_cb) {
   DVLOG(1) << __func__;
   DCHECK(thread_checker_.CalledOnValidThread());
 
   remote_decryptor_->InitializeAudioDecoder(
-      config, mojo::WrapCallbackWithDefaultInvokeIfNotRun(
-                  ToOnceCallback(init_cb), false));
+      config,
+      mojo::WrapCallbackWithDefaultInvokeIfNotRun(std::move(init_cb), false));
 }
 
 void MojoDecryptor::InitializeVideoDecoder(const VideoDecoderConfig& config,
-                                           const DecoderInitCB& init_cb) {
+                                           DecoderInitCB init_cb) {
   DVLOG(1) << __func__;
   DCHECK(thread_checker_.CalledOnValidThread());
 
   remote_decryptor_->InitializeVideoDecoder(
-      config, mojo::WrapCallbackWithDefaultInvokeIfNotRun(
-                  ToOnceCallback(init_cb), false));
+      config,
+      mojo::WrapCallbackWithDefaultInvokeIfNotRun(std::move(init_cb), false));
 }
 
 void MojoDecryptor::DecryptAndDecodeAudio(
diff --git a/media/mojo/clients/mojo_decryptor.h b/media/mojo/clients/mojo_decryptor.h
index 47dd90f..d5d57882 100644
--- a/media/mojo/clients/mojo_decryptor.h
+++ b/media/mojo/clients/mojo_decryptor.h
@@ -40,9 +40,9 @@
                DecryptCB decrypt_cb) final;
   void CancelDecrypt(StreamType stream_type) final;
   void InitializeAudioDecoder(const AudioDecoderConfig& config,
-                              const DecoderInitCB& init_cb) final;
+                              DecoderInitCB init_cb) final;
   void InitializeVideoDecoder(const VideoDecoderConfig& config,
-                              const DecoderInitCB& init_cb) final;
+                              DecoderInitCB init_cb) final;
   void DecryptAndDecodeAudio(scoped_refptr<DecoderBuffer> encrypted,
                              const AudioDecodeCB& audio_decode_cb) final;
   void DecryptAndDecodeVideo(scoped_refptr<DecoderBuffer> encrypted,
@@ -61,7 +61,6 @@
   // TODO(xhwang): Update Decryptor to use OnceCallback. The change is easy,
   // but updating tests is hard given gmock doesn't support move-only types.
   // See http://crbug.com/751838
-  using DecoderInitOnceCB = base::OnceCallback<DecoderInitCB::RunType>;
   using AudioDecodeOnceCB = base::OnceCallback<AudioDecodeCB::RunType>;
   using VideoDecodeOnceCB = base::OnceCallback<VideoDecodeCB::RunType>;
 
diff --git a/net/base/fuzzer_test_support.cc b/net/base/fuzzer_test_support.cc
index 5bbba07..a977ebc 100644
--- a/net/base/fuzzer_test_support.cc
+++ b/net/base/fuzzer_test_support.cc
@@ -6,6 +6,7 @@
 #include "base/command_line.h"
 #include "base/i18n/icu_util.h"
 #include "base/logging.h"
+#include "base/test/scoped_run_loop_timeout.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_timeouts.h"
 
@@ -25,6 +26,9 @@
     task_environment = std::make_unique<base::test::TaskEnvironment>(
         base::test::TaskEnvironment::MainThreadType::IO);
 
+    increased_timeout_ = std::make_unique<base::test::ScopedRunLoopTimeout>(
+        FROM_HERE, TestTimeouts::action_max_timeout());
+
     // Set up ICU. ICU is used internally by GURL, which is used throughout the
     // //net code. Initializing ICU is important to prevent fuzztests from
     // asserting when handling non-ASCII urls.
@@ -40,6 +44,9 @@
   // TaskEnvironment between runs.
   std::unique_ptr<base::test::TaskEnvironment> task_environment;
 
+  // Fuzzing tests often need to Run() for longer than action_timeout().
+  std::unique_ptr<base::test::ScopedRunLoopTimeout> increased_timeout_;
+
   base::AtExitManager at_exit_manager;
 };
 
diff --git a/net/dns/public/doh_provider_list.cc b/net/dns/public/doh_provider_list.cc
index 2999040..901697a 100644
--- a/net/dns/public/doh_provider_list.cc
+++ b/net/dns/public/doh_provider_list.cc
@@ -14,12 +14,20 @@
                                    std::set<std::string> dns_over_tls_hostnames,
                                    std::string dns_over_https_template,
                                    std::string ui_name,
-                                   std::string privacy_policy)
+                                   std::string privacy_policy,
+                                   bool display_globally,
+                                   std::set<std::string> display_countries)
     : provider(std::move(provider)),
       dns_over_tls_hostnames(std::move(dns_over_tls_hostnames)),
       dns_over_https_template(std::move(dns_over_https_template)),
       ui_name(std::move(ui_name)),
-      privacy_policy(std::move(privacy_policy)) {
+      privacy_policy(std::move(privacy_policy)),
+      display_globally(display_globally),
+      display_countries(std::move(display_countries)) {
+  DCHECK(!display_globally || display_countries.empty());
+  for (const auto& display_country : display_countries) {
+    DCHECK_EQ(2u, display_country.size());
+  }
   for (const std::string& ip_str : ip_strs) {
     IPAddress ip_address;
     bool success = ip_address.AssignFromIPLiteral(ip_str);
@@ -42,7 +50,8 @@
            "2a0d:2a00:2::1"},
           {"adult-filter-dns.cleanbrowsing.org"} /* dot_hostnames */,
           "https://doh.cleanbrowsing.org/doh/adult-filter{?dns}",
-          "" /* ui_name */, "" /* privacy_policy */),
+          "" /* ui_name */, "" /* privacy_policy */,
+          false /* display_globally */, {} /* display_countries */),
       DohProviderEntry(
           "CleanBrowsingFamily",
           {"185.228.168.168", "185.228.169.168",
@@ -50,14 +59,16 @@
           {"family-filter-dns.cleanbrowsing.org"} /* dot_hostnames */,
           "https://doh.cleanbrowsing.org/doh/family-filter{?dns}",
           "CleanBrowsing family filter" /* ui_name */,
-          "https://cleanbrowsing.org/privacy" /* privacy_policy */),
+          "https://cleanbrowsing.org/privacy" /* privacy_policy */,
+          true /* display_globally */, {} /* display_countries */),
       DohProviderEntry(
           "CleanBrowsingSecure",
           {"185.228.168.9", "185.228.169.9", "2a0d:2a00:1::2",
            "2a0d:2a00:2::2"},
           {"security-filter-dns.cleanbrowsing.org"} /* dot_hostnames */,
           "https://doh.cleanbrowsing.org/doh/security-filter{?dns}",
-          "" /* ui_name */, "" /* privacy_policy */),
+          "" /* ui_name */, "" /* privacy_policy */,
+          false /* display_globally */, {} /* display_countries */),
       DohProviderEntry(
           "Cloudflare",
           {"1.1.1.1", "1.0.0.1", "2606:4700:4700::1111",
@@ -67,20 +78,23 @@
           "https://chrome.cloudflare-dns.com/dns-query",
           "Cloudflare" /* ui_name */,
           "https://developers.cloudflare.com/1.1.1.1/commitment-to-privacy/"
-          "privacy-policy/privacy-policy/" /* privacy_policy */),
+          "privacy-policy/privacy-policy/" /* privacy_policy */,
+          true /* display_globally */, {} /* display_countries */),
       DohProviderEntry("Comcast",
                        {"75.75.75.75", "75.75.76.76", "2001:558:feed::1",
                         "2001:558:feed::2"},
                        {"dot.xfinity.com"} /* dns_over_tls_hostnames */,
                        "https://doh.xfinity.com/dns-query{?dns}",
-                       "" /* ui_name */, "" /* privacy_policy */),
+                       "" /* ui_name */, "" /* privacy_policy */,
+                       false /* display_globally */,
+                       {} /* display_countries */),
       DohProviderEntry(
           "Dnssb", {"185.222.222.222", "185.184.222.222", "2a09::", "2a09::1"},
           {"dns.sb"} /* dns_over_tls_hostnames */,
           {"https://doh.dns.sb/dns-query?no_ecs=true{&dns}",
            false /* use_post */},
-          "DNS.SB" /* ui_name */,
-          "https://dns.sb/privacy" /* privacy_policy */),
+          "DNS.SB" /* ui_name */, "https://dns.sb/privacy" /* privacy_policy */,
+          false /* display_globally */, {"DE", "EE"} /* display_countries */),
       DohProviderEntry("Google",
                        {"8.8.8.8", "8.8.4.4", "2001:4860:4860::8888",
                         "2001:4860:4860::8844"},
@@ -89,7 +103,8 @@
                        "https://dns.google/dns-query{?dns}",
                        "Google" /* ui_name */,
                        "https://developers.google.com/speed/public-dns/"
-                       "privacy" /* privacy_policy */),
+                       "privacy" /* privacy_policy */,
+                       true /* display_globally */, {} /* display_countries */),
       DohProviderEntry("OpenDNS",
                        {"208.67.222.222", "208.67.220.220", "2620:119:35::35",
                         "2620:119:53::53"},
@@ -97,32 +112,38 @@
                        "https://doh.opendns.com/dns-query{?dns}",
                        "OpenDNS" /* ui_name */,
                        "https://www.cisco.com/c/en/us/about/legal/"
-                       "privacy-full.html" /* privacy_policy */),
+                       "privacy-full.html" /* privacy_policy */,
+                       true /* display_globally */, {} /* display_countries */),
       DohProviderEntry("OpenDNSFamily",
                        {"208.67.222.123", "208.67.220.123", "2620:119:35::123",
                         "2620:119:53::123"},
                        {""} /* dns_over_tls_hostnames */,
                        "https://doh.familyshield.opendns.com/"
                        "dns-query{?dns}",
-                       "" /* ui_name */, "" /* privacy_policy */),
+                       "" /* ui_name */, "" /* privacy_policy */,
+                       false /* display_globally */,
+                       {} /* display_countries */),
       DohProviderEntry(
           "Quad9Cdn",
           {"9.9.9.11", "149.112.112.11", "2620:fe::11", "2620:fe::fe:11"},
           {"dns11.quad9.net"} /* dns_over_tls_hostnames */,
           "https://dns11.quad9.net/dns-query", "" /* ui_name */,
-          "" /* privacy_policy */),
+          "" /* privacy_policy */, false /* display_globally */,
+          {} /* display_countries */),
       DohProviderEntry(
           "Quad9Insecure",
           {"9.9.9.10", "149.112.112.10", "2620:fe::10", "2620:fe::fe:10"},
           {"dns10.quad9.net"} /* dns_over_tls_hostnames */,
           "https://dns10.quad9.net/dns-query", "" /* ui_name */,
-          "" /* privacy_policy */),
+          "" /* privacy_policy */, false /* display_globally */,
+          {} /* display_countries */),
       DohProviderEntry(
           "Quad9Secure",
           {"9.9.9.9", "149.112.112.112", "2620:fe::fe", "2620:fe::9"},
           {"dns.quad9.net", "dns9.quad9.net"} /* dns_over_tls_hostnames */,
           "https://dns.quad9.net/dns-query", "Quad9" /* ui_name */,
-          "https://www.quad9.net/home/privacy/" /* privacy_policy */),
+          "https://www.quad9.net/home/privacy/" /* privacy_policy */,
+          true /* display_globally */, {} /* display_countries */),
   }};
   return *providers;
 }
diff --git a/net/dns/public/doh_provider_list.h b/net/dns/public/doh_provider_list.h
index 2b50f41..299a3b4 100644
--- a/net/dns/public/doh_provider_list.h
+++ b/net/dns/public/doh_provider_list.h
@@ -20,14 +20,20 @@
 // menu for secure mode. To be eligible for auto-upgrade, entries must have a
 // non-empty |ip_strs| or non-empty |dns_over_tls_hostnames|. To be eligible for
 // the dropdown menu, entries must have non-empty |ui_name| and
-// |privacy_policy|.
+// |privacy_policy|. If |display_globally| is true, the entry is eligible for
+// being displayed globally in the dropdown menu. If |display_globally| is
+// false, |display_countries| should contain the two-letter ISO 3166-1 country
+// codes, if any, where the entry is eligible for being displayed in the
+// dropdown menu.
 struct NET_EXPORT DohProviderEntry {
   DohProviderEntry(std::string provider,
                    std::set<std::string> ip_strs,
                    std::set<std::string> dns_over_tls_hostnames,
                    std::string dns_over_https_template,
                    std::string ui_name,
-                   std::string privacy_policy);
+                   std::string privacy_policy,
+                   bool display_globally,
+                   std::set<std::string> display_countries);
   DohProviderEntry(const DohProviderEntry& other);
   ~DohProviderEntry();
 
@@ -37,6 +43,8 @@
   const std::string dns_over_https_template;
   const std::string ui_name;
   const std::string privacy_policy;
+  bool display_globally;
+  std::set<std::string> display_countries;
 };
 
 // Returns the full list of DoH providers. A subset of this list may be used
diff --git a/net/http/http_server_properties.h b/net/http/http_server_properties.h
index dda8301..6c71351 100644
--- a/net/http/http_server_properties.h
+++ b/net/http/http_server_properties.h
@@ -30,7 +30,6 @@
 #include "net/base/network_isolation_key.h"
 #include "net/http/alternative_service.h"
 #include "net/http/broken_alternative_services.h"
-#include "net/http/http_server_properties.h"
 #include "net/third_party/quiche/src/quic/core/quic_bandwidth.h"
 #include "net/third_party/quiche/src/quic/core/quic_server_id.h"
 #include "net/third_party/quiche/src/quic/core/quic_versions.h"
diff --git a/services/network/public/cpp/content_security_policy/csp_source_list.h b/services/network/public/cpp/content_security_policy/csp_source_list.h
index 0cd3971..6df1891 100644
--- a/services/network/public/cpp/content_security_policy/csp_source_list.h
+++ b/services/network/public/cpp/content_security_policy/csp_source_list.h
@@ -5,6 +5,7 @@
 #ifndef SERVICES_NETWORK_PUBLIC_CPP_CONTENT_SECURITY_POLICY_CSP_SOURCE_LIST_H_
 #define SERVICES_NETWORK_PUBLIC_CPP_CONTENT_SECURITY_POLICY_CSP_SOURCE_LIST_H_
 
+#include <string>
 #include <vector>
 
 #include "base/component_export.h"
diff --git a/services/tracing/perfetto/consumer_host_unittest.cc b/services/tracing/perfetto/consumer_host_unittest.cc
index c5f3147..775e7ca4 100644
--- a/services/tracing/perfetto/consumer_host_unittest.cc
+++ b/services/tracing/perfetto/consumer_host_unittest.cc
@@ -131,7 +131,7 @@
     producer_ = std::make_unique<MockProducer>(
         base::StrCat({mojom::kPerfettoProducerNamePrefix,
                       base::NumberToString(kProducerPid)}),
-        data_source_name, perfetto_service_->GetService(),
+        data_source_name, perfetto_service_.get(),
         std::move(on_datasource_registered), std::move(on_tracing_started),
         num_packets);
   }
diff --git a/services/tracing/perfetto/perfetto_integration_unittest.cc b/services/tracing/perfetto/perfetto_integration_unittest.cc
index 9d5272a..65a4a79 100644
--- a/services/tracing/perfetto/perfetto_integration_unittest.cc
+++ b/services/tracing/perfetto/perfetto_integration_unittest.cc
@@ -61,9 +61,8 @@
 
   base::RunLoop producer_initialized_runloop;
   auto new_producer = std::make_unique<MockProducerHost>(
-      kPerfettoProducerName, kPerfettoTestDataSourceName,
-      perfetto_service()->GetService(), dummy_client.get(),
-      producer_initialized_runloop.QuitClosure());
+      kPerfettoProducerName, kPerfettoTestDataSourceName, perfetto_service(),
+      dummy_client.get(), producer_initialized_runloop.QuitClosure());
 
   producer_initialized_runloop.Run();
 
@@ -86,8 +85,8 @@
       client_disabled_callback.QuitClosure());
 
   auto producer = std::make_unique<MockProducerHost>(
-      kPerfettoProducerName, kPerfettoTestDataSourceName,
-      perfetto_service()->GetService(), client.get());
+      kPerfettoProducerName, kPerfettoTestDataSourceName, perfetto_service(),
+      client.get());
 
   client_enabled_callback.Run();
 
@@ -114,8 +113,8 @@
       client_disabled_callback.QuitClosure());
 
   auto producer = std::make_unique<MockProducerHost>(
-      kPerfettoProducerName, kPerfettoTestDataSourceName,
-      perfetto_service()->GetService(), client.get());
+      kPerfettoProducerName, kPerfettoTestDataSourceName, perfetto_service(),
+      client.get());
 
   base::RunLoop no_more_packets_runloop;
   MockConsumer consumer({kPerfettoTestDataSourceName},
@@ -158,8 +157,8 @@
       /* num_data_sources = */ 1, client_enabled_callback.QuitClosure());
 
   auto new_producer = std::make_unique<MockProducerHost>(
-      kPerfettoProducerName, kPerfettoTestDataSourceName,
-      perfetto_service()->GetService(), client.get());
+      kPerfettoProducerName, kPerfettoTestDataSourceName, perfetto_service(),
+      client.get());
 
   client_enabled_callback.Run();
 
@@ -190,8 +189,8 @@
   auto client = std::make_unique<MockProducerClient>(
       /* num_data_sources = */ 1, client_enabled_callback.QuitClosure());
   auto new_producer = std::make_unique<MockProducerHost>(
-      kPerfettoProducerName, kPerfettoTestDataSourceName,
-      perfetto_service()->GetService(), client.get());
+      kPerfettoProducerName, kPerfettoTestDataSourceName, perfetto_service(),
+      client.get());
 
   client_enabled_callback.Run();
 
@@ -253,8 +252,8 @@
       client_disabled_callback.QuitClosure());
 
   auto new_producer = std::make_unique<MockProducerHost>(
-      kPerfettoProducerName, kPerfettoTestDataSourceName,
-      perfetto_service()->GetService(), client.get());
+      kPerfettoProducerName, kPerfettoTestDataSourceName, perfetto_service(),
+      client.get());
 
   client_enabled_callback.Run();
 
@@ -304,8 +303,8 @@
 
   base::RunLoop producer_initialized_runloop;
   auto new_producer = std::make_unique<MockProducerHost>(
-      kPerfettoProducerName, "fake_data_source",
-      perfetto_service()->GetService(), client.get());
+      kPerfettoProducerName, "fake_data_source", perfetto_service(),
+      client.get());
 
   base::RunLoop no_more_packets_runloop;
   MockConsumer consumer({"fake_data_source"}, perfetto_service()->GetService(),
@@ -332,8 +331,8 @@
   auto client1 = std::make_unique<MockProducerClient>(
       /* num_data_sources = */ 1, client1_enabled_callback.QuitClosure());
   auto producer1 = std::make_unique<MockProducerHost>(
-      kPerfettoProducerName, kPerfettoTestDataSourceName,
-      perfetto_service()->GetService(), client1.get());
+      kPerfettoProducerName, kPerfettoTestDataSourceName, perfetto_service(),
+      client1.get());
 
   // Start the trace here, this is because we need to send the EnableTracing
   // call to client1, but constructing client2 will override the
@@ -353,8 +352,8 @@
       /* num_data_sources = */ 1, client2_enabled_callback.QuitClosure());
 
   auto producer2 = std::make_unique<MockProducerHost>(
-      kPerfettoProducerName, kPerfettoTestDataSourceName,
-      perfetto_service()->GetService(), client2.get());
+      kPerfettoProducerName, kPerfettoTestDataSourceName, perfetto_service(),
+      client2.get());
 
   client2_enabled_callback.Run();
 
diff --git a/services/tracing/perfetto/system_perfetto_unittest.cc b/services/tracing/perfetto/system_perfetto_unittest.cc
index d2e740e0..da7e886 100644
--- a/services/tracing/perfetto/system_perfetto_unittest.cc
+++ b/services/tracing/perfetto/system_perfetto_unittest.cc
@@ -315,8 +315,8 @@
         }
       });
   auto local_producer_host = std::make_unique<MockProducerHost>(
-      kPerfettoProducerName, kPerfettoTestDataSourceName,
-      local_service()->GetService(), local_producer_client.get());
+      kPerfettoProducerName, kPerfettoTestDataSourceName, local_service(),
+      local_producer_client.get());
 
   system_consumer.WaitForAllDataSourcesStopped();
   system_data_source_disabled_runloop.Run();
@@ -390,8 +390,8 @@
       local_data_source_enabled_runloop.QuitClosure(),
       local_data_source_disabled_runloop.QuitClosure());
   auto local_producer_host = std::make_unique<MockProducerHost>(
-      kPerfettoProducerName, kPerfettoTestDataSourceName,
-      local_service()->GetService(), local_producer_client.get());
+      kPerfettoProducerName, kPerfettoTestDataSourceName, local_service(),
+      local_producer_client.get());
 
   local_data_source_enabled_runloop.Run();
   local_consumer->WaitForAllDataSourcesStarted();
@@ -519,8 +519,8 @@
       local_data_source_enabled_runloop.QuitClosure(),
       local_data_source_disabled_runloop.QuitClosure());
   auto local_producer_host = std::make_unique<MockProducerHost>(
-      kPerfettoProducerName, kPerfettoTestDataSourceName,
-      local_service()->GetService(), local_producer_client.get());
+      kPerfettoProducerName, kPerfettoTestDataSourceName, local_service(),
+      local_producer_client.get());
   MockConsumer local_consumer(
       {kPerfettoTestDataSourceName,
        base::StrCat({kPerfettoTestDataSourceName, "1"}),
@@ -614,8 +614,8 @@
       local_data_source_enabled_runloop.QuitClosure(),
       local_data_source_disabled_runloop.QuitClosure());
   auto local_producer_host = std::make_unique<MockProducerHost>(
-      kPerfettoProducerName, kPerfettoTestDataSourceName,
-      local_service()->GetService(), local_producer_client.get());
+      kPerfettoProducerName, kPerfettoTestDataSourceName, local_service(),
+      local_producer_client.get());
   MockConsumer local_consumer(
       {kPerfettoTestDataSourceName,
        base::StrCat({kPerfettoTestDataSourceName, "1"}),
@@ -781,11 +781,11 @@
   PerfettoTracedProcess::ReconstructForTesting(producer_socket_.c_str());
   if (base::android::BuildInfo::GetInstance()->is_debug_android()) {
     EXPECT_FALSE(PerfettoTracedProcess::Get()
-                     ->SystemProducerForTesting()
+                     ->system_producer()
                      ->IsDummySystemProducerForTesting());
   } else {
     EXPECT_TRUE(PerfettoTracedProcess::Get()
-                    ->SystemProducerForTesting()
+                    ->system_producer()
                     ->IsDummySystemProducerForTesting());
   }
 }
@@ -797,7 +797,7 @@
     // The feature list is ignored on debug android builds so we should have a
     // real system producer so just bail out of this test.
     EXPECT_FALSE(PerfettoTracedProcess::Get()
-                     ->SystemProducerForTesting()
+                     ->system_producer()
                      ->IsDummySystemProducerForTesting());
     return;
   }
@@ -807,7 +807,7 @@
     feature_list.InitAndEnableFeature(features::kEnablePerfettoSystemTracing);
     PerfettoTracedProcess::ReconstructForTesting(producer_socket_.c_str());
     EXPECT_FALSE(PerfettoTracedProcess::Get()
-                     ->SystemProducerForTesting()
+                     ->system_producer()
                      ->IsDummySystemProducerForTesting());
   }
   {
@@ -815,7 +815,7 @@
     feature_list.InitAndDisableFeature(features::kEnablePerfettoSystemTracing);
     PerfettoTracedProcess::ReconstructForTesting(producer_socket_.c_str());
     EXPECT_TRUE(PerfettoTracedProcess::Get()
-                    ->SystemProducerForTesting()
+                    ->system_producer()
                     ->IsDummySystemProducerForTesting());
   }
 }
diff --git a/services/tracing/perfetto/test_utils.cc b/services/tracing/perfetto/test_utils.cc
index 6c1cf9e..ed0f85c 100644
--- a/services/tracing/perfetto/test_utils.cc
+++ b/services/tracing/perfetto/test_utils.cc
@@ -302,7 +302,7 @@
 MockProducerHost::MockProducerHost(
     const std::string& producer_name,
     const std::string& data_source_name,
-    perfetto::TracingService* service,
+    PerfettoService* service,
     MockProducerClient* producer_client,
     base::OnceClosure datasource_registered_callback)
     : producer_name_(producer_name),
@@ -311,7 +311,7 @@
   mojo::PendingRemote<mojom::ProducerClient> client;
   mojo::PendingRemote<mojom::ProducerHost> host_remote;
   auto client_receiver = client.InitWithNewPipeAndPassReceiver();
-  Initialize(std::move(client), service, producer_name_);
+  Initialize(std::move(client), service->GetService(), producer_name_);
   receiver_.Bind(host_remote.InitWithNewPipeAndPassReceiver());
   producer_client->BindClientAndHostPipesForTesting(std::move(client_receiver),
                                                     std::move(host_remote));
@@ -347,7 +347,7 @@
 
 MockProducer::MockProducer(const std::string& producer_name,
                            const std::string& data_source_name,
-                           perfetto::TracingService* service,
+                           PerfettoService* service,
                            base::OnceClosure on_datasource_registered,
                            base::OnceClosure on_tracing_started,
                            size_t num_packets) {
diff --git a/services/tracing/perfetto/test_utils.h b/services/tracing/perfetto/test_utils.h
index 6d2b553c..3762f95 100644
--- a/services/tracing/perfetto/test_utils.h
+++ b/services/tracing/perfetto/test_utils.h
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "mojo/public/cpp/bindings/receiver.h"
+#include "services/tracing/perfetto/perfetto_service.h"
 #include "services/tracing/perfetto/producer_host.h"
 #include "services/tracing/public/cpp/perfetto/perfetto_traced_process.h"
 #include "services/tracing/public/cpp/perfetto/producer_client.h"
@@ -161,7 +162,7 @@
   MockProducerHost(
       const std::string& producer_name,
       const std::string& data_source_name,
-      perfetto::TracingService* service,
+      PerfettoService* service,
       MockProducerClient* producer_client,
       base::OnceClosure datasource_registered_callback = base::OnceClosure());
   ~MockProducerHost() override;
@@ -188,7 +189,7 @@
  public:
   MockProducer(const std::string& producer_name,
                const std::string& data_source_name,
-               perfetto::TracingService* service,
+               PerfettoService* service,
                base::OnceClosure on_datasource_registered,
                base::OnceClosure on_tracing_started,
                size_t num_packets = 10);
diff --git a/services/tracing/public/cpp/perfetto/dummy_producer.cc b/services/tracing/public/cpp/perfetto/dummy_producer.cc
index 323d7e3..4669dda 100644
--- a/services/tracing/public/cpp/perfetto/dummy_producer.cc
+++ b/services/tracing/public/cpp/perfetto/dummy_producer.cc
@@ -37,6 +37,7 @@
     const PerfettoTracedProcess::DataSourceBase* const data_source) {}
 
 // SystemProducer implementation.
+void DummyProducer::ConnectToSystemService() {}
 void DummyProducer::ActivateTriggers(const std::vector<std::string>&) {}
 void DummyProducer::DisconnectWithReply(
     base::OnceClosure on_disconnect_complete) {
diff --git a/services/tracing/public/cpp/perfetto/dummy_producer.h b/services/tracing/public/cpp/perfetto/dummy_producer.h
index e20d074..b03cae5 100644
--- a/services/tracing/public/cpp/perfetto/dummy_producer.h
+++ b/services/tracing/public/cpp/perfetto/dummy_producer.h
@@ -38,6 +38,7 @@
       const PerfettoTracedProcess::DataSourceBase* const data_source) override;
 
   // SystemProducer implementation.
+  void ConnectToSystemService() override;
   void ActivateTriggers(const std::vector<std::string>& triggers) override;
   void DisconnectWithReply(base::OnceClosure on_disconnect_complete) override;
   bool IsDummySystemProducerForTesting() override;
diff --git a/services/tracing/public/cpp/perfetto/perfetto_traced_process.cc b/services/tracing/public/cpp/perfetto/perfetto_traced_process.cc
index 8e8a298..ae29b913 100644
--- a/services/tracing/public/cpp/perfetto/perfetto_traced_process.cc
+++ b/services/tracing/public/cpp/perfetto/perfetto_traced_process.cc
@@ -77,19 +77,9 @@
     : PerfettoTracedProcess(MaybeSocket()) {}
 
 PerfettoTracedProcess::PerfettoTracedProcess(const char* system_socket)
-    : producer_client_(std::make_unique<ProducerClient>(GetTaskRunner())) {
-  CHECK(IsTracingInitialized());
+    : producer_client_(std::make_unique<ProducerClient>(GetTaskRunner())),
+      system_producer_(NewSystemProducer(GetTaskRunner(), system_socket)) {
   DETACH_FROM_SEQUENCE(sequence_checker_);
-  // All communication with the system Perfetto service should occur on a single
-  // sequence. To ensure we set up the socket correctly we construct the
-  // |system_producer_endpoint_| on the task runner it will use.
-  GetTaskRunner()->GetOrCreateTaskRunner()->PostTask(
-      FROM_HERE, base::BindOnce(
-                     [](PerfettoTracedProcess* ptr, const char* socket) {
-                       ptr->system_producer_endpoint_ =
-                           NewSystemProducer(GetTaskRunner(), socket);
-                     },
-                     base::Unretained(this), system_socket));
 }
 
 PerfettoTracedProcess::~PerfettoTracedProcess() {}
@@ -118,8 +108,8 @@
 std::unique_ptr<SystemProducer>
 PerfettoTracedProcess::SetSystemProducerForTesting(
     std::unique_ptr<SystemProducer> producer) {
-  auto old_for_testing = std::move(system_producer_endpoint_);
-  system_producer_endpoint_ = std::move(producer);
+  auto old_for_testing = std::move(system_producer_);
+  system_producer_ = std::move(producer);
   return old_for_testing;
 }
 
@@ -156,10 +146,9 @@
   PerfettoTracedProcess::Get();
   PerfettoTracedProcess::GetTaskRunner()->GetOrCreateTaskRunner()->PostTask(
       FROM_HERE, base::BindOnce([]() {
-        auto* producer =
-            PerfettoTracedProcess::Get()->SystemProducerForTesting();
-        CHECK(producer);
-        producer->ResetSequenceForTesting();
+        PerfettoTracedProcess::Get()
+            ->system_producer()
+            ->ResetSequenceForTesting();
       }));
 }
 
@@ -206,13 +195,13 @@
   // the |producer_client_| go. The system Producer will periodically attempt to
   // reconnect if we call DisconnectWithReply().
   if (producer == producer_client_.get()) {
-    if (system_producer_endpoint_->IsTracingActive()) {
-      system_producer_endpoint_->DisconnectWithReply(std::move(start_tracing));
+    if (system_producer_->IsTracingActive()) {
+      system_producer_->DisconnectWithReply(std::move(start_tracing));
       return true;
     }
-  } else if (producer == system_producer_endpoint_.get()) {
+  } else if (producer == system_producer_.get()) {
     if (producer_client_->IsTracingActive()) {
-      system_producer_endpoint_->DisconnectWithReply(base::DoNothing().Once());
+      system_producer_->DisconnectWithReply(base::DoNothing().Once());
       return false;
     }
   } else {
@@ -231,7 +220,6 @@
 
 void PerfettoTracedProcess::ActivateSystemTriggers(
     const std::vector<std::string>& triggers) {
-  DCHECK(system_producer_endpoint_.get());
   if (!GetTaskRunner()->GetOrCreateTaskRunner()->RunsTasksInCurrentSequence()) {
     GetTaskRunner()->GetOrCreateTaskRunner()->PostTask(
         FROM_HERE,
@@ -239,15 +227,15 @@
                        base::Unretained(this), triggers));
     return;
   }
-  system_producer_endpoint_->ActivateTriggers(triggers);
+  system_producer_->ActivateTriggers(triggers);
 }
 
-ProducerClient* PerfettoTracedProcess::producer_client() {
+ProducerClient* PerfettoTracedProcess::producer_client() const {
   return producer_client_.get();
 }
 
-SystemProducer* PerfettoTracedProcess::SystemProducerForTesting() {
-  return system_producer_endpoint_.get();
+SystemProducer* PerfettoTracedProcess::system_producer() const {
+  return system_producer_.get();
 }
 
 void PerfettoTracedProcess::AddDataSourceOnSequence(
@@ -255,10 +243,8 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (data_sources_.insert(data_source).second) {
-    DCHECK(producer_client_);
-    DCHECK(system_producer_endpoint_);
     producer_client_->NewDataSourceAdded(data_source);
-    system_producer_endpoint_->NewDataSourceAdded(data_source);
+    system_producer_->NewDataSourceAdded(data_source);
   }
 }
 }  // namespace tracing
diff --git a/services/tracing/public/cpp/perfetto/perfetto_traced_process.h b/services/tracing/public/cpp/perfetto/perfetto_traced_process.h
index b71d2300..97ea9b3b 100644
--- a/services/tracing/public/cpp/perfetto/perfetto_traced_process.h
+++ b/services/tracing/public/cpp/perfetto/perfetto_traced_process.h
@@ -69,8 +69,8 @@
   // Returns the process-wide instance of the PerfettoTracedProcess.
   static PerfettoTracedProcess* Get();
 
-  ProducerClient* producer_client();
-  SystemProducer* SystemProducerForTesting();
+  ProducerClient* producer_client() const;
+  SystemProducer* system_producer() const;
 
   ~PerfettoTracedProcess();
 
@@ -132,7 +132,7 @@
   // A PerfettoProducer that connects to the system Perfetto service. If there
   // is no system Perfetto service this pointer will be valid, but all function
   // calls will be noops.
-  std::unique_ptr<SystemProducer> system_producer_endpoint_;
+  std::unique_ptr<SystemProducer> system_producer_;
 
   SEQUENCE_CHECKER(sequence_checker_);
   DISALLOW_COPY_AND_ASSIGN(PerfettoTracedProcess);
diff --git a/services/tracing/public/cpp/perfetto/posix_system_producer.cc b/services/tracing/public/cpp/perfetto/posix_system_producer.cc
index 47580d68..b97c6d4a 100644
--- a/services/tracing/public/cpp/perfetto/posix_system_producer.cc
+++ b/services/tracing/public/cpp/perfetto/posix_system_producer.cc
@@ -12,6 +12,7 @@
 #include "base/trace_event/trace_log.h"
 #include "build/build_config.h"
 #include "services/tracing/public/cpp/perfetto/shared_memory.h"
+#include "services/tracing/public/cpp/trace_startup.h"
 #include "services/tracing/public/cpp/traced_process_impl.h"
 #include "third_party/perfetto/include/perfetto/ext/tracing/core/commit_data_request.h"
 #include "third_party/perfetto/include/perfetto/ext/tracing/core/shared_memory_arbiter.h"
@@ -54,7 +55,7 @@
     : SystemProducer(task_runner),
       socket_name_(socket),
       connection_backoff_ms_(kInitialConnectionBackoffMs) {
-  Connect();
+  DETACH_FROM_SEQUENCE(sequence_checker_);
 }
 
 PosixSystemProducer::~PosixSystemProducer() {
@@ -62,8 +63,9 @@
 }
 
 void PosixSystemProducer::SetDisallowPreAndroidPieForTesting(bool disallow) {
-  disallow_pre_android_pie = disallow;
-  if (!disallow && state_ == State::kDisconnected) {
+  bool was_disallowed = SkipIfOnAndroidAndPreAndroidPie();
+  disallow_pre_android_pie_ = disallow;
+  if (!disallow && was_disallowed && state_ == State::kDisconnected) {
     // If previously we would not have connected, we now attempt to connect
     // since we are now skipping a check.
     Connect();
@@ -72,17 +74,23 @@
 
 void PosixSystemProducer::SetNewSocketForTesting(const char* socket) {
   socket_name_ = socket;
+
+  if (state_ == State::kDisconnected) {
+    // Not connected yet, wait for ConnectToSystemService().
+    return;
+  }
+
   if (state_ == State::kConnected) {
     // If we are fully connected we need to reset the service before we
     // reconnect.
     DisconnectWithReply(base::BindOnce(&PosixSystemProducer::OnDisconnect,
                                        base::Unretained(this)));
-  } else {
-    // In any other case we just need to do a normal disconnect and
-    // DisconnectWithReply will ensure we set up the retries on the new
-    // |socket|.
-    DisconnectWithReply(base::OnceClosure());
+    return;
   }
+
+  // In any other case, we just need to do a normal disconnect and
+  // DisconnectWithReply will ensure we set up the retries on the new |socket|.
+  DisconnectWithReply(base::OnceClosure());
 }
 
 perfetto::SharedMemoryArbiter* PosixSystemProducer::MaybeSharedMemoryArbiter() {
@@ -124,6 +132,13 @@
   return data_sources_tracing_ > 0;
 }
 
+void PosixSystemProducer::ConnectToSystemService() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  CHECK(IsTracingInitialized());
+  DCHECK(state_ == State::kDisconnected);
+  Connect();
+}
+
 void PosixSystemProducer::ActivateTriggers(
     const std::vector<std::string>& triggers) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -360,7 +375,7 @@
 
 bool PosixSystemProducer::SkipIfOnAndroidAndPreAndroidPie() const {
 #if defined(OS_ANDROID)
-  return disallow_pre_android_pie &&
+  return disallow_pre_android_pie_ &&
          base::android::BuildInfo::GetInstance()->sdk_int() <
              base::android::SDK_VERSION_P;
 #endif  // defined(OS_ANDROID)
diff --git a/services/tracing/public/cpp/perfetto/posix_system_producer.h b/services/tracing/public/cpp/perfetto/posix_system_producer.h
index 33c7b92f9..7aa6771 100644
--- a/services/tracing/public/cpp/perfetto/posix_system_producer.h
+++ b/services/tracing/public/cpp/perfetto/posix_system_producer.h
@@ -60,6 +60,7 @@
   bool IsTracingActive() override;
 
   // SystemProducer implementation.
+  void ConnectToSystemService() override;
   void ActivateTriggers(const std::vector<std::string>& triggers) override;
   // When Chrome's tracing service wants to trace it always takes priority over
   // the system Perfetto service. To cleanly shut down and let the system
@@ -123,7 +124,7 @@
   std::string socket_name_;
   uint32_t connection_backoff_ms_;
   uint64_t data_sources_tracing_ = 0;
-  bool disallow_pre_android_pie = true;
+  bool disallow_pre_android_pie_ = true;
   State state_ = State::kDisconnected;
   std::vector<base::OnceClosure> on_disconnect_callbacks_;
 
diff --git a/services/tracing/public/cpp/perfetto/system_producer.h b/services/tracing/public/cpp/perfetto/system_producer.h
index b3329cdc..9f4a488f 100644
--- a/services/tracing/public/cpp/perfetto/system_producer.h
+++ b/services/tracing/public/cpp/perfetto/system_producer.h
@@ -16,6 +16,13 @@
   SystemProducer(PerfettoTaskRunner* task_runner);
   ~SystemProducer() override;
 
+  // Initiate connection to the system service. Should only be called once on
+  // the producer's task runner (while disconnected) and after the thread pool
+  // was initialized.
+  virtual void ConnectToSystemService() = 0;
+
+  // Send the given trigger names to the system service. Should only be called
+  // on the producer's task runner.
   virtual void ActivateTriggers(const std::vector<std::string>& triggers) = 0;
 
   // Since Chrome does not support concurrent tracing sessions, and system
diff --git a/services/tracing/public/cpp/trace_startup.cc b/services/tracing/public/cpp/trace_startup.cc
index 23b2baa..a373fb66 100644
--- a/services/tracing/public/cpp/trace_startup.cc
+++ b/services/tracing/public/cpp/trace_startup.cc
@@ -11,6 +11,7 @@
 #include "components/tracing/common/trace_startup_config.h"
 #include "components/tracing/common/trace_to_console.h"
 #include "components/tracing/common/tracing_switches.h"
+#include "services/tracing/public/cpp/perfetto/system_producer.h"
 #include "services/tracing/public/cpp/perfetto/trace_event_data_source.h"
 #include "services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.h"
 #include "services/tracing/public/cpp/trace_event_agent.h"
@@ -110,9 +111,17 @@
   if (ShouldSetupSystemTracing()) {
     // We have to ensure that we register all the data sources we care about.
     TraceEventAgent::GetInstance();
-    // To ensure System tracing connects we have to initialize the process wide
-    // state. This Get() call ensures that the constructor has run.
-    PerfettoTracedProcess::Get();
+    // Connect to system service if available (currently a no-op except on
+    // Posix). Has to happen on the producer's sequence, as all communication
+    // with the system Perfetto service should occur on a single sequence.
+    PerfettoTracedProcess::Get()
+        ->GetTaskRunner()
+        ->GetOrCreateTaskRunner()
+        ->PostTask(FROM_HERE, base::BindOnce([]() {
+                     PerfettoTracedProcess::Get()
+                         ->system_producer()
+                         ->ConnectToSystemService();
+                   }));
   }
 }
 
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index f391f8e..4b56849 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -57,55 +57,6 @@
       },
       {
         "args": [
-          "--disable-field-trial-config",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "system_webview_shell_layout_test_apk_no_field_trial"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "system_webview_shell_layout_test_apk_no_field_trial",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "LMY48I",
-              "device_os_flavor": "google",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "expiration": 10800,
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ]
-        },
-        "test": "system_webview_shell_layout_test_apk",
-        "test_target": "//android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk"
-      },
-      {
-        "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -360,54 +311,6 @@
       },
       {
         "args": [
-          "--disable-field-trial-config",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "system_webview_shell_layout_test_apk_no_field_trial"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "system_webview_shell_layout_test_apk_no_field_trial",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_flavor": "google",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ]
-        },
-        "test": "system_webview_shell_layout_test_apk",
-        "test_target": "//android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk"
-      },
-      {
-        "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -704,54 +607,6 @@
       },
       {
         "args": [
-          "--disable-field-trial-config",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "system_webview_shell_layout_test_apk_no_field_trial"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "system_webview_shell_layout_test_apk_no_field_trial",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "NRD90M",
-              "device_os_flavor": "google",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ]
-        },
-        "test": "system_webview_shell_layout_test_apk",
-        "test_target": "//android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk"
-      },
-      {
-        "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -1144,54 +999,6 @@
       },
       {
         "args": [
-          "--disable-field-trial-config",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "system_webview_shell_layout_test_apk_no_field_trial"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "system_webview_shell_layout_test_apk_no_field_trial",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "OPM4.171019.021.P2",
-              "device_os_flavor": "google",
-              "device_os_type": "userdebug",
-              "device_type": "walleye",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ]
-        },
-        "test": "system_webview_shell_layout_test_apk",
-        "test_target": "//android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk"
-      },
-      {
-        "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -1584,54 +1391,6 @@
       },
       {
         "args": [
-          "--disable-field-trial-config",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "system_webview_shell_layout_test_apk_no_field_trial"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "system_webview_shell_layout_test_apk_no_field_trial",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "PQ3A.190801.002",
-              "device_os_flavor": "google",
-              "device_os_type": "userdebug",
-              "device_type": "walleye",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ]
-        },
-        "test": "system_webview_shell_layout_test_apk",
-        "test_target": "//android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk"
-      },
-      {
-        "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index a30713c9..7a7a289 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -382,6 +382,35 @@
       },
       {
         "args": [
+          "--vpython-dir=../../vpython_dir_linux_amd64"
+        ],
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_gtest_merge.py"
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "infra/tools/luci/vpython/linux-amd64",
+              "location": "vpython_dir_linux_amd64",
+              "revision": "git_revision:9a931a5307c46b16b1c12e01e8239d4a73830b89"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "kvm": "1",
+              "os": "Ubuntu-16.04",
+              "pool": "chromium.tests.cros.vm"
+            }
+          ],
+          "shards": 3
+        },
+        "test": "net_unittests",
+        "test_target": "//net:net_unittests"
+      },
+      {
+        "args": [
           "--stop-ui"
         ],
         "merge": {
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index bdfc88c..3a8245e 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1048,7 +1048,6 @@
   },
   'net_unittests': {
     'remove_from': [
-      'chromeos-amd64-generic-rel',  # https://crbug.com/1053547
       'fuchsia-fyi-arm64-rel',  # https://crbug.com/877248
       'fuchsia-fyi-x64-dbg',  # https://crbug.com/844416
     ],
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index de662d2..50387bb 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -3302,15 +3302,6 @@
       'system_webview_shell_layout_test_apk': {},
     },
 
-    'system_webview_shell_instrumentation_tests_no_field_trial': {
-      'system_webview_shell_layout_test_apk_no_field_trial': {
-        'args': [
-          '--disable-field-trial-config',
-        ],
-        'test': 'system_webview_shell_layout_test_apk',
-      },
-    },
-
     'system_webview_wpt': {
       'system_webview_wpt': {
         'swarming': {
@@ -4400,7 +4391,6 @@
 
     'webview_bot_all_gtests': [
       'system_webview_shell_instrumentation_tests',
-      'system_webview_shell_instrumentation_tests_no_field_trial',
       'webview_bot_instrumentation_test_apk_gtest',
       'webview_bot_instrumentation_test_apk_no_field_trial_gtest',
       'webview_bot_unittests_gtest',
@@ -4421,7 +4411,6 @@
 
     'webview_bot_system_gtests': [
       'system_webview_shell_instrumentation_tests',
-      'system_webview_shell_instrumentation_tests_no_field_trial',
       'webview_cts_tests_gtest',
       'webview_cts_tests_gtest_no_field_trial',
       'webview_ui_instrumentation_tests',
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 4aef817..be56a13 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -3692,9 +3692,6 @@
         'additional_compile_targets': [
           'cast_test_lists',
         ],
-        'args': [
-          '--qemu-require-kvm',
-        ],
       },
       'fuchsia-x64-dbg': {
         'additional_compile_targets': [
diff --git a/testing/test_env.py b/testing/test_env.py
index c8c27524..8734f41 100755
--- a/testing/test_env.py
+++ b/testing/test_env.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python2
 # 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.
diff --git a/third_party/blink/perf_tests/display_locking/abs_pos_outer_sizes_change.html b/third_party/blink/perf_tests/display_locking/abs_pos_outer_sizes_change.html
index f78165e0..69a7d31 100644
--- a/third_party/blink/perf_tests/display_locking/abs_pos_outer_sizes_change.html
+++ b/third_party/blink/perf_tests/display_locking/abs_pos_outer_sizes_change.html
@@ -65,7 +65,7 @@
   for (let i = 0; i < n; ++i) {
     const clone = specimen.cloneNode(true);
     if (i > 0)
-      clone.renderSubtree = "invisible skip-viewport-activation";
+      clone.style = "render-subtree: invisible skip-viewport-activation";
     document.body.appendChild(clone);
   }
 }
diff --git a/third_party/blink/perf_tests/display_locking/forced_layout_on_locked_el.html b/third_party/blink/perf_tests/display_locking/forced_layout_on_locked_el.html
index c4d8a503f..6325d1d4 100644
--- a/third_party/blink/perf_tests/display_locking/forced_layout_on_locked_el.html
+++ b/third_party/blink/perf_tests/display_locking/forced_layout_on_locked_el.html
@@ -24,7 +24,7 @@
 </head>
 <body>
 <template id="template">
-<div class="box" rendersubtree="invisible skip-viewport-activation">
+<div class="box" style="render-subtree: invisible skip-viewport-activation">
   Lorem ipsum dolor sit amet, consectetur adipiscing elit.
   Quisque ante dui, posuere at pretium suscipit, condimentum at augue.
 </div>
diff --git a/third_party/blink/perf_tests/display_locking/inner_sizes_change.html b/third_party/blink/perf_tests/display_locking/inner_sizes_change.html
index 87d8f77..c063a30 100644
--- a/third_party/blink/perf_tests/display_locking/inner_sizes_change.html
+++ b/third_party/blink/perf_tests/display_locking/inner_sizes_change.html
@@ -51,7 +51,7 @@
   for (let i = 0; i < n; ++i) {
     const clone = specimen.cloneNode(true);
     if (i > 0)
-      clone.renderSubtree = "invisible skip-viewport-activation";
+      clone.style = "render-subtree: invisible skip-viewport-activation";
     document.body.appendChild(clone);
   }
 }
diff --git a/third_party/blink/perf_tests/display_locking/outer_sizes_change.html b/third_party/blink/perf_tests/display_locking/outer_sizes_change.html
index 5ed1d268..45eb341 100644
--- a/third_party/blink/perf_tests/display_locking/outer_sizes_change.html
+++ b/third_party/blink/perf_tests/display_locking/outer_sizes_change.html
@@ -50,7 +50,7 @@
   for (let i = 0; i < n; ++i) {
     const clone = specimen.cloneNode(true);
     if (i > 0)
-      clone.renderSubtree = "invisible skip-viewport-activation";
+      clone.style = "render-subtree: invisible skip-viewport-activation";
     document.body.appendChild(clone);
   }
 }
diff --git a/third_party/blink/perf_tests/display_locking/outer_sizes_change_activatable.html b/third_party/blink/perf_tests/display_locking/outer_sizes_change_activatable.html
index cb06605..bbb0dce 100644
--- a/third_party/blink/perf_tests/display_locking/outer_sizes_change_activatable.html
+++ b/third_party/blink/perf_tests/display_locking/outer_sizes_change_activatable.html
@@ -30,7 +30,7 @@
 <body>
 <!-- node template from which to construct items -->
 <template id="node_template">
-<div class="container" rendersubtree="invisible skip-viewport-activation">
+<div class="container" style="render-subtree: invisible skip-viewport-activation">
   Lorem ipsum dolor sit amet, consectetur adipiscing elit.
   Quisque ante dui, posuere at pretium suscipit, condimentum at augue.
   <div class="box">
diff --git a/third_party/blink/perf_tests/display_locking/outer_sizes_change_iframe.html b/third_party/blink/perf_tests/display_locking/outer_sizes_change_iframe.html
index 8cf1fde..b2ec0aa 100644
--- a/third_party/blink/perf_tests/display_locking/outer_sizes_change_iframe.html
+++ b/third_party/blink/perf_tests/display_locking/outer_sizes_change_iframe.html
@@ -72,7 +72,7 @@
   for (let i = 0; i < n; ++i) {
     const clone = specimen.cloneNode(true);
     if (i > 0)
-      clone.renderSubtree = "invisible skip-viewport-activation";
+      clone.style = "render-subtree: invisible skip-viewport-activation";
     document.body.appendChild(clone);
   }
 }
diff --git a/third_party/blink/perf_tests/display_locking/unlock_top_items.html b/third_party/blink/perf_tests/display_locking/unlock_top_items.html
index cd32401e..aa5a825 100644
--- a/third_party/blink/perf_tests/display_locking/unlock_top_items.html
+++ b/third_party/blink/perf_tests/display_locking/unlock_top_items.html
@@ -47,7 +47,7 @@
   for (let i = 0; i < n; ++i) {
     const clone = specimen.cloneNode(true);
     clone.id = "id" + i;
-    clone.renderSubtree = "invisible skip-viewport-activation";
+    clone.style = "render-subtree: invisible skip-viewport-activation";
     document.body.appendChild(clone);
   }
 }
@@ -56,7 +56,7 @@
 function commitNextLock() {
   const element = document.getElementById("id" + nextId);
   ++nextId;
-  element.renderSubtree = "";
+  element.style = "";
 }
 
 let testDone = false;
diff --git a/third_party/blink/perf_tests/display_locking/unlock_top_items_nested.html b/third_party/blink/perf_tests/display_locking/unlock_top_items_nested.html
index e504189..4ed9722 100644
--- a/third_party/blink/perf_tests/display_locking/unlock_top_items_nested.html
+++ b/third_party/blink/perf_tests/display_locking/unlock_top_items_nested.html
@@ -78,13 +78,13 @@
       currentContainer = document.createElement("div");
       currentContainer.classList = "container large";
       if (i > 0)
-        currentContainer.renderSubtree = "invisible skip-viewport-activation";
+        currentContainer.style = "render-subtree: invisible skip-viewport-activation";
       document.body.appendChild(currentContainer);
     }
     const clone = specimen.cloneNode(true);
     clone.id = "id" + i;
     clone.classList = "container small";
-    clone.renderSubtree = "invisible skip-viewport-activation";
+    clone.style = "render-subtree: invisible skip-viewport-activation";
     currentContainer.appendChild(clone);
   }
 }
@@ -93,7 +93,7 @@
 function commitNextLock() {
   const element = document.getElementById("id" + nextId);
   ++nextId;
-  element.renderSubtree = "";
+  element.style = "";
 }
 
 let testDone = false;
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index a807df9..6fb2ef1f 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -212,6 +212,7 @@
     "platform/web_inband_text_track.h",
     "platform/web_inband_text_track_client.h",
     "platform/web_input_event_result.h",
+    "platform/web_insecure_request_policy.h",
     "platform/web_intrinsic_sizing_info.h",
     "platform/web_isolate.h",
     "platform/web_isolated_world_ids.h",
diff --git a/third_party/blink/public/common/BUILD.gn b/third_party/blink/public/common/BUILD.gn
index c9936f6..e593c44 100644
--- a/third_party/blink/public/common/BUILD.gn
+++ b/third_party/blink/public/common/BUILD.gn
@@ -143,7 +143,6 @@
     "screen_orientation/web_screen_orientation_lock_type.h",
     "screen_orientation/web_screen_orientation_type.h",
     "security/security_style.h",
-    "security_context/insecure_request_policy.h",
     "service_worker/service_worker_status_code.h",
     "service_worker/service_worker_type_converters.h",
     "service_worker/service_worker_types.h",
diff --git a/third_party/blink/public/common/security_context/insecure_request_policy.h b/third_party/blink/public/common/security_context/insecure_request_policy.h
deleted file mode 100644
index a31c89c..0000000
--- a/third_party/blink/public/common/security_context/insecure_request_policy.h
+++ /dev/null
@@ -1,44 +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 THIRD_PARTY_BLINK_PUBLIC_COMMON_SECURITY_CONTEXT_INSECURE_REQUEST_POLICY_H_
-#define THIRD_PARTY_BLINK_PUBLIC_COMMON_SECURITY_CONTEXT_INSECURE_REQUEST_POLICY_H_
-
-#include <bitset>
-
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-shared.h"
-
-namespace blink {
-namespace mojom {
-
-inline constexpr InsecureRequestPolicy operator&(InsecureRequestPolicy a,
-                                                 InsecureRequestPolicy b) {
-  return static_cast<InsecureRequestPolicy>(static_cast<int>(a) &
-                                            static_cast<int>(b));
-}
-
-inline constexpr InsecureRequestPolicy operator|(InsecureRequestPolicy a,
-                                                 InsecureRequestPolicy b) {
-  return static_cast<InsecureRequestPolicy>(static_cast<int>(a) |
-                                            static_cast<int>(b));
-}
-
-inline InsecureRequestPolicy& operator|=(InsecureRequestPolicy& a,
-                                         InsecureRequestPolicy b) {
-  return a = a | b;
-}
-
-inline constexpr InsecureRequestPolicy operator~(InsecureRequestPolicy flags) {
-  return static_cast<InsecureRequestPolicy>(~static_cast<int>(flags));
-}
-
-inline std::ostream& operator<<(std::ostream& out,
-                                InsecureRequestPolicy flags) {
-  return out << std::bitset<sizeof(int) * 8>(static_cast<int>(flags));
-}
-
-}  // namespace mojom
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_SECURITY_CONTEXT_INSECURE_REQUEST_POLICY_H_
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn
index 2e1b3cf4..c6b77bb2 100644
--- a/third_party/blink/public/mojom/BUILD.gn
+++ b/third_party/blink/public/mojom/BUILD.gn
@@ -125,7 +125,6 @@
     "scroll/scroll_enums.mojom",
     "scroll/scroll_into_view_params.mojom",
     "scroll/scrollbar_mode.mojom",
-    "security_context/insecure_request_policy.mojom",
     "selection_menu/selection_menu_behavior.mojom",
     "service_worker/controller_service_worker_mode.mojom",
     "service_worker/dispatch_fetch_event_params.mojom",
diff --git a/third_party/blink/public/mojom/frame/frame.mojom b/third_party/blink/public/mojom/frame/frame.mojom
index a7ac4ab..f39d976 100644
--- a/third_party/blink/public/mojom/frame/frame.mojom
+++ b/third_party/blink/public/mojom/frame/frame.mojom
@@ -31,7 +31,6 @@
 import "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom";
 import "third_party/blink/public/mojom/referrer.mojom";
 import "third_party/blink/public/mojom/timing/resource_timing.mojom";
-import "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom";
 import "third_party/blink/public/mojom/web_feature/web_feature.mojom";
 import "ui/events/mojom/scroll_granularity.mojom";
 import "ui/gfx/geometry/mojom/geometry.mojom";
@@ -177,8 +176,10 @@
   // this information in DidCommitProvisionalLoad isn't sufficient; this
   // message is needed because, for example, a document can dynamically insert
   // a <meta> tag that causes strict mixed content checking to be enforced.
-  // |policy_bitmap| is a bitfield for InsecureRequestPolicy.
-  EnforceInsecureRequestPolicy(blink.mojom.InsecureRequestPolicy policy_bitmap);
+  //
+  // Argument |policy_bitmap| represents blink::WebInsecureRequestPolicy uint8
+  // bitfield.
+  EnforceInsecureRequestPolicy(uint8 policy_bitmap);
 
   // Elements of |set| are hashes of hosts to upgrade.
   EnforceInsecureNavigationsSet(array<uint32> set);
diff --git a/third_party/blink/public/mojom/security_context/OWNERS b/third_party/blink/public/mojom/security_context/OWNERS
deleted file mode 100644
index 08850f4..0000000
--- a/third_party/blink/public/mojom/security_context/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-per-file *.mojom=set noparent
-per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/third_party/blink/public/mojom/security_context/insecure_request_policy.mojom b/third_party/blink/public/mojom/security_context/insecure_request_policy.mojom
deleted file mode 100644
index 4fa42c80..0000000
--- a/third_party/blink/public/mojom/security_context/insecure_request_policy.mojom
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module blink.mojom;
-
-// The values of
-// https://w3c.github.io/webappsec-upgrade-insecure-requests/#insecure-requests-policy
-//
-// TODO(mkwst): In an ideal world, the combined state would be the same as
-// "Upgrade". Once we're consistently upgrading all requests, we can replace
-// this bitfield-style representation with an enum. Until then, we need to
-// ensure that all relevant flags are set. https://crbug.com/617584
-enum InsecureRequestPolicy {
-  kLeaveInsecureRequestsAlone = 0,
-  kUpgradeInsecureRequests = 1, // 1 << 0,
-  kBlockAllMixedContent = 2, // 1 << 1,
-};
diff --git a/third_party/blink/public/platform/web_dedicated_worker_host_factory_client.h b/third_party/blink/public/platform/web_dedicated_worker_host_factory_client.h
index f9e6265..f3a7c6c 100644
--- a/third_party/blink/public/platform/web_dedicated_worker_host_factory_client.h
+++ b/third_party/blink/public/platform/web_dedicated_worker_host_factory_client.h
@@ -11,6 +11,7 @@
 #include "services/network/public/mojom/referrer_policy.mojom-shared.h"
 #include "third_party/blink/public/mojom/frame/lifecycle.mojom-shared.h"
 #include "third_party/blink/public/platform/web_fetch_client_settings_object.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 
 namespace base {
 class SingleThreadTaskRunner;
diff --git a/third_party/blink/public/platform/web_fetch_client_settings_object.h b/third_party/blink/public/platform/web_fetch_client_settings_object.h
index 1c95fb2..0fb2c51e 100644
--- a/third_party/blink/public/platform/web_fetch_client_settings_object.h
+++ b/third_party/blink/public/platform/web_fetch_client_settings_object.h
@@ -10,8 +10,6 @@
 #include "third_party/blink/public/platform/web_url.h"
 
 #if INSIDE_BLINK
-#include "third_party/blink/public/common/security_context/insecure_request_policy.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-shared.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h"  // nogncheck
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"  // nogncheck
 #endif
@@ -58,10 +56,8 @@
                               ? KURL()
                               : KURL(settings_object.GetOutgoingReferrer())),
         insecure_requests_policy(
-            (settings_object.GetInsecureRequestsPolicy() &
-             blink::mojom::InsecureRequestPolicy::kUpgradeInsecureRequests) !=
-                    mojom::blink::InsecureRequestPolicy::
-                        kLeaveInsecureRequestsAlone
+            settings_object.GetInsecureRequestsPolicy() &
+                    blink::kUpgradeInsecureRequests
                 ? blink::mojom::InsecureRequestsPolicy::kUpgrade
                 : blink::mojom::InsecureRequestsPolicy::kDoNotUpgrade) {}
 #endif  // INSIDE_BLINK
diff --git a/third_party/blink/public/platform/web_insecure_request_policy.h b/third_party/blink/public/platform/web_insecure_request_policy.h
new file mode 100644
index 0000000..f83715d
--- /dev/null
+++ b/third_party/blink/public/platform/web_insecure_request_policy.h
@@ -0,0 +1,26 @@
+// Copyright (c) 2016 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_PUBLIC_PLATFORM_WEB_INSECURE_REQUEST_POLICY_H_
+#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_INSECURE_REQUEST_POLICY_H_
+
+#include <cstdint>
+
+namespace blink {
+
+// The values of
+// https://w3c.github.io/webappsec-upgrade-insecure-requests/#insecure-requests-policy
+//
+// TODO(mkwst): In an ideal world, the combined state would be the same as
+// "Upgrade". Once we're consistently upgrading all requests, we can replace
+// this bitfield-style representation with an enum. Until then, we need to
+// ensure that all relevant flags are set. https://crbug.com/617584
+using WebInsecureRequestPolicy = uint8_t;
+const WebInsecureRequestPolicy kLeaveInsecureRequestsAlone = 0;
+const WebInsecureRequestPolicy kUpgradeInsecureRequests = 1 << 0;
+const WebInsecureRequestPolicy kBlockAllMixedContent = 1 << 1;
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_INSECURE_REQUEST_POLICY_H_
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h
index 816eb84..513b133 100644
--- a/third_party/blink/public/platform/web_runtime_features.h
+++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -234,7 +234,6 @@
   BLINK_PLATFORM_EXPORT static void EnableIdleDetection(bool);
   BLINK_PLATFORM_EXPORT static void EnableSkipTouchEventFilter(bool);
   BLINK_PLATFORM_EXPORT static void EnableSmsReceiver(bool);
-  BLINK_PLATFORM_EXPORT static void EnableDisplayLocking(bool);
   BLINK_PLATFORM_EXPORT static void EnableConsolidatedMovementXY(bool);
   BLINK_PLATFORM_EXPORT static void EnableMouseSubframeNoImplicitCapture(bool);
   BLINK_PLATFORM_EXPORT static void EnableBackForwardCache(bool);
diff --git a/third_party/blink/public/web/web_frame.h b/third_party/blink/public/web/web_frame.h
index edcadd1e..a9bfe56 100644
--- a/third_party/blink/public/web/web_frame.h
+++ b/third_party/blink/public/web/web_frame.h
@@ -33,8 +33,8 @@
 
 #include <memory>
 #include "cc/paint/paint_canvas.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-shared.h"
 #include "third_party/blink/public/platform/web_common.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/public/web/web_frame_load_type.h"
 #include "third_party/blink/public/web/web_node.h"
 #include "third_party/blink/public/web/web_tree_scope_type.h"
@@ -98,7 +98,7 @@
   WebSecurityOrigin GetSecurityOrigin() const;
 
   // The frame's insecure request policy.
-  mojom::InsecureRequestPolicy GetInsecureRequestPolicy() const;
+  WebInsecureRequestPolicy GetInsecureRequestPolicy() const;
 
   // The frame's upgrade insecure navigations set.
   WebVector<unsigned> GetInsecureRequestToUpgrade() const;
diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h
index 52d4a1e..643b63d2 100644
--- a/third_party/blink/public/web/web_local_frame_client.h
+++ b/third_party/blink/public/web/web_local_frame_client.h
@@ -53,6 +53,7 @@
 #include "third_party/blink/public/platform/web_content_settings_client.h"
 #include "third_party/blink/public/platform/web_effective_connection_type.h"
 #include "third_party/blink/public/platform/web_file_system_type.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/public/platform/web_prescient_networking.h"
 #include "third_party/blink/public/platform/web_set_sink_id_callbacks.h"
 #include "third_party/blink/public/platform/web_source_location.h"
diff --git a/third_party/blink/public/web/web_remote_frame.h b/third_party/blink/public/web/web_remote_frame.h
index c684e48..06bbc2d 100644
--- a/third_party/blink/public/web/web_remote_frame.h
+++ b/third_party/blink/public/web/web_remote_frame.h
@@ -11,7 +11,7 @@
 #include "third_party/blink/public/common/frame/sandbox_flags.h"
 #include "third_party/blink/public/mojom/ad_tagging/ad_frame.mojom-shared.h"
 #include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom-shared.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-shared.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/public/web/web_frame.h"
 #include "ui/events/types/scroll_types.h"
 #include "v8/include/v8.h"
@@ -120,8 +120,7 @@
 
   // Set frame enforcement of insecure request policy replicated from another
   // process.
-  virtual void SetReplicatedInsecureRequestPolicy(
-      mojom::InsecureRequestPolicy) = 0;
+  virtual void SetReplicatedInsecureRequestPolicy(WebInsecureRequestPolicy) = 0;
   virtual void SetReplicatedInsecureNavigationsSet(
       const WebVector<unsigned>&) = 0;
 
diff --git a/third_party/blink/public/web/web_widget.h b/third_party/blink/public/web/web_widget.h
index b6e91f4..96b4626 100644
--- a/third_party/blink/public/web/web_widget.h
+++ b/third_party/blink/public/web/web_widget.h
@@ -208,9 +208,6 @@
     return false;
   }
 
-  // Returns true if the WebWidget is currently animating a GestureFling.
-  virtual bool IsFlinging() const { return false; }
-
   // Returns true if the WebWidget created is of type PepperWidget.
   virtual bool IsPepperWidget() const { return false; }
 
diff --git a/third_party/blink/renderer/bindings/core/v8/isolated_world_csp.cc b/third_party/blink/renderer/bindings/core/v8/isolated_world_csp.cc
index 2f18855c..9d61c98 100644
--- a/third_party/blink/renderer/bindings/core/v8/isolated_world_csp.cc
+++ b/third_party/blink/renderer/bindings/core/v8/isolated_world_csp.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "base/logging.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_controller.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
@@ -68,7 +67,7 @@
   // supported.
   void SetSandboxFlags(SandboxFlags) override {}
   void SetRequireTrustedTypes() override {}
-  void AddInsecureRequestPolicy(mojom::blink::InsecureRequestPolicy) override {}
+  void AddInsecureRequestPolicy(WebInsecureRequestPolicy) override {}
 
   // TODO(crbug.com/916885): Figure out if we want to support violation
   // reporting for isolated world CSPs.
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_context.cc b/third_party/blink/renderer/core/css/parser/css_parser_context.cc
index e6ff2e4..2ef82af 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_context.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_context.cc
@@ -252,6 +252,12 @@
   return document_.Get();
 }
 
+// Fuzzers may execution CSS parsing code without a Document being available,
+// thus this method can return null.
+const ExecutionContext* CSSParserContext::GetExecutionContext() const {
+  return (document_.Get()) ? document_.Get()->ToExecutionContext() : nullptr;
+}
+
 void CSSParserContext::ReportLayoutAnimationsViolationIfNeeded(
     const StyleRuleKeyframe& rule) const {
   if (!document_)
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_context.h b/third_party/blink/renderer/core/css/parser/css_parser_context.h
index e2b6687..b9d230e 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_context.h
+++ b/third_party/blink/renderer/core/css/parser/css_parser_context.h
@@ -120,6 +120,7 @@
   bool IsUseCounterRecordingEnabled() const { return document_; }
   bool IsDocumentHandleEqual(const Document* other) const;
   const Document* GetDocument() const;
+  const ExecutionContext* GetExecutionContext() const;
 
   network::mojom::CSPDisposition ShouldCheckContentSecurityPolicy() const {
     return should_check_content_security_policy_;
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
index f83e7dc..bf766c0 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
@@ -639,8 +639,8 @@
 
   return MakeGarbageCollected<StyleRuleImport>(
       uri,
-      MediaQueryParser::ParseMediaQuerySet(
-          prelude, context_->GetDocument()->ToExecutionContext()),
+      MediaQueryParser::ParseMediaQuerySet(prelude,
+                                           context_->GetExecutionContext()),
       context_->IsOriginClean() ? OriginClean::kTrue : OriginClean::kFalse);
 }
 
@@ -674,7 +674,7 @@
     style_sheet_->SetHasMediaQueries();
 
   const auto media = MediaQueryParser::ParseMediaQuerySet(
-      prelude, context_->GetDocument()->ToExecutionContext());
+      prelude, context_->GetExecutionContext());
 
   ConsumeRuleList(block, kRegularRuleList,
                   [&rules](StyleRuleBase* rule) { rules.push_back(rule); });
@@ -1010,7 +1010,7 @@
                                         parsed_properties_);
   } else {
     unresolved_property = lhs.ParseAsUnresolvedCSSPropertyID(
-        context_->GetDocument()->ToExecutionContext(), context_->Mode());
+        context_->GetExecutionContext(), context_->Mode());
   }
 
   // @rules other than FontFace still handled with legacy code.
diff --git a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
index 74905c18..3dffa44 100644
--- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -54,6 +54,7 @@
 #include "third_party/blink/renderer/core/layout/layout_object.h"
 #include "third_party/blink/renderer/core/layout/layout_replaced.h"
 #include "third_party/blink/renderer/core/layout/layout_theme.h"
+#include "third_party/blink/renderer/core/mathml/mathml_space_element.h"
 #include "third_party/blink/renderer/core/style/computed_style.h"
 #include "third_party/blink/renderer/core/style/computed_style_constants.h"
 #include "third_party/blink/renderer/core/svg/svg_svg_element.h"
@@ -583,14 +584,9 @@
   if (!should_be_invisible && !context)
     return;
 
-  // If we're using an attribute version of display locking, then also abort.
-  if (context && DisplayLockContext::IsAttributeVersion(context))
-    return;
-
   // Create a context if we need to be invisible.
   if (should_be_invisible && !context) {
-    context = &element->EnsureDisplayLockContext(
-        DisplayLockContextCreateMethod::kCSS);
+    context = &element->EnsureDisplayLockContext();
   }
   DCHECK(context);
 
@@ -680,24 +676,6 @@
     AdjustStyleForFirstLetter(style);
   }
 
-  if (element &&
-      RuntimeEnabledFeatures::DisplayLockingEnabled(
-          element->GetExecutionContext()) &&
-      element->FastHasAttribute(html_names::kRendersubtreeAttr)) {
-    // The element has the rendersubtree attr, so we should add style and
-    // layout containment. If the attribute contains "invisible" we should
-    // also add size containment.
-    Containment contain = kContainsStyle | kContainsLayout;
-    SpaceSplitString tokens(
-        element->FastGetAttribute(html_names::kRendersubtreeAttr).LowerASCII());
-    if (style.ContainsSize() || tokens.Contains("invisible")) {
-      contain |= kContainsSize;
-    }
-    if (style.ContainsPaint())
-      contain |= kContainsPaint;
-    style.SetContain(contain);
-  }
-
   if (RuntimeEnabledFeatures::CSSRenderSubtreeEnabled())
     AdjustStateForRenderSubtree(style, element);
 
@@ -772,6 +750,8 @@
       // https://drafts.csswg.org/css-display/#unbox-mathml
       style.SetDisplay(EDisplay::kNone);
     }
+    if (auto* space = DynamicTo<MathMLSpaceElement>(*element))
+      space->AddMathBaselineIfNeeded(style, state.CssToLengthConversionData());
   }
 
   // If this node is sticky it marks the creation of a sticky subtree, which we
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc
index 513da9c..21aa6ef 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_budget_test.cc
@@ -19,9 +19,9 @@
 namespace blink {
 
 class DisplayLockBudgetTest : public RenderingTest,
-                              private ScopedDisplayLockingForTest {
+                              private ScopedCSSRenderSubtreeForTest {
  public:
-  DisplayLockBudgetTest() : ScopedDisplayLockingForTest(true) {}
+  DisplayLockBudgetTest() : ScopedCSSRenderSubtreeForTest(true) {}
   void SetUp() override {
     RenderingTest::SetUp();
     test_task_runner_ = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
@@ -44,16 +44,15 @@
     context->update_budget_ = std::move(budget);
   }
 
-  void LockElement(Element& element, bool update_lifecycle = true) {
-    element.setAttribute(html_names::kRendersubtreeAttr, "invisible");
-    if (update_lifecycle)
-      UpdateAllLifecyclePhasesForTest();
+  void LockElement(Element& element) {
+    element.setAttribute(html_names::kStyleAttr,
+                         "render-subtree: invisible skip-activation");
+    UpdateAllLifecyclePhasesForTest();
   }
 
-  void CommitElement(Element& element, bool update_lifecycle = true) {
-    element.setAttribute(html_names::kRendersubtreeAttr, "");
-    if (update_lifecycle)
-      UpdateAllLifecyclePhasesForTest();
+  void CommitElement(Element& element) {
+    element.setAttribute(html_names::kStyleAttr, "");
+    UpdateAllLifecyclePhasesForTest();
   }
 
  protected:
@@ -77,7 +76,7 @@
   )HTML");
 
   auto* element = GetDocument().getElementById("container");
-  LockElement(*element, false);
+  LockElement(*element);
 
   ASSERT_TRUE(element->GetDisplayLockContext());
   UnyieldingDisplayLockBudget budget(element->GetDisplayLockContext());
@@ -120,7 +119,7 @@
   )HTML");
 
   auto* element = GetDocument().getElementById("container");
-  LockElement(*element, false);
+  LockElement(*element);
 
   ASSERT_TRUE(element->GetDisplayLockContext());
   StrictYieldingDisplayLockBudget budget(element->GetDisplayLockContext());
@@ -291,7 +290,7 @@
   )HTML");
 
   auto* element = GetDocument().getElementById("container");
-  LockElement(*element, false);
+  LockElement(*element);
 
   ASSERT_TRUE(element->GetDisplayLockContext());
   StrictYieldingDisplayLockBudget budget(element->GetDisplayLockContext());
@@ -334,7 +333,7 @@
   )HTML");
 
   auto* element = GetDocument().getElementById("container");
-  LockElement(*element, false);
+  LockElement(*element);
 
   ASSERT_TRUE(element->GetDisplayLockContext());
   YieldingDisplayLockBudget budget(element->GetDisplayLockContext());
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
index c0d53ea9..1e3b142 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
@@ -156,7 +156,7 @@
   // 2. We're activated (in the CSS version), which means that we need to know
   //    when we stop intersecting the viewport so that we can re-lock.
   bool should_observe =
-      (IsLocked() || (!IsAttributeVersion(this) && IsActivated())) &&
+      (IsLocked() || IsActivated()) &&
       IsActivatable(DisplayLockActivationReason::kViewportIntersection) &&
       ConnectedToView();
   if (should_observe && !is_observed_) {
@@ -454,24 +454,16 @@
   if (reason_for_metrics == DisplayLockActivationReason::kFindInPage)
     document_->MarkHasFindInPageRenderSubtreeActiveMatch();
 
-  if (!IsAttributeVersion(this)) {
-    css_is_activated_ = true;
-    // Since size containment depends on the activatability state, we should
-    // invalidate the style for this element, so that the style adjuster can
-    // properly remove the containment.
-    element_->SetNeedsStyleRecalc(
-        kLocalStyleChange,
-        StyleChangeReasonForTracing::Create(style_change_reason::kDisplayLock));
-  }
-
-  // Since setting the attribute might trigger a commit if we are still locked,
-  // we set it after we start the commit.
-  if (element_->FastHasAttribute(html_names::kRendersubtreeAttr))
-    element_->setAttribute(html_names::kRendersubtreeAttr, "");
+  css_is_activated_ = true;
+  // Since size containment depends on the activatability state, we should
+  // invalidate the style for this element, so that the style adjuster can
+  // properly remove the containment.
+  element_->SetNeedsStyleRecalc(
+      kLocalStyleChange,
+      StyleChangeReasonForTracing::Create(style_change_reason::kDisplayLock));
 }
 
 bool DisplayLockContext::IsActivated() const {
-  DCHECK(!IsAttributeVersion(this));
   return css_is_activated_;
 }
 
@@ -561,9 +553,6 @@
 
   layout_object->SetNeedsLayoutAndPrefWidthsRecalc(
       layout_invalidation_reason::kDisplayLock);
-
-  if (auto* view = layout_object->GetFrameView())
-    view->SetNeedsForcedResizeObservations();
 }
 
 void DisplayLockContext::StartUpdateIfNeeded() {
@@ -618,7 +607,6 @@
   // Note that since we're already in self style recalc, this code is shorter
   // since it doesn't have to deal with dirtying self-style.
   DCHECK(document_->InStyleRecalc());
-  DCHECK(!IsAttributeVersion(this));
 
   if (reattach_layout_tree_was_blocked_) {
     change = change.ForceReattachLayoutTree();
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.h b/third_party/blink/renderer/core/display_lock/display_lock_context.h
index 78f7f18..673a337 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_context.h
+++ b/third_party/blink/renderer/core/display_lock/display_lock_context.h
@@ -64,11 +64,6 @@
                   std::numeric_limits<uint16_t>::max(),
               "DisplayLockActivationReason is too large");
 
-// Since we currently, and temporarily, support both CSS and attribute version,
-// we need to distinguish the two so that lack of CSS, for example, doesn't
-// unlock the attribute version and vice versa.
-enum class DisplayLockContextCreateMethod { kUnknown, kCSS, kAttribute };
-
 class CORE_EXPORT DisplayLockContext final
     : public GarbageCollected<DisplayLockContext>,
       public ExecutionContextLifecycleObserver,
@@ -273,20 +268,6 @@
     needs_prepaint_subtree_walk_ = true;
   }
 
-  void SetMethod(DisplayLockContextCreateMethod method) { method_ = method; }
-  DisplayLockContextCreateMethod GetMethod() const {
-    DCHECK(method_ != DisplayLockContextCreateMethod::kUnknown);
-    return method_;
-  }
-
-  // Note that this returns true if there is no context at all, so in order to
-  // check whether this is strictly an attribute version, as opposed to a null
-  // context, one needs to compare context with nullptr first.
-  static bool IsAttributeVersion(const DisplayLockContext* context) {
-    return !context ||
-           context->GetMethod() == DisplayLockContextCreateMethod::kAttribute;
-  }
-
   // This is called by the style recalc code in lieu of
   // MarkForStyleRecalcIfNeeded() in order to adjust the child change if we need
   // to recalc children nodes here.
@@ -441,9 +422,6 @@
   // valid for CSS version of render-subtree.
   bool css_is_activated_ = false;
 
-  DisplayLockContextCreateMethod method_ =
-      DisplayLockContextCreateMethod::kUnknown;
-
   base::WeakPtrFactory<DisplayLockContext> weak_factory_{this};
 };
 
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
index f354d67..f131004 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
@@ -88,9 +88,9 @@
 }  // namespace
 
 class DisplayLockContextTest : public testing::Test,
-                               private ScopedDisplayLockingForTest {
+                               private ScopedCSSRenderSubtreeForTest {
  public:
-  DisplayLockContextTest() : ScopedDisplayLockingForTest(true) {}
+  DisplayLockContextTest() : ScopedCSSRenderSubtreeForTest(true) {}
 
   void SetUp() override {
     web_view_helper_.Initialize();
@@ -127,21 +127,17 @@
     test::RunPendingTasks();
   }
 
-  void LockElement(Element& element,
-                   bool activatable,
-                   bool update_lifecycle = true) {
+  void LockElement(Element& element, bool activatable) {
     StringBuilder value;
-    value.Append("invisible");
+    value.Append("render-subtree: invisible");
     if (!activatable)
       value.Append(" skip-activation");
-    element.setAttribute(html_names::kRendersubtreeAttr,
-                         value.ToAtomicString());
-    if (update_lifecycle)
-      UpdateAllLifecyclePhasesForTest();
+    element.setAttribute(html_names::kStyleAttr, value.ToAtomicString());
+    UpdateAllLifecyclePhasesForTest();
   }
 
   void CommitElement(Element& element, bool update_lifecycle = true) {
-    element.setAttribute(html_names::kRendersubtreeAttr, "");
+    element.setAttribute(html_names::kStyleAttr, "");
     if (update_lifecycle)
       UpdateAllLifecyclePhasesForTest();
   }
@@ -195,7 +191,7 @@
   )HTML");
 
   auto* element = GetDocument().getElementById("container");
-  LockElement(*element, false, false);
+  LockElement(*element, false);
 
   // Finished acquiring the lock.
   // Note that because the element is locked after append, the "self" phase for
@@ -211,7 +207,9 @@
   EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 1);
 
   // If the element is dirty, style recalc would handle it in the next recalc.
-  element->setAttribute("style", "color: red;");
+  element->setAttribute(
+      html_names::kStyleAttr,
+      "render-subtree: invisible skip-activation; color: red;");
   EXPECT_TRUE(GetDocument().body()->ChildNeedsStyleRecalc());
   EXPECT_TRUE(element->NeedsStyleRecalc());
   EXPECT_FALSE(element->ChildNeedsStyleRecalc());
@@ -223,7 +221,11 @@
   EXPECT_EQ(
       element->GetComputedStyle()->VisitedDependentColor(GetCSSPropertyColor()),
       MakeRGB(255, 0, 0));
-  CommitElement(*element, false);
+  // Manually commit the lock so that we can verify which dirty bits get
+  // propagated.
+  element->GetDisplayLockContext()->StartCommit();
+  element->setAttribute(html_names::kStyleAttr, "color: red;");
+
   auto* child = GetDocument().getElementById("child");
   EXPECT_TRUE(GetDocument().body()->ChildNeedsStyleRecalc());
   EXPECT_TRUE(element->NeedsStyleRecalc());
@@ -236,32 +238,25 @@
   EXPECT_FALSE(element->ChildNeedsStyleRecalc());
   EXPECT_FALSE(child->NeedsStyleRecalc());
 
-  // Re-acquire.
-  LockElement(*element, false);
-
-  // If a child is dirty, it will still be dirty.
-  child->setAttribute("style", "color: blue;");
-  EXPECT_FALSE(GetDocument().body()->ChildNeedsStyleRecalc());
-  EXPECT_FALSE(element->NeedsStyleRecalc());
-  EXPECT_TRUE(element->ChildNeedsStyleRecalc());
-  EXPECT_TRUE(child->NeedsStyleRecalc());
-  EXPECT_FALSE(child->ChildNeedsStyleRecalc());
-
+  // Lock the child.
+  child->setAttribute(
+      html_names::kStyleAttr,
+      "render-subtree: invisible skip-activation; color: blue;");
   UpdateAllLifecyclePhasesForTest();
+
   EXPECT_FALSE(GetDocument().body()->ChildNeedsStyleRecalc());
   EXPECT_FALSE(element->NeedsStyleRecalc());
-  EXPECT_TRUE(element->ChildNeedsStyleRecalc());
-  EXPECT_TRUE(child->NeedsStyleRecalc());
+  EXPECT_FALSE(element->ChildNeedsStyleRecalc());
+  EXPECT_FALSE(child->NeedsStyleRecalc());
   ASSERT_TRUE(child->GetComputedStyle());
-  EXPECT_NE(
+  EXPECT_EQ(
       child->GetComputedStyle()->VisitedDependentColor(GetCSSPropertyColor()),
       MakeRGB(0, 0, 255));
 
-  CommitElement(*element, false);
+  child->GetDisplayLockContext()->StartCommit();
+  child->setAttribute(html_names::kStyleAttr, "color: blue;");
   EXPECT_TRUE(GetDocument().body()->ChildNeedsStyleRecalc());
-  // Since the rendersubtree attribute changes, it will force self style to put
-  // in proper containment in place.
-  EXPECT_TRUE(element->NeedsStyleRecalc());
+  EXPECT_FALSE(element->NeedsStyleRecalc());
   EXPECT_TRUE(element->ChildNeedsStyleRecalc());
   EXPECT_TRUE(child->NeedsStyleRecalc());
   UpdateAllLifecyclePhasesForTest();
@@ -624,8 +619,8 @@
   auto* div_two = GetDocument().getElementById("two");
   auto* div_three = GetDocument().getElementById("three");
   // Lock three divs, make #div_two non-activatable.
-  LockElement(*div_one, true /* activatable */, false /* update_lifecycle */);
-  LockElement(*div_two, false /* activatable */, false /* update_lifecycle */);
+  LockElement(*div_one, true /* activatable */);
+  LockElement(*div_two, false /* activatable */);
   LockElement(*div_three, true /* activatable */);
 
   DisplayLockTestFindInPageClient client;
@@ -675,6 +670,7 @@
   LockElement(*element, false);
 
   // Sanity checks to ensure the element is locked.
+  EXPECT_TRUE(element->GetDisplayLockContext()->IsLocked());
   EXPECT_FALSE(element->GetDisplayLockContext()->ShouldStyle(
       DisplayLockLifecycleTarget::kChildren));
   EXPECT_FALSE(element->GetDisplayLockContext()->ShouldLayout(
@@ -719,9 +715,9 @@
   EXPECT_FALSE(element->NeedsReattachLayoutTree());
   EXPECT_FALSE(element->ChildNeedsReattachLayoutTree());
 
-  CommitElement(*element, false);
-  // Since containment may change, we need self style recalc.
-  EXPECT_TRUE(element->NeedsStyleRecalc());
+  // Manually start commit, so that we can verify which dirty bits get
+  // propagated.
+  element->GetDisplayLockContext()->StartCommit();
   EXPECT_TRUE(element->ChildNeedsStyleRecalc());
   EXPECT_FALSE(element->NeedsReattachLayoutTree());
   EXPECT_FALSE(element->ChildNeedsReattachLayoutTree());
@@ -732,8 +728,6 @@
   element->GetDisplayLockContext()->DidStyle(
       DisplayLockLifecycleTarget::kChildren);
 
-  // Self style still needs updating.
-  EXPECT_TRUE(element->NeedsStyleRecalc());
   EXPECT_FALSE(element->ChildNeedsStyleRecalc());
   EXPECT_FALSE(element->NeedsReattachLayoutTree());
   EXPECT_TRUE(element->ChildNeedsReattachLayoutTree());
@@ -846,7 +840,7 @@
   EXPECT_FALSE(GetDocument().FocusedElement());
 
   // Now commit the lock and ensure we can focus the input
-  CommitElement(*element, false);
+  CommitElement(*element);
 
   EXPECT_TRUE(element->GetDisplayLockContext()->ShouldStyle(
       DisplayLockLifecycleTarget::kChildren));
@@ -902,7 +896,7 @@
   EXPECT_FALSE(slotted->DisplayLockPreventsActivation(
       DisplayLockActivationReason::kAny));
 
-  LockElement(*container, false, false);
+  LockElement(*container, false);
 
   EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 1);
   EXPECT_EQ(GetDocument().DisplayLockBlockingAllActivationCount(), 1);
@@ -917,7 +911,7 @@
   // step.
   UpdateAllLifecyclePhasesForTest();
 
-  CommitElement(*container, false);
+  CommitElement(*container);
 
   EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 0);
   EXPECT_EQ(GetDocument().DisplayLockBlockingAllActivationCount(), 0);
@@ -941,7 +935,7 @@
 
   SetHtmlInnerHTML(R"HTML(
     <body>
-    <div id="nonviewport" rendersubtree="invisible skip-viewport-activation">
+    <div id="nonviewport" style="render-subtree: invisible skip-viewport-activation">
     </div>
     </body>
   )HTML");
@@ -1037,23 +1031,27 @@
 
   LockElement(*two, false);
 
-  EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 2);
-  EXPECT_EQ(GetDocument().DisplayLockBlockingAllActivationCount(), 2);
+  // Because |two| is nested, the lock counts aren't updated since the lock
+  // doesn't actually take effect until style can determine that we should lock.
+  EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 1);
+  EXPECT_EQ(GetDocument().DisplayLockBlockingAllActivationCount(), 1);
 
   LockElement(*three, false);
 
-  EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 3);
-  EXPECT_EQ(GetDocument().DisplayLockBlockingAllActivationCount(), 3);
-
-  // Now commit the inner lock.
-  CommitElement(*two);
-
   EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 2);
   EXPECT_EQ(GetDocument().DisplayLockBlockingAllActivationCount(), 2);
 
-  // Commit the outer lock.
+  // Now commit the outer lock.
   CommitElement(*one);
 
+  // The counts remain the same since now the inner lock is determined to be
+  // locked.
+  EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 2);
+  EXPECT_EQ(GetDocument().DisplayLockBlockingAllActivationCount(), 2);
+
+  // Commit the inner lock.
+  CommitElement(*two);
+
   // Both inner and outer locks should have committed.
   EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 1);
   EXPECT_EQ(GetDocument().DisplayLockBlockingAllActivationCount(), 1);
@@ -1090,10 +1088,8 @@
 
   // Initial display lock context should be activatable, since nothing skipped
   // activation for it.
-  EXPECT_TRUE(
-      activatable
-          ->EnsureDisplayLockContext(DisplayLockContextCreateMethod::kAttribute)
-          .IsActivatable(DisplayLockActivationReason::kAny));
+  EXPECT_TRUE(activatable->EnsureDisplayLockContext().IsActivatable(
+      DisplayLockActivationReason::kAny));
 
   LockElement(*activatable, true);
 
@@ -1122,9 +1118,8 @@
   // Set just the skip activation token, without the invisible token. This
   // should make the element not be locked, but also not be activatable.
   StringBuilder value;
-  value.Append("skip-activation");
-  non_activatable->setAttribute(html_names::kRendersubtreeAttr,
-                                value.ToAtomicString());
+  value.Append("render-subtree: skip-activation");
+  non_activatable->setAttribute(html_names::kStyleAttr, value.ToAtomicString());
   UpdateAllLifecyclePhasesForTest();
 
   EXPECT_FALSE(non_activatable->GetDisplayLockContext()->IsLocked());
@@ -1183,11 +1178,11 @@
 
   EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 0);
   EXPECT_EQ(GetDocument().DisplayLockBlockingAllActivationCount(), 0);
-  EXPECT_TRUE(child->GetDisplayLockContext()->IsLocked());
+  EXPECT_FALSE(child->GetDisplayLockContext());
 
-  // commit() will unlock the element.
+  // Commit also works, but does nothing.
   CommitElement(*child);
-  EXPECT_FALSE(child->GetDisplayLockContext()->IsLocked());
+  EXPECT_FALSE(child->GetDisplayLockContext());
 
   // Try to lock an element that was moved from a template to a document.
   auto* document_child =
@@ -1197,22 +1192,32 @@
 
   LockElement(*document_child, false);
 
+  // These should be 0, since container is display: none, so locking its child
+  // is not visible to style.
+  EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 0);
+  EXPECT_EQ(GetDocument().DisplayLockBlockingAllActivationCount(), 0);
+  ASSERT_FALSE(document_child->GetDisplayLockContext());
+
+  container->setAttribute(html_names::kStyleAttr, "display: block;");
+  EXPECT_TRUE(container->NeedsStyleRecalc());
+  UpdateAllLifecyclePhasesForTest();
+
   EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 1);
   EXPECT_EQ(GetDocument().DisplayLockBlockingAllActivationCount(), 1);
+  ASSERT_TRUE(document_child->GetDisplayLockContext());
   EXPECT_TRUE(document_child->GetDisplayLockContext()->IsLocked());
 
-  container->setAttribute("style", "display: block;");
-  document_child->setAttribute("style", "color: red;");
-
-  EXPECT_TRUE(container->NeedsStyleRecalc());
-  EXPECT_FALSE(document_child->NeedsStyleRecalc());
-
+  document_child->setAttribute(
+      html_names::kStyleAttr,
+      "render-subtree: invisible skip-activation; color: red;");
   UpdateAllLifecyclePhasesForTest();
 
   EXPECT_FALSE(document_child->NeedsStyleRecalc());
 
-  // commit() will unlock the element and update the style.
-  CommitElement(*document_child);
+  // Commit will unlock the element and update the style.
+  document_child->setAttribute(html_names::kStyleAttr, "color: red;");
+  UpdateAllLifecyclePhasesForTest();
+
   EXPECT_FALSE(document_child->GetDisplayLockContext()->IsLocked());
   EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 0);
   EXPECT_EQ(GetDocument().DisplayLockBlockingAllActivationCount(), 0);
@@ -1326,7 +1331,10 @@
   EXPECT_TRUE(locked_object->InsideBlockingTouchEventHandler());
   EXPECT_FALSE(lockedchild_object->InsideBlockingTouchEventHandler());
 
+  // Manually commit the lock so that we can verify which dirty bits get
+  // propagated.
   CommitElement(*locked_element, false);
+  locked_element->GetDisplayLockContext()->StartCommit();
 
   EXPECT_FALSE(ancestor_object->EffectiveAllowedTouchActionChanged());
   EXPECT_FALSE(handler_object->EffectiveAllowedTouchActionChanged());
@@ -1467,7 +1475,10 @@
   EXPECT_FALSE(locked_object->InsideBlockingTouchEventHandler());
   EXPECT_FALSE(handler_object->InsideBlockingTouchEventHandler());
 
+  // Manually commit the lock so that we can verify which dirty bits get
+  // propagated.
   CommitElement(*locked_element, false);
+  locked_element->GetDisplayLockContext()->StartCommit();
 
   EXPECT_FALSE(ancestor_object->EffectiveAllowedTouchActionChanged());
   EXPECT_FALSE(descendant_object->EffectiveAllowedTouchActionChanged());
@@ -1618,7 +1629,10 @@
   EXPECT_TRUE(locked_object->DescendantNeedsPaintPropertyUpdate());
   EXPECT_FALSE(handler_object->DescendantNeedsPaintPropertyUpdate());
 
+  // Manually commit the lock so that we can verify which dirty bits get
+  // propagated.
   CommitElement(*locked_element, false);
+  locked_element->GetDisplayLockContext()->StartCommit();
 
   EXPECT_FALSE(ancestor_object->NeedsPaintPropertyUpdate());
   EXPECT_FALSE(descendant_object->NeedsPaintPropertyUpdate());
@@ -1700,11 +1714,11 @@
 }
 
 class DisplayLockContextRenderingTest : public RenderingTest,
-                                        private ScopedDisplayLockingForTest {
+                                        private ScopedCSSRenderSubtreeForTest {
  public:
   DisplayLockContextRenderingTest()
       : RenderingTest(MakeGarbageCollected<SingleChildLocalFrameClient>()),
-        ScopedDisplayLockingForTest(true) {}
+        ScopedCSSRenderSubtreeForTest(true) {}
 };
 
 TEST_F(DisplayLockContextRenderingTest, FrameDocumentRemovedWhileAcquire) {
@@ -1723,8 +1737,7 @@
   auto* target = ChildDocument().getElementById("target");
   GetDocument().getElementById("frame")->remove();
 
-  target->EnsureDisplayLockContext(DisplayLockContextCreateMethod::kAttribute)
-      .StartAcquire();
+  target->EnsureDisplayLockContext().StartAcquire();
 }
 
 TEST_F(DisplayLockContextRenderingTest,
@@ -1795,8 +1808,8 @@
   EXPECT_EQ(dirty_count, 10u);
   EXPECT_EQ(total_count, 10u);
 
-  GetDocument().getElementById("e")->setAttribute(
-      html_names::kRendersubtreeAttr, "invisible");
+  GetDocument().getElementById("e")->setAttribute(html_names::kStyleAttr,
+                                                  "render-subtree: invisible");
   UpdateAllLifecyclePhasesForTest();
 
   // Note that the dirty_all call propagate the dirty bit from the unlocked
@@ -1811,8 +1824,8 @@
   // We still see the locked element, so the total is 8.
   EXPECT_EQ(total_count, 8u);
 
-  GetDocument().getElementById("a")->setAttribute(
-      html_names::kRendersubtreeAttr, "invisible");
+  GetDocument().getElementById("a")->setAttribute(html_names::kStyleAttr,
+                                                  "render-subtree: invisible");
   UpdateAllLifecyclePhasesForTest();
 
   // Note that this dirty_all call is now not propagating the dirty bits at all,
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc b/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc
index 534c14b..176d9c24 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc
@@ -32,7 +32,7 @@
                                           DisplayLockActivationReason reason) {
   if (range.IsNull() || range.IsCollapsed())
     return false;
-  if (!RuntimeEnabledFeatures::DisplayLockingEnabled(&range.GetDocument()) ||
+  if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled() ||
       range.GetDocument().LockedDisplayLockCount() ==
           range.GetDocument().DisplayLockBlockingAllActivationCount())
     return false;
@@ -61,7 +61,7 @@
 
 bool DisplayLockUtilities::ActivateFindInPageMatchRangeIfNeeded(
     const EphemeralRangeInFlatTree& range) {
-  if (!RuntimeEnabledFeatures::DisplayLockingEnabled(&range.GetDocument()))
+  if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled())
     return false;
   DCHECK(!range.IsNull());
   DCHECK(!range.IsCollapsed());
@@ -86,7 +86,7 @@
     const EphemeralRangeInFlatTree& range) {
   if (range.IsNull() || range.IsCollapsed())
     return false;
-  if (!RuntimeEnabledFeatures::DisplayLockingEnabled(&range.GetDocument()) ||
+  if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled() ||
       range.GetDocument().LockedDisplayLockCount() ==
           range.GetDocument().DisplayLockBlockingAllActivationCount())
     return false;
@@ -114,8 +114,7 @@
     DisplayLockActivationReason reason) {
   HeapVector<Member<Element>> elements_to_activate;
   const_cast<Node*>(&node)->UpdateDistributionForFlatTreeTraversal();
-  if (!RuntimeEnabledFeatures::DisplayLockingEnabled(
-          node.GetExecutionContext()) ||
+  if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled() ||
       node.GetDocument().LockedDisplayLockCount() ==
           node.GetDocument().DisplayLockBlockingAllActivationCount())
     return elements_to_activate;
@@ -142,8 +141,7 @@
 DisplayLockUtilities::ScopedChainForcedUpdate::ScopedChainForcedUpdate(
     const Node* node,
     bool include_self) {
-  if (!RuntimeEnabledFeatures::DisplayLockingEnabled(
-          node->GetExecutionContext()))
+  if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled())
     return;
 
   CreateParentFrameScopeIfNeeded(node);
@@ -199,8 +197,7 @@
   auto* element = DynamicTo<Element>(node);
   if (!element)
     return NearestLockedExclusiveAncestor(node);
-  if (!RuntimeEnabledFeatures::DisplayLockingEnabled(
-          node.GetExecutionContext()) ||
+  if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled() ||
       !node.isConnected() || node.GetDocument().LockedDisplayLockCount() == 0 ||
       !node.CanParticipateInFlatTree()) {
     return nullptr;
@@ -219,8 +216,7 @@
 
 Element* DisplayLockUtilities::NearestLockedExclusiveAncestor(
     const Node& node) {
-  if (!RuntimeEnabledFeatures::DisplayLockingEnabled(
-          node.GetExecutionContext()) ||
+  if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled() ||
       !node.isConnected() || node.GetDocument().LockedDisplayLockCount() == 0 ||
       !node.CanParticipateInFlatTree()) {
     return nullptr;
@@ -242,8 +238,7 @@
 
 Element* DisplayLockUtilities::HighestLockedInclusiveAncestor(
     const Node& node) {
-  if (!RuntimeEnabledFeatures::DisplayLockingEnabled(
-          node.GetExecutionContext()) ||
+  if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled() ||
       node.GetDocument().LockedDisplayLockCount() == 0 ||
       !node.CanParticipateInFlatTree()) {
     return nullptr;
@@ -264,8 +259,7 @@
 
 Element* DisplayLockUtilities::HighestLockedExclusiveAncestor(
     const Node& node) {
-  if (!RuntimeEnabledFeatures::DisplayLockingEnabled(
-          node.GetExecutionContext()) ||
+  if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled() ||
       node.GetDocument().LockedDisplayLockCount() == 0 ||
       !node.CanParticipateInFlatTree()) {
     return nullptr;
@@ -299,8 +293,7 @@
 }
 
 bool DisplayLockUtilities::IsInNonActivatableLockedSubtree(const Node& node) {
-  if (!RuntimeEnabledFeatures::DisplayLockingEnabled(
-          node.GetExecutionContext()) ||
+  if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled() ||
       node.GetDocument().LockedDisplayLockCount() == 0 ||
       node.GetDocument().DisplayLockBlockingAllActivationCount() == 0 ||
       !node.CanParticipateInFlatTree()) {
@@ -319,8 +312,7 @@
 
 bool DisplayLockUtilities::IsInLockedSubtreeCrossingFrames(
     const Node& source_node) {
-  if (!RuntimeEnabledFeatures::DisplayLockingEnabled(
-          source_node.GetExecutionContext()))
+  if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled())
     return false;
   const Node* node = &source_node;
 
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_utilities_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_utilities_test.cc
index 9b8eb83..1808fbe 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_utilities_test.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_utilities_test.cc
@@ -14,37 +14,28 @@
 namespace blink {
 
 class DisplayLockUtilitiesTest : public RenderingTest,
-                                 private ScopedDisplayLockingForTest {
+                                 private ScopedCSSRenderSubtreeForTest {
  public:
   DisplayLockUtilitiesTest()
       : RenderingTest(MakeGarbageCollected<SingleChildLocalFrameClient>()),
-        ScopedDisplayLockingForTest(true) {}
+        ScopedCSSRenderSubtreeForTest(true) {}
 
-  void LockElement(Element& element,
-                   bool activatable,
-                   bool update_lifecycle = true) {
+  void LockElement(Element& element, bool activatable) {
     StringBuilder value;
-    value.Append("invisible");
+    value.Append("render-subtree: invisible");
     if (!activatable)
       value.Append(" skip-activation");
-    element.setAttribute(html_names::kRendersubtreeAttr,
-                         value.ToAtomicString());
-    if (update_lifecycle)
-      UpdateAllLifecyclePhasesForTest();
+    element.setAttribute(html_names::kStyleAttr, value.ToAtomicString());
+    UpdateAllLifecyclePhasesForTest();
   }
 
-  void CommitElement(Element& element, bool update_lifecycle = true) {
-    element.setAttribute(html_names::kRendersubtreeAttr, "");
-    if (update_lifecycle)
-      UpdateAllLifecyclePhasesForTest();
+  void CommitElement(Element& element) {
+    element.setAttribute(html_names::kStyleAttr, "");
+    UpdateAllLifecyclePhasesForTest();
   }
 };
 
-TEST_F(DisplayLockUtilitiesTest, ActivatableLockedInclusiveAncestors) {
-  // TODO(vmpstr): Implement for layout ng.
-  if (RuntimeEnabledFeatures::LayoutNGEnabled())
-    return;
-
+TEST_F(DisplayLockUtilitiesTest, DISABLED_ActivatableLockedInclusiveAncestors) {
   SetBodyInnerHTML(R"HTML(
     <style>
       div {
@@ -138,7 +129,7 @@
   EXPECT_EQ(result_for_shadow_div.at(0), outer);
 
   // Unlock everything.
-  CommitElement(innermost, false);
+  CommitElement(innermost);
   CommitElement(outer);
   EXPECT_EQ(GetDocument().LockedDisplayLockCount(), 0);
   EXPECT_EQ(GetDocument().DisplayLockBlockingAllActivationCount(), 0);
@@ -233,5 +224,4 @@
   EXPECT_FALSE(DisplayLockUtilities::IsInLockedSubtreeCrossingFrames(*parent));
   EXPECT_FALSE(DisplayLockUtilities::IsInLockedSubtreeCrossingFrames(*child));
 }
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/render_subtree_activation_event.idl b/third_party/blink/renderer/core/display_lock/render_subtree_activation_event.idl
index 3578ce7..31eb186 100644
--- a/third_party/blink/renderer/core/display_lock/render_subtree_activation_event.idl
+++ b/third_party/blink/renderer/core/display_lock/render_subtree_activation_event.idl
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 [
-    RuntimeEnabled=DisplayLocking
+    RuntimeEnabled=CSSRenderSubtree
 ] interface RenderSubtreeActivationEvent : Event {
     readonly attribute Element activatedElement;
 };
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index dedb17b0..962626f7 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -2421,9 +2421,7 @@
   Node* node = &root;
   while (node) {
     auto* element = DynamicTo<Element>(node);
-    if (element &&
-        RuntimeEnabledFeatures::DisplayLockingEnabled(
-            root.GetExecutionContext()) &&
+    if (element && RuntimeEnabledFeatures::CSSRenderSubtreeEnabled() &&
         element->StyleRecalcBlockedByDisplayLock(
             DisplayLockLifecycleTarget::kChildren)) {
       node = FlatTreeTraversal::NextSkippingChildren(*node);
@@ -8452,11 +8450,10 @@
           DisplayLockActivationReason::kViewportIntersection));
       context->CommitForActivationWithSignal(
           entry->target(), DisplayLockActivationReason::kViewportIntersection);
-    } else if (!DisplayLockContext::IsAttributeVersion(context)) {
-      // In a CSS version, if we're not visible, but are observing viewport
-      // intersections, it means that we're either locked (in which case we
-      // should remain locked), or we've been activated (in which case we should
-      // relock).
+    } else {
+      // If we're not visible, but are observing viewport intersections, it
+      // means that we're either locked (in which case we should remain locked),
+      // or we've been activated (in which case we should relock).
       DCHECK(context->IsLocked() || context->IsActivated());
       if (context->IsLocked())
         continue;
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index 4643761..9120042 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -43,6 +43,7 @@
 #include "third_party/blink/public/mojom/input/focus_type.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/permissions/permission.mojom-blink.h"
 #include "third_party/blink/public/mojom/scroll/scrollbar_mode.mojom-blink.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/renderer/core/accessibility/axid.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/dom/container_node.h"
diff --git a/third_party/blink/renderer/core/dom/document_init.cc b/third_party/blink/renderer/core/dom/document_init.cc
index 5461b72..142cfbb0 100644
--- a/third_party/blink/renderer/core/dom/document_init.cc
+++ b/third_party/blink/renderer/core/dom/document_init.cc
@@ -29,7 +29,6 @@
 
 #include "third_party/blink/renderer/core/dom/document_init.h"
 
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/dom_implementation.h"
 #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
@@ -118,12 +117,11 @@
   return flags;
 }
 
-mojom::blink::InsecureRequestPolicy DocumentInit::GetInsecureRequestPolicy()
-    const {
+WebInsecureRequestPolicy DocumentInit::GetInsecureRequestPolicy() const {
   DCHECK(MasterDocumentLoader());
   Frame* parent_frame = MasterDocumentLoader()->GetFrame()->Tree().Parent();
   if (!parent_frame)
-    return mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone;
+    return kLeaveInsecureRequestsAlone;
   return parent_frame->GetSecurityContext()->GetInsecureRequestPolicy();
 }
 
diff --git a/third_party/blink/renderer/core/dom/document_init.h b/third_party/blink/renderer/core/dom/document_init.h
index 0198906..41dd2f9 100644
--- a/third_party/blink/renderer/core/dom/document_init.h
+++ b/third_party/blink/renderer/core/dom/document_init.h
@@ -32,8 +32,7 @@
 
 #include "services/network/public/mojom/ip_address_space.mojom-shared.h"
 #include "third_party/blink/public/common/frame/frame_policy.h"
-#include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink-forward.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/execution_context/security_context.h"
 #include "third_party/blink/renderer/core/frame/sandbox_flags.h"
@@ -41,6 +40,7 @@
 #include "third_party/blink/renderer/platform/graphics/color.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
+#include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom-blink.h"
 
 namespace blink {
 
@@ -95,7 +95,7 @@
   bool IsSrcdocDocument() const;
   bool ShouldSetURL() const;
   mojom::blink::WebSandboxFlags GetSandboxFlags() const;
-  mojom::blink::InsecureRequestPolicy GetInsecureRequestPolicy() const;
+  WebInsecureRequestPolicy GetInsecureRequestPolicy() const;
   const SecurityContext::InsecureNavigationsSet* InsecureNavigationsToUpgrade()
       const;
   bool GrantLoadLocalResources() const { return grant_load_local_resources_; }
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index ab334e1..553ad82 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -2471,41 +2471,6 @@
       GetElementData()->presentation_attribute_style_is_dirty_ = true;
       SetNeedsStyleRecalc(kLocalStyleChange,
                           StyleChangeReasonForTracing::FromAttribute(name));
-    } else if (RuntimeEnabledFeatures::DisplayLockingEnabled(
-                   GetExecutionContext()) &&
-               name == html_names::kRendersubtreeAttr &&
-               params.old_value != params.new_value &&
-               DisplayLockContext::IsAttributeVersion(
-                   GetDisplayLockContext())) {
-      UseCounter::Count(GetDocument(), WebFeature::kRenderSubtreeAttribute);
-
-      // This is needed to ensure that proper containment is put in place.
-      SetNeedsStyleRecalc(kLocalStyleChange,
-                          StyleChangeReasonForTracing::FromAttribute(name));
-      SpaceSplitString tokens(params.new_value.LowerASCII());
-      uint16_t activation_mask =
-          static_cast<uint16_t>(DisplayLockActivationReason::kAny);
-
-      // Figure out the activation mask.
-      if (tokens.Contains("skip-activation"))
-        activation_mask = 0;
-      if (tokens.Contains("skip-viewport-activation")) {
-        activation_mask &=
-            ~static_cast<uint16_t>(DisplayLockActivationReason::kViewport);
-      }
-
-      EnsureDisplayLockContext(DisplayLockContextCreateMethod::kAttribute)
-          .SetActivatable(activation_mask);
-      const bool should_be_invisible = tokens.Contains("invisible");
-      if (should_be_invisible) {
-        if (!GetDisplayLockContext()->IsLocked())
-          GetDisplayLockContext()->StartAcquire();
-      } else {
-        // Getting unlocked.
-        if (GetDisplayLockContext()->IsLocked())
-          GetDisplayLockContext()->StartCommit();
-      }
-
     } else if (RuntimeEnabledFeatures::InvisibleDOMEnabled() &&
                name == html_names::kInvisibleAttr &&
                params.old_value != params.new_value) {
@@ -3038,7 +3003,6 @@
     GetDocument().UserActionElements().DidDetach(*this);
   }
 
-  SetNeedsResizeObserverUpdate();
   GetDocument().GetStyleEngine().ClearNeedsWhitespaceReattachmentFor(this);
 }
 
@@ -3336,11 +3300,9 @@
     // change for children, since this could be the first time we unlocked the
     // context and as a result need to process more of the subtree than we would
     // normally. Note that if this is not the first time, then
-    // AdjustTyleRecalcChangeForChildren() won't do any adjustments.
-    if (!DisplayLockContext::IsAttributeVersion(context) &&
-        !context->IsLocked()) {
+    // AdjustStyleRecalcChangeForChildren() won't do any adjustments.
+    if (!context->IsLocked())
       child_change = context->AdjustStyleRecalcChangeForChildren(child_change);
-    }
   }
 
   if (new_style) {
@@ -4422,7 +4384,7 @@
 }
 
 bool Element::ActivateDisplayLockIfNeeded(DisplayLockActivationReason reason) {
-  if (!RuntimeEnabledFeatures::DisplayLockingEnabled(GetExecutionContext()) ||
+  if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled() ||
       GetDocument().LockedDisplayLockCount() ==
           GetDocument().DisplayLockBlockingAllActivationCount())
     return false;
@@ -4459,7 +4421,7 @@
 
 bool Element::DisplayLockPreventsActivation(
     DisplayLockActivationReason reason) const {
-  if (!RuntimeEnabledFeatures::DisplayLockingEnabled(GetExecutionContext()))
+  if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled())
     return false;
 
   if (GetDocument().LockedDisplayLockCount() == 0)
@@ -4837,48 +4799,16 @@
   return EnsureElementRareData().EnsureResizeObserverData();
 }
 
-void Element::SetNeedsResizeObserverUpdate() {
-  if (auto* data = ResizeObserverData()) {
-    for (auto& observation : data->Values())
-      observation->ElementSizeChanged();
-  }
-}
-
 DisplayLockContext* Element::GetDisplayLockContext() const {
-  if (!RuntimeEnabledFeatures::DisplayLockingEnabled(GetExecutionContext()))
+  if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled())
     return nullptr;
   return HasRareData() ? GetElementRareData()->GetDisplayLockContext()
                        : nullptr;
 }
 
-DisplayLockContext& Element::EnsureDisplayLockContext(
-    DisplayLockContextCreateMethod method) {
-  auto& result = *EnsureElementRareData().EnsureDisplayLockContext(
+DisplayLockContext& Element::EnsureDisplayLockContext() {
+  return *EnsureElementRareData().EnsureDisplayLockContext(
       this, GetExecutionContext());
-  result.SetMethod(method);
-  return result;
-}
-
-ScriptPromise Element::updateRendering(ScriptState* script_state) {
-  auto* context = GetDisplayLockContext();
-  if (context)
-    return context->UpdateRendering(script_state);
-  auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
-  auto promise = resolver->Promise();
-  resolver->Resolve();
-  return promise;
-}
-
-void Element::resetSubtreeRendered() {
-  if (auto* context = GetDisplayLockContext()) {
-    context->ClearActivated();
-    // Note that we need to schedule a style invalidation since we may need to
-    // adjust the lock state, which happens during style recalc for
-    // CSS-render-subtree.
-    SetNeedsStyleRecalc(
-        kLocalStyleChange,
-        StyleChangeReasonForTracing::Create(style_change_reason::kDisplayLock));
-  }
 }
 
 // Step 1 of http://domparsing.spec.whatwg.org/#insertadjacenthtml()
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h
index f9d0addb..44220e9f 100644
--- a/third_party/blink/renderer/core/dom/element.h
+++ b/third_party/blink/renderer/core/dom/element.h
@@ -77,7 +77,6 @@
 class PseudoElementStyleRequest;
 class ResizeObservation;
 class ResizeObserver;
-class ScriptPromise;
 class ScrollIntoViewOptions;
 class ScrollIntoViewOptionsOrBoolean;
 class ScrollToOptions;
@@ -96,7 +95,6 @@
 enum class CSSValueID;
 enum class DisplayLockActivationReason;
 enum class DisplayLockLifecycleTarget;
-enum class DisplayLockContextCreateMethod;
 
 using ScrollOffset = FloatSize;
 
@@ -943,14 +941,9 @@
   ResizeObserverData() const;
   HeapHashMap<Member<ResizeObserver>, Member<ResizeObservation>>&
   EnsureResizeObserverData();
-  void SetNeedsResizeObserverUpdate();
 
   DisplayLockContext* GetDisplayLockContext() const;
-  DisplayLockContext& EnsureDisplayLockContext(DisplayLockContextCreateMethod);
-
-  // Display locking IDL implementation
-  ScriptPromise updateRendering(ScriptState*);
-  void resetSubtreeRendered();
+  DisplayLockContext& EnsureDisplayLockContext();
 
   bool StyleRecalcBlockedByDisplayLock(DisplayLockLifecycleTarget) const;
 
diff --git a/third_party/blink/renderer/core/dom/element.idl b/third_party/blink/renderer/core/dom/element.idl
index 4f50a7a..8805330 100644
--- a/third_party/blink/renderer/core/dom/element.idl
+++ b/third_party/blink/renderer/core/dom/element.idl
@@ -148,13 +148,6 @@
     attribute EventHandler onbeforepaste;
     attribute EventHandler onsearch;
 
-    // Declarative display locking.
-    [RuntimeEnabled=DisplayLocking, CEReactions, CustomElementCallbacks, Reflect] attribute DOMString renderSubtree;
-    [RuntimeEnabled=DisplayLocking, CallWith=ScriptState] Promise<any> updateRendering();
-
-    // CSS version of display locking.
-    [RuntimeEnabled=CSSRenderSubtree] void resetSubtreeRendered();
-
     // Element Timing
     [Affects=Nothing, CEReactions, Reflect=elementtiming] attribute DOMString elementTiming;
 };
diff --git a/third_party/blink/renderer/core/dom/global_event_handlers.idl b/third_party/blink/renderer/core/dom/global_event_handlers.idl
index 044660f..15f39dba 100644
--- a/third_party/blink/renderer/core/dom/global_event_handlers.idl
+++ b/third_party/blink/renderer/core/dom/global_event_handlers.idl
@@ -82,7 +82,7 @@
     attribute EventHandler onplaying;
     attribute EventHandler onprogress;
     attribute EventHandler onratechange;
-    [RuntimeEnabled=DisplayLocking] attribute EventHandler onrendersubtreeactivation;
+    [RuntimeEnabled=CSSRenderSubtree] attribute EventHandler onrendersubtreeactivation;
     attribute EventHandler onreset;
     attribute EventHandler onresize;
     attribute EventHandler onscroll;
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc
index 70434ed..992113c8 100644
--- a/third_party/blink/renderer/core/dom/node.cc
+++ b/third_party/blink/renderer/core/dom/node.cc
@@ -1319,7 +1319,7 @@
       break;
     // If we reach a locked ancestor, we should abort since the ancestor marking
     // will be done when the lock is committed.
-    if (RuntimeEnabledFeatures::DisplayLockingEnabled(GetExecutionContext())) {
+    if (RuntimeEnabledFeatures::CSSRenderSubtreeEnabled()) {
       auto* ancestor_element = DynamicTo<Element>(ancestor);
       if (ancestor_element && ancestor_element->StyleRecalcBlockedByDisplayLock(
                                   DisplayLockLifecycleTarget::kChildren)) {
@@ -1355,7 +1355,7 @@
   // roots. These would be updated when we commit the lock. If we have locked
   // display locks somewhere in the document, we iterate up the ancestor chain
   // to check if we're in one such subtree.
-  if (RuntimeEnabledFeatures::DisplayLockingEnabled(GetExecutionContext()) &&
+  if (RuntimeEnabledFeatures::CSSRenderSubtreeEnabled() &&
       GetDocument().LockedDisplayLockCount() > 0) {
     for (auto* ancestor_copy = ancestor; ancestor_copy;
          ancestor_copy = ancestor_copy->GetStyleRecalcParent()) {
diff --git a/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc b/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc
index 6acc2aea..44c3eff3 100644
--- a/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/delete_selection_command.cc
@@ -25,6 +25,7 @@
 
 #include "third_party/blink/renderer/core/editing/commands/delete_selection_command.h"
 
+#include "build/build_config.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/dom/node_traversal.h"
@@ -225,6 +226,15 @@
   return Position();
 }
 
+// Workaround: GCC fails to resolve overloaded template functions, passed as
+// parameters of EnclosingNodeType. But it works wrapping that in a utility
+// function.
+#if defined(COMPILER_GCC)
+static bool IsHTMLTableRowElement(const blink::Node* node) {
+  return IsA<HTMLTableRowElement>(node);
+}
+#endif
+
 void DeleteSelectionCommand::InitializePositionData(
     EditingState* editing_state) {
   DCHECK(!GetDocument().NeedsLayoutTreeUpdate());
@@ -253,10 +263,18 @@
   start_root_ = RootEditableElementOf(start);
   end_root_ = RootEditableElementOf(end);
 
+#if defined(COMPILER_GCC)
+  // Workaround. See declaration of IsHTMLTableRowElement
+  start_table_row_ = To<HTMLTableRowElement>(
+      EnclosingNodeOfType(start, &IsHTMLTableRowElement));
+  end_table_row_ =
+      To<HTMLTableRowElement>(EnclosingNodeOfType(end, &IsHTMLTableRowElement));
+#else
   start_table_row_ = To<HTMLTableRowElement>(
       EnclosingNodeOfType(start, &IsA<HTMLTableRowElement>));
   end_table_row_ = To<HTMLTableRowElement>(
       EnclosingNodeOfType(end, &IsA<HTMLTableRowElement>));
+#endif
 
   // Don't move content out of a table cell.
   // If the cell is non-editable, enclosingNodeOfType won't return it by
diff --git a/third_party/blink/renderer/core/editing/finder/find_buffer.cc b/third_party/blink/renderer/core/editing/finder/find_buffer.cc
index cff00f6..4036724 100644
--- a/third_party/blink/renderer/core/editing/finder/find_buffer.cc
+++ b/third_party/blink/renderer/core/editing/finder/find_buffer.cc
@@ -216,8 +216,7 @@
 void FindBuffer::CollectScopedForcedUpdates(Node& start_node,
                                             const Node* search_range_end_node,
                                             const Node* node_after_block) {
-  if (!RuntimeEnabledFeatures::DisplayLockingEnabled(
-          start_node.GetExecutionContext()))
+  if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled())
     return;
   if (start_node.GetDocument().LockedDisplayLockCount() ==
       start_node.GetDocument().DisplayLockBlockingAllActivationCount())
diff --git a/third_party/blink/renderer/core/editing/finder/text_finder.cc b/third_party/blink/renderer/core/editing/finder/text_finder.cc
index 323b889a..3a13b5d1 100644
--- a/third_party/blink/renderer/core/editing/finder/text_finder.cc
+++ b/third_party/blink/renderer/core/editing/finder/text_finder.cc
@@ -76,8 +76,7 @@
 static void ScrollToVisible(Range* match) {
   const Node& first_node = *match->FirstNode();
   if (RuntimeEnabledFeatures::InvisibleDOMEnabled() ||
-      RuntimeEnabledFeatures::DisplayLockingEnabled(
-          first_node.GetExecutionContext())) {
+      RuntimeEnabledFeatures::CSSRenderSubtreeEnabled()) {
     const EphemeralRangeInFlatTree range(match);
     if (InvisibleDOM::ActivateRangeIfNeeded(range) ||
         DisplayLockUtilities::ActivateFindInPageMatchRangeIfNeeded(range)) {
diff --git a/third_party/blink/renderer/core/editing/iterators/text_iterator_test.cc b/third_party/blink/renderer/core/editing/iterators/text_iterator_test.cc
index 28f2e7c..74e6796 100644
--- a/third_party/blink/renderer/core/editing/iterators/text_iterator_test.cc
+++ b/third_party/blink/renderer/core/editing/iterators/text_iterator_test.cc
@@ -1034,7 +1034,7 @@
 TEST_P(TextIteratorTest, IterateWithLockedSubtree) {
   SetBodyContent("<div id='parent'>foo<div id='locked'>text</div>bar</div>");
   auto* locked = GetDocument().getElementById("locked");
-  locked->setAttribute("rendersubtree", "invisible");
+  locked->setAttribute(html_names::kStyleAttr, "render-subtree: invisible");
   GetDocument().UpdateStyleAndLayout(DocumentUpdateReason::kTest);
   auto* parent = GetDocument().getElementById("parent");
   const Position start_position = Position::FirstPositionInNode(*parent);
diff --git a/third_party/blink/renderer/core/editing/suggestion/text_suggestion_controller.cc b/third_party/blink/renderer/core/editing/suggestion/text_suggestion_controller.cc
index f5d2fe4..0d5863a 100644
--- a/third_party/blink/renderer/core/editing/suggestion/text_suggestion_controller.cc
+++ b/third_party/blink/renderer/core/editing/suggestion/text_suggestion_controller.cc
@@ -152,7 +152,7 @@
 
   Vector<TextSuggestionInfo>& suggestion_infos =
       suggestion_infos_with_node_and_highlight_color.suggestion_infos;
-  for (const std::pair<const Member<const Text>, DocumentMarker*>&
+  for (const std::pair<Member<const Text>, Member<DocumentMarker>>&
            node_marker_pair : node_suggestion_marker_pairs_sorted_by_length) {
     if (node_marker_pair.first !=
         suggestion_infos_with_node_and_highlight_color.text_node)
@@ -161,7 +161,7 @@
     if (suggestion_infos.size() == max_number_of_suggestions)
       break;
 
-    const auto* marker = To<SuggestionMarker>(node_marker_pair.second);
+    const auto* marker = To<SuggestionMarker>(node_marker_pair.second.Get());
     const Vector<String>& marker_suggestions = marker->Suggestions();
     for (wtf_size_t suggestion_index = 0;
          suggestion_index < marker_suggestions.size(); ++suggestion_index) {
diff --git a/third_party/blink/renderer/core/execution_context/security_context.cc b/third_party/blink/renderer/core/execution_context/security_context.cc
index f6e98f1..65bd8afb 100644
--- a/third_party/blink/renderer/core/execution_context/security_context.cc
+++ b/third_party/blink/renderer/core/execution_context/security_context.cc
@@ -31,7 +31,6 @@
 #include "third_party/blink/public/common/feature_policy/document_policy_features.h"
 #include "third_party/blink/public/common/feature_policy/feature_policy.h"
 #include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/core/execution_context/security_context_init.h"
 #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
@@ -62,8 +61,7 @@
       document_policy_(init.CreateDocumentPolicy()),
       content_security_policy_(init.GetCSP()),
       address_space_(network::mojom::IPAddressSpace::kUnknown),
-      insecure_request_policy_(
-          mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone),
+      insecure_request_policy_(kLeaveInsecureRequestsAlone),
       require_safe_types_(false),
       context_type_(context_type) {}
 
diff --git a/third_party/blink/renderer/core/execution_context/security_context.h b/third_party/blink/renderer/core/execution_context/security_context.h
index 3ba61bd..bfa2d1b0 100644
--- a/third_party/blink/renderer/core/execution_context/security_context.h
+++ b/third_party/blink/renderer/core/execution_context/security_context.h
@@ -37,7 +37,7 @@
 #include "third_party/blink/public/mojom/feature_policy/document_policy_feature.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/feature_policy/feature_policy.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/feature_policy/feature_policy_feature.mojom-blink-forward.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink-forward.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/public/platform/web_vector.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
@@ -134,10 +134,10 @@
   }
 
   // https://w3c.github.io/webappsec-upgrade-insecure-requests/#insecure-requests-policy
-  void SetInsecureRequestPolicy(mojom::blink::InsecureRequestPolicy policy) {
+  void SetInsecureRequestPolicy(WebInsecureRequestPolicy policy) {
     insecure_request_policy_ = policy;
   }
-  mojom::blink::InsecureRequestPolicy GetInsecureRequestPolicy() const {
+  WebInsecureRequestPolicy GetInsecureRequestPolicy() const {
     return insecure_request_policy_;
   }
 
@@ -180,7 +180,7 @@
   Member<ContentSecurityPolicy> content_security_policy_;
 
   network::mojom::IPAddressSpace address_space_;
-  mojom::blink::InsecureRequestPolicy insecure_request_policy_;
+  WebInsecureRequestPolicy insecure_request_policy_;
   InsecureNavigationsSet insecure_navigations_to_upgrade_;
   bool require_safe_types_;
   const SecurityContextType context_type_;
diff --git a/third_party/blink/renderer/core/exported/local_frame_client_impl.h b/third_party/blink/renderer/core/exported/local_frame_client_impl.h
index f9d97a44..835b91b 100644
--- a/third_party/blink/renderer/core/exported/local_frame_client_impl.h
+++ b/third_party/blink/renderer/core/exported/local_frame_client_impl.h
@@ -40,6 +40,7 @@
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
 #include "mojo/public/cpp/bindings/remote.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/renderer/core/frame/local_frame_client.h"
 #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
diff --git a/third_party/blink/renderer/core/exported/web_frame.cc b/third_party/blink/renderer/core/exported/web_frame.cc
index c4c019d7..71f5422 100644
--- a/third_party/blink/renderer/core/exported/web_frame.cc
+++ b/third_party/blink/renderer/core/exported/web_frame.cc
@@ -7,7 +7,6 @@
 #include <algorithm>
 #include "third_party/blink/public/common/frame/sandbox_flags.h"
 #include "third_party/blink/public/mojom/scroll/scrollbar_mode.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/public/web/web_element.h"
 #include "third_party/blink/renderer/bindings/core/v8/window_proxy_manager.h"
 #include "third_party/blink/renderer/core/dom/increment_load_event_delay_count.h"
@@ -159,7 +158,7 @@
       ToCoreFrame(*this)->GetSecurityContext()->GetSecurityOrigin());
 }
 
-mojom::blink::InsecureRequestPolicy WebFrame::GetInsecureRequestPolicy() const {
+WebInsecureRequestPolicy WebFrame::GetInsecureRequestPolicy() const {
   return ToCoreFrame(*this)->GetSecurityContext()->GetInsecureRequestPolicy();
 }
 
diff --git a/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc b/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc
index 56ec1b3..ad9cc6e 100644
--- a/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "third_party/blink/public/common/feature_policy/feature_policy.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/public/platform/web_float_rect.h"
 #include "third_party/blink/public/platform/web_intrinsic_sizing_info.h"
 #include "third_party/blink/public/platform/web_rect.h"
@@ -294,7 +293,7 @@
 }
 
 void WebRemoteFrameImpl::SetReplicatedInsecureRequestPolicy(
-    mojom::blink::InsecureRequestPolicy policy) {
+    WebInsecureRequestPolicy policy) {
   DCHECK(GetFrame());
   GetFrame()->SetInsecureRequestPolicy(policy);
 }
diff --git a/third_party/blink/renderer/core/exported/web_remote_frame_impl.h b/third_party/blink/renderer/core/exported/web_remote_frame_impl.h
index defdadc8..d0e8119 100644
--- a/third_party/blink/renderer/core/exported/web_remote_frame_impl.h
+++ b/third_party/blink/renderer/core/exported/web_remote_frame_impl.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_EXPORTED_WEB_REMOTE_FRAME_IMPL_H_
 
 #include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom-blink-forward.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink-forward.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/public/web/web_remote_frame.h"
 #include "third_party/blink/public/web/web_remote_frame_client.h"
 #include "third_party/blink/renderer/core/core_export.h"
@@ -88,8 +88,7 @@
       network::mojom::ContentSecurityPolicyType,
       network::mojom::ContentSecurityPolicySource) override;
   void ResetReplicatedContentSecurityPolicy() override;
-  void SetReplicatedInsecureRequestPolicy(
-      mojom::blink::InsecureRequestPolicy) override;
+  void SetReplicatedInsecureRequestPolicy(WebInsecureRequestPolicy) override;
   void SetReplicatedInsecureNavigationsSet(const WebVector<unsigned>&) override;
   void SetReplicatedAdFrameType(
       mojom::blink::AdFrameType ad_frame_type) override;
diff --git a/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc b/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc
index c514cdf..5d77284 100644
--- a/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc
@@ -37,7 +37,6 @@
 #include "third_party/blink/public/mojom/devtools/devtools_agent.mojom-blink.h"
 #include "third_party/blink/public/mojom/loader/fetch_client_settings_object.mojom-blink.h"
 #include "third_party/blink/public/mojom/script/script_type.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom-blink.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h"
 #include "third_party/blink/public/platform/task_type.h"
@@ -197,9 +196,8 @@
           creation_address_space,
           outside_fetch_client_settings_object.insecure_requests_policy ==
                   mojom::blink::InsecureRequestsPolicy::kUpgrade
-              ? mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests |
-                    mojom::blink::InsecureRequestPolicy::kBlockAllMixedContent
-              : mojom::blink::InsecureRequestPolicy::kBlockAllMixedContent,
+              ? kUpgradeInsecureRequests | kBlockAllMixedContent
+              : kBlockAllMixedContent,
           FetchClientSettingsObject::InsecureNavigationsSet());
 
   scoped_refptr<WebWorkerFetchContext> web_worker_fetch_context =
diff --git a/third_party/blink/renderer/core/frame/csp/content_security_policy.cc b/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
index 1ba9200..3873e5e 100644
--- a/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
+++ b/third_party/blink/renderer/core/frame/csp/content_security_policy.cc
@@ -29,7 +29,6 @@
 #include <utility>
 
 #include "base/debug/dump_without_crashing.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/public/platform/web_url_request.h"
@@ -158,8 +157,7 @@
       style_hash_algorithms_used_(kContentSecurityPolicyHashAlgorithmNone),
       sandbox_mask_(mojom::blink::WebSandboxFlags::kNone),
       require_trusted_types_(false),
-      insecure_request_policy_(
-          mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone) {}
+      insecure_request_policy_(kLeaveInsecureRequestsAlone) {}
 
 bool ContentSecurityPolicy::IsBound() {
   return delegate_;
@@ -941,13 +939,11 @@
 }
 
 void ContentSecurityPolicy::EnforceStrictMixedContentChecking() {
-  insecure_request_policy_ |=
-      mojom::blink::InsecureRequestPolicy::kBlockAllMixedContent;
+  insecure_request_policy_ |= kBlockAllMixedContent;
 }
 
 void ContentSecurityPolicy::UpgradeInsecureRequests() {
-  insecure_request_policy_ |=
-      mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests;
+  insecure_request_policy_ |= kUpgradeInsecureRequests;
 }
 
 static String StripURLForUseInReport(
diff --git a/third_party/blink/renderer/core/frame/csp/content_security_policy.h b/third_party/blink/renderer/core/frame/csp/content_security_policy.h
index 50b1e3765..2c990755 100644
--- a/third_party/blink/renderer/core/frame/csp/content_security_policy.h
+++ b/third_party/blink/renderer/core/frame/csp/content_security_policy.h
@@ -31,8 +31,8 @@
 
 #include "services/network/public/mojom/content_security_policy.mojom-blink.h"
 #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink-forward.h"
 #include "third_party/blink/public/platform/web_content_security_policy_struct.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/renderer/bindings/core/v8/source_location.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/execution_context/security_context.h"
@@ -99,8 +99,7 @@
   // Directives support.
   virtual void SetSandboxFlags(SandboxFlags) = 0;
   virtual void SetRequireTrustedTypes() = 0;
-  virtual void AddInsecureRequestPolicy(
-      mojom::blink::InsecureRequestPolicy) = 0;
+  virtual void AddInsecureRequestPolicy(WebInsecureRequestPolicy) = 0;
 
   // Violation reporting.
 
@@ -429,7 +428,7 @@
   // |m_insecureRequestPolicy|
   void EnforceStrictMixedContentChecking();
   void UpgradeInsecureRequests();
-  mojom::blink::InsecureRequestPolicy GetInsecureRequestPolicy() const {
+  WebInsecureRequestPolicy GetInsecureRequestPolicy() const {
     return insecure_request_policy_;
   }
 
@@ -575,7 +574,7 @@
   SandboxFlags sandbox_mask_;
   bool require_trusted_types_;
   String disable_eval_error_message_;
-  mojom::blink::InsecureRequestPolicy insecure_request_policy_;
+  WebInsecureRequestPolicy insecure_request_policy_;
 
   Member<CSPSource> self_source_;
   String self_protocol_;
diff --git a/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc b/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc
index aac8b09c..852a9d9 100644
--- a/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc
+++ b/third_party/blink/renderer/core/frame/csp/content_security_policy_test.cc
@@ -5,7 +5,7 @@
 #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/document_init.h"
 #include "third_party/blink/renderer/core/frame/csp/csp_directive_list.h"
@@ -55,20 +55,14 @@
 TEST_F(ContentSecurityPolicyTest, ParseInsecureRequestPolicy) {
   struct TestCase {
     const char* header;
-    mojom::blink::InsecureRequestPolicy expected_policy;
-  } cases[] = {
-      {"default-src 'none'",
-       mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone},
-      {"upgrade-insecure-requests",
-       mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests},
-      {"block-all-mixed-content",
-       mojom::blink::InsecureRequestPolicy::kBlockAllMixedContent},
-      {"upgrade-insecure-requests; block-all-mixed-content",
-       mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests |
-           mojom::blink::InsecureRequestPolicy::kBlockAllMixedContent},
-      {"upgrade-insecure-requests, block-all-mixed-content",
-       mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests |
-           mojom::blink::InsecureRequestPolicy::kBlockAllMixedContent}};
+    WebInsecureRequestPolicy expected_policy;
+  } cases[] = {{"default-src 'none'", kLeaveInsecureRequestsAlone},
+               {"upgrade-insecure-requests", kUpgradeInsecureRequests},
+               {"block-all-mixed-content", kBlockAllMixedContent},
+               {"upgrade-insecure-requests; block-all-mixed-content",
+                kUpgradeInsecureRequests | kBlockAllMixedContent},
+               {"upgrade-insecure-requests, block-all-mixed-content",
+                kUpgradeInsecureRequests | kBlockAllMixedContent}};
 
   // Enforced
   for (const auto& test : cases) {
@@ -86,10 +80,7 @@
     csp->BindToDelegate(document->GetContentSecurityPolicyDelegate());
     EXPECT_EQ(test.expected_policy,
               document->GetSecurityContext().GetInsecureRequestPolicy());
-    bool expect_upgrade =
-        (test.expected_policy &
-         mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests) !=
-        mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone;
+    bool expect_upgrade = test.expected_policy & kUpgradeInsecureRequests;
     EXPECT_EQ(
         expect_upgrade,
         document->GetSecurityContext().InsecureNavigationsToUpgrade().Contains(
@@ -103,14 +94,13 @@
     csp = MakeGarbageCollected<ContentSecurityPolicy>();
     csp->DidReceiveHeader(test.header, ContentSecurityPolicyType::kReport,
                           ContentSecurityPolicySource::kHTTP);
-    EXPECT_EQ(mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone,
-              csp->GetInsecureRequestPolicy());
+    EXPECT_EQ(kLeaveInsecureRequestsAlone, csp->GetInsecureRequestPolicy());
 
     execution_context = CreateExecutionContext();
     execution_context->GetSecurityContext().SetSecurityOrigin(secure_origin);
     csp->BindToDelegate(execution_context->GetContentSecurityPolicyDelegate());
     EXPECT_EQ(
-        mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone,
+        kLeaveInsecureRequestsAlone,
         execution_context->GetSecurityContext().GetInsecureRequestPolicy());
     EXPECT_FALSE(execution_context->GetSecurityContext()
                      .InsecureNavigationsToUpgrade()
@@ -1629,8 +1619,7 @@
   EXPECT_FALSE(csp->IsActive());
   EXPECT_FALSE(csp->IsActiveForConnections());
   EXPECT_TRUE(csp->FallbackUrlForPlugin().IsEmpty());
-  EXPECT_EQ(mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone,
-            csp->GetInsecureRequestPolicy());
+  EXPECT_EQ(kLeaveInsecureRequestsAlone, csp->GetInsecureRequestPolicy());
   EXPECT_FALSE(csp->HasHeaderDeliveredPolicy());
   EXPECT_FALSE(csp->SupportsWasmEval());
   EXPECT_EQ(mojom::blink::WebSandboxFlags::kNone, csp->GetSandboxMask());
diff --git a/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc b/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc
index 91cd284..d7a0a31 100644
--- a/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc
+++ b/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.cc
@@ -4,8 +4,6 @@
 
 #include "third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.h"
 
-#include "third_party/blink/public/common/security_context/insecure_request_policy.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/source_location.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/events/security_policy_violation_event.h"
@@ -71,7 +69,7 @@
 }
 
 void ExecutionContextCSPDelegate::AddInsecureRequestPolicy(
-    mojom::blink::InsecureRequestPolicy policy) {
+    WebInsecureRequestPolicy policy) {
   SecurityContext& security_context = GetSecurityContext();
 
   Document* document = GetDocument();
@@ -84,9 +82,7 @@
     document->DidEnforceInsecureRequestPolicy();
 
   // Upgrade Insecure Requests: Update the set of insecure URLs to upgrade.
-  if ((policy &
-       mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests) !=
-      mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone) {
+  if (policy & kUpgradeInsecureRequests) {
     // Spec: Enforcing part of:
     // https://w3c.github.io/webappsec-upgrade-insecure-requests/#delivery
     // Step 3. Let tuple be a tuple of the protected resource’s URL's host and
diff --git a/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.h b/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.h
index 1226af4..23c5231 100644
--- a/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.h
+++ b/third_party/blink/renderer/core/frame/csp/execution_context_csp_delegate.h
@@ -5,7 +5,6 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_CSP_EXECUTION_CONTEXT_CSP_DELEGATE_H_
 #define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_CSP_EXECUTION_CONTEXT_CSP_DELEGATE_H_
 
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink-forward.h"
 #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
 
 namespace blink {
@@ -29,7 +28,7 @@
   const KURL& Url() const override;
   void SetSandboxFlags(SandboxFlags) override;
   void SetRequireTrustedTypes() override;
-  void AddInsecureRequestPolicy(mojom::blink::InsecureRequestPolicy) override;
+  void AddInsecureRequestPolicy(WebInsecureRequestPolicy) override;
   std::unique_ptr<SourceLocation> GetSourceLocation() override;
   base::Optional<uint16_t> GetStatusCode() override;
   String GetDocumentReferrer() override;
diff --git a/third_party/blink/renderer/core/frame/local_frame_client.h b/third_party/blink/renderer/core/frame/local_frame_client.h
index bcc769d..c30c58b1 100644
--- a/third_party/blink/renderer/core/frame/local_frame_client.h
+++ b/third_party/blink/renderer/core/frame/local_frame_client.h
@@ -48,6 +48,7 @@
 #include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h"
 #include "third_party/blink/public/platform/web_content_settings_client.h"
 #include "third_party/blink/public/platform/web_effective_connection_type.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/public/platform/web_worker_fetch_context.h"
 #include "third_party/blink/public/web/web_frame_load_type.h"
 #include "third_party/blink/public/web/web_history_commit_type.h"
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index fb10b3c..3777c94 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -2160,12 +2160,6 @@
   // phase of this cycle.
 }
 
-void LocalFrameView::SetNeedsForcedResizeObservations() {
-  if (auto* controller =
-          GetFrame().GetDocument()->GetResizeObserverController())
-    controller->SetNeedsForcedResizeObservations();
-}
-
 void LocalFrameView::NotifyResizeObservers() {
   TRACE_EVENT0("blink,benchmark", "LocalFrameView::NotifyResizeObservers");
   // Controller exists only if ResizeObserver was created.
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h
index dc823f5..d07e3c35 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.h
+++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -683,10 +683,6 @@
   void RegisterForLifecycleNotifications(LifecycleNotificationObserver*);
   void UnregisterFromLifecycleNotifications(LifecycleNotificationObserver*);
 
-  // Sets whether all ResizeObservers should check all their ResizeObservations
-  // for a resize. This is needed when exiting a display lock.
-  void SetNeedsForcedResizeObservations();
-
  protected:
   void FrameRectsChanged(const IntRect&) override;
   void SelfVisibleChanged() override;
diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc
index b9fdeeb..34ae5dd 100644
--- a/third_party/blink/renderer/core/frame/remote_frame.cc
+++ b/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -9,7 +9,6 @@
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom-blink.h"
 #include "third_party/blink/public/mojom/frame/intrinsic_sizing_info.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/public/platform/interface_registry.h"
 #include "third_party/blink/public/web/web_frame.h"
 #include "third_party/blink/public/web/web_view.h"
@@ -328,8 +327,7 @@
   security_context_.ResetAndEnforceSandboxFlags(flags);
 }
 
-void RemoteFrame::SetInsecureRequestPolicy(
-    mojom::blink::InsecureRequestPolicy policy) {
+void RemoteFrame::SetInsecureRequestPolicy(WebInsecureRequestPolicy policy) {
   security_context_.SetInsecureRequestPolicy(policy);
 }
 
diff --git a/third_party/blink/renderer/core/frame/remote_frame.h b/third_party/blink/renderer/core/frame/remote_frame.h
index 814a6fb..2f7c33e 100644
--- a/third_party/blink/renderer/core/frame/remote_frame.h
+++ b/third_party/blink/renderer/core/frame/remote_frame.h
@@ -11,7 +11,6 @@
 #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/input/focus_type.mojom-blink-forward.h"
 #include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink-forward.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/execution_context/remote_security_context.h"
 #include "third_party/blink/renderer/core/frame/frame.h"
@@ -91,7 +90,7 @@
       const FeaturePolicy::FeatureState&);
 
   void SetReplicatedSandboxFlags(mojom::blink::WebSandboxFlags);
-  void SetInsecureRequestPolicy(mojom::blink::InsecureRequestPolicy);
+  void SetInsecureRequestPolicy(WebInsecureRequestPolicy);
   void SetInsecureNavigationsSet(const WebVector<unsigned>&);
 
   // blink::mojom::RemoteFrame overrides:
diff --git a/third_party/blink/renderer/core/html/forms/html_form_element.cc b/third_party/blink/renderer/core/html/forms/html_form_element.cc
index 0a4292b..c344dd3 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_element.cc
@@ -28,8 +28,7 @@
 #include <limits>
 
 #include "base/auto_reset.h"
-#include "third_party/blink/public/common/security_context/insecure_request_policy.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/renderer/bindings/core/v8/radio_node_list_or_element.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_controller.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_event_listener.h"
@@ -590,9 +589,8 @@
     // If we're not upgrading insecure requests, and the new action attribute is
     // pointing to an insecure "action" location from a secure page it is marked
     // as "passive" mixed content.
-    if ((GetDocument().GetSecurityContext().GetInsecureRequestPolicy() &
-         mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests) !=
-        mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone)
+    if (GetDocument().GetSecurityContext().GetInsecureRequestPolicy() &
+        kUpgradeInsecureRequests)
       return;
     KURL action_url = GetDocument().CompleteURL(
         attributes_.Action().IsEmpty() ? GetDocument().Url().GetString()
diff --git a/third_party/blink/renderer/core/html/html_attribute_names.json5 b/third_party/blink/renderer/core/html/html_attribute_names.json5
index fe9a72f8..649c530 100644
--- a/third_party/blink/renderer/core/html/html_attribute_names.json5
+++ b/third_party/blink/renderer/core/html/html_attribute_names.json5
@@ -277,7 +277,6 @@
     "preload",
     "pseudo",
     "readonly",
-    "rendersubtree",
     "referrerpolicy",
     "rel",
     "required",
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index 8262a6a..a72f7d31 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -2107,10 +2107,6 @@
   // object for paint invalidation.
   if (!NeedsLayout())
     SetShouldCheckForPaintInvalidation();
-
-  if (auto* element = DynamicTo<Element>(GetNode())) {
-    element->SetNeedsResizeObserverUpdate();
-  }
 }
 
 bool LayoutBox::IntersectsVisibleViewport() const {
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h
index 4ff8a377..20ee1b2 100644
--- a/third_party/blink/renderer/core/layout/layout_object.h
+++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -2514,7 +2514,7 @@
   bool BeingDestroyed() const { return bitfields_.BeingDestroyed(); }
 
   DisplayLockContext* GetDisplayLockContext() const {
-    if (!RuntimeEnabledFeatures::DisplayLockingEnabled(&GetDocument()))
+    if (!RuntimeEnabledFeatures::CSSRenderSubtreeEnabled())
       return nullptr;
     auto* element = DynamicTo<Element>(GetNode());
     if (!element)
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc
index c8b6e61..a9c246be 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc
@@ -177,8 +177,8 @@
   Vector<unsigned> ToEndOffsetList(
       NGInlineItemSegments::const_iterator segments) {
     Vector<unsigned> end_offsets;
-    for (const NGInlineItemSegment& segment : segments)
-      end_offsets.push_back(segment.EndOffset());
+    for (const RunSegmenter::RunSegmenterRange& segment : segments)
+      end_offsets.push_back(segment.end);
     return end_offsets;
   }
 
diff --git a/third_party/blink/renderer/core/layout/ng/mathml/ng_math_space_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/mathml/ng_math_space_layout_algorithm.cc
index fe39464..66406f5a 100644
--- a/third_party/blink/renderer/core/layout/ng/mathml/ng_math_space_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/mathml/ng_math_space_layout_algorithm.cc
@@ -30,7 +30,7 @@
 
   container_builder_.SetBaseline(
       border_padding_.block_start +
-      ValueForLength(Style().GetVerticalAlignLength(), LayoutUnit()));
+      ValueForLength(Style().GetMathBaseline(), LayoutUnit()));
   return container_builder_.ToBoxFragment();
 }
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
index 3b10399..c237a2c 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
@@ -433,8 +433,7 @@
       return *min_max_size;
     };
 
-
-    MinMaxSize min_max_sizes_in_main_axis_direction{LayoutUnit(),
+    MinMaxSize min_max_sizes_in_main_axis_direction{main_axis_border_padding,
                                                     LayoutUnit::Max()};
     MinMaxSize min_max_sizes_in_cross_axis_direction{LayoutUnit(),
                                                      LayoutUnit::Max()};
@@ -682,6 +681,8 @@
           min, IntrinsicBlockSizeFunc, LengthResolvePhase::kLayout);
     }
     min_max_sizes_in_main_axis_direction -= main_axis_border_padding;
+    DCHECK_GE(min_max_sizes_in_main_axis_direction.min_size, 0);
+    DCHECK_GE(min_max_sizes_in_main_axis_direction.max_size, 0);
 
     // TODO(dgrogan): Should min_max_sizes_in_cross_axis_direction include
     // cross_axis_border_padding?
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_container.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_container.cc
index c9085ba3..20a540c 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_container.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_container.cc
@@ -172,7 +172,6 @@
   SVGLayoutSupport::ComputeContainerBoundingBoxes(
       this, object_bounding_box_, object_bounding_box_valid_,
       stroke_bounding_box_, local_visual_rect_);
-  GetElement()->SetNeedsResizeObserverUpdate();
 }
 
 bool LayoutSVGContainer::NodeAtPoint(HitTestResult& result,
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_image.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_image.cc
index 34580bb..99535729 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_image.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_image.cc
@@ -129,7 +129,6 @@
     object_bounding_box_.SetSize(CalculateObjectSize());
 
   if (old_object_bounding_box != object_bounding_box_) {
-    GetElement()->SetNeedsResizeObserverUpdate();
     SetShouldDoFullPaintInvalidation(PaintInvalidationReason::kImage);
     needs_boundaries_update_ = true;
   }
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_gradient.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_gradient.cc
index 434df694..ab3d552 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_gradient.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_gradient.cc
@@ -70,8 +70,7 @@
   // currently working on. Preferably the state validation should have
   // no side-effects though.
   if (should_collect_gradient_attributes_) {
-    if (!CollectGradientAttributes())
-      return gradient_data;
+    CollectGradientAttributes();
     should_collect_gradient_attributes_ = false;
   }
 
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_gradient.h b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_gradient.h
index 1e80cb6..7998f7f 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_gradient.h
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_gradient.h
@@ -47,7 +47,7 @@
  protected:
   virtual SVGUnitTypes::SVGUnitType GradientUnits() const = 0;
   virtual AffineTransform CalculateGradientTransform() const = 0;
-  virtual bool CollectGradientAttributes() = 0;
+  virtual void CollectGradientAttributes() = 0;
   virtual scoped_refptr<Gradient> BuildGradient() const = 0;
 
   static GradientSpreadMethod PlatformSpreadMethodFromSVGType(
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_linear_gradient.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_linear_gradient.cc
index 460a76c1..8d88444 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_linear_gradient.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_linear_gradient.cc
@@ -33,10 +33,10 @@
 
 LayoutSVGResourceLinearGradient::~LayoutSVGResourceLinearGradient() = default;
 
-bool LayoutSVGResourceLinearGradient::CollectGradientAttributes() {
+void LayoutSVGResourceLinearGradient::CollectGradientAttributes() {
   DCHECK(GetElement());
   attributes_wrapper_->Set(LinearGradientAttributes());
-  return To<SVGLinearGradientElement>(GetElement())
+  To<SVGLinearGradientElement>(GetElement())
       ->CollectGradientAttributes(MutableAttributes());
 }
 
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_linear_gradient.h b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_linear_gradient.h
index bbad601c2..48c43d5 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_linear_gradient.h
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_linear_gradient.h
@@ -47,7 +47,7 @@
   AffineTransform CalculateGradientTransform() const override {
     return Attributes().GradientTransform();
   }
-  bool CollectGradientAttributes() override;
+  void CollectGradientAttributes() override;
   scoped_refptr<Gradient> BuildGradient() const override;
 
   FloatPoint StartPoint(const LinearGradientAttributes&) const;
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_radial_gradient.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_radial_gradient.cc
index 9b335862..bf85cc0 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_radial_gradient.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_radial_gradient.cc
@@ -34,10 +34,10 @@
 
 LayoutSVGResourceRadialGradient::~LayoutSVGResourceRadialGradient() = default;
 
-bool LayoutSVGResourceRadialGradient::CollectGradientAttributes() {
+void LayoutSVGResourceRadialGradient::CollectGradientAttributes() {
   DCHECK(GetElement());
   attributes_wrapper_->Set(RadialGradientAttributes());
-  return To<SVGRadialGradientElement>(GetElement())
+  To<SVGRadialGradientElement>(GetElement())
       ->CollectGradientAttributes(MutableAttributes());
 }
 
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_radial_gradient.h b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_radial_gradient.h
index d6f1b76..4177123 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_resource_radial_gradient.h
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_resource_radial_gradient.h
@@ -47,7 +47,7 @@
   AffineTransform CalculateGradientTransform() const override {
     return Attributes().GradientTransform();
   }
-  bool CollectGradientAttributes() override;
+  void CollectGradientAttributes() override;
   scoped_refptr<Gradient> BuildGradient() const override;
 
   FloatPoint CenterPoint(const RadialGradientAttributes&) const;
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_shape.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_shape.cc
index 528e3f6..66bff8d5 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_shape.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_shape.cc
@@ -229,7 +229,6 @@
     FloatRect old_object_bounding_box = ObjectBoundingBox();
     UpdateShapeFromElement();
     if (old_object_bounding_box != ObjectBoundingBox()) {
-      GetElement()->SetNeedsResizeObserverUpdate();
       SetShouldDoFullPaintInvalidation();
       bbox_changed = true;
     }
diff --git a/third_party/blink/renderer/core/loader/form_submission.cc b/third_party/blink/renderer/core/loader/form_submission.cc
index c519c54..5a362a8 100644
--- a/third_party/blink/renderer/core/loader/form_submission.cc
+++ b/third_party/blink/renderer/core/loader/form_submission.cc
@@ -30,8 +30,7 @@
 
 #include "third_party/blink/renderer/core/loader/form_submission.h"
 
-#include "third_party/blink/public/common/security_context/insecure_request_policy.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/events/event.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -213,9 +212,8 @@
                                              ? document.Url().GetString()
                                              : copied_attributes.Action());
 
-  if ((document.GetSecurityContext().GetInsecureRequestPolicy() &
-       mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests) !=
-          mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone &&
+  if (document.GetSecurityContext().GetInsecureRequestPolicy() &
+          kUpgradeInsecureRequests &&
       action_url.ProtocolIs("http") &&
       !SecurityOrigin::Create(action_url)->IsPotentiallyTrustworthy()) {
     UseCounter::Count(document,
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
index 47e263f..cc85619 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
@@ -48,6 +48,7 @@
 #include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h"
 #include "third_party/blink/public/platform/web_content_settings_client.h"
 #include "third_party/blink/public/platform/web_effective_connection_type.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/public/platform/websocket_handshake_throttle.h"
 #include "third_party/blink/public/web/web_frame.h"
 #include "third_party/blink/public/web/web_local_frame.h"
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc b/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc
index fd17dd9d..16f9f285 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context_test.cc
@@ -40,10 +40,10 @@
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h"
 #include "third_party/blink/public/platform/web_client_hints_type.h"
 #include "third_party/blink/public/platform/web_document_subresource_filter.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/public/platform/web_runtime_features.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/frame/ad_tracker.h"
@@ -337,7 +337,7 @@
 
   void ExpectIsAutomaticUpgradeSet(const char* input,
                                    const char* main_frame,
-                                   mojom::blink::InsecureRequestPolicy policy,
+                                   WebInsecureRequestPolicy policy,
                                    bool expected_value) {
     const KURL input_url(input);
     const KURL main_frame_url(main_frame);
@@ -410,7 +410,7 @@
   };
 
   document->GetSecurityContext().SetInsecureRequestPolicy(
-      mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests);
+      kUpgradeInsecureRequests);
 
   for (const auto& test : tests) {
     document->GetSecurityContext().ClearInsecureNavigationsToUpgradeForTest();
@@ -454,7 +454,7 @@
 
   RecreateFetchContext(KURL("https://secureorigin.test/image.png"));
   document->GetSecurityContext().SetInsecureRequestPolicy(
-      mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone);
+      kLeaveInsecureRequestsAlone);
 
   ExpectUpgrade("http://example.test/image.png",
                 "http://example.test/image.png");
@@ -480,27 +480,27 @@
 TEST_F(FrameFetchContextModifyRequestTest, IsAutomaticUpgradeSet) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(features::kMixedContentAutoupgrade);
-  ExpectIsAutomaticUpgradeSet(
-      "http://example.test/image.png", "https://example.test",
-      mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone, true);
+  ExpectIsAutomaticUpgradeSet("http://example.test/image.png",
+                              "https://example.test",
+                              kLeaveInsecureRequestsAlone, true);
 }
 
 TEST_F(FrameFetchContextModifyRequestTest, IsAutomaticUpgradeNotSet) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(features::kMixedContentAutoupgrade);
   // Upgrade shouldn't happen if the resource is already https.
-  ExpectIsAutomaticUpgradeSet(
-      "https://example.test/image.png", "https://example.test",
-      mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone, false);
+  ExpectIsAutomaticUpgradeSet("https://example.test/image.png",
+                              "https://example.test",
+                              kLeaveInsecureRequestsAlone, false);
   // Upgrade shouldn't happen if the site is http.
-  ExpectIsAutomaticUpgradeSet(
-      "http://example.test/image.png", "http://example.test",
-      mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone, false);
+  ExpectIsAutomaticUpgradeSet("http://example.test/image.png",
+                              "http://example.test",
+                              kLeaveInsecureRequestsAlone, false);
 
   // Flag shouldn't be set if upgrade was due to upgrade-insecure-requests.
-  ExpectIsAutomaticUpgradeSet(
-      "http://example.test/image.png", "https://example.test",
-      mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests, false);
+  ExpectIsAutomaticUpgradeSet("http://example.test/image.png",
+                              "https://example.test", kUpgradeInsecureRequests,
+                              false);
 }
 
 TEST_F(FrameFetchContextModifyRequestTest, SendUpgradeInsecureRequestHeader) {
@@ -530,24 +530,24 @@
   // the tests both before and after providing a document to the context.
   for (const auto& test : tests) {
     document->GetSecurityContext().SetInsecureRequestPolicy(
-        mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone);
+        kLeaveInsecureRequestsAlone);
     ExpectUpgradeInsecureRequestHeader(test.to_request, test.frame_type,
                                        test.should_prefer);
 
     document->GetSecurityContext().SetInsecureRequestPolicy(
-        mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests);
+        kUpgradeInsecureRequests);
     ExpectUpgradeInsecureRequestHeader(test.to_request, test.frame_type,
                                        test.should_prefer);
   }
 
   for (const auto& test : tests) {
     document->GetSecurityContext().SetInsecureRequestPolicy(
-        mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone);
+        kLeaveInsecureRequestsAlone);
     ExpectUpgradeInsecureRequestHeader(test.to_request, test.frame_type,
                                        test.should_prefer);
 
     document->GetSecurityContext().SetInsecureRequestPolicy(
-        mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests);
+        kUpgradeInsecureRequests);
     ExpectUpgradeInsecureRequestHeader(test.to_request, test.frame_type,
                                        test.should_prefer);
   }
diff --git a/third_party/blink/renderer/core/loader/mixed_content_checker.cc b/third_party/blink/renderer/core/loader/mixed_content_checker.cc
index 17fa2fd..7f65711 100644
--- a/third_party/blink/renderer/core/loader/mixed_content_checker.cc
+++ b/third_party/blink/renderer/core/loader/mixed_content_checker.cc
@@ -32,10 +32,9 @@
 #include "base/metrics/field_trial_params.h"
 #include "services/network/public/mojom/ip_address_space.mojom-blink.h"
 #include "third_party/blink/public/common/features.h"
-#include "third_party/blink/public/common/security_context/insecure_request_policy.h"
 #include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/public/platform/web_content_settings_client.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/public/platform/web_mixed_content.h"
 #include "third_party/blink/public/platform/web_security_origin.h"
 #include "third_party/blink/public/platform/web_worker_fetch_context.h"
@@ -174,9 +173,7 @@
   // intentionally skip the client checks in order to prevent degrading the
   // site's security UI.
   bool strict_mode =
-      (security_context->GetInsecureRequestPolicy() &
-       mojom::blink::InsecureRequestPolicy::kBlockAllMixedContent) !=
-          mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone ||
+      security_context->GetInsecureRequestPolicy() & kBlockAllMixedContent ||
       settings->GetStrictMixedContentChecking();
   if (strict_mode)
     return false;
@@ -197,13 +194,11 @@
   // If we're in strict mode, we'll automagically fail everything, and
   // intentionally skip the client checks in order to prevent degrading the
   // site's security UI.
-  bool strict_mode =
-      (fetch_context.GetResourceFetcherProperties()
-           .GetFetchClientSettingsObject()
-           .GetInsecureRequestsPolicy() &
-       mojom::blink::InsecureRequestPolicy::kBlockAllMixedContent) !=
-          mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone ||
-      settings->GetStrictMixedContentChecking();
+  bool strict_mode = fetch_context.GetResourceFetcherProperties()
+                             .GetFetchClientSettingsObject()
+                             .GetInsecureRequestsPolicy() &
+                         kBlockAllMixedContent ||
+                     settings->GetStrictMixedContentChecking();
   if (strict_mode)
     return false;
   return settings && settings->GetAllowRunningOfInsecureContent();
@@ -425,9 +420,8 @@
   // intentionally skip the client checks in order to prevent degrading the
   // site's security UI.
   bool strict_mode =
-      (mixed_frame->GetSecurityContext()->GetInsecureRequestPolicy() &
-       mojom::blink::InsecureRequestPolicy::kBlockAllMixedContent) !=
-          mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone ||
+      mixed_frame->GetSecurityContext()->GetInsecureRequestPolicy() &
+          kBlockAllMixedContent ||
       settings->GetStrictMixedContentChecking();
 
   WebMixedContentContextType context_type =
@@ -536,9 +530,8 @@
     allowed = false;
   } else {
     bool strict_mode =
-        (fetch_client_settings_object.GetInsecureRequestsPolicy() &
-         mojom::blink::InsecureRequestPolicy::kBlockAllMixedContent) !=
-            mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone ||
+        fetch_client_settings_object.GetInsecureRequestsPolicy() &
+            kBlockAllMixedContent ||
         settings->GetStrictMixedContentChecking();
     bool should_ask_embedder =
         !strict_mode && (!settings->GetStrictlyBlockBlockableMixedContent() ||
@@ -840,9 +833,8 @@
 
   DCHECK(fetch_client_settings_object);
 
-  if ((fetch_client_settings_object->GetInsecureRequestsPolicy() &
-       mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests) ==
-      mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone) {
+  if (!(fetch_client_settings_object->GetInsecureRequestsPolicy() &
+        kUpgradeInsecureRequests)) {
     mojom::RequestContextType context = resource_request.GetRequestContext();
     if (context != mojom::RequestContextType::UNSPECIFIED &&
         resource_request.Url().ProtocolIs("http") &&
diff --git a/third_party/blink/renderer/core/mathml/mathml_space_element.cc b/third_party/blink/renderer/core/mathml/mathml_space_element.cc
index c9a2eb88..ca857634 100644
--- a/third_party/blink/renderer/core/mathml/mathml_space_element.cc
+++ b/third_party/blink/renderer/core/mathml/mathml_space_element.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/mathml/mathml_space_element.h"
 
+#include "third_party/blink/renderer/core/css/parser/css_parser.h"
 #include "third_party/blink/renderer/core/layout/ng/mathml/layout_ng_mathml_block.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 
@@ -12,6 +13,23 @@
 MathMLSpaceElement::MathMLSpaceElement(Document& doc)
     : MathMLElement(mathml_names::kMspaceTag, doc) {}
 
+void MathMLSpaceElement::AddMathBaselineIfNeeded(
+    ComputedStyle& style,
+    const CSSToLengthConversionData& conversion_data) {
+  if (!FastHasAttribute(mathml_names::kHeightAttr))
+    return;
+  auto string = FastGetAttribute(mathml_names::kHeightAttr);
+  const CSSValue* parsed = CSSParser::ParseSingleValue(
+      CSSPropertyID::kHeight, string,
+      StrictCSSParserContext(GetDocument().GetSecureContextMode()));
+  const auto* new_value = DynamicTo<CSSPrimitiveValue>(parsed);
+  if (!new_value || !new_value->IsLength())
+    return;
+  Length length_or_percentage_value =
+      new_value->ConvertToLength(conversion_data);
+  style.SetMathBaseline(std::move(length_or_percentage_value));
+}
+
 bool MathMLSpaceElement::IsPresentationAttribute(
     const QualifiedName& name) const {
   if (name == mathml_names::kWidthAttr || name == mathml_names::kHeightAttr ||
@@ -41,9 +59,6 @@
       AddPropertyToPresentationAttributeStyle(style, CSSPropertyID::kHeight,
                                               value);
     }
-    if (name == mathml_names::kHeightAttr) {
-      SetInlineStyleProperty(CSSPropertyID::kVerticalAlign, value, false);
-    }
   } else {
     MathMLElement::CollectStyleForPresentationAttribute(name, value, style);
   }
diff --git a/third_party/blink/renderer/core/mathml/mathml_space_element.h b/third_party/blink/renderer/core/mathml/mathml_space_element.h
index a4ae212..719e4973 100644
--- a/third_party/blink/renderer/core/mathml/mathml_space_element.h
+++ b/third_party/blink/renderer/core/mathml/mathml_space_element.h
@@ -11,11 +11,15 @@
 
 class LayoutObject;
 class ComputedStyle;
+class CSSToLengthConversionData;
 
 class MathMLSpaceElement final : public MathMLElement {
  public:
   explicit MathMLSpaceElement(Document&);
 
+  void AddMathBaselineIfNeeded(ComputedStyle&,
+                               const CSSToLengthConversionData&);
+
  private:
   LayoutObject* CreateLayoutObject(const ComputedStyle&,
                                    LegacyLayout legacy) override;
diff --git a/third_party/blink/renderer/core/resize_observer/resize_observation.cc b/third_party/blink/renderer/core/resize_observer/resize_observation.cc
index 789e4d0..abb5fa9 100644
--- a/third_party/blink/renderer/core/resize_observer/resize_observation.cc
+++ b/third_party/blink/renderer/core/resize_observer/resize_observation.cc
@@ -18,14 +18,12 @@
     : target_(target),
       observer_(observer),
       observation_size_(0, 0),
-      element_size_changed_(true),
       observed_box_(observed_box) {
   DCHECK(target_);
-  observer_->ElementSizeChanged();
 }
 
 bool ResizeObservation::ObservationSizeOutOfSync() {
-  if (!element_size_changed_ || observation_size_ == ComputeTargetSize())
+  if (observation_size_ == ComputeTargetSize())
     return false;
 
   // Skip resize observations on locked elements.
@@ -39,13 +37,6 @@
 
 void ResizeObservation::SetObservationSize(const LayoutSize& observation_size) {
   observation_size_ = observation_size;
-
-  // Don't clear the dirty bit while locked. This allows us to make sure to
-  // compare sizes when becoming unlocked.
-  if (UNLIKELY(DisplayLockUtilities::IsInLockedSubtreeCrossingFrames(*target_)))
-    return;
-
-  element_size_changed_ = false;
 }
 
 size_t ResizeObservation::TargetDepth() {
@@ -68,24 +59,23 @@
       if (!layout_object->IsBox())
         return LayoutSize();
 
-      switch (observed_box_) {
-        case ResizeObserverBoxOptions::BorderBox:
-          return ToLayoutBox(layout_object)->BorderBoxRect().Size();
-        case ResizeObserverBoxOptions::ContentBox:
-          return ToLayoutBox(layout_object)->ContentSize();
-        default:
-          NOTREACHED();
+      if (LayoutBox* layout_box = ToLayoutBox(layout_object)) {
+        switch (observed_box_) {
+          case ResizeObserverBoxOptions::BorderBox:
+            return LayoutSize(layout_box->LogicalWidth(),
+                              layout_box->LogicalHeight());
+          case ResizeObserverBoxOptions::ContentBox:
+            return LayoutSize(layout_box->ContentLogicalWidth(),
+                              layout_box->ContentLogicalHeight());
+          default:
+            NOTREACHED();
+        }
       }
     }
   }
   return LayoutSize();
 }
 
-void ResizeObservation::ElementSizeChanged() {
-  element_size_changed_ = true;
-  observer_->ElementSizeChanged();
-}
-
 void ResizeObservation::Trace(Visitor* visitor) {
   visitor->Trace(target_);
   visitor->Trace(observer_);
diff --git a/third_party/blink/renderer/core/resize_observer/resize_observation.h b/third_party/blink/renderer/core/resize_observer/resize_observation.h
index 3e678c84..66c0ac6 100644
--- a/third_party/blink/renderer/core/resize_observer/resize_observation.h
+++ b/third_party/blink/renderer/core/resize_observer/resize_observation.h
@@ -29,7 +29,6 @@
   // True if observationSize differs from target's current size.
   bool ObservationSizeOutOfSync();
   void SetObservationSize(const LayoutSize&);
-  void ElementSizeChanged();
   ResizeObserverBoxOptions observedBox() const { return observed_box_; }
 
   LayoutSize ComputeTargetSize() const;
@@ -41,7 +40,6 @@
   Member<ResizeObserver> observer_;
   // Target size sent in last observation notification.
   LayoutSize observation_size_;
-  bool element_size_changed_;
   ResizeObserverBoxOptions observed_box_;
 };
 
diff --git a/third_party/blink/renderer/core/resize_observer/resize_observer.cc b/third_party/blink/renderer/core/resize_observer/resize_observer.cc
index 4394b34..c2c5c4bb 100644
--- a/third_party/blink/renderer/core/resize_observer/resize_observer.cc
+++ b/third_party/blink/renderer/core/resize_observer/resize_observer.cc
@@ -32,8 +32,7 @@
                                Document& document)
     : ExecutionContextClient(document.ToExecutionContext()),
       callback_(callback),
-      skipped_observations_(false),
-      element_size_changed_(false) {
+      skipped_observations_(false) {
   DCHECK(callback_);
   controller_ = &document.EnsureResizeObserverController();
   controller_->AddObserver(*this);
@@ -42,8 +41,7 @@
 ResizeObserver::ResizeObserver(Delegate* delegate, Document& document)
     : ExecutionContextClient(document.ToExecutionContext()),
       delegate_(delegate),
-      skipped_observations_(false),
-      element_size_changed_(false) {
+      skipped_observations_(false) {
   DCHECK(delegate_);
   controller_ = &document.EnsureResizeObserverController();
   controller_->AddObserver(*this);
@@ -129,8 +127,6 @@
   DCHECK(active_observations_.IsEmpty());
 
   size_t min_observed_depth = ResizeObserverController::kDepthBottom;
-  if (!element_size_changed_)
-    return min_observed_depth;
   for (auto& observation : observations_) {
     if (!observation->ObservationSizeOutOfSync())
       continue;
@@ -146,9 +142,6 @@
 }
 
 void ResizeObserver::DeliverObservations() {
-  // We can only clear this flag after all observations have been
-  // broadcast.
-  element_size_changed_ = skipped_observations_;
   if (active_observations_.IsEmpty())
     return;
 
@@ -191,12 +184,6 @@
   skipped_observations_ = false;
 }
 
-void ResizeObserver::ElementSizeChanged() {
-  element_size_changed_ = true;
-  if (controller_)
-    controller_->ObserverChanged();
-}
-
 bool ResizeObserver::HasPendingActivity() const {
   return !observations_.IsEmpty();
 }
diff --git a/third_party/blink/renderer/core/resize_observer/resize_observer.h b/third_party/blink/renderer/core/resize_observer/resize_observer.h
index 04aa96b..8e8dd97 100644
--- a/third_party/blink/renderer/core/resize_observer/resize_observer.h
+++ b/third_party/blink/renderer/core/resize_observer/resize_observer.h
@@ -59,8 +59,6 @@
   bool SkippedObservations() { return skipped_observations_; }
   void DeliverObservations();
   void ClearObservations();
-  void ElementSizeChanged();
-  bool HasElementSizeChanged() { return element_size_changed_; }
 
   ResizeObserverBoxOptions ParseBoxOptions(const String& box_options);
 
@@ -86,8 +84,7 @@
   HeapVector<Member<ResizeObservation>> active_observations_;
   // True if observations were skipped gatherObservations
   bool skipped_observations_;
-  // True if any ResizeObservation reported size change
-  bool element_size_changed_;
+
   WeakMember<ResizeObserverController> controller_;
 };
 
diff --git a/third_party/blink/renderer/core/resize_observer/resize_observer_controller.cc b/third_party/blink/renderer/core/resize_observer/resize_observer_controller.cc
index 6b7958d4..d2bfdb5 100644
--- a/third_party/blink/renderer/core/resize_observer/resize_observer_controller.cc
+++ b/third_party/blink/renderer/core/resize_observer/resize_observer_controller.cc
@@ -8,8 +8,7 @@
 
 namespace blink {
 
-ResizeObserverController::ResizeObserverController()
-    : observers_changed_(false) {}
+ResizeObserverController::ResizeObserverController() = default;
 
 void ResizeObserverController::AddObserver(ResizeObserver& observer) {
   observers_.insert(&observer);
@@ -17,8 +16,7 @@
 
 size_t ResizeObserverController::GatherObservations(size_t deeper_than) {
   size_t shallowest = ResizeObserverController::kDepthBottom;
-  if (!observers_changed_)
-    return shallowest;
+
   for (auto& observer : observers_) {
     size_t depth = observer->GatherObservations(deeper_than);
     if (depth < shallowest)
@@ -27,14 +25,6 @@
   return shallowest;
 }
 
-void ResizeObserverController::SetNeedsForcedResizeObservations() {
-  for (auto& observer : observers_) {
-    // Set ElementSizeChanged as a way of forcing the observer to check all
-    // observations.
-    observer->ElementSizeChanged();
-  }
-}
-
 bool ResizeObserverController::SkippedObservations() {
   for (auto& observer : observers_) {
     if (observer->SkippedObservations())
@@ -44,7 +34,6 @@
 }
 
 void ResizeObserverController::DeliverObservations() {
-  observers_changed_ = false;
   // Copy is needed because m_observers might get modified during
   // deliverObservations.
   HeapVector<Member<ResizeObserver>> observers;
@@ -53,8 +42,6 @@
   for (auto& observer : observers) {
     if (observer) {
       observer->DeliverObservations();
-      observers_changed_ =
-          observers_changed_ || observer->HasElementSizeChanged();
     }
   }
 }
diff --git a/third_party/blink/renderer/core/resize_observer/resize_observer_controller.h b/third_party/blink/renderer/core/resize_observer/resize_observer_controller.h
index e832c66..9ee120d 100644
--- a/third_party/blink/renderer/core/resize_observer/resize_observer_controller.h
+++ b/third_party/blink/renderer/core/resize_observer/resize_observer_controller.h
@@ -35,9 +35,6 @@
   bool SkippedObservations();
   void DeliverObservations();
   void ClearObservations();
-  void ObserverChanged() { observers_changed_ = true; }
-
-  void SetNeedsForcedResizeObservations();
 
   void Trace(Visitor*);
 
@@ -49,8 +46,6 @@
  private:
   // Active observers
   HeapLinkedHashSet<WeakMember<ResizeObserver>> observers_;
-  // True if any observers were changed since last notification.
-  bool observers_changed_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.cc b/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.cc
index 648a0b0..d4a2c616 100644
--- a/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.cc
+++ b/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/core/script/fetch_client_settings_object_impl.h"
 
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/execution_context/security_context.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
@@ -77,7 +76,7 @@
   return execution_context_->GetSecurityContext().AddressSpace();
 }
 
-mojom::blink::InsecureRequestPolicy
+WebInsecureRequestPolicy
 FetchClientSettingsObjectImpl::GetInsecureRequestsPolicy() const {
   return execution_context_->GetSecurityContext().GetInsecureRequestPolicy();
 }
diff --git a/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.h b/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.h
index 783ca71..932ba5b 100644
--- a/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.h
+++ b/third_party/blink/renderer/core/script/fetch_client_settings_object_impl.h
@@ -6,7 +6,6 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_SCRIPT_FETCH_CLIENT_SETTINGS_OBJECT_IMPL_H_
 
 #include "services/network/public/mojom/referrer_policy.mojom-blink-forward.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink-forward.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/platform/heap/member.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object.h"
@@ -45,8 +44,7 @@
 
   network::mojom::IPAddressSpace GetAddressSpace() const override;
 
-  mojom::blink::InsecureRequestPolicy GetInsecureRequestsPolicy()
-      const override;
+  WebInsecureRequestPolicy GetInsecureRequestsPolicy() const override;
   const InsecureNavigationsSet& GetUpgradeInsecureNavigationsSet()
       const override;
 
diff --git a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5 b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
index 482f3e61..b8ba270 100644
--- a/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
+++ b/third_party/blink/renderer/core/style/computed_style_extra_fields.json5
@@ -1046,5 +1046,14 @@
       default_value: "false",
       inherited: false,
     },
+    {
+      name: "MathBaseline",
+      field_template: "external",
+      default_value: "Length()",
+      include_paths: ["third_party/blink/renderer/platform/geometry/length.h"],
+      type_name: "Length",
+      field_group: "*",
+      getter: "GetMathBaseline",
+    },
   ],
 }
diff --git a/third_party/blink/renderer/core/svg/svg_linear_gradient_element.cc b/third_party/blink/renderer/core/svg/svg_linear_gradient_element.cc
index e9b49b9..9c0c707 100644
--- a/third_party/blink/renderer/core/svg/svg_linear_gradient_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_linear_gradient_element.cc
@@ -110,8 +110,8 @@
     attributes.SetY2(linear.y2()->CurrentValue());
 }
 
-bool SVGLinearGradientElement::CollectGradientAttributes(
-    LinearGradientAttributes& attributes) {
+void SVGLinearGradientElement::CollectGradientAttributes(
+    LinearGradientAttributes& attributes) const {
   DCHECK(GetLayoutObject());
 
   VisitedSet visited;
@@ -123,12 +123,14 @@
     visited.insert(current);
 
     current = current->ReferencedElement();
-    if (!current || visited.Contains(current))
+
+    // Ignore the referenced gradient element if it is not attached.
+    if (!current || !current->GetLayoutObject())
       break;
-    if (!current->GetLayoutObject())
-      return false;
+    // Cycle detection.
+    if (visited.Contains(current))
+      break;
   }
-  return true;
 }
 
 bool SVGLinearGradientElement::SelfHasRelativeLengths() const {
diff --git a/third_party/blink/renderer/core/svg/svg_linear_gradient_element.h b/third_party/blink/renderer/core/svg/svg_linear_gradient_element.h
index 77a27d2..1b1b218 100644
--- a/third_party/blink/renderer/core/svg/svg_linear_gradient_element.h
+++ b/third_party/blink/renderer/core/svg/svg_linear_gradient_element.h
@@ -35,7 +35,7 @@
  public:
   explicit SVGLinearGradientElement(Document&);
 
-  bool CollectGradientAttributes(LinearGradientAttributes&);
+  void CollectGradientAttributes(LinearGradientAttributes&) const;
 
   SVGAnimatedLength* x1() const { return x1_.Get(); }
   SVGAnimatedLength* y1() const { return y1_.Get(); }
diff --git a/third_party/blink/renderer/core/svg/svg_pattern_element.cc b/third_party/blink/renderer/core/svg/svg_pattern_element.cc
index 8c4aeb45..f87ed75 100644
--- a/third_party/blink/renderer/core/svg/svg_pattern_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_pattern_element.cc
@@ -266,10 +266,10 @@
     // from that element to override values this pattern didn't set.
     current = current->ReferencedElement();
 
-    // Only consider attached SVG pattern elements.
+    // Ignore the referenced pattern element if it is not attached.
     if (!current || !current->GetLayoutObject())
       break;
-    // Cycle detection
+    // Cycle detection.
     if (processed_patterns.Contains(current))
       break;
   }
diff --git a/third_party/blink/renderer/core/svg/svg_radial_gradient_element.cc b/third_party/blink/renderer/core/svg/svg_radial_gradient_element.cc
index ee55760d..3c96ac2b 100644
--- a/third_party/blink/renderer/core/svg/svg_radial_gradient_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_radial_gradient_element.cc
@@ -130,8 +130,8 @@
     attributes.SetFr(radial.fr()->CurrentValue());
 }
 
-bool SVGRadialGradientElement::CollectGradientAttributes(
-    RadialGradientAttributes& attributes) {
+void SVGRadialGradientElement::CollectGradientAttributes(
+    RadialGradientAttributes& attributes) const {
   DCHECK(GetLayoutObject());
 
   VisitedSet visited;
@@ -143,10 +143,12 @@
     visited.insert(current);
 
     current = current->ReferencedElement();
-    if (!current || visited.Contains(current))
+    // Ignore the referenced gradient element if it is not attached.
+    if (!current || !current->GetLayoutObject())
       break;
-    if (!current->GetLayoutObject())
-      return false;
+    // Cycle detection.
+    if (visited.Contains(current))
+      break;
   }
 
   // Handle default values for fx/fy
@@ -155,8 +157,6 @@
 
   if (!attributes.HasFy())
     attributes.SetFy(attributes.Cy());
-
-  return true;
 }
 
 bool SVGRadialGradientElement::SelfHasRelativeLengths() const {
diff --git a/third_party/blink/renderer/core/svg/svg_radial_gradient_element.h b/third_party/blink/renderer/core/svg/svg_radial_gradient_element.h
index 2c53d9c..5aa965d 100644
--- a/third_party/blink/renderer/core/svg/svg_radial_gradient_element.h
+++ b/third_party/blink/renderer/core/svg/svg_radial_gradient_element.h
@@ -35,7 +35,7 @@
  public:
   explicit SVGRadialGradientElement(Document&);
 
-  bool CollectGradientAttributes(RadialGradientAttributes&);
+  void CollectGradientAttributes(RadialGradientAttributes&) const;
 
   SVGAnimatedLength* cx() const { return cx_.Get(); }
   SVGAnimatedLength* cy() const { return cy_.Get(); }
diff --git a/third_party/blink/renderer/core/testing/fake_local_frame_host.cc b/third_party/blink/renderer/core/testing/fake_local_frame_host.cc
index e8e7a52c0..13872b3 100644
--- a/third_party/blink/renderer/core/testing/fake_local_frame_host.cc
+++ b/third_party/blink/renderer/core/testing/fake_local_frame_host.cc
@@ -60,8 +60,7 @@
 
 void FakeLocalFrameHost::DidFocusFrame() {}
 
-void FakeLocalFrameHost::EnforceInsecureRequestPolicy(
-    mojom::InsecureRequestPolicy policy_bitmap) {}
+void FakeLocalFrameHost::EnforceInsecureRequestPolicy(uint8_t policy_bitmap) {}
 
 void FakeLocalFrameHost::EnforceInsecureNavigationsSet(
     const WTF::Vector<uint32_t>& set) {}
diff --git a/third_party/blink/renderer/core/testing/fake_local_frame_host.h b/third_party/blink/renderer/core/testing/fake_local_frame_host.h
index ab79e10a..95921e1 100644
--- a/third_party/blink/renderer/core/testing/fake_local_frame_host.h
+++ b/third_party/blink/renderer/core/testing/fake_local_frame_host.h
@@ -47,8 +47,7 @@
   void DidFailLoadWithError(const ::blink::KURL& url,
                             int32_t error_code) override;
   void DidFocusFrame() override;
-  void EnforceInsecureRequestPolicy(
-      mojom::InsecureRequestPolicy policy_bitmap) override;
+  void EnforceInsecureRequestPolicy(uint8_t policy_bitmap) override;
   void EnforceInsecureNavigationsSet(const WTF::Vector<uint32_t>& set) override;
   void DidChangeActiveSchedulerTrackedFeatures(uint64_t features_mask) override;
   void SuddenTerminationDisablerChanged(
diff --git a/third_party/blink/renderer/core/timing/performance_observer.cc b/third_party/blink/renderer/core/timing/performance_observer.cc
index fe14516..2031f3c 100644
--- a/third_party/blink/renderer/core/timing/performance_observer.cc
+++ b/third_party/blink/renderer/core/timing/performance_observer.cc
@@ -170,17 +170,6 @@
               mojom::ConsoleMessageLevel::kWarning, message));
       return;
     }
-    if (filter_options_ & entry_type) {
-      String message =
-          "The PerformanceObserver has already been called with the entry type "
-          "'" +
-          observer_init->type() + "'.";
-      GetExecutionContext()->AddConsoleMessage(
-          MakeGarbageCollected<ConsoleMessage>(
-              mojom::ConsoleMessageSource::kJavaScript,
-              mojom::ConsoleMessageLevel::kWarning, message));
-      return;
-    }
     if (observer_init->buffered()) {
       // Append all entries of this type to the current performance_entries_
       // to be returned on the next callback.
@@ -221,6 +210,7 @@
   if (performance_)
     performance_->UnregisterPerformanceObserver(*this);
   is_registered_ = false;
+  filter_options_ = PerformanceEntry::kInvalid;
 }
 
 PerformanceEntryVector PerformanceObserver::takeRecords() {
diff --git a/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc b/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc
index 5df9a89..0c15f6012 100644
--- a/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc
+++ b/third_party/blink/renderer/core/workers/shared_worker_client_holder.cc
@@ -36,10 +36,8 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "third_party/blink/public/common/browser_interface_broker_proxy.h"
 #include "third_party/blink/public/common/messaging/message_port_channel.h"
-#include "third_party/blink/public/common/security_context/insecure_request_policy.h"
 #include "third_party/blink/public/mojom/blob/blob_url_store.mojom-blink.h"
 #include "third_party/blink/public/mojom/loader/fetch_client_settings_object.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/public/mojom/worker/shared_worker_info.mojom-blink.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/platform/web_url.h"
@@ -114,9 +112,8 @@
               .GetFetchClientSettingsObject());
 
   mojom::InsecureRequestsPolicy insecure_requests_policy =
-      (outside_fetch_client_settings_object->GetInsecureRequestsPolicy() &
-       mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests) !=
-              mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone
+      outside_fetch_client_settings_object->GetInsecureRequestsPolicy() &
+              kUpgradeInsecureRequests
           ? mojom::InsecureRequestsPolicy::kUpgrade
           : mojom::InsecureRequestsPolicy::kDoNotUpgrade;
 
diff --git a/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc b/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc
index 0555a89..70c799d 100644
--- a/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.h"
 
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/public/platform/web_worker_fetch_context.h"
 #include "third_party/blink/renderer/bindings/core/v8/worker_or_worklet_script_controller.h"
@@ -85,7 +84,7 @@
   // https://crbug.com/924041 https://crbug.com/924043
   void SetSandboxFlags(SandboxFlags) override {}
   void SetRequireTrustedTypes() override {}
-  void AddInsecureRequestPolicy(mojom::blink::InsecureRequestPolicy) override {}
+  void AddInsecureRequestPolicy(WebInsecureRequestPolicy) override {}
   void DisableEval(const String& error_message) override {}
 
   std::unique_ptr<SourceLocation> GetSourceLocation() override {
diff --git a/third_party/blink/renderer/modules/cache_storage/cache.cc b/third_party/blink/renderer/modules/cache_storage/cache.cc
index 433884d..a4c704f 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache.cc
+++ b/third_party/blink/renderer/modules/cache_storage/cache.cc
@@ -298,8 +298,8 @@
                   message.Append(": ");
                   message.Append(error->message);
                 }
-                resolver->Reject(CacheStorageError::CreateException(
-                    error->value, message.ToString()));
+                RejectCacheStorageWithError(resolver, error->value,
+                                            message.ToString());
               }
             },
             method_name_, WrapPersistent(resolver_.Get()),
@@ -743,8 +743,7 @@
                   resolver->Resolve();
                   break;
                 default:
-                  resolver->Reject(
-                      CacheStorageError::CreateException(result->get_status()));
+                  RejectCacheStorageWithError(resolver, result->get_status());
                   break;
               }
             } else {
@@ -824,8 +823,7 @@
                   "CacheStorage", "Cache::MatchAllImpl::Callback",
                   TRACE_ID_GLOBAL(trace_id), TRACE_EVENT_FLAG_FLOW_IN, "status",
                   CacheStorageTracedValue(result->get_status()));
-              resolver->Reject(
-                  CacheStorageError::CreateException(result->get_status()));
+              RejectCacheStorageWithError(resolver, result->get_status());
             } else {
               TRACE_EVENT_WITH_FLOW1(
                   "CacheStorage", "Cache::MatchAllImpl::Callback",
@@ -940,8 +938,8 @@
                     message.Append("Cache.delete(): ");
                     message.Append(error->message);
                   }
-                  resolver->Reject(CacheStorageError::CreateException(
-                      error->value, message.ToString()));
+                  RejectCacheStorageWithError(resolver, error->value,
+                                              message.ToString());
                   break;
               }
             } else {
@@ -1092,8 +1090,7 @@
                   "CacheStorage", "Cache::KeysImpl::Callback",
                   TRACE_ID_GLOBAL(trace_id), TRACE_EVENT_FLAG_FLOW_IN, "status",
                   CacheStorageTracedValue(result->get_status()));
-              resolver->Reject(
-                  CacheStorageError::CreateException(result->get_status()));
+              RejectCacheStorageWithError(resolver, result->get_status());
             } else {
               TRACE_EVENT_WITH_FLOW1(
                   "CacheStorage", "Cache::KeysImpl::Callback",
diff --git a/third_party/blink/renderer/modules/cache_storage/cache_storage.cc b/third_party/blink/renderer/modules/cache_storage/cache_storage.cc
index 03fc5bc..76483de 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache_storage.cc
+++ b/third_party/blink/renderer/modules/cache_storage/cache_storage.cc
@@ -138,8 +138,7 @@
                   resolver->Resolve();
                   break;
                 default:
-                  resolver->Reject(
-                      CacheStorageError::CreateException(result->get_status()));
+                  RejectCacheStorageWithError(resolver, result->get_status());
                   break;
               }
             } else {
@@ -211,7 +210,7 @@
                 resolver->Resolve(false);
                 break;
               default:
-                resolver->Reject(CacheStorageError::CreateException(result));
+                RejectCacheStorageWithError(resolver, result);
                 break;
             }
           },
@@ -273,7 +272,7 @@
                 resolver->Resolve(false);
                 break;
               default:
-                resolver->Reject(CacheStorageError::CreateException(result));
+                RejectCacheStorageWithError(resolver, result);
                 break;
             }
           },
@@ -423,8 +422,7 @@
                   resolver->Resolve();
                   break;
                 default:
-                  resolver->Reject(
-                      CacheStorageError::CreateException(result->get_status()));
+                  RejectCacheStorageWithError(resolver, result->get_status());
                   break;
               }
             } else {
diff --git a/third_party/blink/renderer/modules/cache_storage/cache_storage_error.cc b/third_party/blink/renderer/modules/cache_storage/cache_storage_error.cc
index 9cd01b3..e0298ad 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache_storage_error.cc
+++ b/third_party/blink/renderer/modules/cache_storage/cache_storage_error.cc
@@ -5,8 +5,10 @@
 #include "third_party/blink/renderer/modules/cache_storage/cache_storage_error.h"
 
 #include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/modules/cache_storage/cache.h"
+#include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 
 namespace blink {
@@ -43,47 +45,55 @@
 
 }  // namespace
 
-DOMException* CacheStorageError::CreateException(
-    mojom::CacheStorageError web_error,
-    const String& message) {
+void RejectCacheStorageWithError(ScriptPromiseResolver* resolver,
+                                 mojom::blink::CacheStorageError web_error,
+                                 const String& message) {
   String final_message =
+
       !message.IsEmpty() ? message : GetDefaultMessage(web_error);
   switch (web_error) {
     case mojom::CacheStorageError::kSuccess:
       // This function should only be called with an error.
-      break;
+      NOTREACHED();
+      return;
     case mojom::CacheStorageError::kErrorExists:
-      return MakeGarbageCollected<DOMException>(
-          DOMExceptionCode::kInvalidAccessError, final_message);
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidAccessError, final_message));
+      return;
     case mojom::CacheStorageError::kErrorStorage:
-      return MakeGarbageCollected<DOMException>(DOMExceptionCode::kUnknownError,
-                                                final_message);
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kUnknownError, final_message));
+      return;
     case mojom::CacheStorageError::kErrorNotFound:
-      return MakeGarbageCollected<DOMException>(
-          DOMExceptionCode::kNotFoundError, final_message);
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotFoundError, final_message));
+      return;
     case mojom::CacheStorageError::kErrorQuotaExceeded:
-      return MakeGarbageCollected<DOMException>(
-          DOMExceptionCode::kQuotaExceededError, final_message);
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kQuotaExceededError, final_message));
+      return;
     case mojom::CacheStorageError::kErrorCacheNameNotFound:
-      return MakeGarbageCollected<DOMException>(
-          DOMExceptionCode::kNotFoundError, final_message);
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotFoundError, final_message));
+      return;
     case mojom::CacheStorageError::kErrorQueryTooLarge:
-      return MakeGarbageCollected<DOMException>(DOMExceptionCode::kAbortError,
-                                                final_message);
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kAbortError, final_message));
+      return;
     case mojom::CacheStorageError::kErrorNotImplemented:
-      return MakeGarbageCollected<DOMException>(
-          DOMExceptionCode::kNotSupportedError, final_message);
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kNotSupportedError, final_message));
+      return;
     case mojom::CacheStorageError::kErrorDuplicateOperation:
-      return MakeGarbageCollected<DOMException>(
-          DOMExceptionCode::kInvalidStateError, final_message);
-    // TODO(arthursonzogni): Decide what DOM exception must be used here.
-    // See https://github.com/w3c/ServiceWorker/issues/1490
+      resolver->Reject(MakeGarbageCollected<DOMException>(
+          DOMExceptionCode::kInvalidStateError, final_message));
+      return;
     case mojom::CacheStorageError::kErrorCrossOriginResourcePolicy:
-      return MakeGarbageCollected<DOMException>(
-          DOMExceptionCode::kInvalidAccessError, final_message);
+      ScriptState::Scope scope(resolver->GetScriptState());
+      resolver->Reject(V8ThrowException::CreateTypeError(
+          resolver->GetScriptState()->GetIsolate(), message));
+      return;
   }
-  NOTREACHED();
-  return nullptr;
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/cache_storage/cache_storage_error.h b/third_party/blink/renderer/modules/cache_storage/cache_storage_error.h
index 6d2bb59a..0e36389 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache_storage_error.h
+++ b/third_party/blink/renderer/modules/cache_storage/cache_storage_error.h
@@ -10,25 +10,13 @@
 
 namespace blink {
 
-class DOMException;
 class ScriptPromiseResolver;
 
-class CacheStorageError {
-  STATIC_ONLY(CacheStorageError);
-
- public:
-  // For CallbackPromiseAdapter. Ownership of a given error is not
-  // transferred.
-  using WebType = mojom::CacheStorageError;
-  static DOMException* Take(ScriptPromiseResolver*,
-                            mojom::CacheStorageError web_error) {
-    return CreateException(web_error);
-  }
-
-  static DOMException* CreateException(mojom::CacheStorageError web_error,
-                                       const String& message = String());
-};
-
+// Reject the |resolver| with the appropriate error given |web_error|.
+// When no |message| is provided, the standard one is chosen.
+void RejectCacheStorageWithError(ScriptPromiseResolver* resolver,
+                                 mojom::blink::CacheStorageError web_error,
+                                 const String& message = String());
 }  // namespace blink
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_CACHE_STORAGE_CACHE_STORAGE_ERROR_H_
diff --git a/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc b/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc
index 5d10ac2..b9ca4c7 100644
--- a/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc
+++ b/third_party/blink/renderer/modules/exported/web_embedded_worker_impl.cc
@@ -37,7 +37,6 @@
 #include "services/network/public/mojom/referrer_policy.mojom-blink.h"
 #include "third_party/blink/public/mojom/browser_interface_broker.mojom-blink.h"
 #include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom-blink.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_provider.h"
@@ -304,11 +303,11 @@
   // case, it should be the Document that called update(). For soft update case,
   // it seems to be 'null' document.
 
-  mojom::blink::InsecureRequestPolicy insecure_requests_policy =
+  WebInsecureRequestPolicy insecure_requests_policy =
       passed_settings_object.insecure_requests_policy ==
               mojom::InsecureRequestsPolicy::kUpgrade
-          ? mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests
-          : mojom::blink::InsecureRequestPolicy::kBlockAllMixedContent;
+          ? kUpgradeInsecureRequests
+          : kBlockAllMixedContent;
 
   return std::make_unique<CrossThreadFetchClientSettingsObjectData>(
       script_url.Copy() /* global_object_url */,
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_registration.cc b/third_party/blink/renderer/modules/service_worker/service_worker_registration.cc
index f03c560..44ea095 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_registration.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_registration.cc
@@ -9,9 +9,7 @@
 #include "base/memory/ptr_util.h"
 #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
 #include "mojo/public/cpp/bindings/pending_associated_remote.h"
-#include "third_party/blink/public/common/security_context/insecure_request_policy.h"
 #include "third_party/blink/public/mojom/loader/fetch_client_settings_object.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_navigation_preload_state.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
@@ -279,9 +277,8 @@
   auto mojom_settings_object = mojom::blink::FetchClientSettingsObject::New(
       settings_object.GetReferrerPolicy(),
       KURL(settings_object.GetOutgoingReferrer()),
-      (settings_object.GetInsecureRequestsPolicy() &
-       mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests) !=
-              mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone
+      settings_object.GetInsecureRequestsPolicy() &
+              blink::kUpgradeInsecureRequests
           ? blink::mojom::InsecureRequestsPolicy::kUpgrade
           : blink::mojom::InsecureRequestsPolicy::kDoNotUpgrade);
 
diff --git a/third_party/blink/renderer/modules/websockets/dom_websocket.cc b/third_party/blink/renderer/modules/websockets/dom_websocket.cc
index f07fb65..8bc68e1 100644
--- a/third_party/blink/renderer/modules/websockets/dom_websocket.cc
+++ b/third_party/blink/renderer/modules/websockets/dom_websocket.cc
@@ -40,6 +40,7 @@
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/task_type.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_controller.h"
 #include "third_party/blink/renderer/bindings/core/v8/source_location.h"
 #include "third_party/blink/renderer/bindings/core/v8/string_or_string_sequence.h"
diff --git a/third_party/blink/renderer/modules/websockets/dom_websocket_test.cc b/third_party/blink/renderer/modules/websockets/dom_websocket_test.cc
index a49fff11..4f4a993a 100644
--- a/third_party/blink/renderer/modules/websockets/dom_websocket_test.cc
+++ b/third_party/blink/renderer/modules/websockets/dom_websocket_test.cc
@@ -12,7 +12,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
 #include "third_party/blink/renderer/core/dom/document.h"
@@ -191,7 +191,7 @@
   }
 
   scope.GetDocument().GetSecurityContext().SetInsecureRequestPolicy(
-      mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests);
+      kUpgradeInsecureRequests);
   websocket_scope.Socket().Connect("ws://example.com/endpoint",
                                    Vector<String>(), scope.GetExceptionState());
 
@@ -211,7 +211,7 @@
   }
 
   scope.GetDocument().GetSecurityContext().SetInsecureRequestPolicy(
-      mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests);
+      kUpgradeInsecureRequests);
   websocket_scope.Socket().Connect("ws://127.0.0.1/endpoint", Vector<String>(),
                                    scope.GetExceptionState());
 
@@ -231,7 +231,7 @@
   }
 
   scope.GetDocument().GetSecurityContext().SetInsecureRequestPolicy(
-      mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone);
+      kLeaveInsecureRequestsAlone);
   websocket_scope.Socket().Connect("ws://example.com/endpoint",
                                    Vector<String>(), scope.GetExceptionState());
 
diff --git a/third_party/blink/renderer/modules/websockets/websocket_common.cc b/third_party/blink/renderer/modules/websockets/websocket_common.cc
index a416644..bf57d17 100644
--- a/third_party/blink/renderer/modules/websockets/websocket_common.cc
+++ b/third_party/blink/renderer/modules/websockets/websocket_common.cc
@@ -7,15 +7,15 @@
 #include <stddef.h>
 
 #include "base/metrics/histogram_macros.h"
-#include "third_party/blink/public/common/security_context/insecure_request_policy.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/execution_context/security_context.h"
 #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h"
 #include "third_party/blink/renderer/core/loader/mixed_content_checker.h"
-#include "third_party/blink/renderer/modules/websockets/websocket_channel.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
+
+#include "third_party/blink/renderer/modules/websockets/websocket_channel.h"
 #include "third_party/blink/renderer/platform/weborigin/known_ports.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
@@ -41,9 +41,8 @@
   url_ = KURL(NullURL(), url);
 
   bool upgrade_insecure_requests_set =
-      (execution_context->GetSecurityContext().GetInsecureRequestPolicy() &
-       mojom::blink::InsecureRequestPolicy::kUpgradeInsecureRequests) !=
-      mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone;
+      execution_context->GetSecurityContext().GetInsecureRequestPolicy() &
+      kUpgradeInsecureRequests;
 
   if (upgrade_insecure_requests_set && url_.Protocol() == "ws" &&
       !SecurityOrigin::Create(url_)->IsPotentiallyTrustworthy()) {
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
index 29429e31..1eaf4ca 100644
--- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc
+++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -654,10 +654,6 @@
   RuntimeEnabledFeatures::SetSmsReceiverEnabled(enable);
 }
 
-void WebRuntimeFeatures::EnableDisplayLocking(bool enable) {
-  RuntimeEnabledFeatures::SetDisplayLockingEnabled(enable);
-}
-
 void WebRuntimeFeatures::EnableConsolidatedMovementXY(bool enable) {
   RuntimeEnabledFeatures::SetConsolidatedMovementXYEnabled(enable);
 }
diff --git a/third_party/blink/renderer/platform/heap/heap_thread_test.cc b/third_party/blink/renderer/platform/heap/heap_thread_test.cc
index 6431076a..7f58a01 100644
--- a/third_party/blink/renderer/platform/heap/heap_thread_test.cc
+++ b/third_party/blink/renderer/platform/heap/heap_thread_test.cc
@@ -17,7 +17,13 @@
 namespace blink {
 
 class HeapThreadTest : public TestSupportingGC {};
-class HeapThreadDeathTest : public TestSupportingGC {};
+
+class HeapThreadDeathTest : public TestSupportingGC {
+ public:
+  HeapThreadDeathTest() {
+    testing::FLAGS_gtest_death_test_style = "threadsafe";
+  }
+};
 
 namespace heap_thread_test {
 
@@ -136,15 +142,10 @@
 };
 
 #if DCHECK_IS_ON()
-// TODO(keishi) This test is flaky on mac-rel bot.
-// crbug.com/709069
-// It it also flaky on Linux. crbug.com/1046332.
-#if !defined(OS_MACOSX) && !defined(OS_LINUX)
 TEST_F(HeapThreadDeathTest, MemberSameThreadCheck) {
   EXPECT_DEATH(MemberSameThreadCheckTester().Test(), "");
 }
 #endif
-#endif
 
 class PersistentSameThreadCheckTester : public AlternatingThreadTester {
  private:
@@ -160,15 +161,10 @@
 };
 
 #if DCHECK_IS_ON()
-// TODO(keishi) This test is flaky on mac-rel bot.
-// crbug.com/709069
-// This test is also flaky on Linux. crbug.com/1043580.
-#if !defined(OS_MACOSX) && !defined(OS_LINUX)
 TEST_F(HeapThreadDeathTest, PersistentSameThreadCheck) {
   EXPECT_DEATH(PersistentSameThreadCheckTester().Test(), "");
 }
 #endif
-#endif
 
 class MarkingSameThreadCheckTester : public AlternatingThreadTester {
  private:
@@ -201,8 +197,6 @@
 };
 
 #if DCHECK_IS_ON()
-// TODO(keishi) This test is flaky on mac-rel bot. https://crbug.com/709069, and
-// times out on other bots. https://crbug.com/993148.
 TEST_F(HeapThreadDeathTest, DISABLED_MarkingSameThreadCheck) {
   // This will crash during marking, at the DCHECK in Visitor::markHeader() or
   // earlier.
diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object.h b/third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object.h
index 9f5f505..3ffd87b8 100644
--- a/third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object.h
+++ b/third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object.h
@@ -8,7 +8,7 @@
 #include "base/optional.h"
 #include "services/network/public/mojom/ip_address_space.mojom-blink-forward.h"
 #include "services/network/public/mojom/referrer_policy.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink-forward.h"
+#include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/loader/allowed_by_nosniff.h"
@@ -81,8 +81,7 @@
   virtual network::mojom::IPAddressSpace GetAddressSpace() const = 0;
 
   // https://w3c.github.io/webappsec-upgrade-insecure-requests/#insecure-requests-policy
-  virtual mojom::blink::InsecureRequestPolicy GetInsecureRequestsPolicy()
-      const = 0;
+  virtual WebInsecureRequestPolicy GetInsecureRequestsPolicy() const = 0;
 
   // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-insecure-navigations-set
   using InsecureNavigationsSet = HashSet<unsigned, WTF::AlreadyHashed>;
diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.cc b/third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.cc
index e11f91f..ad064d1 100644
--- a/third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.cc
@@ -4,7 +4,6 @@
 
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h"
 
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/renderer/platform/heap/trace_traits.h"
 
 namespace blink {
@@ -46,7 +45,7 @@
     HttpsState https_state,
     AllowedByNosniff::MimeTypeCheck mime_type_check_for_classic_worker_script,
     network::mojom::IPAddressSpace address_space,
-    mojom::blink::InsecureRequestPolicy insecure_requests_policy,
+    WebInsecureRequestPolicy insecure_requests_policy,
     InsecureNavigationsSet insecure_navigations_set)
     : global_object_url_(global_object_url),
       base_url_(base_url),
diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h b/third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h
index b4ae59e5..84a9a1b 100644
--- a/third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h
+++ b/third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h
@@ -6,7 +6,6 @@
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_FETCH_CLIENT_SETTINGS_OBJECT_SNAPSHOT_H_
 
 #include "services/network/public/mojom/referrer_policy.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink-forward.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
@@ -38,7 +37,7 @@
       HttpsState https_state,
       AllowedByNosniff::MimeTypeCheck mime_type_check_for_classic_worker_script,
       network::mojom::IPAddressSpace address_space,
-      mojom::blink::InsecureRequestPolicy insecure_requests_policy,
+      WebInsecureRequestPolicy insecure_requests_policy,
       FetchClientSettingsObject::InsecureNavigationsSet
           insecure_navigations_set)
       : global_object_url(std::move(global_object_url)),
@@ -62,7 +61,7 @@
   const AllowedByNosniff::MimeTypeCheck
       mime_type_check_for_classic_worker_script;
   const network::mojom::IPAddressSpace address_space;
-  const mojom::blink::InsecureRequestPolicy insecure_requests_policy;
+  const WebInsecureRequestPolicy insecure_requests_policy;
   const FetchClientSettingsObject::InsecureNavigationsSet
       insecure_navigations_set;
 
@@ -95,7 +94,7 @@
       HttpsState https_state,
       AllowedByNosniff::MimeTypeCheck,
       network::mojom::IPAddressSpace,
-      mojom::blink::InsecureRequestPolicy,
+      WebInsecureRequestPolicy,
       InsecureNavigationsSet);
 
   ~FetchClientSettingsObjectSnapshot() override = default;
@@ -117,8 +116,7 @@
     return address_space_;
   }
 
-  mojom::blink::InsecureRequestPolicy GetInsecureRequestsPolicy()
-      const override {
+  WebInsecureRequestPolicy GetInsecureRequestsPolicy() const override {
     return insecure_requests_policy_;
   }
 
@@ -153,7 +151,7 @@
       mime_type_check_for_classic_worker_script_;
   const network::mojom::IPAddressSpace address_space_;
 
-  const mojom::blink::InsecureRequestPolicy insecure_requests_policy_;
+  const WebInsecureRequestPolicy insecure_requests_policy_;
   const InsecureNavigationsSet insecure_navigations_set_;
 };
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/null_resource_fetcher_properties.cc b/third_party/blink/renderer/platform/loader/fetch/null_resource_fetcher_properties.cc
index 3a93692..8a00bb48 100644
--- a/third_party/blink/renderer/platform/loader/fetch/null_resource_fetcher_properties.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/null_resource_fetcher_properties.cc
@@ -6,7 +6,6 @@
 
 #include "services/network/public/mojom/ip_address_space.mojom-blink.h"
 #include "services/network/public/mojom/referrer_policy.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/renderer/platform/loader/allowed_by_nosniff.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h"
 #include "third_party/blink/renderer/platform/loader/fetch/https_state.h"
@@ -26,7 +25,7 @@
               HttpsState::kNone,
               AllowedByNosniff::MimeTypeCheck::kStrict,
               network::mojom::IPAddressSpace::kPublic,
-              mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone,
+              kLeaveInsecureRequestsAlone,
               FetchClientSettingsObject::InsecureNavigationsSet())) {}
 
 void NullResourceFetcherProperties::Trace(Visitor* visitor) {
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_properties_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_properties_test.cc
index 8890de7..3b14d08 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_properties_test.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_properties_test.cc
@@ -6,7 +6,6 @@
 
 #include "services/network/public/mojom/ip_address_space.mojom-blink.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/public/mojom/service_worker/controller_service_worker_mode.mojom-blink.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h"
@@ -27,7 +26,7 @@
         network::mojom::ReferrerPolicy::kDefault,
         "https://example.com/foo.html", HttpsState::kModern,
         AllowedByNosniff::MimeTypeCheck::kStrict, address_space,
-        mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone,
+        kLeaveInsecureRequestsAlone,
         FetchClientSettingsObject::InsecureNavigationsSet());
   }
 };
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc
index 9d618c3..d58d463 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc
@@ -37,7 +37,6 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_url_loader.h"
 #include "third_party/blink/public/platform/web_url_loader_mock_factory.h"
@@ -104,8 +103,7 @@
       SecurityOrigin::Create(KURL("https://example.com/")),
       network::mojom::ReferrerPolicy::kDefault, "https://example.com/foo.html",
       HttpsState::kModern, AllowedByNosniff::MimeTypeCheck::kStrict,
-      address_space,
-      mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone,
+      address_space, kLeaveInsecureRequestsAlone,
       FetchClientSettingsObject::InsecureNavigationsSet());
 }
 
diff --git a/third_party/blink/renderer/platform/loader/testing/test_resource_fetcher_properties.cc b/third_party/blink/renderer/platform/loader/testing/test_resource_fetcher_properties.cc
index 9b222e3..723d4c7 100644
--- a/third_party/blink/renderer/platform/loader/testing/test_resource_fetcher_properties.cc
+++ b/third_party/blink/renderer/platform/loader/testing/test_resource_fetcher_properties.cc
@@ -6,7 +6,6 @@
 
 #include "services/network/public/mojom/ip_address_space.mojom-blink.h"
 #include "services/network/public/mojom/referrer_policy.mojom-blink.h"
-#include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h"
 #include "third_party/blink/renderer/platform/loader/allowed_by_nosniff.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h"
 #include "third_party/blink/renderer/platform/loader/fetch/https_state.h"
@@ -30,7 +29,7 @@
               HttpsState::kNone,
               AllowedByNosniff::MimeTypeCheck::kStrict,
               network::mojom::IPAddressSpace::kPublic,
-              mojom::blink::InsecureRequestPolicy::kLeaveInsecureRequestsAlone,
+              kLeaveInsecureRequestsAlone,
               FetchClientSettingsObject::InsecureNavigationsSet())) {}
 
 TestResourceFetcherProperties::TestResourceFetcherProperties(
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index ac620c7..a53fd1c 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -450,7 +450,7 @@
       // Support for CSS intrinsic-* sizing properties.
       // https://drafts.csswg.org/css-sizing-4/#intrinsic-size-override
       name: "CSSIntrinsicSize",
-      implied_by: ["DisplayLocking"],
+      implied_by: ["CSSRenderSubtree"],
       status: "experimental",
     },
     {
@@ -606,12 +606,6 @@
       settable_from_internals: true,
     },
     {
-      name: "DisplayLocking",
-      origin_trial_feature_name: "DisplayLocking",
-      status: "experimental",
-      implied_by: ["CSSRenderSubtree"],
-    },
-    {
       name: "DocumentCookie",
     },
     {
diff --git a/third_party/blink/tools/blinkpy/w3c/chromium_commit_mock.py b/third_party/blink/tools/blinkpy/w3c/chromium_commit_mock.py
index 3d7c7c47..e21d149 100644
--- a/third_party/blink/tools/blinkpy/w3c/chromium_commit_mock.py
+++ b/third_party/blink/tools/blinkpy/w3c/chromium_commit_mock.py
@@ -44,6 +44,8 @@
 
     def body(self):
         # The final newline is intentionally added to match the real behavior.
+        if not self.change_id():
+            return self._body + '\n'
         return self._body + '\n\nChange-Id: ' + self.change_id() + '\n'
 
     def message(self):
diff --git a/third_party/blink/tools/blinkpy/w3c/common.py b/third_party/blink/tools/blinkpy/w3c/common.py
index 47d8681..ccbdaeb6 100644
--- a/third_party/blink/tools/blinkpy/w3c/common.py
+++ b/third_party/blink/tools/blinkpy/w3c/common.py
@@ -15,7 +15,8 @@
 WPT_GH_URL = 'https://github.com/%s/%s/' % (WPT_GH_ORG, WPT_GH_REPO_NAME)
 WPT_MIRROR_URL = 'https://chromium.googlesource.com/external/github.com/web-platform-tests/wpt.git'
 WPT_GH_SSH_URL_TEMPLATE = 'https://{}@github.com/%s/%s.git' % (WPT_GH_ORG, WPT_GH_REPO_NAME)
-WPT_REVISION_FOOTER = 'WPT-Export-Revision:'
+WPT_REVISION_FOOTER = 'WPT-Export-Revision: '
+CHANGE_ID_FOOTER = 'Change-Id: '
 EXPORT_PR_LABEL = 'chromium-export'
 PROVISIONAL_PR_LABEL = 'do not merge yet'
 
diff --git a/third_party/blink/tools/blinkpy/w3c/export_notifier.py b/third_party/blink/tools/blinkpy/w3c/export_notifier.py
index 706fc9b0..846e5a2 100644
--- a/third_party/blink/tools/blinkpy/w3c/export_notifier.py
+++ b/third_party/blink/tools/blinkpy/w3c/export_notifier.py
@@ -65,8 +65,7 @@
                     'Can not retrieve Change-Id for %s.', pr.number)
                 continue
 
-            gerrit_sha = self.wpt_github.extract_metadata(
-                WPT_REVISION_FOOTER + ' ', pr.body)
+            gerrit_sha = self.wpt_github.extract_metadata(WPT_REVISION_FOOTER, pr.body)
             gerrit_dict[gerrit_id] = PRStatusInfo(
                 taskcluster_status['node_id'],
                 taskcluster_status['target_url'],
diff --git a/third_party/blink/tools/blinkpy/w3c/test_exporter.py b/third_party/blink/tools/blinkpy/w3c/test_exporter.py
index 10ac74a7..d7c4dc3b 100644
--- a/third_party/blink/tools/blinkpy/w3c/test_exporter.py
+++ b/third_party/blink/tools/blinkpy/w3c/test_exporter.py
@@ -11,11 +11,12 @@
 from blinkpy.w3c.local_wpt import LocalWPT
 from blinkpy.w3c.chromium_exportable_commits import exportable_commits_over_last_n_commits
 from blinkpy.w3c.common import (
+    CHANGE_ID_FOOTER,
     WPT_GH_URL,
     WPT_REVISION_FOOTER,
     EXPORT_PR_LABEL,
     PROVISIONAL_PR_LABEL,
-    read_credentials
+    read_credentials,
 )
 from blinkpy.w3c.gerrit import GerritAPI, GerritCL, GerritError
 from blinkpy.w3c.wpt_github import WPTGitHub, MergeError
@@ -135,7 +136,7 @@
             pr_url = '{}pull/{}'.format(WPT_GH_URL, pull_request.number)
             _log.info('In-flight PR found: %s', pr_url)
 
-            pr_cl_revision = self.wpt_github.extract_metadata(WPT_REVISION_FOOTER + ' ', pull_request.body)
+            pr_cl_revision = self.wpt_github.extract_metadata(WPT_REVISION_FOOTER, pull_request.body)
             if cl.current_revision_sha == pr_cl_revision:
                 _log.info('PR revision matches CL revision. Nothing to do here.')
                 return
@@ -214,7 +215,7 @@
 
         try:
             self.wpt_github.merge_pr(pull_request.number)
-            change_id = self.wpt_github.extract_metadata('Change-Id: ', pull_request.body)
+            change_id = self.wpt_github.extract_metadata(CHANGE_ID_FOOTER, pull_request.body)
             if change_id:
                 cl = GerritCL(data={'change_id': change_id}, api=self.gerrit)
                 pr_url = '{}pull/{}'.format(WPT_GH_URL, pull_request.number)
@@ -261,11 +262,18 @@
             _log.debug('END_OF_PATCH_EXCERPT')
             return
 
+        footer = ''
+        # Change-Id can be deleted from the body of an in-flight CL in Chromium
+        # (https://crbug.com/gerrit/12244). We need to add it back. And we've
+        # asserted that cl.change_id is present in GerritCL.
+        if not self.wpt_github.extract_metadata(CHANGE_ID_FOOTER, commit.message()):
+            _log.warn('Adding missing Change-Id back to %s', cl.url)
+            footer += '{}{}\n'.format(CHANGE_ID_FOOTER, cl.change_id)
         # Reviewed-on footer is not in the git commit message of in-flight CLs,
         # but a link to code review is useful so we add it manually.
-        footer = 'Reviewed-on: {}\n'.format(cl.url)
+        footer += 'Reviewed-on: {}\n'.format(cl.url)
         # WPT_REVISION_FOOTER is used by the exporter to check the CL revision.
-        footer += '{} {}'.format(WPT_REVISION_FOOTER, cl.current_revision_sha)
+        footer += '{}{}'.format(WPT_REVISION_FOOTER, cl.current_revision_sha)
 
         if pull_request:
             pr_number = self.create_or_update_pr_from_commit(
diff --git a/third_party/blink/tools/blinkpy/w3c/test_exporter_unittest.py b/third_party/blink/tools/blinkpy/w3c/test_exporter_unittest.py
index 06f0e9f5..21981e5 100644
--- a/third_party/blink/tools/blinkpy/w3c/test_exporter_unittest.py
+++ b/third_party/blink/tools/blinkpy/w3c/test_exporter_unittest.py
@@ -197,22 +197,44 @@
         test_exporter.wpt_github = MockWPTGitHub(pull_requests=[])
         test_exporter.get_exportable_commits = lambda: ([], [])
         test_exporter.gerrit = MockGerritAPI()
-        test_exporter.gerrit.exportable_open_cls = [MockGerritCL(
-            data={
-                'change_id': 'I001',
-                'subject': 'subject',
-                '_number': 1234,
-                'current_revision': '1',
-                'has_review_started': True,
-                'revisions': {
-                    '1': {'commit_with_footers': 'a commit with footers'}
+        test_exporter.gerrit.exportable_open_cls = [
+            MockGerritCL(
+                data={
+                    'change_id': 'I001',
+                    'subject': 'subject',
+                    '_number': 1234,
+                    'current_revision': '1',
+                    'has_review_started': True,
+                    'revisions': {
+                        '1': {
+                            'commit_with_footers': 'a commit with footers'
+                        }
+                    },
+                    'owner': {
+                        'email': 'test@chromium.org'
+                    },
                 },
-                'owner': {'email': 'test@chromium.org'},
-            },
-            api=test_exporter.gerrit,
-            chromium_commit=MockChromiumCommit(self.host, subject='subject',
-                                               body='fake body <faketag1>, <faketag2>', change_id='I001')
-        )]
+                api=test_exporter.gerrit,
+                chromium_commit=MockChromiumCommit(self.host, subject='subject', body='fake body <html>', change_id='I001')),
+            MockGerritCL(
+                data={
+                    'change_id': 'I002',
+                    'subject': 'subject',
+                    '_number': 1235,
+                    'current_revision': '1',
+                    'has_review_started': True,
+                    'revisions': {
+                        '1': {
+                            'commit_with_footers': 'a commit with footers'
+                        }
+                    },
+                    'owner': {
+                        'email': 'test@chromium.org'
+                    },
+                },
+                api=test_exporter.gerrit,
+                chromium_commit=MockChromiumCommit(self.host, subject='subject', body='body', change_id=None)),
+        ]
         test_exporter.main(['--credentials-json', '/tmp/credentials.json'])
 
         self.assertEqual(test_exporter.wpt_github.calls, [
@@ -220,12 +242,18 @@
             'create_pr',
             'add_label "chromium-export"',
             'add_label "do not merge yet"',
+            'pr_with_change_id',
+            'create_pr',
+            'add_label "chromium-export"',
+            'add_label "do not merge yet"',
         ])
         self.assertEqual(test_exporter.wpt_github.pull_requests_created, [
-            ('chromium-export-cl-1234',
-             'subject',
-             'fake body \\<faketag1>, \\<faketag2>\n\nChange-Id: I001\nReviewed-on: '
-             'https://chromium-review.googlesource.com/1234\nWPT-Export-Revision: 1'),
+            ('chromium-export-cl-1234', 'subject', 'fake body \\<html>\n\nChange-Id: I001\nReviewed-on: '
+             'https://chromium-review.googlesource.com/1234\n'
+             'WPT-Export-Revision: 1'),
+            ('chromium-export-cl-1235', 'subject', 'body\nChange-Id: I002\nReviewed-on: '
+             'https://chromium-review.googlesource.com/1235\n'
+             'WPT-Export-Revision: 1'),
         ])
         self.assertEqual(test_exporter.wpt_github.pull_requests_merged, [])
 
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer b/third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer
index a840c30..4ebe511 100644
--- a/third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer
+++ b/third_party/blink/web_tests/FlagExpectations/enable-features=UseSkiaRenderer
@@ -15,3 +15,9 @@
 crbug.com/1052768 [ Linux ] css3/filters/effect-reference-colorspace.html [ Failure Pass ]
 crbug.com/1052768 [ Win ] css3/filters/effect-reference-subregion.html [ Failure Pass ]
 crbug.com/1052768 [ Linux ] css3/filters/effect-reference-subregion.html [ Failure Pass ]
+
+# Flaky on Windows.
+crbug.com/1026375 [ Win ] media/controls/video-enter-exit-fullscreen-while-hovering-shows-controls.html [ Failure Pass ]
+crbug.com/1026375 [ Win ] media/encrypted-media/encrypted-media-playback-setmediakeys-before-src.html [ Failure Pass ]
+crbug.com/1026375 [ Win ] media/video-currentTime-delay.html [ Failure Pass ]
+crbug.com/1026375 [ Win ] media/video-pause-immediately.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index bf44a460..c9e3e1fc 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -7,6 +7,9 @@
 # Further documentation:
 # https://chromium.googlesource.com/chromium/src/+/master/docs/testing/web_test_expectations.md
 
+# Temporarily disabled for 1043030
+crbug.com/1043030 http/tests/devtools/sources/source-frame-toolbar-items.js [ Pass Failure ]
+
 # Intentional failures to test the layout test system.
 harness-tests/crash.html [ Crash ]
 harness-tests/timeout.html [ Timeout ]
@@ -7121,6 +7124,7 @@
 crbug.com/1029489 http/tests/devtools/elements/elements-linkify-attributes.js [ Pass Failure Timeout ]
 crbug.com/1029521 virtual/threaded/external/wpt/web-animations/timing-model/animations/updating-the-finished-state.html [ Pass Failure Timeout ]
 crbug.com/1030258 http/tests/devtools/network/network-cookies-pane.js [ Pass Failure ]
+crbug.com/1035309 http/tests/devtools/throttling/mobile-throttling.js [ Pass Failure ]
 
 # Enable scroll-snap tests on impl thread
 # These are currently failing on Mac which needs more investigation, snap-scrolls-visual-viewport seems flaky
@@ -7585,3 +7589,9 @@
 crbug.com/1054916 [ Linux ] external/wpt/webxr/dom-overlay/ar_dom_overlay.https.html [ Pass Failure Timeout ]
 crbug.com/1055006 [ Linux ] external/wpt/std-toast/methods.html [ Pass Failure Timeout ]
 crbug.com/1055006 [ Linux ] external/wpt/std-toast/options.html [ Pass Failure Timeout ]
+
+# These tests test invalid behavior, a fix in V8 is in flight.
+crbug.com/v8/10126 external/wpt/wasm/webapi/invalid-code.any.html [ Skip ]
+crbug.com/v8/10126 external/wpt/wasm/webapi/invalid-code.any.serviceworker.html [ Skip ]
+crbug.com/v8/10126 external/wpt/wasm/webapi/invalid-code.any.sharedworker.html [ Skip ]
+crbug.com/v8/10126 external/wpt/wasm/webapi/invalid-code.any.worker.html [ Skip ]
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/padding-overflow-crash.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/padding-overflow-crash.html
new file mode 100644
index 0000000..fd0c333
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/padding-overflow-crash.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#layout-algorithm">
+<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
+<meta name="assert" content="Item's size includes padding even when there is overflow:hidden. Chrome crashed on this.">
+<p>Test passes if there is a filled green square only.</p>
+
+<div style="display: flex">
+  <div style="padding: 50px; background: green; overflow: hidden;"></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/require-corp-load-from-cache-storage.https-expected.txt b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/require-corp-load-from-cache-storage.https-expected.txt
deleted file mode 100644
index 1e0c440..0000000
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/require-corp-load-from-cache-storage.https-expected.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-This is a testharness.js-based test.
-PASS setting up
-PASS Fetch cross-origin cors   from service-worker and CacheStorage.
-PASS Fetch cross-origin no-cors   from service-worker and CacheStorage.
-PASS Fetch same-origin cors   from service-worker and CacheStorage.
-PASS Fetch same-origin no-cors   from service-worker and CacheStorage.
-PASS Fetch same-origin cors cors-disabled corp-cross-origin from network and CacheStorage.
-PASS Fetch same-origin cors cors-disabled corp-same-origin from network and CacheStorage.
-PASS Fetch same-origin cors cors-disabled corp-undefined from network and CacheStorage.
-PASS Fetch same-origin cors cors-enabled corp-cross-origin from network and CacheStorage.
-PASS Fetch same-origin cors cors-enabled corp-same-origin from network and CacheStorage.
-PASS Fetch same-origin cors cors-enabled corp-undefined from network and CacheStorage.
-PASS Fetch same-origin no-cors cors-disabled corp-cross-origin from network and CacheStorage.
-PASS Fetch same-origin no-cors cors-disabled corp-same-origin from network and CacheStorage.
-PASS Fetch same-origin no-cors cors-disabled corp-undefined from network and CacheStorage.
-PASS Fetch same-origin no-cors cors-enabled corp-cross-origin from network and CacheStorage.
-PASS Fetch same-origin no-cors cors-enabled corp-same-origin from network and CacheStorage.
-PASS Fetch same-origin no-cors cors-enabled corp-undefined from network and CacheStorage.
-PASS Fetch cross-origin cors cors-disabled corp-cross-origin from network and CacheStorage.
-PASS Fetch cross-origin cors cors-disabled corp-same-origin from network and CacheStorage.
-PASS Fetch cross-origin cors cors-disabled corp-undefined from network and CacheStorage.
-PASS Fetch cross-origin cors cors-enabled corp-cross-origin from network and CacheStorage.
-PASS Fetch cross-origin cors cors-enabled corp-same-origin from network and CacheStorage.
-PASS Fetch cross-origin cors cors-enabled corp-undefined from network and CacheStorage.
-PASS Fetch cross-origin no-cors cors-disabled corp-cross-origin from network and CacheStorage.
-PASS Fetch cross-origin no-cors cors-disabled corp-same-origin from network and CacheStorage.
-FAIL Fetch cross-origin no-cors cors-disabled corp-undefined from network and CacheStorage. promise_rejects_js: function "function() { throw e }" threw object "InvalidAccessError: Failed Cross-Origin-Resource-Policy check." ("InvalidAccessError") expected instance of function "function TypeError() { [native code] }" ("TypeError")
-PASS Fetch cross-origin no-cors cors-enabled corp-cross-origin from network and CacheStorage.
-PASS Fetch cross-origin no-cors cors-enabled corp-same-origin from network and CacheStorage.
-FAIL Fetch cross-origin no-cors cors-enabled corp-undefined from network and CacheStorage. promise_rejects_js: function "function() { throw e }" threw object "InvalidAccessError: Failed Cross-Origin-Resource-Policy check." ("InvalidAccessError") expected instance of function "function TypeError() { [native code] }" ("TypeError")
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/performance-timeline/po-disconnect-removes-observed-types.any.js b/third_party/blink/web_tests/external/wpt/performance-timeline/po-disconnect-removes-observed-types.any.js
new file mode 100644
index 0000000..cac97be
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/performance-timeline/po-disconnect-removes-observed-types.any.js
@@ -0,0 +1,19 @@
+// META: script=performanceobservers.js
+
+async_test(function (t) {
+  const observer  = new PerformanceObserver(
+      t.step_func(function (entryList) {
+        // There should be no mark entry.
+        checkEntries(entryList.getEntries(),
+          [{ entryType: "measure", name: "b"}]);
+        t.done();
+      })
+    );
+  observer.observe({type: "mark"});
+  // Disconnect the observer.
+  observer.disconnect();
+  // Now, only observe measure.
+  observer.observe({type: "measure"});
+  performance.mark("a");
+  performance.measure("b");
+}, "Types observed are forgotten when disconnect() is called.");
diff --git a/third_party/blink/web_tests/external/wpt/performance-timeline/po-observe-repeated-type.any.js b/third_party/blink/web_tests/external/wpt/performance-timeline/po-observe-repeated-type.any.js
new file mode 100644
index 0000000..2bba396a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/performance-timeline/po-observe-repeated-type.any.js
@@ -0,0 +1,17 @@
+// META: script=performanceobservers.js
+
+async_test(function (t) {
+  const observer  = new PerformanceObserver(
+      t.step_func(function (entryList) {
+        checkEntries(entryList.getEntries(),
+          [{ entryType: "mark", name: "early"}]);
+        observer.disconnect();
+        t.done();
+      })
+    );
+  performance.mark("early");
+  // This call will not trigger anything.
+  observer.observe({type: "mark"});
+  // This call should override the previous call and detect the early mark.
+  observer.observe({type: "mark", buffered: true});
+}, "Two calls of observe() with the same 'type' cause override.");
diff --git a/third_party/blink/web_tests/external/wpt/resize-observer/observe-expected.txt b/third_party/blink/web_tests/external/wpt/resize-observer/observe-expected.txt
deleted file mode 100644
index 8ca858b4..0000000
--- a/third_party/blink/web_tests/external/wpt/resize-observer/observe-expected.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-This is a testharness.js-based test.
-PASS ResizeObserver implemented
-PASS guard
-PASS test0: simple observation
-PASS test1: multiple observation on same element trigger only one
-PASS test2: throw exception when observing non-element
-PASS test3: disconnect stops all notifications
-PASS test4: unobserve target stops notifications, unobserve non-observed does nothing
-PASS test5: observe img
-PASS test6: iframe notifications
-PASS test7: callback.this
-PASS test8: simple content-box observation
-FAIL test9: simple content-box observation but keep border-box size unchanged assert_unreached: Timed out waiting for notification. (100ms) Reached unreachable code
-PASS test10: simple border-box observation
-PASS test11: simple observation with vertical writing mode
-FAIL test12: no observation is fired after the change of writing mode when box's specified size comes from logical size properties. assert_unreached: the logical size of content-box doesn't change Reached unreachable code
-FAIL test13: an observation is fired after the change of writing mode when box's specified size comes from physical size properties. assert_unreached: Timed out waiting for notification. (100ms) Reached unreachable code
-PASS test14: observe the same target but using a different box should override the previous one
-PASS test15: an observation is fired with box dimensions 0 when element's display property is set to inline
-PASS test16: observations do not fire for non-replaced inline elements
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/resize-observer/observe.html b/third_party/blink/web_tests/external/wpt/resize-observer/observe.html
index 3b33683..1ab5f78 100644
--- a/third_party/blink/web_tests/external/wpt/resize-observer/observe.html
+++ b/third_party/blink/web_tests/external/wpt/resize-observer/observe.html
@@ -713,6 +713,138 @@
   ]);
 
   return helper.start(() => t.remove());
+
+}
+
+
+function test17() {
+  // <div id="outer">
+  //   <div id="nested">
+  //   </div>
+  // </div>
+
+  let outer = document.createElement('div');
+  outer.style.width = "100px";
+  outer.style.height = "100px";
+  outer.style.padding = "10px";
+  outer.style.border = "1px solid blue"
+  let nested = document.createElement('div');
+  nested.style.width = "60px";
+  nested.style.height = "50px";
+  nested.style.padding = "5%";
+  nested.style.boxSizing = "border-box";
+  nested.style.border = "5px solid black";
+  outer.appendChild(nested);
+  document.body.appendChild(outer);
+
+  let helper = new ResizeTestHelper(
+    "test17: Box sizing snd Resize Observer notifications",
+  [
+    {
+      setup: observer => {
+        observer.observe(nested, { box: "content-box" });
+      },
+      notify: entries => {
+        assert_equals(entries.length, 1, "1 pending notification");
+        assert_equals(entries[0].target, nested, "target is nested");
+        assert_equals(entries[0].contentRect.width, 40, "target width");
+        assert_equals(entries[0].contentRect.height, 30, "target height");
+        assert_equals(entries[0].contentRect.top, 5, "target top padding");
+        assert_equals(entries[0].contentRect.left, 5, "target left padding");
+        assert_equals(entries[0].contentBoxSize.inlineSize, 40,
+                      "target content-box inline size");
+        assert_equals(entries[0].contentBoxSize.blockSize, 30,
+                      "target content-box block size");
+        assert_equals(entries[0].borderBoxSize.inlineSize, 60,
+                      "target border-box inline size");
+        assert_equals(entries[0].borderBoxSize.blockSize, 50,
+                      "target border-box block size");
+      }
+    },
+    {
+      // Changes to a parent's dimensions with a child's padding set as a percentage
+      // should fire observation if content-box is being observed
+      setup: observer => {
+        outer.style.height = "200px";
+        outer.style.width = "200px";
+      },
+      notify: entries => {
+        assert_equals(entries.length, 1, "1 pending notification");
+        assert_equals(entries[0].target, nested, "target is nested");
+        assert_equals(entries[0].contentRect.width, 30, "target width");
+        assert_equals(entries[0].contentRect.height, 20, "target height");
+        assert_equals(entries[0].contentRect.top, 10, "target top padding");
+        assert_equals(entries[0].contentRect.left, 10, "target left padding");
+        assert_equals(entries[0].contentBoxSize.inlineSize, 30,
+                      "target content-box inline size");
+        assert_equals(entries[0].contentBoxSize.blockSize, 20,
+                      "target content-box block size");
+        assert_equals(entries[0].borderBoxSize.inlineSize, 60,
+                      "target border-box inline size");
+        assert_equals(entries[0].borderBoxSize.blockSize, 50,
+                      "target border-box block size");
+      }
+    },
+    {
+      // Changes to a parent's dimensions with a child's padding set as a percentage
+      // should fire observation if content-box is being observed
+      setup: observer => {
+        nested.style.border = "1px solid black";
+      },
+      notify: entries => {
+        assert_equals(entries.length, 1, "1 pending notification");
+        assert_equals(entries[0].target, nested, "target is nested");
+        assert_equals(entries[0].contentRect.width, 38, "target width");
+        assert_equals(entries[0].contentRect.height, 28, "target height");
+        assert_equals(entries[0].contentRect.top, 10, "target top padding");
+        assert_equals(entries[0].contentRect.left, 10, "target left padding");
+        assert_equals(entries[0].contentBoxSize.inlineSize, 38,
+                      "target content-box inline size");
+        assert_equals(entries[0].contentBoxSize.blockSize, 28,
+                      "target content-box block size");
+        assert_equals(entries[0].borderBoxSize.inlineSize, 60,
+                      "target border-box inline size");
+        assert_equals(entries[0].borderBoxSize.blockSize, 50,
+                      "target border-box block size");
+      }
+    },
+    {
+      setup: observer => {
+        observer.observe(nested, { box: "border-box" });
+      },
+      notify: entries => {
+        assert_equals(entries.length, 1, "1 pending notification");
+        assert_equals(entries[0].target, nested, "target is nested");
+        assert_equals(entries[0].contentRect.width, 38, "target width");
+        assert_equals(entries[0].contentRect.height, 28, "target height");
+        assert_equals(entries[0].contentRect.top, 10, "target top padding");
+        assert_equals(entries[0].contentRect.left, 10, "target left padding");
+        assert_equals(entries[0].contentBoxSize.inlineSize, 38,
+                      "target content-box inline size");
+        assert_equals(entries[0].contentBoxSize.blockSize, 28,
+                      "target content-box block size");
+        assert_equals(entries[0].borderBoxSize.inlineSize, 60,
+                      "target border-box inline size");
+        assert_equals(entries[0].borderBoxSize.blockSize, 50,
+                      "target border-box block size");
+      }
+    },
+    {
+      // Changes to a parent's dimensions with a child's padding set as a percentage
+      // should not fire observation if border-box is being observed
+      setup: observer => {
+        outer.style.height = "100px";
+      },
+      notify: entries => {
+        assert_unreached("No observation should be fired when nested border box remains constant");
+      },
+      timeout: () => {
+        // expected
+      }
+    },
+
+  ]);
+  return helper.start(() => nested.remove());
 }
 
 let guard;
@@ -738,6 +870,7 @@
   .then(() => test14())
   .then(() => test15())
   .then(() => test16())
+  .then(() => test17())
   .then(() => guard.done());
 
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/svg/pservers/reftests/gradient-inheritance-not-in-rendertree-01.tentative.svg b/third_party/blink/web_tests/external/wpt/svg/pservers/reftests/gradient-inheritance-not-in-rendertree-01.tentative.svg
new file mode 100644
index 0000000..8f80b2d9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/pservers/reftests/gradient-inheritance-not-in-rendertree-01.tentative.svg
@@ -0,0 +1,15 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:h="http:/www.w3.org/1999/xhtml">
+  <title>&#x3c;linearGradient&#x3e; (without content) inheriting from a &#x3c;linearGradient&#x3e; in an invalid context</title>
+  <h:link rel="help" href="https://svgwg.org/svg2-draft/pservers.html#StopNotes"/>
+  <h:link rel="match" href="reference/green-100x100.svg"/>
+  <linearGradient id="linearGradient1" xlink:href="#linearGradient0"/>
+  <rect width="100" height="100" fill="green"/>
+  <rect width="100" height="100" fill="url(#linearGradient1) yellow"/>
+  <text>
+    <linearGradient id="linearGradient0">
+      <stop stop-color="orange"/>
+    </linearGradient>
+  </text>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/pservers/reftests/gradient-inheritance-not-in-rendertree-02.tentative.svg b/third_party/blink/web_tests/external/wpt/svg/pservers/reftests/gradient-inheritance-not-in-rendertree-02.tentative.svg
new file mode 100644
index 0000000..5b230f1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/pservers/reftests/gradient-inheritance-not-in-rendertree-02.tentative.svg
@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:h="http:/www.w3.org/1999/xhtml">
+  <title>&#x3c;linearGradient&#x3e; (with content) inheriting from a &#x3c;linearGradient&#x3e; in an invalid context</title>
+  <h:link rel="help" href="https://svgwg.org/svg2-draft/pservers.html#StopNotes"/>
+  <h:link rel="match" href="reference/green-100x100.svg"/>
+  <linearGradient id="linearGradient1" xlink:href="#linearGradient0">
+    <stop stop-color="green"/>
+  </linearGradient>
+  <rect width="100" height="100" fill="url(#linearGradient1) yellow"/>
+  <text>
+    <linearGradient id="linearGradient0">
+      <stop stop-color="orange"/>
+    </linearGradient>
+  </text>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/pservers/reftests/pattern-inheritance-not-in-rendertree-01.tentative.svg b/third_party/blink/web_tests/external/wpt/svg/pservers/reftests/pattern-inheritance-not-in-rendertree-01.tentative.svg
new file mode 100644
index 0000000..1a6d0a0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/pservers/reftests/pattern-inheritance-not-in-rendertree-01.tentative.svg
@@ -0,0 +1,13 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:h="http:/www.w3.org/1999/xhtml">
+  <title>&#x3c;pattern&#x3e; (without content) inheriting from a &#x3c;pattern&#x3e; in an invalid context</title>
+  <h:link rel="match" href="reference/green-100x100.svg"/>
+  <pattern id="pattern1" xlink:href="#pattern0" width="1" height="1"/>
+  <rect width="100" height="100" fill="url(#pattern1) green"/>
+  <text>
+    <pattern id="pattern0">
+      <rect width="100" height="100" fill="orange"/>
+    </pattern>
+  </text>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/pservers/reftests/pattern-inheritance-not-in-rendertree-02.tentative.svg b/third_party/blink/web_tests/external/wpt/svg/pservers/reftests/pattern-inheritance-not-in-rendertree-02.tentative.svg
new file mode 100644
index 0000000..961d069e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/pservers/reftests/pattern-inheritance-not-in-rendertree-02.tentative.svg
@@ -0,0 +1,15 @@
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:h="http:/www.w3.org/1999/xhtml">
+  <title>&#x3c;pattern&#x3e; (with content) inheriting from a &#x3c;pattern&#x3e; in an invalid context</title>
+  <h:link rel="match" href="reference/green-100x100.svg"/>
+  <pattern id="pattern1" xlink:href="#pattern0" width="1" height="1">
+    <rect width="100" height="100" fill="green"/>
+  </pattern>
+  <rect width="100" height="100" fill="url(#pattern1) yellow"/>
+  <text>
+    <pattern id="pattern0">
+      <rect width="100" height="100" fill="orange"/>
+    </pattern>
+  </text>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any-expected.txt b/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any-expected.txt
deleted file mode 100644
index 90be592..0000000
--- a/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-FAIL Invalid code: compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Invalid code: instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any.js b/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any.js
index 2b901ae..7525193 100644
--- a/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any.js
+++ b/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any.js
@@ -8,7 +8,7 @@
 
 for (const method of ["compileStreaming", "instantiateStreaming"]) {
   promise_test(t => {
-    const buffer = new Uint8Array(Array.from(emptyModuleBinary).concat([0, 0]));
+    const buffer = new Uint8Array(Array.from(emptyModuleBinary).concat([0xCA, 0xFE]));
     const response = new Response(buffer, { headers: { "Content-Type": "application/wasm" } });
     return promise_rejects_js(t, WebAssembly.CompileError, WebAssembly[method](response));
   }, `Invalid code: ${method}`);
diff --git a/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any.serviceworker-expected.txt
deleted file mode 100644
index 90be592..0000000
--- a/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any.serviceworker-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-FAIL Invalid code: compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Invalid code: instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any.sharedworker-expected.txt
deleted file mode 100644
index 90be592..0000000
--- a/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any.sharedworker-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-FAIL Invalid code: compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Invalid code: instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any.worker-expected.txt
deleted file mode 100644
index 90be592..0000000
--- a/third_party/blink/web_tests/external/wpt/wasm/webapi/invalid-code.any.worker-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-FAIL Invalid code: compileStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-FAIL Invalid code: instantiateStreaming assert_unreached: Should have rejected: undefined Reached unreachable code
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/resize-observer/observe-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/resize-observer/observe-expected.txt
deleted file mode 100644
index bff8f07f..0000000
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/external/wpt/resize-observer/observe-expected.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-This is a testharness.js-based test.
-PASS ResizeObserver implemented
-PASS guard
-PASS test0: simple observation
-PASS test1: multiple observation on same element trigger only one
-PASS test2: throw exception when observing non-element
-PASS test3: disconnect stops all notifications
-PASS test4: unobserve target stops notifications, unobserve non-observed does nothing
-PASS test5: observe img
-PASS test6: iframe notifications
-PASS test7: callback.this
-PASS test8: simple content-box observation
-PASS test9: simple content-box observation but keep border-box size unchanged
-PASS test10: simple border-box observation
-PASS test11: simple observation with vertical writing mode
-FAIL test12: no observation is fired after the change of writing mode when box's specified size comes from logical size properties. assert_unreached: the logical size of content-box doesn't change Reached unreachable code
-FAIL test13: an observation is fired after the change of writing mode when box's specified size comes from physical size properties. assert_unreached: Timed out waiting for notification. (100ms) Reached unreachable code
-PASS test14: observe the same target but using a different box should override the previous one
-PASS test15: an observation is fired with box dimensions 0 when element's display property is set to inline
-PASS test16: observations do not fire for non-replaced inline elements
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-copy-treeoutline.js b/third_party/blink/web_tests/http/tests/devtools/console/console-copy-treeoutline.js
index 5e6fd10..9d0d656a 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-copy-treeoutline.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-copy-treeoutline.js
@@ -20,11 +20,13 @@
   var consoleView = Console.ConsoleView.instance();
   var viewport = consoleView._viewport;
 
-  TestRunner.runTestSuite([function testSelectAll(next) {
+  TestRunner.runTestSuite([async function testSelectAll(next) {
     viewport.forceScrollItemToBeFirst(0);
 
     // Set some initial selection in console.
     var base = consoleView.itemElement(0).element();
+    // Console messages contain live locations.
+    await TestRunner.waitForPendingLiveLocationUpdates();
     window.getSelection().setBaseAndExtent(base, 0, base, 1);
 
     // Try to select all messages.
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-copy-truncated-text.js b/third_party/blink/web_tests/http/tests/devtools/console/console-copy-truncated-text.js
index db82597..7c70e21 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-copy-truncated-text.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-copy-truncated-text.js
@@ -34,67 +34,67 @@
   var secondLongUrlIndexInMixedUrl;
 
   var tests = [
-    function testSelectWithinTruncatedUrl(next) {
-      makeSelectionAndDump(1, 0, 1, halfMaxLength);
-      makeSelectionAndDump(1, 0, 1, halfMaxLength + 1);
-      makeSelectionAndDump(1, 0, 1, maxLength);
-      makeSelectionAndDump(1, halfMaxLength, 1, halfMaxLength + 1);
-      makeSelectionAndDump(1, halfMaxLength, 1, maxLength);
-      makeSelectionAndDump(1, halfMaxLength + 1, 1, maxLength);
+    async function testSelectWithinTruncatedUrl(next) {
+      await makeSelectionAndDump(1, 0, 1, halfMaxLength);
+      await makeSelectionAndDump(1, 0, 1, halfMaxLength + 1);
+      await makeSelectionAndDump(1, 0, 1, maxLength);
+      await makeSelectionAndDump(1, halfMaxLength, 1, halfMaxLength + 1);
+      await makeSelectionAndDump(1, halfMaxLength, 1, maxLength);
+      await makeSelectionAndDump(1, halfMaxLength + 1, 1, maxLength);
       next();
     },
 
-    function testSelectAcrossMultipleMessages(next) {
-      makeSelectionAndDump(1, 0, 2, shortUrl.length);
-      makeSelectionAndDump(1, halfMaxLength, 2, shortUrl.length);
-      makeSelectionAndDump(1, halfMaxLength + 1, 2, shortUrl.length);
+    async function testSelectAcrossMultipleMessages(next) {
+      await makeSelectionAndDump(1, 0, 2, shortUrl.length);
+      await makeSelectionAndDump(1, halfMaxLength, 2, shortUrl.length);
+      await makeSelectionAndDump(1, halfMaxLength + 1, 2, shortUrl.length);
       next();
     },
 
-    function testSelectAcrossMultipleMessagesWithTruncatedUrls(next) {
-      makeSelectionAndDump(1, 0, 3, halfMaxLength);
-      makeSelectionAndDump(1, 0, 3, halfMaxLength + 1);
-      makeSelectionAndDump(1, 0, 3, maxLength);
+    async function testSelectAcrossMultipleMessagesWithTruncatedUrls(next) {
+      await makeSelectionAndDump(1, 0, 3, halfMaxLength);
+      await makeSelectionAndDump(1, 0, 3, halfMaxLength + 1);
+      await makeSelectionAndDump(1, 0, 3, maxLength);
       next();
     },
 
-    function testSelectWithinMessageWithMultipleTruncatedUrls(next) {
-      makeSelectionAndDump(4, 0, 4, halfMaxLength);
-      makeSelectionAndDump(4, 0, 4, halfMaxLength + 1);
-      makeSelectionAndDump(4, 0, 4, secondLongUrlIndexInMixedUrl);
-      makeSelectionAndDump(4, 0, 4, secondLongUrlIndexInMixedUrl + halfMaxLength);
-      makeSelectionAndDump(4, 0, 4, secondLongUrlIndexInMixedUrl + halfMaxLength + 1);
-      makeSelectionAndDump(4, 0, 4, secondLongUrlIndexInMixedUrl + maxLength);
+    async function testSelectWithinMessageWithMultipleTruncatedUrls(next) {
+      await makeSelectionAndDump(4, 0, 4, halfMaxLength);
+      await makeSelectionAndDump(4, 0, 4, halfMaxLength + 1);
+      await makeSelectionAndDump(4, 0, 4, secondLongUrlIndexInMixedUrl);
+      await makeSelectionAndDump(4, 0, 4, secondLongUrlIndexInMixedUrl + halfMaxLength);
+      await makeSelectionAndDump(4, 0, 4, secondLongUrlIndexInMixedUrl + halfMaxLength + 1);
+      await makeSelectionAndDump(4, 0, 4, secondLongUrlIndexInMixedUrl + maxLength);
 
-      makeSelectionAndDump(4, halfMaxLength, 4, halfMaxLength + 1);
-      makeSelectionAndDump(4, halfMaxLength, 4, secondLongUrlIndexInMixedUrl);
-      makeSelectionAndDump(4, halfMaxLength, 4, secondLongUrlIndexInMixedUrl + halfMaxLength);
-      makeSelectionAndDump(4, halfMaxLength, 4, secondLongUrlIndexInMixedUrl + halfMaxLength + 1);
-      makeSelectionAndDump(4, halfMaxLength, 4, secondLongUrlIndexInMixedUrl + maxLength);
+      await makeSelectionAndDump(4, halfMaxLength, 4, halfMaxLength + 1);
+      await makeSelectionAndDump(4, halfMaxLength, 4, secondLongUrlIndexInMixedUrl);
+      await makeSelectionAndDump(4, halfMaxLength, 4, secondLongUrlIndexInMixedUrl + halfMaxLength);
+      await makeSelectionAndDump(4, halfMaxLength, 4, secondLongUrlIndexInMixedUrl + halfMaxLength + 1);
+      await makeSelectionAndDump(4, halfMaxLength, 4, secondLongUrlIndexInMixedUrl + maxLength);
 
-      makeSelectionAndDump(4, halfMaxLength + 1, 4, secondLongUrlIndexInMixedUrl);
-      makeSelectionAndDump(4, halfMaxLength + 1, 4, secondLongUrlIndexInMixedUrl + halfMaxLength);
-      makeSelectionAndDump(4, halfMaxLength + 1, 4, secondLongUrlIndexInMixedUrl + halfMaxLength + 1);
-      makeSelectionAndDump(4, halfMaxLength + 1, 4, secondLongUrlIndexInMixedUrl + maxLength);
+      await makeSelectionAndDump(4, halfMaxLength + 1, 4, secondLongUrlIndexInMixedUrl);
+      await makeSelectionAndDump(4, halfMaxLength + 1, 4, secondLongUrlIndexInMixedUrl + halfMaxLength);
+      await makeSelectionAndDump(4, halfMaxLength + 1, 4, secondLongUrlIndexInMixedUrl + halfMaxLength + 1);
+      await makeSelectionAndDump(4, halfMaxLength + 1, 4, secondLongUrlIndexInMixedUrl + maxLength);
 
-      makeSelectionAndDump(4, secondLongUrlIndexInMixedUrl, 4, secondLongUrlIndexInMixedUrl + halfMaxLength);
-      makeSelectionAndDump(4, secondLongUrlIndexInMixedUrl, 4, secondLongUrlIndexInMixedUrl + halfMaxLength + 1);
-      makeSelectionAndDump(4, secondLongUrlIndexInMixedUrl, 4, secondLongUrlIndexInMixedUrl + maxLength);
+      await makeSelectionAndDump(4, secondLongUrlIndexInMixedUrl, 4, secondLongUrlIndexInMixedUrl + halfMaxLength);
+      await makeSelectionAndDump(4, secondLongUrlIndexInMixedUrl, 4, secondLongUrlIndexInMixedUrl + halfMaxLength + 1);
+      await makeSelectionAndDump(4, secondLongUrlIndexInMixedUrl, 4, secondLongUrlIndexInMixedUrl + maxLength);
 
-      makeSelectionAndDump(
+      await makeSelectionAndDump(
         4,
         secondLongUrlIndexInMixedUrl + halfMaxLength,
         4,
         secondLongUrlIndexInMixedUrl + halfMaxLength + 1
       );
-      makeSelectionAndDump(
+      await makeSelectionAndDump(
         4,
         secondLongUrlIndexInMixedUrl + halfMaxLength,
         4,
         secondLongUrlIndexInMixedUrl + maxLength
       );
 
-      makeSelectionAndDump(
+      await makeSelectionAndDump(
         4,
         secondLongUrlIndexInMixedUrl + halfMaxLength + 1,
         4,
@@ -103,24 +103,24 @@
       next();
     },
 
-    function testSelectWithinShortUrlWithHashes(next) {
+    async function testSelectWithinShortUrlWithHashes(next) {
       var hashedUrlMaxLength = consoleMessageText(5).length;
       var hashedUrlHalfMaxLength = Math.ceil(hashedUrlMaxLength / 2);
-      makeSelectionAndDump(5, 0, 5, hashedUrlHalfMaxLength);
-      makeSelectionAndDump(5, 0, 5, hashedUrlMaxLength);
-      makeSelectionAndDump(5, hashedUrlHalfMaxLength, 5, hashedUrlMaxLength);
+      await makeSelectionAndDump(5, 0, 5, hashedUrlHalfMaxLength);
+      await makeSelectionAndDump(5, 0, 5, hashedUrlMaxLength);
+      await makeSelectionAndDump(5, hashedUrlHalfMaxLength, 5, hashedUrlMaxLength);
       next();
     },
 
-    function testSelectWithinUrlWithHashes(next) {
+    async function testSelectWithinUrlWithHashes(next) {
       var hashedUrlMaxLength = consoleMessageText(6).length;
       var hashedUrlHalfMaxLength = Math.ceil(hashedUrlMaxLength / 2);
-      makeSelectionAndDump(6, 0, 6, hashedUrlHalfMaxLength);
-      makeSelectionAndDump(6, 0, 6, hashedUrlHalfMaxLength + 1);
-      makeSelectionAndDump(6, 0, 6, hashedUrlMaxLength);
-      makeSelectionAndDump(6, hashedUrlHalfMaxLength, 6, hashedUrlHalfMaxLength + 1);
-      makeSelectionAndDump(6, hashedUrlHalfMaxLength, 6, hashedUrlMaxLength);
-      makeSelectionAndDump(6, hashedUrlHalfMaxLength + 1, 6, hashedUrlMaxLength);
+      await makeSelectionAndDump(6, 0, 6, hashedUrlHalfMaxLength);
+      await makeSelectionAndDump(6, 0, 6, hashedUrlHalfMaxLength + 1);
+      await makeSelectionAndDump(6, 0, 6, hashedUrlMaxLength);
+      await makeSelectionAndDump(6, hashedUrlHalfMaxLength, 6, hashedUrlHalfMaxLength + 1);
+      await makeSelectionAndDump(6, hashedUrlHalfMaxLength, 6, hashedUrlMaxLength);
+      await makeSelectionAndDump(6, hashedUrlHalfMaxLength + 1, 6, hashedUrlMaxLength);
       next();
     },
 
@@ -137,12 +137,12 @@
     }
   ];
 
-  ConsoleTestRunner.waitForConsoleMessages(expectedMessageCount, () => {
+  ConsoleTestRunner.waitForConsoleMessages(expectedMessageCount, async () => {
     viewport.invalidate();
 
     // Get the max truncated length from the first longUrl logged.
     try {
-      var longUrlMessageText = consoleMessageText(1);
+      var longUrlMessageText = await consoleMessageText(1);
       maxLength = longUrlMessageText.length;
       halfMaxLength = Math.ceil(maxLength / 2);
       secondLongUrlIndexInMixedUrl = maxLength + 1 + shortUrl.length + 1;
@@ -161,17 +161,21 @@
     return messageElement.querySelector('.console-message-text').deepTextContent();
   }
 
-  function makeSelectionAndDump(fromMessage, fromTextOffset, toMessage, toTextOffset) {
+  async function makeSelectionAndDump(fromMessage, fromTextOffset, toMessage, toTextOffset) {
     TestRunner.addResult(
       '\nMaking selection: ' + fromMessage + ', ' + fromTextOffset + ', ' + toMessage + ', ' + toTextOffset
     );
 
     // Ignore the anchor text on the start/end message, just use their contents.
-    var fromAnchor = consoleView.itemElement(fromMessage).element().querySelector('.console-message-anchor');
-    var toAnchor = consoleView.itemElement(toMessage).element().querySelector('.console-message-anchor');
+    const fromElement = consoleView.itemElement(fromMessage).element();
+    const toElement = consoleView.itemElement(toMessage).element();
+    // Console message elements contain live locations.
+    await TestRunner.waitForPendingLiveLocationUpdates();
+    var fromAnchor = fromElement.querySelector('.console-message-anchor');
+    var toAnchor = toElement.querySelector('.console-message-anchor');
     fromTextOffset += fromAnchor ? fromAnchor.deepTextContent().length : 0;
     toTextOffset += toAnchor ? toAnchor.deepTextContent().length : 0;
-    ConsoleTestRunner.selectConsoleMessages(fromMessage, fromTextOffset, toMessage, toTextOffset);
+    await ConsoleTestRunner.selectConsoleMessages(fromMessage, fromTextOffset, toMessage, toTextOffset);
     var selectedText = viewport._selectedText();
     if (selectedText) {
       selectedText = selectedText.replace(/\bVM\d+/g, 'VM');
@@ -189,7 +193,7 @@
     consoleView._searchableView.showSearchField();
     TestRunner.addResult('Searching for text: ' + query);
 
-    function onSearch() {
+    async function onSearch() {
       var matches = consoleView.element
         .childTextNodes()
         .filter(node => node.parentElement.classList.contains('highlighted-search-result'))
@@ -197,12 +201,12 @@
       TestRunner.addResult('Highlighted ' + matches.length + ' matches');
 
       // Use TextNodes for containers to get inside the highlighted match element.
-      makeSelectionAndDump(7, 0, 7, halfMaxLength);
-      makeSelectionAndDump(7, 0, 7, halfMaxLength + 1);
-      makeSelectionAndDump(7, 0, 7, maxLength);
-      makeSelectionAndDump(7, halfMaxLength, 7, halfMaxLength + 1);
-      makeSelectionAndDump(7, halfMaxLength, 7, maxLength);
-      makeSelectionAndDump(7, halfMaxLength + 1, 7, maxLength);
+      await makeSelectionAndDump(7, 0, 7, halfMaxLength);
+      await makeSelectionAndDump(7, 0, 7, halfMaxLength + 1);
+      await makeSelectionAndDump(7, 0, 7, maxLength);
+      await makeSelectionAndDump(7, halfMaxLength, 7, halfMaxLength + 1);
+      await makeSelectionAndDump(7, halfMaxLength, 7, maxLength);
+      await makeSelectionAndDump(7, halfMaxLength + 1, 7, maxLength);
       next();
     }
   }
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-filter-level-test.js b/third_party/blink/web_tests/http/tests/devtools/console/console-filter-level-test.js
index f68c9989..47e8f72f 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-filter-level-test.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-filter-level-test.js
@@ -26,13 +26,18 @@
   if (consoleView._isSidebarOpen)
     consoleView._splitWidget._showHideSidebarButton.element.click();
 
-  function dumpVisibleMessages() {
+  async function dumpVisibleMessages() {
     var menuText = Console.ConsoleView.instance()._filter._levelMenuButton._text;
     TestRunner.addResult('Level menu: ' + menuText);
 
     var messages = Console.ConsoleView.instance()._visibleViewMessages;
-    for (var i = 0; i < messages.length; i++)
-      TestRunner.addResult('>' + messages[i].toMessageElement().deepTextContent());
+    for (var i = 0; i < messages.length; i++) {
+      // Ordering is important here, as accessing the element the first time around
+      // triggers live location creation and updates which we need to await properly.
+      const element = messages[i].toMessageElement();
+      await TestRunner.waitForPendingLiveLocationUpdates();
+      TestRunner.addResult('>' + element.deepTextContent());
+    }
   }
 
   var testSuite = [
@@ -46,59 +51,50 @@
 
     function beforeFilter(next) {
       TestRunner.addResult('beforeFilter');
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
 
     function allLevels(next) {
       Console.ConsoleViewFilter.levelFilterSetting().set(Console.ConsoleFilter.allLevelsFilterValue());
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
 
     function defaultLevels(next) {
       Console.ConsoleViewFilter.levelFilterSetting().set(Console.ConsoleFilter.defaultLevelsFilterValue());
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
 
     function verbose(next) {
       Console.ConsoleViewFilter.levelFilterSetting().set({ verbose: true });
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
 
     function info(next) {
       Console.ConsoleViewFilter.levelFilterSetting().set({ info: true });
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
 
     function warningsAndErrors(next) {
       Console.ConsoleViewFilter.levelFilterSetting().set({ warning: true, error: true });
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
 
     function abcMessagePlain(next) {
       Console.ConsoleViewFilter.levelFilterSetting().set({ verbose: true });
       Console.ConsoleView.instance()._filter._textFilterUI.setValue('abc');
       Console.ConsoleView.instance()._filter._onFilterChanged();
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
 
     function abcMessageRegex(next) {
       Console.ConsoleView.instance()._filter._textFilterUI.setValue('/ab[a-z]/');
       Console.ConsoleView.instance()._filter._onFilterChanged();
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
 
     function abcMessageRegexWarning(next) {
       Console.ConsoleViewFilter.levelFilterSetting().set({ warning: true });
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     }
   ];
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-filter-test.js b/third_party/blink/web_tests/http/tests/devtools/console/console-filter-test.js
index fcf903a..960072d 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-filter-test.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-filter-test.js
@@ -60,14 +60,19 @@
 
   var messages = Console.ConsoleView.instance()._visibleViewMessages;
 
-  function dumpVisibleMessages() {
+  async function dumpVisibleMessages() {
     var messages = Console.ConsoleView.instance()._visibleViewMessages;
     for (var i = 0; i < messages.length; ++i) {
       var viewMessage = messages[i];
       var delimeter = viewMessage.consoleMessage().isGroupStartMessage() ? '>' : '';
       var indent = '';
       for (var j = 0; j < viewMessage.nestingLevel(); ++j) indent += '  ';
-      TestRunner.addResult(indent + delimeter + viewMessage.toMessageElement().deepTextContent());
+
+      // Ordering is important here, as accessing the element the first time around
+      // triggers live location creation and updates which we need to await properly.
+      const element = viewMessage.toMessageElement();
+      await TestRunner.waitForPendingLiveLocationUpdates();
+      TestRunner.addResult(indent + delimeter + element.deepTextContent());
     }
   }
 
@@ -77,84 +82,70 @@
   TestRunner.runTestSuite([
     function beforeFilter(next) {
       TestRunner.addResult('beforeFilter');
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
     function allLevelsFilter(next) {
       Console.ConsoleViewFilter.levelFilterSetting().set(Console.ConsoleFilter.allLevelsFilterValue());
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
     function addURL1Filter(next) {
       TestRunner.addResult('Blocking messages from ' + url1);
       Console.ConsoleView.instance()._filter.addMessageURLFilter(url1);
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
     function addURL2Filter(next) {
       TestRunner.addResult('Blocking messages from ' + url2);
       Console.ConsoleView.instance()._filter.addMessageURLFilter(url2);
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
     function removeAllFilters(next) {
       Console.ConsoleView.instance()._filter._textFilterUI.setValue('');
       Console.ConsoleView.instance()._filter._onFilterChanged();
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
     function checkTextFilter(next) {
       Console.ConsoleView.instance()._filter._textFilterUI.setValue('outer');
       Console.ConsoleView.instance()._filter._onFilterChanged();
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
     function checkMultiTextFilter(next) {
       Console.ConsoleView.instance()._filter._textFilterUI.setValue("Group /[2-3]top/");
       Console.ConsoleView.instance()._filter._onFilterChanged();
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
     function checkTextUrlFilter(next) {
       Console.ConsoleView.instance()._filter._textFilterUI.setValue("url:log-source");
       Console.ConsoleView.instance()._filter._onFilterChanged();
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
     function checkNegativeTextUrlFilter(next) {
       Console.ConsoleView.instance()._filter._textFilterUI.setValue("-url:log-source");
       Console.ConsoleView.instance()._filter._onFilterChanged();
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
     function checkSourceFilter(next) {
       Console.ConsoleView.instance()._filter._textFilterUI.setValue("source:violation");
       Console.ConsoleView.instance()._filter._onFilterChanged();
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
     function checkContextTextFilter(next) {
       Console.ConsoleView.instance()._filter._textFilterUI.setValue("context:context");
       Console.ConsoleView.instance()._filter._onFilterChanged();
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
     function checkStartEndLineRegex(next) {
       Console.ConsoleView.instance()._filter._textFilterUI.setValue("/^Hello\\s\\d$/");
       Console.ConsoleView.instance()._filter._onFilterChanged();
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
     function checkStartEndLineRegexForAnchor(next) {
       Console.ConsoleView.instance()._filter._textFilterUI.setValue("/^log-source\\.js:\\d+$/");
       Console.ConsoleView.instance()._filter._onFilterChanged();
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     },
     function checkResetFilter(next) {
       Console.ConsoleView.instance()._filter.reset();
-      dumpVisibleMessages();
-      next();
+      dumpVisibleMessages().then(next);
     }
   ]);
 })();
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-linkify-message-location.js b/third_party/blink/web_tests/http/tests/devtools/console/console-linkify-message-location.js
index 86d794f..963f1678 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-linkify-message-location.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-linkify-message-location.js
@@ -24,37 +24,40 @@
 
   TestRunner.evaluateInPage('boo()', step1);
 
-  function step1() {
-    dumpConsoleMessageURLs();
+  async function step1() {
+    await dumpConsoleMessageURLs();
 
     TestRunner.addSniffer(Bindings.BlackboxManager.prototype, '_patternChangeFinishedForTests', step2);
     var frameworkRegexString = 'foo\\.js';
     Common.settingForTest('skipStackFramesPattern').set(frameworkRegexString);
   }
 
-  function step2() {
-    dumpConsoleMessageURLs();
+  async function step2() {
+    await dumpConsoleMessageURLs();
     TestRunner.addSniffer(Bindings.BlackboxManager.prototype, '_patternChangeFinishedForTests', step3);
     var frameworkRegexString = 'foo\\.js|boo\\.js';
     Common.settingForTest('skipStackFramesPattern').set(frameworkRegexString);
   }
 
-  function step3() {
-    dumpConsoleMessageURLs();
+  async function step3() {
+    await dumpConsoleMessageURLs();
     TestRunner.addSniffer(Bindings.BlackboxManager.prototype, '_patternChangeFinishedForTests', step4);
     var frameworkRegexString = '';
     Common.settingForTest('skipStackFramesPattern').set(frameworkRegexString);
   }
 
-  function step4() {
-    dumpConsoleMessageURLs();
+  async function step4() {
+    await dumpConsoleMessageURLs();
     TestRunner.completeTest();
   }
 
-  function dumpConsoleMessageURLs() {
+  async function dumpConsoleMessageURLs() {
     var messages = Console.ConsoleView.instance()._visibleViewMessages;
     for (var i = 0; i < messages.length; ++i) {
+      // Ordering is important here. Retrieveing the message element the first time triggers
+      // live location creation and updates, which we need to await for correct locations.
       var element = messages[i].toMessageElement();
+      await TestRunner.waitForPendingLiveLocationUpdates();
       var anchor = element.querySelector('.console-message-anchor');
       TestRunner.addResult(anchor.textContent.replace(/VM\d+/g, 'VM'));
     }
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-links-in-errors-with-trace.js b/third_party/blink/web_tests/http/tests/devtools/console/console-links-in-errors-with-trace.js
index 4819ed55..6093e76 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-links-in-errors-with-trace.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-links-in-errors-with-trace.js
@@ -12,8 +12,12 @@
   var messages = Console.ConsoleView.instance()._visibleViewMessages;
 
   TestRunner.runTestSuite([
-    function testClickRelativeLink(next) {
-      var clickTarget = messages[0].element().querySelectorAll('.console-message-text .devtools-link')[1];
+    async function testClickRelativeLink(next) {
+      // Ordering is important here, as accessing the element the first time around
+      // triggers live location creation and updates which we need to await properly.
+      const element = messages[0].element();
+      await TestRunner.waitForPendingLiveLocationUpdates();
+      const clickTarget = element.querySelectorAll('.console-message-text .devtools-link')[1];
       TestRunner.addResult('Clicking link ' + clickTarget.textContent);
       UI.inspectorView._tabbedPane.once(UI.TabbedPane.Events.TabSelected).then(() => {
         TestRunner.addResult('Panel ' + UI.inspectorView._tabbedPane._currentTab.id + ' was opened.');
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-preserve-scroll.js b/third_party/blink/web_tests/http/tests/devtools/console/console-preserve-scroll.js
index 851b0fd..7166805b 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-preserve-scroll.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-preserve-scroll.js
@@ -37,7 +37,11 @@
     },
 
     async function testClickLinkToRevealAnotherPanel(next) {
-      consoleView._visibleViewMessages[0]._element.querySelector('.devtools-link').click();
+      // Ordering is important here, as accessing the element the first time around
+      // triggers live location creation and updates which we need to await properly.
+      const element = consoleView._visibleViewMessages[0]._element;
+      await TestRunner.waitForPendingLiveLocationUpdates();
+      element.querySelector('.devtools-link').click();
       await UI.inspectorView._tabbedPane.once(UI.TabbedPane.Events.TabSelected);
       await TestRunner.showPanel('console');
       dumpScrollTop();
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-uncaught-promise-expected.txt b/third_party/blink/web_tests/http/tests/devtools/console/console-uncaught-promise-expected.txt
index b08cf08d..e3a9beda 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-uncaught-promise-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-uncaught-promise-expected.txt
@@ -8,7 +8,7 @@
 timeout @ console-uncaught-promise.js:19
 setTimeout (async)
 runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:103
+(anonymous) @ console-uncaught-promise.js:100
 console-uncaught-promise.js:47 Uncaught (in promise) Error: err2
 promiseTest2 @ console-uncaught-promise.js:47
 timeout @ console-uncaught-promise.js:19
@@ -23,7 +23,7 @@
 timeout @ console-uncaught-promise.js:19
 setTimeout (async)
 runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:106
+(anonymous) @ console-uncaught-promise.js:100
 console-uncaught-promise.js:65 Uncaught (in promise) DOMException: Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.
 throwDOMException @ console-uncaught-promise.js:65
 catcher @ console-uncaught-promise.js:57
@@ -32,25 +32,25 @@
 timeout @ console-uncaught-promise.js:19
 setTimeout (async)
 runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:106
+(anonymous) @ console-uncaught-promise.js:100
 console-uncaught-promise.js:71 Uncaught (in promise) 42
 promiseTest4 @ console-uncaught-promise.js:71
 timeout @ console-uncaught-promise.js:19
 setTimeout (async)
 runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:106
+(anonymous) @ console-uncaught-promise.js:100
 console-uncaught-promise.js:76 Uncaught (in promise) 1e+100
 promiseTest5 @ console-uncaught-promise.js:76
 timeout @ console-uncaught-promise.js:19
 setTimeout (async)
 runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:106
+(anonymous) @ console-uncaught-promise.js:100
 console-uncaught-promise.js:81 Uncaught (in promise) foo
 promiseTest6 @ console-uncaught-promise.js:81
 timeout @ console-uncaught-promise.js:19
 setTimeout (async)
 runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:106
+(anonymous) @ console-uncaught-promise.js:100
 console-uncaught-promise.js:86 Uncaught (in promise) {foo: 42}
     foo: 42
     __proto__: Object
@@ -58,13 +58,13 @@
 timeout @ console-uncaught-promise.js:19
 setTimeout (async)
 runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:106
+(anonymous) @ console-uncaught-promise.js:100
 console-uncaught-promise.js:91 Uncaught (in promise) undefined
 promiseTest8 @ console-uncaught-promise.js:91
 timeout @ console-uncaught-promise.js:19
 setTimeout (async)
 runNextPromiseTest @ console-uncaught-promise.js:18
-(anonymous) @ console-uncaught-promise.js:106
+(anonymous) @ console-uncaught-promise.js:100
 A bad HTTP response code (404) was received when fetching the script.
 inspected-page.html:1 Uncaught (in promise) TypeError: Failed to register a ServiceWorker for scope ('http://127.0.0.1:8000/devtools/console/') with script ('http://127.0.0.1:8000/devtools/console/404'): A bad HTTP response code (404) was received when fetching the script.
 
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-uncaught-promise.js b/third_party/blink/web_tests/http/tests/devtools/console/console-uncaught-promise.js
index fd50ea7..bc94733 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-uncaught-promise.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-uncaught-promise.js
@@ -97,22 +97,12 @@
       }
   `);
 
-  ConsoleTestRunner.addConsoleViewSniffer(checkConsoleMessages, true);
-  Common.console.showPromise();
-
-  checkConsoleMessages();
-
-  function checkConsoleMessages() {
-    TestRunner.evaluateInPage('runNextPromiseTest()', callback);
-
-    function callback(result) {
-      if (!result)
-        ConsoleTestRunner.expandConsoleMessages(dump);
-    }
+  while (await TestRunner.evaluateInPagePromise('runNextPromiseTest()')) {
+      // Run all the test cases until there are no more.
   }
 
-  function dump() {
-    ConsoleTestRunner.dumpConsoleMessagesIgnoreErrorStackFrames();
-    TestRunner.completeTest();
-  }
+  ConsoleTestRunner.expandConsoleMessages(async () => {
+      await ConsoleTestRunner.dumpConsoleMessagesIgnoreErrorStackFrames();
+      TestRunner.completeTest();
+  });
 })();
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/console-viewport-selection.js b/third_party/blink/web_tests/http/tests/devtools/console/console-viewport-selection.js
index 1d2a7be9..ca49d3a 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/console-viewport-selection.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/console-viewport-selection.js
@@ -25,29 +25,29 @@
   var viewportMessagesCount;
 
   var testSuite = [
-    function testSelectionSingleLineText(next) {
+    async function testSelectionSingleLineText(next) {
       viewport.invalidate();
       viewport.forceScrollItemToBeFirst(0);
       viewportMessagesCount = viewport.lastVisibleIndex() - viewport.firstVisibleIndex() + 1;
-      selectMessages(middleMessage, 2, middleMessage, 7);
+      await selectMessages(middleMessage, 2, middleMessage, 7);
       dumpSelectionText();
       next();
     },
 
-    function testReversedSelectionSingleLineText(next) {
-      selectMessages(middleMessage, 7, middleMessage, 2);
+    async function testReversedSelectionSingleLineText(next) {
+      await selectMessages(middleMessage, 7, middleMessage, 2);
       dumpSelectionText();
       next();
     },
 
-    function testSelectionMultiLineText(next) {
-      selectMessages(middleMessage - 1, 4, middleMessage + 1, 7);
+    async function testSelectionMultiLineText(next) {
+      await selectMessages(middleMessage - 1, 4, middleMessage + 1, 7);
       dumpSelectionText();
       next();
     },
 
-    function testSimpleVisibleSelection(next) {
-      selectMessages(middleMessage - 3, 6, middleMessage + 2, 6);
+    async function testSimpleVisibleSelection(next) {
+      await selectMessages(middleMessage - 3, 6, middleMessage + 2, 6);
       dumpSelectionModel();
       next();
     },
@@ -77,14 +77,14 @@
       next();
     },
 
-    function testShiftClickSelectionOver(next) {
-      emulateShiftClickOnMessage(minimumViewportMessagesCount);
+    async function testShiftClickSelectionOver(next) {
+      await emulateShiftClickOnMessage(minimumViewportMessagesCount);
       dumpSelectionModel();
       next();
     },
 
-    function testShiftClickSelectionBelow(next) {
-      emulateShiftClickOnMessage(messagesCount - minimumViewportMessagesCount);
+    async function testShiftClickSelectionBelow(next) {
+      await emulateShiftClickOnMessage(messagesCount - minimumViewportMessagesCount);
       dumpSelectionModel();
       next();
     },
@@ -96,20 +96,20 @@
       next();
     },
 
-    function testReversedVisibleSelection(next) {
-      selectMessages(middleMessage + 1, 6, middleMessage - 4, 6);
+    async function testReversedVisibleSelection(next) {
+      await selectMessages(middleMessage + 1, 6, middleMessage - 4, 6);
       dumpSelectionModel();
       next();
     },
 
-    function testShiftClickReversedSelectionOver(next) {
-      emulateShiftClickOnMessage(minimumViewportMessagesCount);
+    async function testShiftClickReversedSelectionOver(next) {
+      await emulateShiftClickOnMessage(minimumViewportMessagesCount);
       dumpSelectionModel();
       next();
     },
 
-    function testShiftClickReversedSelectionBelow(next) {
-      emulateShiftClickOnMessage(messagesCount - minimumViewportMessagesCount);
+    async function testShiftClickReversedSelectionBelow(next) {
+      await emulateShiftClickOnMessage(messagesCount - minimumViewportMessagesCount);
       dumpSelectionModel();
       next();
     },
@@ -196,7 +196,7 @@
     TestRunner.addResult('Selected text:<<<EOL\n' + text + '\nEOL');
   }
 
-  function emulateShiftClickOnMessage(messageIndex) {
+  async function emulateShiftClickOnMessage(messageIndex) {
     viewport.refresh();
     var selection = window.getSelection();
     if (!selection || !selection.rangeCount) {
@@ -205,11 +205,13 @@
     }
     viewport.forceScrollItemToBeFirst(Math.max(messageIndex - minimumViewportMessagesCount / 2, 0));
     var element = consoleView.itemElement(messageIndex).element();
+    // Console messages contain live locations.
+    await TestRunner.waitForPendingLiveLocationUpdates();
     selection.setBaseAndExtent(selection.anchorNode, selection.anchorOffset, element, 0);
     viewport.refresh();
   }
 
-  function selectMessages(fromMessage, fromTextOffset, toMessage, toTextOffset) {
+  async function selectMessages(fromMessage, fromTextOffset, toMessage, toTextOffset) {
     if (Math.abs(toMessage - fromMessage) > minimumViewportMessagesCount) {
       TestRunner.addResult(String.sprintf(
           'FAILURE: Cannot select more than %d messages (requested to select from %d to %d',
@@ -219,7 +221,7 @@
     }
     viewport.forceScrollItemToBeFirst(Math.min(fromMessage, toMessage));
 
-    ConsoleTestRunner.selectConsoleMessages(fromMessage, fromTextOffset, toMessage, toTextOffset);
+    await ConsoleTestRunner.selectConsoleMessages(fromMessage, fromTextOffset, toMessage, toTextOffset);
     viewport.refresh();
   }
 })();
diff --git a/third_party/blink/web_tests/http/tests/devtools/console/viewport-testing/console-key-navigation.js b/third_party/blink/web_tests/http/tests/devtools/console/viewport-testing/console-key-navigation.js
index 22c44bb..dea56b3c 100644
--- a/third_party/blink/web_tests/http/tests/devtools/console/viewport-testing/console-key-navigation.js
+++ b/third_party/blink/web_tests/http/tests/devtools/console/viewport-testing/console-key-navigation.js
@@ -24,125 +24,125 @@
   await ConsoleTestRunner.waitForPendingViewportUpdates();
 
   TestRunner.runTestSuite([
-    function testBetweenViewportAndExternal(next) {
+    async function testBetweenViewportAndExternal(next) {
       TestRunner.addResult(`Setting focus in prompt:`);
       prompt.focus();
-      dumpFocus();
+      await dumpFocus();
 
       shiftPress('Tab');
-      dumpFocus();
+      await dumpFocus();
 
       press('ArrowUp');
-      dumpFocus();
+      await dumpFocus();
 
       shiftPress('Tab');
-      dumpFocus();
+      await dumpFocus();
 
       press('Tab');
-      dumpFocus();
+      await dumpFocus();
 
       press('ArrowUp');
-      dumpFocus();
+      await dumpFocus();
 
       press('Tab');
-      dumpFocus();
+      await dumpFocus();
 
       next();
     },
 
-    function testBetweenViewportAndExternalWithSelectedItemNotInDOM(next) {
+    async function testBetweenViewportAndExternalWithSelectedItemNotInDOM(next) {
       TestRunner.addResult(`Setting focus in prompt:`);
       prompt.focus();
-      dumpFocus();
+      await dumpFocus();
 
       shiftPress('Tab');
-      dumpFocus();
+      await dumpFocus();
 
       press('ArrowUp');
-      dumpFocus();
+      await dumpFocus();
 
       scrollViewportToTop();
-      dumpFocus();
+      await dumpFocus();
 
       shiftPress('Tab');
-      dumpFocus();
+      await dumpFocus();
 
       press('Tab');
-      dumpFocus();
+      await dumpFocus();
 
       press('ArrowUp');
-      dumpFocus();
+      await dumpFocus();
 
       TestRunner.addResult(`\nSetting focus in prompt:`);
       prompt.focus();
-      dumpFocus();
+      await dumpFocus();
 
       shiftPress('Tab');
-      dumpFocus();
+      await dumpFocus();
 
       press('ArrowUp');
-      dumpFocus();
+      await dumpFocus();
 
       scrollViewportToTop();
-      dumpFocus();
+      await dumpFocus();
 
       press('Tab');
-      dumpFocus();
+      await dumpFocus();
 
       next();
     },
 
-    function testMoveAcrossLogsWithinViewport(next) {
+    async function testMoveAcrossLogsWithinViewport(next) {
       forceSelect(logCount - 1);
-      dumpFocus();
+      await dumpFocus();
 
       press('Home');
-      dumpFocus();
+      await dumpFocus();
 
       press('ArrowDown');
-      dumpFocus();
+      await dumpFocus();
 
       press('ArrowDown');
-      dumpFocus();
+      await dumpFocus();
 
       press('End');
-      dumpFocus();
+      await dumpFocus();
 
       press('ArrowUp');
-      dumpFocus();
+      await dumpFocus();
 
       press('ArrowUp');
-      dumpFocus();
+      await dumpFocus();
 
       next();
     },
 
-    function testViewportDoesNotChangeFocusOnScroll(next) {
+    async function testViewportDoesNotChangeFocusOnScroll(next) {
       forceSelect(logCount - 2);
-      dumpFocus();
+      await dumpFocus();
 
       scrollViewportToTop();
-      dumpFocus();
+      await dumpFocus();
 
       scrollViewportToBottom();
-      dumpFocus();
+      await dumpFocus();
 
       next();
     },
 
-    function testViewportDoesNotStealFocusOnScroll(next) {
+    async function testViewportDoesNotStealFocusOnScroll(next) {
       forceSelect(logCount - 1);
-      dumpFocus();
+      await dumpFocus();
 
       TestRunner.addResult(`Setting focus in prompt:`);
       prompt.focus();
-      dumpFocus();
+      await dumpFocus();
 
       scrollViewportToTop();
-      dumpFocus();
+      await dumpFocus();
 
       scrollViewportToBottom();
-      dumpFocus();
+      await dumpFocus();
 
       next();
     },
@@ -150,20 +150,20 @@
     async function testNewLogsShouldNotMoveFocus(next) {
       TestRunner.addResult(`Setting focus in prompt:`);
       prompt.focus();
-      dumpFocus();
+      await dumpFocus();
 
       await TestRunner.evaluateInPagePromise(`console.log("New Message")`);
       await ConsoleTestRunner.waitForConsoleMessagesPromise(logCount + 1);
       await ConsoleTestRunner.waitForPendingViewportUpdates();
 
-      dumpFocus();
+      await dumpFocus();
       next();
     },
 
-    function testClearingConsoleFocusesPrompt(next) {
+    async function testClearingConsoleFocusesPrompt(next) {
       TestRunner.addResult(`\nConsole cleared:`);
       consoleView._consoleCleared();
-      dumpFocus();
+      await dumpFocus();
       next();
     }
   ]);
@@ -200,8 +200,10 @@
     eventSender.keyDown(key, ['shiftKey']);
   }
 
-  function dumpFocus() {
+  async function dumpFocus() {
     var element = document.deepActiveElement();
+    // Console elements contain live locations that might not be fully resolved yet.
+    await TestRunner.waitForPendingLiveLocationUpdates();
     if (!element) {
       TestRunner.addResult('null');
       return;
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-display-locked.js b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-display-locked.js
index 0fd8b3b..b87a2a0e 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-display-locked.js
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-display-locked.js
@@ -8,7 +8,7 @@
   await TestRunner.loadModule('console_test_runner');
   await TestRunner.showPanel('elements');
   await TestRunner.loadHTML(`
-      <div id="container" renderSubtree="invisible skip-activation" style="contain-intrinsic-size: 10px;">
+      <div id="container" style="render-subtree: invisible skip-activation; contain-intrinsic-size: 10px;">
         <div id="child" style="width: 50px; height: 50px;"></div>
       </div>
     `);
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-enables-virtual-environment-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-enables-virtual-environment-expected.txt
deleted file mode 100644
index f04e58b7b..0000000
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-enables-virtual-environment-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-Check that calling WebAuthn.enable starts the WebAuthn virtual authenticator environment.
-OK
-
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-enables-virtual-environment.js b/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-enables-virtual-environment.js
deleted file mode 100644
index 483985d..0000000
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/webauthn/webauthn-enables-virtual-environment.js
+++ /dev/null
@@ -1,13 +0,0 @@
-(async function(testRunner) {
-  const {page, session, dp} =
-      await testRunner.startURL(
-          "https://devtools.test:8443/inspector-protocol/webauthn/resources/webauthn-test.https.html",
-          "Check that calling WebAuthn.enable starts the WebAuthn virtual " +
-          "authenticator environment.");
-
-  await dp.WebAuthn.enable();
-
-  const result = await session.evaluateAsync("registerCredential()");
-  testRunner.log(result.status);
-  testRunner.completeTest();
-})
diff --git a/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js b/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js
index 4177283..50e3286 100644
--- a/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js
+++ b/third_party/blink/web_tests/inspector-protocol/accessibility/accessibility-getFullAXTree-display-locked.js
@@ -1,16 +1,16 @@
 (async function(testRunner) {
   var {page, session, dp} = await testRunner.startHTML(`
-    <div id='activatable' rendersubtree='invisible skip-viewport-activation'>
+    <div id='activatable' style='render-subtree: invisible skip-viewport-activation'>
       locked
       <div id='child'>
         child
         <div id='grandChild'>grandChild</div>
       </div>
       <div id='invisible' style='display:none'>invisible</div>
-      <div id='nested' rendersubtree='invisible skip-viewport-activation'>nested</div>
+      <div id='nested' style='render-subtree: invisible skip-viewport-activation'>nested</div>
       text
     </div>
-    <div id='nonActivatable' rendersubtree='invisible skip-activation'>nonActivatable text</div>
+    <div id='nonActivatable' style='render-subtree: invisible skip-activation'>nonActivatable text</div>
     <div id='normal'>normal text</div>
   `, 'Tests accessibility values of display locked nodes');
   const dumpAccessibilityNodesFromList =
diff --git a/third_party/blink/web_tests/inspector-protocol/css/css-get-platform-fonts-display-locked.js b/third_party/blink/web_tests/inspector-protocol/css/css-get-platform-fonts-display-locked.js
index 03d1a520..429ad01 100644
--- a/third_party/blink/web_tests/inspector-protocol/css/css-get-platform-fonts-display-locked.js
+++ b/third_party/blink/web_tests/inspector-protocol/css/css-get-platform-fonts-display-locked.js
@@ -29,7 +29,7 @@
 `, 'Test css.getPlatformFontsForNode method with display locking.');
 
   await session.evaluateAsync(async () => {
-    await requestAnimationFrame(() => { document.getElementById("parent").renderSubtree = "invisible skip-activation"; });
+    await requestAnimationFrame(() => { document.getElementById("parent").style = "render-subtree: invisible skip-activation"; });
   });
 
   var CSSHelper = await testRunner.loadScript('../resources/css-helper.js');
diff --git a/third_party/blink/web_tests/svg/custom/xlink-to-invalid-gradient-expected.png b/third_party/blink/web_tests/svg/custom/xlink-to-invalid-gradient-expected.png
deleted file mode 100644
index 03cdc1c..0000000
--- a/third_party/blink/web_tests/svg/custom/xlink-to-invalid-gradient-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/svg/custom/xlink-to-invalid-gradient.svg b/third_party/blink/web_tests/svg/custom/xlink-to-invalid-gradient.svg
deleted file mode 100644
index 1609157..0000000
--- a/third_party/blink/web_tests/svg/custom/xlink-to-invalid-gradient.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   version="1.0"
-   width="200"
-   height="200">
-<defs>
-  <linearGradient id="linearGradient1" xlink:href="#linearGradient0" />
-</defs>
-<rect width="200" height="200" style="fill:url(#linearGradient1) green;" id="rect0" />
-<text id="text0" x="10" y="20" style="fill:green">
-  PASS
-  <linearGradient id="linearGradient0">
-    <stop offset="0" stop-color="white"/>
-    <stop offset="1" stop-color="black"/>
-  </linearGradient>
-</text>
-</svg>
diff --git a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
index 4239e0d..7141285 100644
--- a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
@@ -289,12 +289,10 @@
     property removeAttributeNode
     property removeChild
     property removeEventListener
-    property renderSubtree
     property replaceChild
     property replaceWith
     property requestFullscreen
     property requestPointerLock
-    property resetSubtreeRendered
     property role
     property scroll
     property scrollBy
@@ -321,7 +319,6 @@
     property toString
     property toggleAttribute
     property translate
-    property updateRendering
     property webkitMatchesSelector
     property webkitRequestFullScreen
     property webkitRequestFullscreen
@@ -1482,12 +1479,10 @@
     property removeAttributeNode
     property removeChild
     property removeEventListener
-    property renderSubtree
     property replaceChild
     property replaceWith
     property requestFullscreen
     property requestPointerLock
-    property resetSubtreeRendered
     property role
     property scroll
     property scrollBy
@@ -1510,7 +1505,6 @@
     property tagName
     property textContent
     property toggleAttribute
-    property updateRendering
     property viewportElement
     property webkitMatchesSelector
     property webkitRequestFullScreen
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index e60ef96..c490a1c5 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -2062,7 +2062,6 @@
     getter part
     getter prefix
     getter previousElementSibling
-    getter renderSubtree
     getter role
     getter scrollHeight
     getter scrollLeft
@@ -2112,7 +2111,6 @@
     method replaceWith
     method requestFullscreen
     method requestPointerLock
-    method resetSubtreeRendered
     method scroll
     method scrollBy
     method scrollIntoView
@@ -2124,7 +2122,6 @@
     method setAttributeNodeNS
     method setPointerCapture
     method toggleAttribute
-    method updateRendering
     method webkitMatchesSelector
     method webkitRequestFullScreen
     method webkitRequestFullscreen
@@ -2190,7 +2187,6 @@
     setter onwebkitfullscreenerror
     setter outerHTML
     setter part
-    setter renderSubtree
     setter role
     setter scrollLeft
     setter scrollTop
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/accessibility-activatable.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/accessibility-activatable.html
similarity index 93%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/accessibility-activatable.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/accessibility-activatable.html
index e8f51ba..b997b55 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/accessibility-activatable.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/accessibility-activatable.html
@@ -7,6 +7,11 @@
 </head>
 <body>
 
+<style>
+.rendersubtreelocked {
+  render-subtree: invisible;
+}
+</style>
 <div id=spacer style="height: 3000px"></div>
 <div id="container">
   <div id="locked">
@@ -32,7 +37,7 @@
 async_test(async (t) => {
   // Lock #locked.
   const locked = document.getElementById("locked");
-  await setInvisibleActivatable(locked);
+  await addClassAndProcessLifecycle(locked, "rendersubtreelocked");
   let axLocked = axElementById("locked");
   t.step(() => { assert_false(axLocked.isIgnored); });
 
@@ -58,9 +63,6 @@
     }
   }
 
-  // update() should trigger style & layout update in the locked tree. The ax objects might get replaced,
-  // but the structure should stay the same.
-  await locked.updateRendering();
   axLocked = axElementById("locked");
   t.step(() => { assert_equals(axLocked.childrenCount, 7, "Child count after update"); });
 
@@ -76,7 +78,7 @@
   }
 
   // Unlock the element, and force a layout recalc.
-  await setVisible(locked);
+  await removeClassAndProcessLifecycle(locked, "rendersubtreelocked");
   locked.getBoundingClientRect();
   axLocked = axElementById("locked");
   // Expect 4 children: the text node "locked" and 3 div children (#child, #displayNone, and #hidden).
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/accessibility-non-activatable.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/accessibility-non-activatable.html
similarity index 75%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/accessibility-non-activatable.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/accessibility-non-activatable.html
index 3dc49994d..2cd47f7 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/accessibility-non-activatable.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/accessibility-non-activatable.html
@@ -7,8 +7,13 @@
 </head>
 <body>
 
+<style>
+.rendersubtreelocked {
+  render-subtree: invisible skip-activation;
+}
+</style>
 <div id="container">
-  <div id="locked" rendersubtree="invisible skip-activation">
+  <div id="locked" class=rendersubtreelocked>
     locked
     <div id="child">
       child
@@ -27,11 +32,7 @@
   t.step(() => { assert_false(axLocked.isIgnored); });
   t.step(() => { assert_equals(axLocked.childrenCount, 0); });
 
-  // Trigger style & layout recalc in the locked subtree with update().
-  await locked.updateRendering();
-  t.step(() => { assert_equals(axLocked.childrenCount, 0, "After update, nodes in locked subtree are still ignored"); });
-
-  await setVisible(locked);
+  await removeClassAndProcessLifecycle(locked, "rendersubtreelocked");
   // The ax object for #locked got replaced since the layout object changed, so use the new ax object.
   axLocked = axElementById("locked");
   t.step(() => { assert_equals(axLocked.childrenCount, 2, "After commit, nodes in locked subtree are not ignored"); });
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-commit.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-commit.html
similarity index 85%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-commit.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-commit.html
index d268f2d5..ddfd3db 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-commit.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-commit.html
@@ -19,6 +19,9 @@
   height: 50px;
   background: lightgreen;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 <div id="log"></div>
@@ -33,12 +36,12 @@
 
 function runTest() {
   const container = document.getElementById("container");
-  setInvisible(container).then(() => {
+  addClassAndProcessLifecycle(container, "locked").then(() => {
     const child = document.createElement("div");
     child.id = "child";
     container.appendChild(child);
 
-    setVisible(container).then(
+    removeClassAndProcessLifecycle(container, "locked").then(
       () => { finishTest("PASS"); },
       (e) => { finishTest("FAIL " + e.message); });
   });
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-in-breakable-div-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-in-breakable-div-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-in-breakable-div-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-in-breakable-div-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-in-breakable-div.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-in-breakable-div.html
similarity index 71%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-in-breakable-div.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-in-breakable-div.html
index e355b12f..fa57c29e 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-in-breakable-div.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-in-breakable-div.html
@@ -1,5 +1,5 @@
 <!doctype HTML>
-<html class="reftest-wait">
+<html>
 <meta charset="utf8">
 <title>Display Locking: acquire in div with columns</title>
 <link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
@@ -12,6 +12,7 @@
 #container {
   border-top: solid green 50px;
   border-bottom: solid green 50px;
+  render-subtree: invisible skip-activation;
 }
 #parent {
   columns: 2;
@@ -22,16 +23,7 @@
 </style>
 
 <div id="parent">
-  <div id="container"></div>
+  <div id="container">Text</div>
 </div>
 
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
 </html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-in-iframe-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-in-iframe-ref.html
similarity index 91%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-in-iframe-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-in-iframe-ref.html
index 5cdb63b1..9c96e11 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-in-iframe-ref.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-in-iframe-ref.html
@@ -5,6 +5,5 @@
 <link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
 <link rel="help" href="https://github.com/WICG/display-locking">
 
-<div id="log">PASS</div>
 <iframe></iframe>
 </html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-in-iframe.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-in-iframe.html
new file mode 100644
index 0000000..8c66351
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-in-iframe.html
@@ -0,0 +1,22 @@
+<!doctype HTML>
+<html>
+<meta charset="utf8">
+<title>Display Locking: acquire in iframe</title>
+<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
+<link rel="help" href="https://github.com/WICG/display-locking">
+<link rel="match" href="acquire-in-iframe-ref.html">
+<script src="/common/reftest-wait.js"></script>
+<script src="resources/utils.js"></script>
+
+<iframe id="frame" srcdoc='
+  <style>
+  #container {
+    width: 100px;
+    height: 100px;
+    render-subtree: invisible skip-activation;
+  }
+  </style>
+  <div id="container">Lorem</div>
+'></iframe>
+
+</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-on-composited-layer.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-on-composited-layer.html
similarity index 89%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-on-composited-layer.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-on-composited-layer.html
index 0dbb75d..15a2f95f 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-on-composited-layer.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-on-composited-layer.html
@@ -14,6 +14,9 @@
   width: 150px;
   height: 150px;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 <div id="log"></div>
@@ -28,7 +31,7 @@
 
 function runTest() {
   const container = document.getElementById("container");
-  setInvisible(container).then(
+  addClassAndProcessLifecycle(container, "locked").then(
     () => { finishTest("PASS"); },
     (e) => { finishTest("FAIL " + e.message); }
   );
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-on-positioned-element.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-on-positioned-element.html
similarity index 88%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-on-positioned-element.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-on-positioned-element.html
index 89ea607..0ef7d95 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-on-positioned-element.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-on-positioned-element.html
@@ -17,6 +17,9 @@
   top: 0px;
   left: 0px;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 <div id="log"></div>
@@ -31,7 +34,7 @@
 
 function runTest() {
   const container = document.getElementById("container");
-  setInvisible(container).then(() => {
+  addClassAndProcessLifecycle(container, "locked").then(() => {
     const child = document.createElement("div");
     document.body.appendChild(child);
 
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-then-mark-for-reattach.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-then-mark-for-reattach.html
similarity index 84%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-then-mark-for-reattach.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-then-mark-for-reattach.html
index 79e4cd9a..1019c4f 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-then-mark-for-reattach.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/acquire-then-mark-for-reattach.html
@@ -1,4 +1,5 @@
 <!DOCTYPE html>
+<html class="reftest-wait">
 <meta charset="utf-8">
 <title>Display Locking: marking descendant for reattachment after acquire</title>
 <link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
@@ -7,6 +8,11 @@
 <script src="/common/reftest-wait.js"></script>
 <script src="resources/utils.js"></script>
 
+<style>
+.locked {
+  render-subtree: invisible skip-activation;
+}
+</style>
 <div id="log"></div>
 <div id="host"><div id="slotted"></div></div>
 
@@ -17,14 +23,14 @@
   takeScreenshot();
 }
 
-function runTest() {
+async function runTest() {
   // Set up locked element within shadow root.
   let shadowRoot = host.attachShadow({ mode: "open" });
   let locked = document.createElement("div");
   shadowRoot.appendChild(locked);
   locked.innerHTML = "<slot></slot>";
   locked.getBoundingClientRect();
-  setInvisible(locked);
+  await addClassAndProcessLifecycle(locked, "locked");
 
   // Slotted will be recalced, because style dirtiness propagated
   // to the DOM ancestor (host) instead of flat-tree (<slot>), and
@@ -34,7 +40,7 @@
   host.getBoundingClientRect();
 
   // Check that everything is OK after we commit.
-  setVisible(locked).then(() => {
+  removeClassAndProcessLifecycle(locked, "locked").then(() => {
     locked.remove();
     finishTest("PASS");
   });
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/accessibility-activatable-focus.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/accessibility-activatable-focus.html
similarity index 80%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/accessibility-activatable-focus.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/accessibility-activatable-focus.html
index 1f10a76..7d1955e 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/accessibility-activatable-focus.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/accessibility-activatable-focus.html
@@ -3,11 +3,10 @@
 <head>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<script src="../resources/utils.js"></script>
 </head>
 <body>
 
-<div id="locked" rendersubtree="invisible">
+<div id="locked" style="render-subtree: invisible">
   foo
   <div id="child" tabindex="0">
     bar
@@ -21,12 +20,10 @@
 
 async_test(async(t) => {
   const lockedEl = document.getElementById("locked");
-  t.step(() => { assert_equals(lockedEl.renderSubtree, INVISIBLE_ACTIVATABLE) });
   let axLocked = axElementById("locked");
   t.step(() => { assert_equals(axLocked.childrenCount, 3, "Child count after acquire"); });
   axElementById("child").takeFocus();
 
-  t.step(() => { assert_equals(lockedEl.renderSubtree, "") });
   // Wait for the next frame for the ax object to be recreated.
   requestAnimationFrame(() => {
     requestAnimationFrame(() => {
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/accessibility-activatable-press.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/accessibility-activatable-press.html
similarity index 80%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/accessibility-activatable-press.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/accessibility-activatable-press.html
index 2fb80a7..1fdd73b 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/accessibility-activatable-press.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/accessibility-activatable-press.html
@@ -3,11 +3,10 @@
 <head>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<script src="../resources/utils.js"></script>
 </head>
 <body>
 
-<div id="locked" rendersubtree="invisible">
+<div id="locked" style="render-subtree: invisible">
   foo
   <div id="child" tabindex="0">
     bar
@@ -21,13 +20,11 @@
 
 async_test(async(t) => {
   const lockedEl = document.getElementById("locked");
-  t.step(() => { assert_equals(lockedEl.renderSubtree, INVISIBLE_ACTIVATABLE) });
   let axLocked = axElementById("locked");
   t.step(() => { assert_equals(axLocked.childrenCount, 3, "Child count after acquire"); });
 
   axElementById("child").press();
 
-  t.step(() => { assert_equals(lockedEl.renderSubtree, ""); });
   // Wait for the next frame for the ax object to be recreated.
   requestAnimationFrame(() => {
     requestAnimationFrame(() => {
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/accessibility-activatable-scroll.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/accessibility-activatable-scroll.html
similarity index 80%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/accessibility-activatable-scroll.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/accessibility-activatable-scroll.html
index 0cedebf..9896873 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/accessibility-activatable-scroll.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/accessibility-activatable-scroll.html
@@ -3,11 +3,10 @@
 <head>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<script src="../resources/utils.js"></script>
 </head>
 <body>
 
-<div id="locked" rendersubtree="invisible">
+<div id="locked" style="render-subtree: invisible">
   foo
   <div id="child" tabindex="0">
     bar
@@ -21,13 +20,11 @@
 
 async_test(async(t) => {
   const lockedEl = document.getElementById("locked");
-  t.step(() => { assert_equals(lockedEl.renderSubtree, INVISIBLE_ACTIVATABLE) });
   let axLocked = axElementById("locked");
   t.step(() => { assert_equals(axLocked.childrenCount, 3, "Child count after acquire"); });
 
   axElementById("child").scrollToMakeVisible();
 
-  t.step(() => { assert_equals(lockedEl.renderSubtree, "") });
   // Wait for the next frame for the ax object to be recreated.
   requestAnimationFrame(() => {
     requestAnimationFrame(() => {
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/activatable-locked-element-allows-anchor-links-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/activatable-locked-element-allows-anchor-links-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/activatable-locked-element-allows-anchor-links-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/activatable-locked-element-allows-anchor-links-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/activatable-locked-element-allows-anchor-links.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/activatable-locked-element-allows-anchor-links.html
similarity index 81%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/activatable-locked-element-allows-anchor-links.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/activatable-locked-element-allows-anchor-links.html
index 056dcd17..82bb81f 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/activatable-locked-element-allows-anchor-links.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/activatable-locked-element-allows-anchor-links.html
@@ -18,6 +18,7 @@
   width: 150px;
   height: 150px;
   background: lightgreen;
+  render-subtree: invisible skip-viewport-activation;
 }
 #target {
   width: 100px;
@@ -31,11 +32,8 @@
 
 <script>
 function runTest() {
-  const container = document.getElementById("container");
-  setInvisibleActivatable(container).then(() => {
-    location.href += "#target";
-    requestAnimationFrame(takeScreenshot);
-  });
+  location.href += "#target";
+  requestAnimationFrame(takeScreenshot);
 }
 
 window.onload = () => { requestAnimationFrame(runTest); };
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/commit-in-beforeactivate.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/commit-in-beforeactivate.html
similarity index 83%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/commit-in-beforeactivate.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/commit-in-beforeactivate.html
index 59a486f..c44ec48 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/commit-in-beforeactivate.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/commit-in-beforeactivate.html
@@ -10,22 +10,19 @@
 <script src="../resources/utils.js"></script>
 
 <div id=spacer style="height: 3000px"></div>
-<div id="target"></div>
+<div id="target" style="render-subtree: invisible"></div>
 
 <script>
 'use strict';
 
 async_test((t) => {
   async function commit(target) {
-    setVisible(target);
+    target.style = "";
     t.done();
   }
 
   async function runTest() {
     const target = document.getElementById("target");
-    await setInvisibleActivatable(target);
-    t.step(() => assert_equals(target.renderSubtree, INVISIBLE_ACTIVATABLE));
-
     target.addEventListener("rendersubtreeactivation", () => commit(target));
     target.scrollIntoView();
   }
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus-empty-layout.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus-empty-layout.html
similarity index 90%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus-empty-layout.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus-empty-layout.html
index f9456db..09a3558 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus-empty-layout.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus-empty-layout.html
@@ -10,6 +10,11 @@
 Focus on a div that doesn't have style/layout value yet.
 -->
 
+<style>
+.locked {
+  render-subtree: invisible;
+}
+</style>
 <div id=spacer style="height: 3000px"></div>
 <div id="container"></div>
 
@@ -18,7 +23,7 @@
 
 <script>
 promise_test((t) => {
-  const acquirePromise = setInvisibleActivatable(container);
+  const acquirePromise = addClassAndProcessLifecycle(container, "locked");
   return new Promise((resolve, reject) => {
     const focusable = document.createElement("div");
     focusable.tabIndex = 0;
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus-next-updated-style.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus-next-updated-style.html
new file mode 100644
index 0000000..62503686
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus-next-updated-style.html
@@ -0,0 +1,36 @@
+<!doctype HTML>
+<html>
+<meta charset="utf8">
+<title>Display Locking: focus on skipped element</title>
+<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
+<link rel="help" href="https://github.com/WICG/display-locking">
+<script src="../resources/utils.js"></script>
+
+<!--
+Focus on a div that has updated style/layout.
+-->
+
+<div id="container" style="render-subtree: invisible">
+  <div id="focusableA" tabindex="0">a</div>
+  <div id="focusableB" tabindex="0">b</div>
+</div>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<script>
+promise_test((t) => {
+  return new Promise((resolve, reject) => {
+    focusableA.style = "display: none;";
+    eventSender.keyDown("Tab", []);
+    t.step(() => assert_equals(document.activeElement, focusableB));
+    eventSender.keyDown("Tab", []);
+    t.step(() => assert_equals(document.activeElement, focusableB));
+    focusableA.style = "display: block;";
+    eventSender.keyDown("Tab", []);
+    t.step(() => assert_equals(document.activeElement, focusableA));
+    resolve();
+  });
+}, "Trying to focus on an element in a locked subtree that's not visible anymore will skip that element");
+</script>
+</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus-shadow.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus-shadow.html
similarity index 84%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus-shadow.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus-shadow.html
index 7748ec7..126c6f59 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus-shadow.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus-shadow.html
@@ -18,10 +18,10 @@
 promise_test((t) => {
   const container = document.createElement("div");
   container.innerHTML = "<slot></slot>";
+  container.style = "render-subtree: invisible";
 
   const shadowRoot = host.attachShadow({ mode: "open" });
   shadowRoot.appendChild(container);
-  const acquirePromise = setInvisibleActivatable(container);
 
   return new Promise((resolve, reject) => {
     const eventPromise = new Promise((resolve, reject) => {
@@ -35,13 +35,11 @@
     slotted.onrendersubtreeactivation = reject;
 
     t.step(() => assert_not_equals(document.activeElement, slotted));
-    acquirePromise.then(() => {
-      slotted.focus();
+    slotted.focus();
 
-      eventPromise.then(() => {
-        t.step(() => assert_equals(document.activeElement, slotted));
-        resolve();
-      });
+    eventPromise.then(() => {
+      t.step(() => assert_equals(document.activeElement, slotted));
+      resolve();
     });
   });
 }, "Activating locked element through focus() fires rendersubtreeactivation, doesn't go through shadow boundary");
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus-updated-style-parent.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus-updated-style-parent.html
similarity index 70%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus-updated-style-parent.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus-updated-style-parent.html
index 41e6c39..a628658b 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus-updated-style-parent.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus-updated-style-parent.html
@@ -9,7 +9,7 @@
 Focus on a div whose parent (also in a locked subtree) has updated style/layout.
 -->
 
-<div id="container">
+<div id="container" style="render-subtree: invisible">
   <div id="displayNoneParent">
     <div id="focusable" tabIndex="0">
       focusable thing
@@ -23,15 +23,12 @@
 
 <script>
 promise_test((t) => {
-  const acquirePromise = setInvisibleActivatable(container);
   return new Promise((resolve, reject) => {
-    acquirePromise.then(() => {
-      container.onrendersubtreeactivation = reject;
-      displayNoneParent.style.display = "none";
-      focusable.focus();
-      t.step(() => assert_not_equals(document.activeElement, focusable));
-      resolve();
-    });
+    container.onrendersubtreeactivation = reject;
+    displayNoneParent.style.display = "none";
+    focusable.focus();
+    t.step(() => assert_not_equals(document.activeElement, focusable));
+    resolve();
   });
 }, "Trying to focus on an element in a locked subtree that's not visible anymore won't work");
 </script>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus-updated-style.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus-updated-style.html
similarity index 68%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus-updated-style.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus-updated-style.html
index dc3ad42..d2106b5 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus-updated-style.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus-updated-style.html
@@ -9,7 +9,7 @@
 Focus on a div that has updated style/layout.
 -->
 
-<div id="container">
+<div id="container" style="render-subtree: invisible">
   <div id="focusable" tabIndex="0">
     focusable thing
   </div>
@@ -21,15 +21,12 @@
 
 <script>
 promise_test((t) => {
-  const acquirePromise = setInvisibleActivatable(container);
   return new Promise((resolve, reject) => {
-    acquirePromise.then(() => {
-      container.onrendersubtreeactivation = reject;
-      focusable.style = "display: none";
-      focusable.focus();
-      t.step(() => assert_not_equals(document.activeElement, focusable));
-      resolve();
-    });
+    container.onrendersubtreeactivation = reject;
+    focusable.style = "display: none";
+    focusable.focus();
+    t.step(() => assert_not_equals(document.activeElement, focusable));
+    resolve();
   });
 }, "Trying to focus on an element in a locked subtree that's not visible anymore won't work");
 </script>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus.html
similarity index 75%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus.html
index d495cd6..15ceb38 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/focus.html
@@ -7,7 +7,7 @@
 <script src="../resources/utils.js"></script>
 
 <div id=spacer style="height: 3000px"></div>
-<div id="container" style ="contain:style layout">
+<div id="container" style ="render-subtree: invisible">
   <div id="focusable" tabIndex="0">
     Focusable div
   </div>
@@ -18,7 +18,6 @@
 
 <script>
 promise_test(() => {
-  const acquirePromise = setInvisibleActivatable(container);
   return new Promise((resolve, reject) => {
     const eventPromise = new Promise((resolve, reject) => {
       container.onrendersubtreeactivation = (e) => {
@@ -28,12 +27,10 @@
       };
     });
 
-    acquirePromise.then(() => {
-      eventSender.keyDown("Tab", ["shiftKey"]);
-      eventPromise.then(() => {
-        assert_equals(document.activeElement, focusable);
-        resolve();
-      });
+    eventSender.keyDown("Tab", ["shiftKey"]);
+    eventPromise.then(() => {
+      assert_equals(document.activeElement, focusable);
+      resolve();
     });
   });
 }, "Activating locked element through tabindex navigation fires rendersubtreeactivation, focuses element");
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/locked-element-focus.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/locked-element-focus.html
similarity index 74%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/locked-element-focus.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/locked-element-focus.html
index 96a83ec..9902c6c 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/locked-element-focus.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/locked-element-focus.html
@@ -5,6 +5,14 @@
 <link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
 <link rel="help" href="https://github.com/WICG/display-locking">
 
+<style>
+.activatable {
+  render-subtree: invisible;
+}
+.nonactivatable {
+  render-subtree: invisible skip-activation;
+}
+</style>
 <div id="container">
   <div id="focusable" tabIndex="0">
     Focusable div
@@ -19,20 +27,20 @@
 async_test((t) => {
 
   async function focusNonActivatableTest() {
-    const acquire_promise = setInvisible(container);
-    await acquire_promise;
+    await addClassAndProcessLifecycle(container, "nonactivatable");
     t.step(() => assert_not_equals(document.activeElement, focusable));
     focusable.focus();
     t.step(() => assert_not_equals(document.activeElement, focusable));
+    await removeClassAndProcessLifecycle(container, "nonactivatable");
     focusActivatableTest();
   }
 
   async function focusActivatableTest() {
     t.step(() => assert_not_equals(document.activeElement, focusable));
-    const acquire_promise = setInvisibleActivatable(container);
-    await acquire_promise;
+    await addClassAndProcessLifecycle(container, "activatable");
     focusable.focus();
     t.step(() => assert_equals(document.activeElement, focusable));
+    await removeClassAndProcessLifecycle(container, "activatable");
     t.done();
   }
 
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/locked-element-prevents-anchor-links.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/locked-element-prevents-anchor-links.html
similarity index 82%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/locked-element-prevents-anchor-links.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/locked-element-prevents-anchor-links.html
index 92a459a8..2f1df8d 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/locked-element-prevents-anchor-links.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/locked-element-prevents-anchor-links.html
@@ -18,6 +18,7 @@
   width: 150px;
   height: 150px;
   background: lightgreen;
+  render-subtree: invisible skip-activation;
 }
 #target {
   width: 100px;
@@ -31,11 +32,8 @@
 
 <script>
 function runTest() {
-  const container = document.getElementById("container");
-  setInvisible(container).then(() => {
-    location.href += "#target";
-    requestAnimationFrame(takeScreenshot);
-  });
+  location.href += "#target";
+  requestAnimationFrame(takeScreenshot);
 }
 
 window.onload = () => { requestAnimationFrame(runTest); };
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/locked-element-prevents-scroll-into-view.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/locked-element-prevents-scroll-into-view.html
similarity index 80%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/locked-element-prevents-scroll-into-view.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/locked-element-prevents-scroll-into-view.html
index 0467c3c..99a246d 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/locked-element-prevents-scroll-into-view.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/locked-element-prevents-scroll-into-view.html
@@ -18,6 +18,7 @@
   width: 150px;
   height: 150px;
   background: lightgreen;
+  render-subtree: invisible skip-activation;
 }
 #target {
   width: 100px;
@@ -31,11 +32,8 @@
 
 <script>
 function runTest() {
-  const container = document.getElementById("container");
-  setInvisible(container).then(() => {
-    document.getElementById("target").scrollIntoView();
-    requestAnimationFrame(takeScreenshot);
-  });
+  document.getElementById("target").scrollIntoView();
+  requestAnimationFrame(takeScreenshot);
 }
 
 window.onload = () => { requestAnimationFrame(runTest); };
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/spacer-and-container-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/spacer-and-container-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/spacer-and-container-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/activation/spacer-and-container-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/delayed-acquire-removes-painted-output-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/delayed-acquire-removes-painted-output-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/delayed-acquire-removes-painted-output-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/delayed-acquire-removes-painted-output-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/delayed-acquire-removes-painted-output.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/delayed-acquire-removes-painted-output.html
similarity index 89%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/delayed-acquire-removes-painted-output.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/delayed-acquire-removes-painted-output.html
index 0a89b9a..d0de9fd 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/delayed-acquire-removes-painted-output.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/delayed-acquire-removes-painted-output.html
@@ -29,6 +29,8 @@
   height: 30px;
   background: red;
 }
+.locked {
+  render-subtree: invisible skip-activation;
 </style>
 
 <div id="container">
@@ -41,7 +43,7 @@
 <script>
 function runTest() {
   const container = document.getElementById("container");
-  setInvisible(container).then(takeScreenshot);
+  addClassAndProcessLifecycle(container, "locked").then(takeScreenshot);
 }
 
 window.onload = () => {
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/inner-text.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/inner-text.html
similarity index 86%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/inner-text.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/inner-text.html
index 5b97b35..d806e6f 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/inner-text.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/inner-text.html
@@ -10,7 +10,7 @@
 <script src="resources/utils.js"></script>
 
 This text should be visible.
-<div id="container">
+<div id="container" style="render-subtree: invisible skip-activation">
   This text should not be visible.
   <div id="inner">
     This text is also not visible.
@@ -19,9 +19,6 @@
 
 <script>
 promise_test(async () => {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-
   assert_equals(document.body.innerText, "This text should be visible.");
   assert_equals(document.getElementById("inner").innerText, "");
 }, "innerText on locked element.");
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/intersection-observer.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/intersection-observer.html
similarity index 96%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/intersection-observer.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/intersection-observer.html
index c9e34cf..c56bd63 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/intersection-observer.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/intersection-observer.html
@@ -17,6 +17,9 @@
 #spacer {
   height: 3000px;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 <div id="target1">
@@ -79,7 +82,7 @@
 
   // Lock target3.
   async function enqueueStep2() {
-    await setInvisible(target3);
+    await addClassAndProcessLifecycle(target3, "locked");
     requestAnimationFrame(() => {
       requestAnimationFrame(() => {
         runStep2();
@@ -154,7 +157,7 @@
 
   // Unlock target3.
   async function enqueueStep5() {
-    await setVisible(target3);
+    await removeClassAndProcessLifecycle(target3, "locked");
     requestAnimationFrame(() => {
       requestAnimationFrame(() => {
         runStep5();
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/lock-crossorigin-iframe-and-change-size.sub.https.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/lock-crossorigin-iframe-and-change-size.sub.https.html
similarity index 72%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/lock-crossorigin-iframe-and-change-size.sub.https.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/lock-crossorigin-iframe-and-change-size.sub.https.html
index 3903e8c..b8f217b 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/lock-crossorigin-iframe-and-change-size.sub.https.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/lock-crossorigin-iframe-and-change-size.sub.https.html
@@ -8,11 +8,16 @@
 <script src="/common/reftest-wait.js"></script>
 <script src="resources/utils.js"></script>
 
-<iframe id="frame" width=200 height=200 src='https://{{domains[www]}}:{{ports[https][0]}}/wpt_internal/display-lock/paint/resources/frame.html'></iframe>
+<style>
+.locked {
+  render-subtree: invisible skip-activation;
+}
+</style>
+<iframe id="frame" width=200 height=200 src='https://{{domains[www]}}:{{ports[https][0]}}/wpt_internal/display-lock/css-render-subtree/paint/resources/frame.html'></iframe>
 
 <script>
 async function runTest() {
-  await setInvisible(document.getElementById("frame"));
+  await addClassAndProcessLifecycle(document.getElementById("frame"), "locked");
   document.getElementById("frame").height = 300;
   requestAnimationFrame(takeScreenshot);
 }
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/lock-grid-with-positioned-child.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/lock-grid-with-positioned-child.html
similarity index 88%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/lock-grid-with-positioned-child.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/lock-grid-with-positioned-child.html
index 17456cc6..75c39df 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/lock-grid-with-positioned-child.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/lock-grid-with-positioned-child.html
@@ -15,6 +15,9 @@
 #positioned {
   position: absolute;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 <div id=log></div>
@@ -31,7 +34,7 @@
 
 function runTest() {
   const container = document.getElementById("grid");
-  setInvisible(container).then(() => {
+  addClassAndProcessLifecycle(container, "locked").then(() => {
     finishTest("PASS");
   });
 }
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/lock-iframe-and-change-size-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/lock-iframe-and-change-size-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/lock-iframe-and-change-size-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/lock-iframe-and-change-size-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/lock-iframe-and-change-size.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/lock-iframe-and-change-size.html
similarity index 81%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/lock-iframe-and-change-size.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/lock-iframe-and-change-size.html
index c0541484..8a6df67 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/lock-iframe-and-change-size.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/lock-iframe-and-change-size.html
@@ -8,11 +8,16 @@
 <script src="/common/reftest-wait.js"></script>
 <script src="resources/utils.js"></script>
 
+<style>
+.locked {
+  render-subtree: invisible skip-activation;
+}
+</style>
 <iframe id=frame width=200 height=200 srcdoc='Lorem ipsum'></iframe>
 
 <script>
 async function runTest() {
-  await setInvisible(document.getElementById("frame"));
+  await addClassAndProcessLifecycle(document.getElementById("frame"), "locked");
   document.getElementById("frame").height = 300;
   requestAnimationFrame(takeScreenshot);
 }
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/locked-element-shifted-down-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/locked-element-shifted-down-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/locked-element-shifted-down-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/locked-element-shifted-down-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/locked-element-shifted-down.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/locked-element-shifted-down.html
similarity index 88%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/locked-element-shifted-down.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/locked-element-shifted-down.html
index 98c717a6..938ea55 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/locked-element-shifted-down.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/locked-element-shifted-down.html
@@ -12,6 +12,7 @@
 #container {
   width: 150px;
   height: 150px;
+  render-subtree: invisible skip-activation;
 }
 #spacer {
   width: 100px;
@@ -39,10 +40,8 @@
 
 function runTest() {
   const container = document.getElementById("container");
-  setInvisible(container).then(() => {
-    document.getElementById("spacer").style.height = "100px";
-    finishTest("PASS");
-  });
+  document.getElementById("spacer").style.height = "100px";
+  finishTest("PASS");
 }
 
 window.onload = runTest;
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/locked-shadow-descendant.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/locked-shadow-descendant.html
similarity index 91%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/locked-shadow-descendant.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/locked-shadow-descendant.html
index 8ac91c1..fab520dd 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/locked-shadow-descendant.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/locked-shadow-descendant.html
@@ -18,6 +18,7 @@
 container.innerHTML = "<slot></slot>";
 
 let shadowRoot = host.attachShadow({ mode: "open" });
+shadowRoot.innerHTML = "<style>.locked { render-subtree: invisible skip-activation; }</style>";
 shadowRoot.appendChild(container);
 
 async_test((t) => {
@@ -25,8 +26,7 @@
     t.step(() => assert_not_equals(document.activeElement, slotted));
     t.step(() => assert_not_equals(shadowRoot.activeElement, slotted));
 
-    const acquire_promise = setInvisible(container);
-    await acquire_promise;
+    await addClassAndProcessLifecycle(container, "locked");
 
     t.step(() => assert_not_equals(document.activeElement, slotted));
     t.step(() => assert_not_equals(shadowRoot.activeElement, slotted));
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/locked-style.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/locked-style.html
similarity index 89%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/locked-style.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/locked-style.html
index 6636e03a..fcac7c0 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/locked-style.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/locked-style.html
@@ -6,6 +6,11 @@
 <link rel="help" href="https://github.com/WICG/display-locking">
 <script src="resources/utils.js"></script>
 
+<style>
+.locked {
+  render-subtree: invisible skip-activation;
+}
+</style>
 <div id="container">
   <div id="child">
     <div id="grandchild"></div>
@@ -19,7 +24,7 @@
 async_test((t) => {
   async function runTest() {
     let container = document.getElementById("container");
-    await setInvisible(container);
+    await addClassAndProcessLifecycle(container, "locked");
 
     container.style = "color: blue;";
     t.step(() => assert_equals(getComputedStyle(container).color, "rgb(0, 0, 255)", "container color changed to blue"));
@@ -34,8 +39,8 @@
     child.style = "";
 
     // Commit container, lock child.
-    await setVisible(container);
-    await setInvisible(child);
+    await removeClassAndProcessLifecycle(container, "locked");
+    await addClassAndProcessLifecycle(child, "locked");
 
     // Update style outside of the locked subtree.
     container.style = "color: red;";
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/measure-forced-layout.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/measure-forced-layout.html
similarity index 92%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/measure-forced-layout.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/measure-forced-layout.html
index a28c411..6c501f4 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/measure-forced-layout.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/measure-forced-layout.html
@@ -9,6 +9,10 @@
 <style>
 #container {
   background: lightgreen;
+  contain: layout;
+}
+.locked {
+  render-subtree: invisible skip-activation;
 }
 #sizer {
   width: 100px;
@@ -78,13 +82,14 @@
   async function runTest() {
     const container = document.createElement("div");
     container.id = "container";
-    await setInvisible(container);
 
     document.getElementById("parent").appendChild(container);
+    await addClassAndProcessLifecycle(container, "locked");
+
     construct(container);
     measureForced();
 
-    setVisible(container).then(() => {
+    removeClassAndProcessLifecycle(container, "locked").then(() => {
       measureInCommit();
       t.done();
     });
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/measure-forced-svg-text.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/measure-forced-svg-text.html
similarity index 89%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/measure-forced-svg-text.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/measure-forced-svg-text.html
index b1d9cdf..660568c 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/measure-forced-svg-text.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/measure-forced-svg-text.html
@@ -12,6 +12,9 @@
   height: 100px;
   background: lightgreen;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 <div id="parent"></div>
@@ -47,13 +50,14 @@
   async function runTest() {
     const container = document.createElement("div");
     container.id = "container";
-    await setInvisible(container);
 
     document.getElementById("parent").appendChild(container);
+    await addClassAndProcessLifecycle(container, "locked");
+
     construct(container);
     measureForced();
 
-    setVisible(container).then(() => {
+    removeClassAndProcessLifecycle(container, "locked").then(() => {
       measureInCommit();
       t.done();
     });
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/hit-testing-001.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/hit-testing-001.html
similarity index 91%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/hit-testing-001.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/hit-testing-001.html
index b56b4d8..c2910c4 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/hit-testing-001.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/hit-testing-001.html
@@ -26,6 +26,9 @@
   height: 50px;
   background lightgreen;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 <body id="body">
@@ -36,7 +39,7 @@
 async_test((t) => {
   async function runTest() {
     const container = document.getElementById("outer");
-    await setInvisible(container);
+    await addClassAndProcessLifecycle(container, "locked");
     let target = document.elementFromPoint(50, 50);
     t.step(() => assert_equals(target.id, "outer", "center hits outer"));
     target = document.elementFromPoint(10, 50);
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/hit-testing-002.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/hit-testing-002.html
similarity index 91%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/hit-testing-002.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/hit-testing-002.html
index c3f2cbf0..16122e3 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/hit-testing-002.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/hit-testing-002.html
@@ -27,6 +27,9 @@
   height: 50px;
   background lightgreen;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 <body id="body">
@@ -37,7 +40,7 @@
 async_test((t) => {
   async function runTest() {
     const container = document.getElementById("outer");
-    await setInvisible(container);
+    await addClassAndProcessLifecycle(container, "locked");
     let target = document.elementFromPoint(50, 50);
     t.step(() => assert_equals(target.id, "outer", "center hits outer"));
     target = document.elementFromPoint(10, 50);
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/hit-testing-003.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/hit-testing-003.html
similarity index 91%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/hit-testing-003.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/hit-testing-003.html
index 8e09f229..9dcf83f 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/hit-testing-003.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/hit-testing-003.html
@@ -27,6 +27,9 @@
   height: 50px;
   background lightgreen;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 <body id="body">
@@ -37,7 +40,7 @@
 async_test((t) => {
   async function runTest() {
     const container = document.getElementById("outer");
-    await setInvisible(container);
+    await addClassAndProcessLifecycle(container, "locked");
     let target = document.elementFromPoint(50, 50);
     t.step(() => assert_equals(target.id, "outer", "center hits outer"));
     target = document.elementFromPoint(10, 50);
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-crossorigin-iframe-doesnt-paint-contents-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-crossorigin-iframe-doesnt-paint-contents-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-crossorigin-iframe-doesnt-paint-contents-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-crossorigin-iframe-doesnt-paint-contents-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-crossorigin-iframe-doesnt-paint-contents.sub.https.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-crossorigin-iframe-doesnt-paint-contents.sub.https.html
similarity index 88%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-crossorigin-iframe-doesnt-paint-contents.sub.https.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-crossorigin-iframe-doesnt-paint-contents.sub.https.html
index 5137fc7..55d92a9 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-crossorigin-iframe-doesnt-paint-contents.sub.https.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-crossorigin-iframe-doesnt-paint-contents.sub.https.html
@@ -12,6 +12,9 @@
 div {
   background: blue;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 <div>lorem ipsum</div>
@@ -21,7 +24,7 @@
 <script>
 async function runTest() {
   const container = document.getElementById("frame");
-  await setInvisible(container);
+  await addClassAndProcessLifecycle(container, "locked");
   takeScreenshot();
 }
 
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-div-with-inline-children-doesnt-paint.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-div-with-inline-children-doesnt-paint.html
similarity index 85%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-div-with-inline-children-doesnt-paint.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-div-with-inline-children-doesnt-paint.html
index f122d9b..3aafb413 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-div-with-inline-children-doesnt-paint.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-div-with-inline-children-doesnt-paint.html
@@ -20,6 +20,9 @@
   width: 10px;
   height: 10px;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 The test passes if there's nothing below.
@@ -33,8 +36,8 @@
   const target1 = document.getElementById("target1");
   const target2 = document.getElementById("target2");
   let promises = [];
-  promises.push(setInvisible(target1));
-  promises.push(setInvisible(target2));
+  promises.push(addClassAndProcessLifecycle(target1, "locked"));
+  promises.push(addClassAndProcessLifecycle(target2, "locked"));
   await Promise.all(promises);
   takeScreenshot();
 }
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-iframe-doesnt-paint-contents-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-iframe-doesnt-paint-contents-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-iframe-doesnt-paint-contents-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-iframe-doesnt-paint-contents-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-iframe-doesnt-paint-contents.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-iframe-doesnt-paint-contents.html
similarity index 88%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-iframe-doesnt-paint-contents.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-iframe-doesnt-paint-contents.html
index 96648f1..64f15034 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-iframe-doesnt-paint-contents.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-iframe-doesnt-paint-contents.html
@@ -12,6 +12,9 @@
 div {
   background: blue;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 <div>lorem ipsum</div>
@@ -28,7 +31,7 @@
 <script>
 async function runTest() {
   const container = document.getElementById("frame");
-  await setInvisible(container);
+  await addClassAndProcessLifecycle(container, "locked");
   takeScreenshot();
 }
 
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-image-doesnt-paint-contents-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-image-doesnt-paint-contents-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-image-doesnt-paint-contents-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-image-doesnt-paint-contents-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-image-doesnt-paint-contents.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-image-doesnt-paint-contents.html
similarity index 80%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-image-doesnt-paint-contents.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-image-doesnt-paint-contents.html
index 522fa9b..99e0e67 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-image-doesnt-paint-contents.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-image-doesnt-paint-contents.html
@@ -18,6 +18,9 @@
   background: lightblue;
   border: 1px solid black;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 <div>lorem ipsum</div>
@@ -28,8 +31,8 @@
 <script>
 async function runTest() {
   const promises = [];
-  promises.push(setInvisible(document.getElementById("img1")));
-  promises.push(setInvisible(document.getElementById("img2")));
+  promises.push(addClassAndProcessLifecycle(document.getElementById("img1"), "locked"));
+  promises.push(addClassAndProcessLifecycle(document.getElementById("img2"), "locked"));
   await Promise.all(promises);
   takeScreenshot();
 }
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-svg-doesnt-paint-contents-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-svg-doesnt-paint-contents-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-svg-doesnt-paint-contents-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-svg-doesnt-paint-contents-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-svg-doesnt-paint-contents.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-svg-doesnt-paint-contents.html
similarity index 92%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-svg-doesnt-paint-contents.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-svg-doesnt-paint-contents.html
index 9935681..35fabae 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/locked-svg-doesnt-paint-contents.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/locked-svg-doesnt-paint-contents.html
@@ -16,6 +16,9 @@
   border: 1px solid black;
   background: lightblue;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 <div>lorem ipsum</div>
@@ -36,7 +39,7 @@
 <script>
 async function runTest() {
   const container = document.getElementById("svg");
-  await setInvisible(container);
+  await addClassAndProcessLifecycle(container, "locked");
   takeScreenshot();
 }
 
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/non-composited-lock-composited-descendant-001.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/non-composited-lock-composited-descendant-001.html
similarity index 89%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/non-composited-lock-composited-descendant-001.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/non-composited-lock-composited-descendant-001.html
index af08eb93..4fd42be 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/non-composited-lock-composited-descendant-001.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/non-composited-lock-composited-descendant-001.html
@@ -21,6 +21,9 @@
   background: lightgreen;
   color: green;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 The test passes if there's nothing below.
@@ -34,7 +37,7 @@
 <script>
 async function runTest() {
   const container = document.getElementById("outer");
-  await setInvisible(container);
+  await addClassAndProcessLifecycle(container, "locked");
   takeScreenshot();
 }
 
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/non-composited-lock-composited-descendant-002.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/non-composited-lock-composited-descendant-002.html
similarity index 86%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/non-composited-lock-composited-descendant-002.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/non-composited-lock-composited-descendant-002.html
index 406b125..db778eb 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/non-composited-lock-composited-descendant-002.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/non-composited-lock-composited-descendant-002.html
@@ -22,6 +22,9 @@
   background: lightgreen;
   color: green;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 </style>
 
 <div id="outer">
@@ -34,13 +37,13 @@
 <script>
 async function commitAndFinish() {
   const container = document.getElementById("outer");
-  await setVisible(container);
+  await removeClassAndProcessLifecycle(container, "locked");
   takeScreenshot();
 }
 
 async function runTest() {
   const container = document.getElementById("outer");
-  await setInvisible(container);
+  await addClassAndProcessLifecycle(container, "locked");
   requestAnimationFrame(commitAndFinish);
 }
 
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/non-composited-lock-composited-descendant-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/non-composited-lock-composited-descendant-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/non-composited-lock-composited-descendant-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/non-composited-lock-composited-descendant-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/pass-if-nothing-below-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/pass-if-nothing-below-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/pass-if-nothing-below-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/pass-if-nothing-below-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/resources/circles.svg b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/resources/circles.svg
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/resources/circles.svg
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/resources/circles.svg
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/resources/dice.png b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/resources/dice.png
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/resources/dice.png
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/resources/dice.png
Binary files differ
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/resources/frame.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/resources/frame.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/paint/resources/frame.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/paint/resources/frame.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/pass-container-with-child-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/pass-container-with-child-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/pass-container-with-child-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/pass-container-with-child-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/pass-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/pass-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/pass-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/pass-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/positioned-in-flex-in-locked.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/positioned-in-flex-in-locked.html
similarity index 85%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/positioned-in-flex-in-locked.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/positioned-in-flex-in-locked.html
index cb7dcb64..85c2d7a 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/positioned-in-flex-in-locked.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/positioned-in-flex-in-locked.html
@@ -14,6 +14,9 @@
   height: 100px;
   background: red;
 }
+.locked {
+  render-subtree: invisible skip-activation;
+}
 .contained { position: relative; }
 .flex { display: flex; }
 .abspos { position: absolute; }
@@ -33,8 +36,8 @@
   takeScreenshot();
 }
 
-function runTest() {
-  setInvisible(document.getElementById("target"));
+async function runTest() {
+  await addClassAndProcessLifecycle(document.getElementById("target"), "locked");
   finishTest("PASS");
 }
 
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/pseudo-elements-visible-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/pseudo-elements-visible-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/pseudo-elements-visible-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/pseudo-elements-visible-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/pseudo-elements-visible.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/pseudo-elements-visible.html
similarity index 81%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/pseudo-elements-visible.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/pseudo-elements-visible.html
index 441c4b4..0d98218 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/pseudo-elements-visible.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/pseudo-elements-visible.html
@@ -17,6 +17,9 @@
     content: "b";
     color: green;
   }
+  .locked {
+    render-subtree: invisible skip-activation;
+  }
 </style>
 <div id="log"></div>
 <div id="container" style="display:none;"></div>
@@ -33,7 +36,9 @@
   // Trigger reattachment in #container and the ::after pseudo element.
   container.classList.add("hasAfter");
   container.style = "";
-  setInvisible(container).then(() => { setVisible(container).then(() => {finishTest("PASS");});  });
+  addClassAndProcessLifecycle(container, "locked").then(() => {
+    removeClassAndProcessLifecycle(container, "locked").then(() => {finishTest("PASS");});
+  });
 }
 
 window.onload = runTest;
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/pseudo-elements.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/pseudo-elements.html
similarity index 86%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/pseudo-elements.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/pseudo-elements.html
index 5f0962d41..8675d236 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/pseudo-elements.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/pseudo-elements.html
@@ -17,6 +17,9 @@
     content: "b";
     color: green;
   }
+  .locked {
+    render-subtree: invisible skip-activation;
+  }
 </style>
 <div id="log"></div>
 <div id="container" style="display:none;"></div>
@@ -33,7 +36,7 @@
   // Trigger reattachment in #container and the ::after pseudo element.
   container.classList.add("hasAfter");
   container.style = "";
-  setInvisible(container).then(() => { finishTest("PASS");} );
+  addClassAndProcessLifecycle(container, "locked").then(() => { finishTest("PASS");} );
 }
 
 window.onload = runTest;
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/render-subtree-activated-cleared-by-script-no-style-change.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/render-subtree-activated-cleared-by-script-no-style-change.html
deleted file mode 100644
index 0911c00..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/render-subtree-activated-cleared-by-script-no-style-change.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>render-subtree activates, script clears the activated state</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-green-square-ref.html">
-<meta name="assert" content="resetSubtreeRendered causes the element to relock, even without any other style invalidations">
-<script src="/common/reftest-wait.js"></script>
-
-<style>
-.locked {
-  render-subtree: invisible skip-viewport-activation;
-}
-#target {
-  width: 100px;
-  height: 100px;
-  background: green;
-}
-</style>
-
-Test passes if there is a green square below.
-<div id=target class=locked>
-  This text should not be visible, and neither should the div below.
-  <div style="width: 100px; height: 100px; background: red"></div>
-</div>
-
-<div></div>
-
-<script>
-
-function runTest() {
-  document.getElementById("target").scrollIntoView();
-  requestAnimationFrame(() => {
-    document.getElementById("target").resetSubtreeRendered();
-    requestAnimationFrame(takeScreenshot);
-  });
-}
-
-window.onload = requestAnimationFrame(() => {
-  requestAnimationFrame(() => {
-    requestAnimationFrame(() => {
-      runTest();
-    });
-  });
-});
-
-</script>
-</html>
-
-
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/render-subtree-activated-cleared-by-script.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/render-subtree-activated-cleared-by-script.html
deleted file mode 100644
index 09050482..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/render-subtree-activated-cleared-by-script.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>render-subtree activates, then activation is cleared by script.</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-green-square-ref.html">
-<meta name="assert" content="resetSubtreeRendered clears the activated state">
-<script src="/common/reftest-wait.js"></script>
-
-<style>
-.locked {
-  render-subtree: invisible;
-}
-.locked-no-activation {
-  render-subtree: invisible skip-activation;
-}
-#target {
-  width: 100px;
-  height: 100px;
-  background: green;
-}
-</style>
-
-Test passes if there is a green square below.
-<div id=target>
-  This text should not be visible, and neither should the div below.
-  <div style="width: 100px; height: 100px; background: red"></div>
-</div>
-
-<div></div>
-
-<script>
-
-function runTest() {
-  document.getElementById("target").classList.add("locked");
-  requestAnimationFrame(() => {
-    // Replace locked with locked-no-activation, which shouldn't activate.
-    // Note we clear the activated flag, so this should actually lock the element.
-    document.getElementById("target").classList.remove("locked");
-    document.getElementById("target").resetSubtreeRendered();
-    document.getElementById("target").classList.add("locked-no-activation");
-    requestAnimationFrame(takeScreenshot);
-  });
-}
-
-window.onload = requestAnimationFrame(() => {
-  requestAnimationFrame(() => {
-    requestAnimationFrame(() => {
-      runTest();
-    });
-  });
-});
-
-</script>
-</html>
-
-
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/render-subtree-adds-containment.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/render-subtree-adds-containment.html
new file mode 100644
index 0000000..3bd9735
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/render-subtree-adds-containment.html
@@ -0,0 +1,63 @@
+<!doctype HTML>
+<html>
+<meta charset="utf8">
+<title>Display Locking: rendersubtree adds containment</title>
+<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
+<link rel="help" href="https://github.com/WICG/display-locking">
+
+<style>
+.activatable {
+  render-subtree: invisible;
+}
+.nonactivatable {
+  render-subtree: invisible skip-activation;
+}
+</style>
+<div id="container"></div>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../resources/utils.js"></script>
+
+<script>
+function setUp() {
+  container.removeAttribute("rendersubtree");
+  container.style = "";
+  container.classList = "";
+  assert_equals(getComputedStyle(container).contain, "none");
+}
+
+test(() => {
+  setUp();
+  container.classList.add("nonactivatable");
+  assert_equals(getComputedStyle(container).contain, "size layout style");
+}, "render-subtree:'invisible skip-activation' adds contain: size layout style;");
+
+test(() => {
+  setUp();
+  container.classList.add("activatable");
+  assert_equals(getComputedStyle(container).contain, "size layout style");
+}, "render-subtree:'invisible' adds contain: size layout style;");
+
+test(() => {
+  setUp();
+  container.classList.add("activatable");
+  container.style = "contain: style;";
+  assert_equals(getComputedStyle(container).contain, "size layout style");
+  container.style = "contain: style layout;";
+  assert_equals(getComputedStyle(container).contain, "size layout style");
+  container.style = "";
+  assert_equals(getComputedStyle(container).contain, "size layout style");
+}, "render-subtree:invisible adds contain: size layout style, can't be overridden");
+
+test(() => {
+  setUp();
+  container.classList.add("activatable");
+  container.style = "contain: paint;";
+  assert_equals(getComputedStyle(container).contain, "size layout style paint");
+  container.style = "contain: strict;";
+  assert_equals(getComputedStyle(container).contain, "size layout style paint");
+  container.style = "contain: content;";
+  assert_equals(getComputedStyle(container).contain, "size layout style paint");
+}, "rendersubtree adds contain: size layout style and keeps paint if it exists");
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/resize-observer-skipped.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/resize-observer-skipped.html
similarity index 84%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/resize-observer-skipped.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/resize-observer-skipped.html
index e44d7f3..d305b03b 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/resize-observer-skipped.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/resize-observer-skipped.html
@@ -5,6 +5,11 @@
 <link rel="author" title="Chris Harrelson" href="mailto:chrishtr@chromium.org">
 <link rel="help" href="https://github.com/WICG/display-locking">
 
+<style>
+.locked {
+  render-subtree: invisible skip-activation;
+}
+</style>
 <div id="container">
   <div id="resize" style="width: 50px; height: 50px">
   </div>
@@ -34,7 +39,7 @@
     didCallback = false;
 
     const container = document.getElementById("container");
-    await setInvisible(container);
+    await addClassAndProcessLifecycle(container, "locked");
 
     // Change the size of #resize. This should cause a resize observation, but
     // only when the element becomes unlocked.
@@ -45,16 +50,15 @@
 
   async function step3() {
     assert_equals(false, didCallback,
-        'ResizeObsever should not run during updateRendering while also invisible');
-
-    await container.updateRendering();
+        'ResizeObsever should not run during while invisible');
     requestAnimationFrame(step4);
   }
 
   async function step4() {
     assert_equals(false, didCallback,
         'ResizeObsever should not run while invisible');
-    await setVisible(container);
+    const container = document.getElementById("container");
+    await removeClassAndProcessLifecycle(container, "locked");
     requestAnimationFrame(step5);
   }
 
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/resources/utils.js b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/resources/utils.js
new file mode 100644
index 0000000..85f49e9
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/resources/utils.js
@@ -0,0 +1,21 @@
+function addClassAndProcessLifecycle(element, value) {
+  element.classList.add(value);
+  return new Promise((resolve, reject) => {
+    // Returns a promise that resolves when the rendering changes take effect.
+    // TODO(rakina): Change to requestPostAnimationFrame when available?
+    requestAnimationFrame(() => {
+      requestAnimationFrame(resolve);
+    });
+  });
+}
+
+function removeClassAndProcessLifecycle(element, value) {
+  element.classList.remove(value);
+  return new Promise((resolve, reject) => {
+    // Returns a promise that resolves when the rendering changes take effect.
+    // TODO(rakina): Change to requestPostAnimationFrame when available?
+    requestAnimationFrame(() => {
+      requestAnimationFrame(resolve);
+    });
+  });
+}
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/scroll-to-child-and-adopt.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/scroll-to-child-and-adopt.html
similarity index 87%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/scroll-to-child-and-adopt.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/scroll-to-child-and-adopt.html
index 3ffff67..4f4d8a8 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/scroll-to-child-and-adopt.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/scroll-to-child-and-adopt.html
@@ -8,6 +8,11 @@
 <script src="/common/reftest-wait.js"></script>
 <script src="resources/utils.js"></script>
 
+<style>
+.locked {
+  render-subtree: invisible skip-activation;
+}
+</style>
 <div id=log></div>
 <div id=container>
     <div id=child></div>
@@ -27,7 +32,7 @@
 }
 
 async function runTest() {
-  await setInvisible(container);
+  await addClassAndProcessLifecycle(container, "locked");
   requestAnimationFrame(moveChild);
 }
 
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/selection-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/selection-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/selection-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/selection-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/selection-shadow-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/selection-shadow-ref.html
similarity index 100%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/selection-shadow-ref.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/selection-shadow-ref.html
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/slotted-moved-after-lock.html b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/slotted-moved-after-lock.html
similarity index 81%
rename from third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/slotted-moved-after-lock.html
rename to third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/slotted-moved-after-lock.html
index 42e0809..16071b7 100644
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/slotted-moved-after-lock.html
+++ b/third_party/blink/web_tests/wpt_internal/display-lock/css-render-subtree/slotted-moved-after-lock.html
@@ -15,10 +15,11 @@
   let container = document.createElement("div");
   container.innerHTML = "<slot></slot>";
   let shadowRoot = host.attachShadow({ mode: "open" });
+  shadowRoot.innerHTML = "<style>.locked { render-subtree: invisible skip-activation }</style>";
   shadowRoot.appendChild(container);
 
-  t.step(() => {
-    setInvisible(container);
+  t.step(async () => {
+    await addClassAndProcessLifecycle(container, "locked");
 
     assert_equals(slotted.offsetTop, 0);
     container.innerHTML = "<div style='height: 20px;'></div><slot></slot>";
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-clone.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-clone.html
deleted file mode 100644
index ccb8060..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-clone.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: acquire on a clone</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<script src="resources/utils.js"></script>
-<style>
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-#child {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-</style>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-<script>
-async_test((t) => {
-  async function runTest() {
-    const container = document.createElement("div");
-    // Lock the container, put a child into it and put it into the document.
-    await setInvisible(container).then(() => {
-      const child = document.createElement("div");
-      child.id = "child";
-      container.appendChild(child);
-
-      container.id = "container";
-      document.body.appendChild(container);
-    });
-    // Make a copy of the container and put it in the document as well.
-    const cloned = container.cloneNode(true);
-    document.body.appendChild(cloned);
-
-    t.step(() => {
-      assert_equals(container.renderSubtree, cloned.renderSubtree);
-      t.done();
-    });
-  }
-  window.onload = runTest;
-});
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-immediate-commit-resolves.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-immediate-commit-resolves.html
deleted file mode 100644
index a2747980..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-immediate-commit-resolves.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire, immediate commit</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-container-with-child-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-#child {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-</style>
-
-<div id="log"></div>
-<div id="container"></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.getElementById("container");
-  setInvisible(container);
-
-  const child = document.createElement("div");
-  child.id = "child";
-  container.appendChild(child);
-
-  setVisible(container).then(
-    () => { finishTest("PASS"); },
-    (e) => { finishTest("FAIL " + e.message); });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-in-iframe.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-in-iframe.html
deleted file mode 100644
index a6507310..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-in-iframe.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire in iframe</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="acquire-in-iframe-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<div id="log"></div>
-<iframe id="frame" srcdoc='
-  <style>
-  #container {
-    width: 100px;
-    height: 100px;
-  }
-  </style>
-  <div id="container">Lorem</div>
-'></iframe>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.getElementById("frame").contentDocument.getElementById("container");
-  setInvisible(container).then(
-    () => { finishTest("PASS"); },
-    (e) => { finishTest("FAIL " + e.message); });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-infinite-timeout-no-commit.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-infinite-timeout-no-commit.html
deleted file mode 100644
index ed7659bf..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-infinite-timeout-no-commit.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire infinite timeout</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#container {
-  width: 100px;
-  height: 100px;
-}
-</style>
-
-<div id="log"></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.createElement("div");
-  container.id = "container";
-  setInvisible(container).then(() => {
-    document.body.appendChild(container);
-    setTimeout(() => { finishTest("PASS"); }, 100);
-  });
-}
-
-window.onload = runTest;
-</script>
-
-
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-on-display-contents.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-on-display-contents.html
deleted file mode 100644
index c1c9ee1..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-on-display-contents.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: acquire, display:contents</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/utils.js"></script>
-
-<body></body>
-<script>
-// TODO(vmpstr): Add tests for display:contents, slot, which cannot be locked.
-
-async_test(async (t) => {
-  let slot = document.createElement("slot");
-  slot.style = "display: block;";
-  document.body.appendChild(slot);
-  await setInvisible(slot).then(() => {
-    t.step(() => assert_equals(slot.renderSubtree, INVISIBLE_NOT_ACTIVATABLE));
-    t.done();
-  });
-}, "<slot> with changed display type can be locked");
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-commit.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-commit.html
deleted file mode 100644
index bb1c597..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-commit.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire, update, commit</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-container-with-child-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-#child {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-</style>
-
-<div id="log"></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.createElement("div");
-  setInvisible(container).then(() => {
-    const child = document.createElement("div");
-    child.id = "child";
-    container.appendChild(child);
-
-    container.id = "container";
-    document.body.appendChild(container);
-
-    container.updateRendering().then(() => {
-      setVisible(container).then(
-        () => { finishTest("PASS"); },
-        (e) => { finishTest("FAIL " + e.message); });
-    });
-  });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-disconnect-commit.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-disconnect-commit.html
deleted file mode 100644
index 2deff68..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-disconnect-commit.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire, update, disconnect, commit</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-#child {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-</style>
-
-<div id="log"></div>
-<div id="container"></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.getElementById("container");
-  setInvisible(container).then(() => {
-    // Update, then disconnect the element, and commit.
-    const update_promise = container.updateRendering();
-    container.remove();
-    const commit_promise = setVisible(container);
-
-    // The update promise should reject and commit one should succeed.
-    Promise.all([
-      new Promise((resolve, reject) => update_promise.then(reject, resolve)),
-      commit_promise
-    ]).then(
-      () => finishTest("PASS"),
-      () => finishTest("FAIL"));
-  });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-measure-remove-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-measure-remove-ref.html
deleted file mode 100644
index 9ba0a916..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-measure-remove-ref.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!doctype html>
-<html>
-<meta charset="utf8">
-<title>Display Locking: acquire, update, measure, remove (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#spacer {
-  width: 150px;
-  height: 150px;
-  background: green;
-}
-</style>
-
-<div id="spacer"></div>
-<div id="log">0 20 40 8 8</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-measure-remove.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-measure-remove.html
deleted file mode 100644
index 12619839..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-measure-remove.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire, update, measure, remove</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="acquire-update-measure-remove-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#container {
-  background: lightgreen;
-}
-#sizer {
-  width: 100px;
-  height: 100px;
-}
-.child {
-  width: 20px;
-  height: 20%;
-  background: cyan;
-}
-#empty {
-  background: red;
-  width: max-style layout;
-}
-#spacer {
-  width: 150px;
-  height: 150px;
-  background: green;
-}
-</style>
-
-<div id="empty"></div>
-<div id="spacer"></div>
-<div id="log"></div>
-
-<script>
-function measureAndRemove() {
-  const log = document.getElementById("log");
-  log.innerHTML += "" + document.getElementById("0").offsetTop;
-  log.innerHTML += " " + document.getElementById("1").offsetTop;
-  log.innerHTML += " " + document.getElementById("2").offsetTop;
-  log.innerHTML += " " + document.getElementById("empty").offsetTop;
-  log.innerHTML += " " + document.getElementById("spacer").offsetTop;
-  document.getElementById("container").remove();
-}
-
-function createChild(id) {
-  const child = document.createElement("div");
-  child.classList = "child";
-  child.id = id;
-  return child;
-}
-
-function construct(container) {
-  const sizer = document.createElement("div");
-  sizer.id = "sizer";
-  container.appendChild(sizer);
-  sizer.appendChild(createChild("0"));
-  sizer.appendChild(createChild("1"));
-  sizer.appendChild(createChild("2"));
-}
-
-function runTest() {
-  const container = document.createElement("div");
-  container.id = "container";
-  setInvisible(container).then(() => {
-    construct(container);
-    document.getElementById("empty").appendChild(container);
-    container.updateRendering().then(measureAndRemove).then(takeScreenshot);
-  });
-}
-
-window.onload = runTest;
-</script>
-
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-remove-commit-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-remove-commit-ref.html
deleted file mode 100644
index 0650cf1..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-remove-commit-ref.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: acquire, update, remove, commit (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#container {
-  contain: style layout;
-  width: 100px;
-  height: 100px;
-  background: lightblue;
-}
-</style>
-
-<div id="log">PASS Element is disconnected.</div>
-<div id="container"></div>
-
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-remove-commit.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-remove-commit.html
deleted file mode 100644
index 02357efb..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-remove-commit.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire, update, remove, commit</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="acquire-update-remove-commit-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#container {
-  width: 100px;
-  height: 100px;
-  background: lightblue;
-}
-</style>
-
-<div id="log"></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.createElement("div");
-  container.id = "container";
-
-  setInvisible(container).then(() => {
-    document.body.appendChild(container);
-    container.updateRendering().then(
-      () => { finishTest("FAIL"); },
-      (e) => {
-        document.body.appendChild(container);
-        finishTest("PASS " + e.message);
-      });
-    container.remove();
-    setVisible(container);
-  });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-remove-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-remove-ref.html
deleted file mode 100644
index 646c605..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-remove-ref.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: acquire, update, remove (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<div id="log">PASS Element is disconnected.</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-remove.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-remove.html
deleted file mode 100644
index 099e016..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/acquire-update-remove.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire, update, remove</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="acquire-update-remove-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#container {
-  width: 100px;
-  height: 100px;
-  background: lightblue;
-}
-</style>
-
-<div id="log"></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.createElement("div");
-  container.id = "container";
-
-  setInvisible(container).then(() => {
-    document.body.appendChild(container);
-    container.updateRendering().then(
-      () => { finishTest("FAIL"); },
-      (e) => { finishTest("PASS " + e.message); });
-    container.remove();
-  });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/activate-commit-same-frame.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/activate-commit-same-frame.html
deleted file mode 100644
index b43e9257..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/activate-commit-same-frame.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: activate commit same frame</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-.spacer {
-  width: 150px;
-  height: 3000px;
-  background: lightblue;
-}
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightgreen;
-}
-#target {
-  width: 100px;
-  height: 100px;
-  background: green;
-}
-</style>
-
-<div class="spacer"></div>
-<div id="container"><div id="target"></div></div>
-
-<script>
-async_test((t) => {
-  async function runTest() {
-    let container = document.getElementById("container");
-
-    let acquire_promise = setInvisibleActivatable(container);
-    await acquire_promise;
-
-    target.scrollIntoView();
-    let commit_promise = setVisible(container);
-    await commit_promise;
-
-    t.step(() => assert_equals(container.renderSubtree, "", "context after commit & activation is unlocked"));
-    t.done();
-  }
-
-  window.onload = function() {
-    requestAnimationFrame(() => requestAnimationFrame(runTest));
-  };
-}, "scrollIntoView and committing on the same frame should work");
-
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/activate-update-same-frame.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/activate-update-same-frame.html
deleted file mode 100644
index b43e5ad..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/activate-update-same-frame.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: activate update same frame</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-.spacer {
-  width: 150px;
-  height: 3000px;
-  background: lightblue;
-}
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightgreen;
-}
-#target {
-  width: 100px;
-  height: 100px;
-  background: green;
-}
-</style>
-
-<div class="spacer"></div>
-<div id="container"><div id="target"></div></div>
-
-<script>
-async_test((t) => {
-  async function runTest() {
-    let container = document.getElementById("container");
-
-    let acquire_promise = setInvisibleActivatable(container);
-    await acquire_promise;
-
-    target.scrollIntoView();
-    let update_promise = container.updateRendering();
-    await update_promise;
-    t.step(() => assert_equals(container.renderSubtree, "", "context after update & activation is unlocked"));
-    t.done();
-  }
-
-  window.onload = function() {
-    requestAnimationFrame(() => requestAnimationFrame(runTest));
-  };
-}, "scrollIntoView and updating on the same frame should work");
-
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/anchor-links-ancestor.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/anchor-links-ancestor.html
deleted file mode 100644
index 5a8b0787..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/anchor-links-ancestor.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: anchor links via click</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../resources/utils.js"></script>
-<div id=spacer style="height: 3000px"></div>
-<div id="outermost">
-  Outermost
-  <div id="outer">
-    Outer
-    <div id="inner">
-      Inner
-      <div id="innermost">
-        Innermost
-      </div>
-    </div>
-  </div>
-</div>
-<a id="innermostLink" href ="#innermost">Click</a>
-<script>
-'use strict';
-function prepareTest() {
-  return Promise.all([
-    setInvisibleActivatable(outer),
-    setInvisibleActivatable(inner)
-  ]);
-}
-
-promise_test(() => {
-  return new Promise((resolve, reject) => {
-    prepareTest().then(() => {
-      assert_equals(outermost.renderSubtree, "");
-      assert_equals(outer.renderSubtree, INVISIBLE_ACTIVATABLE);
-      assert_equals(inner.renderSubtree, INVISIBLE_ACTIVATABLE);
-      assert_equals(innermost.renderSubtree, "");
-
-      let innerPromise = new Promise((resolve, reject) => {
-        inner.onrendersubtreeactivation = (e) => {
-          assert_equals(e.activatedElement, innermost);
-          resolve();
-        }
-      });
-
-      let outerPromise = new Promise((resolve, reject) => {
-        outer.onrendersubtreeactivation = (e) => {
-          assert_equals(e.activatedElement, innermost);
-          // Resolve if this is directly targeted to #outer,
-          // instead of bubbling here.
-          if (e.target == outer)
-            resolve();
-        }
-      });
-
-      let outermostPromise = new Promise((resolve, reject) => {
-        outermost.onrendersubtreeactivation = (e) => {
-          assert_equals(e.activatedElement, innermost);
-          assert_not_equals(e.target, outermost);
-          // Resolve if this is targeted to #outer, which is
-          // dispatched after the event targeted to #inner.
-          if (e.target == outer)
-            resolve();
-        }
-      });
-
-      innermost.onrendersubtreeactivation = reject;
-      // Navigating to element in locked subtree should fire rendersubtreeactivation
-      // on locked ancestors, but not itself.
-      innermostLink.click();
-      Promise.all([innerPromise, outerPromise, outermostPromise]).then(resolve);
-    });
-  });
-}, "Activation through anchor link fires rendersubtreeactivation on locked ancestor");
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/anchor-links.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/anchor-links.html
deleted file mode 100644
index ed2218d..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/anchor-links.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: anchor links</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../resources/utils.js"></script>
-<div id="outer">
-  Outer
-  <div id="inner">
-    Inner
-    <div id="innermost">
-      Innermost
-    </div>
-  </div>
-</div>
-<a id="innerLink" href="#inner">Click</a>
-<a id="innermostLink" href ="#innermost">Click</a>
-<script>
-'use strict';
-function prepareTest() {
-  innermost.onrendersubtreeactivation = inner.onrendersubtreeactivation = outer.onrendersubtreeactivation = null;
-  return Promise.all([
-    setInvisibleActivatable(outer),
-    setInvisibleActivatable(inner)]);
-}
-
-promise_test(() => {
-  return new Promise((resolve, reject) => {
-    prepareTest().then(() => {
-      assert_equals(inner.renderSubtree, INVISIBLE_ACTIVATABLE);
-      inner.onrendersubtreeactivation = (e) => {
-        assert_equals(e.activatedElement, inner);
-        resolve();
-      }
-      innerLink.click();
-    });
-  });
-}, "Activation through anchor link fires rendersubtreeactivation on locked element");
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus-next-updated-style.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus-next-updated-style.html
deleted file mode 100644
index ba3cfad9..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/focus-next-updated-style.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: focus on skipped element</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<script src="../resources/utils.js"></script>
-
-<!--
-Focus on a div that has updated style/layout.
--->
-
-<div id="container">
-  <div id="focusableA" tabindex="0">a</div>
-  <div id="focusableB" tabindex="0">b</div>
-</div>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-<script>
-promise_test((t) => {
-  const acquirePromise = setInvisibleActivatable(container);
-  return new Promise((resolve, reject) => {
-    acquirePromise.then(() => {
-      focusableA.style = "display: none;";
-      eventSender.keyDown("Tab", []);
-      t.step(() => assert_equals(document.activeElement, focusableB));
-      eventSender.keyDown("Tab", []);
-      t.step(() => assert_equals(document.activeElement, focusableB));
-      focusableA.style = "display: block;";
-      eventSender.keyDown("Tab", []);
-      t.step(() => assert_equals(document.activeElement, focusableA));
-      resolve();
-    });
-  });
-}, "Trying to focus on an element in a locked subtree that's not visible anymore will skip that element");
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/scroll-into-view-beforeactivate.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/scroll-into-view-beforeactivate.html
deleted file mode 100644
index 77b380f6..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/scroll-into-view-beforeactivate.html
+++ /dev/null
@@ -1,78 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: scrollIntoView event</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../resources/utils.js"></script>
-<div id=spacer style="height: 3000px"></div>
-<div id="outermost">
-  Outermost
-  <div id="outer">
-    Outer
-    <div id="inner">
-      Inner
-      <div id="innermost">
-        Innermost
-      </div>
-    </div>
-  </div>
-</div>
-<script>
-'use strict';
-function prepareTest() {
-  return Promise.all([
-    setInvisibleActivatable(outer),
-    setInvisibleActivatable(inner)
-  ]);
-}
-
-promise_test(() => {
-  return new Promise((resolve, reject) => {
-    prepareTest().then(() => {
-      assert_equals(outermost.renderSubtree, "");
-      assert_equals(outer.renderSubtree, INVISIBLE_ACTIVATABLE);
-      assert_equals(inner.renderSubtree, INVISIBLE_ACTIVATABLE);
-      assert_equals(innermost.renderSubtree, "");
-
-      let innerPromise = new Promise((resolve, reject) => {
-        inner.onrendersubtreeactivation = (e) => {
-          assert_equals(e.activatedElement, innermost);
-          resolve();
-        }
-      });
-
-      let outerPromise = new Promise((resolve, reject) => {
-        outer.onrendersubtreeactivation = (e) => {
-          assert_equals(e.activatedElement, innermost);
-          // Resolve if this is directly targeted to #outer,
-          // instead of bubbling here.
-          if (e.target == outer)
-            resolve();
-        }
-      });
-
-      let outermostPromise = new Promise((resolve, reject) => {
-        outermost.onrendersubtreeactivation = (e) => {
-          assert_equals(e.activatedElement, innermost);
-          assert_not_equals(e.target, outermost);
-          // Resolve if this is targeted to #outer, which is
-          // dispatched after the event targeted to #inner.
-          if (e.target == outer)
-            resolve();
-        }
-      });
-
-      innermost.onrendersubtreeactivation = reject;
-      // Navigating to element in locked subtree should fire rendersubtreeactivation
-      // on locked ancestors, but not itself.
-      innermost.scrollIntoView();
-      Promise.all([innerPromise, outerPromise, outermostPromise]).then(resolve);
-    });
-  });
-}, "Activation through scrollIntoView fires rendersubtreeactivation on locked ancestor");
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/scroll-into-view-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/scroll-into-view-ref.html
deleted file mode 100644
index ce0e0b6..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/scroll-into-view-ref.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: scrollIntoView (reference)</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<script src="/common/reftest-wait.js"></script>
-
-<style>
-.spacer {
-  width: 150px;
-  height: 3000px;
-  background: lightblue;
-}
-#container {
-  contain: style layout;
-  width: 150px;
-  height: 150px;
-  background: lightgreen;
-}
-#target {
-  width: 100px;
-  height: 100px;
-  background: green;
-}
-</style>
-
-<div class="spacer"></div>
-<div id="container"><div id="target"></div></div>
-
-<script>
-function runTest() {
-  document.getElementById("target").scrollIntoView();
-  requestAnimationFrame(takeScreenshot);
-}
-
-window.onload = () => { requestAnimationFrame(runTest); };
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/scroll-into-view.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/scroll-into-view.html
deleted file mode 100644
index 4442db5..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/scroll-into-view.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: scrollIntoView</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="scroll-into-view-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-.spacer {
-  width: 150px;
-  height: 3000px;
-  background: lightblue;
-}
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightgreen;
-}
-#target {
-  width: 100px;
-  height: 100px;
-  background: green;
-}
-</style>
-
-<div class="spacer"></div>
-<div id="container"><div id="target"></div></div>
-
-<script>
-function runTest() {
-  const container = document.getElementById("container");
-  setInvisibleActivatable(container).then(() => {
-    document.getElementById("target").scrollIntoView();
-    requestAnimationFrame(takeScreenshot);
-  });
-}
-
-window.onload = () => { requestAnimationFrame(runTest); };
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/scroll.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/scroll.html
deleted file mode 100644
index 0170d33..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/scroll.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: scroll / viewport intersections activate locked element</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../resources/utils.js"></script>
-
-<div id=visible rendersubtree="invisible">text</div>
-<div id=spacer style="height: 3000px">text</div>
-<div id=target rendersubtree="invisible">text</div>
-
-<script>
-promise_test(() => {
-  return new Promise((resolve, reject) => {
-    requestAnimationFrame(() => {
-      requestAnimationFrame(() => {
-        assert_equals(visible.renderSubtree, "", "visible activated");
-        window.scrollBy(0, 3000);
-        requestAnimationFrame(() => {
-          assert_equals(target.renderSubtree, "", "target activated");
-          resolve();
-        });
-      });
-    });
-  });
-}, "Scroll activates elements");
-</script>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/selection.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/selection.html
deleted file mode 100644
index 5336162..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/selection.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: selection activates locked element</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../resources/utils.js"></script>
-
-<div id="container">
-foo
-  <div id="nonActivatable">
-    bleh
-  </div>
-  <div id="nested">
-    bar
-  </div>
-</div>
-
-<script>
-promise_test(() => {
-  const acquirePromise = Promise.all(
-    [setInvisibleActivatable(container),
-     setInvisible(nonActivatable),
-     setInvisibleActivatable(nested)
-    ]);
-  return new Promise((resolve, reject) => {
-    acquirePromise.then(() => {
-      window.getSelection().selectAllChildren(container);
-      assert_equals(window.getSelection().toString(), "foo\nbar");
-      assert_equals(container.renderSubtree, "");
-      assert_equals(nonActivatable.renderSubtree, INVISIBLE_NOT_ACTIVATABLE);
-      assert_equals(nested.renderSubtree, "");
-      resolve();
-    });
-  });
-}, "Activating locked element through selection activates activatable elements");
-</script>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/viewport-activation-margin.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/viewport-activation-margin.html
deleted file mode 100644
index 46ccdcf3..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/activation/viewport-activation-margin.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: scroll / viewport intersections activate locked element</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../resources/utils.js"></script>
-
-<div id=target rendersubtree="invisible skip-activation">text</div>
-<div id=spacer style="height: 3000px">text</div>
-
-<script>
-promise_test(() => {
-  return new Promise((resolve, reject) => {
-    requestAnimationFrame(() => {
-      requestAnimationFrame(() => {
-        window.scrollBy(0, window.innerHeight / 2 - 10);
-        setInvisibleActivatable(target).then(() => {
-          if (target.renderSubtree === "")
-            resolve();
-          else
-            reject("target did not activate");
-        });
-      });
-    });
-  });
-}, "Viewport activated elements have margin");
-</script>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/attribute/values.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/attribute/values.html
deleted file mode 100644
index 559c926..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/attribute/values.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<title>Tests rendersubtree attribute values</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../resources/utils.js"></script>
-
-<script>
-test(() => {
-  const element = document.createElement("div");
-
-  element.setAttribute("rendersubtree", INVISIBLE_ACTIVATABLE);
-  assert_equals(element.getAttribute("rendersubtree"), INVISIBLE_ACTIVATABLE);
-  assert_equals(element.renderSubtree, INVISIBLE_ACTIVATABLE);
-
-  element.setAttribute("rendersubtree", INVISIBLE_NOT_ACTIVATABLE);
-  assert_equals(element.getAttribute("rendersubtree"), INVISIBLE_NOT_ACTIVATABLE);
-  assert_equals(element.renderSubtree, INVISIBLE_NOT_ACTIVATABLE);
-
-  element.setAttribute("rendersubtree", "not-visible");
-  assert_equals(element.getAttribute("rendersubtree"), "not-visible");
-  assert_equals(element.renderSubtree, "not-visible");
-
-  element.setAttribute("rendersubtree", "");
-  assert_equals(element.getAttribute("rendersubtree"), "");
-  assert_equals(element.renderSubtree, "");
-
-  element.setAttribute("rendersubtree", "foo  bar");
-  assert_equals(element.getAttribute("rendersubtree"), "foo  bar");
-  assert_equals(element.renderSubtree, "foo  bar");
-
-  element.setAttribute("rendersubtree", "visible");
-  assert_equals(element.getAttribute("rendersubtree"), "visible");
-  assert_equals(element.renderSubtree, "visible");
-}, "Values on the attribute are saved and reflected as is");
-</script>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/audio-element-crash.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/audio-element-crash.html
deleted file mode 100644
index b1fbc6c..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/audio-element-crash.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype HTML>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="parent">
-    <div id="invisible"></div>
-</div>
-<audio id="audioEl" controls="controls">
-</audio>
-<script>
-let t = async_test('Does not crash');
-let audioEl = document.querySelector('#audioEl');
-function boom1() {
-  audioEl.setAttribute("rendersubtree", "invisible");
-  audioEl.src = "x";
-}
-
-function boom2() {
-  invisible.setAttribute("rendersubtree", "invisible");
-  document.caretRangeFromPoint(1, 2);
-  document.body.appendChild(audioEl);
-  t.done();
-}
-
-onload = () => {
-  parent.addEventListener("DOMSubtreeModified", boom1);
-  setTimeout(boom2, 200);
-};
-</script>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-immediate-acquire-resolves-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-immediate-acquire-resolves-ref.html
deleted file mode 100644
index d55ac961..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-immediate-acquire-resolves-ref.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: commit, quick acquire (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#container {
-  contain: style layout;
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-</style>
-
-<div id="log">PASS</div>
-<div id="container"></div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-immediate-acquire.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-immediate-acquire.html
deleted file mode 100644
index b6e0646c..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-immediate-acquire.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: commit, quick acquire</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="commit-immediate-acquire-resolves-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-#child {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-</style>
-
-<div id="log"></div>
-<div id="container"></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.getElementById("container");
-  setInvisible(container).then(() => {
-    setVisible(container);
-    setInvisible(container).then(() => {
-      setVisible(container).then(() => {
-        finishTest("PASS");
-      });
-    });
-  });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-while-disconnected-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-while-disconnected-ref.html
deleted file mode 100644
index 70d99e1..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-while-disconnected-ref.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: commit while disconnected (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#container {
-  contain: style layout;
-  width: 100px;
-  height: 100px;
-  background: lightblue;
-}
-</style>
-
-<div id="log">PASS</div>
-<div id="container"></div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-while-disconnected.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-while-disconnected.html
deleted file mode 100644
index 60f9fbae..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-while-disconnected.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: commit while disconnected</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="commit-while-disconnected-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#container {
-  width: 100px;
-  height: 100px;
-  background: lightblue;
-}
-</style>
-
-<div id="log"></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.createElement("div");
-  container.id = "container";
-
-  setInvisible(container).then(() => {
-    setVisible(container).then(() => {
-        document.body.appendChild(container);
-        finishTest("PASS");
-      },
-      (e) => { finishTest("FAIL " + e.message); });
-  });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-without-acquire-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-without-acquire-ref.html
deleted file mode 100644
index 2a9e5677..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-without-acquire-ref.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: commit without acquire (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#container {
-  contain: style layout;
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-</style>
-
-<div id="log">PASS</div>
-<div id="container"></div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-without-acquire.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-without-acquire.html
deleted file mode 100644
index 5a661db..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/commit-without-acquire.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: commit without acquire</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="commit-without-acquire-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-#child {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-</style>
-
-<div id="log"></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.createElement("div");
-  container.id = "container";
-  setVisible(container).then(
-      () => { finishTest("PASS"); },
-      (e) => { finishTest("FAIL " + e.message); });
-  document.body.appendChild(container);
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/acquire-changed-containment.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/acquire-changed-containment.html
deleted file mode 100644
index 13bec941..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/acquire-changed-containment.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!doctype html>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire, containment changes</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-containment-added-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-#child {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-</style>
-
-<div id="log"></div>
-<div id="container" style="contain: style layout;"><div id="child" style="display: none;"></div></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.getElementById("container");
-  // Recalc child and container when acquiring.
-  container.style = "";
-  child.style = "";
-  setInvisible(container).then(
-    () => { finishTest("PASS, contain: " + getComputedStyle(container).contain ); });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/acquire-on-no-containment.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/acquire-on-no-containment.html
deleted file mode 100644
index 90b9cd4..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/acquire-on-no-containment.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire, no containment</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-containment-added-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-</style>
-
-<div id="log"></div>
-<div id="container"></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.getElementById("container");
-  setInvisible(container).then(() => {
-    finishTest("PASS, contain: " + getComputedStyle(container).contain);
-  });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/acquire-only-style-containment.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/acquire-only-style-containment.html
deleted file mode 100644
index 2001cdd0..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/acquire-only-style-containment.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!doctype html>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire, containment got overridden</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-containment-added-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-  contain: style;
-}
-#child {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-</style>
-
-<div id="log"></div>
-<div id="container"><div id="child"></div></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.getElementById("container");
-  setInvisible(container).then(() => {
-    finishTest("PASS, contain: " + getComputedStyle(container).contain );
-  });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/acquire-overridden-containment.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/acquire-overridden-containment.html
deleted file mode 100644
index 07b97be..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/acquire-overridden-containment.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!doctype html>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire, containment got overridden</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-containment-added-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-#child {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-</style>
-
-<div id="log"></div>
-<div id="container" style="contain: style layout;"><div id="child"></div></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.getElementById("container");
-  setInvisible(container).then(
-    () => { finishTest("PASS, contain: " + getComputedStyle(container).contain ); });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/pass-containment-added-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/pass-containment-added-ref.html
deleted file mode 100644
index 6ed199df..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/pass-containment-added-ref.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: pass, added containment (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-</style>
-
-<div id="log">PASS, contain: size layout style</div>
-<div id="container"></div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/rendersubtree-adds-containment.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/rendersubtree-adds-containment.html
deleted file mode 100644
index e2f09e4..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/containment/rendersubtree-adds-containment.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: rendersubtree adds containment</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<div id="container"></div>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../resources/utils.js"></script>
-
-<script>
-function setUp() {
-  container.removeAttribute("rendersubtree");
-  container.style = "";
-  assert_equals(getComputedStyle(container).contain, "none");
-}
-
-test(() => {
-  setUp();
-  container.setAttribute("rendersubtree", INVISIBLE_NOT_ACTIVATABLE);
-  assert_equals(getComputedStyle(container).contain, "size layout style");
-}, "rendersubtree='invisible skip-activation' adds contain: size layout style;");
-
-test(() => {
-  setUp();
-  container.setAttribute("rendersubtree", INVISIBLE_ACTIVATABLE);
-  assert_equals(getComputedStyle(container).contain, "size layout style");
-}, "rendersubtree='invisible' adds contain: size layout style;");
-
-test(() => {
-  setUp();
-  container.setAttribute("rendersubtree", "InVisible");
-  assert_equals(getComputedStyle(container).contain, "size layout style");
-}, "rendersubtree=InVisible adds contain: size layout style;");
-
-test(() => {
-  setUp();
-  container.setAttribute("rendersubtree", "invalid");
-  assert_equals(getComputedStyle(container).contain, "layout style");
-  container.style = "contain: size;";
-  assert_equals(getComputedStyle(container).contain, "size layout style");
-  container.style = "contain: paint;";
-  assert_equals(getComputedStyle(container).contain, "layout style paint");
-}, "rendersubtree=invalid adds contain: layout style, keeps size and paint if exists");
-
-test(() => {
-  setUp();
-  container.setAttribute("rendersubtree", INVISIBLE_ACTIVATABLE);
-  container.style = "contain: style;";
-  assert_equals(getComputedStyle(container).contain, "size layout style");
-  container.style = "contain: style layout;";
-  assert_equals(getComputedStyle(container).contain, "size layout style");
-  container.style = "";
-  assert_equals(getComputedStyle(container).contain, "size layout style");
-}, "rendersubtree=invisible adds contain: size layout style, can't be overridden");
-
-test(() => {
-  setUp();
-  container.setAttribute("rendersubtree", INVISIBLE_ACTIVATABLE);
-  container.style = "contain: paint;";
-  assert_equals(getComputedStyle(container).contain, "size layout style paint");
-  container.style = "contain: strict;";
-  assert_equals(getComputedStyle(container).contain, "size layout style paint");
-  container.style = "contain: content;";
-  assert_equals(getComputedStyle(container).contain, "size layout style paint");
-}, "rendersubtree adds contain: size layout style and keeps paint if it exists");
-</script>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/display-none-ancestor-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/display-none-ancestor-ref.html
deleted file mode 100644
index 51904c6..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/display-none-ancestor-ref.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: display none ancestor (reference)</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#container {
-  width: 200px;
-  height: 200px;
-  background: green;
-}
-
-#locked {
-  contain: style layout;
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-</style>
-
-<div id="log">PASS</div>
-<div id="container"><div id="locked"></div></div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/display-none-ancestor.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/display-none-ancestor.html
deleted file mode 100644
index da43535..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/display-none-ancestor.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: display none ancestor</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="display-none-ancestor-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#container {
-  width: 200px;
-  height: 200px;
-  background: green;
-}
-
-#locked {
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-</style>
-
-<div id="log"></div>
-<div id="container" style="display:none;"></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const locked = document.createElement("div");
-  locked.id = "locked";
-  setInvisible(locked).then(() => {
-    container.appendChild(locked);
-    locked.updateRendering().then(() => {
-      // Make container visible & force style + layout.
-      container.style = "display:block";
-      container.offsetTop;
-
-      setVisible(locked).then(
-        () => { finishTest("PASS"); },
-        (e) => { finishTest("FAIL " + e.message); });
-      });
-    });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/element-in-template.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/element-in-template.html
deleted file mode 100644
index e6cad57..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/element-in-template.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: element in template</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/utils.js"></script>
-
-<template id=template><div id="child">foo</div></template>
-<div id="container"></div>
-
-<script>
-
-async_test((t) => {
-
-  async function templateTest() {
-    const templateChild = template.content.firstChild;
-
-    const acquirePromise = setInvisible(templateChild);
-    await acquirePromise;
-    t.step(() => assert_equals(templateChild.renderSubtree, INVISIBLE_NOT_ACTIVATABLE, "Can lock element in template"));
-
-    const adoptedNode = document.adoptNode(templateChild);
-    t.step(() => assert_equals(adoptedNode.renderSubtree, INVISIBLE_NOT_ACTIVATABLE, "Adopted element is still locked"));
-
-    container.appendChild(adoptedNode);
-    t.step(() => assert_equals(adoptedNode.renderSubtree, INVISIBLE_NOT_ACTIVATABLE, "Still locked after appended"));
-
-    await setVisible(adoptedNode);
-    t.step(() => assert_equals(adoptedNode.renderSubtree, "", "Can commit"));
-
-    await setInvisible(adoptedNode);
-
-    t.step(() => assert_equals(adoptedNode.renderSubtree, INVISIBLE_NOT_ACTIVATABLE, "Can re-lock element"));
-
-    await setVisible(adoptedNode);
-    t.step(() => assert_equals(adoptedNode.renderSubtree, "", "Can re-commit element"));
-
-    t.done();
-  }
-
-  window.onload = function() {
-    requestAnimationFrame(() => requestAnimationFrame(templateTest));
-  };
-}, "Testing locking element in templates");
-
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/lock-parent-then-child.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/lock-parent-then-child.html
deleted file mode 100644
index c01420de..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/lock-parent-then-child.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire after resizing</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<div id="log"></div>
-<div id="container">
- locked parent
-  <div id="nested">
-    nested  locked
-  </div>
-</div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-async function runTest() {
-  await setInvisible(document.getElementById("container"));
-  await setInvisible(document.getElementById("nested"));
-  requestAnimationFrame(() => finishTest("PASS"));
-}
-
-window.onload = () => { requestAnimationFrame(runTest); };
-</script>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/locked-attribute.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/locked-attribute.html
deleted file mode 100644
index 4cc9acc..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/locked-attribute.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: locked attribute</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<div id="container"></div>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="resources/utils.js"></script>
-
-<script>
-async_test((t) => {
-  async function runTest() {
-    const container = document.getElementById("container");
-    const acquire_promise = setInvisible(container);
-    t.step(() => assert_equals(container.renderSubtree, INVISIBLE_NOT_ACTIVATABLE, "context before acquire finishes is locked"));
-
-    await acquire_promise;
-    t.step(() => assert_equals(container.renderSubtree, INVISIBLE_NOT_ACTIVATABLE, "context after acquire finishes is locked"));
-
-    const update_promise = container.updateRendering();
-    t.step(() => assert_equals(container.renderSubtree, INVISIBLE_NOT_ACTIVATABLE, "context during update is locked"));
-
-    await update_promise;
-    t.step(() => assert_equals(container.renderSubtree, INVISIBLE_NOT_ACTIVATABLE, "context after update is locked"));
-
-    const commit_promise = setVisible(container);
-    t.step(() => assert_equals(container.renderSubtree, "", "context during commit is unlocked"));
-
-    await commit_promise;
-    t.step(() => assert_equals(container.renderSubtree, "", "context after commit is unlocked"));
-
-    t.done();
-  }
-
-  window.onload = function() {
-    requestAnimationFrame(() => requestAnimationFrame(runTest));
-  };
-}, "locked attribute");
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/measure-updated-layout.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/measure-updated-layout.html
deleted file mode 100644
index 075011d..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/measure-updated-layout.html
+++ /dev/null
@@ -1,100 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: measure updated layout</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<script src="resources/utils.js"></script>
-
-<style>
-#container {
-  background: lightgreen;
-}
-#sizer {
-  width: 100px;
-  height: 100px;
-}
-.child {
-  width: 20px;
-  height: 20%;
-  background: cyan;
-}
-#spacer {
-  width: 150px;
-  height: 150px;
-  background: green;
-}
-</style>
-
-<div id="parent"></div>
-<div id="spacer"></div>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-<script>
-async_test((t) => {
-  function createChild(id) {
-    const child = document.createElement("div");
-    child.classList = "child";
-    child.id = id;
-    return child;
-  }
-
-  function construct(container) {
-    const sizer = document.createElement("div");
-    sizer.id = "sizer";
-    container.appendChild(sizer);
-    sizer.appendChild(createChild("0"));
-    sizer.appendChild(createChild("1"));
-    sizer.appendChild(createChild("2"));
-  }
-
-  function measureInUpdate() {
-    t.step(() => {
-      // Ensure children are laid out; this forces a layout.
-      assert_equals(document.getElementById("0").offsetTop, 0, "0 in update");
-      assert_equals(document.getElementById("1").offsetTop, 20, "1 in update");
-      assert_equals(document.getElementById("2").offsetTop, 40, "2 in update");
-      // Both parent should be 0 height, since it's locked. Both parent and spacers
-      // should have 8 offsetTop.
-      assert_equals(document.getElementById("parent").offsetTop, 8, "parent in update");
-      assert_equals(document.getElementById("spacer").offsetTop, 8, "spacer in update");
-    });
-  }
-
-  function measureInCommit() {
-    t.step(() => {
-      // Ensure children are still laid out.
-      assert_equals(document.getElementById("0").offsetTop, 0, "0 in commit");
-      assert_equals(document.getElementById("1").offsetTop, 20, "1 in commit");
-      assert_equals(document.getElementById("2").offsetTop, 40, "2 in commit");
-      // Now the parent should encompass a container, so spacer is pushed down.
-      assert_equals(document.getElementById("parent").offsetTop, 8, "parent in commit");
-      assert_equals(document.getElementById("spacer").offsetTop, 108, "spacer in commit");
-    });
-  }
-
-  async function runTest() {
-    const container = document.createElement("div");
-    container.id = "container";
-    await setInvisible(container);
-
-    document.getElementById("parent").appendChild(container);
-    construct(container);
-
-    container.updateRendering().then(() => {
-      measureInUpdate();
-      setVisible(container).then(() => {
-        measureInCommit();
-        t.done();
-      });
-    });
-  }
-
-  window.onload = function() {
-    requestAnimationFrame(() => requestAnimationFrame(runTest));
-  };
-}, "Measure Updated Layout");
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/multiple-acquires-all-succeed.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/multiple-acquires-all-succeed.html
deleted file mode 100644
index eee6dbb8..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/multiple-acquires-all-succeed.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: multiple acquires and updates</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-container-with-child-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-#child {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-</style>
-
-<div id="log"></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.createElement("div");
-  Promise.all([
-    setInvisible(container),
-    setInvisible(container),
-    setInvisible(container),
-    setInvisible(container)
-  ]).then(() => {
-    const child = document.createElement("div");
-    child.id = "child";
-    container.appendChild(child);
-
-    container.id = "container";
-    document.body.appendChild(container);
-
-    Promise.all([
-      container.updateRendering(),
-      container.updateRendering(),
-      container.updateRendering(),
-      container.updateRendering()
-    ]).then(() => {
-      setVisible(container).then(
-        () => { finishTest("PASS"); },
-        (e) => { finishTest("FAIL " + e.message); });
-    });
-  });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/nested-acquire.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/nested-acquire.html
deleted file mode 100644
index bafe07a..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/nested-acquire.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: nested acquire</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#outer {
-  width: 100px;
-  height: 100px;
-}
-#inner {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-div > div > div {
-  width: 10px;
-  height: 10px;
-  background: red;
-}
-</style>
-
-<div id="log"></div>
-<div id="outer" class="container">
-  <div id="inner" class="container"></div>
-</div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-async function runTest() {
-  const outer = document.getElementById("outer");
-  const inner = document.getElementById("inner");
-
-  await setInvisible(outer);
-  // Dirty the inner layout
-  inner.appendChild(document.createElement("div"));
-  setInvisible(inner).then(
-    () => { finishTest("PASS"); },
-    (e) => { finishTest("FAIL " + e.message); });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/nested-commit.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/nested-commit.html
deleted file mode 100644
index 9f5ad38..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/nested-commit.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: nested commit</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#outer {
-  width: 100px;
-  height: 100px;
-}
-#inner {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-div > div > div {
-  width: 10px;
-  height: 10px;
-  background: red;
-}
-</style>
-
-<div id="log"></div>
-<div id="outer" class="container">
-  <div id="inner" class="container"></div>
-</div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-async function runTest() {
-  const outer = document.getElementById("outer");
-  const inner = document.getElementById("inner");
-
-  await Promise.all([
-    setInvisible(outer),
-    setInvisible(inner)]);
-  // Dirty the inner layout
-  inner.appendChild(document.createElement("div"));
-  setVisible(inner).then(
-    () => { finishTest("PASS"); },
-    (e) => { finishTest("FAIL " + e.message); });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/nested-update-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/nested-update-ref.html
deleted file mode 100644
index 01c35a0..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/nested-update-ref.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: nested update (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<div id="log">PASS Element is nested under a locked element.</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/nested-update.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/nested-update.html
deleted file mode 100644
index 8ce9a60..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/nested-update.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: nested update</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="nested-update-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#outer {
-  width: 100px;
-  height: 100px;
-}
-#inner {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-div > div > div {
-  width: 10px;
-  height: 10px;
-  background: red;
-}
-</style>
-
-<div id="log"></div>
-<div id="outer" class="container">
-  <div id="inner" class="container"></div>
-</div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-async function runTest() {
-  const outer = document.getElementById("outer");
-  const inner = document.getElementById("inner");
-
-  await Promise.all([
-    setInvisible(outer),
-    setInvisible(inner)]);
-  // Dirty the inner layout
-  inner.appendChild(document.createElement("div"));
-  inner.updateRendering().then(
-    () => { finishTest("FAIL"); },
-    (e) => { finishTest("PASS " + e.message); });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/resources/utils.js b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/resources/utils.js
deleted file mode 100644
index aa3ac0f..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/resources/utils.js
+++ /dev/null
@@ -1,25 +0,0 @@
-const INVISIBLE_ACTIVATABLE = "invisible";
-const INVISIBLE_NOT_ACTIVATABLE = "invisible skip-activation";
-
-function setInvisible(element) {
-  return setRenderSubtree(element, INVISIBLE_NOT_ACTIVATABLE);
-}
-
-function setInvisibleActivatable(element) {
-  return setRenderSubtree(element, INVISIBLE_ACTIVATABLE);
-}
-
-function setVisible(element) {
-  return setRenderSubtree(element, "");
-}
-
-function setRenderSubtree(element, value) {
-  element.setAttribute("rendersubtree", value);
-  return new Promise((resolve, reject) => {
-    // Returns a promise that resolves when the rendering changes take effect.
-    // TODO(rakina): Change to requestPostAnimationFrame when available?
-    requestAnimationFrame(() => {
-      requestAnimationFrame(resolve);
-    });
-  });
-}
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/selection-shadow.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/selection-shadow.html
deleted file mode 100644
index e5a33e5..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/selection-shadow.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: activatable allows selections</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="selection-shadow-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-</div>
-<div id="host">
-  <div id="slottedToFirst" slot="first">
-    slotted to first slot
-  </div>
-  <div id="slottedToSecond" slot="second">
-    slotted to second slot
-  </div>
-</div>
-
-<script>
-/*
-Structure:
-<div id=host>  // locked, activatable
- #shadowRoot
-  <slot first>
-    <div id=slottedToFirst> // locked, activatable
-      slotted to first slot
-  shadow text
-  <div id=nonActivatable>     // locked, non-activatable
-    non activatable
-  <slot second>
-    <div id=slottedToSecond>
-      slotted to second slot
-*/
-
-async function runTest() {
-  const shadowRoot = host.attachShadow({ mode: "open" });
-  const firstSlot = document.createElement("slot");
-  firstSlot.name = "first";
-  shadowRoot.appendChild(firstSlot);
-  shadowRoot.appendChild(document.createTextNode("shadow text"));
-  const nonActivatable = document.createElement("div");
-  nonActivatable.innerText = "non activatable";
-  shadowRoot.appendChild(nonActivatable);
-  const secondSlot = document.createElement("slot");
-  secondSlot.name = "second";
-  shadowRoot.appendChild(secondSlot);
-
-  host.style = "contain-intrinsic-size: 100px 100px;"
-  nonActivatable.style = "contain-intrinsic-size: 20px 20px;"
-  slottedToFirst.style = "contain-intrinsic-size: 40px 40px;"
-  await setInvisibleActivatable(host);
-  await setInvisible(nonActivatable);
-  await setInvisibleActivatable(slottedToFirst);
-
-  window.getSelection().removeAllRanges();
-  const selectionRange = document.createRange();
-  selectionRange.setStart(slottedToFirst.firstChild, 8);
-  selectionRange.setEnd(slottedToSecond.firstChild, 10);
-  window.getSelection().addRange(selectionRange);
-  requestAnimationFrame(takeScreenshot);
-}
-window.onload = () => { requestAnimationFrame(runTest); };
-</script>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/selection.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/selection.html
deleted file mode 100644
index 8eda85f3..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/selection.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: activatable allows selections</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="selection-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-  #userSelectNone {
-    user-select: none;
-  }
-  div:not([rendersubtree~="invisible"]) {
-    contain-intrinsic-size: legacy !important;
-  }
-</style>
-<div id="container">
-  <div id="notLocked">
-    not locked!
-  </div>
-  <div id="nonActivatable">
-    non-activatable locked
-  </div>
-  <div id="userSelectNone">
-    activatable user-select is none
-  </div>
-  <div id="nested">
-    nested activatable locked
-  </div>
-</div>
-
-<script>
-async function runTest() {
-  container.style = "contain-intrinsic-size: 100px 100px;"
-  nonActivatable.style = "contain-intrinsic-size: 20px 20px;"
-  userSelectNone.style = "contain-intrinsic-size: 30px 30px;"
-  nested.style = "contain-intrinsic-size: 40px 40px;"
-  await setInvisibleActivatable(container);
-  await setInvisible(nonActivatable);
-  await setInvisibleActivatable(userSelectNone);
-  await setInvisibleActivatable(nested);
-
-  window.getSelection().removeAllRanges();
-  const selectionRange = document.createRange();
-  selectionRange.setStart(notLocked.firstChild, 4);
-  selectionRange.setEnd(nested.firstChild, 7);
-  window.getSelection().addRange(selectionRange);
-  requestAnimationFrame(takeScreenshot);
-}
-window.onload = () => { requestAnimationFrame(runTest); };
-</script>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-after-resize-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-after-resize-ref.html
deleted file mode 100644
index 977d9fd..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-after-resize-ref.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: acquire after resizing (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#container {
-  contain: style layout;
-  width: 150px;
-  height: 150px;
-}
-#spacer {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-</style>
-
-<div id="log">PASS</div>
-<div id="container"></div>
-<div id="spacer"></div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-after-resize.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-after-resize.html
deleted file mode 100644
index e358f80..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-after-resize.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire after resizing</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="acquire-after-resize-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#spacer {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-#small {
-  contain-intrinsic-size: 150px 150px;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="log"></div>
-<div id="small" class="contained">Lorem ipsum</div>
-<div id="spacer">
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.getElementById("small");
-  setInvisible(container).then(
-    () => { finishTest("PASS"); },
-    (e) => { finishTest("FAIL " + e.message); });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-border-and-scrollbars-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-border-and-scrollbars-ref.html
deleted file mode 100644
index bee9142..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-border-and-scrollbars-ref.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: acquire() size + border + scrollbars (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#border {
-  width: max-content;
-  border: 1px solid green;
-}
-#container {
-  contain: style layout;
-  overflow: scroll;
-  border: 10px solid black;
-  background: lightblue;
-}
-#sizer {
-  width: 123px;
-  height: 456px;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    <div id="sizer"></div>
-  </div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-border-and-scrollbars.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-border-and-scrollbars.html
deleted file mode 100644
index df44a57..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-border-and-scrollbars.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire() size + border + scrollbars</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="acquire-size-used-when-auto-size-border-and-scrollbars-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#border {
-  width: max-content;
-  border: 1px solid green;
-}
-#container {
-  background: lightblue;
-  overflow: scroll;
-  border: 10px solid black;
-  contain-intrinsic-size: 123px 456px;
-}
-#child {
-  width: 500px;
-  height: 500px;
-  background: red;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    Lorem ipsum
-    <div id="child">Dolor</div>
-  </div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-border-min-content.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-border-min-content.html
deleted file mode 100644
index 04d256b..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-border-min-content.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire() size + border, with min-content</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="acquire-size-used-when-auto-size-border-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#border {
-  width: min-content;
-  border: 1px solid green;
-}
-#container {
-  border: 10px solid black;
-  contain-intrinsic-size: 123px 456px;
-}
-#child {
-  width: 500px;
-  height: 500px;
-  background: red;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    <div id="child"></div>
-  </div>
-</div>
-
-<script>
-if (window.testRunner)
-  window.testRunner.waitUntilDone();
-
-function finishTest() {
-  if (window.testRunner)
-    window.testRunner.notifyDone();
-}
-
-function runTest() {
-  let container = document.getElementById("container");
-  setInvisible(container).then(finishTest);
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-border-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-border-ref.html
deleted file mode 100644
index 9a3b46f..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-border-ref.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: acquire() size + border (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#border {
-  width: max-content;
-  border: 1px solid green;
-}
-#container {
-  contain: style layout;
-  border: 10px solid black;
-}
-#sizer {
-  width: 123px;
-  height: 456px;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    <div id="sizer"></div>
-  </div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-border.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-border.html
deleted file mode 100644
index e84b60d..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-border.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire() size + border</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="acquire-size-used-when-auto-size-border-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#border {
-  width: max-content;
-  border: 1px solid green;
-}
-#container {
-  border: 10px solid black;
-  contain-intrinsic-size: 123px 456px;
-}
-#child {
-  width: 500px;
-  height: 500px;
-  background: red;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    <div id="child"></div>
-  </div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-ref.html
deleted file mode 100644
index 5612a1b..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-ref.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: acquire() size (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#border {
-  width: max-content;
-  border: 1px solid green;
-}
-#container {
-  contain: style layout;
-}
-#sizer {
-  width: 123px;
-  height: 456px;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    <div id="sizer"></div>
-  </div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-scrollbars-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-scrollbars-ref.html
deleted file mode 100644
index 920afc3..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-scrollbars-ref.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: acquire() size + scrollbars (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#border {
-  width: max-content;
-  border: 1px solid green;
-}
-#container {
-  contain: style layout;
-  overflow: scroll;
-}
-#sizer {
-  width: 123px;
-  height: 456px;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    <div id="sizer"></div>
-  </div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-scrollbars.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-scrollbars.html
deleted file mode 100644
index a63bb058..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size-scrollbars.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire() size + scrollbars</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="acquire-size-used-when-auto-size-scrollbars-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#border {
-  width: max-content;
-  border: 1px solid green;
-}
-#container {
-  overflow: scroll;
-  contain-intrinsic-size: 123px 456px;
-}
-#child {
-  width: 500px;
-  height: 500px;
-  background: red;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    <div id="child"></div>
-  </div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size.html
deleted file mode 100644
index cda06b8..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/acquire-size-used-when-auto-size.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire() size</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="acquire-size-used-when-auto-size-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#border {
-  width: max-content;
-  border: 1px solid green;
-}
-#container {
-  contain-intrinsic-size: 123px 456px;
-}
-#child {
-  width: 500px;
-  height: 500px;
-  background: red;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    <div id="child"></div>
-  </div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/change-content-size.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/change-content-size.html
deleted file mode 100644
index d51a1c9..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/change-content-size.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: re-acquire with a different size</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="acquire-after-resize-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-.contained {
-  contain-intrinsic-size: 123px 456px;
-}
-#spacer {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="log"></div>
-<div id="small" class="contained"></div>
-<div id="spacer">
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.getElementById("small");
-  setInvisible(container).then(() => {
-    container.style = "contain-intrinsic-size: 150px 150px";
-    requestAnimationFrame(() => finishTest("PASS"));
-  });
-}
-
-window.onload = runTest;
-</script>
-</html>
-
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-block-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-block-ref.html
deleted file mode 100644
index 0f74b4b..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-block-ref.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: contain: size block layout (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#border {
-  border: 1px solid black;
-  width: min-content;
-}
-</style>
-<div id="border">
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-block.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-block.html
deleted file mode 100644
index bbce411..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-block.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: contain: size block layout</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="contain-size-block-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#border {
-  border: 1px solid black;
-  width: min-content;
-}
-#container {
-  contain: style layout size;
-  contain-intrinsic-size: 0;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <div id="container"></div>
-</div>
-
-<script>
-function runTest() {
-  const container = document.getElementById("container");
-  setInvisible(container).then(() => {
-    takeScreenshot();
-  });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-fieldset-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-fieldset-ref.html
deleted file mode 100644
index 8867824..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-fieldset-ref.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: fieldset with legend and size containment, sized by display lock</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#border {
-  border: 1px solid black;
-  width: min-content;
-}
-#container {
-  width: 123px;
-  height: 234px;
-}
-</style>
-
-<div id="border">
-  <fieldset id="container">
-  </fieldset>
-</div>
-
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-fieldset.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-fieldset.html
deleted file mode 100644
index 48f3162..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-fieldset.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: fieldset with legend and size containment, sized by display lock</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="contain-size-fieldset-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#border {
-  border: 1px solid black;
-  width: min-content;
-}
-#container {
-  contain-intrinsic-size: 123px 234px;
-}
-*:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <fieldset id="container">
-    <legend>This is a legend</legend>
-    This is some content.
-  </fieldset>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = requestAnimationFrame(() => requestAnimationFrame(runTest));
-</script>
-
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-flex-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-flex-ref.html
deleted file mode 100644
index 0a421444..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-flex-ref.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: contain: size flex layout (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-}
-#container {
-  contain: style layout size;
-  width: 12px;
-  height: 34px;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"></div>
-  <div class="item"></div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-flex.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-flex.html
deleted file mode 100644
index 76ea1143..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-flex.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: contain: size flex layout</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="contain-size-flex-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-}
-#container {
-  contain-intrinsic-size: 12px 34px;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"></div>
-  <div class="item"></div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-replaced-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-replaced-ref.html
deleted file mode 100644
index c1500c7..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-replaced-ref.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: contain: size replaced layout (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#border {
-  border: 1px solid blue;
-  width: max-content;
-}
-img {
-  contain: style layout size;
-  visibility: hidden;
-}
-</style>
-
-<div id="border">
-  <img src="resources/blue-100.png">
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-replaced.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-replaced.html
deleted file mode 100644
index cb93a8f..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/contain-size-replaced.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: contain: size replaced layout</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="contain-size-replaced-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#border {
-  border: 1px solid blue;
-  width: max-content;
-}
-img {
-  contain-intrinsic-size: none;
-}
-img:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <img id="element" src="resources/blue-100.png">
-</div>
-
-<script>
-async function runTest() {
-  const element = document.getElementById("element");
-  await setInvisible(element);
-  takeScreenshot();
-}
-
-window.onload = () => requestAnimationFrame(runTest);
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/fieldset-empty-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/fieldset-empty-ref.html
deleted file mode 100644
index 6f7d2551..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/fieldset-empty-ref.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: empty fieldset (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#border {
-  border: 1px solid black;
-  width: min-content;
-}
-</style>
-
-<div id="border">
-  <fieldset></fieldset>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/fieldset-empty.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/fieldset-empty.html
deleted file mode 100644
index ea34764..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/fieldset-empty.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: empty fieldset</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="fieldset-empty-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#border {
-  border: 1px solid black;
-  width: min-content;
-}
-#container {
-  contain-intrinsic-size: 0px 0px;
-}
-fieldset:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <fieldset id="container"></fieldset>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = requestAnimationFrame(() => requestAnimationFrame(runTest));
-</script>
-
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/fieldset-with-legend-sized-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/fieldset-with-legend-sized-ref.html
deleted file mode 100644
index 7fb1b833..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/fieldset-with-legend-sized-ref.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: fieldset with legend, sized by display lock (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#border {
-  border: 1px solid black;
-  width: min-content;
-}
-#child {
-  width: 123px;
-  height: 234px;
-}
-</style>
-
-<div id="border">
-  <fieldset>
-    <div id="child"></div>
-  </fieldset>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/fieldset-with-legend-sized.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/fieldset-with-legend-sized.html
deleted file mode 100644
index 5f64fc29..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/fieldset-with-legend-sized.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: fieldset with legend, sized by display lock</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="fieldset-with-legend-sized-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#border {
-  border: 1px solid black;
-  width: min-content;
-}
-#container {
-  contain-intrinsic-size: 123px 234px;
-}
-fieldset:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <fieldset id="container">
-    <legend>This is a legend</legend>
-    This is some content.
-  </fieldset>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = requestAnimationFrame(() => requestAnimationFrame(runTest));
-</script>
-
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/fieldset-with-legend.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/fieldset-with-legend.html
deleted file mode 100644
index 198b307a..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/fieldset-with-legend.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: fieldset with legend</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="fieldset-empty-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#border {
-  border: 1px solid black;
-  width: min-content;
-}
-#container {
-  contain-intrinsic-size: 0px 0px;
-}
-fieldset:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <fieldset id="container">
-    <legend>This is a legend</legend>
-  </fieldset>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = requestAnimationFrame(() => requestAnimationFrame(runTest));
-</script>
-
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-horizontal-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-horizontal-ref.html
deleted file mode 100644
index ee42c4e..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-horizontal-ref.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: flex column, horizontal-tb (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: column;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: horizontal-tb;
-}
-#container {
-  contain: style layout;
-}
-#child {
-  width: 12px;
-  height: 34px;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"><div id="child"></div></div>
-  <div class="item"></div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-horizontal-with-grow-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-horizontal-with-grow-ref.html
deleted file mode 100644
index 5497c1f..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-horizontal-with-grow-ref.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: flex column with grow, horizontal-tb (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: column;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: horizontal-tb;
-}
-#container {
-  contain: style layout;
-  flex-grow: 3;
-}
-#child {
-  width: 12px;
-  height: 34px;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-  flex-grow: 1;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"><div id="child"></div></div>
-  <div class="item"></div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-horizontal-with-grow.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-horizontal-with-grow.html
deleted file mode 100644
index eae0c82..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-horizontal-with-grow.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: flex column with grow, horizontal-tb</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="flex-column-horizontal-with-grow-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: column;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: horizontal-tb;
-}
-#container {
-  contain-intrinsic-size: 12px 34px;
-  flex-grow: 3;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-  flex-grow: 1;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"></div>
-  <div class="item"></div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-horizontal.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-horizontal.html
deleted file mode 100644
index 5c15feb..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-horizontal.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: flex column, horizontal-tb</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="flex-column-horizontal-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: column;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: horizontal-tb;
-}
-#container {
-  contain-intrinsic-size: 12px 34px;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"></div>
-  <div class="item"></div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-vertical-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-vertical-ref.html
deleted file mode 100644
index 5cda0b94..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-vertical-ref.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: flex column, vertical-rl (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: column;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: vertical-rl;
-}
-#container {
-  contain: style layout;
-}
-#child {
-  width: 12px;
-  height: 34px;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"><div id="child"></div></div>
-  <div class="item"></div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-vertical-with-grow-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-vertical-with-grow-ref.html
deleted file mode 100644
index 01c3741..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-vertical-with-grow-ref.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: flex column with grow, vertical-rl (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: column;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: vertical-rl;
-}
-#container {
-  contain: style layout;
-  flex-grow: 3;
-}
-#child {
-  width: 12px;
-  height: 34px;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-  flex-grow: 1;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"><div id="child"></div></div>
-  <div class="item"></div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-vertical-with-grow.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-vertical-with-grow.html
deleted file mode 100644
index 083b401..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-vertical-with-grow.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: flex column with grow, vertical-rl</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="flex-column-vertical-with-grow-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: column;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: vertical-rl;
-}
-#container {
-  contain-intrinsic-size: 12px 34px;
-  flex-grow: 3;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-  flex-grow: 1;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"></div>
-  <div class="item"></div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-vertical.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-vertical.html
deleted file mode 100644
index 725428f34..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-column-vertical.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: flex column, vertical-rl</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="flex-column-vertical-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: column;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: vertical-rl;
-}
-#container {
-  contain-intrinsic-size: 12px 34px;
-  contain: style layout;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"></div>
-  <div class="item"></div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-horizontal-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-horizontal-ref.html
deleted file mode 100644
index 89307899..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-horizontal-ref.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: flex row, horizontal-tb (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: horizontal-tb;
-}
-#container {
-  contain: style layout;
-}
-#child {
-  width: 12px;
-  height: 34px;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"><div id="child"></div></div>
-  <div class="item"></div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-horizontal-with-grow-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-horizontal-with-grow-ref.html
deleted file mode 100644
index 6339313..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-horizontal-with-grow-ref.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: flex row with grow, horizontal-tb (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: horizontal-tb;
-}
-#container {
-  contain: style layout;
-  flex-grow: 3;
-}
-#child {
-  width: 12px;
-  height: 34px;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-  flex-grow: 1;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"><div id="child"></div></div>
-  <div class="item"></div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-horizontal-with-grow.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-horizontal-with-grow.html
deleted file mode 100644
index 3f10afb..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-horizontal-with-grow.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: flex row with grow, horizontal-tb</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="flex-row-horizontal-with-grow-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: horizontal-tb;
-}
-#container {
-  contain-intrinsic-size: 12px 34px;
-  flex-grow: 3;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-  flex-grow: 1;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"></div>
-  <div class="item"></div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-horizontal.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-horizontal.html
deleted file mode 100644
index 0cee209..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-horizontal.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: flex row, horizontal-tb</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="flex-row-horizontal-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: horizontal-tb;
-}
-#container {
-  contain-intrinsic-size: 12px 34px;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"></div>
-  <div class="item"></div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-vertical-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-vertical-ref.html
deleted file mode 100644
index e532cc52..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-vertical-ref.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: flex row, vertical-rl (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: vertical-rl;
-}
-#container {
-  contain: style layout;
-}
-#child {
-  width: 12px;
-  height: 34px;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"><div id="child"></div></div>
-  <div class="item"></div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-vertical-with-grow-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-vertical-with-grow-ref.html
deleted file mode 100644
index 994e774..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-vertical-with-grow-ref.html
+++ /dev/null
@@ -1,39 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: flex row with grow, vertical-rl (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: vertical-rl;
-}
-#container {
-  contain: style layout;
-  flex-grow: 3;
-}
-#child {
-  width: 12px;
-  height: 34px;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-  flex-grow: 1;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"><div id="child"></div></div>
-  <div class="item"></div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-vertical-with-grow.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-vertical-with-grow.html
deleted file mode 100644
index ae7f87a..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-vertical-with-grow.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: flex row with grow, vertical-rl</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="flex-row-vertical-with-grow-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: vertical-rl;
-}
-#container {
-  contain-intrinsic-size: 12px 34px;
-  flex-grow: 3;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-  flex-grow: 1;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"></div>
-  <div class="item"></div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-vertical.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-vertical.html
deleted file mode 100644
index 3865d8f6..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-row-vertical.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: flex row, vertical-rl</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="flex-row-vertical-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#flexer {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-around;
-  width: 200px;
-  height: 200px;
-  background: lightgreen;
-  writing-mode: vertical-rl;
-}
-#container {
-  contain-intrinsic-size: 12px 34px;
-}
-.item {
-  width: 50px;
-  height: 60px;
-  background: blue;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="flexer">
-  <div class="item"></div>
-  <div id="container"></div>
-  <div class="item"></div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-with-child-lock-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-with-child-lock-ref.html
deleted file mode 100644
index d7d6511..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-with-child-lock-ref.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: flex layout with child lock (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#flexer {
-  display: flex;
-  width: 200px;
-  height: 300px;
-  background: lightgreen;
-}
-#container {
-  background: lightblue;
-}
-#sizer {
-  width: 123px;
-  height: 234px;
-}
-</style>
-
-<div id="flexer">
-  <div id="container">
-    <div id="sizer"></div>
-  </div>
-</div>
-
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-with-child-lock.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-with-child-lock.html
deleted file mode 100644
index 3c9a81d..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-with-child-lock.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: flex layout with child lock</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="flex-with-child-lock-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#flexer {
-  display: flex;
-  width: 200px;
-  height: 300px;
-  background: lightgreen;
-}
-#container {
-  contain-intrinsic-size: 123px 234px;
-  background: lightblue;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="flexer">
-  <div id="container">
-    <div></div>
-  </div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-with-descendant-lock-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-with-descendant-lock-ref.html
deleted file mode 100644
index 48a09b8..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-with-descendant-lock-ref.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: flex layout with descendant lock (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#flexer {
-  display: flex;
-  width: 200px;
-  height: 300px;
-  background: lightgreen;
-}
-#container {
-  background: lightblue;
-}
-#sizer {
-  width: 123px;
-  height: 234px;
-}
-</style>
-
-<div id="flexer">
-  <div>
-    <div id="container">
-      <div id="sizer"></div>
-    </div>
-  </div>
-</div>
-
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-with-descendant-lock.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-with-descendant-lock.html
deleted file mode 100644
index 6d8e0aa..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/flex-with-descendant-lock.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: flex layout with descendant lock</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="flex-with-descendant-lock-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#flexer {
-  display: flex;
-  width: 200px;
-  height: 300px;
-  background: lightgreen;
-}
-#container {
-  contain-intrinsic-size: 123px 234px;
-  background: lightblue;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="flexer">
-  <div>
-    <div id="container">
-      <div></div>
-    </div>
-  </div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/float-left-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/float-left-ref.html
deleted file mode 100644
index 3ace1ee8..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/float-left-ref.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: float left (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#border {
-  width: max-content;
-  border: 1px solid green;
-}
-#container {
-  contain: style layout;
-  float: left;
-}
-#sizer {
-  width: 123px;
-  height: 456px;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    <div id="sizer"></div>
-  </div>
-  This is some text.
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/float-left.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/float-left.html
deleted file mode 100644
index 76ea5861..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/float-left.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: float left</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="float-left-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#border {
-  width: max-content;
-  border: 1px solid green;
-}
-#container {
-  float: left;
-  contain-intrinsic-size: 123px 456px;
-}
-#child {
-  width: 500px;
-  height: 500px;
-  background: red;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    <div id="child"></div>
-  </div>
-  This is some text.
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/get-bounding-client-rect-block-layout-in-iframe.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/get-bounding-client-rect-block-layout-in-iframe.html
deleted file mode 100644
index 7eb9988..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/get-bounding-client-rect-block-layout-in-iframe.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: getBoundingClientRect on block layout</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#container {
-  contain-intrinsic-size: 123px 234px;
-}
-#frame {
-  padding: 0;
-  margin: 0;
-  width: 500px;
-  height: 500px;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-<body>
-<div id="container">
-  <iframe id="frame" frameborder=0 srcdoc='
-    <style>
-      body {
-        padding: 0;
-        margin: 0;
-      }
-      #target {
-        background: lightgreen;
-        width: 50%;
-        height: 50px;
-      }
-    </style>
-    <div id="target"></div>
-  '></iframe>
-</div>
-
-<script>
-let load_promise = new Promise((resolve) => {
-  window.onload = resolve;
-});
-
-async_test(async(t) => {
-  await load_promise;
-
-  const container = document.getElementById("container");
-  await setInvisible(container);
-
-  const frame = document.getElementById("frame");
-  frame.style.width = "224px";
-  frame.style.height = "248px";
-
-  const target = frame.contentDocument.getElementById("target");
-  t.step(() => assert_true(!!target, "sanity check that target exists"));
-  let rect = target.getBoundingClientRect();
-  t.step(() => assert_equals(rect.width, 112, "target uses update frame size for width"));
-  t.step(() => assert_equals(rect.height, 50, "target uses set size for height"));
-
-  t.done();
-}, "getBoundingClientRect in iframe");
-
-</script>
-</body>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/get-bounding-client-rect-block-layout.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/get-bounding-client-rect-block-layout.html
deleted file mode 100644
index 9098ef4..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/get-bounding-client-rect-block-layout.html
+++ /dev/null
@@ -1,135 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: getBoundingClientRect on block layout</title>
-<link rel="author" title="Rakina Zata Amni" href="mailto:rakina@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="../resources/utils.js"></script>
-
-<body>
-<style>
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-<script>
-const BODY_WIDTH = document.body.getBoundingClientRect().width;
-const CONTENT_WIDTH = 33;
-const CONTENT_HEIGHT = 44;
-
-async_test(async(t) => {
-  let container = document.createElement("div");
-  let child = document.createElement("div");
-  container.appendChild(child);
-  document.body.appendChild(container);
-  container.style = `contain-intrinsic-size: ${CONTENT_WIDTH}px ${CONTENT_HEIGHT}px;`;
-  await setInvisible(container);
-
-  let rect = container.getBoundingClientRect();
-  // Even though the intrinsic-size is specified, regular block
-  // layout causes the container to be BODY_WIDTH.
-  t.step(() => assert_equals(rect.width, BODY_WIDTH,
-    "Locked element uses BODY_WIDTH for width"));
-  t.step(() => assert_equals(rect.height, CONTENT_HEIGHT,
-    "Locked element uses height from intrinsic-size"));
-
-  rect = child.getBoundingClientRect();
-  t.step(() => assert_equals(rect.width, BODY_WIDTH,
-    "Child of locked element with no content uses container's width (BODY_WIDTH)"));
-  t.step(() => assert_equals(rect.height, 0,
-    "Child of locked element with no content has zero height"));
-
-  child.style = "width: 100px; height: 200px;";
-  rect = container.getBoundingClientRect();
-  t.step(() => assert_equals(rect.width, BODY_WIDTH,
-    "Locked element with sized child uses BODY_WIDTH"));
-  t.step(() => assert_equals(rect.height, CONTENT_HEIGHT,
-    "Locked element with sized child uses height from intrinsic-size"));
-  rect = child.getBoundingClientRect();
-  t.step(() => assert_equals(rect.width, 100,
-    "Child of locked element uses width from style"));
-  t.step(() => assert_equals(rect.height, 200,
-    "Child of locked element uses height from style"));
-
-  t.done();
-}, "getBoundingClientRect");
-
-async_test(async(t) => {
-  let container = document.createElement("div");
-  let child = document.createElement("div");
-  container.appendChild(child);
-  document.body.appendChild(container);
-  container.style = `width: min-content; contain-intrinsic-size: ${CONTENT_WIDTH}px ${CONTENT_HEIGHT}px;`;
-  await setInvisible(container);
-
-  let rect = container.getBoundingClientRect();
-  t.step(() => assert_equals(rect.width, CONTENT_WIDTH,
-    "Locked element with min-content uses width from intrinsic-size"));
-  t.step(() => assert_equals(rect.height, CONTENT_HEIGHT,
-    "Locked element with min-content uses height from intrinsic-size"));
-
-  rect = child.getBoundingClientRect();
-  t.step(() => assert_equals(rect.width, CONTENT_WIDTH,
-    "Child of locked element with min-content & no content uses width from intrinsic-size"));
-  t.step(() => assert_equals(rect.height, 0,
-    "Child of locked element with min-content & no content has zero height"));
-
-  child.style = "width: 100px; height: 200px;";
-  rect = container.getBoundingClientRect();
-  t.step(() => assert_equals(rect.width, CONTENT_WIDTH,
-    "Locked element with min-content and sized child uses width from intrinsic-size"));
-  t.step(() => assert_equals(rect.height, CONTENT_HEIGHT,
-    "Locked element with min-content and sized child uses height from intrinsic-size"));
-  rect = child.getBoundingClientRect();
-  t.step(() => assert_equals(rect.width, 100,
-    "Child of locked element with min-content uses width from style"));
-  t.step(() => assert_equals(rect.height, 200,
-    "Child of locked element with min-content uses height from style"));
-
-  t.done();
-}, "getBoundingClientRect with min-content");
-
-async_test(async(t) => {
-  let container = document.createElement("div");
-  let child = document.createElement("div");
-  container.appendChild(child);
-  document.body.appendChild(container);
-  container.style = `contain-intrinsic-size: ${CONTENT_WIDTH}px ${CONTENT_HEIGHT}px;`;
-  await setInvisible(container);
-  let rect = container.getBoundingClientRect();
-
-  // Even though the intrinsic-size is specified, regular block
-  // layout causes the container to be BODY_WIDTH.
-  t.step(() => assert_equals(rect.width, BODY_WIDTH,
-    "Locked element uses BODY_WIDTH for width"));
-  t.step(() => assert_equals(rect.height, CONTENT_HEIGHT,
-    "Locked element uses height from intrinsic-size"));
-
-  rect = child.getBoundingClientRect();
-  t.step(() => assert_equals(rect.width, BODY_WIDTH,
-    "Child of locked element with no content uses container's width (BODY_WIDTH)"));
-  t.step(() => assert_equals(rect.height, 0,
-    "Child of locked element with no content has zero height"));
-
-  container.style = "contain-intrinsic-size: 55px 66px;";
-  rect = container.getBoundingClientRect();
-  t.step(() => assert_equals(rect.width, BODY_WIDTH,
-    "After intrinsic-size change, locked element width remains BODY_WIDTH"));
-  t.step(() => assert_equals(rect.height, 66,
-    "After intrinsic-size change, locked element uses height from newest intrinsic-size"));
-
-  rect = child.getBoundingClientRect();
-  t.step(() => assert_equals(rect.width, BODY_WIDTH,
-    "Child of locked element with no content width remains BODY_WIDTH"));
-  t.step(() => assert_equals(rect.height, 0,
-    "Child of locked element with no content has zero height"));
-
-
-  t.done();
-}, "getBoundingClientRect with changed intrinsic-size");
-</script>
-</body>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/large-content-size-in-overflow-auto-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/large-content-size-in-overflow-auto-ref.html
deleted file mode 100644
index 5893c9b3..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/large-content-size-in-overflow-auto-ref.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!doctype HTML>
-<meta charset="utf8">
-<title>Display Locking: intrinsic-size is larger than height (ref)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#container {
-  contain: style layout size;
-  width: 200px;
-  height: 100px;
-  overflow: auto;
-  background: lightblue;
-}
-</style>
-
-<div id=container></div>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/large-content-size-in-overflow-auto.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/large-content-size-in-overflow-auto.html
deleted file mode 100644
index 30c42bc..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/large-content-size-in-overflow-auto.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: intrinsic-size is larger than height</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="large-content-size-in-overflow-auto-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#container {
-  contain-intrinsic-size: 1px 200px;
-  width: 200px;
-  height: 100px;
-  overflow: auto;
-  background: lightblue;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id=container>Text</div>
-
-<script>
-function runTest() {
-  setInvisible(document.getElementById("container")).then(() => {
-    takeScreenshot();
-  });
-}
-window.onload = runTest;
-</script>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/layout-replaced-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/layout-replaced-ref.html
deleted file mode 100644
index 581031b..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/layout-replaced-ref.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: layout replaced (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#border {
-  border: 1px solid blue;
-  width: max-content;
-}
-img {
-  contain: style layout;
-  width: 12px;
-  height: 34px;
-  visibility: hidden;
-}
-</style>
-
-<div id="border">
-  <img src="resources/blue-100.png">
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/layout-replaced.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/layout-replaced.html
deleted file mode 100644
index 624c14d..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/layout-replaced.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: layout replaced</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="layout-replaced-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#border {
-  border: 1px solid blue;
-  width: max-content;
-}
-#element {
-  contain-intrinsic-size: 12px 34px;
-}
-img:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <img id="element" src="resources/blue-100.png">
-</div>
-
-<script>
-async function runTest() {
-  const element = document.getElementById("element");
-  await setInvisible(element);
-  takeScreenshot();
-}
-
-window.onload = () => requestAnimationFrame(runTest);
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/max-content-size-ignored-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/max-content-size-ignored-ref.html
deleted file mode 100644
index 025741f5..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/max-content-size-ignored-ref.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: max-content on locked root ignored (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#border {
-  width: max-content;
-  border: 1px solid green;
-}
-#container {
-  contain: style layout;
-}
-#sizer {
-  width: 123px;
-  height: 456px;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    <div id="sizer"></div>
-  </div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/max-content-size-ignored.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/max-content-size-ignored.html
deleted file mode 100644
index 8d2f3b1..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/max-content-size-ignored.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: max-content on locked root ignored</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="max-content-size-ignored-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-
-<style>
-#border {
-  width: max-content;
-  border: 1px solid green;
-}
-#container {
-  width: max-content;
-  contain-intrinsic-size: 123px 456px;
-}
-#child {
-  width: 500px;
-  height: 500px;
-  background: red;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    <div id="child"></div>
-  </div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/measure-forced-layout-after-commit.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/measure-forced-layout-after-commit.html
deleted file mode 100644
index cf1a5e6..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/measure-forced-layout-after-commit.html
+++ /dev/null
@@ -1,96 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: measure forced layout after commit</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<script src="../resources/utils.js"></script>
-
-<style>
-.contained {
-  contain-intrinsic-size: 100px 100px;
-  background: lightgreen;
-}
-#large {
-  width: 200px;
-  height: 200px;
-}
-.child {
-  width: 20px;
-  height: 20%;
-  background: cyan;
-}
-#spacer {
-  width: 150px;
-  height: 150px;
-  background: green;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="parent"><div class="contained" id="small"><div id="large"></div></div></div>
-<div id="spacer"></div>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-<script>
-async_test((t) => {
-  function createChild(id) {
-    const child = document.createElement("div");
-    child.classList = "child";
-    child.id = id;
-    return child;
-  }
-
-  function measureForced() {
-    t.step(() => {
-      // Ensure children are laid out; this forces a layout.
-      assert_equals(document.getElementById("0").offsetTop, 0, "0 forced");
-      assert_equals(document.getElementById("1").offsetTop, 40, "1 forced");
-      assert_equals(document.getElementById("2").offsetTop, 80, "2 forced");
-      // Parent should be 100 height, since its child is locked.
-      assert_equals(document.getElementById("parent").offsetTop, 8, "parent forced");
-      assert_equals(document.getElementById("spacer").offsetTop, 108, "spacer forced");
-    });
-  }
-
-  function forcedMeasureAfterCommit() {
-    t.step(() => {
-      // Ensure children are still laid out.
-      assert_equals(document.getElementById("0").offsetTop, 0, "0 in commit");
-      assert_equals(document.getElementById("1").offsetTop, 40, "1 in commit");
-      assert_equals(document.getElementById("2").offsetTop, 80, "2 in commit");
-      // Now the parent should encompass an unlocked container, so spacer is pushed down more.
-      assert_equals(document.getElementById("parent").offsetTop, 8, "parent in commit");
-      assert_equals(document.getElementById("spacer").offsetTop, 208, "spacer in commit");
-    });
-  }
-
-  function construct(container) {
-    container.appendChild(createChild("0"));
-    container.appendChild(createChild("1"));
-    container.appendChild(createChild("2"));
-  }
-
-  async function runTest() {
-    const container = document.getElementById("small");
-    await setInvisible(container);
-
-    construct(document.getElementById("large"));
-    measureForced();
-
-    await setVisible(container);
-    forcedMeasureAfterCommit();
-    t.done();
-  }
-
-  window.onload = function() {
-    requestAnimationFrame(() => requestAnimationFrame(runTest));
-  };
-}, "Measure Forced Layout");
-</script>
-
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/measure-forced-layout.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/measure-forced-layout.html
deleted file mode 100644
index 3a531e1..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/measure-forced-layout.html
+++ /dev/null
@@ -1,97 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: measure forced layout</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<script src="../resources/utils.js"></script>
-
-<style>
-.contained {
-  contain-intrinsic-size: 100px 100px;
-  background: lightgreen;
-}
-#large {
-  width: 200px;
-  height: 200px;
-}
-.child {
-  width: 20px;
-  height: 20%;
-  background: cyan;
-}
-#spacer {
-  width: 150px;
-  height: 150px;
-  background: green;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="parent"><div class="contained" id="small"><div id="large"></div></div></div>
-<div id="spacer"></div>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-<script>
-async_test((t) => {
-  function createChild(id) {
-    const child = document.createElement("div");
-    child.classList = "child";
-    child.id = id;
-    return child;
-  }
-
-  function measureForced() {
-    t.step(() => {
-      // Ensure children are laid out; this forces a layout.
-      assert_equals(document.getElementById("0").offsetTop, 0, "0 forced");
-      assert_equals(document.getElementById("1").offsetTop, 40, "1 forced");
-      assert_equals(document.getElementById("2").offsetTop, 80, "2 forced");
-      // Parent should be 100 height, since its child is locked.
-      assert_equals(document.getElementById("parent").offsetTop, 8, "parent forced");
-      assert_equals(document.getElementById("spacer").offsetTop, 108, "spacer forced");
-    });
-  }
-
-  function measureInCommit() {
-    t.step(() => {
-      // Ensure children are still laid out.
-      assert_equals(document.getElementById("0").offsetTop, 0, "0 in commit");
-      assert_equals(document.getElementById("1").offsetTop, 40, "1 in commit");
-      assert_equals(document.getElementById("2").offsetTop, 80, "2 in commit");
-      // Now the parent should encompass an unlocked container, so spacer is pushed down more.
-      assert_equals(document.getElementById("parent").offsetTop, 8, "parent in commit");
-      assert_equals(document.getElementById("spacer").offsetTop, 208, "spacer in commit");
-    });
-  }
-
-  function construct(container) {
-    container.appendChild(createChild("0"));
-    container.appendChild(createChild("1"));
-    container.appendChild(createChild("2"));
-  }
-
-  async function runTest() {
-    const container = document.getElementById("small");
-    await setInvisible(container);
-
-    construct(document.getElementById("large"));
-    measureForced();
-
-    setVisible(container).then(() => {
-      measureInCommit();
-      t.done();
-    });
-  }
-
-  window.onload = function() {
-    requestAnimationFrame(() => requestAnimationFrame(runTest));
-  };
-}, "Measure Forced Layout");
-</script>
-
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/measure-updated-layout.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/measure-updated-layout.html
deleted file mode 100644
index a807f42d..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/measure-updated-layout.html
+++ /dev/null
@@ -1,99 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: measure updated layout</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<script src="../resources/utils.js"></script>
-
-<style>
-.contained {
-  contain-intrinsic-size: 100px 100px;
-  background: lightgreen;
-}
-#large {
-  width: 200px;
-  height: 200px;
-}
-.child {
-  width: 20px;
-  height: 20%;
-  background: cyan;
-}
-#spacer {
-  width: 150px;
-  height: 150px;
-  background: green;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="parent"><div class="contained" id="small"><div id="large"></div></div></div>
-<div id="spacer"></div>
-
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-
-<script>
-async_test((t) => {
-  function createChild(id) {
-    const child = document.createElement("div");
-    child.classList = "child";
-    child.id = id;
-    return child;
-  }
-
-  function construct(container) {
-    container.appendChild(createChild("0"));
-    container.appendChild(createChild("1"));
-    container.appendChild(createChild("2"));
-  }
-
-  function measureInUpdate() {
-    t.step(() => {
-      // Ensure children are laid out; this forces a layout.
-      assert_equals(document.getElementById("0").offsetTop, 0, "0 in update");
-      assert_equals(document.getElementById("1").offsetTop, 40, "1 in update");
-      assert_equals(document.getElementById("2").offsetTop, 80, "2 in update");
-      // Parent should be 100 height, since its child is locked.
-      assert_equals(document.getElementById("parent").offsetTop, 8, "parent in update");
-      assert_equals(document.getElementById("spacer").offsetTop, 108, "spacer in update");
-    });
-  }
-
-  function measureInCommit() {
-    t.step(() => {
-      // Ensure children are still laid out.
-      assert_equals(document.getElementById("0").offsetTop, 0, "0 in commit");
-      assert_equals(document.getElementById("1").offsetTop, 40, "1 in commit");
-      assert_equals(document.getElementById("2").offsetTop, 80, "2 in commit");
-      // Now the parent should encompass the unlocked container, so spacer is pushed down further.
-      assert_equals(document.getElementById("parent").offsetTop, 8, "parent in commit");
-      assert_equals(document.getElementById("spacer").offsetTop, 208, "spacer in commit");
-    });
-  }
-
-  async function runTest() {
-    const container = document.getElementById("small");
-    await setInvisible(container);
-
-    construct(document.getElementById("large"));
-
-    container.updateRendering().then(() => {
-      measureInUpdate();
-      setVisible(container).then(() => {
-        measureInCommit();
-        t.done();
-      });
-    });
-  }
-
-  window.onload = function() {
-    requestAnimationFrame(() => requestAnimationFrame(runTest));
-  };
-}, "Measure Updated Layout");
-</script>
-
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/min-width-respected-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/min-width-respected-ref.html
deleted file mode 100644
index 4f4d824..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/min-width-respected-ref.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype HTML>
-<html>
-<meta charset="utf8">
-<title>Display Locking: min-width on locked root respected (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#border {
-  width: max-content;
-  border: 1px solid green;
-}
-#container {
-  contain: style layout;
-  width: 157px;
-}
-#sizer {
-  width: 123px;
-  height: 456px;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    <div id="sizer"></div>
-  </div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/min-width-respected.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/min-width-respected.html
deleted file mode 100644
index 3fd69762..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/min-width-respected.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: min-width on locked root respected</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="min-width-respected-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#border {
-  width: max-content;
-  border: 1px solid green;
-}
-#container {
-  contain-intrinsic-size: 123px 456px;
-  min-width: 157px;
-}
-#child {
-  width: 500px;
-  height: 500px;
-  background: red;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    <div id="child"></div>
-  </div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/overflow-auto-with-overflow-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/overflow-auto-with-overflow-ref.html
deleted file mode 100644
index 7c36f82..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/overflow-auto-with-overflow-ref.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<html>
-<meta charset="utf8">
-<title>Display Locking: overflow auto (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-#border {
-  border: 1px solid black;
-  width: max-content;
-}
-#container {
-  contain: style layout;
-  width: 12px;
-  height: 100px;
-}
-</style>
-
-<div id="border">
-  <div id="container"></div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/overflow-auto-with-overflow.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/overflow-auto-with-overflow.html
deleted file mode 100644
index 6576150..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/overflow-auto-with-overflow.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE html>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: overflow auto</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="overflow-auto-with-overflow-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-#border {
-  border: 1px solid black;
-  width: max-content;
-}
-#container {
-  contain-intrinsic-size: 12px 34px;
-  height: 100px;
-  overflow: auto;
-}
-.content {
-  width: 50px;
-  height: 50px;
-  margin: 5px;
-  background: pink;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div id="border">
-  <div id="container">
-    <div class="content"></div>
-    <div class="content"></div>
-    <div class="content"></div>
-    <div class="content"></div>
-  </div>
-</div>
-
-<script>
-async function runTest() {
-  const container = document.getElementById("container");
-  await setInvisible(container);
-  takeScreenshot();
-}
-
-onload = () => requestAnimationFrame(runTest);
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/resources/blue-100.png b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/resources/blue-100.png
deleted file mode 100644
index f578ae72..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/resources/blue-100.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/writing-modes-inherited-after-append.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/writing-modes-inherited-after-append.html
deleted file mode 100644
index 2a5cb48..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/writing-modes-inherited-after-append.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<!DOCTYPE html>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: writing modes change when appending</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="writing-modes-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-.verticalrl {
-  writing-mode: vertical-rl;
-}
-.verticallr {
-  writing-mode: vertical-lr;
-}
-.horizontaltb {
-  writing-mode: horizontal-tb;
-}
-.sized {
-  width: 100px;
-  height: 200px;
-}
-.box {
-  background: lightblue;
-  contain-intrinsic-size: 12px 34px;
-  border-color: blue;
-  border-style: solid;
-  border-width: 1px 2px 3px 4px;
-  padding: 5px 6px 7px 8px;
-}
-.border {
-  border: 1px solid black;
-  width: max-content;
-  margin: 5px;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<template id="template">
-  <div class="box">
-    <div class="sized">hello<br>world</div>
-  </div>
-</template>
-
-<div class="border verticalrl"></div>
-<div class="border verticalrl"></div>
-<div class="border verticallr"></div>
-<div class="border horizontaltb"></div>
-<div class="border horizontaltb"></div>
-
-<script>
-async function runTest() {
-  let items = document.getElementsByClassName("border");
-  let template_element = document.importNode(
-    document.getElementById("template").content, true).firstElementChild;
-
-  let promises = []
-  for (let i = 0; i < items.length; ++i) {
-    let clone = template_element.cloneNode(true);
-    promises.push(setInvisible(clone));
-    items[i].appendChild(clone);
-  }
-  await Promise.all(promises);
-  takeScreenshot();
-}
-
-onload = () => requestAnimationFrame(runTest);
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/writing-modes-ref.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/writing-modes-ref.html
deleted file mode 100644
index 80333a7..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/writing-modes-ref.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE html>
-<html>
-<meta charset="utf8">
-<title>Display Locking: writing modes (reference)</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-
-<style>
-.sized {
-  width: 12px;
-  height: 34px;
-  background: lightblue;
-  border-color: blue;
-  border-style: solid;
-  border-width: 1px 2px 3px 4px;
-  padding: 5px 6px 7px 8px;
-}
-.border {
-  border: 1px solid black;
-  width: max-content;
-  margin: 5px;
-}
-</style>
-
-<div class="border">
-    <div class="sized"></div>
-</div>
-<div class="border">
-    <div class="sized"></div>
-</div>
-<div class="border">
-    <div class="sized"></div>
-</div>
-<div class="border">
-    <div class="sized"></div>
-</div>
-<div class="border">
-    <div class="sized"></div>
-</div>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/writing-modes-switch.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/writing-modes-switch.html
deleted file mode 100644
index 4596e409..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/writing-modes-switch.html
+++ /dev/null
@@ -1,93 +0,0 @@
-<!DOCTYPE html>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: writing modes switch</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="writing-modes-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-.verticalrl {
-  writing-mode: vertical-rl;
-}
-.verticallr {
-  writing-mode: vertical-lr;
-}
-.horizontaltb {
-  writing-mode: horizontal-tb;
-}
-.sized {
-  width: 100px;
-  height: 200px;
-}
-.box {
-  background: lightblue;
-  contain-intrinsic-size: 12px 34px;
-  border-color: blue;
-  border-style: solid;
-  border-width: 1px 2px 3px 4px;
-  padding: 5px 6px 7px 8px;
-}
-.border {
-  border: 1px solid black;
-  width: max-content;
-  margin: 5px;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div class="border verticalrl">
-  <div class="box">
-    <div class="sized">hello<br>world</div>
-  </div>
-</div>
-<div class="border verticalrl">
-  <div class="box horizontaltb">
-    <div class="sized">hello<br>world</div>
-  </div>
-</div>
-<div class="border verticallr">
-  <div class="box">
-    <div class="sized">hello<br>world</div>
-  </div>
-</div>
-<div class="border horizontaltb">
-  <div class="box">
-    <div class="sized">hello<br>world</div>
-  </div>
-</div>
-<div class="border horizontaltb">
-  <div class="box verticalrl">
-    <div class="sized">hello<br>world</div>
-  </div>
-</div>
-
-<script>
-async function runTest() {
-  let items = document.getElementsByClassName("box");
-  let promises = []
-  for (let i = 0; i < items.length; ++i) {
-    promises.push(setInvisible(items[i]));
-  }
-  await Promise.all(promises);
-
-  let borders = document.getElementsByClassName("border");
-  for (let i = 0; i < borders.length; ++i) {
-    if (borders[i].classList.contains("horizontaltb")) {
-      borders[i].classList.replace("horizontaltb", "verticalrl");
-    } else {
-      borders[i].classList.replace("verticalrl", "horizontaltb");
-      borders[i].classList.replace("verticallr", "horizontaltb");
-    }
-  }
-
-  takeScreenshot();
-}
-
-onload = () => requestAnimationFrame(runTest);
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/writing-modes.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/writing-modes.html
deleted file mode 100644
index 37884af..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/sizing/writing-modes.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<!DOCTYPE html>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: writing modes</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="writing-modes-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="../resources/utils.js"></script>
-
-<style>
-.verticalrl {
-  writing-mode: vertical-rl;
-}
-.verticallr {
-  writing-mode: vertical-lr;
-}
-.horizontaltb {
-  writing-mode: horizontal-tb;
-}
-.sized {
-  width: 100px;
-  height: 200px;
-}
-.box {
-  background: lightblue;
-  contain-intrinsic-size: 12px 34px;
-  border-color: blue;
-  border-style: solid;
-  border-width: 1px 2px 3px 4px;
-  padding: 5px 6px 7px 8px;
-}
-.border {
-  border: 1px solid black;
-  width: max-content;
-  margin: 5px;
-}
-div:not([rendersubtree~="invisible"]) {
-  contain-intrinsic-size: legacy !important;
-}
-</style>
-
-<div class="border verticalrl">
-  <div class="box">
-    <div class="sized">hello<br>world</div>
-  </div>
-</div>
-<div class="border verticalrl">
-  <div class="box horizontaltb">
-    <div class="sized">hello<br>world</div>
-  </div>
-</div>
-<div class="border verticallr">
-  <div class="box">
-    <div class="sized">hello<br>world</div>
-  </div>
-</div>
-<div class="border horizontaltb">
-  <div class="box">
-    <div class="sized">hello<br>world</div>
-  </div>
-</div>
-<div class="border horizontaltb">
-  <div class="box verticalrl">
-    <div class="sized">hello<br>world</div>
-  </div>
-</div>
-
-<script>
-async function runTest() {
-  const items = document.getElementsByClassName("box");
-  const promises = []
-  for (let i = 0; i < items.length; ++i) {
-    promises.push(setInvisible(items[i]));
-  }
-  await Promise.all(promises);
-  takeScreenshot();
-}
-
-onload = () => requestAnimationFrame(runTest);
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/update-together-with-commit-both-succeed.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/update-together-with-commit-both-succeed.html
deleted file mode 100644
index ab504d74..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/update-together-with-commit-both-succeed.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: acquire, update+commit</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-container-with-child-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<style>
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-#child {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-</style>
-
-<div id="log"></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.createElement("div");
-  setInvisible(container).then(() => {
-    const child = document.createElement("div");
-    child.id = "child";
-    container.appendChild(child);
-
-    container.id = "container";
-    document.body.appendChild(container);
-
-    Promise.all([
-      container.updateRendering(),
-      setVisible(container)
-    ]).then(() => { finishTest("PASS"); },
-            () => { finishTest("FAIL"); });
-  });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/update-while-disconnected.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/update-while-disconnected.html
deleted file mode 100644
index 17bf5dca..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/update-while-disconnected.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: update while disconnected</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-ref.html">
-<script src="/common/reftest-wait.js"></script>
-<script src="resources/utils.js"></script>
-
-<div id="log"></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  const container = document.createElement("div");
-  container.id = "container";
-
-  setInvisible(container).then(() => {
-    container.updateRendering().then(
-      () => { finishTest("PASS"); },
-      (e) => { finishTest("FAIL " + e.message); });
-  });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/update-without-acquire-works.html b/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/update-without-acquire-works.html
deleted file mode 100644
index 468052f..0000000
--- a/third_party/blink/web_tests/wpt_internal/display-lock/rendersubtree/update-without-acquire-works.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!doctype HTML>
-<html class="reftest-wait">
-<meta charset="utf8">
-<title>Display Locking: update without acquire</title>
-<link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
-<link rel="help" href="https://github.com/WICG/display-locking">
-<link rel="match" href="pass-container-with-child-ref.html">
-<script src="/common/reftest-wait.js"></script>
-
-<style>
-#container {
-  width: 150px;
-  height: 150px;
-  background: lightblue;
-}
-#child {
-  width: 50px;
-  height: 50px;
-  background: lightgreen;
-}
-</style>
-
-<div id="log"></div>
-<div id="container"><div id="child"></div></div>
-
-<script>
-function finishTest(status_string) {
-  if (document.getElementById("log").innerHTML === "")
-    document.getElementById("log").innerHTML = status_string;
-  takeScreenshot();
-}
-
-function runTest() {
-  container.updateRendering().then(
-      () => { finishTest("PASS"); },
-      (e) => { finishTest("FAIL " + e.message); });
-}
-
-window.onload = runTest;
-</script>
-</html>
diff --git a/tools/OWNERS b/tools/OWNERS
index 2f045af..08b50c1 100644
--- a/tools/OWNERS
+++ b/tools/OWNERS
@@ -49,7 +49,7 @@
 per-file roll_webgl_conformance.py=zmo@chromium.org
 per-file roll_webrtc.py=phoglund@chromium.org
 
-per-file safely-roll-deps.py=borenet@chromium.org
+per-file safely-roll-deps.py=borenet@google.com
 
 per-file sort-headers.py=satorux@chromium.org
 per-file sort-sources.py=satorux@chromium.org
diff --git a/tools/cfi/blacklist.txt b/tools/cfi/blacklist.txt
index aa732c9..b0518ae 100644
--- a/tools/cfi/blacklist.txt
+++ b/tools/cfi/blacklist.txt
@@ -192,6 +192,15 @@
 
 src:*mojo/public/c/system/thunks.cc
 
+# Call to vulkan function pointers from shared library.
+src:*/gpu/vulkan/*
+src:*components/viz/common/gpu/vulkan_in_process_context_provider.cc
+src:*gpu/command_buffer/service/skia_utils.cc
+src:*gpu/command_buffer/service/external_vk_*
+src:*components/viz/service/display_embedder/skia_output_device_vulkan.cc
+src:*/third_party/skia/src/gpu/vk/*
+src:*/third_party/skia/third_party/vulkanmemoryallocator/*
+
 # The follow entries are speculatively disabled. They're included in the
 # chromium build and include calls to dynamically resolved symbols; however,
 # they do not trigger cfi-icall failures in unit tests or normal chrome usage.
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 9d8bc71..19e3aae 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -49291,6 +49291,7 @@
   <int value="8"
       label="HTTP method or url scheme does not meet the requirement."/>
   <int value="9" label="Unknown range support from the response header."/>
+  <int value="10" label="Download is resumed without slices."/>
 </enum>
 
 <enum name="ParentAccessCodeAction">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 6d841ab..5b142d4 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -21898,9 +21898,9 @@
 </histogram>
 
 <histogram name="Canvas.Repaint.Bounds.Percentage" units="%"
-    expires_after="M82">
-  <owner>yiyix@google.com</owner>
-  <owner>fserb@google.com</owner>
+    expires_after="M84">
+  <owner>yiyix@chromium.org</owner>
+  <owner>fserb@chromium.org</owner>
   <summary>
     measure the percentage of Canvas is dirty before each repaint by using
     cc::Rect. Note that we record this metrics for all canvas that has an area
@@ -21909,9 +21909,9 @@
 </histogram>
 
 <histogram name="Canvas.Repaint.Region.Percentage" units="%"
-    expires_after="M82">
-  <owner>yiyix@google.com</owner>
-  <owner>fserb@google.com</owner>
+    expires_after="M84">
+  <owner>yiyix@chromium.org</owner>
+  <owner>fserb@chromium.org</owner>
   <summary>
     measure the percentage of Canvas is dirty before each repaint by using
     cc::Region. Note that we record this metrics for all canvas that has an area
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index 5f7812f..f119d692 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -8304,6 +8304,21 @@
   </metric>
 </event>
 
+<event name="Popup.Page">
+  <owner>justinmiron@google.com</owner>
+  <summary>
+    Page level pop-up statistics.
+  </summary>
+  <metric name="Allowed">
+    <summary>
+      Whether a user has, explicitly, allowed all popups on the last committed
+      url of a page. The user's site level popup content setting is queried when
+      a page that opened a popup is destroyed. Only emitted when at least one
+      popup has been opened and the last committed page url is valid.
+    </summary>
+  </metric>
+</event>
+
 <event name="PrefetchProxy" singular="True">
   <owner>robertogden@chromium.org</owner>
   <owner>ryansturm@chromium.org</owner>
diff --git a/ui/gfx/render_text_harfbuzz.cc b/ui/gfx/render_text_harfbuzz.cc
index 296305b..721013a 100644
--- a/ui/gfx/render_text_harfbuzz.cc
+++ b/ui/gfx/render_text_harfbuzz.cc
@@ -10,7 +10,6 @@
 #include "base/command_line.h"
 #include "base/containers/mru_cache.h"
 #include "base/containers/span.h"
-#include "base/debug/dump_without_crashing.h"
 #include "base/feature_list.h"
 #include "base/hash/hash.h"
 #include "base/i18n/base_i18n_switches.h"
@@ -2113,16 +2112,6 @@
                            TRACE_STR_COPY(font_name.c_str()),
                            "primary_font_name", primary_font.GetFontName());
       RecordShapeRunsFallback(ShapeRunFallback::FALLBACKS);
-#if defined(OS_WIN)
-      // Resolving fallback fonts using the registry keys on windows will be
-      // deprecated and removed (see: http://crbug.com/995789). The crashes
-      // reported here should be fixed before deprecating the code.
-      static bool is_first_crash = true;
-      if (is_first_crash) {
-        is_first_crash = false;
-        base::debug::DumpWithoutCrashing();
-      }
-#endif
       return;
     }
   }
diff --git a/ui/native_theme/native_theme_mac.h b/ui/native_theme/native_theme_mac.h
index d44e40e..ac81964c 100644
--- a/ui/native_theme/native_theme_mac.h
+++ b/ui/native_theme/native_theme_mac.h
@@ -81,6 +81,8 @@
 
   void InitializeDarkModeStateAndObserver();
 
+  void InitializeWebThemeState() const;
+
   base::scoped_nsobject<NativeThemeEffectiveAppearanceObserver>
       appearance_observer_;
   id high_contrast_notification_token_;
diff --git a/ui/native_theme/native_theme_mac.mm b/ui/native_theme/native_theme_mac.mm
index f383c46..2ca54aa 100644
--- a/ui/native_theme/native_theme_mac.mm
+++ b/ui/native_theme/native_theme_mac.mm
@@ -299,6 +299,8 @@
                     }];
   }
 
+  InitializeWebThemeState();
+
   // Add the web native theme as an observer to stay in sync with dark mode,
   // high contrast, and preferred color scheme changes.
   if (features::IsFormControlsRefreshEnabled()) {
@@ -336,4 +338,16 @@
       }]);
 }
 
+void NativeThemeMac::InitializeWebThemeState() const {
+  if (!features::IsFormControlsRefreshEnabled())
+    return;
+
+  // For FormControlsRefresh, NativeThemeAura is used as web instance so we need
+  // to initialize its state.
+  NativeTheme* web_instance = NativeTheme::GetInstanceForWeb();
+  web_instance->set_use_dark_colors(IsDarkMode());
+  web_instance->set_preferred_color_scheme(CalculatePreferredColorScheme());
+  web_instance->set_high_contrast(IsHighContrast());
+}
+
 }  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.cc b/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.cc
index 41f63b23..c723e3d 100644
--- a/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.cc
+++ b/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.cc
@@ -92,6 +92,12 @@
           VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME,
           VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME};
 }
+
+std::vector<const char*>
+VulkanImplementationGbm::GetOptionalDeviceExtensions() {
+  return {};
+}
+
 VkFence VulkanImplementationGbm::CreateVkFenceForGpuFence(VkDevice vk_device) {
   VkFenceCreateInfo fence_create_info = {};
   fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
diff --git a/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.h b/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.h
index cbbbbcc5..12ab2eb 100644
--- a/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.h
+++ b/ui/ozone/platform/drm/gpu/vulkan_implementation_gbm.h
@@ -27,6 +27,7 @@
       const std::vector<VkQueueFamilyProperties>& queue_family_properties,
       uint32_t queue_family_index) override;
   std::vector<const char*> GetRequiredDeviceExtensions() override;
+  std::vector<const char*> GetOptionalDeviceExtensions() override;
   VkFence CreateVkFenceForGpuFence(VkDevice vk_device) override;
   std::unique_ptr<gfx::GpuFence> ExportVkFenceToGpuFence(
       VkDevice vk_device,
diff --git a/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc b/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
index f61ce48..e057fd9 100644
--- a/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
+++ b/ui/ozone/platform/scenic/vulkan_implementation_scenic.cc
@@ -137,6 +137,11 @@
   };
 }
 
+std::vector<const char*>
+VulkanImplementationScenic::GetOptionalDeviceExtensions() {
+  return {};
+}
+
 VkFence VulkanImplementationScenic::CreateVkFenceForGpuFence(
     VkDevice vk_device) {
   NOTIMPLEMENTED();
diff --git a/ui/ozone/platform/scenic/vulkan_implementation_scenic.h b/ui/ozone/platform/scenic/vulkan_implementation_scenic.h
index 8b077b8..cd0a605 100644
--- a/ui/ozone/platform/scenic/vulkan_implementation_scenic.h
+++ b/ui/ozone/platform/scenic/vulkan_implementation_scenic.h
@@ -35,6 +35,7 @@
       const std::vector<VkQueueFamilyProperties>& queue_family_properties,
       uint32_t queue_family_index) override;
   std::vector<const char*> GetRequiredDeviceExtensions() override;
+  std::vector<const char*> GetOptionalDeviceExtensions() override;
   VkFence CreateVkFenceForGpuFence(VkDevice vk_device) override;
   std::unique_ptr<gfx::GpuFence> ExportVkFenceToGpuFence(
       VkDevice vk_device,
diff --git a/weblayer/BUILD.gn b/weblayer/BUILD.gn
index 34dac7d9a..2e8b2d3 100644
--- a/weblayer/BUILD.gn
+++ b/weblayer/BUILD.gn
@@ -137,8 +137,6 @@
     "browser/profile_impl.h",
     "browser/ssl_error_controller_client.cc",
     "browser/ssl_error_controller_client.h",
-    "browser/ssl_host_state_delegate_impl.cc",
-    "browser/ssl_host_state_delegate_impl.h",
     "browser/system_network_context_manager.cc",
     "browser/system_network_context_manager.h",
     "browser/tab_impl.cc",
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TopControlsTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TopControlsTest.java
index 8702872f..97f2483 100644
--- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TopControlsTest.java
+++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TopControlsTest.java
@@ -4,6 +4,7 @@
 
 package org.chromium.weblayer.test;
 
+import android.os.Build;
 import android.support.test.filters.SmallTest;
 import android.support.v4.app.Fragment;
 import android.view.View;
@@ -16,6 +17,7 @@
 
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.content_public.browser.test.util.Criteria;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
@@ -73,6 +75,8 @@
         helper.waitForCallback(0);
     }
 
+    // Disabled on L bots due to unexplained flakes. See crbug.com/1035894.
+    @MinAndroidSdkLevel(Build.VERSION_CODES.M)
     @Test
     @SmallTest
     public void testBasic() throws Exception {
@@ -95,15 +99,16 @@
         mInitialVisiblePageHeight = getVisiblePageHeight();
         Assert.assertTrue(mInitialVisiblePageHeight > 0);
 
+        // Move by the size of the top-controls.
+        EventUtils.simulateDragFromCenterOfView(
+                activity.getWindow().getDecorView(), 0, -mTopControlsHeight);
+
         // Moving should change the size of the page. Don't attempt to correlate the size as the
         // page doesn't see pixels, and to attempt to compare may result in rounding errors. Poll
         // for this value as there is no good way to detect when done.
         CriteriaHelper.pollInstrumentationThread(new Criteria() {
             @Override
             public boolean isSatisfied() {
-                // Move by the size of the top-controls.
-                EventUtils.simulateDragFromCenterOfView(
-                        activity.getWindow().getDecorView(), 0, -mTopControlsHeight);
                 return mInitialVisiblePageHeight != getVisiblePageHeight();
             }
         });
@@ -113,13 +118,14 @@
             Assert.assertEquals(View.INVISIBLE, activity.getTopContentsContainer().getVisibility());
         });
 
+        // Move so top-controls are shown again.
+        EventUtils.simulateDragFromCenterOfView(
+                activity.getWindow().getDecorView(), 0, mTopControlsHeight);
+
         // Wait for the page height to match initial height.
         CriteriaHelper.pollInstrumentationThread(new Criteria() {
             @Override
             public boolean isSatisfied() {
-                // Move so top-controls are shown again.
-                EventUtils.simulateDragFromCenterOfView(
-                        activity.getWindow().getDecorView(), 0, mTopControlsHeight);
                 return mInitialVisiblePageHeight == getVisiblePageHeight();
             }
         });
diff --git a/weblayer/browser/browser_context_impl.cc b/weblayer/browser/browser_context_impl.cc
index ac87cfef..470def7 100644
--- a/weblayer/browser/browser_context_impl.cc
+++ b/weblayer/browser/browser_context_impl.cc
@@ -18,6 +18,7 @@
 #include "content/public/browser/device_service.h"
 #include "content/public/browser/download_request_utils.h"
 #include "content/public/browser/resource_context.h"
+#include "weblayer/browser/chrome_ssl_host_state_delegate_factory.h"
 #include "weblayer/browser/fake_permission_controller_delegate.h"
 #include "weblayer/public/common/switches.h"
 
@@ -140,7 +141,7 @@
 }
 
 content::SSLHostStateDelegate* BrowserContextImpl::GetSSLHostStateDelegate() {
-  return &ssl_host_state_delegate_;
+  return ChromeSSLHostStateDelegateFactory::GetForBrowserContext(this);
 }
 
 content::PermissionControllerDelegate*
diff --git a/weblayer/browser/browser_context_impl.h b/weblayer/browser/browser_context_impl.h
index 5d947fce..7e228abe 100644
--- a/weblayer/browser/browser_context_impl.h
+++ b/weblayer/browser/browser_context_impl.h
@@ -10,7 +10,6 @@
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "weblayer/browser/download_manager_delegate_impl.h"
-#include "weblayer/browser/ssl_host_state_delegate_impl.h"
 #include "weblayer/public/profile.h"
 
 namespace user_prefs {
@@ -81,7 +80,6 @@
   std::unique_ptr<ResourceContextImpl, content::BrowserThread::DeleteOnIOThread>
       resource_context_;
   DownloadManagerDelegateImpl download_delegate_;
-  SSLHostStateDelegateImpl ssl_host_state_delegate_;
   std::unique_ptr<PrefService> user_pref_service_;
   std::unique_ptr<content::PermissionControllerDelegate>
       permission_controller_delegate_;
diff --git a/weblayer/browser/download_browsertest.cc b/weblayer/browser/download_browsertest.cc
index 6d52c1fa..78980b86 100644
--- a/weblayer/browser/download_browsertest.cc
+++ b/weblayer/browser/download_browsertest.cc
@@ -328,4 +328,16 @@
   EXPECT_EQ(download_state(), DownloadError::kConnectivityError);
 }
 
+IN_PROC_BROWSER_TEST_F(DownloadBrowserTest, PendingOnExist) {
+  // Create a request that doesn't complete right away.
+  GURL url(embedded_test_server()->GetURL(
+      content::SlowDownloadHttpResponse::kKnownSizeUrl));
+
+  shell()->tab()->GetNavigationController()->Navigate(url);
+
+  WaitForStarted();
+
+  // If this test crashes later then there'd be a regression.
+}
+
 }  // namespace weblayer
diff --git a/weblayer/browser/download_manager_delegate_impl.cc b/weblayer/browser/download_manager_delegate_impl.cc
index 2b44985..92d4c5d0 100644
--- a/weblayer/browser/download_manager_delegate_impl.cc
+++ b/weblayer/browser/download_manager_delegate_impl.cc
@@ -52,6 +52,11 @@
 
 DownloadManagerDelegateImpl::~DownloadManagerDelegateImpl() {
   download_manager_->RemoveObserver(this);
+  // Match the AddObserver calls added in OnDownloadCreated to avoid UaF.
+  download::SimpleDownloadManager::DownloadVector downloads;
+  download_manager_->GetAllDownloads(&downloads);
+  for (auto* download : downloads)
+    download->RemoveObserver(this);
 }
 
 bool DownloadManagerDelegateImpl::DetermineDownloadTarget(
diff --git a/weblayer/browser/ssl_host_state_delegate_impl.cc b/weblayer/browser/ssl_host_state_delegate_impl.cc
deleted file mode 100644
index 6275c10..0000000
--- a/weblayer/browser/ssl_host_state_delegate_impl.cc
+++ /dev/null
@@ -1,104 +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.
-
-#include "weblayer/browser/ssl_host_state_delegate_impl.h"
-
-#include "base/callback.h"
-#include "net/base/hash_value.h"
-
-using content::SSLHostStateDelegate;
-
-namespace weblayer {
-
-namespace internal {
-
-CertPolicy::CertPolicy() = default;
-CertPolicy::~CertPolicy() = default;
-
-// For an allowance, we consider a given |cert| to be a match to a saved
-// allowed cert if the |error| is an exact match to or subset of the errors
-// in the saved CertStatus.
-bool CertPolicy::Check(const net::X509Certificate& cert, int error) const {
-  net::SHA256HashValue fingerprint = cert.CalculateChainFingerprint256();
-  auto allowed_iter = allowed_.find(fingerprint);
-  return ((allowed_iter != allowed_.end()) && (allowed_iter->second & error) &&
-          ((allowed_iter->second & error) == error));
-}
-
-void CertPolicy::Allow(const net::X509Certificate& cert, int error) {
-  // If this same cert had already been saved with a different error status,
-  // this will replace it with the new error status.
-  net::SHA256HashValue fingerprint = cert.CalculateChainFingerprint256();
-  allowed_[fingerprint] = error;
-}
-
-}  // namespace internal
-
-SSLHostStateDelegateImpl::SSLHostStateDelegateImpl() = default;
-SSLHostStateDelegateImpl::~SSLHostStateDelegateImpl() = default;
-
-void SSLHostStateDelegateImpl::HostRanInsecureContent(
-    const std::string& host,
-    int child_id,
-    InsecureContentType content_type) {
-  // Intentional no-op.
-}
-
-bool SSLHostStateDelegateImpl::DidHostRunInsecureContent(
-    const std::string& host,
-    int child_id,
-    InsecureContentType content_type) {
-  // Intentional no-op.
-  return false;
-}
-
-void SSLHostStateDelegateImpl::AllowCert(const std::string& host,
-                                         const net::X509Certificate& cert,
-                                         int error,
-                                         content::WebContents* web_contents) {
-  cert_policy_for_host_[host].Allow(cert, error);
-}
-
-void SSLHostStateDelegateImpl::Clear(
-    base::RepeatingCallback<bool(const std::string&)> host_filter) {
-  if (host_filter.is_null()) {
-    cert_policy_for_host_.clear();
-    return;
-  }
-
-  for (auto it = cert_policy_for_host_.begin();
-       it != cert_policy_for_host_.end();) {
-    auto next_it = std::next(it);
-
-    if (host_filter.Run(it->first))
-      cert_policy_for_host_.erase(it);
-
-    it = next_it;
-  }
-}
-
-SSLHostStateDelegate::CertJudgment SSLHostStateDelegateImpl::QueryPolicy(
-    const std::string& host,
-    const net::X509Certificate& cert,
-    int error,
-    content::WebContents* web_contents) {
-  return cert_policy_for_host_[host].Check(cert, error)
-             ? SSLHostStateDelegate::ALLOWED
-             : SSLHostStateDelegate::DENIED;
-}
-
-void SSLHostStateDelegateImpl::RevokeUserAllowExceptions(
-    const std::string& host) {
-  cert_policy_for_host_.erase(host);
-}
-
-bool SSLHostStateDelegateImpl::HasAllowException(
-    const std::string& host,
-    content::WebContents* web_contents) {
-  auto policy_iterator = cert_policy_for_host_.find(host);
-  return policy_iterator != cert_policy_for_host_.end() &&
-         policy_iterator->second.HasAllowException();
-}
-
-}  // namespace weblayer
diff --git a/weblayer/browser/ssl_host_state_delegate_impl.h b/weblayer/browser/ssl_host_state_delegate_impl.h
deleted file mode 100644
index 12e0dda..0000000
--- a/weblayer/browser/ssl_host_state_delegate_impl.h
+++ /dev/null
@@ -1,87 +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 WEBLAYER_BROWSER_SSL_HOST_STATE_DELEGATE_IMPL_H_
-#define WEBLAYER_BROWSER_SSL_HOST_STATE_DELEGATE_IMPL_H_
-
-#include <map>
-#include <string>
-
-#include "base/macros.h"
-#include "content/public/browser/ssl_host_state_delegate.h"
-#include "net/base/hash_value.h"
-#include "net/cert/x509_certificate.h"
-
-namespace weblayer {
-
-namespace internal {
-
-// This class maintains the policy for storing actions on certificate errors.
-class CertPolicy {
- public:
-  CertPolicy();
-  ~CertPolicy();
-  // Returns true if the user has decided to proceed through the ssl error
-  // before. For a certificate to be allowed, it must not have any
-  // *additional* errors from when it was allowed.
-  bool Check(const net::X509Certificate& cert, int error) const;
-
-  // Causes the policy to allow this certificate for a given |error|. And
-  // remember the user's choice.
-  void Allow(const net::X509Certificate& cert, int error);
-
-  // Returns true if and only if there exists a user allow exception for some
-  // certificate.
-  bool HasAllowException() const { return allowed_.size() > 0; }
-
- private:
-  // The set of fingerprints of allowed certificates.
-  std::map<net::SHA256HashValue, int> allowed_;
-};
-
-}  // namespace internal
-
-// This class is a copy of AwSSLHostStateDelegate. It saves cert decisions in
-// memory, and doesn't perpetuate across application restarts.
-class SSLHostStateDelegateImpl : public content::SSLHostStateDelegate {
- public:
-  SSLHostStateDelegateImpl();
-  ~SSLHostStateDelegateImpl() override;
-
-  // Records that |cert| is permitted to be used for |host| in the future, for
-  // a specified |error| type.
-  void AllowCert(const std::string& host,
-                 const net::X509Certificate& cert,
-                 int error,
-                 content::WebContents* web_contents) override;
-
-  void Clear(
-      base::RepeatingCallback<bool(const std::string&)> host_filter) override;
-
-  // content::SSLHostStateDelegate:
-  content::SSLHostStateDelegate::CertJudgment QueryPolicy(
-      const std::string& host,
-      const net::X509Certificate& cert,
-      int error,
-      content::WebContents* web_contents) override;
-  void HostRanInsecureContent(const std::string& host,
-                              int child_id,
-                              InsecureContentType content_type) override;
-  bool DidHostRunInsecureContent(const std::string& host,
-                                 int child_id,
-                                 InsecureContentType content_type) override;
-  void RevokeUserAllowExceptions(const std::string& host) override;
-  bool HasAllowException(const std::string& host,
-                         content::WebContents* web_contents) override;
-
- private:
-  // Certificate policies for each host.
-  std::map<std::string, internal::CertPolicy> cert_policy_for_host_;
-
-  DISALLOW_COPY_AND_ASSIGN(SSLHostStateDelegateImpl);
-};
-
-}  // namespace weblayer
-
-#endif  // WEBLAYER_BROWSER_SSL_HOST_STATE_DELEGATE_IMPL_H_