diff --git a/DEPS b/DEPS
index ee480add..bbd0400d 100644
--- a/DEPS
+++ b/DEPS
@@ -172,11 +172,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': '861ac61cb1a925074192da6efceec7385b1c6c53',
+  'skia_revision': 'bf46a27cdd732ace31d65b31cd76b60d29b09517',
   # 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': '40fb0777ccc0f69ca9da177f0995578b853547a7',
+  'v8_revision': '1b6546d2aec2966f8b2946724baa6f271e4cf7f7',
   # 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.
@@ -184,11 +184,11 @@
   # 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': '74d4bf9893fc1f783be256c39c1b3f99af16f517',
+  'angle_revision': '2ed71c811da7de457110f3100be6025ef520307a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '663dcefa22ea5eec1b108feebaf40a683fb104ff',
+  'swiftshader_revision': '8a6dcf76315ca1bd7268cbdb82124dfae90b8237',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -243,7 +243,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': '5d4133ef017102da89b416af040605a25fa7ee98',
+  'devtools_frontend_revision': 'c4c0786bd310b8780b53eac712e1db10fd979077',
   # 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.
@@ -307,7 +307,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.
-  'quiche_revision': '7e8ae0dee24ddec61496d4328691a2c4f5a91415',
+  'quiche_revision': 'f54082a0145f7e06a30d451ae84a66bb32718a6d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -887,7 +887,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '34267f83deb773d1ae98caa1ee8db881b842a38e',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'f31cb801f2cda4ce9ac98675d439070d57c84154',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -1293,7 +1293,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '9d27d96fff7212a6df605b5dd228ee7ea2960299',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '74a93d412a1edb167d17db0a7105f202dc7d7624',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1494,7 +1494,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'dd55f3ca8f2ea716ca917a4aaf36f0729fe902b1',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '9f9e20a3dc687d94e2fa865b5ab27c22d67f143d',
+    Var('webrtc_git') + '/src.git' + '@' + '79685304182cd81f34c3d2b80527d4e8de92b04c',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -1561,7 +1561,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@552673083f4a54be356db5ec6573be6b82255fb5',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@29815810c9441e73b07891118e1f1e799ae3dfdf',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/WATCHLISTS b/WATCHLISTS
index 9bb2e9f..4fa263c 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -88,8 +88,8 @@
       'filepath': 'chrome/android/java/src/org/chromium/chrome/browser/Tab'
     },
     'android_uma_settings': {
-      'filepath': 'chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManager.java|'\
-                  'chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java|'\
+      'filepath': 'chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManager.java|'\
+                  'chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferences.java|'\
                   'chrome/android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java',
     },
     'android_webapk': {
@@ -1564,8 +1564,6 @@
     'sampling_profiler': {
       'filepath': 'base/profiler/'\
                   '|chrome/common/profiler/'\
-                  '|chrome/common/stack_sampling_configuration*'\
-                  '|chrome/common/thread_profiler*'\
                   '|chrome/renderer/v8_unwinder*'\
                   '|components/metrics/*call_stack*'\
                   '|components/metrics/public/mojom/call_stack*',
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 1f79d77d..bd7f8ed 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
@@ -207,6 +207,8 @@
     @MediumTest
     @Feature({"AndroidWebView"})
     public void testNotCalledForHistoryApi() throws Throwable {
+        TestCallbackHelperContainer.OnPageStartedHelper onPageStartedHelper =
+                mContentsClient.getOnPageStartedHelper();
         TestCallbackHelperContainer.OnPageFinishedHelper onPageFinishedHelper =
                 mContentsClient.getOnPageFinishedHelper();
         AwActivityTestRule.enableJavaScriptOnUiThread(mAwContents);
@@ -222,6 +224,7 @@
             final String historyUrl = webServer.getResponseUrl(historyPath);
             final String syncUrl = webServer.setResponse(syncPath, testHtml, null);
 
+            Assert.assertEquals(0, onPageStartedHelper.getCallCount());
             Assert.assertEquals(0, onPageFinishedHelper.getCallCount());
             mActivityTestRule.loadUrlSync(mAwContents, onPageFinishedHelper, testUrl);
 
@@ -232,10 +235,14 @@
             // we load another valid page. Since callbacks arrive sequentially if the next callback
             // we get is for the synchronizationUrl we know that the previous load did not schedule
             // a callback for the iframe.
-            final int synchronizationPageCallCount = onPageFinishedHelper.getCallCount();
+            final int synchronizationPageStartedCallCount = onPageStartedHelper.getCallCount();
+            final int synchronizationPageFinishedCallCount = onPageFinishedHelper.getCallCount();
             mActivityTestRule.loadUrlAsync(mAwContents, syncUrl);
 
-            onPageFinishedHelper.waitForCallback(synchronizationPageCallCount);
+            onPageStartedHelper.waitForCallback(synchronizationPageStartedCallCount);
+            onPageFinishedHelper.waitForCallback(synchronizationPageFinishedCallCount);
+            Assert.assertEquals(syncUrl, onPageStartedHelper.getUrl());
+            Assert.assertEquals(2, onPageStartedHelper.getCallCount());
             Assert.assertEquals(syncUrl, onPageFinishedHelper.getUrl());
             Assert.assertEquals(2, onPageFinishedHelper.getCallCount());
         } finally {
diff --git a/ash/app_list/app_list_metrics.cc b/ash/app_list/app_list_metrics.cc
index 701b5f1..81f20ca 100644
--- a/ash/app_list/app_list_metrics.cc
+++ b/ash/app_list/app_list_metrics.cc
@@ -296,7 +296,7 @@
   }
 
   switch (command_id) {
-    // Used by LauncherContextMenu (shelf).
+    // Used by ShelfContextMenu (shelf).
     case ash::CommandId::MENU_OPEN_NEW:
     case ash::CommandId::MENU_NEW_WINDOW:
     case ash::CommandId::MENU_NEW_INCOGNITO_WINDOW:
@@ -306,12 +306,12 @@
     case ash::CommandId::OPTIONS:
     case ash::CommandId::APP_CONTEXT_MENU_NEW_WINDOW:
     case ash::CommandId::APP_CONTEXT_MENU_NEW_INCOGNITO_WINDOW:
-    // Used by both AppContextMenu and LauncherContextMenu for app shortcuts.
+    // Used by both AppContextMenu and ShelfContextMenu for app shortcuts.
     case ash::CommandId::LAUNCH_APP_SHORTCUT_FIRST:
     case ash::CommandId::LAUNCH_APP_SHORTCUT_LAST:
       return true;
 
-    // Used by LauncherContextMenu (shelf).
+    // Used by ShelfContextMenu (shelf).
     case ash::CommandId::MENU_CLOSE:
     case ash::CommandId::MENU_PIN:
     case ash::CommandId::LAUNCH_TYPE_PINNED_TAB:
diff --git a/ash/app_list/app_list_presenter_delegate_impl.cc b/ash/app_list/app_list_presenter_delegate_impl.cc
index 093636d..944884a 100644
--- a/ash/app_list/app_list_presenter_delegate_impl.cc
+++ b/ash/app_list/app_list_presenter_delegate_impl.cc
@@ -262,20 +262,6 @@
     if (!hotseat_window || !hotseat_window->Contains(target))
       presenter_->Dismiss(event->time_stamp());
   }
-
-  if (IsTabletMode() && presenter_->IsShowingEmbeddedAssistantUI()) {
-    auto* contents_view =
-        presenter_->GetView()->app_list_main_view()->contents_view();
-    if (contents_view->bounds().Contains(event->location())) {
-      // Keep Assistant open if event happen inside.
-      return;
-    }
-
-    // Touching anywhere else closes Assistant.
-    view_->Back();
-    view_->search_box_view()->ClearSearch();
-    view_->search_box_view()->SetSearchBoxActive(false, ui::ET_UNKNOWN);
-  }
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/ash/app_list/app_list_presenter_impl.cc b/ash/app_list/app_list_presenter_impl.cc
index 5618a7c..956ac14 100644
--- a/ash/app_list/app_list_presenter_impl.cc
+++ b/ash/app_list/app_list_presenter_impl.cc
@@ -172,10 +172,6 @@
   return is_target_visibility_show_ && view_ && view_->HandleCloseOpenFolder();
 }
 
-bool AppListPresenterImpl::HandleCloseOpenSearchBox() {
-  return view_ && view_->HandleCloseOpenSearchBox();
-}
-
 ash::ShelfAction AppListPresenterImpl::ToggleAppList(
     int64_t display_id,
     AppListShowSource show_source,
@@ -423,51 +419,56 @@
 
 void AppListPresenterImpl::OnWindowFocused(aura::Window* gained_focus,
                                            aura::Window* lost_focus) {
-  if (view_ && is_target_visibility_show_) {
-    int gained_focus_container_id = kShellWindowId_Invalid;
-    if (gained_focus) {
-      gained_focus_container_id = gained_focus->id();
-      const aura::Window* container =
-          delegate_->GetContainerForWindow(gained_focus);
-      if (container)
-        gained_focus_container_id = container->id();
-    }
-    aura::Window* applist_window = view_->GetWidget()->GetNativeView();
-    const aura::Window* applist_container = applist_window->parent();
+  if (!view_ || !is_target_visibility_show_)
+    return;
 
-    // An AppList dialog window, or a child window of the system tray, may
-    // take focus from the AppList window. Don't consider this a visibility
-    // change since the app list is still visible for the most part.
-    const bool gained_focus_hides_app_list =
-        gained_focus_container_id != kShellWindowId_Invalid &&
-        !base::Contains(kIdsOfContainersThatWontHideAppList,
-                        gained_focus_container_id);
+  int gained_focus_container_id = kShellWindowId_Invalid;
+  if (gained_focus) {
+    gained_focus_container_id = gained_focus->id();
+    const aura::Window* container =
+        delegate_->GetContainerForWindow(gained_focus);
+    if (container)
+      gained_focus_container_id = container->id();
+  }
+  aura::Window* applist_window = view_->GetWidget()->GetNativeView();
+  const aura::Window* applist_container = applist_window->parent();
 
-    const bool app_list_lost_focus =
-        gained_focus ? gained_focus_hides_app_list
-                     : (lost_focus && applist_container->Contains(lost_focus));
+  // An AppList dialog window, or a child window of the system tray, may
+  // take focus from the AppList window. Don't consider this a visibility
+  // change since the app list is still visible for the most part.
+  const bool gained_focus_hides_app_list =
+      gained_focus_container_id != kShellWindowId_Invalid &&
+      !base::Contains(kIdsOfContainersThatWontHideAppList,
+                      gained_focus_container_id);
 
-    if (delegate_->IsTabletMode()) {
-      const bool is_shown = !app_list_lost_focus;
-      if (is_shown != delegate_->IsVisible()) {
-        if (is_shown)
-          view_->OnHomeLauncherGainingFocusWithoutAnimation();
-        else
-          HandleCloseOpenSearchBox();
+  const bool app_list_lost_focus =
+      gained_focus ? gained_focus_hides_app_list
+                   : (lost_focus && applist_container->Contains(lost_focus));
 
-        OnVisibilityWillChange(is_shown, GetDisplayId());
-        OnVisibilityChanged(is_shown, GetDisplayId());
+  if (delegate_->IsTabletMode()) {
+    const bool is_shown = !app_list_lost_focus;
+    if (is_shown != delegate_->IsVisible()) {
+      if (is_shown) {
+        view_->OnHomeLauncherGainingFocusWithoutAnimation();
+      } else {
+        // In tablet mode, when |AppList| lost focus after other new App window
+        // opened, we should perform "back" action on the active page, e.g.
+        // close the search box or the embedded Assistant UI if it's opened.
+        view_->Back();
       }
-    }
 
-    if (applist_window->Contains(gained_focus))
-      base::RecordAction(base::UserMetricsAction("AppList_WindowFocused"));
-
-    if (app_list_lost_focus && !switches::ShouldNotDismissOnBlur() &&
-        !delegate_->IsTabletMode()) {
-      Dismiss(base::TimeTicks());
+      OnVisibilityWillChange(is_shown, GetDisplayId());
+      OnVisibilityChanged(is_shown, GetDisplayId());
     }
   }
+
+  if (applist_window->Contains(gained_focus))
+    base::RecordAction(base::UserMetricsAction("AppList_WindowFocused"));
+
+  if (app_list_lost_focus && !switches::ShouldNotDismissOnBlur() &&
+      !delegate_->IsTabletMode()) {
+    Dismiss(base::TimeTicks());
+  }
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/ash/app_list/app_list_presenter_impl.h b/ash/app_list/app_list_presenter_impl.h
index 22839cd0..9da0a18d 100644
--- a/ash/app_list/app_list_presenter_impl.h
+++ b/ash/app_list/app_list_presenter_impl.h
@@ -69,10 +69,6 @@
   // folder was closed.
   bool HandleCloseOpenFolder();
 
-  // If app list has an open search box, close it. Returns whether an open
-  // search box was closed.
-  bool HandleCloseOpenSearchBox();
-
   // Show the app list if it is visible, hide it if it is hidden. If
   // |event_time_stamp| is not 0, it means |ToggleAppList()| was triggered by
   // one of the AppListShowSources: kSearchKey or kShelfButton.
diff --git a/ash/app_list/views/app_list_view.cc b/ash/app_list/views/app_list_view.cc
index e3e183c2..76f91a1 100644
--- a/ash/app_list/views/app_list_view.cc
+++ b/ash/app_list/views/app_list_view.cc
@@ -761,7 +761,10 @@
 }
 
 bool AppListView::Back() {
-  return app_list_main_view_->contents_view()->Back();
+  if (app_list_main_view_)
+    return app_list_main_view_->contents_view()->Back();
+
+  return false;
 }
 
 void AppListView::OnPaint(gfx::Canvas* canvas) {
@@ -919,8 +922,8 @@
     if (!is_tablet_mode())
       return;
 
-    // Home launcher is shown on top of wallpaper with trasparent background. So
-    // trigger the wallpaper context menu for the same events.
+    // Home launcher is shown on top of wallpaper with transparent background.
+    // So trigger the wallpaper context menu for the same events.
     gfx::Point onscreen_location(event->location());
     ConvertPointToScreen(this, &onscreen_location);
     delegate_->ShowWallpaperContextMenu(
diff --git a/ash/app_list/views/assistant/assistant_page_view_unittest.cc b/ash/app_list/views/assistant/assistant_page_view_unittest.cc
index 7840a80..d44055ba 100644
--- a/ash/app_list/views/assistant/assistant_page_view_unittest.cc
+++ b/ash/app_list/views/assistant/assistant_page_view_unittest.cc
@@ -7,6 +7,7 @@
 #include "ash/assistant/ui/assistant_ui_constants.h"
 #include "base/run_loop.h"
 #include "chromeos/services/assistant/public/mojom/assistant.mojom-shared.h"
+#include "ui/events/event.h"
 #include "ui/views/controls/textfield/textfield.h"
 #include "ui/views/focus/focus_manager.h"
 
@@ -69,6 +70,21 @@
   DISALLOW_COPY_AND_ASSIGN(FocusChangeListenerStub);
 };
 
+// Simply constructs a GestureEvent for test.
+class GestureEventForTest : public ui::GestureEvent {
+ public:
+  GestureEventForTest(const gfx::Point& location,
+                      ui::GestureEventDetails details)
+      : GestureEvent(location.x(),
+                     location.y(),
+                     /*flags=*/ui::EF_NONE,
+                     base::TimeTicks(),
+                     details) {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(GestureEventForTest);
+};
+
 class AssistantPageViewTest : public AssistantAshTestBase {
  public:
   AssistantPageViewTest() = default;
@@ -339,4 +355,51 @@
   EXPECT_TRUE(IsKeyboardShowing());
 }
 
+TEST_F(AssistantPageViewTabletModeTest,
+       ShouldDismissWhenTappingOutsideWithinAppListView) {
+  ShowAssistantUi();
+  EXPECT_TRUE(IsVisible());
+
+  // Tapping position should be outside the Assistant UI but still inside the
+  // bounds of |AppList| window.
+  gfx::Point origin = page_view()->origin();
+  gfx::Point point_outside = gfx::Point(origin.x() - 10, origin.y());
+  EXPECT_TRUE(window()->bounds().Contains(point_outside));
+  EXPECT_FALSE(page_view()->bounds().Contains(point_outside));
+
+  // Tapping outside on the empty region of |AppListView| should dismiss the
+  // Assistant UI.
+  GestureEventForTest tap_outside(point_outside,
+                                  ui::GestureEventDetails(ui::ET_GESTURE_TAP));
+  app_list_view()->OnGestureEvent(&tap_outside);
+  EXPECT_FALSE(IsVisible());
+}
+
+TEST_F(AssistantPageViewTabletModeTest,
+       ShouldDismissIfLostFocusWhenOtherAppWindowOpens) {
+  ShowAssistantUi();
+  EXPECT_TRUE(IsVisible());
+
+  // Creates a new window to steal the focus should dismiss the Assistant UI.
+  SwitchToNewAppWindow();
+  EXPECT_FALSE(IsVisible());
+}
+
+TEST_F(AssistantPageViewTabletModeTest, ShouldNotDismissWhenTappingInside) {
+  ShowAssistantUi();
+  EXPECT_TRUE(IsVisible());
+
+  // Tapping position should be inside the Assistant UI.
+  gfx::Point origin = page_view()->origin();
+  gfx::Point point_inside = gfx::Point(origin.x() + 10, origin.y() + 10);
+  EXPECT_TRUE(page_view()->bounds().Contains(point_inside));
+
+  // Tapping inside should not dismiss the Assistant UI.
+  GestureEventForTest tap_inside(point_inside,
+                                 ui::GestureEventDetails(ui::ET_GESTURE_TAP));
+  page_view()->OnGestureEvent(&tap_inside);
+
+  EXPECT_TRUE(IsVisible());
+}
+
 }  // namespace ash
diff --git a/ash/app_list/views/assistant/assistant_test_api_impl.cc b/ash/app_list/views/assistant/assistant_test_api_impl.cc
index 71c319a..ceb574b 100644
--- a/ash/app_list/views/assistant/assistant_test_api_impl.cc
+++ b/ash/app_list/views/assistant/assistant_test_api_impl.cc
@@ -89,6 +89,10 @@
   return main_view()->GetWidget()->GetNativeWindow();
 }
 
+views::View* AssistantTestApiImpl::app_list_view() {
+  return static_cast<views::View*>(contents_view()->app_list_view());
+}
+
 void AssistantTestApiImpl::EnableAssistant() {
   Shell::Get()->session_controller()->GetPrimaryUserPrefService()->SetBoolean(
       chromeos::assistant::prefs::kAssistantEnabled, true);
diff --git a/ash/app_list/views/assistant/assistant_test_api_impl.h b/ash/app_list/views/assistant/assistant_test_api_impl.h
index 6094f31..b6b6559 100644
--- a/ash/app_list/views/assistant/assistant_test_api_impl.h
+++ b/ash/app_list/views/assistant/assistant_test_api_impl.h
@@ -6,6 +6,7 @@
 #define ASH_APP_LIST_VIEWS_ASSISTANT_ASSISTANT_TEST_API_IMPL_H_
 
 #include <memory>
+#include <string>
 
 #include "ash/public/cpp/test/assistant_test_api.h"
 #include "base/macros.h"
@@ -43,6 +44,7 @@
   views::View* voice_input_toggle() override;
   views::View* keyboard_input_toggle() override;
   aura::Window* window() override;
+  views::View* app_list_view() override;
 
  private:
   void EnableAnimations();
diff --git a/ash/assistant/assistant_proactive_suggestions_controller.cc b/ash/assistant/assistant_proactive_suggestions_controller.cc
index b0c9fba4..1df37b2 100644
--- a/ash/assistant/assistant_proactive_suggestions_controller.cc
+++ b/ash/assistant/assistant_proactive_suggestions_controller.cc
@@ -268,7 +268,7 @@
   if (view_) {
     // If the |view_| already exists, calling MaybeShowUi() will just ensure
     // that its widget is showing to the user.
-    view_->GetWidget()->ShowInactive();
+    view_->ShowWhenReady();
     return;
   }
 
@@ -306,7 +306,7 @@
   }
 
   view_->Init();
-  view_->GetWidget()->ShowInactive();
+  view_->ShowWhenReady();
 
   RecordProactiveSuggestionsShowAttempt(
       view_->proactive_suggestions()->category(),
@@ -340,13 +340,13 @@
 
   auto_close_timer_.Stop();
 
-  view_->GetWidget()->Close();
+  view_->Close();
   view_ = nullptr;
 }
 
 void AssistantProactiveSuggestionsController::HideUi() {
   if (view_)
-    view_->GetWidget()->Hide();
+    view_->Hide();
 }
 
 }  // namespace ash
diff --git a/ash/assistant/test/assistant_ash_test_base.cc b/ash/assistant/test/assistant_ash_test_base.cc
index c936c5f..dd052bb5 100644
--- a/ash/assistant/test/assistant_ash_test_base.cc
+++ b/ash/assistant/test/assistant_ash_test_base.cc
@@ -126,6 +126,10 @@
   test_api_->SetPreferVoice(prefer_voice);
 }
 
+bool AssistantAshTestBase::IsVisible() {
+  return test_api_->IsVisible();
+}
+
 views::View* AssistantAshTestBase::main_view() {
   return test_api_->main_view();
 }
@@ -134,6 +138,10 @@
   return test_api_->page_view();
 }
 
+views::View* AssistantAshTestBase::app_list_view() {
+  return test_api_->app_list_view();
+}
+
 void AssistantAshTestBase::MockAssistantInteractionWithResponse(
     const std::string& response_text) {
   MockAssistantInteractionWithQueryAndResponse(/*query=*/"input text",
diff --git a/ash/assistant/test/assistant_ash_test_base.h b/ash/assistant/test/assistant_ash_test_base.h
index 3c9da74dd..84c8ca4 100644
--- a/ash/assistant/test/assistant_ash_test_base.h
+++ b/ash/assistant/test/assistant_ash_test_base.h
@@ -53,6 +53,9 @@
   // keyboard.
   void SetPreferVoice(bool value);
 
+  // Return true if the Assistant UI is visible.
+  bool IsVisible();
+
   // Return the actual displayed Assistant main view.
   // Can only be used after |ShowAssistantUi| has been called.
   views::View* main_view();
@@ -61,6 +64,10 @@
   // Can only be used after |ShowAssistantUi| has been called.
   views::View* page_view();
 
+  // Return the app list view hosting the Assistant page view.
+  // Can only be used after |ShowAssistantUi| has been called.
+  views::View* app_list_view();
+
   // Spoof sending a request to the Assistant service,
   // and receiving |response_text| as a response to display.
   void MockAssistantInteractionWithResponse(const std::string& response_text);
diff --git a/ash/assistant/ui/proactive_suggestions_rich_view.cc b/ash/assistant/ui/proactive_suggestions_rich_view.cc
index 2c8ce5c..821a351 100644
--- a/ash/assistant/ui/proactive_suggestions_rich_view.cc
+++ b/ash/assistant/ui/proactive_suggestions_rich_view.cc
@@ -6,8 +6,10 @@
 
 #include "ash/assistant/ui/assistant_view_delegate.h"
 #include "base/base64.h"
+#include "chromeos/services/assistant/public/features.h"
 #include "ui/aura/window.h"
 #include "ui/views/layout/fill_layout.h"
+#include "ui/views/widget/widget.h"
 
 namespace ash {
 
@@ -124,6 +126,29 @@
   contents_->Navigate(GURL(kDataUriPrefix + encoded_html));
 }
 
+void ProactiveSuggestionsRichView::ShowWhenReady() {
+  // If no children have yet been added to the layout, the embedded web contents
+  // has not yet finished loading. In this case, we'll set a flag and delay
+  // showing until loading stops to avoid UI jank.
+  if (children().empty()) {
+    show_when_ready_ = true;
+    return;
+  }
+  // Otherwise it's fine to go ahead w/ showing the widget immediately.
+  GetWidget()->ShowInactive();
+  show_when_ready_ = false;
+}
+
+void ProactiveSuggestionsRichView::Hide() {
+  show_when_ready_ = false;
+  ProactiveSuggestionsView::Hide();
+}
+
+void ProactiveSuggestionsRichView::Close() {
+  show_when_ready_ = false;
+  ProactiveSuggestionsView::Close();
+}
+
 void ProactiveSuggestionsRichView::DidAutoResizeView(
     const gfx::Size& new_size) {
   contents_->GetView()->view()->SetPreferredSize(new_size);
@@ -134,10 +159,17 @@
   AddChildView(contents_->GetView()->view());
   PreferredSizeChanged();
 
-  // TODO(dmblack): Parameterize corner radius.
-  constexpr int kCornerRadiusDip = 16;
+  // Once the view for the embedded web contents has been fully initialized,
+  // it's safe to set our desired corner radius.
   contents_->GetView()->native_view()->layer()->SetRoundedCornerRadius(
-      gfx::RoundedCornersF(kCornerRadiusDip));
+      gfx::RoundedCornersF(
+          chromeos::assistant::features::
+              GetProactiveSuggestionsRichEntryPointCornerRadius()));
+
+  // This view should now be fully initialized, so it's safe to show without
+  // risk of introducing UI jank if we so desire.
+  if (show_when_ready_)
+    ShowWhenReady();
 }
 
 void ProactiveSuggestionsRichView::DidSuppressNavigation(
diff --git a/ash/assistant/ui/proactive_suggestions_rich_view.h b/ash/assistant/ui/proactive_suggestions_rich_view.h
index be41f1e..0b4238a6 100644
--- a/ash/assistant/ui/proactive_suggestions_rich_view.h
+++ b/ash/assistant/ui/proactive_suggestions_rich_view.h
@@ -30,6 +30,9 @@
   // ProactiveSuggestionsView:
   const char* GetClassName() const override;
   void InitLayout() override;
+  void ShowWhenReady() override;
+  void Hide() override;
+  void Close() override;
 
   // content::NavigableContentsObserver:
   void DidAutoResizeView(const gfx::Size& new_size) override;
@@ -41,6 +44,12 @@
  private:
   mojo::Remote<content::mojom::NavigableContentsFactory> contents_factory_;
   std::unique_ptr<content::NavigableContents> contents_;
+
+  // Because the web contents that this view embeds loads asynchronously, it
+  // may cause UI jank if we show our widget before loading has stopped. To
+  // address this we won't show the widget for this view until our contents has
+  // stopped loading and we use this flag to track if we have a pending show.
+  bool show_when_ready_ = false;
 };
 
 }  // namespace ash
diff --git a/ash/assistant/ui/proactive_suggestions_view.cc b/ash/assistant/ui/proactive_suggestions_view.cc
index 2d65e4d..981036c 100644
--- a/ash/assistant/ui/proactive_suggestions_view.cc
+++ b/ash/assistant/ui/proactive_suggestions_view.cc
@@ -40,6 +40,12 @@
 }
 
 void ProactiveSuggestionsView::Init() {
+  // By default, a Button will add a FocusRing to its view hierarchy to indicate
+  // focus. The widget for this view is not activatable, and this view cannot be
+  // focused, but the presence of the FocusRing leads to unexpected behavior
+  // when checking against children(), so it's better that we don't install it.
+  SetInstallFocusRingOnFocus(false);
+
   InitLayout();
   InitWidget();
   InitWindow();
@@ -150,6 +156,18 @@
   UpdateBounds();
 }
 
+void ProactiveSuggestionsView::ShowWhenReady() {
+  GetWidget()->ShowInactive();
+}
+
+void ProactiveSuggestionsView::Hide() {
+  GetWidget()->Hide();
+}
+
+void ProactiveSuggestionsView::Close() {
+  GetWidget()->Close();
+}
+
 void ProactiveSuggestionsView::InitWidget() {
   views::Widget::InitParams params;
   params.activatable = views::Widget::InitParams::Activatable::ACTIVATABLE_NO;
diff --git a/ash/assistant/ui/proactive_suggestions_view.h b/ash/assistant/ui/proactive_suggestions_view.h
index 37fe08e..32fe156 100644
--- a/ash/assistant/ui/proactive_suggestions_view.h
+++ b/ash/assistant/ui/proactive_suggestions_view.h
@@ -56,6 +56,13 @@
   void OnKeyboardOccludedBoundsChanged(
       const gfx::Rect& new_bounds_in_screen) override;
 
+  // Shows/hides/closes the view.
+  // Note that ShowWhenReady() may show the widget for the view asynchronously
+  // if it is unsafe to show immediately without possibly causing UI jank.
+  virtual void ShowWhenReady();
+  virtual void Hide();
+  virtual void Close();
+
   const ProactiveSuggestions* proactive_suggestions() const {
     return proactive_suggestions_.get();
   }
diff --git a/ash/login/ui/lock_contents_view.cc b/ash/login/ui/lock_contents_view.cc
index 0af97cb..b618655 100644
--- a/ash/login/ui/lock_contents_view.cc
+++ b/ash/login/ui/lock_contents_view.cc
@@ -931,13 +931,8 @@
     label->SetMaximumWidth(
         big_view->auth_user()->password_view()->GetPreferredSize().width());
 
-    auto* container = new NonAccessibleView();
-    container->SetLayoutManager(std::make_unique<views::BoxLayout>(
-        views::BoxLayout::Orientation::kVertical));
-    container->AddChildView(label);
-
     auth_error_bubble_->SetAnchorView(big_view->auth_user()->password_view());
-    auth_error_bubble_->SetContent(container);
+    auth_error_bubble_->SetContent(label);
     auth_error_bubble_->SetPersistent(true);
     auth_error_bubble_->Show();
   }
@@ -1975,6 +1970,7 @@
 
   auth_error_bubble_->SetAnchorView(big_view->auth_user()->password_view());
   auth_error_bubble_->SetContent(container);
+  auth_error_bubble_->SetAccessibleName(error_text);
   auth_error_bubble_->SetPersistent(false);
   auth_error_bubble_->Show();
 }
diff --git a/ash/login/ui/login_error_bubble.cc b/ash/login/ui/login_error_bubble.cc
index 433e9213..ebc0734 100644
--- a/ash/login/ui/login_error_bubble.cc
+++ b/ash/login/ui/login_error_bubble.cc
@@ -58,6 +58,10 @@
   AddChildView(content_);
 }
 
+void LoginErrorBubble::SetAccessibleName(const base::string16& name) {
+  accessible_name_ = name;
+}
+
 bool LoginErrorBubble::IsPersistent() const {
   return is_persistent_;
 }
@@ -81,7 +85,8 @@
 }
 
 void LoginErrorBubble::GetAccessibleNodeData(ui::AXNodeData* node_data) {
-  node_data->role = ax::mojom::Role::kTooltip;
+  node_data->role = ax::mojom::Role::kAlertDialog;
+  node_data->SetName(accessible_name_);
 }
 
 }  // namespace ash
diff --git a/ash/login/ui/login_error_bubble.h b/ash/login/ui/login_error_bubble.h
index 3acd155a..0b42a33 100644
--- a/ash/login/ui/login_error_bubble.h
+++ b/ash/login/ui/login_error_bubble.h
@@ -7,6 +7,7 @@
 
 #include "ash/ash_export.h"
 #include "ash/login/ui/login_base_bubble_view.h"
+#include "ui/accessibility/ax_node_data.h"
 #include "ui/views/view.h"
 
 namespace ash {
@@ -20,6 +21,11 @@
   ~LoginErrorBubble() override;
 
   void SetContent(views::View* content);
+  // We set an accessible name when content is not accessible. This happens if
+  // content is a container (e.g. a text and a "learn more" button). In such a
+  // case, it will have multiple subviews but only one which needs to be read
+  // on bubble show – when the alert event occurs.
+  void SetAccessibleName(const base::string16& name);
 
   // LoginBaseBubbleView:
   bool IsPersistent() const override;
@@ -34,6 +40,9 @@
   views::View* content_ = nullptr;
   bool is_persistent_;
 
+  // Accessibility data.
+  base::string16 accessible_name_;
+
   DISALLOW_COPY_AND_ASSIGN(LoginErrorBubble);
 };
 
diff --git a/ash/public/cpp/app_menu_constants.h b/ash/public/cpp/app_menu_constants.h
index 0063ed6..4515bac 100644
--- a/ash/public/cpp/app_menu_constants.h
+++ b/ash/public/cpp/app_menu_constants.h
@@ -16,7 +16,7 @@
 // Context Menu launch. Delay deprecating these because it will disrupt
 // histograms. https://crbug.com/854433
 enum CommandId {
-  // Used by LauncherContextMenu.
+  // Used by ShelfContextMenu.
   MENU_OPEN_NEW = 0,
   MENU_CLOSE = 1,
   MENU_PIN = 2,
@@ -52,12 +52,12 @@
   USE_LAUNCH_TYPE_COMMAND_END,
 
   // Range of command ids reserved for launching app shortcuts from context
-  // menu for Android app. Used by AppContextMenu and LauncherContextMenu.
+  // menu for Android app. Used by AppContextMenu and ShelfContextMenu.
   LAUNCH_APP_SHORTCUT_FIRST = 1000,
   LAUNCH_APP_SHORTCUT_LAST = 1999,
 
   // Command for stopping an app, or stopping a VM via an associated app. Used
-  // by AppContextMenu and LauncherContextMenu.
+  // by AppContextMenu and ShelfContextMenu.
   STOP_APP = 2000,
 
   // Reserved range for extension/app custom menus as defined by
diff --git a/ash/public/cpp/test/assistant_test_api.h b/ash/public/cpp/test/assistant_test_api.h
index 5fe4fdbf..b1bdefb 100644
--- a/ash/public/cpp/test/assistant_test_api.h
+++ b/ash/public/cpp/test/assistant_test_api.h
@@ -6,6 +6,7 @@
 #define ASH_PUBLIC_CPP_TEST_ASSISTANT_TEST_API_H_
 
 #include <memory>
+#include <string>
 
 #include "ash/ash_export.h"
 
@@ -78,6 +79,10 @@
   // Returns the window containing the Assistant UI.
   // Note that this window is shared for all components of the |AppList|.
   virtual aura::Window* window() = 0;
+
+  // Returns the app list view hosting the Assistant UI.
+  // Can only be used after the Assistant UI has been shown at least once.
+  virtual views::View* app_list_view() = 0;
 };
 
 }  // namespace ash
diff --git a/ash/shelf/shelf_background_animator.cc b/ash/shelf/shelf_background_animator.cc
index 0af3ab1..87e23713 100644
--- a/ash/shelf/shelf_background_animator.cc
+++ b/ash/shelf/shelf_background_animator.cc
@@ -16,6 +16,8 @@
 #include "ash/shelf/shelf_background_animator_observer.h"
 #include "ash/shell.h"
 #include "ash/wallpaper/wallpaper_controller_impl.h"
+#include "ash/wm/tablet_mode/tablet_mode_controller.h"
+#include "chromeos/constants/chromeos_switches.h"
 #include "ui/gfx/animation/slide_animation.h"
 #include "ui/gfx/color_analysis.h"
 #include "ui/gfx/color_palette.h"
@@ -222,10 +224,16 @@
       shelf_target_color = ShelfConfig::Get()->GetDefaultShelfColor();
       break;
     case SHELF_BACKGROUND_MAXIMIZED:
-    case SHELF_BACKGROUND_OVERVIEW:
     case SHELF_BACKGROUND_IN_APP:
       shelf_target_color = ShelfConfig::Get()->GetMaximizedShelfColor();
       break;
+    case SHELF_BACKGROUND_OVERVIEW:
+      shelf_target_color =
+          (chromeos::switches::ShouldShowShelfHotseat() &&
+           Shell::Get()->tablet_mode_controller()->InTabletMode())
+              ? ShelfConfig::Get()->GetMaximizedShelfColor()
+              : ShelfConfig::Get()->GetDefaultShelfColor();
+      break;
     case SHELF_BACKGROUND_OOBE:
       shelf_target_color = SK_ColorTRANSPARENT;
       break;
diff --git a/ash/shelf/shelf_config.cc b/ash/shelf/shelf_config.cc
index f28fa05..1c12586 100644
--- a/ash/shelf/shelf_config.cc
+++ b/ash/shelf/shelf_config.cc
@@ -266,8 +266,10 @@
   }
 
   SkColor final_color = AshColorProvider::Get()->GetBaseLayerColor(
-      AshColorProvider::BaseLayerType::kTransparent74,
+      IsTabletMode() ? AshColorProvider::BaseLayerType::kTransparent60
+                     : AshColorProvider::BaseLayerType::kTransparent74,
       AshColorProvider::AshColorMode::kDark);
+  int final_alpha = SkColorGetA(final_color);
 
   if (!Shell::Get()->wallpaper_controller())
     return final_color;
@@ -284,7 +286,7 @@
   final_color = color_utils::GetResultingPaintColor(
       SkColorSetA(SK_ColorBLACK, 127), dark_muted_color);
 
-  return SkColorSetA(final_color, 189);  // 74% opacity
+  return SkColorSetA(final_color, final_alpha);
 }
 
 int ShelfConfig::GetShelfControlButtonBlurRadius() const {
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc
index 9b80fbf..c90316d 100644
--- a/ash/shelf/shelf_layout_manager.cc
+++ b/ash/shelf/shelf_layout_manager.cc
@@ -802,8 +802,16 @@
 }
 
 bool ShelfLayoutManager::ShouldBlurShelfBackground() {
-  return is_background_blur_enabled_ &&
-         shelf_background_type_ == SHELF_BACKGROUND_DEFAULT &&
+  if (!is_background_blur_enabled_)
+    return false;
+
+  if (chromeos::switches::ShouldShowShelfHotseat()) {
+    return shelf_background_type_ == SHELF_BACKGROUND_DEFAULT &&
+           state_.session_state == session_manager::SessionState::ACTIVE;
+  }
+
+  return (shelf_background_type_ == SHELF_BACKGROUND_HOME_LAUNCHER ||
+          shelf_background_type_ == SHELF_BACKGROUND_DEFAULT) &&
          state_.session_state == session_manager::SessionState::ACTIVE;
 }
 
diff --git a/ash/shelf/shelf_widget.cc b/ash/shelf/shelf_widget.cc
index 1b35198..de6575f 100644
--- a/ash/shelf/shelf_widget.cc
+++ b/ash/shelf/shelf_widget.cc
@@ -320,6 +320,7 @@
   // Show rounded corners except in maximized (which includes split view) mode,
   // or whenever we are "in app".
   if (background_type == SHELF_BACKGROUND_MAXIMIZED ||
+      background_type == SHELF_BACKGROUND_IN_APP ||
       (tablet_mode && in_app && chromeos::switches::ShouldShowShelfHotseat())) {
     opaque_background_.SetRoundedCornerRadius({0, 0, 0, 0});
   } else {
diff --git a/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc b/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc
index 20b27de..42edab5 100644
--- a/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc
+++ b/ash/wm/tablet_mode/tablet_mode_controller_unittest.cc
@@ -186,16 +186,18 @@
   bool IsScreenshotShown() const { return test_api_->IsScreenshotShown(); }
 
   // Creates a test window snapped on the left in desktop mode.
-  std::unique_ptr<aura::Window> CreateDesktopWindowSnappedLeft() {
-    std::unique_ptr<aura::Window> window = CreateTestWindow();
+  std::unique_ptr<aura::Window> CreateDesktopWindowSnappedLeft(
+      const gfx::Rect& bounds = gfx::Rect()) {
+    std::unique_ptr<aura::Window> window = CreateTestWindow(bounds);
     WMEvent snap_to_left(WM_EVENT_CYCLE_SNAP_LEFT);
     WindowState::Get(window.get())->OnWMEvent(&snap_to_left);
     return window;
   }
 
   // Creates a test window snapped on the right in desktop mode.
-  std::unique_ptr<aura::Window> CreateDesktopWindowSnappedRight() {
-    std::unique_ptr<aura::Window> window = CreateTestWindow();
+  std::unique_ptr<aura::Window> CreateDesktopWindowSnappedRight(
+      const gfx::Rect& bounds = gfx::Rect()) {
+    std::unique_ptr<aura::Window> window = CreateTestWindow(bounds);
     WMEvent snap_to_right(WM_EVENT_CYCLE_SNAP_RIGHT);
     WindowState::Get(window.get())->OnWMEvent(&snap_to_right);
     return window;
@@ -1405,6 +1407,32 @@
   EXPECT_EQ(window1.get(), window_util::GetActiveWindow());
 }
 
+TEST_P(TabletModeControllerTest, StartTabletActiveLeftSnapOnSecondaryDisplay) {
+  UpdateDisplay("800x600,800x600");
+  std::unique_ptr<aura::Window> window =
+      CreateDesktopWindowSnappedLeft(gfx::Rect(800, 0, 400, 400));
+  EXPECT_NE(Shell::GetPrimaryRootWindow(), window->GetRootWindow());
+  tablet_mode_controller()->SetEnabledForTest(true);
+  // Make sure display mirroring triggers without any crashes.
+  base::RunLoop().RunUntilIdle();
+}
+
+TEST_P(
+    TabletModeControllerTest,
+    StartTabletActiveLeftSnapOnPrimaryDisplayPreviousRightSnapOnSecondaryDisplay) {
+  UpdateDisplay("800x600,800x600");
+  std::unique_ptr<aura::Window> window1 =
+      CreateDesktopWindowSnappedLeft(gfx::Rect(0, 0, 400, 400));
+  EXPECT_EQ(Shell::GetPrimaryRootWindow(), window1->GetRootWindow());
+  std::unique_ptr<aura::Window> window2 =
+      CreateDesktopWindowSnappedRight(gfx::Rect(800, 0, 400, 400));
+  EXPECT_NE(Shell::GetPrimaryRootWindow(), window2->GetRootWindow());
+  wm::ActivateWindow(window1.get());
+  tablet_mode_controller()->SetEnabledForTest(true);
+  // Make sure display mirroring triggers without any crashes.
+  base::RunLoop().RunUntilIdle();
+}
+
 // Test that tablet mode controller does not respond to the input device changes
 // during its suspend.
 TEST_P(TabletModeControllerTest, DoNotObserverInputDeviceChangeDuringSuspend) {
diff --git a/ash/wm/tablet_mode/tablet_mode_window_manager.cc b/ash/wm/tablet_mode/tablet_mode_window_manager.cc
index 7d83668..ca0935c1 100644
--- a/ash/wm/tablet_mode/tablet_mode_window_manager.cc
+++ b/ash/wm/tablet_mode/tablet_mode_window_manager.cc
@@ -44,12 +44,14 @@
 
 // This function is called to check if window[i] is eligible to be carried over
 // to split view mode during clamshell <-> tablet mode transition or multi-user
-// switch transition. Returns true if windows[i] exists and can snap in split
-// view.
+// switch transition. Returns true if windows[i] exists, is on |root_window|,
+// and can snap in split view.
 bool IsCarryOverCandidateForSplitView(
     const MruWindowTracker::WindowList& windows,
-    size_t i) {
-  return windows.size() > i && CanSnapInSplitview(windows[i]);
+    size_t i,
+    aura::Window* root_window) {
+  return windows.size() > i && windows[i]->GetRootWindow() == root_window &&
+         CanSnapInSplitview(windows[i]);
 }
 
 // Returns the windows that are going to be carried over to splitview during
@@ -69,11 +71,12 @@
                        return window->GetProperty(kIsShowingInOverviewKey);
                      }),
       mru_windows.end());
-  if (IsCarryOverCandidateForSplitView(mru_windows, 0u)) {
+  aura::Window* root_window = Shell::GetPrimaryRootWindow();
+  if (IsCarryOverCandidateForSplitView(mru_windows, 0u, root_window)) {
     if (WindowState::Get(mru_windows[0])->GetStateType() ==
         WindowStateType::kLeftSnapped) {
       windows.emplace(mru_windows[0], WindowStateType::kLeftSnapped);
-      if (IsCarryOverCandidateForSplitView(mru_windows, 1u) &&
+      if (IsCarryOverCandidateForSplitView(mru_windows, 1u, root_window) &&
           WindowState::Get(mru_windows[1])->GetStateType() ==
               WindowStateType::kRightSnapped) {
         windows.emplace(mru_windows[1], WindowStateType::kRightSnapped);
@@ -81,7 +84,7 @@
     } else if (WindowState::Get(mru_windows[0])->GetStateType() ==
                WindowStateType::kRightSnapped) {
       windows.emplace(mru_windows[0], WindowStateType::kRightSnapped);
-      if (IsCarryOverCandidateForSplitView(mru_windows, 1u) &&
+      if (IsCarryOverCandidateForSplitView(mru_windows, 1u, root_window) &&
           WindowState::Get(mru_windows[1])->GetStateType() ==
               WindowStateType::kLeftSnapped) {
         windows.emplace(mru_windows[1], WindowStateType::kLeftSnapped);
diff --git a/base/BUILD.gn b/base/BUILD.gn
index ab42b8a..6514d46 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -310,6 +310,7 @@
     "memory/discardable_memory.h",
     "memory/discardable_memory_allocator.cc",
     "memory/discardable_memory_allocator.h",
+    "memory/discardable_memory_internal.h",
     "memory/discardable_shared_memory.cc",
     "memory/discardable_shared_memory.h",
     "memory/free_deleter.h",
@@ -2550,6 +2551,7 @@
     "location_unittest.cc",
     "logging_unittest.cc",
     "memory/aligned_memory_unittest.cc",
+    "memory/discardable_memory_backing_field_trial_unittest.cc",
     "memory/discardable_shared_memory_unittest.cc",
     "memory/memory_pressure_listener_unittest.cc",
     "memory/memory_pressure_monitor_unittest.cc",
diff --git a/base/memory/discardable_memory.cc b/base/memory/discardable_memory.cc
index f0730aa4..3a34fa3d 100644
--- a/base/memory/discardable_memory.cc
+++ b/base/memory/discardable_memory.cc
@@ -3,11 +3,123 @@
 // found in the LICENSE file.
 
 #include "base/memory/discardable_memory.h"
+#include "base/feature_list.h"
+#include "base/memory/discardable_memory_internal.h"
+#include "base/memory/madv_free_discardable_memory_posix.h"
+#include "base/metrics/field_trial_params.h"
+#include "build/build_config.h"
+
+#if defined(OS_ANDROID)
+#include <third_party/ashmem/ashmem.h>
+#endif  // defined(OS_ANDROID)
 
 namespace base {
 
+namespace features {
+#if defined(OS_POSIX)
+// Feature flag allowing the use of MADV_FREE discardable memory when there are
+// multiple supported discardable memory backings.
+const base::Feature kMadvFreeDiscardableMemory{
+    "MadvFreeDiscardableMemory", base::FEATURE_DISABLED_BY_DEFAULT};
+#endif  // defined(OS_POSIX)
+
+#if defined(OS_ANDROID) || defined(OS_LINUX)
+const base::Feature kDiscardableMemoryBackingTrial{
+    "DiscardableMemoryBackingTrial", base::FEATURE_DISABLED_BY_DEFAULT};
+
+// Association of trial group names to trial group enum. Array order must match
+// order of DiscardableMemoryTrialGroup enum.
+const base::FeatureParam<DiscardableMemoryTrialGroup>::Option
+    kDiscardableMemoryBackingParamOptions[] = {
+        {DiscardableMemoryTrialGroup::kEmulatedSharedMemory, "shmem"},
+        {DiscardableMemoryTrialGroup::kMadvFree, "madvfree"},
+        {DiscardableMemoryTrialGroup::kAshmem, "ashmem"}};
+
+const base::FeatureParam<DiscardableMemoryTrialGroup>
+    kDiscardableMemoryBackingParam{
+        &kDiscardableMemoryBackingTrial, "DiscardableMemoryBacking",
+        DiscardableMemoryTrialGroup::kEmulatedSharedMemory,
+        &kDiscardableMemoryBackingParamOptions};
+
+#endif  // defined(OS_ANDROID) || defined(OS_LINUX)
+
+}  // namespace features
+
+namespace {
+
+#if defined(OS_ANDROID) || defined(OS_LINUX)
+
+DiscardableMemoryBacking GetBackingForFieldTrial() {
+  DiscardableMemoryTrialGroup trial_group =
+      GetDiscardableMemoryBackingFieldTrialGroup();
+  switch (trial_group) {
+    case DiscardableMemoryTrialGroup::kEmulatedSharedMemory:
+    case DiscardableMemoryTrialGroup::kAshmem:
+      return DiscardableMemoryBacking::kSharedMemory;
+    case DiscardableMemoryTrialGroup::kMadvFree:
+      return DiscardableMemoryBacking::kMadvFree;
+  }
+  NOTREACHED();
+}
+#endif  // defined(OS_ANDROID) || defined(OS_LINUX)
+
+DiscardableMemoryBacking GetPlatformDiscardableMemoryBacking() {
+#if defined(OS_ANDROID) || defined(OS_LINUX)
+  if (DiscardableMemoryBackingFieldTrialIsEnabled()) {
+    return GetBackingForFieldTrial();
+  }
+#endif  // defined(OS_ANDROID) || defined(OS_LINUX)
+
+#if defined(OS_ANDROID)
+  if (ashmem_device_is_supported())
+    return DiscardableMemoryBacking::kSharedMemory;
+#endif  // defined(OS_ANDROID)
+
+#if defined(OS_POSIX)
+  if (base::FeatureList::IsEnabled(
+          base::features::kMadvFreeDiscardableMemory) &&
+      base::GetMadvFreeSupport() == base::MadvFreeSupport::kSupported) {
+    return DiscardableMemoryBacking::kMadvFree;
+  }
+#endif  // defined(OS_POSIX)
+
+  return DiscardableMemoryBacking::kSharedMemory;
+}
+
+}  // namespace
+
+#if defined(OS_ANDROID) || defined(OS_LINUX)
+
+// Probe capabilities of this device to determine whether we should participate
+// in the discardable memory backing trial.
+bool DiscardableMemoryBackingFieldTrialIsEnabled() {
+#if defined(OS_ANDROID)
+  if (!ashmem_device_is_supported())
+    return false;
+#endif  // defined(OS_ANDROID)
+  if (base::GetMadvFreeSupport() != base::MadvFreeSupport::kSupported)
+    return false;
+
+  // IMPORTANT: Only query the feature after we determine the device has the
+  // capabilities required, which will have the side-effect of assigning a
+  // trial-group.
+  return base::FeatureList::IsEnabled(features::kDiscardableMemoryBackingTrial);
+}
+
+DiscardableMemoryTrialGroup GetDiscardableMemoryBackingFieldTrialGroup() {
+  DCHECK(DiscardableMemoryBackingFieldTrialIsEnabled());
+  return features::kDiscardableMemoryBackingParam.Get();
+}
+#endif  // defined(OS_ANDROID) || defined(OS_LINUX)
+
 DiscardableMemory::DiscardableMemory() = default;
 
 DiscardableMemory::~DiscardableMemory() = default;
 
+DiscardableMemoryBacking GetDiscardableMemoryBacking() {
+  static DiscardableMemoryBacking backing =
+      GetPlatformDiscardableMemoryBacking();
+  return backing;
+}
+
 }  // namespace base
diff --git a/base/memory/discardable_memory.h b/base/memory/discardable_memory.h
index f5e2747..83aed6b 100644
--- a/base/memory/discardable_memory.h
+++ b/base/memory/discardable_memory.h
@@ -7,6 +7,7 @@
 
 #include "base/base_export.h"
 #include "base/compiler_specific.h"
+#include "build/build_config.h"
 
 namespace base {
 
@@ -77,6 +78,9 @@
       trace_event::ProcessMemoryDump* pmd) const = 0;
 };
 
+enum class DiscardableMemoryBacking { kSharedMemory, kMadvFree };
+BASE_EXPORT DiscardableMemoryBacking GetDiscardableMemoryBacking();
+
 }  // namespace base
 
 #endif  // BASE_MEMORY_DISCARDABLE_MEMORY_H_
diff --git a/base/memory/discardable_memory_backing_field_trial_unittest.cc b/base/memory/discardable_memory_backing_field_trial_unittest.cc
new file mode 100644
index 0000000..d303d1b7
--- /dev/null
+++ b/base/memory/discardable_memory_backing_field_trial_unittest.cc
@@ -0,0 +1,91 @@
+// 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 "base/memory/discardable_memory.h"
+#include "base/memory/discardable_memory_internal.h"
+#include "base/metrics/field_trial.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/test/scoped_field_trial_list_resetter.h"
+#include "build/build_config.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#if defined(OS_POSIX)
+#include "base/memory/madv_free_discardable_memory_posix.h"
+#endif  // defined(OS_POSIX)
+
+#if defined(OS_ANDROID) || defined(OS_LINUX)
+namespace base {
+
+class DiscardableMemoryBackingFieldTrialTest : public ::testing::Test {
+ protected:
+  DiscardableMemoryBackingFieldTrialTest() = default;
+  ~DiscardableMemoryBackingFieldTrialTest() override = default;
+
+  std::unique_ptr<test::ScopedFeatureList>
+  GetScopedFeatureListForDiscardableMemoryTrialGroup(
+      DiscardableMemoryTrialGroup group) {
+    auto feature_list = std::make_unique<test::ScopedFeatureList>();
+    feature_list->InitAndEnableFeatureWithParameters(
+        base::features::kDiscardableMemoryBackingTrial,
+        {{features::kDiscardableMemoryBackingParam.name,
+          features::kDiscardableMemoryBackingParamOptions[group].name}});
+    return feature_list;
+  }
+};
+
+TEST_F(DiscardableMemoryBackingFieldTrialTest, TrialActiveOnlyIfCapable) {
+  std::unique_ptr<test::ScopedFeatureList> scoped_feature =
+      GetScopedFeatureListForDiscardableMemoryTrialGroup(
+          DiscardableMemoryTrialGroup::kEmulatedSharedMemory);
+  FieldTrial* trial =
+      FeatureList::GetFieldTrial(features::kDiscardableMemoryBackingTrial);
+  ASSERT_NE(trial, nullptr);
+
+  // Ensure the trial goes from disabled to enabled after querying state, if and
+  // only if we are capable of running the trial. We have force enabled the
+  // trial feature in the feature list, so |trial_enabled| implies that the
+  // device is capable.
+  EXPECT_FALSE(FieldTrialList::IsTrialActive(trial->trial_name()));
+  bool trial_enabled = DiscardableMemoryBackingFieldTrialIsEnabled();
+  EXPECT_EQ(trial_enabled, FieldTrialList::IsTrialActive(trial->trial_name()));
+}
+
+TEST_F(DiscardableMemoryBackingFieldTrialTest,
+       EmulatedSharedMemoryBackingMatchesTrialGroup) {
+  if (!DiscardableMemoryBackingFieldTrialIsEnabled())
+    return;
+  std::unique_ptr<test::ScopedFeatureList> scoped_feature =
+      GetScopedFeatureListForDiscardableMemoryTrialGroup(
+          DiscardableMemoryTrialGroup::kEmulatedSharedMemory);
+  DiscardableMemoryBacking backing = GetDiscardableMemoryBacking();
+  EXPECT_EQ(backing, DiscardableMemoryBacking::kSharedMemory);
+}
+
+TEST_F(DiscardableMemoryBackingFieldTrialTest,
+       MadvFreeBackingMatchesTrialGroup) {
+  if (!DiscardableMemoryBackingFieldTrialIsEnabled())
+    return;
+  std::unique_ptr<test::ScopedFeatureList> scoped_feature =
+      GetScopedFeatureListForDiscardableMemoryTrialGroup(
+          DiscardableMemoryTrialGroup::kMadvFree);
+  DiscardableMemoryBacking backing = GetDiscardableMemoryBacking();
+  EXPECT_EQ(backing, DiscardableMemoryBacking::kMadvFree);
+}
+
+#if defined(OS_ANDROID)
+TEST_F(DiscardableMemoryBackingFieldTrialTest, AshmemBackingMatchesTrialGroup) {
+  if (!DiscardableMemoryBackingFieldTrialIsEnabled())
+    return;
+  std::unique_ptr<test::ScopedFeatureList> scoped_feature =
+      GetScopedFeatureListForDiscardableMemoryTrialGroup(
+          DiscardableMemoryTrialGroup::kAshmem);
+  DiscardableMemoryBacking backing = GetDiscardableMemoryBacking();
+  EXPECT_EQ(backing, DiscardableMemoryBacking::kSharedMemory);
+}
+#endif  // defined(OS_ANDROID)
+
+}  // namespace base
+
+#endif  // defined(OS_ANDROID) || defined(OS_LINUX)
diff --git a/base/memory/discardable_memory_internal.h b/base/memory/discardable_memory_internal.h
new file mode 100644
index 0000000..9487a8c
--- /dev/null
+++ b/base/memory/discardable_memory_internal.h
@@ -0,0 +1,52 @@
+// 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 BASE_MEMORY_DISCARDABLE_MEMORY_INTERNAL_H_
+#define BASE_MEMORY_DISCARDABLE_MEMORY_INTERNAL_H_
+
+#include "base/base_export.h"
+#include "base/feature_list.h"
+#include "base/metrics/field_trial_params.h"
+#include "build/build_config.h"
+
+#if defined(OS_ANDROID) || defined(OS_LINUX)
+
+namespace base {
+
+// Enumeration of the possible experiment groups in the discardable memory
+// backing trial. Note that |kAshmem| and |kEmulatedSharedMemory| both map to
+// discardable shared memory, except the former allows for the use of ashmem for
+// unpinning memory. Ensure that the order of the enum values matches those in
+// |kDiscardableMemoryBackingParamOptions|.
+enum DiscardableMemoryTrialGroup : int {
+  kEmulatedSharedMemory = 0,
+  kMadvFree,
+  // Only Android devices will be assigned to the ashmem group.
+  kAshmem,
+};
+
+namespace features {
+// Feature flag enabling the discardable memory backing trial.
+BASE_EXPORT extern const base::Feature kDiscardableMemoryBackingTrial;
+
+BASE_EXPORT extern const base::FeatureParam<DiscardableMemoryTrialGroup>::Option
+    kDiscardableMemoryBackingParamOptions[];
+
+BASE_EXPORT extern const base::FeatureParam<DiscardableMemoryTrialGroup>
+    kDiscardableMemoryBackingParam;
+}  // namespace features
+
+// Whether we should do the discardable memory backing trial for this session.
+BASE_EXPORT bool DiscardableMemoryBackingFieldTrialIsEnabled();
+
+// If we should do the discardable memory backing trial, then get the trial
+// group this session belongs in.
+BASE_EXPORT DiscardableMemoryTrialGroup
+GetDiscardableMemoryBackingFieldTrialGroup();
+
+}  // namespace base
+
+#endif  // defined(OS_LINUX) || defined(OS_ANDROID)
+
+#endif  //  BASE_MEMORY_DISCARDABLE_MEMORY_INTERNAL_H_
diff --git a/base/memory/discardable_shared_memory.cc b/base/memory/discardable_shared_memory.cc
index 2d6f337..bee394a 100644
--- a/base/memory/discardable_shared_memory.cc
+++ b/base/memory/discardable_shared_memory.cc
@@ -10,7 +10,10 @@
 
 #include "base/atomicops.h"
 #include "base/bits.h"
+#include "base/feature_list.h"
 #include "base/logging.h"
+#include "base/memory/discardable_memory.h"
+#include "base/memory/discardable_memory_internal.h"
 #include "base/memory/shared_memory_tracker.h"
 #include "base/numerics/safe_math.h"
 #include "base/process/process_metrics.h"
@@ -114,6 +117,21 @@
   return bits::Align(size, base::GetPageSize());
 }
 
+#if defined(OS_ANDROID)
+bool UseAshmemUnpinningForDiscardableMemory() {
+  if (!ashmem_device_is_supported())
+    return false;
+
+  // If we are participating in the discardable memory backing trial, only
+  // enable ashmem unpinning when we are in the corresponding trial group.
+  if (base::DiscardableMemoryBackingFieldTrialIsEnabled()) {
+    return base::GetDiscardableMemoryBackingFieldTrialGroup() ==
+           base::DiscardableMemoryTrialGroup::kAshmem;
+  }
+  return true;
+}
+#endif  // defined(OS_ANDROID)
+
 }  // namespace
 
 DiscardableSharedMemory::DiscardableSharedMemory()
@@ -503,7 +521,7 @@
     size_t length) {
 #if defined(OS_ANDROID)
   if (region.IsValid()) {
-    if (ashmem_device_is_supported()) {
+    if (UseAshmemUnpinningForDiscardableMemory()) {
       int pin_result =
           ashmem_pin_region(region.GetPlatformHandle(), offset, length);
       if (pin_result == ASHMEM_WAS_PURGED)
@@ -523,7 +541,7 @@
     size_t length) {
 #if defined(OS_ANDROID)
   if (region.IsValid()) {
-    if (ashmem_device_is_supported()) {
+    if (UseAshmemUnpinningForDiscardableMemory()) {
       int unpin_result =
           ashmem_unpin_region(region.GetPlatformHandle(), offset, length);
       DCHECK_EQ(0, unpin_result);
@@ -539,7 +557,7 @@
 #if defined(OS_ANDROID)
 // static
 bool DiscardableSharedMemory::IsAshmemDeviceSupportedForTesting() {
-  return ashmem_device_is_supported();
+  return UseAshmemUnpinningForDiscardableMemory();
 }
 #endif
 
diff --git a/build/android/lint/suppressions.xml b/build/android/lint/suppressions.xml
index 6284d9e..2798039 100644
--- a/build/android/lint/suppressions.xml
+++ b/build/android/lint/suppressions.xml
@@ -397,7 +397,7 @@
     <ignore regexp="chrome/android/java/src/org/chromium/chrome/browser/media/router/BaseMediaRouteDialogManager.java"/>
     <ignore regexp="chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaRouteChooserDialogManager.java"/>
     <ignore regexp="chrome/android/java/src/org/chromium/chrome/browser/media/router/MediaRouteControllerDialogManager.java"/>
-    <ignore regexp="chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/OtherFormsOfHistoryDialogFragment.java"/>
+    <ignore regexp="chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/OtherFormsOfHistoryDialogFragment.java"/>
     <ignore regexp="media/capture/content/android/java/src/org/chromium/media/ScreenCapture.java"/>
   </issue>
   <issue id="VectorPath" severity="ignore"/>
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 9dc873f3..07a22f4b 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -143,11 +143,10 @@
   # rest with 0xAA. This makes behavior of uninitialized memory bugs consistent,
   # recognizeble in debugger, and crashes memory accesses by uninitialized
   # pointers.
-  # TODO(vitalybuka): is_win needs next llvm roll.
+  # TODO(vitalybuka):
   # 'is_android' breaks content_shell_test_apk on android-kitkat-arm-rel.
   # 'use_xcode_clang' may call old clang.
-  init_stack_vars =
-      !is_android && !is_win && !use_xcode_clang && !is_official_build
+  init_stack_vars = !is_android && !use_xcode_clang && !is_official_build
 }
 
 declare_args() {
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index eed856b7..0c08b7b 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -2682,16 +2682,6 @@
     "java/src/org/chromium/chrome/browser/permissions/PermissionUmaUtil.java",
     "java/src/org/chromium/chrome/browser/photo_picker/DecoderService.java",
     "java/src/org/chromium/chrome/browser/policy/PolicyAuditor.java",
-    "java/src/org/chromium/chrome/browser/preferences/LocationSettings.java",
-    "java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java",
-    "java/src/org/chromium/chrome/browser/preferences/about/AboutSettingsBridge.java",
-    "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfileBridge.java",
-    "java/src/org/chromium/chrome/browser/preferences/password/PasswordEditingBridge.java",
-    "java/src/org/chromium/chrome/browser/preferences/password/PasswordUIView.java",
-    "java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataBridge.java",
-    "java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataCounterBridge.java",
-    "java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManager.java",
-    "java/src/org/chromium/chrome/browser/preferences/website/WebsitePreferenceBridge.java",
     "java/src/org/chromium/chrome/browser/prerender/ExternalPrerenderHandler.java",
     "java/src/org/chromium/chrome/browser/previews/PreviewsAndroidBridge.java",
     "java/src/org/chromium/chrome/browser/printing/TabPrinter.java",
@@ -2709,6 +2699,16 @@
     "java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfModelObserverBridge.java",
     "java/src/org/chromium/chrome/browser/send_tab_to_self/TargetDeviceInfo.java",
     "java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java",
+    "java/src/org/chromium/chrome/browser/settings/LocationSettings.java",
+    "java/src/org/chromium/chrome/browser/settings/PreferencesLauncher.java",
+    "java/src/org/chromium/chrome/browser/settings/about/AboutSettingsBridge.java",
+    "java/src/org/chromium/chrome/browser/settings/autofill/AutofillProfileBridge.java",
+    "java/src/org/chromium/chrome/browser/settings/password/PasswordEditingBridge.java",
+    "java/src/org/chromium/chrome/browser/settings/password/PasswordUIView.java",
+    "java/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataBridge.java",
+    "java/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataCounterBridge.java",
+    "java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManager.java",
+    "java/src/org/chromium/chrome/browser/settings/website/WebsitePreferenceBridge.java",
     "java/src/org/chromium/chrome/browser/sharing/SharingJNIBridge.java",
     "java/src/org/chromium/chrome/browser/sharing/SharingServiceProxy.java",
     "java/src/org/chromium/chrome/browser/sharing/click_to_call/ClickToCallMessageHandler.java",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 89a76b32..7bfe6e7 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1270,139 +1270,7 @@
   "java/src/org/chromium/chrome/browser/photo_picker/PickerBitmapViewHolder.java",
   "java/src/org/chromium/chrome/browser/photo_picker/PickerCategoryView.java",
   "java/src/org/chromium/chrome/browser/policy/PolicyAuditor.java",
-  "java/src/org/chromium/chrome/browser/preferences/AccessibilityPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/ButtonPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/ChromeBaseCheckBoxPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/ChromeBasePreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/ChromeImageViewPreference.java",
   "java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java",
-  "java/src/org/chromium/chrome/browser/preferences/ChromeSwitchPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/ClearBrowsingDataCheckBoxPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/ExpandablePreferenceGroup.java",
-  "java/src/org/chromium/chrome/browser/preferences/HomepageEditor.java",
-  "java/src/org/chromium/chrome/browser/preferences/HomepagePreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/HyperlinkPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/LearnMorePreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/LocationSettings.java",
-  "java/src/org/chromium/chrome/browser/preferences/MainPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegate.java",
-  "java/src/org/chromium/chrome/browser/preferences/ManagedPreferencesUtils.java",
-  "java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/PreferenceUtils.java",
-  "java/src/org/chromium/chrome/browser/preferences/Preferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java",
-  "java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java",
-  "java/src/org/chromium/chrome/browser/preferences/SearchEnginePreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/SearchUtils.java",
-  "java/src/org/chromium/chrome/browser/preferences/SeekBarPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/SpinnerPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/sync/AccountManagementFragment.java",
-  "java/src/org/chromium/chrome/browser/preferences/sync/ManageSyncPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/sync/SignInPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/sync/SyncAndServicesPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/sync/SyncPreferenceUtils.java",
-  "java/src/org/chromium/chrome/browser/preferences/TextAndButtonPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/TextMessagePreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/TextScalePreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/about/AboutChromePreferenceOSVersion.java",
-  "java/src/org/chromium/chrome/browser/preferences/about/AboutChromePreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/about/AboutSettingsBridge.java",
-  "java/src/org/chromium/chrome/browser/preferences/about/LegalInformationPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppsFragment.java",
-  "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillCreditCardEditor.java",
-  "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillEditorBase.java",
-  "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillLocalCardEditor.java",
-  "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillPaymentMethodsFragment.java",
-  "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfileBridge.java",
-  "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfileEditorPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragment.java",
-  "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerCardEditor.java",
-  "java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerProfilePreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/autofill/CreditCardNumberFormattingTextWatcher.java",
-  "java/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionDataUseItem.java",
-  "java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java",
-  "java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionSiteBreakdownView.java",
-  "java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionStatsPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/developer/DeveloperPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/developer/TracingCategoriesPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/developer/TracingPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/download/DownloadDirectoryAdapter.java",
-  "java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreferenceAdapter.java",
-  "java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreferenceDialog.java",
-  "java/src/org/chromium/chrome/browser/preferences/download/DownloadPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/languages/AddLanguageFragment.java",
-  "java/src/org/chromium/chrome/browser/preferences/languages/LanguageItem.java",
-  "java/src/org/chromium/chrome/browser/preferences/languages/LanguageListBaseAdapter.java",
-  "java/src/org/chromium/chrome/browser/preferences/languages/LanguageListPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/languages/LanguagesManager.java",
-  "java/src/org/chromium/chrome/browser/preferences/languages/LanguagesPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/CallbackDelayer.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/DialogManager.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/ExportErrorDialogFragment.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/ExportFlow.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/ExportWarningDialogFragment.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/ManualCallbackDelayer.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryEditor.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryViewer.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/PasswordManagerHandler.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/PasswordManagerHandlerProvider.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragment.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/PasswordEditingBridge.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/PasswordEditingDelegate.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/PasswordEditingDelegateProvider.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/PasswordUIView.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/ProgressBarDialogFragment.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/ReauthenticationManager.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/SavedPasswordEntry.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/SingleThreadBarrierClosure.java",
-  "java/src/org/chromium/chrome/browser/preferences/password/TimedCallbackDelayer.java",
-  "java/src/org/chromium/chrome/browser/preferences/privacy/BandwidthType.java",
-  "java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataBridge.java",
-  "java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataCounterBridge.java",
-  "java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataFetcher.java",
-  "java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesAdvanced.java",
-  "java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasic.java",
-  "java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataTabsFragment.java",
-  "java/src/org/chromium/chrome/browser/preferences/privacy/ConfirmImportantSitesDialogFragment.java",
-  "java/src/org/chromium/chrome/browser/preferences/privacy/ContextualSearchPreferenceFragment.java",
-  "java/src/org/chromium/chrome/browser/preferences/privacy/DoNotTrackPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/privacy/OtherFormsOfHistoryDialogFragment.java",
-  "java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManager.java",
-  "java/src/org/chromium/chrome/browser/preferences/themes/RadioButtonGroupThemePreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/themes/ThemePreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/AddExceptionPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/ChosenObjectInfo.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/ChosenObjectPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/ClearWebsiteStorage.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/ClearWebsiteStorageDialog.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/ContentSetting.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/ContentSettingException.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/ContentSettingsResources.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/LocalStorageInfo.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/LocationCategory.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/ManageSpaceActivity.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/NotificationCategory.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/PermissionInfo.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/SettingsNavigationSource.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/SiteDataCleaner.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsCategory.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/StorageInfo.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/TriStateSiteSettingsPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/Website.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/WebsiteAddress.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/WebsitePreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/website/WebsitePreferenceBridge.java",
   "java/src/org/chromium/chrome/browser/prerender/ChromePrerenderService.java",
   "java/src/org/chromium/chrome/browser/prerender/ExternalPrerenderHandler.java",
   "java/src/org/chromium/chrome/browser/previews/PreviewsAndroidBridge.java",
@@ -1448,6 +1316,138 @@
   "java/src/org/chromium/chrome/browser/services/gcm/GcmUma.java",
   "java/src/org/chromium/chrome/browser/services/gcm/InvalidationGcmUpstreamSender.java",
   "java/src/org/chromium/chrome/browser/sessions/SessionTabHelper.java",
+  "java/src/org/chromium/chrome/browser/settings/AccessibilityPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/ButtonPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/ChromeBaseCheckBoxPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/ChromeBasePreference.java",
+  "java/src/org/chromium/chrome/browser/settings/ChromeImageViewPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/ChromeSwitchPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/ClearBrowsingDataCheckBoxPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/ExpandablePreferenceGroup.java",
+  "java/src/org/chromium/chrome/browser/settings/HomepageEditor.java",
+  "java/src/org/chromium/chrome/browser/settings/HomepagePreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/HyperlinkPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/LearnMorePreference.java",
+  "java/src/org/chromium/chrome/browser/settings/LocationSettings.java",
+  "java/src/org/chromium/chrome/browser/settings/MainPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/ManagedPreferenceDelegate.java",
+  "java/src/org/chromium/chrome/browser/settings/ManagedPreferencesUtils.java",
+  "java/src/org/chromium/chrome/browser/settings/NotificationsPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/PreferenceUtils.java",
+  "java/src/org/chromium/chrome/browser/settings/Preferences.java",
+  "java/src/org/chromium/chrome/browser/settings/PreferencesLauncher.java",
+  "java/src/org/chromium/chrome/browser/settings/SearchEngineAdapter.java",
+  "java/src/org/chromium/chrome/browser/settings/SearchEnginePreference.java",
+  "java/src/org/chromium/chrome/browser/settings/SearchUtils.java",
+  "java/src/org/chromium/chrome/browser/settings/SeekBarPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/SpinnerPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/sync/AccountManagementFragment.java",
+  "java/src/org/chromium/chrome/browser/settings/sync/ManageSyncPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/sync/SignInPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/sync/SyncAndServicesPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/sync/SyncPreferenceUtils.java",
+  "java/src/org/chromium/chrome/browser/settings/TextAndButtonPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/TextMessagePreference.java",
+  "java/src/org/chromium/chrome/browser/settings/TextScalePreference.java",
+  "java/src/org/chromium/chrome/browser/settings/about/AboutChromePreferenceOSVersion.java",
+  "java/src/org/chromium/chrome/browser/settings/about/AboutChromePreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/about/AboutSettingsBridge.java",
+  "java/src/org/chromium/chrome/browser/settings/about/LegalInformationPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/autofill/AndroidPaymentAppPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/autofill/AndroidPaymentAppsFragment.java",
+  "java/src/org/chromium/chrome/browser/settings/autofill/AutofillCreditCardEditor.java",
+  "java/src/org/chromium/chrome/browser/settings/autofill/AutofillEditorBase.java",
+  "java/src/org/chromium/chrome/browser/settings/autofill/AutofillLocalCardEditor.java",
+  "java/src/org/chromium/chrome/browser/settings/autofill/AutofillPaymentMethodsFragment.java",
+  "java/src/org/chromium/chrome/browser/settings/autofill/AutofillProfileBridge.java",
+  "java/src/org/chromium/chrome/browser/settings/autofill/AutofillProfileEditorPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/autofill/AutofillProfilesFragment.java",
+  "java/src/org/chromium/chrome/browser/settings/autofill/AutofillServerCardEditor.java",
+  "java/src/org/chromium/chrome/browser/settings/autofill/AutofillServerProfilePreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/autofill/CreditCardNumberFormattingTextWatcher.java",
+  "java/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionDataUseItem.java",
+  "java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionPreferenceFragment.java",
+  "java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionSiteBreakdownView.java",
+  "java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionStatsPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/developer/DeveloperPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/developer/TracingCategoriesPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/developer/TracingPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/download/DownloadDirectoryAdapter.java",
+  "java/src/org/chromium/chrome/browser/settings/download/DownloadLocationPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/download/DownloadLocationPreferenceAdapter.java",
+  "java/src/org/chromium/chrome/browser/settings/download/DownloadLocationPreferenceDialog.java",
+  "java/src/org/chromium/chrome/browser/settings/download/DownloadPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/languages/AddLanguageFragment.java",
+  "java/src/org/chromium/chrome/browser/settings/languages/LanguageItem.java",
+  "java/src/org/chromium/chrome/browser/settings/languages/LanguageListBaseAdapter.java",
+  "java/src/org/chromium/chrome/browser/settings/languages/LanguageListPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/languages/LanguagesManager.java",
+  "java/src/org/chromium/chrome/browser/settings/languages/LanguagesPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/password/CallbackDelayer.java",
+  "java/src/org/chromium/chrome/browser/settings/password/DialogManager.java",
+  "java/src/org/chromium/chrome/browser/settings/password/ExportErrorDialogFragment.java",
+  "java/src/org/chromium/chrome/browser/settings/password/ExportFlow.java",
+  "java/src/org/chromium/chrome/browser/settings/password/ExportWarningDialogFragment.java",
+  "java/src/org/chromium/chrome/browser/settings/password/ManualCallbackDelayer.java",
+  "java/src/org/chromium/chrome/browser/settings/password/PasswordEntryEditor.java",
+  "java/src/org/chromium/chrome/browser/settings/password/PasswordEntryViewer.java",
+  "java/src/org/chromium/chrome/browser/settings/password/PasswordManagerHandler.java",
+  "java/src/org/chromium/chrome/browser/settings/password/PasswordManagerHandlerProvider.java",
+  "java/src/org/chromium/chrome/browser/settings/password/PasswordReauthenticationFragment.java",
+  "java/src/org/chromium/chrome/browser/settings/password/PasswordEditingBridge.java",
+  "java/src/org/chromium/chrome/browser/settings/password/PasswordEditingDelegate.java",
+  "java/src/org/chromium/chrome/browser/settings/password/PasswordEditingDelegateProvider.java",
+  "java/src/org/chromium/chrome/browser/settings/password/PasswordUIView.java",
+  "java/src/org/chromium/chrome/browser/settings/password/ProgressBarDialogFragment.java",
+  "java/src/org/chromium/chrome/browser/settings/password/ReauthenticationManager.java",
+  "java/src/org/chromium/chrome/browser/settings/password/SavePasswordsPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/password/SavedPasswordEntry.java",
+  "java/src/org/chromium/chrome/browser/settings/password/SingleThreadBarrierClosure.java",
+  "java/src/org/chromium/chrome/browser/settings/password/TimedCallbackDelayer.java",
+  "java/src/org/chromium/chrome/browser/settings/privacy/BandwidthType.java",
+  "java/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataBridge.java",
+  "java/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataCounterBridge.java",
+  "java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataFetcher.java",
+  "java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesAdvanced.java",
+  "java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesBasic.java",
+  "java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataTabsFragment.java",
+  "java/src/org/chromium/chrome/browser/settings/privacy/ConfirmImportantSitesDialogFragment.java",
+  "java/src/org/chromium/chrome/browser/settings/privacy/ContextualSearchPreferenceFragment.java",
+  "java/src/org/chromium/chrome/browser/settings/privacy/DoNotTrackPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/privacy/OtherFormsOfHistoryDialogFragment.java",
+  "java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManager.java",
+  "java/src/org/chromium/chrome/browser/settings/themes/RadioButtonGroupThemePreference.java",
+  "java/src/org/chromium/chrome/browser/settings/themes/ThemePreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/website/AddExceptionPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/website/ChosenObjectInfo.java",
+  "java/src/org/chromium/chrome/browser/settings/website/ChosenObjectPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/website/ClearWebsiteStorage.java",
+  "java/src/org/chromium/chrome/browser/settings/website/ClearWebsiteStorageDialog.java",
+  "java/src/org/chromium/chrome/browser/settings/website/ContentSetting.java",
+  "java/src/org/chromium/chrome/browser/settings/website/ContentSettingException.java",
+  "java/src/org/chromium/chrome/browser/settings/website/ContentSettingsResources.java",
+  "java/src/org/chromium/chrome/browser/settings/website/LocalStorageInfo.java",
+  "java/src/org/chromium/chrome/browser/settings/website/LocationCategory.java",
+  "java/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivity.java",
+  "java/src/org/chromium/chrome/browser/settings/website/NotificationCategory.java",
+  "java/src/org/chromium/chrome/browser/settings/website/PermissionInfo.java",
+  "java/src/org/chromium/chrome/browser/settings/website/SettingsNavigationSource.java",
+  "java/src/org/chromium/chrome/browser/settings/website/SingleCategoryPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/website/SingleWebsitePreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/website/SiteDataCleaner.java",
+  "java/src/org/chromium/chrome/browser/settings/website/SiteSettingsCategory.java",
+  "java/src/org/chromium/chrome/browser/settings/website/SiteSettingsPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/website/SiteSettingsPreferences.java",
+  "java/src/org/chromium/chrome/browser/settings/website/StorageInfo.java",
+  "java/src/org/chromium/chrome/browser/settings/website/TriStateSiteSettingsPreference.java",
+  "java/src/org/chromium/chrome/browser/settings/website/Website.java",
+  "java/src/org/chromium/chrome/browser/settings/website/WebsiteAddress.java",
+  "java/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcher.java",
+  "java/src/org/chromium/chrome/browser/settings/website/WebsitePreference.java",
+  "java/src/org/chromium/chrome/browser/settings/website/WebsitePreferenceBridge.java",
   "java/src/org/chromium/chrome/browser/share/LensUtils.java",
   "java/src/org/chromium/chrome/browser/share/OptionalShareTargetsManager.java",
   "java/src/org/chromium/chrome/browser/share/ShareActivity.java",
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni
index 9c8ceb9..fa19e5c 100644
--- a/chrome/android/chrome_junit_test_java_sources.gni
+++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -174,21 +174,21 @@
   "junit/src/org/chromium/chrome/browser/payments/AutofillContactUnitTest.java",
   "junit/src/org/chromium/chrome/browser/payments/PaymentManifestVerifierTest.java",
   "junit/src/org/chromium/chrome/browser/preferences/PrefServiceBridgeTest.java",
-  "junit/src/org/chromium/chrome/browser/preferences/SearchEngineAdapterTest.java",
-  "junit/src/org/chromium/chrome/browser/preferences/about/AboutSettingsBridgeTest.java",
-  "junit/src/org/chromium/chrome/browser/preferences/password/DialogManagerTest.java",
-  "junit/src/org/chromium/chrome/browser/preferences/password/EnsureAsyncPostingRule.java",
-  "junit/src/org/chromium/chrome/browser/preferences/password/ExportWarningDialogFragmentTest.java",
-  "junit/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragmentTest.java",
-  "junit/src/org/chromium/chrome/browser/preferences/password/ReauthenticationManagerTest.java",
-  "junit/src/org/chromium/chrome/browser/preferences/password/SingleThreadBarrierClosureTest.java",
-  "junit/src/org/chromium/chrome/browser/preferences/password/TimedCallbackDelayerTest.java",
-  "junit/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManagerTest.java",
   "junit/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceMetricsTest.java",
   "junit/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotificationTest.java",
   "junit/src/org/chromium/chrome/browser/send_tab_to_self/NotificationSharedPrefManagerTest.java",
   "junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfAndroidBridgeTest.java",
   "junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java",
+  "junit/src/org/chromium/chrome/browser/settings/SearchEngineAdapterTest.java",
+  "junit/src/org/chromium/chrome/browser/settings/about/AboutSettingsBridgeTest.java",
+  "junit/src/org/chromium/chrome/browser/settings/password/DialogManagerTest.java",
+  "junit/src/org/chromium/chrome/browser/settings/password/EnsureAsyncPostingRule.java",
+  "junit/src/org/chromium/chrome/browser/settings/password/ExportWarningDialogFragmentTest.java",
+  "junit/src/org/chromium/chrome/browser/settings/password/PasswordReauthenticationFragmentTest.java",
+  "junit/src/org/chromium/chrome/browser/settings/password/ReauthenticationManagerTest.java",
+  "junit/src/org/chromium/chrome/browser/settings/password/SingleThreadBarrierClosureTest.java",
+  "junit/src/org/chromium/chrome/browser/settings/password/TimedCallbackDelayerTest.java",
+  "junit/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManagerTest.java",
   "junit/src/org/chromium/chrome/browser/sharing/click_to_call/ClickToCallMessageHandlerTest.java",
   "junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java",
   "junit/src/org/chromium/chrome/browser/signin/SigninPromoUtilTest.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index 27b782a..fda1101 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -118,6 +118,7 @@
   "javatests/src/org/chromium/chrome/browser/customtabs/CustomTabFromChromeExternalNavigationTest.java",
   "javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistenceIntegrationTest.java",
   "javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicyTest.java",
+  "javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelperTest.java",
   "javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java",
   "javatests/src/org/chromium/chrome/browser/customtabs/DetachedResourceRequestTest.java",
   "javatests/src/org/chromium/chrome/browser/customtabs/RequestThrottlerTest.java",
@@ -131,7 +132,7 @@
   "javatests/src/org/chromium/chrome/browser/datareduction/DataReductionPromoUtilsTest.java",
   "javatests/src/org/chromium/chrome/browser/datareduction/DataReductionSavingsMilestonePromoTest.java",
   "javatests/src/org/chromium/chrome/browser/dependency_injection/ModuleOverridesRule.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionStatsPreferenceTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/datareduction/DataReductionStatsPreferenceTest.java",
   "javatests/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutTest.java",
   "javatests/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutTestRule.java",
   "javatests/src/org/chromium/chrome/browser/display_cutout/WebappDisplayCutoutTest.java",
@@ -394,26 +395,6 @@
   "javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHostTest.java",
   "javatests/src/org/chromium/chrome/browser/policy/CombinedPolicyProviderTest.java",
   "javatests/src/org/chromium/chrome/browser/portals/PortalsTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/PasswordViewingTypeTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragmentTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillTestRule.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferencesTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/developer/TracingPreferencesTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferencesTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataBridgeTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasicTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManagerNativeTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/themes/ThemePreferencesTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/website/ManageSpaceActivityTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/website/PermissionInfoTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferencesTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsTestUtils.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/website/WebsiteAddressTest.java",
-  "javatests/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcherTest.java",
   "javatests/src/org/chromium/chrome/browser/prerender/ExternalPrerenderHandlerTest.java",
   "javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java",
   "javatests/src/org/chromium/chrome/browser/provider/ProviderBookmarkNodeUnitTest.java",
@@ -425,6 +406,26 @@
   "javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java",
   "javatests/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProviderTest.java",
   "javatests/src/org/chromium/chrome/browser/services/GoogleServicesManagerIntegrationTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/NotificationsPreferencesTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/PasswordViewingTypeTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/PreferencesTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/autofill/AutofillProfilesFragmentTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/autofill/AutofillTestRule.java",
+  "javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantPreferencesTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/developer/TracingPreferencesTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/password/SavePasswordsPreferencesTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataBridgeTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesBasicTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManagerNativeTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/themes/ThemePreferencesTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivityTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/website/PermissionInfoTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsPreferencesTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsTestUtils.java",
+  "javatests/src/org/chromium/chrome/browser/settings/website/WebsiteAddressTest.java",
+  "javatests/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcherTest.java",
   "javatests/src/org/chromium/chrome/browser/shape_detection/ShapeDetectionTest.java",
   "javatests/src/org/chromium/chrome/browser/share/LensUtilsTest.java",
   "javatests/src/org/chromium/chrome/browser/share/ShareSheetMediatorIntegrationTest.java",
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java
index f99aae5..2c86c4e 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java
@@ -16,8 +16,8 @@
 import org.chromium.chrome.autofill_assistant.R;
 import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChip;
 import org.chromium.chrome.browser.autofill_assistant.carousel.AssistantChipViewHolder;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.autofill_assistant.AutofillAssistantPreferences;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.autofill_assistant.AutofillAssistantPreferences;
 import org.chromium.chrome.browser.ui.widget.textbubble.TextBubble;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java
index b65dc5b..443dcb7 100644
--- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferencesUtil.java
@@ -7,7 +7,7 @@
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.ContextUtils;
-import org.chromium.chrome.browser.preferences.autofill_assistant.AutofillAssistantPreferences;
+import org.chromium.chrome.browser.settings.autofill_assistant.AutofillAssistantPreferences;
 
 /** Autofill Assistant related preferences util class. */
 class AutofillAssistantPreferencesUtil {
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
index 8f7d521..87268b1 100644
--- a/chrome/android/java/AndroidManifest.xml
+++ b/chrome/android/java/AndroidManifest.xml
@@ -612,13 +612,13 @@
             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
             android:exported="false">
         </activity>
-        <activity android:name="org.chromium.chrome.browser.preferences.Preferences"
+        <activity android:name="org.chromium.chrome.browser.settings.Preferences"
             android:theme="@style/Theme.Chromium.Preferences"
             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
             android:label="@string/preferences"
             android:exported="false">
         </activity>
-        <activity android:name="org.chromium.chrome.browser.preferences.website.ManageSpaceActivity"
+        <activity android:name="org.chromium.chrome.browser.settings.website.ManageSpaceActivity"
             android:theme="@style/Theme.Chromium.Preferences.ManageSpace"
             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
             android:label="@string/storage_management_activity_label"
diff --git a/chrome/android/java/monochrome_public_bundle.proguard_flags.expected b/chrome/android/java/monochrome_public_bundle.proguard_flags.expected
index f768030..22d3724 100644
--- a/chrome/android/java/monochrome_public_bundle.proguard_flags.expected
+++ b/chrome/android/java/monochrome_public_bundle.proguard_flags.expected
@@ -332,7 +332,7 @@
 # Fragments loaded by name via Fragment.instantiate(Context,String)
 # Not all fragments in this package are PreferenceFragments. E.g. HomepageEditor
 # is a normal Fragment.
--keep public class org.chromium.chrome.browser.preferences.** extends android.support.v4.app.Fragment {
+-keep public class org.chromium.chrome.browser.settings.** extends android.support.v4.app.Fragment {
   public <init>();
 }
 
diff --git a/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected b/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected
index cf36dec5..f75ff747 100644
--- a/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected
+++ b/chrome/android/java/monochrome_public_bundle__base_bundle_module.AndroidManifest.expected
@@ -270,13 +270,13 @@
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
         android:label="@string/preferences"
-        android:name="org.chromium.chrome.browser.preferences.Preferences"
+        android:name="org.chromium.chrome.browser.settings.Preferences"
         android:theme="@style/Theme.Chromium.Preferences"/>
     <activity
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
         android:exported="false"
         android:label="@string/storage_management_activity_label"
-        android:name="org.chromium.chrome.browser.preferences.website.ManageSpaceActivity"
+        android:name="org.chromium.chrome.browser.settings.website.ManageSpaceActivity"
         android:theme="@style/Theme.Chromium.Preferences.ManageSpace"/>
     <activity
         android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
diff --git a/chrome/android/java/proguard.flags b/chrome/android/java/proguard.flags
index dbd0b14..edbb4bf 100644
--- a/chrome/android/java/proguard.flags
+++ b/chrome/android/java/proguard.flags
@@ -5,7 +5,7 @@
 # Fragments loaded by name via Fragment.instantiate(Context,String)
 # Not all fragments in this package are PreferenceFragments. E.g. HomepageEditor
 # is a normal Fragment.
--keep public class org.chromium.chrome.browser.preferences.** extends android.support.v4.app.Fragment {
+-keep public class org.chromium.chrome.browser.settings.** extends android.support.v4.app.Fragment {
   public <init>();
 }
 
diff --git a/chrome/android/java/res/drawable/photo_picker_zoom_background.xml b/chrome/android/java/res/drawable/photo_picker_zoom_background.xml
new file mode 100644
index 0000000..fc74304
--- /dev/null
+++ b/chrome/android/java/res/drawable/photo_picker_zoom_background.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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. -->
+<!-- TODO(finnur): Replace with real background -->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item>
+        <shape>
+            <size android:width="42dp" android:height="42dp" />
+            <solid android:color="@color/modern_primary_color" />
+            <corners android:radius="42dp" />
+        </shape>
+    </item>
+</layer-list>
diff --git a/chrome/android/java/res/drawable/zoom_in.xml b/chrome/android/java/res/drawable/zoom_in.xml
new file mode 100644
index 0000000..33a13a8
--- /dev/null
+++ b/chrome/android/java/res/drawable/zoom_in.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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. -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:fillColor="@color/default_icon_color"
+        android:pathData="M15.5 14h-0.79l-0.28-0.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-0.59 4.23-1.57l0.27 0.28 v0.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" />
+    <path
+        android:pathData="M0 0h24v24H0V0z" />
+    <path
+        android:fillColor="@color/default_icon_color"
+        android:pathData="M12 10h-2v2H9v-2H7V9h2V7h1v2h2v1z" />
+</vector>
diff --git a/chrome/android/java/res/drawable/zoom_out.xml b/chrome/android/java/res/drawable/zoom_out.xml
new file mode 100644
index 0000000..b03c7aaf
--- /dev/null
+++ b/chrome/android/java/res/drawable/zoom_out.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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. -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+
+    <path
+        android:pathData="M0 0h24v24H0V0z" />
+    <path
+        android:fillColor="@color/default_icon_color"
+        android:pathData="M15.5 14h-0.79l-0.28-0.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-0.59 4.23-1.57l0.27 0.28 v0.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14zM7 9h5v1H7z" />
+</vector>
diff --git a/chrome/android/java/res/layout/data_usage_breakdown.xml b/chrome/android/java/res/layout/data_usage_breakdown.xml
index a57a1b9..7f93adf 100644
--- a/chrome/android/java/res/layout/data_usage_breakdown.xml
+++ b/chrome/android/java/res/layout/data_usage_breakdown.xml
@@ -3,7 +3,7 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<org.chromium.chrome.browser.preferences.datareduction.DataReductionSiteBreakdownView
+<org.chromium.chrome.browser.settings.datareduction.DataReductionSiteBreakdownView
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/breakdown"
     android:layout_height="wrap_content"
@@ -72,4 +72,4 @@
 
     </TableLayout>
 
-</org.chromium.chrome.browser.preferences.datareduction.DataReductionSiteBreakdownView>
+</org.chromium.chrome.browser.settings.datareduction.DataReductionSiteBreakdownView>
diff --git a/chrome/android/java/res/layout/photo_picker_bitmap_view.xml b/chrome/android/java/res/layout/photo_picker_bitmap_view.xml
index a9f8904..d6598b4 100644
--- a/chrome/android/java/res/layout/photo_picker_bitmap_view.xml
+++ b/chrome/android/java/res/layout/photo_picker_bitmap_view.xml
@@ -12,7 +12,7 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="wrap_content">
 
     <FrameLayout
         android:id="@+id/border"
@@ -96,7 +96,7 @@
 
         <TextView
             android:id="@+id/special_tile_label"
-            android:layout_width="match_parent"
+            android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="@dimen/photo_picker_label_gap"
             android:gravity="center"
diff --git a/chrome/android/java/res/layout/photo_picker_dialog.xml b/chrome/android/java/res/layout/photo_picker_dialog.xml
index 970fe21..29a4c7c0 100644
--- a/chrome/android/java/res/layout/photo_picker_dialog.xml
+++ b/chrome/android/java/res/layout/photo_picker_dialog.xml
@@ -3,10 +3,9 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<FrameLayout
+<org.chromium.ui.widget.OptimizedFrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/default_bg_color_elev_0" >
@@ -17,6 +16,18 @@
         android:layout_height="match_parent"
         android:background="@color/modern_primary_color" />
 
+    <ImageView
+        android:id="@+id/zoom"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="bottom|end"
+        android:layout_marginEnd="20dp"
+        android:layout_marginBottom="20dp"
+        android:layout_centerHorizontal="true"
+        android:background="@drawable/photo_picker_zoom_background"
+        android:src="@drawable/zoom_in"
+        android:visibility="gone" />
+
     <RelativeLayout
         android:id="@+id/playback_container"
         android:layout_width="match_parent"
@@ -55,4 +66,4 @@
                 android:layout_height="wrap_content" />
         </LinearLayout>
     </RelativeLayout>
-</FrameLayout>
\ No newline at end of file
+</org.chromium.ui.widget.OptimizedFrameLayout>
\ No newline at end of file
diff --git a/chrome/android/java/res/layout/sheet_tab_toolbar.xml b/chrome/android/java/res/layout/sheet_tab_toolbar.xml
index 215411d..5c7c391 100644
--- a/chrome/android/java/res/layout/sheet_tab_toolbar.xml
+++ b/chrome/android/java/res/layout/sheet_tab_toolbar.xml
@@ -24,6 +24,8 @@
         <RelativeLayout
             android:layout_width="match_parent"
             android:layout_height="62dp"
+            android:paddingStart="16dp"
+            android:paddingEnd="16dp"
             android:orientation="horizontal">
 
             <org.chromium.ui.widget.ChromeImageView
@@ -31,7 +33,6 @@
                 android:layout_width="24dp"
                 android:layout_height="24dp"
                 android:layout_alignParentBottom="true"
-                android:layout_marginStart="16dp"
                 android:layout_marginEnd="16dp"
                 android:layout_marginBottom="14dp"
                 android:scaleType="fitCenter"
@@ -53,7 +54,6 @@
                 android:layout_height="24dp"
                 android:layout_alignParentEnd="true"
                 android:layout_alignParentBottom="true"
-                android:layout_marginEnd="16dp"
                 android:layout_marginBottom="14dp"
                 android:src="@drawable/btn_close"
                 android:contentDescription="@string/close"
diff --git a/chrome/android/java/res/values-v19/values.xml b/chrome/android/java/res/values-v19/values.xml
index 80b4fea..86eb5b0f 100644
--- a/chrome/android/java/res/values-v19/values.xml
+++ b/chrome/android/java/res/values-v19/values.xml
@@ -3,5 +3,5 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 <resources>
-    <string translatable="false" name="manage_space_activity">org.chromium.chrome.browser.preferences.website.ManageSpaceActivity</string>
+    <string translatable="false" name="manage_space_activity">org.chromium.chrome.browser.settings.website.ManageSpaceActivity</string>
 </resources>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
index 06028fa..3e4d3b8 100644
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -312,7 +312,6 @@
     <dimen name="sei_location_bar_icon_end_padding_focused">16dp</dimen>
     <dimen name="sei_location_bar_verbose_start_padding_verbose_text">4dp</dimen>
     <dimen name="sei_location_bar_status_extra_padding_width">4dp</dimen>
-    <dimen name="sei_google_g_size">20dp</dimen>
 
     <dimen name="tablet_toolbar_start_padding">4dp</dimen>
     <dimen name="tablet_toolbar_end_padding">6dp</dimen>
@@ -511,7 +510,6 @@
     <dimen name="contact_picker_icon_size">36dp</dimen>
 
     <!-- Photo Picker dimensions -->
-    <dimen name="photo_picker_selected_padding">12dp</dimen>
     <dimen name="photo_picker_label_gap">10dp</dimen>
     <dimen name="photo_picker_tile_min_size">100dp</dimen>
     <dimen name="photo_picker_tile_gap">4dp</dimen>
diff --git a/chrome/android/java/res/xml/about_chrome_preferences.xml b/chrome/android/java/res/xml/about_chrome_preferences.xml
index a0100b6..e87a97e 100644
--- a/chrome/android/java/res/xml/about_chrome_preferences.xml
+++ b/chrome/android/java/res/xml/about_chrome_preferences.xml
@@ -7,11 +7,11 @@
     <Preference
         android:key="application_version"
         android:title="@string/application_version_title" />
-    <org.chromium.chrome.browser.preferences.about.AboutChromePreferenceOSVersion
+    <org.chromium.chrome.browser.settings.about.AboutChromePreferenceOSVersion
         android:key="os_version"
         android:title="@string/os_version_title" />
     <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.about.LegalInformationPreferences"
+        android:fragment="org.chromium.chrome.browser.settings.about.LegalInformationPreferences"
         android:key="legal_information"
         android:title="@string/legal_information_title" />
 </PreferenceScreen>
diff --git a/chrome/android/java/res/xml/accessibility_preferences.xml b/chrome/android/java/res/xml/accessibility_preferences.xml
index c2b858a..b9fe1a0 100644
--- a/chrome/android/java/res/xml/accessibility_preferences.xml
+++ b/chrome/android/java/res/xml/accessibility_preferences.xml
@@ -5,22 +5,22 @@
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <org.chromium.chrome.browser.preferences.TextScalePreference
+    <org.chromium.chrome.browser.settings.TextScalePreference
         android:key="text_scale"
         android:title="@string/font_size"
         android:selectable="false" />
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
         android:key="force_enable_zoom"
         android:summary="@string/force_enable_zoom_summary"
         android:title="@string/force_enable_zoom_title" />
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
         android:key="reader_for_accessibility"
         android:summary="@string/reader_for_accessibility_summary"
         android:title="@string/reader_for_accessibility_title" />
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
         android:key="accessibility_tab_switcher"
         android:summary="@string/accessibility_tab_switcher_summary"
         android:title="@string/accessibility_tab_switcher_title" />
diff --git a/chrome/android/java/res/xml/account_management_preferences.xml b/chrome/android/java/res/xml/account_management_preferences.xml
index 7639690..fa74c03 100644
--- a/chrome/android/java/res/xml/account_management_preferences.xml
+++ b/chrome/android/java/res/xml/account_management_preferences.xml
@@ -18,7 +18,7 @@
         android:key="parental_settings"
         android:title="@string/account_management_parental_settings"/>
 
-    <org.chromium.chrome.browser.preferences.TextMessagePreference
+    <org.chromium.chrome.browser.settings.TextMessagePreference
         android:key="parent_accounts"
         tools:summary="@string/account_management_two_parent_names"/>
 
diff --git a/chrome/android/java/res/xml/autofill_server_profile_preferences.xml b/chrome/android/java/res/xml/autofill_server_profile_preferences.xml
index 69be874..5643ac3 100644
--- a/chrome/android/java/res/xml/autofill_server_profile_preferences.xml
+++ b/chrome/android/java/res/xml/autofill_server_profile_preferences.xml
@@ -9,7 +9,7 @@
         android:key="server_profile_description"
         android:selectable="false" />
 
-    <org.chromium.chrome.browser.preferences.TextAndButtonPreference
+    <org.chromium.chrome.browser.settings.TextAndButtonPreference
         android:key="server_profile_edit_link"
         android:widgetLayout="@layout/autofill_server_data_edit_link"
         android:title="@string/autofill_from_google_account_long" />
diff --git a/chrome/android/java/res/xml/clear_browsing_data_preferences_tab.xml b/chrome/android/java/res/xml/clear_browsing_data_preferences_tab.xml
index 7464d13c..55b3e9d 100644
--- a/chrome/android/java/res/xml/clear_browsing_data_preferences_tab.xml
+++ b/chrome/android/java/res/xml/clear_browsing_data_preferences_tab.xml
@@ -7,40 +7,40 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <org.chromium.chrome.browser.preferences.SpinnerPreference
+    <org.chromium.chrome.browser.settings.SpinnerPreference
         android:key="time_period_spinner"
         android:persistent="false"
         android:title="@string/clear_browsing_data_tab_period_title"
         app:singleLine="true" />
 
-    <org.chromium.chrome.browser.preferences.ClearBrowsingDataCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ClearBrowsingDataCheckBoxPreference
         android:key="clear_history_checkbox"
         android:persistent="false"
         android:title="@string/clear_history_title"
         android:summary="@string/clear_browsing_history_summary" />
 
-    <org.chromium.chrome.browser.preferences.ClearBrowsingDataCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ClearBrowsingDataCheckBoxPreference
         android:key="clear_cookies_checkbox"
         android:persistent="false"
         android:title="@string/clear_cookies_and_site_data_title"
         android:summary="@string/clear_cookies_and_site_data_summary_basic" />
 
-    <org.chromium.chrome.browser.preferences.ClearBrowsingDataCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ClearBrowsingDataCheckBoxPreference
         android:key="clear_cache_checkbox"
         android:persistent="false"
         android:title="@string/clear_cache_title" />
 
-    <org.chromium.chrome.browser.preferences.ClearBrowsingDataCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ClearBrowsingDataCheckBoxPreference
         android:key="clear_passwords_checkbox"
         android:persistent="false"
         android:title="@string/clear_passwords_title" />
 
-    <org.chromium.chrome.browser.preferences.ClearBrowsingDataCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ClearBrowsingDataCheckBoxPreference
         android:key="clear_form_data_checkbox"
         android:persistent="false"
         android:title="@string/clear_form_data_title" />
 
-    <org.chromium.chrome.browser.preferences.ClearBrowsingDataCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ClearBrowsingDataCheckBoxPreference
         android:key="clear_site_settings_checkbox"
         android:persistent="false"
         android:title="@string/prefs_site_settings" />
diff --git a/chrome/android/java/res/xml/contextual_search_preferences.xml b/chrome/android/java/res/xml/contextual_search_preferences.xml
index d50afe589..5677d29 100644
--- a/chrome/android/java/res/xml/contextual_search_preferences.xml
+++ b/chrome/android/java/res/xml/contextual_search_preferences.xml
@@ -7,12 +7,12 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+    <org.chromium.chrome.browser.settings.ChromeSwitchPreference
         android:key="contextual_search_switch"
         android:summaryOn="@string/text_on"
         android:summaryOff="@string/text_off" />
 
-    <org.chromium.chrome.browser.preferences.TextMessagePreference
+    <org.chromium.chrome.browser.settings.TextMessagePreference
         android:title="@string/contextual_search_description"
         app:allowDividerBelow="false" />
 
diff --git a/chrome/android/java/res/xml/data_reduction_preferences.xml b/chrome/android/java/res/xml/data_reduction_preferences.xml
index 6db42a0..e6af7a9 100644
--- a/chrome/android/java/res/xml/data_reduction_preferences.xml
+++ b/chrome/android/java/res/xml/data_reduction_preferences.xml
@@ -6,7 +6,7 @@
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <org.chromium.chrome.browser.preferences.datareduction.DataReductionStatsPreference
+    <org.chromium.chrome.browser.settings.datareduction.DataReductionStatsPreference
         android:key="data_reduction_stats"
         android:layout="@layout/custom_preference"
         android:selectable="false"
diff --git a/chrome/android/java/res/xml/data_reduction_preferences_off_lite_mode.xml b/chrome/android/java/res/xml/data_reduction_preferences_off_lite_mode.xml
index 3a13f9d1..09d4379 100644
--- a/chrome/android/java/res/xml/data_reduction_preferences_off_lite_mode.xml
+++ b/chrome/android/java/res/xml/data_reduction_preferences_off_lite_mode.xml
@@ -6,15 +6,15 @@
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
                   xmlns:app="http://schemas.android.com/apk/res-auto" >
 
-    <org.chromium.chrome.browser.preferences.TextMessagePreference
+    <org.chromium.chrome.browser.settings.TextMessagePreference
         android:title="@string/data_reduction_benefits_description_lite_mode"
         app:allowDividerBelow="false" />
 
-    <org.chromium.chrome.browser.preferences.TextMessagePreference
+    <org.chromium.chrome.browser.settings.TextMessagePreference
         android:title="@string/data_reduction_description_lite_mode"
         app:allowDividerBelow="false" />
 
-    <org.chromium.chrome.browser.preferences.LearnMorePreference
+    <org.chromium.chrome.browser.settings.LearnMorePreference
         android:key="data_reduction_learn_more"
         app:helpContext="@string/help_context_data_reduction"
         app:allowDividerBelow="false" />
diff --git a/chrome/android/java/res/xml/developer_preferences.xml b/chrome/android/java/res/xml/developer_preferences.xml
index 98a07ef3..3e31c33 100644
--- a/chrome/android/java/res/xml/developer_preferences.xml
+++ b/chrome/android/java/res/xml/developer_preferences.xml
@@ -7,10 +7,10 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:orderingFromXml="true">
     <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.developer.TracingPreferences"
+        android:fragment="org.chromium.chrome.browser.settings.developer.TracingPreferences"
         android:key="tracing"
         android:title="Tracing" />
-    <org.chromium.chrome.browser.preferences.TextMessagePreference
+    <org.chromium.chrome.browser.settings.TextMessagePreference
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:enabled="false"
diff --git a/chrome/android/java/res/xml/do_not_track_preferences.xml b/chrome/android/java/res/xml/do_not_track_preferences.xml
index e24ae77..a5d99fb 100644
--- a/chrome/android/java/res/xml/do_not_track_preferences.xml
+++ b/chrome/android/java/res/xml/do_not_track_preferences.xml
@@ -7,12 +7,12 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+    <org.chromium.chrome.browser.settings.ChromeSwitchPreference
         android:key="do_not_track_switch"
         android:summaryOn="@string/text_on"
         android:summaryOff="@string/text_off" />
 
-    <org.chromium.chrome.browser.preferences.TextMessagePreference
+    <org.chromium.chrome.browser.settings.TextMessagePreference
         android:title="@string/do_not_track_description"
         app:allowDividerBelow="false" />
 
diff --git a/chrome/android/java/res/xml/download_preferences.xml b/chrome/android/java/res/xml/download_preferences.xml
index e0ef6f5..516ece6 100644
--- a/chrome/android/java/res/xml/download_preferences.xml
+++ b/chrome/android/java/res/xml/download_preferences.xml
@@ -4,19 +4,19 @@
      found in the LICENSE file. -->
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-    <org.chromium.chrome.browser.preferences.download.DownloadLocationPreference
+    <org.chromium.chrome.browser.settings.download.DownloadLocationPreference
         android:key="location_change"
         android:title="@string/downloads_location_selector_title"
         android:positiveButtonText="@string/done"
         android:negativeButtonText="@null"  />
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+    <org.chromium.chrome.browser.settings.ChromeSwitchPreference
         android:key="location_prompt_enabled"
         android:title="@string/download_location_prompt_enabled_title"
         android:summaryOn="@string/text_on"
         android:summaryOff="@string/text_off" />
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+    <org.chromium.chrome.browser.settings.ChromeSwitchPreference
         android:key="prefetching_enabled"
         android:title="@string/download_settings_enable_prefetch_title" />
 </PreferenceScreen>
diff --git a/chrome/android/java/res/xml/homepage_preferences.xml b/chrome/android/java/res/xml/homepage_preferences.xml
index a54efc5..865dde7 100644
--- a/chrome/android/java/res/xml/homepage_preferences.xml
+++ b/chrome/android/java/res/xml/homepage_preferences.xml
@@ -6,7 +6,7 @@
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+    <org.chromium.chrome.browser.settings.ChromeSwitchPreference
         android:key="homepage_switch"
         android:summaryOn="@string/text_on"
         android:summaryOff="@string/text_off" />
@@ -14,6 +14,6 @@
     <Preference
         android:key="homepage_edit"
         android:title="@string/options_homepage_edit_label"
-        android:fragment="org.chromium.chrome.browser.preferences.HomepageEditor" />
+        android:fragment="org.chromium.chrome.browser.settings.HomepageEditor" />
 
 </PreferenceScreen>
diff --git a/chrome/android/java/res/xml/languages_preferences.xml b/chrome/android/java/res/xml/languages_preferences.xml
index 64e48b61..5e7dfc6 100644
--- a/chrome/android/java/res/xml/languages_preferences.xml
+++ b/chrome/android/java/res/xml/languages_preferences.xml
@@ -6,12 +6,12 @@
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <org.chromium.chrome.browser.preferences.languages.LanguageListPreference
+    <org.chromium.chrome.browser.settings.languages.LanguageListPreference
         android:key="preferred_languages"
         android:layout="@layout/languages_preference"
         android:widgetLayout="@layout/accept_languages_list" />
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+    <org.chromium.chrome.browser.settings.ChromeSwitchPreference
         android:key="translate_switch"
         android:summaryOn="@string/languages_offer_translate_switch"
         android:summaryOff="@string/languages_offer_translate_switch" />
diff --git a/chrome/android/java/res/xml/legal_information_preferences.xml b/chrome/android/java/res/xml/legal_information_preferences.xml
index 216cd19..2eca6ef 100644
--- a/chrome/android/java/res/xml/legal_information_preferences.xml
+++ b/chrome/android/java/res/xml/legal_information_preferences.xml
@@ -6,15 +6,15 @@
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
-    <org.chromium.chrome.browser.preferences.HyperlinkPreference
+    <org.chromium.chrome.browser.settings.HyperlinkPreference
         android:key="open_source_license"
         android:title="@string/open_source_license_title"
         app:url="@string/open_source_license_url" />
-    <org.chromium.chrome.browser.preferences.HyperlinkPreference
+    <org.chromium.chrome.browser.settings.HyperlinkPreference
         android:key="terms_of_service"
         android:title="@string/terms_of_service_title"
         app:url="@string/chrome_terms_of_service_url" />
-    <org.chromium.chrome.browser.preferences.HyperlinkPreference
+    <org.chromium.chrome.browser.settings.HyperlinkPreference
         android:key="privacy_notice"
         android:title="@string/privacy_notice_title"
         app:url="@string/chrome_privacy_notice_url" />
diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml
index 098cd7e0..db12d36 100644
--- a/chrome/android/java/res/xml/main_preferences.xml
+++ b/chrome/android/java/res/xml/main_preferences.xml
@@ -10,58 +10,58 @@
         android:key="account_section"
         android:order="0"
         android:title="@string/prefs_section_account"/>
-    <org.chromium.chrome.browser.preferences.sync.SignInPreference
+    <org.chromium.chrome.browser.settings.sync.SignInPreference
         android:key="sign_in"
         android:order="1"
         android:title="@string/sign_in_to_chrome"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreference
+    <org.chromium.chrome.browser.settings.ChromeBasePreference
         android:key="sync_and_services"
         android:order="2"
         android:layout="@layout/account_management_account_row"
         android:title="@string/prefs_sync_and_services"
-        android:fragment="org.chromium.chrome.browser.preferences.sync.SyncAndServicesPreferences"/>
+        android:fragment="org.chromium.chrome.browser.settings.sync.SyncAndServicesPreferences"/>
 
     <PreferenceCategory
         android:key="basics_section"
         android:order="3"
         android:title="@string/prefs_section_basics"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreference
-        android:fragment="org.chromium.chrome.browser.preferences.SearchEnginePreference"
+    <org.chromium.chrome.browser.settings.ChromeBasePreference
+        android:fragment="org.chromium.chrome.browser.settings.SearchEnginePreference"
         android:key="search_engine"
         android:order="4"
         android:title="@string/prefs_search_engine"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreference
-        android:fragment="org.chromium.chrome.browser.preferences.password.SavePasswordsPreferences"
+    <org.chromium.chrome.browser.settings.ChromeBasePreference
+        android:fragment="org.chromium.chrome.browser.settings.password.SavePasswordsPreferences"
         android:key="saved_passwords"
         android:order="5"
         android:title="@string/prefs_saved_passwords_title"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreference
-        android:fragment="org.chromium.chrome.browser.preferences.autofill.AutofillPaymentMethodsFragment"
+    <org.chromium.chrome.browser.settings.ChromeBasePreference
+        android:fragment="org.chromium.chrome.browser.settings.autofill.AutofillPaymentMethodsFragment"
         android:key="autofill_payment_methods"
         android:order="6"
         android:title="@string/autofill_payment_methods"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreference
-        android:fragment="org.chromium.chrome.browser.preferences.autofill.AutofillProfilesFragment"
+    <org.chromium.chrome.browser.settings.ChromeBasePreference
+        android:fragment="org.chromium.chrome.browser.settings.autofill.AutofillProfilesFragment"
         android:key="autofill_addresses"
         android:order="7"
         android:title="@string/autofill_addresses_settings_title"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreference
-        android:fragment="org.chromium.chrome.browser.preferences.autofill_assistant.AutofillAssistantPreferences"
+    <org.chromium.chrome.browser.settings.ChromeBasePreference
+        android:fragment="org.chromium.chrome.browser.settings.autofill_assistant.AutofillAssistantPreferences"
         android:key="autofill_assistant"
         android:order="8"
         android:title="@string/prefs_autofill_assistant_title"/>
     <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.NotificationsPreferences"
+        android:fragment="org.chromium.chrome.browser.settings.NotificationsPreferences"
         android:key="notifications"
         android:order="9"
         android:title="@string/prefs_notifications"/>
     <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.HomepagePreferences"
+        android:fragment="org.chromium.chrome.browser.settings.HomepagePreferences"
         android:key="homepage"
         android:order="10"
         android:title="@string/options_homepage_title"/>
     <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.themes.ThemePreferences"
+        android:fragment="org.chromium.chrome.browser.settings.themes.ThemePreferences"
         android:key="ui_theme"
         android:order="11"
         android:title="@string/prefs_themes" />
@@ -71,42 +71,42 @@
         android:order="12"
         android:title="@string/prefs_section_advanced"/>
     <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.privacy.PrivacyPreferences"
+        android:fragment="org.chromium.chrome.browser.settings.privacy.PrivacyPreferences"
         android:key="privacy"
         android:order="13"
         android:title="@string/prefs_privacy"/>
     <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.AccessibilityPreferences"
+        android:fragment="org.chromium.chrome.browser.settings.AccessibilityPreferences"
         android:key="accessibility"
         android:order="14"
         android:title="@string/prefs_accessibility"/>
     <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SiteSettingsPreferences"
+        android:fragment="org.chromium.chrome.browser.settings.website.SiteSettingsPreferences"
         android:key="content_settings"
         android:order="15"
         android:title="@string/prefs_site_settings"/>
     <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.languages.LanguagesPreferences"
+        android:fragment="org.chromium.chrome.browser.settings.languages.LanguagesPreferences"
         android:key="languages"
         android:order="16"
         android:title="@string/prefs_languages"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreference
-        android:fragment="org.chromium.chrome.browser.preferences.datareduction.DataReductionPreferenceFragment"
+    <org.chromium.chrome.browser.settings.ChromeBasePreference
+        android:fragment="org.chromium.chrome.browser.settings.datareduction.DataReductionPreferenceFragment"
         android:key="data_reduction"
         android:order="17"
         android:title="@string/data_reduction_title_lite_mode"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreference
-        android:fragment="org.chromium.chrome.browser.preferences.download.DownloadPreferences"
+    <org.chromium.chrome.browser.settings.ChromeBasePreference
+        android:fragment="org.chromium.chrome.browser.settings.download.DownloadPreferences"
         android:key="downloads"
         android:order="18"
         android:title="@string/menu_downloads"/>
     <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.developer.DeveloperPreferences"
+        android:fragment="org.chromium.chrome.browser.settings.developer.DeveloperPreferences"
         android:key="developer"
         android:order="19"
         android:title="Developer options"/>
     <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.about.AboutChromePreferences"
+        android:fragment="org.chromium.chrome.browser.settings.about.AboutChromePreferences"
         android:key="about_chrome"
         android:order="20"
         android:title="@string/prefs_about_chrome"/>
diff --git a/chrome/android/java/res/xml/manage_sync_preferences.xml b/chrome/android/java/res/xml/manage_sync_preferences.xml
index e0e4398..4246742 100644
--- a/chrome/android/java/res/xml/manage_sync_preferences.xml
+++ b/chrome/android/java/res/xml/manage_sync_preferences.xml
@@ -6,56 +6,56 @@
 <PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+    <org.chromium.chrome.browser.settings.ChromeSwitchPreference
         android:key="sync_everything"
         android:title="@string/sync_everything_pref"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
         android:key="sync_autofill"
         android:title="@string/sync_autofill"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
         android:key="sync_bookmarks"
         android:title="@string/sync_bookmarks"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
         android:key="sync_payments_integration"
         android:title="@string/sync_payments_integration"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
         android:key="sync_history"
         android:title="@string/sync_history"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
         android:key="sync_passwords"
         android:title="@string/sync_passwords"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
         android:key="sync_recent_tabs"
         android:title="@string/sync_recent_tabs"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
         android:key="sync_settings"
         android:title="@string/sync_settings"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBasePreference
+    <org.chromium.chrome.browser.settings.ChromeBasePreference
         android:key="google_activity_controls"
         android:title="@string/sign_in_google_activity_controls_title"
         android:summary="@string/sign_in_google_activity_controls_summary"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBasePreference
+    <org.chromium.chrome.browser.settings.ChromeBasePreference
         android:key="encryption"
         android:title="@string/sync_encryption"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBasePreference
+    <org.chromium.chrome.browser.settings.ChromeBasePreference
         android:key="sync_manage_data"
         android:title="@string/sync_manage_data"/>
 
diff --git a/chrome/android/java/res/xml/notifications_preferences.xml b/chrome/android/java/res/xml/notifications_preferences.xml
index 56a6565d..fcf0d57 100644
--- a/chrome/android/java/res/xml/notifications_preferences.xml
+++ b/chrome/android/java/res/xml/notifications_preferences.xml
@@ -5,13 +5,13 @@
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+    <org.chromium.chrome.browser.settings.ChromeSwitchPreference
         android:key="content_suggestions"
         android:title="@string/notifications_content_suggestions_title"
         android:summary="@string/notifications_content_suggestions_summary" />
 
     <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:title="@string/notifications_from_websites_title"
         android:key="from_websites" />
 </PreferenceScreen>
\ No newline at end of file
diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
index ccc1d1f..952ce26 100644
--- a/chrome/android/java/res/xml/privacy_preferences.xml
+++ b/chrome/android/java/res/xml/privacy_preferences.xml
@@ -6,29 +6,29 @@
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
         android:key="can_make_payment"
         android:title="@string/can_make_payment_title"
         android:summary="@string/settings_can_make_payment_toggle_label" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
         android:key="preload_pages"
         android:title="@string/preload_pages_title"
         android:summary="@string/preload_pages_summary"
         android:persistent="false" />
-    <org.chromium.chrome.browser.preferences.ChromeBasePreference
+    <org.chromium.chrome.browser.settings.ChromeBasePreference
         android:key="usage_stats_reporting"
         android:title="@string/usage_stats_setting_title"
         android:persistent="false" />
     <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.privacy.DoNotTrackPreference"
+        android:fragment="org.chromium.chrome.browser.settings.privacy.DoNotTrackPreference"
         android:key="do_not_track"
         android:title="@string/do_not_track_title" />
     <Preference
         android:key="clear_browsing_data"
         android:title="@string/clear_browsing_data_title"
         android:summary="@string/clear_browsing_data_summary"
-        android:fragment="org.chromium.chrome.browser.preferences.privacy.ClearBrowsingDataTabsFragment" />
-    <org.chromium.chrome.browser.preferences.TextMessagePreference
+        android:fragment="org.chromium.chrome.browser.settings.privacy.ClearBrowsingDataTabsFragment" />
+    <org.chromium.chrome.browser.settings.TextMessagePreference
         android:key="sync_and_services_link"
         android:summary="@string/privacy_sync_and_services_link"
         app:allowDividerBelow="false" />
diff --git a/chrome/android/java/res/xml/single_website_preferences.xml b/chrome/android/java/res/xml/single_website_preferences.xml
index 4a6e7a3..7d7ce21 100644
--- a/chrome/android/java/res/xml/single_website_preferences.xml
+++ b/chrome/android/java/res/xml/single_website_preferences.xml
@@ -7,14 +7,14 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <org.chromium.chrome.browser.preferences.ChromeBasePreference
+    <org.chromium.chrome.browser.settings.ChromeBasePreference
         android:key="os_permissions_warning" />
-    <org.chromium.chrome.browser.preferences.ChromeBasePreference
+    <org.chromium.chrome.browser.settings.ChromeBasePreference
         android:key="os_permissions_warning_extra" />
     <Preference
         android:key="os_permissions_warning_divider"
         android:layout="@layout/divider_preference" />
-    <org.chromium.chrome.browser.preferences.TextMessagePreference
+    <org.chromium.chrome.browser.settings.TextMessagePreference
         android:key="intrusive_ads_info"
         android:title="@string/intrusive_ads_information"
         android:icon="@drawable/btn_info"
@@ -25,12 +25,12 @@
     <PreferenceCategory
         android:key="site_heading"
         android:title="@string/website_settings_site_category" />
-    <org.chromium.chrome.browser.preferences.TextMessagePreference
+    <org.chromium.chrome.browser.settings.TextMessagePreference
         android:key="site_title" />
     <PreferenceCategory
         android:key="site_usage"
         android:title="@string/website_settings_usage_category" />
-    <org.chromium.chrome.browser.preferences.website.ClearWebsiteStorage
+    <org.chromium.chrome.browser.settings.website.ClearWebsiteStorage
         android:key="clear_data"
         android:title="@string/webstorage_clear_data_dialog_title"
         android:dialogMessage="@string/webstorage_clear_data_dialog_message"
@@ -75,7 +75,7 @@
     <ListPreference
         android:key="bluetooth_scanning_permission_list" />
 
-    <org.chromium.chrome.browser.preferences.ButtonPreference
+    <org.chromium.chrome.browser.settings.ButtonPreference
         android:key="reset_site_button"
         android:title="@string/website_reset" />
 </PreferenceScreen>
diff --git a/chrome/android/java/res/xml/site_settings_preferences.xml b/chrome/android/java/res/xml/site_settings_preferences.xml
index 91ef008d..89f31963 100644
--- a/chrome/android/java/res/xml/site_settings_preferences.xml
+++ b/chrome/android/java/res/xml/site_settings_preferences.xml
@@ -7,86 +7,86 @@
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
     <!-- All sites -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="all_sites"
         android:title="@string/all_sites"
         android:icon="@drawable/settings_all_sites"
         app:iconTint="@color/default_icon_color" />
     <!-- Cookies -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
         android:key="cookies"
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences" />
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences" />
     <!-- Location -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="device_location" />
     <!-- Camera -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="camera" />
     <!-- Microphone -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="microphone" />
     <!-- Sensors -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="sensors" />
     <!-- Notifications -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="notifications" />
     <!-- JavaScript -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="javascript" />
     <!-- Popups -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="popups" />
     <!-- Ads -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="ads" />
     <!-- Background sync -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="background_sync" />
     <!-- Automatic Downloads -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="automatic_downloads" />
     <!-- Protected content -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="protected_content" />
     <!-- Sound -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="sound" />
     <!-- Storage -->
     <!-- TODO(finnur): Move this over to the new Usage screen, once it exists. -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="use_storage"
         android:title="@string/website_settings_storage"
         android:icon="@drawable/settings_storage"
         app:iconTint="@color/default_icon_color" />
     <!-- NFC -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="nfc" />
     <!-- USB -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="usb" />
     <!-- Clipboard API -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="clipboard" />
     <!-- Bluetooth Scanning -->
-    <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
-        android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
+    <org.chromium.chrome.browser.settings.website.SiteSettingsPreference
+        android:fragment="org.chromium.chrome.browser.settings.website.SingleCategoryPreferences"
         android:key="bluetooth_scanning" />
 </PreferenceScreen>
diff --git a/chrome/android/java/res/xml/sync_and_services_preferences.xml b/chrome/android/java/res/xml/sync_and_services_preferences.xml
index dceeecf..c082183 100644
--- a/chrome/android/java/res/xml/sync_and_services_preferences.xml
+++ b/chrome/android/java/res/xml/sync_and_services_preferences.xml
@@ -11,11 +11,11 @@
     <PreferenceCategory
         android:key="user_category"
         android:title="@string/user"/>
-    <org.chromium.chrome.browser.preferences.sync.SignInPreference
+    <org.chromium.chrome.browser.settings.sync.SignInPreference
         android:key="sign_in"
         android:title="@string/sign_in_to_chrome"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBasePreference
+    <org.chromium.chrome.browser.settings.ChromeBasePreference
         android:key="manage_your_google_account"
         android:title="@string/manage_your_google_account"/>
 
@@ -30,58 +30,58 @@
             android:key="sync_disabled_by_administrator"
             android:layout="@layout/account_management_account_row"
             android:title="@string/sync_is_disabled_by_administrator"/>
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+        <org.chromium.chrome.browser.settings.ChromeSwitchPreference
             android:key="sync_requested"
             android:title="@string/sync_switch_title"
             android:persistent="false"/>
 
-        <org.chromium.chrome.browser.preferences.ChromeBasePreference
+        <org.chromium.chrome.browser.settings.ChromeBasePreference
             android:key="manage_sync"
             android:title="@string/manage_sync_title"
-            android:fragment="org.chromium.chrome.browser.preferences.sync.ManageSyncPreferences"/>
+            android:fragment="org.chromium.chrome.browser.settings.sync.ManageSyncPreferences"/>
     </PreferenceCategory>
 
     <PreferenceCategory
         android:key="services_category"
         android:title="@string/services_category_title">
 
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+        <org.chromium.chrome.browser.settings.ChromeSwitchPreference
             android:key="search_suggestions"
             android:title="@string/autocomplete_searches_and_urls_title"
             android:summary="@string/autocomplete_searches_and_urls_summary"
             android:persistent="false"/>
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+        <org.chromium.chrome.browser.settings.ChromeSwitchPreference
             android:key="navigation_error"
             android:title="@string/navigation_error_suggestions_title"
             android:summary="@string/navigation_error_suggestions_summary"
             android:persistent="false"/>
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+        <org.chromium.chrome.browser.settings.ChromeSwitchPreference
             android:key="safe_browsing"
             android:title="@string/safe_browsing_title"
             android:summary="@string/safe_browsing_summary"
             android:persistent="false"/>
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+        <org.chromium.chrome.browser.settings.ChromeSwitchPreference
             android:key="password_leak_detection"
             android:title="@string/passwords_leak_detection_switch_title"
             android:persistent="false"/>
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+        <org.chromium.chrome.browser.settings.ChromeSwitchPreference
             android:key="safe_browsing_scout_reporting"
             android:title="@string/safe_browsing_scout_reporting_title"
             android:summary="@string/safe_browsing_scout_reporting_summary"
             android:persistent="false"/>
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+        <org.chromium.chrome.browser.settings.ChromeSwitchPreference
             android:key="usage_and_crash_reports"
             android:title="@string/usage_and_crash_reports_title"
             android:summary="@string/usage_and_crash_reports_summary"
             android:persistent="false"/>
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+        <org.chromium.chrome.browser.settings.ChromeSwitchPreference
             android:key="url_keyed_anonymized_data"
             android:title="@string/url_keyed_anonymized_data_title"
             android:summary="@string/url_keyed_anonymized_data_summary"
             android:persistent="false"/>
-        <org.chromium.chrome.browser.preferences.ChromeBasePreference
+        <org.chromium.chrome.browser.settings.ChromeBasePreference
             android:key="contextual_search"
             android:title="@string/contextual_search_title"
-            android:fragment="org.chromium.chrome.browser.preferences.privacy.ContextualSearchPreferenceFragment"/>
+            android:fragment="org.chromium.chrome.browser.settings.privacy.ContextualSearchPreferenceFragment"/>
     </PreferenceCategory>
 </PreferenceScreen>
diff --git a/chrome/android/java/res/xml/theme_preferences.xml b/chrome/android/java/res/xml/theme_preferences.xml
index 9e1f0e7..fba3105 100644
--- a/chrome/android/java/res/xml/theme_preferences.xml
+++ b/chrome/android/java/res/xml/theme_preferences.xml
@@ -4,6 +4,6 @@
      found in the LICENSE file. -->
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-    <org.chromium.chrome.browser.preferences.themes.RadioButtonGroupThemePreference
+    <org.chromium.chrome.browser.settings.themes.RadioButtonGroupThemePreference
         android:key="ui_theme_pref" />
 </PreferenceScreen>
\ No newline at end of file
diff --git a/chrome/android/java/res/xml/tracing_preferences.xml b/chrome/android/java/res/xml/tracing_preferences.xml
index 88f45aa..a001a070 100644
--- a/chrome/android/java/res/xml/tracing_preferences.xml
+++ b/chrome/android/java/res/xml/tracing_preferences.xml
@@ -7,20 +7,20 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:orderingFromXml="true">
     <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.developer.TracingCategoriesPreferences"
+        android:fragment="org.chromium.chrome.browser.settings.developer.TracingCategoriesPreferences"
         android:key="default_categories"
         android:title="Default categories"/><!-- developer strings are not translated -->
     <Preference
-        android:fragment="org.chromium.chrome.browser.preferences.developer.TracingCategoriesPreferences"
+        android:fragment="org.chromium.chrome.browser.settings.developer.TracingCategoriesPreferences"
         android:key="non_default_categories"
         android:title="Disabled-by-default categories"/>
     <ListPreference
         android:key="mode"
         android:title="Tracing mode"
         android:persistent="false"/>
-    <org.chromium.chrome.browser.preferences.ButtonPreference
+    <org.chromium.chrome.browser.settings.ButtonPreference
         android:key="start_recording"/>
-    <org.chromium.chrome.browser.preferences.TextMessagePreference
+    <org.chromium.chrome.browser.settings.TextMessagePreference
         android:key="tracing_status"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
diff --git a/chrome/android/java/res/xml/website_preferences.xml b/chrome/android/java/res/xml/website_preferences.xml
index 1baf603..a72724d 100644
--- a/chrome/android/java/res/xml/website_preferences.xml
+++ b/chrome/android/java/res/xml/website_preferences.xml
@@ -10,39 +10,39 @@
 
     <!-- A common binary toggle, only shown for specific categories that allow
          turning default values for that category on/off.-->
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
+    <org.chromium.chrome.browser.settings.ChromeSwitchPreference
         android:key="binary_toggle"
         android:defaultValue="true" />
     <!-- A common Allow/Ask/Block 3-state toggle (radio group). Only shown when
          the category requires these 3 states. Mutual exclusive with the
          "binary_toggle" above. -->
-    <org.chromium.chrome.browser.preferences.website.TriStateSiteSettingsPreference
+    <org.chromium.chrome.browser.settings.website.TriStateSiteSettingsPreference
         android:key="tri_state_toggle" />
 
     <!-- A toggle for blocking third-party cookies, only shown for the Cookies category. -->
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
         android:key="third_party_cookies"
         android:title="@string/block_third_party_cookies_title"
         android:summary="@string/block_third_party_cookies_summary"
         android:defaultValue="true"
         android:persistent="false" />
     <!-- A toggle for enabling vibration in notifications. -->
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
+    <org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference
         android:key="notifications_vibrate"
         android:title="@string/enable_notifications_vibrate_title"
         android:summary="@string/enable_notifications_vibrate_summary"
         android:defaultValue="true" />
     <!-- An hyperlink to explain more about Protected Media content settings. -->
-    <org.chromium.chrome.browser.preferences.LearnMorePreference
+    <org.chromium.chrome.browser.settings.LearnMorePreference
         android:key="protected_content_learn_more"
         android:background="?android:attr/listDivider"
         app:helpContext="@string/help_context_protected_content"/>
 
     <!-- Collapsible headers for sorting preferences. -->
-    <org.chromium.chrome.browser.preferences.ExpandablePreferenceGroup
+    <org.chromium.chrome.browser.settings.ExpandablePreferenceGroup
         android:key="managed_group" />
-    <org.chromium.chrome.browser.preferences.ExpandablePreferenceGroup
+    <org.chromium.chrome.browser.settings.ExpandablePreferenceGroup
         android:key="blocked_group" />
-    <org.chromium.chrome.browser.preferences.ExpandablePreferenceGroup
+    <org.chromium.chrome.browser.settings.ExpandablePreferenceGroup
         android:key="allowed_group" />
 </PreferenceScreen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
index 92794af..f5e47436 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
@@ -45,9 +45,9 @@
 import org.chromium.chrome.browser.partnercustomizations.PartnerBrowserCustomizations;
 import org.chromium.chrome.browser.password_manager.GooglePasswordManagerUIProvider;
 import org.chromium.chrome.browser.policy.PolicyAuditor;
-import org.chromium.chrome.browser.preferences.LocationSettings;
 import org.chromium.chrome.browser.rlz.RevenueStats;
 import org.chromium.chrome.browser.services.AndroidEduOwnerCheckCallback;
+import org.chromium.chrome.browser.settings.LocationSettings;
 import org.chromium.chrome.browser.signin.GoogleActivityController;
 import org.chromium.chrome.browser.survey.SurveyController;
 import org.chromium.chrome.browser.tab.AuthenticatorNavigationInterceptor;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index b40e86b..fd0605d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -123,9 +123,9 @@
 import org.chromium.chrome.browser.partnercustomizations.PartnerBrowserCustomizations;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
 import org.chromium.chrome.browser.printing.TabPrinter;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
 import org.chromium.chrome.browser.share.ShareDelegate;
 import org.chromium.chrome.browser.share.ShareDelegateImpl;
 import org.chromium.chrome.browser.snackbar.BottomContainer;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivitySessionTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivitySessionTracker.java
index 1388478..014b07f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivitySessionTracker.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivitySessionTracker.java
@@ -32,8 +32,8 @@
 import org.chromium.chrome.browser.partnercustomizations.PartnerBrowserCustomizations;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.privacy.BrowsingDataBridge;
 import org.chromium.chrome.browser.profiles.ProfileManagerUtils;
+import org.chromium.chrome.browser.settings.privacy.BrowsingDataBridge;
 import org.chromium.chrome.browser.share.ShareHelper;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.translate.TranslateBridge;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java
index 9f77329a..e4eaeb2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackupAgent.java
@@ -28,7 +28,7 @@
 import org.chromium.chrome.browser.init.AsyncInitTaskRunner;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
-import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
+import org.chromium.chrome.browser.settings.privacy.PrivacyPreferencesManager;
 import org.chromium.components.signin.AccountManagerFacade;
 import org.chromium.components.signin.ChromeSigninController;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
index 20e2343c5..90417ff8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -307,6 +307,7 @@
     public static final String PER_METHOD_CAN_MAKE_PAYMENT_QUOTA =
             "WebPaymentsPerMethodCanMakePaymentQuota";
     public static final String PHOTO_PICKER_VIDEO_SUPPORT = "PhotoPickerVideoSupport";
+    public static final String PHOTO_PICKER_ZOOM = "PhotoPickerZoom";
     public static final String PREDICTIVE_PREFETCHING_ALLOWED_ON_ALL_CONNECTION_TYPES =
             "PredictivePrefetchingAllowedOnAllConnectionTypes";
     public static final String PRIORITIZE_BOOTSTRAP_TASKS = "PrioritizeBootstrapTasks";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java
index e6a524a..4622d10b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -37,7 +37,7 @@
 import org.chromium.chrome.browser.incognito.IncognitoUtils;
 import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher;
 import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper;
-import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils;
+import org.chromium.chrome.browser.settings.ManagedPreferencesUtils;
 import org.chromium.chrome.browser.share.ShareHelper;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabImpl;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
index b762ca90..500cb226 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
@@ -15,9 +15,9 @@
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ResourceId;
-import org.chromium.chrome.browser.preferences.MainPreferences;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
+import org.chromium.chrome.browser.settings.MainPreferences;
 import org.chromium.content_public.browser.WebContents;
 
 import java.util.ArrayList;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivitySettingsLauncher.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivitySettingsLauncher.java
index 8aff78d..1047fd8b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivitySettingsLauncher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivitySettingsLauncher.java
@@ -10,10 +10,10 @@
 
 import org.chromium.base.Log;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.website.SettingsNavigationSource;
-import org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences;
-import org.chromium.chrome.browser.preferences.website.SiteSettingsCategory;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.website.SettingsNavigationSource;
+import org.chromium.chrome.browser.settings.website.SingleCategoryPreferences;
+import org.chromium.chrome.browser.settings.website.SiteSettingsCategory;
 
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappBridge.java
index dbe833f..0e06554 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/permissiondelegation/InstalledWebappBridge.java
@@ -7,7 +7,7 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.browserservices.Origin;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
 
 /**
  * Provides Trusted Web Activity Client App permissions for native. The C++ counterpart is the
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPermissionManager.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPermissionManager.java
index b199717..f8c985f7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPermissionManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPermissionManager.java
@@ -16,7 +16,7 @@
 import org.chromium.base.Log;
 import org.chromium.chrome.browser.ChromeApplication;
 import org.chromium.chrome.browser.browserservices.Origin;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java
index 834ebd7d..a5c0d19 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java
@@ -21,8 +21,8 @@
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelAnimation;
 import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelInflater;
 import org.chromium.chrome.browser.contextualsearch.ContextualSearchManager;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.privacy.ContextualSearchPreferenceFragment;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.privacy.ContextualSearchPreferenceFragment;
 import org.chromium.chrome.browser.util.MathUtils;
 import org.chromium.ui.base.LocalizationUtils;
 import org.chromium.ui.resources.dynamics.DynamicResourceLoader;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
index 244b844..f9f1f08ff 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchPolicy.java
@@ -22,7 +22,7 @@
 import org.chromium.chrome.browser.contextualsearch.ContextualSearchSelectionController.SelectionType;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
-import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
+import org.chromium.chrome.browser.settings.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.browser.util.UrlConstants;
 
 import java.net.URL;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromeMinidumpUploaderDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromeMinidumpUploaderDelegate.java
index 8e0ec0a..a2bae4d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromeMinidumpUploaderDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromeMinidumpUploaderDelegate.java
@@ -9,7 +9,7 @@
 import android.os.Build;
 import android.os.PersistableBundle;
 
-import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
+import org.chromium.chrome.browser.settings.privacy.PrivacyPreferencesManager;
 import org.chromium.components.minidump_uploader.MinidumpUploaderDelegate;
 import org.chromium.components.minidump_uploader.util.CrashReportingPermissionManager;
 import org.chromium.components.minidump_uploader.util.NetworkPermissionUtil;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java
index b6b814e..8bb5278f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java
@@ -21,7 +21,7 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
-import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
+import org.chromium.chrome.browser.settings.privacy.PrivacyPreferencesManager;
 import org.chromium.components.background_task_scheduler.TaskIds;
 import org.chromium.components.minidump_uploader.CrashFileManager;
 import org.chromium.components.minidump_uploader.MinidumpUploadCallable;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java
index cf1e4d02..0b964a13 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java
@@ -17,6 +17,7 @@
 import org.chromium.chrome.browser.dependency_injection.ChromeActivityComponent;
 import org.chromium.chrome.browser.tab.TabState;
 import org.chromium.chrome.browser.ui.RootUiCoordinator;
+import org.chromium.chrome.browser.webapps.WebappExtras;
 
 /**
  * Contains functionality which is shared between {@link WebappActivity} and
@@ -85,6 +86,11 @@
             return TabState.UNSPECIFIED_THEME_COLOR;
         }
 
+        WebappExtras webappExtras = getIntentDataProvider().getWebappExtras();
+        if (webappExtras != null && !webappExtras.hasCustomToolbarColor) {
+            return TabState.UNSPECIFIED_THEME_COLOR;
+        }
+
         return getIntentDataProvider().getToolbarColor();
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelper.java
index 8008fa2..c397650 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelper.java
@@ -15,6 +15,7 @@
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.browserservices.BrowserServicesIntentDataProvider;
 import org.chromium.chrome.browser.customtabs.content.CustomTabActivityTabProvider;
 import org.chromium.chrome.browser.customtabs.content.TabCreationMode;
 import org.chromium.chrome.browser.customtabs.content.TabObserverRegistrar;
@@ -23,13 +24,14 @@
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.Destroyable;
 import org.chromium.chrome.browser.lifecycle.NativeInitObserver;
-import org.chromium.chrome.browser.ntp.NewTabPage;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabImpl;
 import org.chromium.chrome.browser.tab.TabObserver;
 import org.chromium.chrome.browser.tab.TabThemeColorHelper;
+import org.chromium.chrome.browser.util.ColorUtils;
 import org.chromium.chrome.browser.util.UrlUtilities;
+import org.chromium.chrome.browser.webapps.WebappExtras;
 import org.chromium.components.security_state.ConnectionSecurityLevel;
 import org.chromium.content_public.browser.NavigationHandle;
 
@@ -46,64 +48,69 @@
     private final ChromeActivity mActivity;
     private final CustomTabActivityTabProvider mTabProvider;
     private final TabObserverRegistrar mTabObserverRegistrar;
+    private final BrowserServicesIntentDataProvider mIntentDataProvider;
 
     @Nullable
     private CustomTabTaskDescriptionIconGenerator mIconGenerator;
     @Nullable
     private FaviconHelper mFaviconHelper;
 
+    @Nullable
     private TabObserver mTabObserver;
+    @Nullable
+    private TabObserver mIconTabObserver;
+    @Nullable
     private CustomTabActivityTabProvider.Observer mActivityTabObserver;
 
     private int mDefaultThemeColor;
+    @Nullable
+    private String mForceTitle;
+    @Nullable
+    private Bitmap mForceIcon;
 
+    @Nullable
     private Bitmap mLargestFavicon;
 
-    /**
-     * Constructs a task description helper for the given activity.
-     *
-     * @param activity The activity whose descriptions should be updated.
-     * @param defaultThemeColor The default theme color to be used if the tab does not override it.
-     */
     @Inject
     public CustomTabTaskDescriptionHelper(ChromeActivity activity,
             CustomTabActivityTabProvider tabProvider, TabObserverRegistrar tabObserverRegistrar,
+            BrowserServicesIntentDataProvider intentDataProvider,
             ActivityLifecycleDispatcher activityLifecycleDispatcher) {
         mActivity = activity;
         mTabProvider = tabProvider;
         mTabObserverRegistrar = tabObserverRegistrar;
+        mIntentDataProvider = intentDataProvider;
 
         activityLifecycleDispatcher.register(this);
     }
 
     @Override
     public void onFinishNativeInitialization() {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP || !usesSeparateTask()) return;
+        WebappExtras webappExtras = mIntentDataProvider.getWebappExtras();
+        boolean canUpdate = (webappExtras != null
+                || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && usesSeparateTask()));
+        if (!canUpdate) return;
 
-        startObserving();
-    }
-
-    public void startObserving() {
         mDefaultThemeColor = ApiCompatibilityUtils.getColor(
                 mActivity.getResources(), R.color.default_primary_color);
+        if (webappExtras != null) {
+            if (webappExtras.hasCustomToolbarColor) {
+                mDefaultThemeColor = mIntentDataProvider.getToolbarColor();
+            }
+            mForceIcon = webappExtras.icon.bitmap();
+            mForceTitle = webappExtras.shortName;
+        }
 
         mIconGenerator = new CustomTabTaskDescriptionIconGenerator(mActivity);
         mFaviconHelper = new FaviconHelper();
 
+        startObserving();
+        onActiveTabChanged();
+    }
+
+    private void startObserving() {
         mTabObserver = new EmptyTabObserver() {
             @Override
-            public void onWebContentsSwapped(Tab tab, boolean didStartLoad, boolean didFinishLoad) {
-                if (!didStartLoad) return;
-                resetIcon();
-            }
-
-            @Override
-            public void onFaviconUpdated(Tab tab, Bitmap icon) {
-                if (icon == null) return;
-                updateFavicon(icon);
-            }
-
-            @Override
             public void onUrlUpdated(Tab tab) {
                 updateTaskDescription();
             }
@@ -114,11 +121,6 @@
             }
 
             @Override
-            public void onSSLStateUpdated(Tab tab) {
-                if (hasSecurityWarningOrError(tab)) resetIcon();
-            }
-
-            @Override
             public void onDidFinishNavigation(Tab tab, NavigationHandle navigation) {
                 if (navigation.hasCommitted() && navigation.isInMainFrame()
                         && !navigation.isSameDocument()) {
@@ -136,42 +138,72 @@
             public void onDidChangeThemeColor(Tab tab, int color) {
                 updateTaskDescription();
             }
-
-            @Override
-            public void onDidAttachInterstitialPage(Tab tab) {
-                resetIcon();
-            }
-
-            @Override
-            public void onDidDetachInterstitialPage(Tab tab) {
-                resetIcon();
-            }
-
-            private boolean hasSecurityWarningOrError(Tab tab) {
-                int securityLevel = ((TabImpl) tab).getSecurityLevel();
-                return securityLevel == ConnectionSecurityLevel.DANGEROUS;
-            }
         };
+        mTabObserverRegistrar.registerActivityTabObserver(mTabObserver);
+
+        if (mForceIcon != null) {
+            mIconTabObserver = new EmptyTabObserver() {
+                @Override
+                public void onWebContentsSwapped(
+                        Tab tab, boolean didStartLoad, boolean didFinishLoad) {
+                    if (!didStartLoad) return;
+                    resetIcon();
+                }
+
+                @Override
+                public void onFaviconUpdated(Tab tab, Bitmap icon) {
+                    if (icon == null) return;
+                    updateFavicon(icon);
+                }
+
+                @Override
+                public void onSSLStateUpdated(Tab tab) {
+                    if (hasSecurityWarningOrError(tab)) resetIcon();
+                }
+
+                @Override
+                public void onDidAttachInterstitialPage(Tab tab) {
+                    resetIcon();
+                }
+
+                @Override
+                public void onDidDetachInterstitialPage(Tab tab) {
+                    resetIcon();
+                }
+
+                private boolean hasSecurityWarningOrError(Tab tab) {
+                    int securityLevel = ((TabImpl) tab).getSecurityLevel();
+                    return securityLevel == ConnectionSecurityLevel.DANGEROUS;
+                }
+            };
+            mTabObserverRegistrar.registerActivityTabObserver(mIconTabObserver);
+        }
 
         mActivityTabObserver = new CustomTabActivityTabProvider.Observer() {
             @Override
             public void onInitialTabCreated(@NonNull Tab tab, @TabCreationMode int mode) {
-                fetchIcon();
-                updateTaskDescription();
+                onActiveTabChanged();
             }
 
             @Override
             public void onTabSwapped(@NonNull Tab tab) {
-                fetchIcon();
-                updateTaskDescription();
+                onActiveTabChanged();
             }
         };
-
-        mTabObserverRegistrar.registerActivityTabObserver(mTabObserver);
         mTabProvider.addObserver(mActivityTabObserver);
+    }
 
-        fetchIcon();
+    private void stopObserving() {
+        mTabObserverRegistrar.unregisterActivityTabObserver(mTabObserver);
+        mTabObserverRegistrar.unregisterActivityTabObserver(mIconTabObserver);
+        mTabProvider.removeObserver(mActivityTabObserver);
+    }
+
+    private void onActiveTabChanged() {
         updateTaskDescription();
+        if (mForceIcon == null) {
+            fetchIcon();
+        }
     }
 
     private void resetIcon() {
@@ -189,55 +221,52 @@
     }
 
     private void updateTaskDescription() {
-        Tab currentTab = mTabProvider.getTab();
-        if (currentTab == null) {
-            updateTaskDescription(null, null);
-            return;
-        }
+        ApiCompatibilityUtils.setTaskDescription(
+                mActivity, computeTitle(), computeIcon(), computeThemeColor());
+    }
 
-        if (NewTabPage.isNTPUrl(currentTab.getUrl()) && !currentTab.isIncognito()) {
-            // NTP needs a new color in recents, but uses the default application title and icon
-            updateTaskDescription(null, null);
-            return;
-        }
+    /**
+     * Computes the title for the task description.
+     */
+    private String computeTitle() {
+        if (!TextUtils.isEmpty(mForceTitle)) return mForceTitle;
+
+        Tab currentTab = mTabProvider.getTab();
+        if (currentTab == null) return null;
 
         String label = currentTab.getTitle();
         String domain = UrlUtilities.getDomainAndRegistry(currentTab.getUrl(), false);
         if (TextUtils.isEmpty(label)) {
             label = domain;
         }
-        if (mLargestFavicon == null && TextUtils.isEmpty(label)) {
-            updateTaskDescription(null, null);
-            return;
-        }
+        return label;
+    }
+
+    /**
+     * Computes the icon for the task description.
+     */
+    private Bitmap computeIcon() {
+        if (mForceIcon != null) return mForceIcon;
+
+        Tab currentTab = mTabProvider.getTab();
+        if (currentTab == null) return null;
 
         Bitmap bitmap = null;
         if (!currentTab.isIncognito()) {
             bitmap = mIconGenerator.getBitmap(currentTab.getUrl(), mLargestFavicon);
         }
-
-        updateTaskDescription(label, bitmap);
+        return bitmap;
     }
 
     /**
-     * Update the task description with the specified icon and label.
-     *
-     * <p>
-     * This is only publicly visible to allow activities to set this early during initialization
-     * prior to the tab's being available.
-     *
-     * @param label The text to use in the task description.
-     * @param icon The icon to use in the task description.
+     * Computes the theme color for the task description.
      */
-    public void updateTaskDescription(String label, Bitmap icon) {
+    private int computeThemeColor() {
         Tab currentTab = mTabProvider.getTab();
-        int color = mDefaultThemeColor;
-        if (currentTab != null) {
-            if (!TabThemeColorHelper.isDefaultColorUsed(currentTab)) {
-                color = TabThemeColorHelper.getColor(currentTab);
-            }
-        }
-        ApiCompatibilityUtils.setTaskDescription(mActivity, label, icon, color);
+        int themeColor = (currentTab == null || TabThemeColorHelper.isDefaultColorUsed(currentTab))
+                ? mDefaultThemeColor
+                : TabThemeColorHelper.getColor(currentTab);
+        return ColorUtils.getOpaqueColor(themeColor);
     }
 
     private void fetchIcon() {
@@ -273,8 +302,6 @@
         if (mFaviconHelper != null) {
             mFaviconHelper.destroy();
         }
-
-        mTabObserverRegistrar.unregisterActivityTabObserver(mTabObserver);
-        mTabProvider.removeObserver(mActivityTabObserver);
+        stopObserving();
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
index 9479c56..cd81948 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnection.java
@@ -67,8 +67,8 @@
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.util.IntentUtils;
 import org.chromium.chrome.browser.util.UrlConstants;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionMainMenuItem.java b/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionMainMenuItem.java
index 7ef84cf2..fa8dee3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionMainMenuItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionMainMenuItem.java
@@ -18,9 +18,9 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.datareduction.DataReductionPreferenceFragment;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.datareduction.DataReductionPreferenceFragment;
 import org.chromium.components.feature_engagement.EventConstants;
 import org.chromium.components.feature_engagement.Tracker;
 import org.chromium.third_party.android.datausagechart.ChartDataUsageView;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionPromoUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionPromoUtils.java
index 2c99b29..f734d077 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionPromoUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionPromoUtils.java
@@ -6,7 +6,7 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
-import org.chromium.chrome.browser.preferences.about.AboutSettingsBridge;
+import org.chromium.chrome.browser.settings.about.AboutSettingsBridge;
 
 /**
  * Helper functions for displaying the various data reduction proxy promos. The promo screens
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationCustomView.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationCustomView.java
index 85ed355..8288d3b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationCustomView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationCustomView.java
@@ -4,7 +4,7 @@
 
 package org.chromium.chrome.browser.download;
 
-import static org.chromium.chrome.browser.preferences.download.DownloadDirectoryAdapter.NO_SELECTED_ITEM_ID;
+import static org.chromium.chrome.browser.settings.download.DownloadDirectoryAdapter.NO_SELECTED_ITEM_ID;
 
 import android.content.Context;
 import android.util.AttributeSet;
@@ -18,7 +18,7 @@
 
 import androidx.annotation.Nullable;
 
-import org.chromium.chrome.browser.preferences.download.DownloadDirectoryAdapter;
+import org.chromium.chrome.browser.settings.download.DownloadDirectoryAdapter;
 import org.chromium.chrome.browser.ui.widget.text.AlertDialogEditText;
 import org.chromium.chrome.download.R;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java
index a2c3144..f3453c6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java
@@ -22,8 +22,8 @@
 import org.chromium.chrome.browser.download.items.OfflineContentAggregatorFactory;
 import org.chromium.chrome.browser.gesturenav.HistoryNavigationDelegate;
 import org.chromium.chrome.browser.gesturenav.HistoryNavigationLayout;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.download.DownloadPreferences;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.download.DownloadPreferences;
 import org.chromium.chrome.browser.snackbar.SnackbarManager;
 import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
 import org.chromium.chrome.download.R;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
index c11c775..b5a045f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
@@ -22,8 +22,8 @@
 import org.chromium.chrome.browser.flags.FeatureUtilities;
 import org.chromium.chrome.browser.locale.LocaleManager;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
-import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.browser.services.AndroidEduAndChildAccountHelper;
+import org.chromium.chrome.browser.settings.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.browser.signin.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.SigninManager;
 import org.chromium.chrome.browser.util.IntentUtils;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java
index 411d935..0044366 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java
@@ -15,8 +15,8 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.SyncFirstSetupCompleteSource;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.sync.SyncAndServicesPreferences;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.sync.SyncAndServicesPreferences;
 import org.chromium.chrome.browser.signin.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.SigninManager;
 import org.chromium.chrome.browser.signin.SigninManager.SignInCallback;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ForcedSigninProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ForcedSigninProcessor.java
index ba2da789..968a114 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ForcedSigninProcessor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ForcedSigninProcessor.java
@@ -10,8 +10,8 @@
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.externalauth.ExternalAuthUtils;
 import org.chromium.chrome.browser.externalauth.UserRecoverableErrorHandler;
-import org.chromium.chrome.browser.preferences.sync.AccountManagementFragment;
 import org.chromium.chrome.browser.services.AndroidEduAndChildAccountHelper;
+import org.chromium.chrome.browser.settings.sync.AccountManagementFragment;
 import org.chromium.chrome.browser.signin.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.SigninManager;
 import org.chromium.components.signin.AccountManagerFacade;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
index d1e4834..769b26ef 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
@@ -35,9 +35,9 @@
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefChangeRegistrar;
 import org.chromium.chrome.browser.preferences.PrefChangeRegistrar.PrefObserver;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.privacy.ClearBrowsingDataTabsFragment;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.privacy.ClearBrowsingDataTabsFragment;
 import org.chromium.chrome.browser.signin.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.SigninManager.SignInStateObserver;
 import org.chromium.chrome.browser.snackbar.Snackbar;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/DataReductionPromoInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DataReductionPromoInfoBar.java
index e833ef3..e6a4e35 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/DataReductionPromoInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/DataReductionPromoInfoBar.java
@@ -16,7 +16,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.datareduction.DataReductionPromoUtils;
 import org.chromium.chrome.browser.omaha.VersionNumberGetter;
-import org.chromium.chrome.browser.preferences.about.AboutSettingsBridge;
+import org.chromium.chrome.browser.settings.about.AboutSettingsBridge;
 import org.chromium.chrome.browser.util.UrlConstants;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.net.GURLUtils;
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 4804232..3be0cbc 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
@@ -10,9 +10,9 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ResourceId;
 import org.chromium.chrome.browser.permissions.AndroidPermissionRequester;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences;
-import org.chromium.chrome.browser.preferences.website.SiteSettingsCategory;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.website.SingleCategoryPreferences;
+import org.chromium.chrome.browser.settings.website.SiteSettingsCategory;
 import org.chromium.chrome.browser.tab.Tab;
 
 /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/PreviewsLitePageInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/PreviewsLitePageInfoBar.java
index c64a54a39..8a54f58 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/PreviewsLitePageInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/PreviewsLitePageInfoBar.java
@@ -9,8 +9,8 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ResourceId;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.datareduction.DataReductionPreferenceFragment;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.datareduction.DataReductionPreferenceFragment;
 
 /**
  * An InfoBar that lets the user know that Data Saver Lite Mode now also applies to HTTPS pages.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBar.java
index 6268fce..bc46ac4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBar.java
@@ -10,9 +10,8 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ResourceId;
-import org.chromium.chrome.browser.infobar.InfoBarContainerLayout.Item.InfoBarPriority;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.website.SingleWebsitePreferences;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.website.SingleWebsitePreferences;
 
 /**
  * An infobar to disclose to the user that the default search engine has geolocation access by
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/language/LanguageAskPrompt.java b/chrome/android/java/src/org/chromium/chrome/browser/language/LanguageAskPrompt.java
index 274f856..cd04959 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/language/LanguageAskPrompt.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/language/LanguageAskPrompt.java
@@ -22,7 +22,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.preferences.languages.LanguageItem;
+import org.chromium.chrome.browser.settings.languages.LanguageItem;
 import org.chromium.chrome.browser.translate.TranslateBridge;
 import org.chromium.components.language.AndroidLanguageMetricsBridge;
 import org.chromium.components.language.GeoLanguageProviderBridge;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
index f6de1c8..4e63246 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
@@ -26,9 +26,9 @@
 import org.chromium.chrome.browser.AppHooks;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.SearchEnginePreference;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.SearchEnginePreference;
 import org.chromium.chrome.browser.snackbar.Snackbar;
 import org.chromium.chrome.browser.snackbar.SnackbarManager;
 import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/locale/SogouPromoDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/locale/SogouPromoDialog.java
index 34b799de..849a31d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/locale/SogouPromoDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/locale/SogouPromoDialog.java
@@ -21,8 +21,8 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.SearchEnginePreference;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.SearchEnginePreference;
 import org.chromium.chrome.browser.ui.widget.PromoDialog;
 import org.chromium.ui.text.NoUnderlineClickableSpan;
 import org.chromium.ui.text.SpanApplier;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java
index d90c102..5b37255 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java
@@ -18,7 +18,7 @@
 import org.chromium.base.task.TaskTraits;
 import org.chromium.chrome.browser.DefaultBrowserInfo;
 import org.chromium.chrome.browser.instantapps.InstantAppsHandler;
-import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
+import org.chromium.chrome.browser.settings.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java
index e72ad9e4..574b56c5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/net/spdyproxy/DataReductionProxySettings.java
@@ -14,9 +14,9 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.datareduction.DataReductionPromoUtils;
-import org.chromium.chrome.browser.preferences.datareduction.DataReductionDataUseItem;
-import org.chromium.chrome.browser.preferences.datareduction.DataReductionProxySavingsClearedReason;
-import org.chromium.chrome.browser.preferences.datareduction.DataReductionStatsPreference;
+import org.chromium.chrome.browser.settings.datareduction.DataReductionDataUseItem;
+import org.chromium.chrome.browser.settings.datareduction.DataReductionProxySavingsClearedReason;
+import org.chromium.chrome.browser.settings.datareduction.DataReductionStatsPreference;
 import org.chromium.chrome.browser.util.ConversionUtils;
 import org.chromium.chrome.browser.util.UrlConstants;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateController.java b/chrome/android/java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateController.java
index d95a22ee..706a904d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateController.java
@@ -15,7 +15,7 @@
 import org.chromium.base.ApplicationStatus;
 import org.chromium.base.ObserverList;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
-import org.chromium.chrome.browser.preferences.themes.ThemePreferences;
+import org.chromium.chrome.browser.settings.themes.ThemePreferences;
 
 /**
  * Maintains and provides the night mode state for the entire application.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeMetrics.java
index b124e41..ce1590834 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeMetrics.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/night_mode/NightModeMetrics.java
@@ -8,7 +8,7 @@
 
 import org.chromium.base.metrics.CachedMetrics;
 import org.chromium.base.metrics.RecordUserAction;
-import org.chromium.chrome.browser.preferences.themes.ThemePreferences;
+import org.chromium.chrome.browser.settings.themes.ThemePreferences;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
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 c250e30..efdee25 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
@@ -19,7 +19,7 @@
 import org.chromium.chrome.browser.ChromeBaseAppCompatActivity;
 import org.chromium.chrome.browser.flags.FeatureUtilities;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
-import org.chromium.chrome.browser.preferences.themes.ThemePreferences;
+import org.chromium.chrome.browser.settings.themes.ThemePreferences;
 
 /**
  * Helper methods for supporting night mode.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java
index bdc6ad43..47be259 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java
@@ -40,10 +40,10 @@
 import org.chromium.chrome.browser.permissions.PermissionFieldTrial;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences;
-import org.chromium.chrome.browser.preferences.website.SingleWebsitePreferences;
-import org.chromium.chrome.browser.preferences.website.SiteSettingsCategory;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.website.SingleCategoryPreferences;
+import org.chromium.chrome.browser.settings.website.SingleWebsitePreferences;
+import org.chromium.chrome.browser.settings.website.SiteSettingsCategory;
 import org.chromium.chrome.browser.usage_stats.NotificationSuspender;
 import org.chromium.chrome.browser.webapps.ChromeWebApkHost;
 import org.chromium.chrome.browser.webapps.WebApkServiceClient;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/channels/SiteChannelsManager.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/channels/SiteChannelsManager.java
index 09f66085b..d6fe539 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/channels/SiteChannelsManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/channels/SiteChannelsManager.java
@@ -19,7 +19,7 @@
 import org.chromium.chrome.browser.notifications.NotificationManagerProxy;
 import org.chromium.chrome.browser.notifications.NotificationManagerProxyImpl;
 import org.chromium.chrome.browser.notifications.NotificationSettingsBridge.SiteChannel;
-import org.chromium.chrome.browser.preferences.website.WebsiteAddress;
+import org.chromium.chrome.browser.settings.website.WebsiteAddress;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchedPagesNotifier.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchedPagesNotifier.java
index 0adcffae..75eed141 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchedPagesNotifier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchedPagesNotifier.java
@@ -26,8 +26,8 @@
 import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
 import org.chromium.chrome.browser.notifications.PendingIntentProvider;
 import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions;
-import org.chromium.chrome.browser.preferences.NotificationsPreferences;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.NotificationsPreferences;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
 import org.chromium.content_public.browser.BrowserStartupController;
 import org.chromium.content_public.browser.BrowserStartupController.StartupCallback;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
index 0ca89c2..95bff62 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -51,9 +51,9 @@
 import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteCoordinatorFactory;
 import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteDelegate;
 import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionListEmbedder;
-import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
+import org.chromium.chrome.browser.settings.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tasks.ReturnToChromeExperimentsUtil;
 import org.chromium.chrome.browser.toolbar.ToolbarDataProvider;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
index b3ac3aab9..360fd61 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeader.java
@@ -28,9 +28,9 @@
 import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.omnibox.geo.VisibleNetworks.VisibleCell;
 import org.chromium.chrome.browser.omnibox.geo.VisibleNetworks.VisibleWifi;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
-import org.chromium.chrome.browser.preferences.website.PermissionInfo;
-import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
+import org.chromium.chrome.browser.settings.website.PermissionInfo;
+import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.util.UrlConstants;
 import org.chromium.chrome.browser.util.UrlUtilitiesJni;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java
index d6dcdeb5..d94b8cca 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java
@@ -8,10 +8,6 @@
 
 import android.content.Context;
 import android.graphics.Bitmap;
-import android.graphics.Bitmap.Config;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Paint;
 import android.graphics.Rect;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
@@ -77,8 +73,6 @@
     private @StringRes int mAccessibilityToast;
 
     private Bitmap mIconBitmap;
-    private Bitmap mCachedGoogleG;
-    private Paint mPaint;
 
     private TouchDelegate mTouchDelegate;
     private CompositeTouchDelegate mCompositeTouchDelegate;
@@ -119,8 +113,6 @@
         if (mToolbarCommonPropertiesModel != null
                 && mDelegate.shouldShowSearchEngineLogo(
                         mToolbarCommonPropertiesModel.isIncognito())) {
-            if (isSearchEngineGoogle) mPaint = new Paint();
-
             LinearLayout.LayoutParams layoutParams =
                     new LinearLayout.LayoutParams(mIconView.getLayoutParams());
             layoutParams.setMarginEnd(0);
@@ -325,36 +317,6 @@
         // mIconRes and mIconBitmap are mutually exclusive and therefore when one is set, the other
         // should be unset.
         mIconBitmap = null;
-
-        // Temporary workaround for M79 which makes the google g 20dp instead of 24dp.
-        // TODO(wylieb): Remove this code for M80 and replace it with the larger solution.
-        if (mDelegate != null && mToolbarCommonPropertiesModel != null
-                && mDelegate.shouldShowSearchEngineLogo(mToolbarCommonPropertiesModel.isIncognito())
-                && mIconRes == R.drawable.ic_logo_googleg_24dp) {
-            if (mCachedGoogleG == null) {
-                // Note: we use these constants more than once.
-                int outlineSize = getResources().getDimensionPixelSize(
-                        R.dimen.location_bar_status_icon_width);
-                int googleGSize = getResources().getDimensionPixelSize(R.dimen.sei_google_g_size);
-
-                // Note: this bitmap will be sized to location_bar_status_icon_width in
-                // {@link StatusView#animateStatusIcon} when passed into LayerDrawable.LayerState.
-                // To avoid this, we must compose the 20dp icon inside the 24dp icon.
-                assert mPaint
-                        != null : "Paint should be initialized when the search engine is Google.";
-                mCachedGoogleG =
-                        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(),
-                                                          R.drawable.ic_logo_googleg_24dp),
-                                googleGSize, googleGSize, false);
-                Bitmap bitmap = Bitmap.createBitmap(outlineSize, outlineSize, Config.ARGB_8888);
-                Canvas canvas = new Canvas(bitmap);
-                canvas.drawBitmap(mCachedGoogleG, (outlineSize - googleGSize) / 2f,
-                        (outlineSize - googleGSize) / 2f, mPaint);
-                mCachedGoogleG = bitmap;
-            }
-            mIconBitmap = mCachedGoogleG;
-            mIconRes = 0;
-        }
         animateStatusIcon();
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoController.java b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoController.java
index 106817c..c832071 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoController.java
@@ -35,10 +35,10 @@
 import org.chromium.chrome.browser.omnibox.OmniboxUrlEmphasizer;
 import org.chromium.chrome.browser.page_info.PageInfoView.ConnectionInfoParams;
 import org.chromium.chrome.browser.page_info.PageInfoView.PageInfoViewParams;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
 import org.chromium.chrome.browser.previews.PreviewsAndroidBridge;
 import org.chromium.chrome.browser.previews.PreviewsUma;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
 import org.chromium.chrome.browser.ssl.SecurityStateModel;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabImpl;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java
index 9eb2789..6407260 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java
@@ -20,9 +20,9 @@
 import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.browserservices.Origin;
 import org.chromium.chrome.browser.browserservices.permissiondelegation.TrustedWebActivityPermissionManager;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
-import org.chromium.chrome.browser.preferences.website.ContentSettingsResources;
-import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
+import org.chromium.chrome.browser.settings.website.ContentSettingsResources;
+import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
 import org.chromium.components.location.LocationUtils;
 import org.chromium.ui.base.AndroidPermissionDelegate;
 import org.chromium.ui.base.PermissionCallback;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/page_info/SiteSettingsHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/page_info/SiteSettingsHelper.java
index 15b6b5e2..435f359 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/page_info/SiteSettingsHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/page_info/SiteSettingsHelper.java
@@ -9,9 +9,9 @@
 
 import org.chromium.base.StrictModeContext;
 import org.chromium.chrome.browser.offlinepages.OfflinePageUtils;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.website.SingleWebsitePreferences;
 import org.chromium.chrome.browser.previews.PreviewsAndroidBridge;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.website.SingleWebsitePreferences;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabImpl;
 import org.chromium.chrome.browser.util.UrlConstants;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java
index 99fc30f4..ec21891 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AddressEditor.java
@@ -19,9 +19,9 @@
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.GetSubKeysRequestDelegate;
 import org.chromium.chrome.browser.autofill.PhoneNumberUtil;
-import org.chromium.chrome.browser.preferences.autofill.AutofillProfileBridge;
-import org.chromium.chrome.browser.preferences.autofill.AutofillProfileBridge.AddressField;
-import org.chromium.chrome.browser.preferences.autofill.AutofillProfileBridge.AddressUiComponent;
+import org.chromium.chrome.browser.settings.autofill.AutofillProfileBridge;
+import org.chromium.chrome.browser.settings.autofill.AutofillProfileBridge.AddressField;
+import org.chromium.chrome.browser.settings.autofill.AutofillProfileBridge.AddressUiComponent;
 import org.chromium.chrome.browser.widget.prefeditor.EditorBase;
 import org.chromium.chrome.browser.widget.prefeditor.EditorFieldModel;
 import org.chromium.chrome.browser.widget.prefeditor.EditorFieldModel.EditorFieldValidator;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillAddress.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillAddress.java
index 8fea739b..c29974c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillAddress.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillAddress.java
@@ -16,8 +16,8 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
-import org.chromium.chrome.browser.preferences.autofill.AutofillProfileBridge;
-import org.chromium.chrome.browser.preferences.autofill.AutofillProfileBridge.AddressField;
+import org.chromium.chrome.browser.settings.autofill.AutofillProfileBridge;
+import org.chromium.chrome.browser.settings.autofill.AutofillProfileBridge.AddressField;
 import org.chromium.chrome.browser.widget.prefeditor.EditableOption;
 import org.chromium.payments.mojom.PaymentAddress;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java
index 8bd8db9..d26c67f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/CardEditor.java
@@ -25,7 +25,7 @@
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
 import org.chromium.chrome.browser.payments.PaymentRequestImpl.PaymentRequestServiceObserverForTest;
-import org.chromium.chrome.browser.preferences.autofill.AutofillProfileBridge.DropdownKeyValue;
+import org.chromium.chrome.browser.settings.autofill.AutofillProfileBridge.DropdownKeyValue;
 import org.chromium.chrome.browser.widget.prefeditor.EditorBase;
 import org.chromium.chrome.browser.widget.prefeditor.EditorFieldModel;
 import org.chromium.chrome.browser.widget.prefeditor.EditorFieldModel.EditorFieldValidator;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
index 25084f8..defc62c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
@@ -38,9 +38,9 @@
 import org.chromium.chrome.browser.payments.ui.PaymentRequestUI;
 import org.chromium.chrome.browser.payments.ui.SectionInformation;
 import org.chromium.chrome.browser.payments.ui.ShoppingCart;
-import org.chromium.chrome.browser.preferences.MainPreferences;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.MainPreferences;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
 import org.chromium.chrome.browser.ssl.SecurityStateModel;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
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 2c0d84ca..d218a40 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,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.metrics.WebApkUma;
-import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge;
+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.ui.base.PermissionCallback;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/BitmapScalerTask.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/BitmapScalerTask.java
index fb3a4653..c563bf9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/BitmapScalerTask.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/BitmapScalerTask.java
@@ -24,17 +24,19 @@
     private final int mSize;
     private final Bitmap mBitmap;
     private final String mVideoDuration;
+    private final float mRatio;
 
     /**
      * A BitmapScalerTask constructor.
      */
     public BitmapScalerTask(LruCache<String, PickerCategoryView.Thumbnail> cache, Bitmap bitmap,
-            String filePath, String videoDuration, int size) {
+            String filePath, String videoDuration, int size, float ratio) {
         mCache = cache;
         mFilePath = filePath;
         mSize = size;
         mBitmap = bitmap;
         mVideoDuration = videoDuration;
+        mRatio = ratio;
     }
 
     /**
@@ -66,6 +68,8 @@
 
         List<Bitmap> bitmaps = new ArrayList<>(1);
         bitmaps.add(bitmap);
-        mCache.put(mFilePath, new PickerCategoryView.Thumbnail(bitmaps, mVideoDuration));
+        mCache.put(mFilePath,
+                new PickerCategoryView.Thumbnail(
+                        bitmaps, mVideoDuration, /*fullWidth=*/false, mRatio));
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/BitmapUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/BitmapUtils.java
index a8c55c7..9be2a31 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/BitmapUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/BitmapUtils.java
@@ -10,6 +10,7 @@
 import android.media.ExifInterface;
 import android.media.MediaMetadataRetriever;
 import android.os.Build;
+import android.util.Pair;
 
 import org.chromium.base.metrics.RecordHistogram;
 
@@ -37,29 +38,44 @@
     private static final int EXIF_ORIENTATION_ACTION_BOUNDARY = 9;
 
     /**
-     * Takes a |bitmap| and returns a square thumbnail of |size|x|size| from the center of the
-     * bitmap specified, rotating it according to the Exif information, if needed (on Nougat and
-     * up only).
+     * Takes a |bitmap| and (if |!fullWidth|) returns a square thumbnail of |width|x|width| from the
+     * center of the bitmap specified, or (if |fullWidth|) an image that scaled to fit within
+     * |width|. The image is rotated according to the Exif information, if needed (on Nougat and up
+     * only).
      * @param bitmap The bitmap to adjust.
-     * @param size The desired size (width and height).
+     * @param width The desired width (and height if fullWidth is false).
+     * @param fullWidth Whether full screen width is in use. When true, the image returned is
+     *         |width| wide and whatever height scales to. When false, a rectangular |width|x|width|
+     *         image is returned.
      * @param descriptor The file descriptor to read the Exif information from.
      * @return The new bitmap thumbnail.
      */
-    private static Bitmap sizeBitmap(Bitmap bitmap, int size, FileDescriptor descriptor) {
+    private static Bitmap sizeBitmap(
+            Bitmap bitmap, int width, boolean fullWidth, FileDescriptor descriptor) {
         // TODO(finnur): Investigate options that require fewer bitmaps to be created.
-        bitmap = ensureMinSize(bitmap, size);
-        bitmap = rotateAndCropToSquare(bitmap, size, descriptor);
-        return bitmap;
+        if (!fullWidth) {
+            bitmap = ensureMinSize(bitmap, width);
+            bitmap = rotateAndCropToSquare(bitmap, width, descriptor);
+            return bitmap;
+        } else {
+            return rotateAndFitToMaxWidth(bitmap, width, descriptor);
+        }
     }
 
     /**
-     * Given a FileDescriptor, decodes the contents and returns a bitmap of
-     * dimensions |size|x|size|.
+     * Given a FileDescriptor, decodes the contents and returns a square thumbnail of
+     * |width|x|width| from the center of the bitmap specified, or (if |fullwidth|) an image that
+     * scaled to fit within |width|. The image is rotated according to the Exif information, if
+     * needed (on Nougat and up only).
      * @param descriptor The FileDescriptor for the file to read.
-     * @param size The width and height of the bitmap to return.
-     * @return The resulting bitmap.
+     * @param size The width of the bitmap to return.
+     * @param fullWidth Whether full screen width is in use. When true, the image returned is
+     *         |width| wide and whatever height scales to. When false, a rectangular |width|x|width|
+     *         image is returned.
+     * @return The resulting bitmap and its ratio.
      */
-    public static Bitmap decodeBitmapFromFileDescriptor(FileDescriptor descriptor, int size) {
+    public static Pair<Bitmap, Float> decodeBitmapFromFileDescriptor(
+            FileDescriptor descriptor, int size, boolean fullWidth) {
         BitmapFactory.Options options = new BitmapFactory.Options();
         options.inJustDecodeBounds = true;
         BitmapFactory.decodeFileDescriptor(descriptor, null, options);
@@ -69,31 +85,41 @@
 
         if (bitmap == null) return null;
 
-        return sizeBitmap(bitmap, size, descriptor);
+        return new Pair<Bitmap, Float>(sizeBitmap(bitmap, size, fullWidth, descriptor),
+                (float) bitmap.getHeight() / bitmap.getWidth());
     }
 
     /**
-     * Given a FileDescriptor, decodes the video and returns a bitmap of dimensions |size|x|size|.
+     * Given a FileDescriptor, decodes the video and returns a square thumbnail of |width|x|width|
+     * from the center of the bitmap specified, or (if |fullwidth|) an image that scaled to fit
+     * within |width|. The image is rotated according to the Exif information, if needed (on Nougat
+     * and up only).
      * @param retriever The MediaMetadataRetriever to use (must have source already set).
      * @param descriptor The FileDescriptor for the file to read.
-     * @param size The width and height of the bitmap to return.
+     * @param width The width of the bitmap to return.
      * @param frames The number of frames to extract.
+     * @param fullWidth Whether full screen width is in use. When true, the image returned is
+     *         |width| wide and whatever height scales to. When false, a rectangular |width|x|width|
+     *         image is returned.
      * @param intervalMs The interval between frames (in milliseconds).
      * @return A list of extracted frames.
      */
-    public static List<Bitmap> decodeVideoFromFileDescriptor(MediaMetadataRetriever retriever,
-            FileDescriptor descriptor, int size, int frames, long intervalMs) {
+    public static Pair<List<Bitmap>, Float> decodeVideoFromFileDescriptor(
+            MediaMetadataRetriever retriever, FileDescriptor descriptor, int width, int frames,
+            boolean fullWidth, long intervalMs) {
         List<Bitmap> bitmaps = new ArrayList<Bitmap>();
         Bitmap bitmap = null;
+        Float ratio = null;
         for (int frame = 0; frame < frames; ++frame) {
             bitmap = retriever.getFrameAtTime(frame * intervalMs * 1000);
             if (bitmap == null) continue;
+            if (ratio == null) ratio = (float) bitmap.getHeight() / bitmap.getWidth();
 
-            bitmap = sizeBitmap(bitmap, size, descriptor);
+            bitmap = sizeBitmap(bitmap, width, fullWidth, descriptor);
             bitmaps.add(bitmap);
         }
 
-        return bitmaps;
+        return new Pair<List<Bitmap>, Float>(bitmaps, ratio);
     }
 
     /**
@@ -158,14 +184,12 @@
     }
 
     /**
-     * Crops a |bitmap| to a certain square |size| and rotates it according to the Exif information,
-     * if needed (on Nougat and up only).
-     * @param bitmap The bitmap to crop.
-     * @param size The size desired (width and height).
-     * @return The resulting (square) bitmap.
+     * Returns the rotation matrix from the Exif information in the file descriptor (on Nougat and
+     * up only).
+     * @param descriptor The FileDescriptor containing the Exif information.
+     * @return The resulting rotation matrix (or null, if Android < N).
      */
-    private static Bitmap rotateAndCropToSquare(
-            Bitmap bitmap, int size, FileDescriptor descriptor) {
+    private static Matrix getRotationMatrix(FileDescriptor descriptor) {
         Matrix matrix = new Matrix();
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             try {
@@ -215,7 +239,19 @@
             } catch (IOException e) {
             }
         }
+        return matrix;
+    }
 
+    /**
+     * Crops a |bitmap| to a certain square |size| and (on Nougat and up only) rotates it according
+     * to the Exif information, if needed.
+     * @param bitmap The bitmap to crop.
+     * @param size The size desired (width and height).
+     * @param descriptor The FileDescriptor containing the Exif information.
+     * @return The resulting (square) bitmap.
+     */
+    private static Bitmap rotateAndCropToSquare(
+            Bitmap bitmap, int size, FileDescriptor descriptor) {
         int x = 0;
         int y = 0;
         int width = bitmap.getWidth();
@@ -224,7 +260,25 @@
 
         if (width > size) x = (width - size) / 2;
         if (height > size) y = (height - size) / 2;
-        return Bitmap.createBitmap(bitmap, x, y, size, size, matrix, true);
+        return Bitmap.createBitmap(bitmap, x, y, size, size, getRotationMatrix(descriptor), true);
+    }
+
+    /**
+     * Rotate a bitmap according to its Exif information and make sure it fits to the maximum width.
+     * @param bitmap The input bitmap.
+     * @param maxWidth The maximum width available.
+     * @param descriptor The FileDescriptor containing the Exif information.
+     */
+    private static Bitmap rotateAndFitToMaxWidth(
+            Bitmap bitmap, int maxWidth, FileDescriptor descriptor) {
+        Bitmap rotated = bitmap;
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            rotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(),
+                    getRotationMatrix(descriptor), true);
+        }
+        float ratio = (float) maxWidth / rotated.getWidth();
+        int height = (int) (rotated.getHeight() * ratio);
+        return Bitmap.createScaledBitmap(rotated, maxWidth, height, true);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecodeVideoTask.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecodeVideoTask.java
index 725828a..3b6d5b0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecodeVideoTask.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecodeVideoTask.java
@@ -26,7 +26,7 @@
 /**
  * A worker task to decode video and extract information from it off of the UI thread.
  */
-class DecodeVideoTask extends AsyncTask<Pair<List<Bitmap>, String>> {
+class DecodeVideoTask extends AsyncTask<List<Bitmap>> {
     /**
      * The possible error states while decoding.
      */
@@ -49,10 +49,11 @@
          * @param uri The uri of the video decoded.
          * @param bitmaps An array of thumbnails extracted from the video.
          * @param duration The duration of the video.
+         * @param fullWidth Whether the image is using the full width of the screen.
          * @param decodingStatus Whether the decoding was successful.
          */
-        void videoDecodedCallback(
-                Uri uri, List<Bitmap> bitmaps, String duration, @DecodingResult int decodingStatus);
+        void videoDecodedCallback(Uri uri, List<Bitmap> bitmaps, String duration, boolean fullWidth,
+                @DecodingResult int decodingStatus, float ratio);
     }
 
     // The callback to use to communicate the results.
@@ -64,6 +65,9 @@
     // The desired width and height (in pixels) of the returned thumbnail from the video.
     int mSize;
 
+    // Whether the image is taking up the full width of the screen.
+    boolean mFullWidth;
+
     // The number of frames to extract.
     int mFrames;
 
@@ -73,12 +77,15 @@
     // The ContentResolver to use to retrieve image metadata from disk.
     private ContentResolver mContentResolver;
 
-    // A metadata retriever, used to decode the video, and extract a thumbnail frame.
-    private MediaMetadataRetriever mRetriever = new MediaMetadataRetriever();
-
     // Keeps track of errors during decoding.
     private @DecodingResult int mDecodingResult;
 
+    // The duration of the video.
+    private String mDuration;
+
+    // The ratio of the first frame of the video.
+    private float mRatio;
+
     /**
      * A DecodeVideoTask constructor.
      * @param callback The callback to use to communicate back the results.
@@ -86,15 +93,17 @@
      * @param uri The URI of the video to decode.
      * @param size The desired width and height (in pixels) of the returned thumbnail from the
      *             video.
+     * @param fullWidth Whether this is a video thumbnail that takes up the full screen width.
      * @param frames The number of frames to extract.
      * @param intervalMs The interval between frames (in milliseconds).
      */
     public DecodeVideoTask(VideoDecodingCallback callback, ContentResolver contentResolver, Uri uri,
-            int size, int frames, long intervalMs) {
+            int size, boolean fullWidth, int frames, long intervalMs) {
         mCallback = callback;
         mContentResolver = contentResolver;
         mUri = uri;
         mSize = size;
+        mFullWidth = fullWidth;
         mFrames = frames;
         mIntervalMs = intervalMs;
     }
@@ -122,10 +131,10 @@
 
     /**
      * Decodes a video and extracts metadata and a thumbnail. Called on a non-UI thread
-     * @return A pair of bitmap (video thumbnail) and the duration of the video.
+     * @return A list of bitmaps (video thumbnails).
      */
     @Override
-    protected Pair<List<Bitmap>, String> doInBackground() {
+    protected List<Bitmap> doInBackground() {
         assert !ThreadUtils.runningOnUiThread();
 
         if (isCancelled()) return null;
@@ -133,9 +142,10 @@
         AssetFileDescriptor afd = null;
         try {
             afd = mContentResolver.openAssetFileDescriptor(mUri, "r");
-            mRetriever.setDataSource(afd.getFileDescriptor());
+            MediaMetadataRetriever retriever = new MediaMetadataRetriever();
+            retriever.setDataSource(afd.getFileDescriptor());
             String duration =
-                    mRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
+                    retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
             if (duration != null) {
                 // Adjust to a shorter video, if the frame requests exceed the length of the video.
                 long durationMs = Long.parseLong(duration);
@@ -144,10 +154,11 @@
                 }
                 duration = formatDuration(duration);
             }
-            List<Bitmap> bitmaps = BitmapUtils.decodeVideoFromFileDescriptor(
-                    mRetriever, afd.getFileDescriptor(), mSize, mFrames, mIntervalMs);
-
-            return new Pair<List<Bitmap>, String>(bitmaps, duration);
+            Pair<List<Bitmap>, Float> bitmaps = BitmapUtils.decodeVideoFromFileDescriptor(
+                    retriever, afd.getFileDescriptor(), mSize, mFrames, mFullWidth, mIntervalMs);
+            mDuration = duration;
+            mRatio = bitmaps.second;
+            return bitmaps.first;
         } catch (FileNotFoundException exception) {
             mDecodingResult = DecodingResult.FILE_ERROR;
             return null;
@@ -170,16 +181,17 @@
      * @param results A pair of bitmap (video thumbnail) and the duration of the video.
      */
     @Override
-    protected void onPostExecute(Pair<List<Bitmap>, String> results) {
+    protected void onPostExecute(List<Bitmap> results) {
         if (isCancelled()) {
             return;
         }
 
         if (results == null) {
-            mCallback.videoDecodedCallback(mUri, null, "", mDecodingResult);
+            mCallback.videoDecodedCallback(mUri, null, "", mFullWidth, mDecodingResult, 1.0f);
             return;
         }
 
-        mCallback.videoDecodedCallback(mUri, results.first, results.second, mDecodingResult);
+        mCallback.videoDecodedCallback(
+                mUri, results, mDuration, mFullWidth, mDecodingResult, mRatio);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderService.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderService.java
index 2d0073e..bc6fb5e2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderService.java
@@ -12,6 +12,7 @@
 import android.os.ParcelFileDescriptor;
 import android.os.RemoteException;
 import android.os.SystemClock;
+import android.util.Pair;
 
 import org.chromium.base.CommandLine;
 import org.chromium.base.Log;
@@ -36,7 +37,9 @@
     static final String KEY_FILE_DESCRIPTOR = "file_descriptor";
     static final String KEY_FILE_PATH = "file_path";
     static final String KEY_IMAGE_BITMAP = "image_bitmap";
-    static final String KEY_SIZE = "size";
+    static final String KEY_WIDTH = "width";
+    static final String KEY_RATIO = "ratio";
+    static final String KEY_FULL_WIDTH = "full_width";
     static final String KEY_SUCCESS = "success";
     static final String KEY_DECODE_TIME = "decode_time";
 
@@ -79,11 +82,13 @@
         public void decodeImage(Bundle payload, IDecoderServiceCallback callback) {
             Bundle bundle = null;
             String filePath = "";
-            int size = 0;
+            int width = 0;
+            boolean fullWidth = false;
             try {
                 filePath = payload.getString(KEY_FILE_PATH);
                 ParcelFileDescriptor pfd = payload.getParcelable(KEY_FILE_DESCRIPTOR);
-                size = payload.getInt(KEY_SIZE);
+                width = payload.getInt(KEY_WIDTH);
+                fullWidth = payload.getBoolean(KEY_FULL_WIDTH);
 
                 // Setup a minimum viable response to parent process. Will be fleshed out
                 // further below.
@@ -92,7 +97,7 @@
                 bundle.putBoolean(KEY_SUCCESS, false);
 
                 if (!mNativeLibraryAndSandboxInitialized) {
-                    Log.e(TAG, "Decode failed %s (size: %d): no sandbox", filePath, size);
+                    Log.e(TAG, "Decode failed %s (width: %d): no sandbox", filePath, width);
                     sendReply(callback, bundle); // Sends SUCCESS == false;
                     return;
                 }
@@ -100,17 +105,19 @@
                 FileDescriptor fd = pfd.getFileDescriptor();
 
                 long begin = SystemClock.elapsedRealtime();
-                Bitmap bitmap = BitmapUtils.decodeBitmapFromFileDescriptor(fd, size);
+                Pair<Bitmap, Float> decodedBitmap =
+                        BitmapUtils.decodeBitmapFromFileDescriptor(fd, width, fullWidth);
                 long decodeTime = SystemClock.elapsedRealtime() - begin;
 
                 try {
                     pfd.close();
                 } catch (IOException e) {
-                    Log.e(TAG, "Closing failed " + filePath + " (size: " + size + ") " + e);
+                    Log.e(TAG, "Closing failed " + filePath + " (width: " + width + ") " + e);
                 }
 
+                Bitmap bitmap = decodedBitmap.first;
                 if (bitmap == null) {
-                    Log.e(TAG, "Decode failed " + filePath + " (size: " + size + ")");
+                    Log.e(TAG, "Decode failed " + filePath + " (width: " + width + ")");
                     sendReply(callback, bundle); // Sends SUCCESS == false;
                     return;
                 }
@@ -121,8 +128,10 @@
                 // descriptor. In the receiving process it will just leave the bitmap on
                 // ashmem since it's immutable and carry on.
                 bundle.putParcelable(KEY_IMAGE_BITMAP, bitmap);
+                bundle.putFloat(KEY_RATIO, decodedBitmap.second);
                 bundle.putBoolean(KEY_SUCCESS, true);
                 bundle.putLong(KEY_DECODE_TIME, decodeTime);
+                bundle.putBoolean(KEY_FULL_WIDTH, payload.getBoolean(KEY_FULL_WIDTH));
                 sendReply(callback, bundle);
                 bitmap.recycle();
             } catch (Exception e) {
@@ -130,7 +139,7 @@
                 // decoding a photo, it is better UX to eat the exception instead of showing
                 // a crash dialog and discarding other requests that have already been sent.
                 Log.e(TAG,
-                        "Unexpected error during decoding " + filePath + " (size: " + size + ") "
+                        "Unexpected error during decoding " + filePath + " (width: " + width + ") "
                                 + e);
 
                 if (bundle != null) sendReply(callback, bundle);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHost.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHost.java
index 9915c90..3ea2922 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHost.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHost.java
@@ -114,11 +114,12 @@
          * A function to define to receive a notification that an image has been decoded.
          * @param filePath The file path for the newly decoded image.
          * @param isVideo Whether the decoding was from a video or not.
+         * @param fullWidth Whether the image is using the full width of the screen.
          * @param bitmaps The results of the decoding (or placeholder image, if failed).
          * @param videoDuration The time-length of the video (null if not a video).
          */
-        void imagesDecodedCallback(
-                String filePath, boolean isVideo, List<Bitmap> bitmaps, String videoDuration);
+        void imagesDecodedCallback(String filePath, boolean isVideo, boolean fullWidth,
+                List<Bitmap> bitmaps, String videoDuration, float ratio);
     }
 
     /**
@@ -128,8 +129,11 @@
         // The URI for the file containing the bitmap to decode.
         public Uri mUri;
 
-        // The requested size (width and height) of the bitmap, once decoded.
-        public int mSize;
+        // The requested width of the bitmap, once decoded.
+        public int mWidth;
+
+        // Whether this is image is taking up the full width of the screen.
+        public boolean mFullWidth;
 
         // The type of media being decoded.
         @PickerBitmap.TileTypes
@@ -141,10 +145,11 @@
         // The timestamp for when the request was sent for decoding.
         long mTimestamp;
 
-        public DecoderServiceParams(Uri uri, int size, @PickerBitmap.TileTypes int fileType,
-                ImagesDecodedCallback callback) {
+        public DecoderServiceParams(Uri uri, int width, boolean fullWidth,
+                @PickerBitmap.TileTypes int fileType, ImagesDecodedCallback callback) {
             mUri = uri;
-            mSize = size;
+            mWidth = width;
+            mFullWidth = fullWidth;
             mFileType = fileType;
             mCallback = callback;
         }
@@ -208,12 +213,14 @@
      * asynchronously on |callback|.
      * @param uri The URI of the file to decode.
      * @param fileType The type of image being sent for decoding.
-     * @param size The requested size (width and height) of the resulting bitmap.
+     * @param width The requested size (width and height) of the resulting bitmap.
+     * @param fullWidth Whether the image is using the full width of the screen.
      * @param callback The callback to use to communicate the decoding results.
      */
-    public void decodeImage(Uri uri, @PickerBitmap.TileTypes int fileType, int size,
-            ImagesDecodedCallback callback) {
-        DecoderServiceParams params = new DecoderServiceParams(uri, size, fileType, callback);
+    public void decodeImage(Uri uri, @PickerBitmap.TileTypes int fileType, int width,
+            boolean fullWidth, ImagesDecodedCallback callback) {
+        DecoderServiceParams params =
+                new DecoderServiceParams(uri, width, fullWidth, fileType, callback);
         mHighPriorityRequests.put(uri.getPath(), params);
         if (mProcessingRequests.size() == 0) dispatchNextDecodeRequest();
     }
@@ -232,8 +239,8 @@
             // High-priority decoding requests for videos are requests for first frames (see
             // dispatchDecodeVideoRequest). Adding another low-priority request is a request for
             // decoding the rest of the frames.
-            DecoderServiceParams lowPriorityRequest = new DecoderServiceParams(
-                    params.mUri, params.mSize, params.mFileType, params.mCallback);
+            DecoderServiceParams lowPriorityRequest = new DecoderServiceParams(params.mUri,
+                    params.mWidth, params.mFullWidth, params.mFileType, params.mCallback);
             mLowPriorityRequests.put(params.mUri.getPath(), lowPriorityRequest);
         }
         return params;
@@ -325,11 +332,14 @@
      * @param uri The uri of the decoded video.
      * @param bitmaps The thumbnails representing the decoded video.
      * @param duration The video duration (a formatted human-readable string, for example "3:00").
+     * @param fullWidth Whether the image is using the full width of the screen.
      * @param decodingResult Whether the decoding was successful.
+     * @param ratio The ratio of the first decoded frame in the video (>1.0=portrait,
+     *         <1.0=landscape).
      */
     @Override
     public void videoDecodedCallback(Uri uri, List<Bitmap> bitmaps, String duration,
-            @DecodeVideoTask.DecodingResult int decodingResult) {
+            boolean fullWidth, @DecodeVideoTask.DecodingResult int decodingResult, float ratio) {
         switch (decodingResult) {
             case DecodeVideoTask.DecodingResult.SUCCESS:
                 if (bitmaps == null || bitmaps.size() == 0) {
@@ -349,7 +359,7 @@
                 break;
         }
 
-        closeRequest(uri.getPath(), true, bitmaps, duration, -1);
+        closeRequest(uri.getPath(), true, fullWidth, bitmaps, duration, -1, ratio);
     }
 
     @Override
@@ -360,7 +370,8 @@
         PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT, () -> {
             String filePath = "";
             List<Bitmap> bitmaps = null;
-            String videoDuration = null;
+            Boolean fullWidth = false;
+            float ratio = 0;
             long decodeTime = -1;
             try {
                 // Read the reply back from the service.
@@ -369,7 +380,9 @@
                 Bitmap bitmap = success
                         ? (Bitmap) payload.getParcelable(DecoderService.KEY_IMAGE_BITMAP)
                         : null;
+                ratio = payload.getFloat(DecoderService.KEY_RATIO);
                 decodeTime = payload.getLong(DecoderService.KEY_DECODE_TIME);
+                fullWidth = payload.getBoolean(DecoderService.KEY_FULL_WIDTH);
                 mSuccessfulImageDecodes++;
                 bitmaps = new ArrayList<>(1);
                 bitmaps.add(bitmap);
@@ -378,28 +391,34 @@
             } catch (OutOfMemoryError e) {
                 mFailedImageDecodesMemory++;
             } finally {
-                closeRequest(
-                        filePath, /*isVideo=*/false, bitmaps, /*videoDuration=*/null, decodeTime);
+                closeRequest(filePath, /*isVideo=*/false, fullWidth, bitmaps,
+                        /*videoDuration=*/null, decodeTime, ratio);
             }
         });
     }
 
+    public void closeRequestWithError(String filePath) {
+        closeRequest(filePath, false, false, null, null, -1, 1.0f);
+    }
+
     /**
      * Ties up all the loose ends from the decoding request (communicates the results of the
      * decoding process back to the client, and takes care of house-keeping chores regarding
      * the request queue).
      * @param filePath The path to the image that was just decoded.
      * @param isVideo True if the request was for video decoding.
+     * @param fullWidth Whether the image is using the full width of the screen.
      * @param bitmaps The resulting decoded bitmaps, or null if decoding fails.
-     * @param decodeTime The length of time it took to decode the bitmap.
+     * @param decodeTime The length of time it took to decode the bitmaps.
+     * @param ratio The ratio of the images (>1.0=portrait, <1.0=landscape).
      */
-    public void closeRequest(String filePath, boolean isVideo, @Nullable List<Bitmap> bitmaps,
-            String videoDuration, long decodeTime) {
+    public void closeRequest(String filePath, boolean isVideo, boolean fullWidth,
+            @Nullable List<Bitmap> bitmaps, String videoDuration, long decodeTime, float ratio) {
         DecoderServiceParams params = mProcessingRequests.get(filePath);
         if (params != null) {
             long endRpcCall = SystemClock.elapsedRealtime();
-            if (isVideo) {
-                if (bitmaps.size() > 1) {
+            if (isVideo && bitmaps != null) {
+                if (bitmaps != null && bitmaps.size() > 1) {
                     RecordHistogram.recordTimesHistogram(
                             "Android.PhotoPicker.RequestProcessTimeAnimation",
                             endRpcCall - params.mTimestamp);
@@ -413,7 +432,8 @@
                         "Android.PhotoPicker.RequestProcessTime", endRpcCall - params.mTimestamp);
             }
 
-            params.mCallback.imagesDecodedCallback(filePath, isVideo, bitmaps, videoDuration);
+            params.mCallback.imagesDecodedCallback(
+                    filePath, isVideo, fullWidth, bitmaps, videoDuration, ratio);
 
             if (decodeTime != -1 && bitmaps != null && bitmaps.get(0) != null) {
                 int sizeInKB = bitmaps.get(0).getByteCount() / ConversionUtils.BYTES_PER_KILOBYTE;
@@ -452,8 +472,8 @@
 
         int frames = highPriority ? 1 : 10;
         int intervalMs = 2000;
-        mWorkerTask = new DecodeVideoTask(
-                this, mContentResolver, params.mUri, params.mSize, frames, intervalMs);
+        mWorkerTask = new DecodeVideoTask(this, mContentResolver, params.mUri, params.mWidth,
+                params.mFullWidth, frames, intervalMs);
         mWorkerTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     }
 
@@ -475,12 +495,12 @@
                 afd = mContentResolver.openAssetFileDescriptor(params.mUri, "r");
             } catch (FileNotFoundException e) {
                 Log.e(TAG, "Unable to obtain FileDescriptor: " + e);
-                closeRequest(params.mUri.getPath(), false, null, null, -1);
+                closeRequestWithError(params.mUri.getPath());
                 return;
             }
             pfd = afd.getParcelFileDescriptor();
             if (pfd == null) {
-                closeRequest(params.mUri.getPath(), false, null, null, -1);
+                closeRequestWithError(params.mUri.getPath());
                 return;
             }
         } finally {
@@ -490,16 +510,17 @@
         // Prepare and send the data over.
         bundle.putString(DecoderService.KEY_FILE_PATH, params.mUri.getPath());
         bundle.putParcelable(DecoderService.KEY_FILE_DESCRIPTOR, pfd);
-        bundle.putInt(DecoderService.KEY_SIZE, params.mSize);
+        bundle.putInt(DecoderService.KEY_WIDTH, params.mWidth);
+        bundle.putBoolean(DecoderService.KEY_FULL_WIDTH, params.mFullWidth);
         try {
             mIRemoteService.decodeImage(bundle, this);
             pfd.close();
         } catch (RemoteException e) {
             Log.e(TAG, "Communications failed (Remote): " + e);
-            closeRequest(params.mUri.getPath(), false, null, null, -1);
+            closeRequestWithError(params.mUri.getPath());
         } catch (IOException e) {
             Log.e(TAG, "Communications failed (IO): " + e);
-            closeRequest(params.mUri.getPath(), false, null, null, -1);
+            closeRequestWithError(params.mUri.getPath());
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerBitmapView.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerBitmapView.java
index 192e6ba..f8028dc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerBitmapView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerBitmapView.java
@@ -18,7 +18,6 @@
 import android.support.v7.content.res.AppCompatResources;
 import android.util.AttributeSet;
 import android.view.View;
-import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityNodeInfo;
 import android.view.animation.Animation;
 import android.view.animation.Animation.AnimationListener;
@@ -67,6 +66,9 @@
     // The image view containing the bitmap.
     private ImageView mIconView;
 
+    // The aspect ratio of the image (>1.0=portrait, <1.0=landscape).
+    private float mRatio = -1;
+
     // For video tiles, this lists the duration of the video. Blank for other types.
     private TextView mVideoDuration;
 
@@ -95,8 +97,8 @@
     // Whether the image has been loaded already.
     private boolean mImageLoaded;
 
-    // The amount to use for the border.
-    private int mBorder;
+    // The selected state of a given picture tile.
+    private boolean mSelectedState;
 
     /**
      * Constructor for inflating from XML.
@@ -109,16 +111,16 @@
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
-        mIconView = (ImageView) findViewById(R.id.bitmap_view);
-        mScrim = (ImageView) findViewById(R.id.scrim);
-        mSelectedView = (ImageView) findViewById(R.id.selected);
-        mUnselectedView = (ImageView) findViewById(R.id.unselected);
+        mIconView = findViewById(R.id.bitmap_view);
+        mScrim = findViewById(R.id.scrim);
+        mSelectedView = findViewById(R.id.selected);
+        mUnselectedView = findViewById(R.id.unselected);
         mSpecialTile = findViewById(R.id.special_tile);
-        mSpecialTileIcon = (ImageView) findViewById(R.id.special_tile_icon);
-        mSpecialTileLabel = (TextView) findViewById(R.id.special_tile_label);
+        mSpecialTileIcon = findViewById(R.id.special_tile_icon);
+        mSpecialTileLabel = findViewById(R.id.special_tile_label);
 
         // Specific UI controls for video support.
-        mVideoDuration = (TextView) findViewById(R.id.video_duration);
+        mVideoDuration = findViewById(R.id.video_duration);
         mPlayButton = findViewById(R.id.play_video);
         mPlayButton.setOnClickListener(this);
     }
@@ -129,9 +131,21 @@
 
         if (mCategoryView == null) return;
 
-        int width = mCategoryView.getImageSize();
-        int height = mCategoryView.getImageSize();
-        setMeasuredDimension(width, height);
+        if (mCategoryView.isInMagnifyingMode()) {
+            int height;
+            if (isPictureTile()) {
+                // Use ratio to determine how tall the image wants to be.
+                height = (int) (mRatio * mCategoryView.getImageWidth());
+            } else {
+                // Special tiles have a fixed height in magnifying mode.
+                height = mCategoryView.getSpecialTileHeight();
+            }
+
+            setMeasuredDimension(mCategoryView.getImageWidth(), height);
+        } else {
+            // Use small thumbnails that are square in size.
+            setMeasuredDimension(mCategoryView.getImageWidth(), mCategoryView.getImageWidth());
+        }
     }
 
     @Override
@@ -163,6 +177,15 @@
     }
 
     @Override
+    public void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        // When views get detached, they become unselected. By reflecting that here, we can make
+        // sure they get re-selected when they scroll out of view and avoid unnecessary updates to
+        // views that are in the correct state already.
+        mSelectedState = false;
+    }
+
+    @Override
     protected boolean toggleSelectionForItem(PickerBitmap item) {
         if (isGalleryTile() || isCameraTile()) return false;
         return super.toggleSelectionForItem(item);
@@ -175,7 +198,7 @@
         }
 
         super.setChecked(checked);
-        updateSelectionState();
+        updateSelectionState(/*animateBorderChanges=*/false);
     }
 
     @Override
@@ -187,60 +210,89 @@
         // being initialized.
         if (mBitmapDetails == null) return;
 
-        boolean selected = selectedItems.contains(mBitmapDetails);
-        boolean checked = super.isChecked();
+        boolean animateBorderChanges = selectedItems.contains(mBitmapDetails) != super.isChecked();
+        updateSelectionState(animateBorderChanges);
 
         super.onSelectionStateChange(selectedItems);
+    }
 
-        updateSelectionState();
-
-        if (!isPictureTile()) return;
-
-        boolean needsResize = selected != checked;
-        int size = selected && !checked ? mCategoryView.getImageSize() - 2 * mBorder
-                                        : mCategoryView.getImageSize();
-        if (needsResize) {
-            float start;
-            float end;
-            float videoDurationOffsetX;
-            float videoDurationOffsetY;
-            if (size != mCategoryView.getImageSize()) {
-                start = 1f;
-                end = 0.8f;
-
-                float pixels = getResources().getDimensionPixelSize(
-                        R.dimen.photo_picker_video_duration_offset);
-                videoDurationOffsetX = -pixels;
-                videoDurationOffsetY = pixels;
-            } else {
-                start = 0.8f;
-                end = 1f;
-
-                videoDurationOffsetX = 0;
-                videoDurationOffsetY = 0;
-            }
-
-            Animation animation = new ScaleAnimation(
-                    start, end, // Values for x axis.
-                    start, end, // Values for y axis.
-                    Animation.RELATIVE_TO_SELF, 0.5f, // Pivot X-axis type and value.
-                    Animation.RELATIVE_TO_SELF, 0.5f); // Pivot Y-axis type and value.
-            animation.setDuration(ANIMATION_DURATION);
-            animation.setFillAfter(true); // Keep the results of the animation.
-            if (sAnimationListenerForTest != null) {
-                animation.setAnimationListener(sAnimationListenerForTest);
-            }
-            mIconView.startAnimation(animation);
-
-            ObjectAnimator videoDurationX = ObjectAnimator.ofFloat(
-                    mVideoDuration, View.TRANSLATION_X, videoDurationOffsetX);
-            ObjectAnimator videoDurationY = ObjectAnimator.ofFloat(
-                    mVideoDuration, View.TRANSLATION_Y, videoDurationOffsetY);
-            AnimatorSet animatorSet = new AnimatorSet();
-            animatorSet.playTogether(videoDurationX, videoDurationY);
-            animatorSet.setDuration(ANIMATION_DURATION);
-            animatorSet.start();
+    private void updateSelectionBorder(boolean animate) {
+        if (!isAttachedToWindow()) {
+            // No need to update something that's not attached to a window. As soon as the view is
+            // re-attached, it will be updated.
+            return;
         }
+
+        // TODO(finnur): Look into whether using #updateView can simplify this logic.
+        boolean selected = mSelectionDelegate.isItemSelected(mBitmapDetails);
+        if (selected == mSelectedState) {
+            // No need to change to a state that is already set.
+            return;
+        }
+
+        mSelectedState = selected;
+
+        float startX;
+        float endX;
+        float startY;
+        float endY;
+        float videoDurationOffsetX;
+        float videoDurationOffsetY;
+
+        float endStateWhenSelectedX = 0.8f; // 20% border around small thumbnails.
+        float endStateWhenSelectedY = 0.8f;
+        if (mCategoryView.isInMagnifyingMode()) {
+            // Ratio above 1.0 is portrait, and less than 1.0 is landscape. With full screen
+            // images, the sides are uneven in length, so the percentage used for the border
+            // should adjust to a difference in length. Left and right border use up 8% of total
+            // width available. Top and bottom border are then calculated to be the same size.
+            float width = mCategoryView.getImageWidth();
+            float percentage = 0.92f;
+            float borderSizePixels = width * (1.0f - percentage);
+            endStateWhenSelectedX = percentage;
+            endStateWhenSelectedY = 1.0f - (borderSizePixels / (width * mRatio));
+        }
+
+        if (selected) {
+            startX = 1f;
+            startY = 1f;
+            endX = endStateWhenSelectedX;
+            endY = endStateWhenSelectedY;
+
+            float pixels = getResources().getDimensionPixelSize(
+                    R.dimen.photo_picker_video_duration_offset);
+            videoDurationOffsetX = -pixels;
+            videoDurationOffsetY = pixels;
+        } else {
+            startX = endStateWhenSelectedX;
+            startY = endStateWhenSelectedY;
+            endX = 1f;
+            endY = 1f;
+
+            videoDurationOffsetX = 0;
+            videoDurationOffsetY = 0;
+        }
+
+        Animation animation = new ScaleAnimation(
+                startX, endX, // Values for x axis.
+                startY, endY, // Values for y axis.
+                Animation.RELATIVE_TO_SELF, 0.5f, // Pivot X-axis type and value.
+                Animation.RELATIVE_TO_SELF, 0.5f); // Pivot Y-axis type and value.
+        animation.setDuration(animate ? ANIMATION_DURATION : 0);
+        animation.setFillAfter(true); // Keep the results of the animation.
+        if (sAnimationListenerForTest != null) {
+            animation.setAnimationListener(sAnimationListenerForTest);
+        }
+        mIconView.startAnimation(animation);
+
+        ObjectAnimator videoDurationX =
+                ObjectAnimator.ofFloat(mVideoDuration, View.TRANSLATION_X, videoDurationOffsetX);
+        ObjectAnimator videoDurationY =
+                ObjectAnimator.ofFloat(mVideoDuration, View.TRANSLATION_Y, videoDurationOffsetY);
+        AnimatorSet animatorSet = new AnimatorSet();
+        animatorSet.playTogether(videoDurationX, videoDurationY);
+        animatorSet.setDuration(animate ? ANIMATION_DURATION : 0);
+        animatorSet.start();
     }
 
     @Override
@@ -265,8 +317,6 @@
         mCategoryView = categoryView;
         mSelectionDelegate = mCategoryView.getSelectionDelegate();
         setSelectionDelegate(mSelectionDelegate);
-
-        mBorder = (int) getResources().getDimension(R.dimen.photo_picker_selected_padding);
     }
 
     /**
@@ -276,29 +326,29 @@
      * @param thumbnails The Bitmaps to use for the thumbnail (or null).
      * @param videoDuration The time-length of the video (human-friendly string).
      * @param placeholder Whether the image given is a placeholder or the actual image.
+     * @ratio The aspect ratio of the image, if it were shown full-width.
      */
     public void initialize(PickerBitmap bitmapDetails, @Nullable List<Bitmap> thumbnails,
-            String videoDuration, boolean placeholder) {
+            String videoDuration, boolean placeholder, float ratio) {
         resetTile();
 
         mBitmapDetails = bitmapDetails;
         setItem(bitmapDetails);
         if (isCameraTile() || isGalleryTile()) {
-            initializeSpecialTile(mBitmapDetails);
+            initializeSpecialTile();
             mImageLoaded = true;
         } else {
-            setThumbnailBitmap(thumbnails, videoDuration);
+            setThumbnailBitmap(thumbnails, videoDuration, ratio);
             mImageLoaded = !placeholder;
         }
 
-        updateSelectionState();
+        updateSelectionState(/*animateBorderChanges=*/false);
     }
 
     /**
      * Initialization for the special tiles (camera/gallery icon).
-     * @param bitmapDetails The details about the bitmap represented by this PickerBitmapView.
      */
-    public void initializeSpecialTile(PickerBitmap bitmapDetails) {
+    public void initializeSpecialTile() {
         int labelStringId = 0;
         Drawable image = null;
         Resources resources = mContext.getResources();
@@ -333,9 +383,10 @@
      * the image has already been selected.
      * @param thumbnails The Bitmaps to use for the icon ImageView.
      * @param videoDuration The time-length of the video (human-friendly string).
+     * @param ratio The aspect ratio of the image, if it were shown using the full screen width.
      * @return True if no image was loaded before (e.g. not even a low-res image).
      */
-    public boolean setThumbnailBitmap(List<Bitmap> thumbnails, String videoDuration) {
+    public boolean setThumbnailBitmap(List<Bitmap> thumbnails, String videoDuration, float ratio) {
         assert thumbnails == null || thumbnails.size() > 0;
         if (videoDuration == null) {
             mIconView.setImageBitmap(thumbnails == null ? null : thumbnails.get(0));
@@ -351,29 +402,17 @@
             animationDrawable.start();
         }
 
-        // If the tile has been selected before the bitmap has loaded, make sure it shows up with
-        // a selection border on load.
-        if (super.isChecked()) {
-            mIconView.getLayoutParams().height = imageSizeWithBorders();
-            mIconView.getLayoutParams().width = imageSizeWithBorders();
-            addPaddingToParent(mIconView, mBorder);
-        } else {
-            mIconView.getLayoutParams().height = mCategoryView.getImageSize();
-            mIconView.getLayoutParams().width = mCategoryView.getImageSize();
+        if (thumbnails != null && thumbnails.size() > 0) {
+            mRatio = ratio;
         }
 
         boolean noImageWasLoaded = !mImageLoaded;
         mImageLoaded = true;
-        updateSelectionState();
+        updateSelectionState(/*animateBorderChanges=*/false);
 
         return noImageWasLoaded;
     }
 
-    /** Returns the size of the image plus the pre-determined border on each side. */
-    private int imageSizeWithBorders() {
-        return mCategoryView.getImageSize() - 2 * mBorder;
-    }
-
     /**
      * Initiates fading in of the thumbnail. Note, this should not be called if a grainy version of
      * the thumbnail was loaded from cache. Otherwise a flash will appear.
@@ -388,6 +427,7 @@
      * re-used.
      */
     private void resetTile() {
+        mBitmapDetails = null;
         mIconView.setImageBitmap(null);
         mVideoDuration.setText("");
         mUnselectedView.setVisibility(View.GONE);
@@ -396,25 +436,15 @@
         mSpecialTile.setVisibility(View.GONE);
         mSpecialTileIcon.setVisibility(View.GONE);
         mSpecialTileLabel.setVisibility(View.GONE);
-    }
-
-    /**
-     * Adds padding to the parent of the |view|.
-     * @param view The child view of the view to receive the padding.
-     * @param padding The amount of padding to use (in pixels).
-     */
-    private static void addPaddingToParent(View view, int padding) {
-        ViewGroup layout = (ViewGroup) view.getParent();
-        layout.setPadding(padding, padding, padding, padding);
-        layout.requestLayout();
+        mSelectedState = false;
+        setEnabled(true);
     }
 
     /**
      * Updates the selection controls for this view.
      */
-    private void updateSelectionState() {
+    private void updateSelectionState(boolean animateBorderChanges) {
         boolean special = !isPictureTile();
-        boolean checked = super.isChecked();
         boolean anySelection =
                 mSelectionDelegate != null && mSelectionDelegate.isSelectionEnabled();
         Resources resources = mContext.getResources();
@@ -432,14 +462,18 @@
 
         // The visibility of the unselected toggle for multi-selection mode is a little more complex
         // because we don't want to show it when nothing is selected and also not on a blank canvas.
-        mSelectedView.setVisibility(!special && checked ? View.VISIBLE : View.GONE);
-        boolean showUnselectedToggle = !special && !checked && anySelection && mImageLoaded
+        boolean isSelected = mSelectionDelegate.isItemSelected(mBitmapDetails);
+        mSelectedView.setVisibility(!special && isSelected ? View.VISIBLE : View.GONE);
+        boolean showUnselectedToggle = !special && !isSelected && anySelection && mImageLoaded
                 && mCategoryView.isMultiSelectAllowed();
         mUnselectedView.setVisibility(showUnselectedToggle ? View.VISIBLE : View.GONE);
         mScrim.setVisibility(showUnselectedToggle ? View.VISIBLE : View.GONE);
         mPlayButton.setVisibility(
                 mImageLoaded && mBitmapDetails.type() == PickerBitmap.TileTypes.VIDEO ? View.VISIBLE
                                                                                       : View.GONE);
+        if (!special) {
+            updateSelectionBorder(animateBorderChanges);
+        }
     }
 
     private boolean isGalleryTile() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerBitmapViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerBitmapViewHolder.java
index aecbf99..979b2c4c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerBitmapViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerBitmapViewHolder.java
@@ -43,8 +43,8 @@
     // DecoderServiceHost.ImageDecodedCallback
 
     @Override
-    public void imagesDecodedCallback(
-            String filePath, boolean isVideo, List<Bitmap> bitmaps, String videoDuration) {
+    public void imagesDecodedCallback(String filePath, boolean isVideo, boolean fullWidth,
+            List<Bitmap> bitmaps, String videoDuration, float ratio) {
         if (bitmaps == null || bitmaps.size() == 0) return;
 
         if (!isVideo) {
@@ -52,20 +52,27 @@
             if (bitmap == null || bitmap.getWidth() == 0 || bitmap.getHeight() == 0) return;
         }
 
-        PickerCategoryView.Thumbnail cachedThumbnail =
-                mCategoryView.getHighResThumbnails().get(filePath);
+        PickerCategoryView.Thumbnail cachedThumbnail = fullWidth
+                ? mCategoryView.getFullScreenBitmaps().get(filePath)
+                : mCategoryView.getHighResThumbnails().get(filePath);
         if (cachedThumbnail == null
                 || (cachedThumbnail.bitmaps != null
                         && cachedThumbnail.bitmaps.size() < bitmaps.size())) {
-            mCategoryView.getHighResThumbnails().put(
-                    filePath, new PickerCategoryView.Thumbnail(bitmaps, videoDuration));
+            if (fullWidth) {
+                mCategoryView.getFullScreenBitmaps().put(filePath,
+                        new PickerCategoryView.Thumbnail(bitmaps, videoDuration, fullWidth, ratio));
+            } else {
+                mCategoryView.getHighResThumbnails().put(filePath,
+                        new PickerCategoryView.Thumbnail(bitmaps, videoDuration, fullWidth, ratio));
+            }
         }
 
         if (mCategoryView.getLowResThumbnails().get(filePath) == null) {
             Resources resources = mItemView.getContext().getResources();
             new BitmapScalerTask(mCategoryView.getLowResThumbnails(), bitmaps.get(0), filePath,
                     videoDuration,
-                    resources.getDimensionPixelSize(R.dimen.photo_picker_grainy_thumbnail_size))
+                    resources.getDimensionPixelSize(R.dimen.photo_picker_grainy_thumbnail_size),
+                    ratio)
                     .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
         }
 
@@ -73,7 +80,7 @@
             return;
         }
 
-        if (mItemView.setThumbnailBitmap(bitmaps, videoDuration)) {
+        if (mItemView.setThumbnailBitmap(bitmaps, videoDuration, ratio)) {
             mItemView.fadeInThumbnail();
         }
     }
@@ -93,37 +100,48 @@
 
         if (mBitmapDetails.type() == PickerBitmap.TileTypes.CAMERA
                 || mBitmapDetails.type() == PickerBitmap.TileTypes.GALLERY) {
-            mItemView.initialize(mBitmapDetails, null, null, false);
+            mItemView.initialize(mBitmapDetails, null, null, false, -1);
             return PickerAdapter.DecodeActions.NO_ACTION;
         }
 
         String filePath = mBitmapDetails.getUri().getPath();
-        PickerCategoryView.Thumbnail original = mCategoryView.getHighResThumbnails().get(filePath);
+        PickerCategoryView.Thumbnail original = mCategoryView.isInMagnifyingMode()
+                ? mCategoryView.getFullScreenBitmaps().get(filePath)
+                : mCategoryView.getHighResThumbnails().get(filePath);
         if (original != null) {
-            mItemView.initialize(mBitmapDetails, original.bitmaps, original.videoDuration, false);
+            mItemView.initialize(mBitmapDetails, original.bitmaps, original.videoDuration, false,
+                    original.ratio);
             return PickerAdapter.DecodeActions.FROM_CACHE;
         }
 
-        int size = mCategoryView.getImageSize();
-        PickerCategoryView.Thumbnail payload = mCategoryView.getLowResThumbnails().get(filePath);
+        int width = mCategoryView.getImageWidth();
+        PickerCategoryView.Thumbnail payload = null;
+        if (mCategoryView.isInMagnifyingMode()) {
+            payload = mCategoryView.getHighResThumbnails().get(filePath);
+        }
+        if (payload == null) {
+            payload = mCategoryView.getLowResThumbnails().get(filePath);
+        }
+
         if (payload != null) {
             Bitmap placeholder = payload.bitmaps.get(0);
             // For performance stats see http://crbug.com/719919.
             long begin = SystemClock.elapsedRealtime();
-            placeholder = BitmapUtils.scale(placeholder, size, false);
+            placeholder = BitmapUtils.scale(placeholder, width, false);
             long scaleTime = SystemClock.elapsedRealtime() - begin;
             RecordHistogram.recordTimesHistogram(
                     "Android.PhotoPicker.UpscaleLowResBitmap", scaleTime);
             List<Bitmap> bitmaps = new ArrayList<>(1);
             bitmaps.add(placeholder);
 
-            mItemView.initialize(mBitmapDetails, bitmaps, payload.videoDuration, true);
+            mItemView.initialize(
+                    mBitmapDetails, bitmaps, payload.videoDuration, true, payload.ratio);
         } else {
-            mItemView.initialize(mBitmapDetails, null, null, true);
+            mItemView.initialize(mBitmapDetails, null, null, true, -1);
         }
 
-        mCategoryView.getDecoderServiceHost().decodeImage(
-                mBitmapDetails.getUri(), mBitmapDetails.type(), size, this);
+        mCategoryView.getDecoderServiceHost().decodeImage(mBitmapDetails.getUri(),
+                mBitmapDetails.type(), width, mCategoryView.isInMagnifyingMode(), this);
         return PickerAdapter.DecodeActions.DECODE;
     }
 
@@ -134,8 +152,9 @@
     public String getFilePath() {
         if (mBitmapDetails == null
                 || (mBitmapDetails.type() != PickerBitmap.TileTypes.PICTURE
-                        && mBitmapDetails.type() != PickerBitmap.TileTypes.VIDEO))
+                        && mBitmapDetails.type() != PickerBitmap.TileTypes.VIDEO)) {
             return null;
+        }
         return mBitmapDetails.getUri().getPath();
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerCategoryView.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerCategoryView.java
index c2834eb..086b7f73 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerCategoryView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/PickerCategoryView.java
@@ -22,6 +22,7 @@
 import android.view.ViewGroup;
 import android.widget.Button;
 import android.widget.FrameLayout;
+import android.widget.ImageView;
 import android.widget.MediaController;
 import android.widget.RelativeLayout;
 import android.widget.VideoView;
@@ -33,6 +34,7 @@
 import org.chromium.base.task.AsyncTask;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.util.ConversionUtils;
 import org.chromium.chrome.browser.widget.selection.SelectableListLayout;
 import org.chromium.chrome.browser.widget.selection.SelectionDelegate;
@@ -65,11 +67,19 @@
      */
     public static class Thumbnail {
         public List<Bitmap> bitmaps;
+        public Boolean fullWidth;
         public String videoDuration;
 
-        Thumbnail(List<Bitmap> bitmaps, String videoDuration) {
+        // The calculated ratio of the originals for the bitmaps above, were they to be shown
+        // un-cropped. NOTE: The |bitmaps| above may already have been cropped and as such might
+        // have a different ratio.
+        public float ratio;
+
+        Thumbnail(List<Bitmap> bitmaps, String videoDuration, Boolean fullWidth, float ratio) {
             this.bitmaps = bitmaps;
             this.videoDuration = videoDuration;
+            this.fullWidth = fullWidth;
+            this.ratio = ratio;
         }
     }
 
@@ -117,12 +127,24 @@
     // A high-resolution cache for thumbnails, lazily created.
     private DiscardableReference<LruCache<String, Thumbnail>> mHighResThumbnails;
 
+    // A cache for full-screen versions of images, lazily created.
+    private DiscardableReference<LruCache<String, Thumbnail>> mFullScreenBitmaps;
+
     // The size of the low-res cache.
     private int mCacheSizeLarge;
 
     // The size of the high-res cache.
     private int mCacheSizeSmall;
 
+    // The size of the full-screen cache.
+    private int mCacheSizeFullScreen;
+
+    // Whether we are in magnifying mode (one image per column).
+    private boolean mMagnifyingMode;
+
+    // Whether we are in the middle of animating between magnifying modes.
+    private boolean mZoomSwitchingInEffect;
+
     /**
      * The number of columns to show. Note: mColumns and mPadding (see below) should both be even
      * numbers or both odd, not a mix (the column padding will not be of uniform thickness if they
@@ -133,8 +155,14 @@
     // The padding between columns. See also comment for mColumns.
     private int mPadding;
 
-    // The size of the bitmaps (equal length for width and height).
-    private int mImageSize;
+    // The width of the bitmaps.
+    private int mImageWidth;
+
+    // The height of the bitmaps.
+    private int mImageHeight;
+
+    // The height of the special tiles.
+    private int mSpecialTileHeight;
 
     // A worker task for asynchronously enumerating files off the main thread.
     private FileEnumWorkerTask mWorkerTask;
@@ -191,6 +219,12 @@
         doneButton.setOnClickListener(this);
         mVideoView = findViewById(R.id.video_player);
 
+        if (ChromeFeatureList.isEnabled(ChromeFeatureList.PHOTO_PICKER_ZOOM)) {
+            ImageView zoom = findViewById(R.id.zoom);
+            zoom.setVisibility(View.VISIBLE);
+            zoom.setOnClickListener(this);
+        }
+
         calculateGridMetrics();
 
         mLayoutManager = new GridLayoutManager(mActivity, mColumns);
@@ -201,7 +235,13 @@
         mRecyclerView.setRecyclerListener(this);
 
         final long maxMemory = ConversionUtils.bytesToKilobytes(Runtime.getRuntime().maxMemory());
-        mCacheSizeLarge = (int) (maxMemory / 2); // 1/2 of the available memory.
+        if (ChromeFeatureList.isEnabled(ChromeFeatureList.PHOTO_PICKER_ZOOM)) {
+            mCacheSizeFullScreen = (int) (maxMemory / 4); // 1/4 of the available memory.
+            mCacheSizeLarge = (int) (maxMemory / 4); // 1/4 of the available memory.
+        } else {
+            mCacheSizeFullScreen = 0;
+            mCacheSizeLarge = (int) (maxMemory / 2); // 1/2 of the available memory.
+        }
         mCacheSizeSmall = (int) (maxMemory / 8); // 1/8th of the available memory.
     }
 
@@ -219,7 +259,10 @@
         // enumerated (when mPickerBitmaps is null, causing: https://crbug.com/947657). There's no
         // need to call notifyDataSetChanged in that case because it will be called once the photo
         // list becomes ready.
-        if (mPickerBitmaps != null) mPickerAdapter.notifyDataSetChanged();
+        if (mPickerBitmaps != null) {
+            mPickerAdapter.notifyDataSetChanged();
+            mRecyclerView.requestLayout();
+        }
     }
 
     /**
@@ -347,6 +390,8 @@
         int id = view.getId();
         if (id == R.id.done) {
             notifyPhotosSelected();
+        } else if (id == R.id.zoom) {
+            flipZoomMode();
         } else if (id == R.id.close) {
             stopVideo();
         } else {
@@ -364,10 +409,39 @@
         }
     }
 
+    private void flipZoomMode() {
+        mMagnifyingMode = !mMagnifyingMode;
+
+        ImageView zoom = findViewById(R.id.zoom);
+        if (mMagnifyingMode) {
+            zoom.setImageResource(R.drawable.zoom_out);
+        } else {
+            zoom.setImageResource(R.drawable.zoom_in);
+        }
+
+        calculateGridMetrics();
+
+        mLayoutManager.setSpanCount(mColumns);
+        mPickerAdapter.notifyDataSetChanged();
+        mRecyclerView.requestLayout();
+    }
+
     // Simple accessors:
 
-    public int getImageSize() {
-        return mImageSize;
+    public int getImageWidth() {
+        return mImageWidth;
+    }
+
+    public int getImageHeight() {
+        return mImageHeight;
+    }
+
+    public int getSpecialTileHeight() {
+        return mSpecialTileHeight;
+    }
+
+    public boolean isInMagnifyingMode() {
+        return mMagnifyingMode;
     }
 
     public SelectionDelegate<PickerBitmap> getSelectionDelegate() {
@@ -398,6 +472,14 @@
         return mHighResThumbnails.get();
     }
 
+    public LruCache<String, Thumbnail> getFullScreenBitmaps() {
+        if (mFullScreenBitmaps == null || mFullScreenBitmaps.get() == null) {
+            mFullScreenBitmaps = mActivity.getReferencePool().put(
+                    new LruCache<String, Thumbnail>(mCacheSizeFullScreen));
+        }
+        return mFullScreenBitmaps.get();
+    }
+
     public boolean isMultiSelectAllowed() {
         return mMultiSelectionAllowed;
     }
@@ -426,12 +508,18 @@
         int width = displayMetrics.widthPixels;
         int minSize =
                 mActivity.getResources().getDimensionPixelSize(R.dimen.photo_picker_tile_min_size);
-        mPadding = mActivity.getResources().getDimensionPixelSize(R.dimen.photo_picker_tile_gap);
-        mColumns = Math.max(1, (width - mPadding) / (minSize + mPadding));
-        mImageSize = (width - mPadding * (mColumns + 1)) / (mColumns);
+        mPadding = mMagnifyingMode
+                ? 0
+                : mActivity.getResources().getDimensionPixelSize(R.dimen.photo_picker_tile_gap);
+        mColumns = mMagnifyingMode ? 1 : Math.max(1, (width - mPadding) / (minSize + mPadding));
+        mImageWidth = (width - mPadding * (mColumns + 1)) / (mColumns);
+        mImageHeight = mMagnifyingMode
+                ? displayMetrics.heightPixels - findViewById(R.id.action_bar_bg).getHeight()
+                : mImageWidth;
+        if (!mMagnifyingMode) mSpecialTileHeight = mImageWidth;
 
         // Make sure columns and padding are either both even or both odd.
-        if (((mColumns % 2) == 0) != ((mPadding % 2) == 0)) {
+        if (!mMagnifyingMode && ((mColumns % 2) == 0) != ((mPadding % 2) == 0)) {
             mPadding++;
         }
     }
@@ -495,6 +583,11 @@
         @Override
         public void getItemOffsets(
                 Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
+            if (mMagnifyingMode) {
+                outRect.set(0, 0, 0, mSpacing);
+                return;
+            }
+
             int left = 0, right = 0, top = 0, bottom = 0;
             int position = parent.getChildAdapterPosition(view);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/preferences/OWNERS
index de5743e..e53de1b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/OWNERS
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/OWNERS
@@ -1,10 +1 @@
-# Chrome settings:
-twellington@chromium.org
-bsazonov@chromium.org
-chouinard@chromium.org
-
-# Site settings:
-finnur@chromium.org
-hkamila@chromium.org
-
-# COMPONENT: UI>Browser>Mobile>Settings
+file://chrome/browser/preferences/OWNERS
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java b/chrome/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java
index 9fa495a..5bbbc04 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java
@@ -13,8 +13,8 @@
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeVersionInfo;
 import org.chromium.chrome.browser.omaha.VersionNumber;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.SearchEnginePreference;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.SearchEnginePreference;
 import org.chromium.chrome.browser.snackbar.Snackbar;
 import org.chromium.chrome.browser.snackbar.SnackbarManager;
 import org.chromium.chrome.browser.snackbar.SnackbarManager.SnackbarController;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/AccessibilityPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/AccessibilityPreferences.java
similarity index 94%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/AccessibilityPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/AccessibilityPreferences.java
index 91faeafd..7ab3e4d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/AccessibilityPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/AccessibilityPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Intent;
 import android.os.Bundle;
@@ -14,6 +14,10 @@
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.accessibility.FontSizePrefs;
 import org.chromium.chrome.browser.accessibility.FontSizePrefs.FontSizePrefsObserver;
+import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
+import org.chromium.chrome.browser.preferences.Pref;
+import org.chromium.chrome.browser.preferences.PrefServiceBridge;
+import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.browser.util.AccessibilityUtil;
 
 import java.text.NumberFormat;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ButtonPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/ButtonPreference.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ButtonPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/ButtonPreference.java
index 9fa5685c..409aa48 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ButtonPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/ButtonPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Context;
 import android.support.v7.preference.Preference;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBaseCheckBoxPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeBaseCheckBoxPreference.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBaseCheckBoxPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeBaseCheckBoxPreference.java
index fe47a93..98d7c30 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBaseCheckBoxPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeBaseCheckBoxPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Context;
 import android.support.v7.preference.CheckBoxPreference;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBasePreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeBasePreference.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBasePreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeBasePreference.java
index 186c239..dc00f388 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBasePreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeBasePreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Context;
 import android.content.res.ColorStateList;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeImageViewPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeImageViewPreference.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeImageViewPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeImageViewPreference.java
index 6907f84..a3b79e8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeImageViewPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeImageViewPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Context;
 import android.graphics.Color;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeSwitchPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeSwitchPreference.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeSwitchPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeSwitchPreference.java
index 302ecf45..3b288f5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeSwitchPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/ChromeSwitchPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Context;
 import android.support.v7.preference.PreferenceViewHolder;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ClearBrowsingDataCheckBoxPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/ClearBrowsingDataCheckBoxPreference.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ClearBrowsingDataCheckBoxPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/ClearBrowsingDataCheckBoxPreference.java
index d53be06d..1209f8d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ClearBrowsingDataCheckBoxPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/ClearBrowsingDataCheckBoxPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Context;
 import android.support.v4.view.ViewCompat;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ExpandablePreferenceGroup.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/ExpandablePreferenceGroup.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ExpandablePreferenceGroup.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/ExpandablePreferenceGroup.java
index db7c5f1e..bb179137 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ExpandablePreferenceGroup.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/ExpandablePreferenceGroup.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Context;
 import android.graphics.drawable.Drawable;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/HomepageEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/HomepageEditor.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/HomepageEditor.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/HomepageEditor.java
index b4c9578..7c6025d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/HomepageEditor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/HomepageEditor.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.os.Bundle;
 import android.support.v4.app.Fragment;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/HomepagePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/HomepagePreferences.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/HomepagePreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/HomepagePreferences.java
index 8b5cad7..13558e06 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/HomepagePreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/HomepagePreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.os.Bundle;
 import android.support.v7.preference.Preference;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/HyperlinkPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/HyperlinkPreference.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/HyperlinkPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/HyperlinkPreference.java
index bbe42f7..9ef6ba1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/HyperlinkPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/HyperlinkPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Context;
 import android.content.res.TypedArray;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/LearnMorePreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/LearnMorePreference.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/LearnMorePreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/LearnMorePreference.java
index 1865b675..3ecd135 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/LearnMorePreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/LearnMorePreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.app.Activity;
 import android.content.Context;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/LocationSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/LocationSettings.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/LocationSettings.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/LocationSettings.java
index f45808a..94c6a65 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/LocationSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/LocationSettings.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.Manifest;
 
@@ -13,7 +13,7 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.AppHooks;
-import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge;
+import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
 import org.chromium.components.location.LocationSettingsDialogContext;
 import org.chromium.components.location.LocationSettingsDialogOutcome;
 import org.chromium.components.location.LocationUtils;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainPreferences.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/MainPreferences.java
index 5612798..60750422 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Intent;
 import android.os.Build;
@@ -24,12 +24,12 @@
 import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchConfiguration;
 import org.chromium.chrome.browser.partnercustomizations.HomepageManager;
 import org.chromium.chrome.browser.password_manager.ManagePasswordsReferrer;
-import org.chromium.chrome.browser.preferences.autofill_assistant.AutofillAssistantPreferences;
-import org.chromium.chrome.browser.preferences.datareduction.DataReductionPreferenceFragment;
-import org.chromium.chrome.browser.preferences.developer.DeveloperPreferences;
-import org.chromium.chrome.browser.preferences.sync.SignInPreference;
-import org.chromium.chrome.browser.preferences.sync.SyncPreferenceUtils;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
+import org.chromium.chrome.browser.settings.autofill_assistant.AutofillAssistantPreferences;
+import org.chromium.chrome.browser.settings.datareduction.DataReductionPreferenceFragment;
+import org.chromium.chrome.browser.settings.developer.DeveloperPreferences;
+import org.chromium.chrome.browser.settings.sync.SignInPreference;
+import org.chromium.chrome.browser.settings.sync.SyncPreferenceUtils;
 import org.chromium.chrome.browser.signin.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.SigninManager;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/ManagedPreferenceDelegate.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegate.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/ManagedPreferenceDelegate.java
index e6546a9..eb8db67 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/ManagedPreferenceDelegate.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.support.v7.preference.Preference;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferencesUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/ManagedPreferencesUtils.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferencesUtils.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/ManagedPreferencesUtils.java
index deee475..f128d18 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferencesUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/ManagedPreferencesUtils.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Context;
 import android.graphics.drawable.Drawable;
@@ -16,6 +16,8 @@
 import androidx.annotation.StringRes;
 
 import org.chromium.chrome.R;
+import org.chromium.chrome.browser.preferences.Pref;
+import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.util.ViewUtils;
 import org.chromium.ui.widget.Toast;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/NotificationsPreferences.java
similarity index 89%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/NotificationsPreferences.java
index 641fef0..e22c1c8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/NotificationsPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.os.Build;
 import android.os.Bundle;
@@ -15,10 +15,10 @@
 import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchConfiguration;
 import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchPrefs;
-import org.chromium.chrome.browser.preferences.website.ContentSettingsResources;
-import org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences;
-import org.chromium.chrome.browser.preferences.website.SiteSettingsCategory;
-import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge;
+import org.chromium.chrome.browser.settings.website.ContentSettingsResources;
+import org.chromium.chrome.browser.settings.website.SingleCategoryPreferences;
+import org.chromium.chrome.browser.settings.website.SiteSettingsCategory;
+import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
 
 /**
  * Settings fragment that allows the user to configure notifications. It contains general
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/settings/OWNERS
new file mode 100644
index 0000000..de5743e
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/OWNERS
@@ -0,0 +1,10 @@
+# Chrome settings:
+twellington@chromium.org
+bsazonov@chromium.org
+chouinard@chromium.org
+
+# Site settings:
+finnur@chromium.org
+hkamila@chromium.org
+
+# COMPONENT: UI>Browser>Mobile>Settings
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferenceUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/PreferenceUtils.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferenceUtils.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/PreferenceUtils.java
index bf6419c..476dc0a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferenceUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/PreferenceUtils.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.app.Activity;
 import android.content.Context;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/Preferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/Preferences.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/Preferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/Preferences.java
index 9292bbc..75d321bc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/Preferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/Preferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.Manifest;
 import android.annotation.SuppressLint;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/PreferencesLauncher.java
similarity index 93%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/PreferencesLauncher.java
index 576d54e..266a3ac 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/PreferencesLauncher.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.app.Activity;
 import android.content.Context;
@@ -22,11 +22,13 @@
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.password_manager.GooglePasswordManagerUIProvider;
 import org.chromium.chrome.browser.password_manager.ManagePasswordsReferrer;
-import org.chromium.chrome.browser.preferences.autofill.AutofillPaymentMethodsFragment;
-import org.chromium.chrome.browser.preferences.autofill.AutofillProfilesFragment;
-import org.chromium.chrome.browser.preferences.password.SavePasswordsPreferences;
-import org.chromium.chrome.browser.preferences.website.SettingsNavigationSource;
-import org.chromium.chrome.browser.preferences.website.SingleWebsitePreferences;
+import org.chromium.chrome.browser.preferences.Pref;
+import org.chromium.chrome.browser.preferences.PrefServiceBridge;
+import org.chromium.chrome.browser.settings.autofill.AutofillPaymentMethodsFragment;
+import org.chromium.chrome.browser.settings.autofill.AutofillProfilesFragment;
+import org.chromium.chrome.browser.settings.password.SavePasswordsPreferences;
+import org.chromium.chrome.browser.settings.website.SettingsNavigationSource;
+import org.chromium.chrome.browser.settings.website.SingleWebsitePreferences;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
 import org.chromium.chrome.browser.util.IntentUtils;
 import org.chromium.components.signin.ChromeSigninController;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/SearchEngineAdapter.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/SearchEngineAdapter.java
index 1fae59a..13a05975 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/SearchEngineAdapter.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Context;
 import android.content.res.Resources;
@@ -31,11 +31,11 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.locale.LocaleManager;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
-import org.chromium.chrome.browser.preferences.website.PermissionInfo;
-import org.chromium.chrome.browser.preferences.website.SingleWebsitePreferences;
-import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
+import org.chromium.chrome.browser.settings.website.PermissionInfo;
+import org.chromium.chrome.browser.settings.website.SingleWebsitePreferences;
+import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
 import org.chromium.components.location.LocationUtils;
 import org.chromium.components.search_engines.TemplateUrl;
 import org.chromium.components.search_engines.TemplateUrlService;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEnginePreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/SearchEnginePreference.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEnginePreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/SearchEnginePreference.java
index dfe4d03..eb235774 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEnginePreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/SearchEnginePreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.os.Bundle;
 import android.support.v4.app.ListFragment;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/SearchUtils.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchUtils.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/SearchUtils.java
index f0c9dc7..c8e0b89 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/SearchUtils.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.app.Activity;
 import android.support.v7.widget.SearchView;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SeekBarPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/SeekBarPreference.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/SeekBarPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/SeekBarPreference.java
index 454ba36..5ad4b76e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SeekBarPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/SeekBarPreference.java
@@ -5,7 +5,7 @@
 // Based on frameworks/base/core/java/android/preference/SeekBarPreference.java,
 // extended to support floating-point min/max/step and a summary label.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Context;
 import android.support.v7.preference.Preference;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SpinnerPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/SpinnerPreference.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/SpinnerPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/SpinnerPreference.java
index 88a11f619..34c8068 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SpinnerPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/SpinnerPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Context;
 import android.content.res.TypedArray;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextAndButtonPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/TextAndButtonPreference.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/TextAndButtonPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/TextAndButtonPreference.java
index 87c3a5f3..b59048b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextAndButtonPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/TextAndButtonPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Context;
 import android.support.v7.preference.Preference;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextMessagePreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/TextMessagePreference.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/TextMessagePreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/TextMessagePreference.java
index 2ed158c2..88f2ec42 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextMessagePreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/TextMessagePreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Context;
 import android.support.v7.preference.PreferenceViewHolder;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextScalePreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/TextScalePreference.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/TextScalePreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/TextScalePreference.java
index b403e87..67027b0b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextScalePreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/TextScalePreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.content.Context;
 import android.support.v7.preference.PreferenceViewHolder;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/about/AboutChromePreferenceOSVersion.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/about/AboutChromePreferenceOSVersion.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/about/AboutChromePreferenceOSVersion.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/about/AboutChromePreferenceOSVersion.java
index d6b3d3ad..eb30396 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/about/AboutChromePreferenceOSVersion.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/about/AboutChromePreferenceOSVersion.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.about;
+package org.chromium.chrome.browser.settings.about;
 
 import android.content.Context;
 import android.support.v7.preference.Preference;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/about/AboutChromePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/about/AboutChromePreferences.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/about/AboutChromePreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/about/AboutChromePreferences.java
index bee49f6..1b4f30b0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/about/AboutChromePreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/about/AboutChromePreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.about;
+package org.chromium.chrome.browser.settings.about;
 
 import android.content.Context;
 import android.content.pm.PackageInfo;
@@ -14,8 +14,8 @@
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeVersionInfo;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
-import org.chromium.chrome.browser.preferences.developer.DeveloperPreferences;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
+import org.chromium.chrome.browser.settings.developer.DeveloperPreferences;
 import org.chromium.ui.widget.Toast;
 
 import java.util.Calendar;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/about/AboutSettingsBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/about/AboutSettingsBridge.java
similarity index 93%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/about/AboutSettingsBridge.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/about/AboutSettingsBridge.java
index 2d48633..ff5a78b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/about/AboutSettingsBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/about/AboutSettingsBridge.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.about;
+package org.chromium.chrome.browser.settings.about;
 
 import org.chromium.base.annotations.NativeMethods;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/about/LegalInformationPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/about/LegalInformationPreferences.java
similarity index 85%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/about/LegalInformationPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/about/LegalInformationPreferences.java
index 07fc349..f0cbb72 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/about/LegalInformationPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/about/LegalInformationPreferences.java
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.about;
+package org.chromium.chrome.browser.settings.about;
 
 import android.os.Bundle;
 import android.support.v7.preference.PreferenceFragmentCompat;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
 
 /**
  * Fragment to display legal information about Chrome.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AndroidPaymentAppPreference.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AndroidPaymentAppPreference.java
index d2c0916..f5c9f58 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AndroidPaymentAppPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill;
+package org.chromium.chrome.browser.settings.autofill;
 
 import android.content.Context;
 import android.support.v7.preference.Preference;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppsFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AndroidPaymentAppsFragment.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppsFragment.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AndroidPaymentAppsFragment.java
index e369151..b0589b4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppsFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AndroidPaymentAppsFragment.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill;
+package org.chromium.chrome.browser.settings.autofill;
 
 import android.content.Context;
 import android.graphics.Bitmap;
@@ -19,7 +19,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.payments.AndroidPaymentAppFactory;
 import org.chromium.chrome.browser.payments.ServiceWorkerPaymentAppBridge;
-import org.chromium.chrome.browser.preferences.TextMessagePreference;
+import org.chromium.chrome.browser.settings.TextMessagePreference;
 
 import java.util.Map;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillCreditCardEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillCreditCardEditor.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillCreditCardEditor.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillCreditCardEditor.java
index 95f97535..6b83c357 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillCreditCardEditor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillCreditCardEditor.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill;
+package org.chromium.chrome.browser.settings.autofill;
 
 import android.os.Build;
 import android.os.Bundle;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillEditorBase.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillEditorBase.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillEditorBase.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillEditorBase.java
index fd21b452..f52b2e1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillEditorBase.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillEditorBase.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill;
+package org.chromium.chrome.browser.settings.autofill;
 
 import android.annotation.SuppressLint;
 import android.content.Context;
@@ -26,8 +26,8 @@
 import android.widget.Spinner;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.MainPreferences;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
+import org.chromium.chrome.browser.settings.MainPreferences;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
 import org.chromium.chrome.browser.ui.widget.FadingEdgeScrollView;
 import org.chromium.chrome.browser.widget.prefeditor.EditorDialog;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillLocalCardEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillLocalCardEditor.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillLocalCardEditor.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillLocalCardEditor.java
index ca20aed..5cdb1dc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillLocalCardEditor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillLocalCardEditor.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill;
+package org.chromium.chrome.browser.settings.autofill;
 
 import android.os.Bundle;
 import android.text.Editable;
@@ -25,7 +25,7 @@
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
 import org.chromium.chrome.browser.payments.SettingsAutofillAndPaymentsObserver;
-import org.chromium.chrome.browser.preferences.MainPreferences;
+import org.chromium.chrome.browser.settings.MainPreferences;
 import org.chromium.chrome.browser.widget.ChromeTextInputLayout;
 
 import java.text.SimpleDateFormat;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillPaymentMethodsFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillPaymentMethodsFragment.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillPaymentMethodsFragment.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillPaymentMethodsFragment.java
index 62f95bb..a5c2fb3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillPaymentMethodsFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillPaymentMethodsFragment.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill;
+package org.chromium.chrome.browser.settings.autofill;
 
 import android.content.Context;
 import android.graphics.PorterDuff;
@@ -20,9 +20,9 @@
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
 import org.chromium.chrome.browser.payments.AndroidPaymentAppFactory;
 import org.chromium.chrome.browser.payments.ServiceWorkerPaymentAppBridge;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
-import org.chromium.chrome.browser.preferences.MainPreferences;
-import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.MainPreferences;
+import org.chromium.chrome.browser.settings.ManagedPreferenceDelegate;
 
 /**
  * Autofill credit cards fragment, which allows the user to edit credit cards and control
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfileBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillProfileBridge.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfileBridge.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillProfileBridge.java
index 6431047..fb5a6c6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfileBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillProfileBridge.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill;
+package org.chromium.chrome.browser.settings.autofill;
 
 import android.util.Pair;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfileEditorPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillProfileEditorPreference.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfileEditorPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillProfileEditorPreference.java
index 6a84e7e..a0a63d7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfileEditorPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillProfileEditorPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill;
+package org.chromium.chrome.browser.settings.autofill;
 
 import android.app.Activity;
 import android.content.Context;
@@ -14,7 +14,7 @@
 import org.chromium.chrome.browser.payments.AddressEditor;
 import org.chromium.chrome.browser.payments.AutofillAddress;
 import org.chromium.chrome.browser.payments.SettingsAutofillAndPaymentsObserver;
-import org.chromium.chrome.browser.preferences.MainPreferences;
+import org.chromium.chrome.browser.settings.MainPreferences;
 import org.chromium.chrome.browser.widget.prefeditor.EditorDialog;
 import org.chromium.chrome.browser.widget.prefeditor.EditorObserverForTest;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillProfilesFragment.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragment.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillProfilesFragment.java
index a28cee3..e16f2b08 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillProfilesFragment.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill;
+package org.chromium.chrome.browser.settings.autofill;
 
 import android.content.Context;
 import android.graphics.PorterDuff;
@@ -19,9 +19,9 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
-import org.chromium.chrome.browser.preferences.MainPreferences;
-import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.MainPreferences;
+import org.chromium.chrome.browser.settings.ManagedPreferenceDelegate;
 import org.chromium.chrome.browser.widget.prefeditor.EditorObserverForTest;
 
 /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerCardEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillServerCardEditor.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerCardEditor.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillServerCardEditor.java
index 2df15b4..18c065c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerCardEditor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillServerCardEditor.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill;
+package org.chromium.chrome.browser.settings.autofill;
 
 import android.os.Bundle;
 import android.view.LayoutInflater;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerProfilePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillServerProfilePreferences.java
similarity index 92%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerProfilePreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillServerProfilePreferences.java
index 74c5a6a..5e8b629 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillServerProfilePreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/AutofillServerProfilePreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill;
+package org.chromium.chrome.browser.settings.autofill;
 
 import android.content.Context;
 import android.os.Bundle;
@@ -14,8 +14,8 @@
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
-import org.chromium.chrome.browser.preferences.MainPreferences;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
+import org.chromium.chrome.browser.settings.MainPreferences;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
 
 /**
  * Fragment for settings page that allows user to view and edit a single server-provided address.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/CreditCardNumberFormattingTextWatcher.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/CreditCardNumberFormattingTextWatcher.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/CreditCardNumberFormattingTextWatcher.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/CreditCardNumberFormattingTextWatcher.java
index 8a8fed9..226c1d6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/CreditCardNumberFormattingTextWatcher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/CreditCardNumberFormattingTextWatcher.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill;
+package org.chromium.chrome.browser.settings.autofill;
 
 import android.text.Editable;
 import android.text.TextUtils;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/OWNERS
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/OWNERS
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/autofill/OWNERS
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantPreferences.java
similarity index 94%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantPreferences.java
index 1aa27a6a..458cb97 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill_assistant;
+package org.chromium.chrome.browser.settings.autofill_assistant;
 
 import android.content.Context;
 import android.os.Bundle;
@@ -11,7 +11,7 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
 
 /** The "Autofill Assistant" preferences screen in Settings. */
 public class AutofillAssistantPreferences extends PreferenceFragmentCompat {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill_assistant/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill_assistant/OWNERS
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionDataUseItem.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionDataUseItem.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionDataUseItem.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionDataUseItem.java
index b46d5b7..a72aa7e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionDataUseItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionDataUseItem.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.datareduction;
+package org.chromium.chrome.browser.settings.datareduction;
 
 import android.content.Context;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionPreferenceFragment.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionPreferenceFragment.java
index 09231ea..380900b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionPreferenceFragment.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.datareduction;
+package org.chromium.chrome.browser.settings.datareduction;
 
 import android.content.res.Configuration;
 import android.content.res.Resources;
@@ -21,9 +21,9 @@
 import org.chromium.chrome.browser.infobar.PreviewsLitePageInfoBar;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings.ContentLengths;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
 import org.chromium.chrome.browser.util.ConversionUtils;
 import org.chromium.chrome.browser.util.IntentUtils;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionSiteBreakdownView.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionSiteBreakdownView.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionSiteBreakdownView.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionSiteBreakdownView.java
index dfac1da..5712cef 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionSiteBreakdownView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionSiteBreakdownView.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.datareduction;
+package org.chromium.chrome.browser.settings.datareduction;
 
 import android.content.Context;
 import android.graphics.drawable.Drawable;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionStatsPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionStatsPreference.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionStatsPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionStatsPreference.java
index 76065f5b..8bb640f5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionStatsPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/datareduction/DataReductionStatsPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.datareduction;
+package org.chromium.chrome.browser.settings.datareduction;
 
 import static android.text.format.DateUtils.FORMAT_ABBREV_MONTH;
 import static android.text.format.DateUtils.FORMAT_NO_YEAR;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/settings/datareduction/OWNERS
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/OWNERS
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/datareduction/OWNERS
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/DeveloperPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/developer/DeveloperPreferences.java
similarity index 93%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/DeveloperPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/developer/DeveloperPreferences.java
index 189006e..4dd3018 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/DeveloperPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/developer/DeveloperPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.developer;
+package org.chromium.chrome.browser.settings.developer;
 
 import android.os.Bundle;
 import android.support.v7.preference.PreferenceFragmentCompat;
@@ -10,7 +10,7 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeVersionInfo;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
 import org.chromium.components.version_info.Channel;
 import org.chromium.components.version_info.VersionConstants;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/settings/developer/OWNERS
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/OWNERS
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/developer/OWNERS
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/README.md b/chrome/android/java/src/org/chromium/chrome/browser/settings/developer/README.md
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/README.md
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/developer/README.md
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/TracingCategoriesPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/developer/TracingCategoriesPreferences.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/TracingCategoriesPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/developer/TracingCategoriesPreferences.java
index 5c3c26983..4090f975 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/TracingCategoriesPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/developer/TracingCategoriesPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.developer;
+package org.chromium.chrome.browser.settings.developer;
 
 import android.content.Context;
 import android.os.Bundle;
@@ -12,7 +12,7 @@
 import android.support.v7.preference.PreferenceScreen;
 import android.text.TextUtils;
 
-import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference;
+import org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference;
 import org.chromium.chrome.browser.tracing.TracingController;
 
 import java.util.ArrayList;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/TracingPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/developer/TracingPreferences.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/TracingPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/developer/TracingPreferences.java
index a1ae784..174b550 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/TracingPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/developer/TracingPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.developer;
+package org.chromium.chrome.browser.settings.developer;
 
 import android.os.Bundle;
 import android.support.v7.preference.ListPreference;
@@ -14,7 +14,7 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
 import org.chromium.chrome.browser.tracing.TracingController;
 import org.chromium.chrome.browser.tracing.TracingNotificationManager;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadDirectoryAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/download/DownloadDirectoryAdapter.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadDirectoryAdapter.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/download/DownloadDirectoryAdapter.java
index efbeb0b..df1ea03 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadDirectoryAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/download/DownloadDirectoryAdapter.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.download;
+package org.chromium.chrome.browser.settings.download;
 
 import android.content.Context;
 import android.view.LayoutInflater;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/download/DownloadLocationPreference.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/download/DownloadLocationPreference.java
index 0dd1f47..2cb83d95 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/download/DownloadLocationPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.download;
+package org.chromium.chrome.browser.settings.download;
 
 import android.content.Context;
 import android.support.v7.preference.DialogPreference;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreferenceAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/download/DownloadLocationPreferenceAdapter.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreferenceAdapter.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/download/DownloadLocationPreferenceAdapter.java
index 90a16fc..1aa8279 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreferenceAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/download/DownloadLocationPreferenceAdapter.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.download;
+package org.chromium.chrome.browser.settings.download;
 
 import android.content.Context;
 import android.view.LayoutInflater;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreferenceDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/download/DownloadLocationPreferenceDialog.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreferenceDialog.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/download/DownloadLocationPreferenceDialog.java
index 41de1f26..93a6571 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreferenceDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/download/DownloadLocationPreferenceDialog.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.download;
+package org.chromium.chrome.browser.settings.download;
 
 import android.os.Bundle;
 import android.support.v7.preference.PreferenceDialogFragmentCompat;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/download/DownloadPreferences.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/download/DownloadPreferences.java
index 756106f..522683a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/download/DownloadPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.download;
+package org.chromium.chrome.browser.settings.download;
 
 import android.os.Bundle;
 import android.support.v7.preference.Preference;
@@ -14,8 +14,8 @@
 import org.chromium.chrome.browser.download.DownloadPromptStatus;
 import org.chromium.chrome.browser.download.DownloadUtils;
 import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchConfiguration;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
 
 /**
  * Fragment to keep track of all downloads related preferences.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/AddLanguageFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/languages/AddLanguageFragment.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/AddLanguageFragment.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/languages/AddLanguageFragment.java
index 2e28500..089e29c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/AddLanguageFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/languages/AddLanguageFragment.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.languages;
+package org.chromium.chrome.browser.settings.languages;
 
 import android.app.Activity;
 import android.content.Context;
@@ -23,7 +23,7 @@
 import android.view.inputmethod.EditorInfo;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguageItem.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/languages/LanguageItem.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguageItem.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/languages/LanguageItem.java
index 252da20..b1c58fe 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguageItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/languages/LanguageItem.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.languages;
+package org.chromium.chrome.browser.settings.languages;
 
 /**
  * Simple object representing the language item.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguageListBaseAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/languages/LanguageListBaseAdapter.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguageListBaseAdapter.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/languages/LanguageListBaseAdapter.java
index 7bcc889..ad419710 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguageListBaseAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/languages/LanguageListBaseAdapter.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.languages;
+package org.chromium.chrome.browser.settings.languages;
 
 import android.content.Context;
 import android.support.v4.view.ViewCompat;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguageListPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/languages/LanguageListPreference.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguageListPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/languages/LanguageListPreference.java
index a07eaef..1138d32 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguageListPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/languages/LanguageListPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.languages;
+package org.chromium.chrome.browser.settings.languages;
 
 import static org.chromium.chrome.browser.ui.widget.listmenu.BasicListMenu.buildMenuListItem;
 import static org.chromium.chrome.browser.ui.widget.listmenu.BasicListMenu.buildMenuListItemWithEndIcon;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguagesManager.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/languages/LanguagesManager.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguagesManager.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/languages/LanguagesManager.java
index 2b5ef01..61a484f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguagesManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/languages/LanguagesManager.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.languages;
+package org.chromium.chrome.browser.settings.languages;
 
 import androidx.annotation.IntDef;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguagesPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/languages/LanguagesPreferences.java
similarity index 93%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguagesPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/languages/LanguagesPreferences.java
index a35df96..8ebdad88 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguagesPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/languages/LanguagesPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.languages;
+package org.chromium.chrome.browser.settings.languages;
 
 import android.app.Activity;
 import android.content.Intent;
@@ -11,11 +11,11 @@
 import android.support.v7.preference.PreferenceFragmentCompat;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
 
 /**
  * Settings fragment that displays information about Chrome languages, which allow users to
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/CallbackDelayer.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/CallbackDelayer.java
similarity index 89%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/CallbackDelayer.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/CallbackDelayer.java
index 829d4f4..5fb9a70 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/CallbackDelayer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/CallbackDelayer.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 /**
  * This is an interface for delaying running of callbacks.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/DialogManager.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/DialogManager.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/DialogManager.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/DialogManager.java
index be8cb89..36a1e21 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/DialogManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/DialogManager.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import android.support.v4.app.DialogFragment;
 import android.support.v4.app.FragmentManager;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ExportErrorDialogFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/ExportErrorDialogFragment.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ExportErrorDialogFragment.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/ExportErrorDialogFragment.java
index b50c2c06..a508633 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ExportErrorDialogFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/ExportErrorDialogFragment.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import android.app.Dialog;
 import android.content.DialogInterface;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ExportFlow.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/ExportFlow.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ExportFlow.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/ExportFlow.java
index ede07fa..99a6b82 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ExportFlow.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/ExportFlow.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import android.app.Activity;
 import android.content.ActivityNotFoundException;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ExportWarningDialogFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/ExportWarningDialogFragment.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ExportWarningDialogFragment.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/ExportWarningDialogFragment.java
index 8ac8cbc..542d3bc0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ExportWarningDialogFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/ExportWarningDialogFragment.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import android.app.Dialog;
 import android.content.DialogInterface;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ManualCallbackDelayer.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/ManualCallbackDelayer.java
similarity index 93%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ManualCallbackDelayer.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/ManualCallbackDelayer.java
index f8d22db..ce9a08e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ManualCallbackDelayer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/ManualCallbackDelayer.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/OWNERS
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/OWNERS
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/OWNERS
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEditingBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordEditingBridge.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEditingBridge.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordEditingBridge.java
index 234613b..48345c5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEditingBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordEditingBridge.java
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import android.content.Context;
 import android.os.Bundle;
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
 
 /**
  * This is a bridge between PasswordEntryEditor and the C++ code. The bridge is in charge of
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEditingDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordEditingDelegate.java
similarity index 92%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEditingDelegate.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordEditingDelegate.java
index 3717548c..bfafe61 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEditingDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordEditingDelegate.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 /**
  * Interface for accessing the PasswordEditingBridge. It's used to mock it in tests.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEditingDelegateProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordEditingDelegateProvider.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEditingDelegateProvider.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordEditingDelegateProvider.java
index cec82a4..23a40e0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEditingDelegateProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordEditingDelegateProvider.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 /**
  * A provider for PasswordEditingDelegate implementations, handling the choice of the proper
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordEntryEditor.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryEditor.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordEntryEditor.java
index 6cd8497..62f48a10 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryEditor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordEntryEditor.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import android.os.Bundle;
 import android.support.v4.app.Fragment;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryViewer.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordEntryViewer.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryViewer.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordEntryViewer.java
index 9dee5323..8889bab 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryViewer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordEntryViewer.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import android.content.ClipData;
 import android.content.ClipboardManager;
@@ -37,7 +37,7 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
 import org.chromium.components.sync.AndroidSyncSettings;
 import org.chromium.ui.text.SpanApplier;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordManagerHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordManagerHandler.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordManagerHandler.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordManagerHandler.java
index c43cdd8..72324b8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordManagerHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordManagerHandler.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import android.content.Context;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordManagerHandlerProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordManagerHandlerProvider.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordManagerHandlerProvider.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordManagerHandlerProvider.java
index e5c02d6..8d1a8411 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordManagerHandlerProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordManagerHandlerProvider.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import androidx.annotation.VisibleForTesting;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordReauthenticationFragment.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragment.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordReauthenticationFragment.java
index 22cff9e1..4e99972 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordReauthenticationFragment.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import android.annotation.TargetApi;
 import android.app.Activity;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordUIView.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordUIView.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordUIView.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordUIView.java
index 5122465..b305161 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordUIView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/PasswordUIView.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import android.content.Context;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ProgressBarDialogFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/ProgressBarDialogFragment.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ProgressBarDialogFragment.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/ProgressBarDialogFragment.java
index 0a862cd..feb42aa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ProgressBarDialogFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/ProgressBarDialogFragment.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import android.app.Dialog;
 import android.content.DialogInterface;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ReauthenticationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/ReauthenticationManager.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ReauthenticationManager.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/ReauthenticationManager.java
index 3a390bb8..7b4d6e1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/ReauthenticationManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/ReauthenticationManager.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import android.app.KeyguardManager;
 import android.content.Context;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/SavePasswordsPreferences.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/SavePasswordsPreferences.java
index 57b1ccb..9709d53 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/SavePasswordsPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import android.app.Activity;
 import android.content.Context;
@@ -28,15 +28,15 @@
 import org.chromium.base.StrictModeContext;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
-import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference;
-import org.chromium.chrome.browser.preferences.ChromeBasePreference;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.SearchUtils;
-import org.chromium.chrome.browser.preferences.TextMessagePreference;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference;
+import org.chromium.chrome.browser.settings.ChromeBasePreference;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.SearchUtils;
+import org.chromium.chrome.browser.settings.TextMessagePreference;
 import org.chromium.ui.text.SpanApplier;
 
 import java.util.Locale;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavedPasswordEntry.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/SavedPasswordEntry.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavedPasswordEntry.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/SavedPasswordEntry.java
index 932359f..a77dae4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavedPasswordEntry.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/SavedPasswordEntry.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 /**
  * A class representing information about a saved password entry in Chrome's settngs.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SingleThreadBarrierClosure.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/SingleThreadBarrierClosure.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SingleThreadBarrierClosure.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/SingleThreadBarrierClosure.java
index 247f23d4..7664698 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SingleThreadBarrierClosure.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/SingleThreadBarrierClosure.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 /**
  * A Runnable which postpones running a given callback until it is itself run for a pre-defined
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/TimedCallbackDelayer.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/TimedCallbackDelayer.java
similarity index 94%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/password/TimedCallbackDelayer.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/password/TimedCallbackDelayer.java
index 0857b76..60d20a3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/TimedCallbackDelayer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/password/TimedCallbackDelayer.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import android.os.Handler;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/BandwidthType.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/BandwidthType.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/BandwidthType.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/BandwidthType.java
index 411f867..8afd265 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/BandwidthType.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/BandwidthType.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import androidx.annotation.IntDef;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataBridge.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataBridge.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataBridge.java
index ca1cb6eb..1fe1d9c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataBridge.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import androidx.annotation.VisibleForTesting;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataCounterBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataCounterBridge.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataCounterBridge.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataCounterBridge.java
index ed4ce7d..ffd831a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataCounterBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataCounterBridge.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataFetcher.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataFetcher.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataFetcher.java
index ef809084..625860b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataFetcher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataFetcher.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import android.os.Parcel;
 import android.os.Parcelable;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferences.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferences.java
index 74636a5..c656c383 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import android.app.Activity;
 import android.app.ProgressDialog;
@@ -34,12 +34,12 @@
 import org.chromium.chrome.browser.browsing_data.TimePeriod;
 import org.chromium.chrome.browser.historyreport.AppIndexingReporter;
 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
-import org.chromium.chrome.browser.preferences.ClearBrowsingDataCheckBoxPreference;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
-import org.chromium.chrome.browser.preferences.SpinnerPreference;
-import org.chromium.chrome.browser.preferences.privacy.BrowsingDataCounterBridge.BrowsingDataCounterCallback;
+import org.chromium.chrome.browser.settings.ClearBrowsingDataCheckBoxPreference;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
+import org.chromium.chrome.browser.settings.SpinnerPreference;
+import org.chromium.chrome.browser.settings.privacy.BrowsingDataCounterBridge.BrowsingDataCounterCallback;
 import org.chromium.ui.widget.ButtonCompat;
 
 import java.lang.annotation.Retention;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesAdvanced.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesAdvanced.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesAdvanced.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesAdvanced.java
index b055d08..23aca55 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesAdvanced.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesAdvanced.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.RecordUserAction;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasic.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesBasic.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasic.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesBasic.java
index f1b4bb5a..807fef3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasic.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesBasic.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import android.os.Bundle;
 
@@ -10,7 +10,7 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.browsing_data.ClearBrowsingDataTab;
-import org.chromium.chrome.browser.preferences.ClearBrowsingDataCheckBoxPreference;
+import org.chromium.chrome.browser.settings.ClearBrowsingDataCheckBoxPreference;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
 import org.chromium.chrome.browser.tabmodel.TabLaunchType;
 import org.chromium.chrome.browser.tabmodel.document.TabDelegate;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataTabsFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataTabsFragment.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataTabsFragment.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataTabsFragment.java
index f3531dc9..c150fc65 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataTabsFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataTabsFragment.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import android.content.Context;
 import android.os.Bundle;
@@ -25,8 +25,8 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.browsing_data.ClearBrowsingDataTab;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
-import org.chromium.chrome.browser.preferences.Preferences;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.Preferences;
 
 import java.util.Locale;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ConfirmImportantSitesDialogFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ConfirmImportantSitesDialogFragment.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ConfirmImportantSitesDialogFragment.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ConfirmImportantSitesDialogFragment.java
index cb90e0d..1889f83 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ConfirmImportantSitesDialogFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ConfirmImportantSitesDialogFragment.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import android.app.Activity;
 import android.app.ActivityManager;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ContextualSearchPreferenceFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ContextualSearchPreferenceFragment.java
similarity index 90%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ContextualSearchPreferenceFragment.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ContextualSearchPreferenceFragment.java
index 0c052b5..51df222 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ContextualSearchPreferenceFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/ContextualSearchPreferenceFragment.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import android.os.Bundle;
 import android.support.v7.preference.PreferenceFragmentCompat;
@@ -10,8 +10,8 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.contextualsearch.ContextualSearchManager;
 import org.chromium.chrome.browser.contextualsearch.ContextualSearchUma;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
 
 /**
  * Fragment to manage the Contextual Search preference and to explain to the user what it does.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/DoNotTrackPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/DoNotTrackPreference.java
similarity index 88%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/DoNotTrackPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/DoNotTrackPreference.java
index 7eb5c58..87e8020 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/DoNotTrackPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/DoNotTrackPreference.java
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import android.os.Bundle;
 import android.support.v7.preference.PreferenceFragmentCompat;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
 
 /**
  * Fragment to manage 'Do Not Track' preference and to explain to the user what it does.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/OWNERS
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/OWNERS
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/OWNERS
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/OtherFormsOfHistoryDialogFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/OtherFormsOfHistoryDialogFragment.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/OtherFormsOfHistoryDialogFragment.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/OtherFormsOfHistoryDialogFragment.java
index 36121c7e..e75e1b4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/OtherFormsOfHistoryDialogFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/OtherFormsOfHistoryDialogFragment.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import android.app.Activity;
 import android.app.Dialog;
@@ -34,7 +34,7 @@
         DialogInterface.OnClickListener {
 
     public static final String PREF_OTHER_FORMS_OF_HISTORY_DIALOG_SHOWN =
-            "org.chromium.chrome.browser.preferences.privacy."
+            "org.chromium.chrome.browser.settings.privacy."
             + "PREF_OTHER_FORMS_OF_HISTORY_DIALOG_SHOWN";
 
     private static final String TAG = "OtherFormsOfHistoryDialogFragment";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferences.java
similarity index 93%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferences.java
index 5acf600..75d998e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import android.os.Bundle;
 import android.support.graphics.drawable.VectorDrawableCompat;
@@ -16,14 +16,14 @@
 import org.chromium.base.BuildInfo;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
-import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference;
-import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.sync.SyncAndServicesPreferences;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference;
+import org.chromium.chrome.browser.settings.ManagedPreferenceDelegate;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.sync.SyncAndServicesPreferences;
 import org.chromium.chrome.browser.usage_stats.UsageStatsConsentDialog;
 import org.chromium.ui.text.NoUnderlineClickableSpan;
 import org.chromium.ui.text.SpanApplier;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManager.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManager.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManager.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManager.java
index 21f9ed5..69174b0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManager.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import android.annotation.SuppressLint;
 import android.content.Context;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/AccountManagementFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/AccountManagementFragment.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/AccountManagementFragment.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/sync/AccountManagementFragment.java
index 6eec192..9c9c4d0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/AccountManagementFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/AccountManagementFragment.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.sync;
+package org.chromium.chrome.browser.settings.sync;
 
 import android.accounts.Account;
 import android.annotation.TargetApi;
@@ -30,12 +30,12 @@
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.ContextUtils;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.ChromeBasePreference;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.profiles.ProfileAccountManagementMetrics;
+import org.chromium.chrome.browser.settings.ChromeBasePreference;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
 import org.chromium.chrome.browser.signin.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.ProfileDataCache;
 import org.chromium.chrome.browser.signin.SignOutDialogFragment;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/ManageSyncPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/ManageSyncPreferences.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/ManageSyncPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/sync/ManageSyncPreferences.java
index 39187be3..3099312 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/ManageSyncPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/ManageSyncPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.sync;
+package org.chromium.chrome.browser.settings.sync;
 
 import android.content.Context;
 import android.os.Bundle;
@@ -29,9 +29,9 @@
 import org.chromium.chrome.browser.AppHooks;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
 import org.chromium.chrome.browser.sync.ui.PassphraseCreationDialogFragment;
 import org.chromium.chrome.browser.sync.ui.PassphraseDialogFragment;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/OWNERS
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/OWNERS
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/sync/OWNERS
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SignInPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SignInPreference.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SignInPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SignInPreference.java
index d38b57f..0808ce08 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SignInPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SignInPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.sync;
+package org.chromium.chrome.browser.settings.sync;
 
 import android.content.Context;
 import android.support.v7.content.res.AppCompatResources;
@@ -17,8 +17,8 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
-import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
+import org.chromium.chrome.browser.settings.ManagedPreferencesUtils;
 import org.chromium.chrome.browser.signin.DisplayableProfileData;
 import org.chromium.chrome.browser.signin.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.PersonalizedSigninPromoView;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncAndServicesPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SyncAndServicesPreferences.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncAndServicesPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SyncAndServicesPreferences.java
index 8433df5..7ff1ebc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncAndServicesPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SyncAndServicesPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.sync;
+package org.chromium.chrome.browser.settings.sync;
 
 import android.accounts.Account;
 import android.app.Dialog;
@@ -42,18 +42,18 @@
 import org.chromium.chrome.browser.contextualsearch.ContextualSearchManager;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
 import org.chromium.chrome.browser.metrics.UmaSessionStats;
-import org.chromium.chrome.browser.preferences.ChromeBasePreference;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
-import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
-import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.password.PasswordUIView;
-import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.safe_browsing.SafeBrowsingBridge;
+import org.chromium.chrome.browser.settings.ChromeBasePreference;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.ManagedPreferenceDelegate;
+import org.chromium.chrome.browser.settings.ManagedPreferencesUtils;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.password.PasswordUIView;
+import org.chromium.chrome.browser.settings.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.browser.signin.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.UnifiedConsentServiceBridge;
 import org.chromium.chrome.browser.sync.GoogleServiceAuthError;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncPreferenceUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SyncPreferenceUtils.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncPreferenceUtils.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SyncPreferenceUtils.java
index 2c403f0..cc80dd8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncPreferenceUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/sync/SyncPreferenceUtils.java
@@ -1,7 +1,7 @@
 // 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.
-package org.chromium.chrome.browser.preferences.sync;
+package org.chromium.chrome.browser.settings.sync;
 
 import android.app.Activity;
 import android.content.Context;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/settings/themes/OWNERS
similarity index 100%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/OWNERS
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/themes/OWNERS
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/RadioButtonGroupThemePreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/themes/RadioButtonGroupThemePreference.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/RadioButtonGroupThemePreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/themes/RadioButtonGroupThemePreference.java
index 21bde14..0c2729f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/RadioButtonGroupThemePreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/themes/RadioButtonGroupThemePreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.themes;
+package org.chromium.chrome.browser.settings.themes;
 
 import android.content.Context;
 import android.support.v7.preference.Preference;
@@ -19,7 +19,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.night_mode.NightModeMetrics;
-import org.chromium.chrome.browser.preferences.themes.ThemePreferences.ThemeSetting;
+import org.chromium.chrome.browser.settings.themes.ThemePreferences.ThemeSetting;
 import org.chromium.chrome.browser.ui.widget.RadioButtonWithDescription;
 import org.chromium.chrome.browser.ui.widget.RadioButtonWithDescriptionLayout;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/ThemePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/themes/ThemePreferences.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/ThemePreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/themes/ThemePreferences.java
index abad6cd..59906b7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/themes/ThemePreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/themes/ThemePreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.themes;
+package org.chromium.chrome.browser.settings.themes;
 
 import static org.chromium.chrome.browser.preferences.ChromePreferenceKeys.DARKEN_WEBSITES_ENABLED_KEY;
 import static org.chromium.chrome.browser.preferences.ChromePreferenceKeys.UI_THEME_SETTING_KEY;
@@ -17,8 +17,8 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.night_mode.NightModeUtils;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
 import org.chromium.ui.UiUtils;
 
 import java.lang.annotation.Retention;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/AddExceptionPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/AddExceptionPreference.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/AddExceptionPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/AddExceptionPreference.java
index 4684038..bea8fcda 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/AddExceptionPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/AddExceptionPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.content.Context;
 import android.content.DialogInterface;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ChosenObjectInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ChosenObjectInfo.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ChosenObjectInfo.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/ChosenObjectInfo.java
index c415dbb..2280524 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ChosenObjectInfo.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ChosenObjectInfo.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import org.chromium.chrome.browser.ContentSettingsType;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ChosenObjectPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ChosenObjectPreferences.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ChosenObjectPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/ChosenObjectPreferences.java
index 3fb482b..4b54df28 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ChosenObjectPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ChosenObjectPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.content.Context;
 import android.content.DialogInterface;
@@ -23,10 +23,10 @@
 import org.chromium.base.annotations.RemovableInRelease;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
-import org.chromium.chrome.browser.preferences.ChromeImageViewPreference;
-import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
-import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.ChromeImageViewPreference;
+import org.chromium.chrome.browser.settings.ManagedPreferenceDelegate;
+import org.chromium.chrome.browser.settings.ManagedPreferencesUtils;
 
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ClearWebsiteStorage.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ClearWebsiteStorage.java
similarity index 91%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ClearWebsiteStorage.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/ClearWebsiteStorage.java
index f2a4558..ebf77e4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ClearWebsiteStorage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ClearWebsiteStorage.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.content.Context;
 import android.support.v7.preference.DialogPreference;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ClearWebsiteStorageDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ClearWebsiteStorageDialog.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ClearWebsiteStorageDialog.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/ClearWebsiteStorageDialog.java
index 541fc76..ddf61a70 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ClearWebsiteStorageDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ClearWebsiteStorageDialog.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.os.Bundle;
 import android.support.v7.preference.Preference;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSetting.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSetting.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSetting.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSetting.java
index 0541335..01bd4a2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSetting.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSetting.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import androidx.annotation.Nullable;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingException.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSettingException.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingException.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSettingException.java
index 804261a..af03b5f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingException.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSettingException.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import androidx.annotation.IntDef;
 import androidx.annotation.Nullable;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingsResources.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSettingsResources.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingsResources.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSettingsResources.java
index c83c5cb..56a2dac 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ContentSettingsResources.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ContentSettingsResources.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.annotation.SuppressLint;
 import android.content.res.Resources;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/LocalStorageInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/LocalStorageInfo.java
similarity index 86%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/LocalStorageInfo.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/LocalStorageInfo.java
index cd1bd58..341bfc0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/LocalStorageInfo.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/LocalStorageInfo.java
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
-import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge.StorageInfoClearedCallback;
+import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge.StorageInfoClearedCallback;
 
 import java.io.Serializable;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/LocationCategory.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/LocationCategory.java
similarity index 94%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/LocationCategory.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/LocationCategory.java
index eced798f..fc933e1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/LocationCategory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/LocationCategory.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.app.Activity;
 import android.content.Context;
@@ -10,7 +10,7 @@
 import android.content.res.Resources;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.LocationSettings;
+import org.chromium.chrome.browser.settings.LocationSettings;
 import org.chromium.components.location.LocationUtils;
 
 /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ManageSpaceActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivity.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ManageSpaceActivity.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivity.java
index 2a8f219..b55a5e28 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ManageSpaceActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivity.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.annotation.SuppressLint;
 import android.annotation.TargetApi;
@@ -36,10 +36,10 @@
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.init.EmptyBrowserParts;
 import org.chromium.chrome.browser.notifications.channels.SiteChannelsManager;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.about.AboutChromePreferences;
-import org.chromium.chrome.browser.preferences.website.Website.StoredDataClearedCallback;
 import org.chromium.chrome.browser.searchwidget.SearchWidgetProvider;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.about.AboutChromePreferences;
+import org.chromium.chrome.browser.settings.website.Website.StoredDataClearedCallback;
 import org.chromium.chrome.browser.util.ConversionUtils;
 
 import java.util.Collection;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/NotificationCategory.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/NotificationCategory.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/NotificationCategory.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/NotificationCategory.java
index 5248e18..8c9c6db 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/NotificationCategory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/NotificationCategory.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.content.Context;
 import android.support.v4.app.NotificationManagerCompat;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/PermissionInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/PermissionInfo.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/PermissionInfo.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/PermissionInfo.java
index 35062d59..efeceae 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/PermissionInfo.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/PermissionInfo.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import androidx.annotation.IntDef;
 import androidx.annotation.Nullable;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SettingsNavigationSource.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SettingsNavigationSource.java
similarity index 93%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SettingsNavigationSource.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/SettingsNavigationSource.java
index acb263b..efbb5f7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SettingsNavigationSource.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SettingsNavigationSource.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import androidx.annotation.IntDef;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategoryPreferences.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategoryPreferences.java
index d5827f0a..e759b76 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleCategoryPreferences.java
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
-import static org.chromium.chrome.browser.preferences.SearchUtils.handleSearchNavigation;
+import static org.chromium.chrome.browser.settings.SearchUtils.handleSearchNavigation;
 
 import android.content.Context;
 import android.content.DialogInterface;
@@ -41,19 +41,19 @@
 import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.browserservices.permissiondelegation.TrustedWebActivityPermissionManager;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
-import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference;
-import org.chromium.chrome.browser.preferences.ChromeBasePreference;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
-import org.chromium.chrome.browser.preferences.ExpandablePreferenceGroup;
-import org.chromium.chrome.browser.preferences.LocationSettings;
-import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
-import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
-import org.chromium.chrome.browser.preferences.SearchUtils;
-import org.chromium.chrome.browser.preferences.website.Website.StoredDataClearedCallback;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference;
+import org.chromium.chrome.browser.settings.ChromeBasePreference;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.ExpandablePreferenceGroup;
+import org.chromium.chrome.browser.settings.LocationSettings;
+import org.chromium.chrome.browser.settings.ManagedPreferenceDelegate;
+import org.chromium.chrome.browser.settings.ManagedPreferencesUtils;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
+import org.chromium.chrome.browser.settings.SearchUtils;
+import org.chromium.chrome.browser.settings.website.Website.StoredDataClearedCallback;
 import org.chromium.chrome.browser.util.UrlUtilities;
 import org.chromium.ui.widget.Toast;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleWebsitePreferences.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleWebsitePreferences.java
index 8b35bca3..4a18874 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SingleWebsitePreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.app.Activity;
 import android.content.Context;
@@ -30,10 +30,10 @@
 import org.chromium.chrome.browser.browserservices.Origin;
 import org.chromium.chrome.browser.browserservices.permissiondelegation.TrustedWebActivityPermissionManager;
 import org.chromium.chrome.browser.notifications.channels.SiteChannelsManager;
-import org.chromium.chrome.browser.preferences.ChromeImageViewPreference;
-import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
-import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
+import org.chromium.chrome.browser.settings.ChromeImageViewPreference;
+import org.chromium.chrome.browser.settings.ManagedPreferenceDelegate;
+import org.chromium.chrome.browser.settings.ManagedPreferencesUtils;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
 
 import java.util.Arrays;
 import java.util.Collection;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteDataCleaner.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteDataCleaner.java
similarity index 95%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteDataCleaner.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteDataCleaner.java
index c282df9..d56936e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteDataCleaner.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteDataCleaner.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 /**
  * Encapsulates clearing the data of {@link Website}s.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsCategory.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteSettingsCategory.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsCategory.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteSettingsCategory.java
index f241b03..e0846063 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsCategory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteSettingsCategory.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.app.Activity;
 import android.content.Context;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteSettingsPreference.java
similarity index 89%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteSettingsPreference.java
index 7c9574e3..e7ba2579 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteSettingsPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.content.Context;
 import android.support.v4.view.ViewCompat;
@@ -11,7 +11,7 @@
 import android.widget.ImageView;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.ChromeBasePreference;
+import org.chromium.chrome.browser.settings.ChromeBasePreference;
 
 /**
  * A custom preference for drawing Site Settings entries.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteSettingsPreferences.java
similarity index 96%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteSettingsPreferences.java
index 2bbdbcc..28ca1a38 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/SiteSettingsPreferences.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.os.Bundle;
 import android.support.v7.preference.Preference;
@@ -10,11 +10,11 @@
 
 import org.chromium.base.CommandLine;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.LocationSettings;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
-import org.chromium.chrome.browser.preferences.website.SiteSettingsCategory.Type;
+import org.chromium.chrome.browser.settings.LocationSettings;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
+import org.chromium.chrome.browser.settings.website.SiteSettingsCategory.Type;
 import org.chromium.content_public.browser.ContentFeatureList;
 import org.chromium.content_public.common.ContentSwitches;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/StorageInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/StorageInfo.java
similarity index 82%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/StorageInfo.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/StorageInfo.java
index 53e0530..efabfb42 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/StorageInfo.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/StorageInfo.java
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
-import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge.StorageInfoClearedCallback;
+import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge.StorageInfoClearedCallback;
 
 import java.io.Serializable;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/TriStateSiteSettingsPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/TriStateSiteSettingsPreference.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/TriStateSiteSettingsPreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/TriStateSiteSettingsPreference.java
index 185acd0..af3c6fc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/TriStateSiteSettingsPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/TriStateSiteSettingsPreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.content.Context;
 import android.support.v7.preference.Preference;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/Website.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/Website.java
index 277c352..dfc59f7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/Website.java
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import androidx.annotation.Nullable;
 
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.browser.ContentSettingsType;
-import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge.StorageInfoClearedCallback;
+import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge.StorageInfoClearedCallback;
 import org.chromium.chrome.browser.util.MathUtils;
 
 import java.io.Serializable;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsiteAddress.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsiteAddress.java
similarity index 98%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsiteAddress.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsiteAddress.java
index ceadf87a2..324a133 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsiteAddress.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsiteAddress.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.net.Uri;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcher.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcher.java
index d4b3107..d77629b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcher.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.util.Pair;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreference.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePreference.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreference.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePreference.java
index 46d71934..eea0744 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePreference.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.content.Context;
 import android.content.res.Resources;
@@ -20,8 +20,8 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.favicon.FaviconHelper;
 import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback;
-import org.chromium.chrome.browser.preferences.ChromeImageViewPreference;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.ChromeImageViewPreference;
 import org.chromium.chrome.browser.ui.widget.RoundedIconGenerator;
 
 /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreferenceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePreferenceBridge.java
similarity index 99%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreferenceBridge.java
rename to chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePreferenceBridge.java
index a7dcecf..7045019 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreferenceBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/website/WebsitePreferenceBridge.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import androidx.annotation.VisibleForTesting;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sharing/shared_clipboard/SharedClipboardShareActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/sharing/shared_clipboard/SharedClipboardShareActivity.java
index 0249b4b7..9b0a26f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sharing/shared_clipboard/SharedClipboardShareActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sharing/shared_clipboard/SharedClipboardShareActivity.java
@@ -21,7 +21,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.init.AsyncInitializationActivity;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
 import org.chromium.chrome.browser.sharing.SharingAdapter;
 import org.chromium.chrome.browser.sharing.SharingServiceProxy;
 import org.chromium.chrome.browser.sharing.SharingServiceProxy.DeviceInfo;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmImportSyncDataDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmImportSyncDataDialog.java
index f45214e..4ed07b25 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmImportSyncDataDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmImportSyncDataDialog.java
@@ -19,7 +19,7 @@
 
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils;
+import org.chromium.chrome.browser.settings.ManagedPreferencesUtils;
 import org.chromium.chrome.browser.ui.widget.RadioButtonWithDescription;
 
 import java.util.Arrays;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninActivity.java
index 0690e8b..889790d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninActivity.java
@@ -13,7 +13,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeBaseAppCompatActivity;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
-import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils;
+import org.chromium.chrome.browser.settings.ManagedPreferencesUtils;
 import org.chromium.components.signin.metrics.SigninAccessPoint;
 
 import java.lang.annotation.Retention;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninFragment.java
index b52f5a3..fe07611 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninFragment.java
@@ -17,8 +17,8 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.SyncFirstSetupCompleteSource;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.sync.SyncAndServicesPreferences;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.sync.SyncAndServicesPreferences;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
 import org.chromium.components.signin.AccountManagerFacade;
 import org.chromium.components.signin.metrics.SigninAccessPoint;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java
index 2eae0f38..6d0ada67 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninUtils.java
@@ -17,8 +17,8 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.ChromeFeatureList;
-import org.chromium.chrome.browser.preferences.sync.AccountManagementFragment;
 import org.chromium.chrome.browser.profiles.ProfileAccountManagementMetrics;
+import org.chromium.chrome.browser.settings.sync.AccountManagementFragment;
 import org.chromium.chrome.browser.util.IntentUtils;
 import org.chromium.components.signin.AccountManagerFacade;
 import org.chromium.components.signin.GAIAServiceType;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java
index 5755f55..df2b4966 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java
@@ -17,8 +17,8 @@
 
 import org.chromium.base.task.PostTask;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.sync.SyncAndServicesPreferences;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.sync.SyncAndServicesPreferences;
 import org.chromium.chrome.browser.signin.SigninActivity.AccessPoint;
 import org.chromium.chrome.browser.util.IntentUtils;
 import org.chromium.components.signin.metrics.SigninAccessPoint;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeSurveyController.java b/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeSurveyController.java
index d44ef52..f850513 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeSurveyController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeSurveyController.java
@@ -27,7 +27,7 @@
 import org.chromium.chrome.browser.infobar.InfoBarIdentifier;
 import org.chromium.chrome.browser.infobar.SurveyInfoBar;
 import org.chromium.chrome.browser.infobar.SurveyInfoBarDelegate;
-import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
+import org.chromium.chrome.browser.settings.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.Tab.TabHidingType;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
index bd02200..4643656 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
@@ -22,8 +22,8 @@
 import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
 import org.chromium.chrome.browser.notifications.PendingIntentProvider;
 import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.sync.SyncAndServicesPreferences;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.sync.SyncAndServicesPreferences;
 import org.chromium.chrome.browser.sync.GoogleServiceAuthError.State;
 import org.chromium.chrome.browser.sync.ui.PassphraseActivity;
 import org.chromium.components.sync.AndroidSyncSettings;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncUserDataWiper.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncUserDataWiper.java
index f8fd0e3b..07f7c501 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncUserDataWiper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncUserDataWiper.java
@@ -8,8 +8,8 @@
 import org.chromium.chrome.browser.bookmarks.BookmarkModel;
 import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
 import org.chromium.chrome.browser.browsing_data.TimePeriod;
-import org.chromium.chrome.browser.preferences.privacy.BrowsingDataBridge;
-import org.chromium.chrome.browser.preferences.privacy.BrowsingDataBridge.OnClearBrowsingDataListener;
+import org.chromium.chrome.browser.settings.privacy.BrowsingDataBridge;
+import org.chromium.chrome.browser.settings.privacy.BrowsingDataBridge.OnClearBrowsingDataListener;
 
 /**
  * A class to wipe the user's bookmarks and all types of sync data.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java
index 9b2a0fa..8ac1fd4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java
@@ -15,9 +15,9 @@
 import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.NativeInitObserver;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.sync.SyncAndServicesPreferences;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.sync.SyncAndServicesPreferences;
 import org.chromium.chrome.browser.signin.IdentityServicesProvider;
 import org.chromium.chrome.browser.signin.ProfileDataCache;
 import org.chromium.chrome.browser.signin.SigninManager;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tracing/TracingController.java b/chrome/android/java/src/org/chromium/chrome/browser/tracing/TracingController.java
index edfbb0b..53822e1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tracing/TracingController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tracing/TracingController.java
@@ -20,7 +20,7 @@
 import org.chromium.base.task.AsyncTask;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
-import org.chromium.chrome.browser.preferences.developer.TracingPreferences;
+import org.chromium.chrome.browser.settings.developer.TracingPreferences;
 import org.chromium.content_public.browser.TracingControllerAndroid;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
 import org.chromium.ui.widget.Toast;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/translate/TranslateBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/translate/TranslateBridge.java
index 4ea8fbe8..e1a8ba22 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/translate/TranslateBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/translate/TranslateBridge.java
@@ -6,7 +6,7 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.chrome.browser.preferences.languages.LanguageItem;
+import org.chromium.chrome.browser.settings.languages.LanguageItem;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.content_public.browser.WebContents;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
index e27bef4..b5e4e6c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
@@ -8,7 +8,6 @@
 
 import android.app.Activity;
 import android.content.Intent;
-import android.graphics.Bitmap;
 import android.graphics.PixelFormat;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
@@ -62,7 +61,6 @@
 import org.chromium.chrome.browser.ui.widget.TintedDrawable;
 import org.chromium.chrome.browser.usage_stats.UsageStatsService;
 import org.chromium.chrome.browser.util.AndroidTaskUtils;
-import org.chromium.chrome.browser.util.ColorUtils;
 import org.chromium.chrome.browser.webapps.dependency_injection.WebappActivityComponent;
 import org.chromium.chrome.browser.webapps.dependency_injection.WebappActivityModule;
 import org.chromium.components.embedder_support.delegate.WebContentsDelegateAndroid;
@@ -104,8 +102,6 @@
     private boolean mIsInitialized;
     private Integer mBrandColor;
 
-    private Bitmap mLargestFavicon;
-
     private static Integer sOverrideCoreCountForTesting;
 
     private WebappDelegateFactory mWebappDelegateFactory;
@@ -366,14 +362,16 @@
         mStatusBarColorProvider = component.resolveCustomTabStatusBarColorProvider();
         mStatusBarColorProvider.setUseTabThemeColor(true /* useTabThemeColor */);
 
-        component.resolveCompositorContentInitializer();
-
         mNavigationController.setFinishHandler((reason) -> { handleFinishAndClose(); });
         mNavigationController.setLandingPageOnCloseCriterion(
                 url -> WebappScopePolicy.isUrlInScope(scopePolicy(), getWebappInfo(), url));
 
         mTabObserverRegistrar = component.resolveTabObserverRegistrar();
         mSplashController = component.resolveSplashController();
+
+        component.resolveCompositorContentInitializer();
+        component.resolveTaskDescriptionHelper();
+
         return component;
     }
 
@@ -438,7 +436,7 @@
                 // Avoid situations where Android starts two Activities with the same data.
                 AndroidTaskUtils.finishOtherTasksWithData(getIntent().getData(), getTaskId());
             }
-            updateTaskDescription();
+            updateToolbarColor();
         }
         super.onResume();
     }
@@ -589,24 +587,7 @@
 
             @Override
             public void onDidChangeThemeColor(Tab tab, int color) {
-                mBrandColor = color;
-                updateTaskDescription();
-            }
-
-            @Override
-            public void onTitleUpdated(Tab tab) {
-                updateTaskDescription();
-            }
-
-            @Override
-            public void onFaviconUpdated(Tab tab, Bitmap icon) {
-                // No need to cache the favicon if there is an icon declared in app manifest.
-                if (mWebappInfo.icon() != null || icon == null) return;
-                if (mLargestFavicon == null || icon.getWidth() > mLargestFavicon.getWidth()
-                        || icon.getHeight() > mLargestFavicon.getHeight()) {
-                    mLargestFavicon = icon;
-                    updateTaskDescription();
-                }
+                updateToolbarColor();
             }
 
             @Override
@@ -672,46 +653,13 @@
         }
     }
 
-    private void updateTaskDescription() {
-        Tab tab = getActivityTab();
-
-        String title = null;
-        if (!TextUtils.isEmpty(mWebappInfo.shortName())) {
-            title = mWebappInfo.shortName();
-        } else if (tab != null) {
-            title = tab.getTitle();
-        }
-
-        Bitmap icon = null;
-        if (mWebappInfo.icon() != null) {
-            icon = mWebappInfo.icon().bitmap();
-        } else if (tab != null) {
-            icon = mLargestFavicon;
-        }
-
-        if (mBrandColor == null && mWebappInfo.hasValidToolbarColor()) {
-            mBrandColor = (int) mWebappInfo.toolbarColor();
-        }
-
-        int taskDescriptionColor =
-                ApiCompatibilityUtils.getColor(getResources(), R.color.default_primary_color);
-
-        // Don't use the brand color for the status bars if we're in display: fullscreen. This works
-        // around an issue where the status bars go transparent and can't be seen on top of the page
-        // content when users swipe them in or they appear because the on-screen keyboard was
-        // triggered.
-        if (mBrandColor != null && mWebappInfo.displayMode() != WebDisplayMode.FULLSCREEN) {
-            taskDescriptionColor = mBrandColor;
-        }
-
-        ApiCompatibilityUtils.setTaskDescription(this, title, icon,
-                ColorUtils.getOpaqueColor(taskDescriptionColor));
-
+    private void updateToolbarColor() {
         if (getToolbarManager() != null && !isStatusBarDefaultThemeColor()) {
             int toolbarColor = getBaseStatusBarColor();
             if (toolbarColor == StatusBarColorController.UNDEFINED_STATUS_BAR_COLOR) {
-                toolbarColor = (tab == null) ? mIntentDataProvider.getToolbarColor()
-                                             : TabThemeColorHelper.getColor(tab);
+                toolbarColor = (getActivityTab() == null)
+                        ? mIntentDataProvider.getToolbarColor()
+                        : TabThemeColorHelper.getColor(getActivityTab());
             }
             getToolbarManager().onThemeColorChanged(toolbarColor, false);
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityComponent.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityComponent.java
index 5dd1d2f0..974c477 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityComponent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/dependency_injection/WebappActivityComponent.java
@@ -6,6 +6,7 @@
 
 import org.chromium.chrome.browser.customtabs.CustomTabCompositorContentInitializer;
 import org.chromium.chrome.browser.customtabs.CustomTabStatusBarColorProvider;
+import org.chromium.chrome.browser.customtabs.CustomTabTaskDescriptionHelper;
 import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController;
 import org.chromium.chrome.browser.customtabs.content.TabObserverRegistrar;
 import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarCoordinator;
@@ -27,6 +28,7 @@
     CustomTabActivityNavigationController resolveNavigationController();
     CustomTabCompositorContentInitializer resolveCompositorContentInitializer();
     CustomTabStatusBarColorProvider resolveCustomTabStatusBarColorProvider();
+    CustomTabTaskDescriptionHelper resolveTaskDescriptionHelper();
     CustomTabToolbarCoordinator resolveToolbarCoordinator();
     SplashController resolveSplashController();
     TabObserverRegistrar resolveTabObserverRegistrar();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorDialog.java
index d8a03bf..7b9c83a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorDialog.java
@@ -43,9 +43,9 @@
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
-import org.chromium.chrome.browser.preferences.PreferenceUtils;
-import org.chromium.chrome.browser.preferences.autofill.CreditCardNumberFormattingTextWatcher;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.PreferenceUtils;
+import org.chromium.chrome.browser.settings.autofill.CreditCardNumberFormattingTextWatcher;
 import org.chromium.chrome.browser.ui.widget.AlwaysDismissedDialog;
 import org.chromium.chrome.browser.ui.widget.FadingEdgeScrollView;
 import org.chromium.chrome.browser.ui.widget.TintedDrawable;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorDropdownField.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorDropdownField.java
index 6349720..d83b48a7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorDropdownField.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorDropdownField.java
@@ -24,7 +24,7 @@
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.autofill.AutofillProfileBridge.DropdownKeyValue;
+import org.chromium.chrome.browser.settings.autofill.AutofillProfileBridge.DropdownKeyValue;
 import org.chromium.ui.KeyboardVisibilityDelegate;
 
 import java.util.ArrayList;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorFieldModel.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorFieldModel.java
index 0c33cbb..67fbefb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorFieldModel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/EditorFieldModel.java
@@ -12,7 +12,7 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.ContextUtils;
-import org.chromium.chrome.browser.preferences.autofill.AutofillProfileBridge.DropdownKeyValue;
+import org.chromium.chrome.browser.settings.autofill.AutofillProfileBridge.DropdownKeyValue;
 
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/OriginVerifierTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/OriginVerifierTest.java
index ad7dda7..2d83c47 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/OriginVerifierTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/OriginVerifierTest.java
@@ -22,7 +22,7 @@
 import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
 import org.chromium.chrome.browser.browsing_data.TimePeriod;
 import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
-import org.chromium.chrome.browser.preferences.privacy.BrowsingDataBridge;
+import org.chromium.chrome.browser.settings.privacy.BrowsingDataBridge;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java
index cd6155f..d5b38787 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityTest.java
@@ -168,7 +168,8 @@
         ThemeTestUtils.assertStatusBarColor(activity, Color.RED);
 
         mCustomTabActivityTestRule.loadUrl(pageWithoutThemeColor);
-        ThemeTestUtils.waitForThemeColor(activity, Color.GREEN);
+        // Use longer-than-default timeout to give page time to finish loading.
+        ThemeTestUtils.waitForThemeColor(activity, Color.GREEN, 10000 /* timeoutMs */);
         ThemeTestUtils.assertStatusBarColor(activity, Color.GREEN);
     }
 
@@ -204,7 +205,8 @@
                 () -> { return TabThemeColorHelper.getDefaultColor(activity.getActivityTab()); });
         int expectedColor =
                 Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? defaultColor : Color.BLACK;
-        ThemeTestUtils.waitForThemeColor(activity, defaultColor);
+        // Use longer-than-default timeout to give page time to finish loading.
+        ThemeTestUtils.waitForThemeColor(activity, defaultColor, 10000 /* timeoutMs */);
         ThemeTestUtils.assertStatusBarColor(activity, expectedColor);
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPreferencesUiTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPreferencesUiTest.java
index a3cb81b..9186833 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPreferencesUiTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPreferencesUiTest.java
@@ -20,15 +20,15 @@
 import org.chromium.chrome.browser.ChromeApplication;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.browserservices.Origin;
-import org.chromium.chrome.browser.preferences.ChromeImageViewPreference;
-import org.chromium.chrome.browser.preferences.ExpandablePreferenceGroup;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences;
-import org.chromium.chrome.browser.preferences.website.SingleWebsitePreferences;
-import org.chromium.chrome.browser.preferences.website.SiteSettingsCategory;
-import org.chromium.chrome.browser.preferences.website.SiteSettingsTestUtils;
-import org.chromium.chrome.browser.preferences.website.Website;
-import org.chromium.chrome.browser.preferences.website.WebsiteAddress;
+import org.chromium.chrome.browser.settings.ChromeImageViewPreference;
+import org.chromium.chrome.browser.settings.ExpandablePreferenceGroup;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.website.SingleCategoryPreferences;
+import org.chromium.chrome.browser.settings.website.SingleWebsitePreferences;
+import org.chromium.chrome.browser.settings.website.SiteSettingsCategory;
+import org.chromium.chrome.browser.settings.website.SiteSettingsTestUtils;
+import org.chromium.chrome.browser.settings.website.Website;
+import org.chromium.chrome.browser.settings.website.WebsiteAddress;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.Criteria;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataRemoverIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataRemoverIntegrationTest.java
index 8ac4d0db..8313d3f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataRemoverIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/BrowsingDataRemoverIntegrationTest.java
@@ -16,8 +16,8 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.preferences.privacy.BrowsingDataBridge;
-import org.chromium.chrome.browser.preferences.privacy.BrowsingDataBridge.OnClearBrowsingDataListener;
+import org.chromium.chrome.browser.settings.privacy.BrowsingDataBridge;
+import org.chromium.chrome.browser.settings.privacy.BrowsingDataBridge.OnClearBrowsingDataListener;
 import org.chromium.chrome.browser.webapps.TestFetchStorageCallback;
 import org.chromium.chrome.browser.webapps.WebappInfo;
 import org.chromium.chrome.browser.webapps.WebappRegistry;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelperTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelperTest.java
new file mode 100644
index 0000000..2ae3555
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelperTest.java
@@ -0,0 +1,250 @@
+// 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.
+
+package org.chromium.chrome.browser.customtabs;
+
+import static org.junit.Assert.assertEquals;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Build;
+import android.support.test.filters.MediumTest;
+
+import androidx.annotation.NonNull;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.ApiCompatibilityUtils;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.MinAndroidSdkLevel;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.ShortcutHelper;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tab.TabThemeColorHelper;
+import org.chromium.chrome.browser.webapps.WebappActivity;
+import org.chromium.chrome.browser.webapps.WebappActivityTestRule;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.ChromeTabUtils;
+import org.chromium.chrome.test.util.browser.ThemeTestUtils;
+import org.chromium.content_public.browser.test.util.TestThreadUtils;
+import org.chromium.net.test.EmbeddedTestServer;
+
+/**
+ * Tests for {@link CustomTabTaskDescriptionHelper}.
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP_MR1)
+public class CustomTabTaskDescriptionHelperTest {
+    @Rule
+    public WebappActivityTestRule mWebappActivityTestRule = new WebappActivityTestRule();
+
+    private EmbeddedTestServer mTestServer;
+
+    @Before
+    public void setUp() {
+        mTestServer = mWebappActivityTestRule.getTestServer();
+    }
+
+    /**
+     * Launches WebappActivity on webpage which provides red custom theme color. Waits till the
+     * tab's theme color switches to red.
+     */
+    private WebappActivity launchWebappOnPageWithRedThemeColor(Intent launchIntent)
+            throws Exception {
+        String pageWithThemeColor =
+                mTestServer.getURL("/chrome/test/data/android/theme_color_test.html");
+        WebappActivity webappActivity =
+                launchWebappAndWaitTillPageLoaded(launchIntent, pageWithThemeColor);
+        ThemeTestUtils.waitForThemeColor(webappActivity, Color.RED);
+        return webappActivity;
+    }
+
+    /**
+     * Tests that the task description gives preference to the theme color value provided by the
+     * web page when both the web page and the launch intent provide a custom theme color.
+     */
+    @Test
+    @MediumTest
+    public void testPageHasThemeColorThemeColorInIntent() throws Exception {
+        final int intentThemeColor = Color.GREEN;
+
+        Intent launchIntent = mWebappActivityTestRule.createIntent();
+        launchIntent.putExtra(ShortcutHelper.EXTRA_THEME_COLOR, (long) intentThemeColor);
+
+        WebappActivity webappActivity = launchWebappOnPageWithRedThemeColor(launchIntent);
+        assertEquals(Color.RED, fetchTaskDescriptionColor(webappActivity));
+    }
+
+    /**
+     * Tests that the task description falls back to using the custom theme color from the launch
+     * intent when the custom theme color is not provided by the webpage.
+     */
+    @Test
+    @MediumTest
+    public void testPageNoThemeColorThemeColorInIntent() throws Exception {
+        final int intentThemeColor = Color.GREEN;
+        final String pageWithoutThemeColorUrl =
+                mTestServer.getURL("/chrome/test/data/android/simple.html");
+
+        Intent launchIntent = mWebappActivityTestRule.createIntent();
+        launchIntent.putExtra(ShortcutHelper.EXTRA_THEME_COLOR, (long) intentThemeColor);
+        WebappActivity webappActivity = launchWebappOnPageWithRedThemeColor(launchIntent);
+        assertEquals(Color.RED, fetchTaskDescriptionColor(webappActivity));
+
+        mWebappActivityTestRule.loadUrl(pageWithoutThemeColorUrl);
+        ThemeTestUtils.waitForThemeColor(webappActivity, intentThemeColor);
+        assertEquals(intentThemeColor, fetchTaskDescriptionColor(webappActivity));
+    }
+
+    /**
+     * Tests that the task description uses R.color.default_primary_color when neither the webpage
+     * nor the launch intent provides a custom theme color.
+     */
+    @Test
+    @MediumTest
+    public void testPageNorLaunchIntentProvidesThemeColor() throws Exception {
+        final String pageWithoutThemeColorUrl =
+                mTestServer.getURL("/chrome/test/data/android/simple.html");
+
+        Intent launchIntent = mWebappActivityTestRule.createIntent();
+        WebappActivity webappActivity = launchWebappOnPageWithRedThemeColor(launchIntent);
+        assertEquals(Color.RED, fetchTaskDescriptionColor(webappActivity));
+
+        mWebappActivityTestRule.loadUrl(pageWithoutThemeColorUrl);
+        int defaultThemeColor = computeDefaultThemeColor(webappActivity);
+        ThemeTestUtils.waitForThemeColor(webappActivity, defaultThemeColor);
+        int defaultTaskDescriptionColor = ApiCompatibilityUtils.getColor(
+                webappActivity.getResources(), R.color.default_primary_color);
+        assertEquals(defaultTaskDescriptionColor, fetchTaskDescriptionColor(webappActivity));
+    }
+
+    /**
+     * Tests that the launch intent theme color is made opaque prior to being used for the task
+     * description.
+     */
+    @Test
+    @MediumTest
+    public void testLaunchIntentThemeColorMadeOpaque() throws Exception {
+        final int intentThemeColor = Color.argb(100, 0, 255, 0);
+        final int opaqueIntentThemeColor = Color.GREEN;
+        final String pageWithoutThemeColorUrl =
+                mTestServer.getURL("/chrome/test/data/android/simple.html");
+
+        Intent launchIntent = mWebappActivityTestRule.createIntent();
+        launchIntent.putExtra(ShortcutHelper.EXTRA_THEME_COLOR, (long) intentThemeColor);
+        WebappActivity webappActivity = launchWebappOnPageWithRedThemeColor(launchIntent);
+        assertEquals(Color.RED, fetchTaskDescriptionColor(webappActivity));
+
+        mWebappActivityTestRule.loadUrl(pageWithoutThemeColorUrl);
+        ThemeTestUtils.waitForThemeColor(webappActivity, opaqueIntentThemeColor);
+        assertEquals(opaqueIntentThemeColor, fetchTaskDescriptionColor(webappActivity));
+    }
+
+    /**
+     * Tests that the short_name is used in the task description when it is provided by the
+     * the launch intent.
+     */
+    @Test
+    @MediumTest
+    public void testTitleInIntent() throws Exception {
+        final String url = mTestServer.getURL("/chrome/test/data/android/simple.html");
+        final String pageTitle = "Activity test page";
+        final String intentShortName = "Intent Short Name";
+
+        Intent launchIntent = mWebappActivityTestRule.createIntent();
+        launchIntent.putExtra(ShortcutHelper.EXTRA_SHORT_NAME, intentShortName);
+        launchIntent.removeExtra(ShortcutHelper.EXTRA_NAME);
+        WebappActivity webappActivity = launchWebappAndWaitTillPageLoaded(launchIntent, url);
+
+        waitForTitle(webappActivity.getActivityTab(), pageTitle);
+        assertEquals(intentShortName, fetchTaskDescriptionLabel(webappActivity));
+    }
+
+    /**
+     * Tests that the page title is used in the task description if the launch intent provides
+    neither a name nor a short_name.
+     */
+    @Test
+    @MediumTest
+    public void testNoTitleInIntent() throws Exception {
+        final String url = mTestServer.getURL("/chrome/test/data/android/simple.html");
+        final String pageTitle = "Activity test page";
+
+        Intent launchIntent = mWebappActivityTestRule.createIntent();
+        launchIntent.removeExtra(ShortcutHelper.EXTRA_NAME);
+        launchIntent.removeExtra(ShortcutHelper.EXTRA_SHORT_NAME);
+        WebappActivity webappActivity = launchWebappAndWaitTillPageLoaded(launchIntent, url);
+
+        waitForTitle(webappActivity.getActivityTab(), pageTitle);
+        assertEquals(pageTitle, fetchTaskDescriptionLabel(webappActivity));
+    }
+
+    private WebappActivity launchWebappAndWaitTillPageLoaded(Intent launchIntent, String url) {
+        launchIntent.putExtra(ShortcutHelper.EXTRA_URL, url);
+        mWebappActivityTestRule.startWebappActivity(launchIntent);
+
+        WebappActivity webappActivity = mWebappActivityTestRule.getActivity();
+        ChromeTabUtils.waitForTabPageLoaded(webappActivity.getActivityTab(), url);
+        return webappActivity;
+    }
+
+    private void waitForTitle(Tab tab, String expectedTitle) throws Exception {
+        if (tab.getTitle().equals(expectedTitle)) return;
+
+        ChromeTabUtils.waitForTitle(tab, expectedTitle);
+    }
+
+    private int computeDefaultThemeColor(@NonNull ChromeActivity activity) throws Exception {
+        return TestThreadUtils.runOnUiThreadBlocking(
+                () -> { return TabThemeColorHelper.getDefaultColor(activity.getActivityTab()); });
+    }
+
+    /**
+     * Fetches the task description color from the ActivityManager.
+     */
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    private static int fetchTaskDescriptionColor(Activity activity) throws Exception {
+        ActivityManager.TaskDescription taskDescription =
+                (ActivityManager.TaskDescription) fetchTaskDescription(activity);
+        return (taskDescription == null) ? Color.TRANSPARENT : taskDescription.getPrimaryColor();
+    }
+
+    /**
+     * Fetches the task description label from the ActivityManager.
+     */
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    private static String fetchTaskDescriptionLabel(Activity activity) throws Exception {
+        ActivityManager.TaskDescription taskDescription =
+                (ActivityManager.TaskDescription) fetchTaskDescription(activity);
+        return (taskDescription == null) ? null : taskDescription.getLabel();
+    }
+
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    private static Object fetchTaskDescription(Activity activity) throws Exception {
+        return TestThreadUtils.runOnUiThreadBlocking(() -> {
+            try {
+                ActivityManager activityManager =
+                        (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
+                for (ActivityManager.AppTask task : activityManager.getAppTasks()) {
+                    if (activity.getTaskId() == task.getTaskInfo().id) {
+                        ActivityManager.RecentTaskInfo taskInfo = task.getTaskInfo();
+                        return (taskInfo == null) ? null : (Object) taskInfo.taskDescription;
+                    }
+                }
+            } catch (Exception e) {
+            }
+            return null;
+        });
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java
index 3e873ce4..9fe5ce8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionTest.java
@@ -40,7 +40,7 @@
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.WarmupManager;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
+import org.chromium.chrome.browser.settings.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/datareduction/DataReductionPromoUtilsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/datareduction/DataReductionPromoUtilsTest.java
index 47f01ff..ceb3850 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/datareduction/DataReductionPromoUtilsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/datareduction/DataReductionPromoUtilsTest.java
@@ -25,7 +25,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
-import org.chromium.chrome.browser.preferences.about.AboutSettingsBridge;
+import org.chromium.chrome.browser.settings.about.AboutSettingsBridge;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
 
 /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedNewTabPageCardRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedNewTabPageCardRenderTest.java
index 52fc440b..8091e2c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedNewTabPageCardRenderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/feed/FeedNewTabPageCardRenderTest.java
@@ -21,6 +21,7 @@
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
@@ -95,6 +96,7 @@
         Assert.assertEquals(mSiteSuggestions.size(), mTileGridLayout.getChildCount());
     }
 
+    @DisabledTest(message = "crbug.com/1029059")
     @Test
     @MediumTest
     @Feature({"FeedNewTabPage", "RenderTest"})
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java
index 41a82ab..4fa88fd8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java
@@ -27,7 +27,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
+import org.chromium.chrome.browser.settings.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.InfoBarTestAnimationListener;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfobarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfobarTest.java
index ca02fbc..735b2832 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfobarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/PermissionUpdateInfobarTest.java
@@ -17,8 +17,8 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
-import org.chromium.chrome.browser.preferences.website.PermissionInfo;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
+import org.chromium.chrome.browser.settings.website.PermissionInfo;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.ChromeTabUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java
index d0f2529..19b6770d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBarTest.java
@@ -21,8 +21,8 @@
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.SearchGeolocationDisclosureTabHelper;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
-import org.chromium.chrome.browser.preferences.website.PermissionInfo;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
+import org.chromium.chrome.browser.settings.website.PermissionInfo;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.InfoBarTestAnimationListener;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetricsIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetricsIntegrationTest.java
index 8d99b58..c4364be 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetricsIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetricsIntegrationTest.java
@@ -35,7 +35,7 @@
 import org.chromium.chrome.browser.download.DownloadActivity;
 import org.chromium.chrome.browser.history.HistoryActivity;
 import org.chromium.chrome.browser.omnibox.UrlBar;
-import org.chromium.chrome.browser.preferences.Preferences;
+import org.chromium.chrome.browser.settings.Preferences;
 import org.chromium.chrome.browser.tabmodel.TabLaunchType;
 import org.chromium.chrome.browser.tabmodel.TabModelUtils;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/NightModeTestUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/NightModeTestUtils.java
index 4b72fa05..485611c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/NightModeTestUtils.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/night_mode/NightModeTestUtils.java
@@ -11,7 +11,7 @@
 import org.chromium.chrome.browser.flags.FeatureUtilities;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
-import org.chromium.chrome.browser.preferences.themes.ThemePreferences;
+import org.chromium.chrome.browser.settings.themes.ThemePreferences;
 import org.chromium.chrome.test.ui.DummyUiActivity;
 
 import java.util.Arrays;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeIntentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeIntentTest.java
index c70fc353..9ab73c5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeIntentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeIntentTest.java
@@ -22,9 +22,9 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.document.ChromeLauncherActivity;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences;
-import org.chromium.chrome.browser.preferences.website.SingleWebsitePreferences;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.website.SingleCategoryPreferences;
+import org.chromium.chrome.browser.settings.website.SingleWebsitePreferences;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.ActivityUtils;
 import org.chromium.content_public.browser.test.util.Criteria;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java
index 7b01162..9ff7e4d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java
@@ -41,8 +41,8 @@
 import org.chromium.chrome.browser.permissions.PermissionTestRule;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.ui.widget.RoundedIconGenerator;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationTestRule.java
index 736f01e..1517efb 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationTestRule.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationTestRule.java
@@ -8,8 +8,8 @@
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
 
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
-import org.chromium.chrome.browser.preferences.website.PermissionInfo;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
+import org.chromium.chrome.browser.settings.website.PermissionInfo;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.browser.notifications.MockNotificationManagerProxy;
 import org.chromium.chrome.test.util.browser.notifications.MockNotificationManagerProxy.NotificationEntry;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/channels/SiteChannelsManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/channels/SiteChannelsManagerTest.java
index 6b0f22d..7622f7d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/channels/SiteChannelsManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/channels/SiteChannelsManagerTest.java
@@ -31,8 +31,8 @@
 import org.chromium.chrome.browser.notifications.NotificationManagerProxy;
 import org.chromium.chrome.browser.notifications.NotificationManagerProxyImpl;
 import org.chromium.chrome.browser.notifications.NotificationSettingsBridge;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
-import org.chromium.chrome.browser.preferences.website.PermissionInfo;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
+import org.chromium.chrome.browser.settings.website.PermissionInfo;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java
index 3aa3843..7795748 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderTest.java
@@ -14,8 +14,8 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
-import org.chromium.chrome.browser.preferences.website.PermissionInfo;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
+import org.chromium.chrome.browser.settings.website.PermissionInfo;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusViewTest.java
index 0876f14..aa29d10 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusViewTest.java
@@ -35,7 +35,6 @@
 import org.chromium.chrome.browser.ui.widget.CompositeTouchDelegate;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ui.DummyUiActivityTestCase;
-import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.ui.modelutil.PropertyModelChangeProcessor;
 import org.chromium.ui.test.util.UiRestriction;
@@ -142,7 +141,6 @@
     @MediumTest
     @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
     @Feature({"Omnibox"})
-    @EnableFeatures("OmniboxSearchEngineLogo")
     public void testSearchEngineLogo_noIncognitoPadding() {
         // Set incognito badge visible.
         runOnUiThreadBlocking(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java
index 65d9a77..c45bb14 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java
@@ -20,10 +20,10 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
-import org.chromium.chrome.browser.preferences.HomepageEditor;
-import org.chromium.chrome.browser.preferences.HomepagePreferences;
-import org.chromium.chrome.browser.preferences.Preferences;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.HomepageEditor;
+import org.chromium.chrome.browser.settings.HomepagePreferences;
+import org.chromium.chrome.browser.settings.Preferences;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
 import org.chromium.chrome.browser.tabmodel.TabList;
 import org.chromium.chrome.browser.tabmodel.TabModel;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHostTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHostTest.java
index e5dda59..a668d182 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHostTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceHostTest.java
@@ -18,7 +18,7 @@
 
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DisableIf;
+import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeSwitches;
@@ -33,6 +33,7 @@
  * Tests for the DecoderServiceHost.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
+@MinAndroidSdkLevel(Build.VERSION_CODES.N)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 public class DecoderServiceHostTest implements DecoderServiceHost.ServiceReadyCallback,
                                                DecoderServiceHost.ImagesDecodedCallback {
@@ -53,8 +54,10 @@
 
     private String mLastDecodedPath;
     private boolean mLastIsVideo;
+    private Bitmap mLastInitialFrame;
     private int mLastFrameCount;
     private String mLastVideoDuration;
+    private float mLastRatio;
 
     @Before
     public void setUp() throws Exception {
@@ -74,12 +77,14 @@
     // DecoderServiceHost.ImagesDecodedCallback:
 
     @Override
-    public void imagesDecodedCallback(
-            String filePath, boolean isVideo, List<Bitmap> bitmaps, String videoDuration) {
+    public void imagesDecodedCallback(String filePath, boolean isVideo, boolean isZoomedIn,
+            List<Bitmap> bitmaps, String videoDuration, float ratio) {
         mLastDecodedPath = filePath;
         mLastIsVideo = isVideo;
         mLastFrameCount = bitmaps != null ? bitmaps.size() : -1;
+        mLastInitialFrame = bitmaps != null ? bitmaps.get(0) : null;
         mLastVideoDuration = videoDuration;
+        mLastRatio = ratio;
 
         onDecodedCallback.notifyCalled();
     }
@@ -96,7 +101,6 @@
     }
 
     @Test
-    @DisableIf.Build(sdk_is_less_than = Build.VERSION_CODES.N)
     @LargeTest
     public void testDecodingOrder() throws Throwable {
         DecoderServiceHost host = new DecoderServiceHost(this, mContext);
@@ -111,9 +115,12 @@
         File file2 = new File(UrlUtils.getIsolatedTestFilePath(filePath + fileName2));
         File file3 = new File(UrlUtils.getIsolatedTestFilePath(filePath + fileName3));
 
-        host.decodeImage(Uri.fromFile(file1), PickerBitmap.TileTypes.VIDEO, 10, this);
-        host.decodeImage(Uri.fromFile(file2), PickerBitmap.TileTypes.VIDEO, 10, this);
-        host.decodeImage(Uri.fromFile(file3), PickerBitmap.TileTypes.PICTURE, 10, this);
+        host.decodeImage(
+                Uri.fromFile(file1), PickerBitmap.TileTypes.VIDEO, 10, /*fullWidth=*/false, this);
+        host.decodeImage(
+                Uri.fromFile(file2), PickerBitmap.TileTypes.VIDEO, 10, /*fullWidth=*/false, this);
+        host.decodeImage(
+                Uri.fromFile(file3), PickerBitmap.TileTypes.PICTURE, 10, /*fullWidth=*/false, this);
 
         // First decoding result should be first frame only of video 1.
         waitForThumbnailDecode();
@@ -153,4 +160,84 @@
 
         host.unbind(mContext);
     }
+
+    @Test
+    @LargeTest
+    public void testDecodingSizes() throws Throwable {
+        DecoderServiceHost host = new DecoderServiceHost(this, mContext);
+        host.bind(mContext);
+        waitForDecoder();
+
+        String fileName1 = "noogler.mp4"; // 1920 x 1080 video.
+        String fileName2 = "blue100x100.jpg";
+        String filePath = "chrome/test/data/android/photo_picker/";
+        File file1 = new File(UrlUtils.getIsolatedTestFilePath(filePath + fileName1));
+        File file2 = new File(UrlUtils.getIsolatedTestFilePath(filePath + fileName2));
+
+        // Thumbnail photo. 100 x 100 -> 10 x 10.
+        host.decodeImage(
+                Uri.fromFile(file2), PickerBitmap.TileTypes.PICTURE, 10, /*fullWidth=*/false, this);
+        waitForThumbnailDecode();
+        Assert.assertTrue(mLastDecodedPath.contains(fileName2));
+        Assert.assertEquals(false, mLastIsVideo);
+        Assert.assertEquals(null, mLastVideoDuration);
+        Assert.assertEquals(1, mLastFrameCount);
+        Assert.assertEquals(1.0f, mLastRatio, 0.1f);
+        Assert.assertEquals(10, mLastInitialFrame.getWidth());
+        Assert.assertEquals(10, mLastInitialFrame.getHeight());
+
+        // Full-width photo. 100 x 100 -> 200 x 200.
+        host.decodeImage(
+                Uri.fromFile(file2), PickerBitmap.TileTypes.PICTURE, 200, /*fullWidth=*/true, this);
+        waitForThumbnailDecode();
+        Assert.assertTrue(mLastDecodedPath.contains(fileName2));
+        Assert.assertEquals(false, mLastIsVideo);
+        Assert.assertEquals(null, mLastVideoDuration);
+        Assert.assertEquals(1, mLastFrameCount);
+        Assert.assertEquals(1.0f, mLastRatio, 0.1f);
+        Assert.assertEquals(200, mLastInitialFrame.getWidth());
+        Assert.assertEquals(200, mLastInitialFrame.getHeight());
+
+        // Thumbnail video. 1920 x 1080 -> 10 x 10.
+        host.decodeImage(
+                Uri.fromFile(file1), PickerBitmap.TileTypes.VIDEO, 10, /*fullWidth=*/false, this);
+        waitForThumbnailDecode(); // Initial frame.
+        Assert.assertTrue(mLastDecodedPath.contains(fileName1));
+        Assert.assertEquals(true, mLastIsVideo);
+        Assert.assertEquals("00:00", mLastVideoDuration);
+        Assert.assertEquals(1, mLastFrameCount);
+        Assert.assertEquals(0.5625f, mLastRatio, 0.0001f);
+        Assert.assertEquals(10, mLastInitialFrame.getWidth());
+        Assert.assertEquals(10, mLastInitialFrame.getHeight());
+        waitForThumbnailDecode(); // Rest of frames.
+        Assert.assertTrue(mLastDecodedPath.contains(fileName1));
+        Assert.assertEquals(true, mLastIsVideo);
+        Assert.assertEquals("00:00", mLastVideoDuration);
+        Assert.assertEquals(10, mLastFrameCount);
+        Assert.assertEquals(0.5625f, mLastRatio, 0.0001f);
+        Assert.assertEquals(10, mLastInitialFrame.getWidth());
+        Assert.assertEquals(10, mLastInitialFrame.getHeight());
+
+        // Full-width video. 1920 x 1080 -> 2000 x 1125.
+        host.decodeImage(
+                Uri.fromFile(file1), PickerBitmap.TileTypes.VIDEO, 2000, /*fullWidth=*/true, this);
+        waitForThumbnailDecode(); // Initial frame.
+        Assert.assertTrue(mLastDecodedPath.contains(fileName1));
+        Assert.assertEquals(true, mLastIsVideo);
+        Assert.assertEquals("00:00", mLastVideoDuration);
+        Assert.assertEquals(1, mLastFrameCount);
+        Assert.assertEquals(0.5625f, mLastRatio, 0.0001f);
+        Assert.assertEquals(2000, mLastInitialFrame.getWidth());
+        Assert.assertEquals(1125, mLastInitialFrame.getHeight());
+        waitForThumbnailDecode(); // Rest of frames.
+        Assert.assertTrue(mLastDecodedPath.contains(fileName1));
+        Assert.assertEquals(true, mLastIsVideo);
+        Assert.assertEquals("00:00", mLastVideoDuration);
+        Assert.assertEquals(10, mLastFrameCount);
+        Assert.assertEquals(0.5625f, mLastRatio, 0.0001f);
+        Assert.assertEquals(2000, mLastInitialFrame.getWidth());
+        Assert.assertEquals(1125, mLastInitialFrame.getHeight());
+
+        host.unbind(mContext);
+    }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceTest.java
index 298d9bc..19ce912 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/DecoderServiceTest.java
@@ -102,7 +102,7 @@
         });
     }
 
-    private void decode(String filePath, FileDescriptor fd, int size,
+    private void decode(String filePath, FileDescriptor fd, int width,
             final DecoderServiceCallback callback) throws Exception {
         Bundle bundle = new Bundle();
         bundle.putString(DecoderService.KEY_FILE_PATH, filePath);
@@ -112,7 +112,7 @@
             Assert.assertTrue(pfd != null);
         }
         bundle.putParcelable(DecoderService.KEY_FILE_DESCRIPTOR, pfd);
-        bundle.putInt(DecoderService.KEY_SIZE, size);
+        bundle.putInt(DecoderService.KEY_WIDTH, width);
 
         mIRemoteService.decodeImage(bundle, callback);
         CriteriaHelper.pollUiThread(new Criteria() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java
index a124dd1..41c649ae 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/photo_picker/PhotoPickerDialogTest.java
@@ -21,7 +21,7 @@
 
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DisableIf;
+import org.chromium.base.test.util.MinAndroidSdkLevel;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeSwitches;
@@ -44,6 +44,7 @@
  * Tests for the PhotoPickerDialog class.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
+@MinAndroidSdkLevel(Build.VERSION_CODES.LOLLIPOP) // See crbug.com/888931 for details.
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
 public class PhotoPickerDialogTest implements PhotoPickerListener, SelectionObserver<PickerBitmap>,
                                               DecoderServiceHost.ServiceReadyCallback,
@@ -213,7 +214,6 @@
     }
 
     @Test
-    @DisableIf.Build(sdk_is_less_than = Build.VERSION_CODES.LOLLIPOP, message = "crbug.com/888931")
     @LargeTest
     public void testNoSelection() throws Throwable {
         createDialog(false, Arrays.asList("image/*")); // Multi-select = false.
@@ -231,7 +231,6 @@
     }
 
     @Test
-    @DisableIf.Build(sdk_is_less_than = Build.VERSION_CODES.LOLLIPOP, message = "crbug.com/888931")
     @LargeTest
     public void testSingleSelectionPhoto() throws Throwable {
         createDialog(false, Arrays.asList("image/*")); // Multi-select = false.
@@ -261,7 +260,6 @@
     }
 
     @Test
-    @DisableIf.Build(sdk_is_less_than = Build.VERSION_CODES.LOLLIPOP, message = "crbug.com/888931")
     @LargeTest
     public void testMultiSelectionPhoto() throws Throwable {
         createDialog(true, Arrays.asList("image/*")); // Multi-select = true.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/OWNERS
deleted file mode 100644
index 8a7eebc..0000000
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://chrome/android/java/src/org/chromium/chrome/browser/preferences/OWNERS
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/password/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/password/OWNERS
deleted file mode 100644
index eb3e5f8..0000000
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/password/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://chrome/android/java/src/org/chromium/chrome/browser/preferences/password/OWNERS
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/OWNERS
deleted file mode 100644
index ff69185..0000000
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/OWNERS
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java
index 723bc28..401cf31 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/push_messaging/PushMessagingTest.java
@@ -30,7 +30,7 @@
 import org.chromium.chrome.browser.infobar.InfoBar;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.notifications.NotificationTestRule;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabImpl;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceTest.java
index 4190cf1..b60b3018f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceTest.java
@@ -16,7 +16,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.RetryOnFailure;
-import org.chromium.chrome.browser.preferences.SearchEngineAdapter;
+import org.chromium.chrome.browser.settings.SearchEngineAdapter;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
 import org.chromium.components.search_engines.TemplateUrl;
 import org.chromium.components.search_engines.TemplateUrlService;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/NotificationsPreferencesTest.java
similarity index 94%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/NotificationsPreferencesTest.java
index bc878a9..c953ee5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/NotificationsPreferencesTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.os.Build;
 import android.support.test.InstrumentationRegistry;
@@ -23,10 +23,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchPrefs;
-import org.chromium.chrome.browser.preferences.website.ContentSettingsResources;
-import org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences;
-import org.chromium.chrome.browser.preferences.website.SiteSettingsCategory;
-import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge;
+import org.chromium.chrome.browser.settings.website.ContentSettingsResources;
+import org.chromium.chrome.browser.settings.website.SingleCategoryPreferences;
+import org.chromium.chrome.browser.settings.website.SiteSettingsCategory;
+import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
 import org.chromium.chrome.browser.test.ScreenShooter;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/OWNERS
new file mode 100644
index 0000000..0eb77c3
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/OWNERS
@@ -0,0 +1 @@
+file://chrome/android/java/src/org/chromium/chrome/browser/settings/OWNERS
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PasswordViewingTypeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/PasswordViewingTypeTest.java
similarity index 97%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PasswordViewingTypeTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/PasswordViewingTypeTest.java
index ae4b7210..7c143e15 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PasswordViewingTypeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/PasswordViewingTypeTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import android.accounts.Account;
 import android.app.Activity;
@@ -21,7 +21,7 @@
 
 import org.chromium.base.test.BaseJUnit4ClassRunner;
 import org.chromium.base.test.util.Feature;
-import org.chromium.chrome.browser.preferences.password.SavePasswordsPreferences;
+import org.chromium.chrome.browser.settings.password.SavePasswordsPreferences;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
 import org.chromium.components.signin.AccountManagerFacade;
 import org.chromium.components.signin.test.util.AccountHolder;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/PreferencesTest.java
similarity index 97%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/PreferencesTest.java
index aa2c502..2fdf5a5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/PreferencesTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.action.ViewActions.click;
@@ -35,10 +35,12 @@
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.accessibility.FontSizePrefs;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
-import org.chromium.chrome.browser.preferences.website.PermissionInfo;
-import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridgeJni;
+import org.chromium.chrome.browser.preferences.Pref;
+import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
+import org.chromium.chrome.browser.settings.website.PermissionInfo;
+import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridgeJni;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.ActivityUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill/AutofillProfilesFragmentTest.java
similarity index 98%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragmentTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill/AutofillProfilesFragmentTest.java
index 24f5ede..f69cbac 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill/AutofillProfilesFragmentTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill;
+package org.chromium.chrome.browser.settings.autofill;
 
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.MediumTest;
@@ -22,8 +22,8 @@
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.PreferencesTest;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.PreferencesTest;
 import org.chromium.content_public.browser.test.util.Criteria;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill/AutofillTestRule.java
similarity index 98%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillTestRule.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill/AutofillTestRule.java
index d71a193..619aebda 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillTestRule.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill/AutofillTestRule.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill;
+package org.chromium.chrome.browser.settings.autofill;
 
 import android.view.KeyEvent;
 import android.widget.EditText;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill/OWNERS
similarity index 100%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/OWNERS
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill/OWNERS
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantPreferencesTest.java
similarity index 95%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferencesTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantPreferencesTest.java
index 3752717..ac52ae2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/AutofillAssistantPreferencesTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.autofill_assistant;
+package org.chromium.chrome.browser.settings.autofill_assistant;
 
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.not;
@@ -23,10 +23,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.history.HistoryActivity;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
-import org.chromium.chrome.browser.preferences.MainPreferences;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.PreferencesTest;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.MainPreferences;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.PreferencesTest;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill_assistant/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS
similarity index 100%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill_assistant/OWNERS
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/autofill_assistant/OWNERS
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionStatsPreferenceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/datareduction/DataReductionStatsPreferenceTest.java
similarity index 99%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionStatsPreferenceTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/datareduction/DataReductionStatsPreferenceTest.java
index fdcf88f..232054e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionStatsPreferenceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/datareduction/DataReductionStatsPreferenceTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.datareduction;
+package org.chromium.chrome.browser.settings.datareduction;
 
 import static org.chromium.third_party.android.datausagechart.ChartDataUsageView.MAXIMUM_DAYS_IN_CHART;
 import static org.chromium.third_party.android.datausagechart.ChartDataUsageView.MINIMUM_DAYS_IN_CHART;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/developer/TracingPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/developer/TracingPreferencesTest.java
similarity index 97%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/developer/TracingPreferencesTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/developer/TracingPreferencesTest.java
index dc9e263b..4a3c49f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/developer/TracingPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/developer/TracingPreferencesTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.developer;
+package org.chromium.chrome.browser.settings.developer;
 
 import static android.app.Notification.FLAG_ONGOING_EVENT;
 
@@ -33,10 +33,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.preferences.ButtonPreference;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.TextMessagePreference;
+import org.chromium.chrome.browser.settings.ButtonPreference;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.TextMessagePreference;
 import org.chromium.chrome.browser.tracing.TracingController;
 import org.chromium.chrome.browser.tracing.TracingNotificationManager;
 import org.chromium.chrome.test.ChromeActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/password/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/password/OWNERS
new file mode 100644
index 0000000..381bfca4
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/password/OWNERS
@@ -0,0 +1 @@
+file://chrome/android/java/src/org/chromium/chrome/browser/settings/password/OWNERS
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/password/SavePasswordsPreferencesTest.java
similarity index 99%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferencesTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/password/SavePasswordsPreferencesTest.java
index 946541f..9cc4e8b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/password/SavePasswordsPreferencesTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import static android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu;
 import static android.support.test.espresso.action.ViewActions.click;
@@ -94,13 +94,13 @@
 import org.chromium.chrome.browser.history.HistoryActivity;
 import org.chromium.chrome.browser.history.HistoryManager;
 import org.chromium.chrome.browser.history.StubbedHistoryProvider;
-import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.PreferencesTest;
+import org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.PreferencesTest;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
 import org.chromium.chrome.test.util.browser.Features;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataBridgeTest.java
similarity index 99%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataBridgeTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataBridgeTest.java
index 3817ba7a..bdf46c2d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataBridgeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataBridgeTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import static org.junit.Assert.assertThat;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataTest.java
similarity index 98%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataTest.java
index 1fbf1d4..506451e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/BrowsingDataTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/BrowsingDataTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasicTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesBasicTest.java
similarity index 97%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasicTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesBasicTest.java
index 9f41627..bd191b9d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasicTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesBasicTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.not;
@@ -24,8 +24,8 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.privacy.ClearBrowsingDataPreferences.DialogOption;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.privacy.ClearBrowsingDataPreferences.DialogOption;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesTest.java
similarity index 98%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesTest.java
index 3ee7915..10fe653 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/ClearBrowsingDataPreferencesTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -39,8 +39,8 @@
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.browsing_data.ClearBrowsingDataTab;
 import org.chromium.chrome.browser.notifications.channels.SiteChannelsManager;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.privacy.ClearBrowsingDataPreferences.DialogOption;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.privacy.ClearBrowsingDataPreferences.DialogOption;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabState;
 import org.chromium.chrome.browser.webapps.TestFetchStorageCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/OWNERS b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/OWNERS
new file mode 100644
index 0000000..ffb7b41
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/OWNERS
@@ -0,0 +1 @@
+file://chrome/android/java/src/org/chromium/chrome/browser/settings/privacy/OWNERS
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManagerNativeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManagerNativeTest.java
similarity index 98%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManagerNativeTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManagerNativeTest.java
index 46771d1..b07e2fa1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManagerNativeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManagerNativeTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import android.content.Context;
 import android.content.SharedPreferences;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/themes/ThemePreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/themes/ThemePreferencesTest.java
similarity index 95%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/themes/ThemePreferencesTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/themes/ThemePreferencesTest.java
index ac99e361b..4e463fc 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/themes/ThemePreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/themes/ThemePreferencesTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.themes;
+package org.chromium.chrome.browser.settings.themes;
 
 import static org.chromium.chrome.browser.ChromeFeatureList.ANDROID_NIGHT_MODE;
 import static org.chromium.chrome.browser.preferences.ChromePreferenceKeys.UI_THEME_SETTING_KEY;
@@ -22,10 +22,10 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.flags.FeatureUtilities;
 import org.chromium.chrome.browser.night_mode.NightModeUtils;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.PreferencesTest;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
-import org.chromium.chrome.browser.preferences.themes.ThemePreferences.ThemeSetting;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.PreferencesTest;
+import org.chromium.chrome.browser.settings.themes.ThemePreferences.ThemeSetting;
 import org.chromium.chrome.browser.ui.widget.RadioButtonWithDescription;
 import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
 import org.chromium.chrome.test.ui.DummyUiActivityTestCase;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/ManageSpaceActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivityTest.java
similarity index 97%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/ManageSpaceActivityTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivityTest.java
index 00b50c9..f9ecd4f9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/ManageSpaceActivityTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/ManageSpaceActivityTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.annotation.TargetApi;
 import android.content.Intent;
@@ -25,7 +25,7 @@
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.preferences.privacy.BrowsingDataBridge;
+import org.chromium.chrome.browser.settings.privacy.BrowsingDataBridge;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.test.util.Criteria;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/PermissionInfoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/PermissionInfoTest.java
similarity index 98%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/PermissionInfoTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/PermissionInfoTest.java
index 9d16562ff..0076d59 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/PermissionInfoTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/PermissionInfoTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.support.test.filters.SmallTest;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsPreferencesTest.java
similarity index 98%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferencesTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsPreferencesTest.java
index e3b17ea6..a9e4df0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsPreferencesTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
@@ -26,12 +26,12 @@
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
-import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
-import org.chromium.chrome.browser.preferences.LocationSettings;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.Preferences;
+import org.chromium.chrome.browser.settings.ChromeBaseCheckBoxPreference;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.LocationSettings;
+import org.chromium.chrome.browser.settings.Preferences;
 import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.InfoBarTestAnimationListener;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsTestUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsTestUtils.java
similarity index 91%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsTestUtils.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsTestUtils.java
index 911df4c..eb9dc34 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsTestUtils.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/SiteSettingsTestUtils.java
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.test.InstrumentationRegistry;
 
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
 
 /**
  * Util functions for testing SiteSettings functionality.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/WebsiteAddressTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/WebsiteAddressTest.java
similarity index 98%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/WebsiteAddressTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/WebsiteAddressTest.java
index d21542a..8d6af81 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/WebsiteAddressTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/WebsiteAddressTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.support.test.filters.SmallTest;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcherTest.java
similarity index 99%
rename from chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcherTest.java
rename to chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcherTest.java
index 40e00c0d..74f10e1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/WebsitePermissionsFetcherTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/website/WebsitePermissionsFetcherTest.java
@@ -3,7 +3,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.website;
+package org.chromium.chrome.browser.settings.website;
 
 import android.support.test.filters.SmallTest;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninTest.java
index 3bda56a4..b9178e2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninTest.java
@@ -30,13 +30,13 @@
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.SyncFirstSetupCompleteSource;
 import org.chromium.chrome.browser.bookmarks.BookmarkBridge;
-import org.chromium.chrome.browser.preferences.MainPreferences;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.sync.AccountManagementFragment;
-import org.chromium.chrome.browser.preferences.sync.SignInPreference;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.settings.MainPreferences;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.sync.AccountManagementFragment;
+import org.chromium.chrome.browser.settings.sync.SignInPreference;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
 import org.chromium.chrome.browser.tab.TabImpl;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java
index b136459..fb9af5a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java
@@ -30,8 +30,8 @@
 import org.chromium.chrome.browser.firstrun.FirstRunActivity.FirstRunActivityObserver;
 import org.chromium.chrome.browser.firstrun.FirstRunFlowSequencer;
 import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.sync.AccountManagementFragment;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.sync.AccountManagementFragment;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.ActivityUtils;
 import org.chromium.chrome.test.util.browser.signin.SigninTestUtil;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncPreferencesTest.java
index 68ffc2b..304c866 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncPreferencesTest.java
@@ -28,9 +28,9 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.sync.ManageSyncPreferences;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.sync.ManageSyncPreferences;
 import org.chromium.chrome.browser.sync.ui.PassphraseCreationDialogFragment;
 import org.chromium.chrome.browser.sync.ui.PassphraseDialogFragment;
 import org.chromium.chrome.browser.sync.ui.PassphraseTypeDialogFragment;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java
index 6243159..7302c65 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java
@@ -28,10 +28,10 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.sync.SyncAndServicesPreferences;
+import org.chromium.chrome.browser.settings.ChromeSwitchPreference;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.sync.SyncAndServicesPreferences;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.ApplicationTestUtils;
 import org.chromium.chrome.test.util.browser.sync.SyncTestUtil;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserDialogTest.java
index 8c622766..2d832c02 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserDialogTest.java
@@ -26,8 +26,8 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
-import org.chromium.chrome.browser.preferences.website.PermissionInfo;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
+import org.chromium.chrome.browser.settings.website.PermissionInfo;
 import org.chromium.chrome.browser.vr.rules.ChromeTabbedActivityVrTestRule;
 import org.chromium.chrome.browser.vr.util.NativeUiUtils;
 import org.chromium.chrome.browser.vr.util.RenderTestUtils;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java
index c6ac75a9..dee4b19 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java
@@ -36,9 +36,9 @@
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.ntp.IncognitoNewTabPage;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.website.SingleWebsitePreferences;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.website.SingleWebsitePreferences;
 import org.chromium.chrome.browser.util.UrlConstants;
 import org.chromium.chrome.browser.vr.mock.MockVrDaydreamApi;
 import org.chromium.chrome.browser.vr.rules.ChromeTabbedActivityVrTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
index 0f51583..fc6c9df 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebappSplashScreenTest.java
@@ -27,14 +27,15 @@
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.task.PostTask;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ShortcutHelper;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabTestUtils;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
+import org.chromium.ui.test.util.UiRestriction;
 import org.chromium.webapk.lib.common.splash.R;
 
 /**
@@ -78,11 +79,11 @@
                 background.getColor());
     }
 
-    @DisabledTest(message = "crbug.com/1028628")
     @Test
     @SmallTest
     @Feature({"Webapps"})
     @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE)
     public void testThemeColorWhenNotSpecified() {
         mActivityTestRule.startWebappActivityAndWaitForSplashScreen();
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) 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 e118921..d7dc231 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
@@ -32,7 +32,7 @@
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.chrome.browser.flags.FeatureUtilities;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
-import org.chromium.chrome.browser.preferences.themes.ThemePreferences;
+import org.chromium.chrome.browser.settings.themes.ThemePreferences;
 
 /**
  * Unit tests for {@link GlobalNightModeStateController}.
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateProviderHolderTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateProviderHolderTest.java
index 20e3137..3e356bd 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateProviderHolderTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateProviderHolderTest.java
@@ -17,7 +17,7 @@
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.chrome.browser.flags.FeatureUtilities;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
-import org.chromium.chrome.browser.preferences.themes.ThemePreferences;
+import org.chromium.chrome.browser.settings.themes.ThemePreferences;
 
 /**
  * Unit tests for {@link GlobalNightModeStateProviderHolder}.
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderUnitTest.java
index 125c92db..2487e389 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/geo/GeolocationHeaderUnitTest.java
@@ -32,9 +32,9 @@
 import org.chromium.base.test.util.JniMocker;
 import org.chromium.chrome.browser.omnibox.geo.VisibleNetworks.VisibleCell;
 import org.chromium.chrome.browser.omnibox.geo.VisibleNetworks.VisibleWifi;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
-import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge;
-import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridgeJni;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
+import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
+import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridgeJni;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.util.UrlUtilities;
 import org.chromium.chrome.browser.util.UrlUtilitiesJni;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java
index e03d42cc..98ac6802 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java
@@ -35,9 +35,9 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ContentSettingsType;
-import org.chromium.chrome.browser.preferences.website.ContentSettingValues;
-import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridge;
-import org.chromium.chrome.browser.preferences.website.WebsitePreferenceBridgeJni;
+import org.chromium.chrome.browser.settings.website.ContentSettingValues;
+import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridge;
+import org.chromium.chrome.browser.settings.website.WebsitePreferenceBridgeJni;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.chrome.test.util.browser.LocationSettingsTestUtil;
 import org.chromium.ui.base.AndroidPermissionDelegate;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/OWNERS b/chrome/android/junit/src/org/chromium/chrome/browser/preferences/OWNERS
index 8a7eebc..aca697b 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/OWNERS
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/preferences/OWNERS
@@ -1 +1 @@
-file://chrome/android/java/src/org/chromium/chrome/browser/preferences/OWNERS
+file://chrome/browser/preferences/OWNERS
\ No newline at end of file
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/OWNERS b/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/OWNERS
deleted file mode 100644
index eb3e5f8..0000000
--- a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://chrome/android/java/src/org/chromium/chrome/browser/preferences/password/OWNERS
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/settings/OWNERS b/chrome/android/junit/src/org/chromium/chrome/browser/settings/OWNERS
new file mode 100644
index 0000000..0eb77c3
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/settings/OWNERS
@@ -0,0 +1 @@
+file://chrome/android/java/src/org/chromium/chrome/browser/settings/OWNERS
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/SearchEngineAdapterTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/settings/SearchEngineAdapterTest.java
similarity index 98%
rename from chrome/android/junit/src/org/chromium/chrome/browser/preferences/SearchEngineAdapterTest.java
rename to chrome/android/junit/src/org/chromium/chrome/browser/settings/SearchEngineAdapterTest.java
index 9b13a44..6ec1f3dd 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/SearchEngineAdapterTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/settings/SearchEngineAdapterTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences;
+package org.chromium.chrome.browser.settings;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.contains;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/about/AboutSettingsBridgeTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/settings/about/AboutSettingsBridgeTest.java
similarity index 96%
rename from chrome/android/junit/src/org/chromium/chrome/browser/preferences/about/AboutSettingsBridgeTest.java
rename to chrome/android/junit/src/org/chromium/chrome/browser/settings/about/AboutSettingsBridgeTest.java
index 9327203..992f236 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/about/AboutSettingsBridgeTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/settings/about/AboutSettingsBridgeTest.java
@@ -4,7 +4,7 @@
 
 // generate_java_test.py
 
-package org.chromium.chrome.browser.preferences.about;
+package org.chromium.chrome.browser.settings.about;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.doReturn;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/DialogManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/DialogManagerTest.java
similarity index 98%
rename from chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/DialogManagerTest.java
rename to chrome/android/junit/src/org/chromium/chrome/browser/settings/password/DialogManagerTest.java
index f0cdde0..d8824ef 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/DialogManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/DialogManagerTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.mock;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/EnsureAsyncPostingRule.java b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/EnsureAsyncPostingRule.java
similarity index 95%
rename from chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/EnsureAsyncPostingRule.java
rename to chrome/android/junit/src/org/chromium/chrome/browser/settings/password/EnsureAsyncPostingRule.java
index 9637309..59eda79 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/EnsureAsyncPostingRule.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/EnsureAsyncPostingRule.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import org.junit.rules.ExternalResource;
 import org.robolectric.Robolectric;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/ExportWarningDialogFragmentTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/ExportWarningDialogFragmentTest.java
similarity index 95%
rename from chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/ExportWarningDialogFragmentTest.java
rename to chrome/android/junit/src/org/chromium/chrome/browser/settings/password/ExportWarningDialogFragmentTest.java
index 65b823e..6df55bb 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/ExportWarningDialogFragmentTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/ExportWarningDialogFragmentTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import android.support.v4.app.FragmentActivity;
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/OWNERS b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/OWNERS
new file mode 100644
index 0000000..381bfca4
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/OWNERS
@@ -0,0 +1 @@
+file://chrome/android/java/src/org/chromium/chrome/browser/settings/password/OWNERS
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragmentTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/PasswordReauthenticationFragmentTest.java
similarity index 98%
rename from chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragmentTest.java
rename to chrome/android/junit/src/org/chromium/chrome/browser/settings/password/PasswordReauthenticationFragmentTest.java
index 9d69f9c..f08ea41 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/PasswordReauthenticationFragmentTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/PasswordReauthenticationFragmentTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/ReauthenticationManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/ReauthenticationManagerTest.java
similarity index 99%
rename from chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/ReauthenticationManagerTest.java
rename to chrome/android/junit/src/org/chromium/chrome/browser/settings/password/ReauthenticationManagerTest.java
index af7b465..5379968 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/ReauthenticationManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/ReauthenticationManagerTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/SingleThreadBarrierClosureTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/SingleThreadBarrierClosureTest.java
similarity index 96%
rename from chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/SingleThreadBarrierClosureTest.java
rename to chrome/android/junit/src/org/chromium/chrome/browser/settings/password/SingleThreadBarrierClosureTest.java
index 7dfb2e2e..64b08df 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/SingleThreadBarrierClosureTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/SingleThreadBarrierClosureTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/TimedCallbackDelayerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/TimedCallbackDelayerTest.java
similarity index 96%
rename from chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/TimedCallbackDelayerTest.java
rename to chrome/android/junit/src/org/chromium/chrome/browser/settings/password/TimedCallbackDelayerTest.java
index b3c0b85..e6f1b206 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/password/TimedCallbackDelayerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/settings/password/TimedCallbackDelayerTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.password;
+package org.chromium.chrome.browser.settings.password;
 
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManagerTest.java
similarity index 98%
rename from chrome/android/junit/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManagerTest.java
rename to chrome/android/junit/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManagerTest.java
index 79d769a..fbb9e95 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferencesManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/settings/privacy/PrivacyPreferencesManagerTest.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.preferences.privacy;
+package org.chromium.chrome.browser.settings.privacy;
 
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.mock;
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 37ac50a..9674b49d 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -9017,16 +9017,16 @@
 
       <!-- Shelf strings -->
       <if expr="chromeos">
-        <message name="IDS_LAUNCHER_CONTEXT_MENU_CLOSE" desc="Title text for the 'close' context menu item of the launcher">
+        <message name="IDS_SHELF_CONTEXT_MENU_CLOSE" desc="Title text for the 'close' context menu item of the shelf">
           Close
         </message>
-        <message name="IDS_LAUNCHER_CONTEXT_MENU_PIN" desc="Title text for the 'pin' context menu item of the launcher">
+        <message name="IDS_SHELF_CONTEXT_MENU_PIN" desc="Title text for the 'pin' context menu item of the shelf">
           Pin
         </message>
-        <message name="IDS_LAUNCHER_CONTEXT_MENU_UNPIN" desc="Title text for the 'unpin' context menu item of the launcher">
+        <message name="IDS_SHELF_CONTEXT_MENU_UNPIN" desc="Title text for the 'unpin' context menu item of the shelf">
           Unpin
         </message>
-        <message name="IDS_LAUNCHER_CONTEXT_MENU_PIN_ENFORCED_BY_POLICY" desc="Short text for the pin/unpin context menu to tell user the setting is enforced by policy of a shelf item">
+        <message name="IDS_SHELF_CONTEXT_MENU_PIN_ENFORCED_BY_POLICY" desc="Short text for the pin/unpin context menu to tell user the setting is enforced by policy of a shelf item">
           Pinned by administrator
         </message>
       </if>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 2515d94..f3682ed0 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -903,6 +903,8 @@
     "net/proxy_service_factory.h",
     "net/referrer.cc",
     "net/referrer.h",
+    "net/referrer_policy_policy_handler.cc",
+    "net/referrer_policy_policy_handler.h",
     "net/secure_dns_policy_handler.cc",
     "net/secure_dns_policy_handler.h",
     "net/service_providers_win.cc",
@@ -3828,6 +3830,8 @@
       "notifications/win/notification_template_builder.h",
       "performance_monitor/wmi_refresher.cc",
       "performance_monitor/wmi_refresher.h",
+      "sync/roaming_profile_directory_deleter_win.cc",
+      "sync/roaming_profile_directory_deleter_win.h",
       "taskbar/taskbar_decorator_win.cc",
       "taskbar/taskbar_decorator_win.h",
       "win/util_win_service.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 065b84b..1375202 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -580,22 +580,35 @@
 #if defined(OS_ANDROID)
 const FeatureEntry::FeatureParam
     kInterestFeedLargerImagesFeatureVariationConstant[] = {
-        {"feed_ui_enabled", "true"}};
+        {"feed_ui_enabled", "true"},
+        {"snippets_enabled", "false"},
+        {"undoable_actions_enabled", "false"},
+        {"manage_interests_enabled", "false"},
+        {"card_menu_tooltip_eligible", "false"}};
 const FeatureEntry::FeatureParam
     kInterestFeedSnippetsFeatureVariationConstant[] = {
-        {"snippets_enabled", "true"}};
+        {"feed_ui_enabled", "false"},
+        {"snippets_enabled", "true"},
+        {"undoable_actions_enabled", "false"},
+        {"manage_interests_enabled", "false"},
+        {"card_menu_tooltip_eligible", "false"}};
 const FeatureEntry::FeatureParam
     kInterestFeedLargeImagesAndSnippetsFeatureVariationConstant[] = {
         {"feed_ui_enabled", "true"},
-        {"snippets_enabled", "true"}};
+        {"snippets_enabled", "true"},
+        {"undoable_actions_enabled", "false"},
+        {"manage_interests_enabled", "false"},
+        {"card_menu_tooltip_eligible", "false"}};
 const FeatureEntry::FeatureParam
     kInterestFeedLargerImagesWithUndoableActionsFeatureVariationConstant[] = {
         {"feed_ui_enabled", "true"},
+        {"snippets_enabled", "false"},
         {"undoable_actions_enabled", "true"},
         {"manage_interests_enabled", "true"},
         {"card_menu_tooltip_eligible", "true"}};
 const FeatureEntry::FeatureParam
     kInterestFeedSnippetsWithUndoableActionsFeatureVariationConstant[] = {
+        {"feed_ui_enabled", "false"},
         {"snippets_enabled", "true"},
         {"undoable_actions_enabled", "true"},
         {"manage_interests_enabled", "true"},
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
index 1cf8d3b1..c6b8f1c 100644
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
@@ -158,6 +158,7 @@
     &kOverlayNewLayout,
     &kPayWithGoogleV1,
     &kPhotoPickerVideoSupport,
+    &kPhotoPickerZoom,
     &kReachedCodeProfiler,
     &kReaderModeInCCT,
     &kReorderBookmarks,
@@ -491,6 +492,9 @@
 const base::Feature kPhotoPickerVideoSupport{"PhotoPickerVideoSupport",
                                              base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kPhotoPickerZoom{"PhotoPickerZoom",
+                                     base::FEATURE_DISABLED_BY_DEFAULT};
+
 const base::Feature kReachedCodeProfiler{"ReachedCodeProfiler",
                                          base::FEATURE_DISABLED_BY_DEFAULT};
 
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h
index 83345d7..dca0320 100644
--- a/chrome/browser/android/chrome_feature_list.h
+++ b/chrome/browser/android/chrome_feature_list.h
@@ -91,6 +91,7 @@
 extern const base::Feature kOverlayNewLayout;
 extern const base::Feature kPayWithGoogleV1;
 extern const base::Feature kPhotoPickerVideoSupport;
+extern const base::Feature kPhotoPickerZoom;
 extern const base::Feature kReachedCodeProfiler;
 extern const base::Feature kReorderBookmarks;
 extern const base::Feature kReaderModeInCCT;
diff --git a/chrome/browser/android/metrics/javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java b/chrome/browser/android/metrics/javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java
index 96f91e4..b6f6945 100644
--- a/chrome/browser/android/metrics/javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java
+++ b/chrome/browser/android/metrics/javatests/src/org/chromium/chrome/browser/metrics/UkmTest.java
@@ -19,8 +19,8 @@
 import org.chromium.chrome.browser.browsing_data.BrowsingDataType;
 import org.chromium.chrome.browser.browsing_data.TimePeriod;
 import org.chromium.chrome.browser.metrics.util.UkmUtilsForTest;
-import org.chromium.chrome.browser.preferences.privacy.BrowsingDataBridge;
-import org.chromium.chrome.browser.preferences.privacy.BrowsingDataBridge.OnClearBrowsingDataListener;
+import org.chromium.chrome.browser.settings.privacy.BrowsingDataBridge;
+import org.chromium.chrome.browser.settings.privacy.BrowsingDataBridge.OnClearBrowsingDataListener;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
diff --git a/chrome/browser/apps/platform_apps/app_shim_registry_mac.cc b/chrome/browser/apps/platform_apps/app_shim_registry_mac.cc
index 654c3eb..c64d660e 100644
--- a/chrome/browser/apps/platform_apps/app_shim_registry_mac.cc
+++ b/chrome/browser/apps/platform_apps/app_shim_registry_mac.cc
@@ -102,6 +102,31 @@
   SetAppInfo(app_id, nullptr, &last_active_profiles);
 }
 
+std::set<std::string> AppShimRegistry::GetInstalledAppsForProfile(
+    const base::FilePath& profile) const {
+  std::set<std::string> result;
+  const base::DictionaryValue* app_shims =
+      GetPrefService()->GetDictionary(kAppShims);
+  if (!app_shims)
+    return result;
+  for (base::DictionaryValue::Iterator iter_app(*app_shims);
+       !iter_app.IsAtEnd(); iter_app.Advance()) {
+    const base::Value* installed_profiles_list =
+        iter_app.value().FindListKey(kInstalledProfiles);
+    if (!installed_profiles_list)
+      continue;
+    for (const auto& profile_path_value : installed_profiles_list->GetList()) {
+      if (!profile_path_value.is_string())
+        continue;
+      if (profile == GetFullProfilePath(profile_path_value.GetString())) {
+        result.insert(iter_app.key());
+        break;
+      }
+    }
+  }
+  return result;
+}
+
 void AppShimRegistry::SetPrefServiceAndUserDataDirForTesting(
     PrefService* pref_service,
     const base::FilePath& user_data_dir) {
diff --git a/chrome/browser/apps/platform_apps/app_shim_registry_mac.h b/chrome/browser/apps/platform_apps/app_shim_registry_mac.h
index 412d3f4..e2195df4 100644
--- a/chrome/browser/apps/platform_apps/app_shim_registry_mac.h
+++ b/chrome/browser/apps/platform_apps/app_shim_registry_mac.h
@@ -59,6 +59,11 @@
   void OnAppQuit(const std::string& app_id,
                  std::set<base::FilePath> active_profiles);
 
+  // Return all apps installed for the specified profile. Used to delete apps
+  // when a profile is removed.
+  std::set<std::string> GetInstalledAppsForProfile(
+      const base::FilePath& profile) const;
+
   // Helper functions for testing.
   void SetPrefServiceAndUserDataDirForTesting(
       PrefService* pref_service,
diff --git a/chrome/browser/apps/platform_apps/app_shim_registry_mac_unittest.cc b/chrome/browser/apps/platform_apps/app_shim_registry_mac_unittest.cc
index 65889733..aa923b5 100644
--- a/chrome/browser/apps/platform_apps/app_shim_registry_mac_unittest.cc
+++ b/chrome/browser/apps/platform_apps/app_shim_registry_mac_unittest.cc
@@ -112,4 +112,60 @@
   EXPECT_EQ(0u, registry_->GetLastActiveProfilesForApp(app_id_a).size());
 }
 
+TEST_F(AppShimRegistryTest, InstalledAppsForProfile) {
+  const std::string app_id_a("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
+  const std::string app_id_b("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
+  const base::FilePath profile_path_a("/x/y/z/Profile A");
+  const base::FilePath profile_path_b("/x/y/z/Profile B");
+  const base::FilePath profile_path_c("/x/y/z/Profile C");
+  std::set<std::string> apps;
+
+  // App A is installed for profiles B and C.
+  registry_->OnAppInstalledForProfile(app_id_a, profile_path_b);
+  registry_->OnAppInstalledForProfile(app_id_a, profile_path_c);
+  EXPECT_EQ(2u, registry_->GetInstalledProfilesForApp(app_id_a).size());
+  apps = registry_->GetInstalledAppsForProfile(profile_path_a);
+  EXPECT_TRUE(apps.empty());
+  apps = registry_->GetInstalledAppsForProfile(profile_path_b);
+  EXPECT_EQ(1u, apps.size());
+  EXPECT_EQ(1u, apps.count(app_id_a));
+  apps = registry_->GetInstalledAppsForProfile(profile_path_c);
+  EXPECT_EQ(1u, apps.size());
+  EXPECT_EQ(1u, apps.count(app_id_a));
+
+  // App B is installed for profiles A and C.
+  registry_->OnAppInstalledForProfile(app_id_b, profile_path_a);
+  registry_->OnAppInstalledForProfile(app_id_b, profile_path_c);
+  apps = registry_->GetInstalledAppsForProfile(profile_path_a);
+  EXPECT_EQ(1u, apps.size());
+  EXPECT_EQ(1u, apps.count(app_id_b));
+  apps = registry_->GetInstalledAppsForProfile(profile_path_b);
+  EXPECT_EQ(1u, apps.size());
+  EXPECT_EQ(1u, apps.count(app_id_a));
+  apps = registry_->GetInstalledAppsForProfile(profile_path_c);
+  EXPECT_EQ(2u, apps.size());
+  EXPECT_EQ(1u, apps.count(app_id_a));
+  EXPECT_EQ(1u, apps.count(app_id_b));
+
+  // Uninstall app A for profile B.
+  EXPECT_FALSE(registry_->OnAppUninstalledForProfile(app_id_a, profile_path_b));
+  apps = registry_->GetInstalledAppsForProfile(profile_path_b);
+  EXPECT_TRUE(apps.empty());
+  apps = registry_->GetInstalledAppsForProfile(profile_path_c);
+  EXPECT_EQ(2u, apps.size());
+  EXPECT_EQ(1u, apps.count(app_id_a));
+  EXPECT_EQ(1u, apps.count(app_id_b));
+
+  // Uninstall app A for profile C.
+  EXPECT_TRUE(registry_->OnAppUninstalledForProfile(app_id_a, profile_path_c));
+  apps = registry_->GetInstalledAppsForProfile(profile_path_c);
+  EXPECT_EQ(1u, apps.size());
+  EXPECT_EQ(1u, apps.count(app_id_b));
+
+  // Uninstall app B for profile C.
+  EXPECT_FALSE(registry_->OnAppUninstalledForProfile(app_id_b, profile_path_c));
+  apps = registry_->GetInstalledAppsForProfile(profile_path_c);
+  EXPECT_TRUE(apps.empty());
+}
+
 }  // namespace
diff --git a/chrome/browser/apps/platform_apps/shortcut_manager.cc b/chrome/browser/apps/platform_apps/shortcut_manager.cc
index 0572d07..00966cd2 100644
--- a/chrome/browser/apps/platform_apps/shortcut_manager.cc
+++ b/chrome/browser/apps/platform_apps/shortcut_manager.cc
@@ -38,6 +38,15 @@
 
 namespace {
 
+#if defined(OS_MACOSX)
+bool UseAppShimRegistry(content::BrowserContext* browser_context,
+                        const Extension* extension) {
+  if (browser_context->IsOffTheRecord())
+    return false;
+  return extension->is_app() && extension->from_bookmark();
+}
+#endif
+
 // This version number is stored in local prefs to check whether app shortcuts
 // need to be recreated. This might happen when we change various aspects of app
 // shortcuts like command-line flags or associated icons, binaries, etc.
@@ -105,6 +114,23 @@
   }
 }
 
+void AppShortcutManager::OnExtensionLoaded(
+    content::BrowserContext* browser_context,
+    const Extension* extension) {
+#if defined(OS_MACOSX)
+  // Register installed apps as soon as their extension is loaded. This happens
+  // when the profile is loaded. This is redundant, because apps are registered
+  // when they are installed. It is necessary, however, because app registration
+  // was added long after app installation launched. This should be removed
+  // after shipping for a few versions (whereupon it may be assumed that most
+  // applications have been registered).
+  if (UseAppShimRegistry(browser_context, extension)) {
+    AppShimRegistry::Get()->OnAppInstalledForProfile(extension->id(),
+                                                     profile_->GetPath());
+  }
+#endif
+}
+
 void AppShortcutManager::OnExtensionWillBeInstalled(
     content::BrowserContext* browser_context,
     const Extension* extension,
@@ -114,8 +140,10 @@
     return;
 
 #if defined(OS_MACOSX)
-  AppShimRegistry::Get()->OnAppInstalledForProfile(extension->id(),
-                                                   profile_->GetPath());
+  if (UseAppShimRegistry(browser_context, extension)) {
+    AppShimRegistry::Get()->OnAppInstalledForProfile(extension->id(),
+                                                     profile_->GetPath());
+  }
 #endif
 
   // If the app is being updated, update any existing shortcuts but do not
@@ -134,11 +162,16 @@
     const Extension* extension,
     extensions::UninstallReason reason) {
 #if defined(OS_MACOSX)
-  if (extension->is_app()) {
-    AppShimRegistry::Get()->OnAppUninstalledForProfile(extension->id(),
-                                                       profile_->GetPath());
-    // TODO(https://crbug.com/1001213): Plumb the return result through
-    // DeleteAllShortcuts, to appropriately delete multi-profile apps.
+  if (UseAppShimRegistry(browser_context, extension)) {
+    bool delete_multi_profile_shortcuts =
+        AppShimRegistry::Get()->OnAppUninstalledForProfile(extension->id(),
+                                                           profile_->GetPath());
+    if (delete_multi_profile_shortcuts) {
+      web_app::internals::GetShortcutIOTaskRunner()->PostTask(
+          FROM_HERE,
+          base::BindOnce(&web_app::internals::DeleteMultiProfileShortcutsForApp,
+                         extension->id()));
+    }
   }
 #endif
 
@@ -150,7 +183,23 @@
   if (profile_path != profile_->GetPath())
     return;
 
-  // TODO(https://crbug.com/1001213): Update AppShimRegistry here.
+#if defined(OS_MACOSX)
+  // If any multi-profile app shims exist only for this profile, delete them.
+  std::set<std::string> apps_for_profile =
+      AppShimRegistry::Get()->GetInstalledAppsForProfile(profile_path);
+  for (const auto& app_id : apps_for_profile) {
+    bool delete_multi_profile_shortcuts =
+        AppShimRegistry::Get()->OnAppUninstalledForProfile(app_id,
+                                                           profile_path);
+    if (delete_multi_profile_shortcuts) {
+      web_app::internals::GetShortcutIOTaskRunner()->PostTask(
+          FROM_HERE,
+          base::BindOnce(&web_app::internals::DeleteMultiProfileShortcutsForApp,
+                         app_id));
+    }
+  }
+#endif
+
   web_app::internals::GetShortcutIOTaskRunner()->PostTask(
       FROM_HERE,
       base::BindOnce(&web_app::internals::DeleteAllShortcutsForProfile,
diff --git a/chrome/browser/apps/platform_apps/shortcut_manager.h b/chrome/browser/apps/platform_apps/shortcut_manager.h
index fad39152..a45d483 100644
--- a/chrome/browser/apps/platform_apps/shortcut_manager.h
+++ b/chrome/browser/apps/platform_apps/shortcut_manager.h
@@ -36,6 +36,8 @@
   void UpdateShortcutsForAllAppsIfNeeded();
 
   // extensions::ExtensionRegistryObserver.
+  void OnExtensionLoaded(content::BrowserContext* browser_context,
+                         const extensions::Extension* extension) override;
   void OnExtensionWillBeInstalled(content::BrowserContext* browser_context,
                                   const extensions::Extension* extension,
                                   bool is_update,
diff --git a/chrome/browser/background/background_contents.cc b/chrome/browser/background/background_contents.cc
index 11b7b28..7d896530 100644
--- a/chrome/browser/background/background_contents.cc
+++ b/chrome/browser/background/background_contents.cc
@@ -19,7 +19,6 @@
 #include "content/public/browser/session_storage_namespace.h"
 #include "content/public/browser/site_instance.h"
 #include "content/public/browser/web_contents.h"
-#include "extensions/browser/deferred_start_render_host_observer.h"
 #include "extensions/browser/extension_host_delegate.h"
 #include "extensions/browser/extension_host_queue.h"
 #include "extensions/browser/extensions_browser_client.h"
@@ -81,9 +80,6 @@
   if (!web_contents_.get())   // Will be null for unit tests.
     return;
 
-  for (auto& observer : deferred_start_render_host_observer_list_)
-    observer.OnDeferredStartRenderHostDestroyed(this);
-
   extensions::ExtensionHostQueue::GetInstance().Remove(this);
 }
 
@@ -139,32 +135,8 @@
   // |this| is deleted.
 }
 
-void BackgroundContents::DidStartLoading() {
-  // BackgroundContents only loads once, so this can only be the first time it
-  // has started loading.
-  for (auto& observer : deferred_start_render_host_observer_list_)
-    observer.OnDeferredStartRenderHostDidStartFirstLoad(this);
-}
-
-void BackgroundContents::DidStopLoading() {
-  // BackgroundContents only loads once, so this can only be the first time
-  // it has stopped loading.
-  for (auto& observer : deferred_start_render_host_observer_list_)
-    observer.OnDeferredStartRenderHostDidStopFirstLoad(this);
-}
-
 void BackgroundContents::CreateRenderViewNow() {
   web_contents()->GetController().LoadURL(initial_url_, content::Referrer(),
                                           ui::PAGE_TRANSITION_LINK,
                                           std::string());
 }
-
-void BackgroundContents::AddDeferredStartRenderHostObserver(
-    extensions::DeferredStartRenderHostObserver* observer) {
-  deferred_start_render_host_observer_list_.AddObserver(observer);
-}
-
-void BackgroundContents::RemoveDeferredStartRenderHostObserver(
-    extensions::DeferredStartRenderHostObserver* observer) {
-  deferred_start_render_host_observer_list_.RemoveObserver(observer);
-}
diff --git a/chrome/browser/background/background_contents.h b/chrome/browser/background/background_contents.h
index c661e6e..9f0f796 100644
--- a/chrome/browser/background/background_contents.h
+++ b/chrome/browser/background/background_contents.h
@@ -11,7 +11,6 @@
 #include <string>
 
 #include "base/macros.h"
-#include "base/observer_list.h"
 #include "content/public/browser/site_instance.h"
 #include "content/public/browser/web_contents_delegate.h"
 #include "content/public/browser/web_contents_observer.h"
@@ -88,8 +87,6 @@
 
   // content::WebContentsObserver implementation:
   void RenderProcessGone(base::TerminationStatus status) override;
-  void DidStartLoading() override;
-  void DidStopLoading() override;
 
  protected:
   // Exposed for testing.
@@ -98,10 +95,6 @@
  private:
   // extensions::DeferredStartRenderHost implementation:
   void CreateRenderViewNow() override;
-  void AddDeferredStartRenderHostObserver(
-      extensions::DeferredStartRenderHostObserver* observer) override;
-  void RemoveDeferredStartRenderHostObserver(
-      extensions::DeferredStartRenderHostObserver* observer) override;
 
   // The delegate for this BackgroundContents.
   Delegate* delegate_;
@@ -111,8 +104,6 @@
 
   Profile* profile_;
   std::unique_ptr<content::WebContents> web_contents_;
-  base::ObserverList<extensions::DeferredStartRenderHostObserver>::Unchecked
-      deferred_start_render_host_observer_list_;
 
   // The initial URL to load.
   GURL initial_url_;
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 624828b6..440fa3f 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -122,8 +122,8 @@
 #include "chrome/common/media/media_resource_provider.h"
 #include "chrome/common/net/net_resource_provider.h"
 #include "chrome/common/pref_names.h"
-#include "chrome/common/stack_sampling_configuration.h"
-#include "chrome/common/thread_profiler.h"
+#include "chrome/common/profiler/stack_sampling_configuration.h"
+#include "chrome/common/profiler/thread_profiler.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/installer/util/google_update_settings.h"
 #include "components/component_updater/component_updater_service.h"
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 010e9a7..7ada688 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -171,10 +171,10 @@
 #include "chrome/common/pref_names_util.h"
 #include "chrome/common/prerender_url_loader_throttle.h"
 #include "chrome/common/prerender_util.h"
+#include "chrome/common/profiler/stack_sampling_configuration.h"
 #include "chrome/common/render_messages.h"
 #include "chrome/common/renderer_configuration.mojom.h"
 #include "chrome/common/secure_origin_whitelist.h"
-#include "chrome/common/stack_sampling_configuration.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/browser_resources.h"
@@ -541,6 +541,10 @@
 #include "chrome/browser/supervised_user/supervised_user_google_auth_navigation_throttle.h"
 #endif
 
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.h"
+#endif  // defined(OS_CHROMEOS)
+
 #if BUILDFLAG(ENABLE_MEDIA_REMOTING)
 #include "chrome/browser/media/cast_remoting_connector.h"
 #endif
@@ -3811,6 +3815,12 @@
                    FlashDownloadInterception::MaybeCreateThrottleFor(handle));
 #endif
 
+#if defined(OS_CHROMEOS)
+  MaybeAddThrottle(
+      &throttles,
+      chromeos::WebTimeLimitNavigationThrottle::MaybeCreateThrottleFor(handle));
+#endif  // defined(OS_CHROMEOS)
+
 #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
   MaybeAddThrottle(
       &throttles,
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 3df1f78..0f67c1f 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -786,10 +786,16 @@
     "child_accounts/time_limit_notifier.h",
     "child_accounts/time_limit_override.cc",
     "child_accounts/time_limit_override.h",
+    "child_accounts/time_limits/app_service_wrapper.cc",
+    "child_accounts/time_limits/app_service_wrapper.h",
     "child_accounts/time_limits/app_time_controller.cc",
     "child_accounts/time_limits/app_time_controller.h",
+    "child_accounts/time_limits/app_types.cc",
+    "child_accounts/time_limits/app_types.h",
     "child_accounts/time_limits/web_time_limit_enforcer.cc",
     "child_accounts/time_limits/web_time_limit_enforcer.h",
+    "child_accounts/time_limits/web_time_limit_navigation_throttle.cc",
+    "child_accounts/time_limits/web_time_limit_navigation_throttle.h",
     "child_accounts/usage_time_limit_processor.cc",
     "child_accounts/usage_time_limit_processor.h",
     "child_accounts/usage_time_state_notifier.cc",
@@ -2609,6 +2615,7 @@
     "child_accounts/parent_access_code/parent_access_test_utils.h",
     "child_accounts/time_limit_notifier_unittest.cc",
     "child_accounts/time_limit_test_utils.cc",
+    "child_accounts/time_limits/app_service_wrapper_unittest.cc",
     "child_accounts/time_limits/app_time_controller_unittest.cc",
     "child_accounts/usage_time_limit_processor_unittest.cc",
     "child_accounts/usage_time_state_notifier_unittest.cc",
diff --git a/chrome/browser/chromeos/accessibility/accessibility_manager_browsertest.cc b/chrome/browser/chromeos/accessibility/accessibility_manager_browsertest.cc
index c1d740f..436f5ef 100644
--- a/chrome/browser/chromeos/accessibility/accessibility_manager_browsertest.cc
+++ b/chrome/browser/chromeos/accessibility/accessibility_manager_browsertest.cc
@@ -676,7 +676,7 @@
     } else if (GetParam() == user_manager::USER_TYPE_CHILD) {
       logged_in_user_mixin_ = std::make_unique<LoggedInUserMixin>(
           &mixin_host_, LoggedInUserMixin::LogInType::kChild,
-          embedded_test_server());
+          embedded_test_server(), this);
     }
   }
   ~AccessibilityManagerUserTypeTest() override = default;
diff --git a/chrome/browser/chromeos/child_accounts/child_user_service.cc b/chrome/browser/chromeos/child_accounts/child_user_service.cc
index dba9075..6396d3a1 100644
--- a/chrome/browser/chromeos/child_accounts/child_user_service.cc
+++ b/chrome/browser/chromeos/child_accounts/child_user_service.cc
@@ -4,8 +4,11 @@
 
 #include "chrome/browser/chromeos/child_accounts/child_user_service.h"
 
+#include "base/time/time.h"
 #include "chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer.h"
 #include "content/public/browser/browser_context.h"
+#include "url/gurl.h"
 
 namespace chromeos {
 
@@ -16,6 +19,26 @@
 
 ChildUserService::~ChildUserService() = default;
 
+bool ChildUserService::WebTimeLimitReached() const {
+  if (!app_time_controller())
+    return false;
+  DCHECK(app_time_controller()->web_time_enforcer());
+  return app_time_controller()->web_time_enforcer()->blocked();
+}
+
+bool ChildUserService::WebTimeLimitWhitelistedURL(const GURL& url) const {
+  if (!app_time_controller())
+    return false;
+  DCHECK(app_time_controller()->web_time_enforcer());
+  return app_time_controller()->web_time_enforcer()->IsURLWhitelisted(url);
+}
+
+base::TimeDelta ChildUserService::GetWebTimeLimit() const {
+  DCHECK(app_time_controller());
+  DCHECK(app_time_controller()->web_time_enforcer());
+  return app_time_controller()->web_time_enforcer()->time_limit();
+}
+
 void ChildUserService::Shutdown() {
   app_time_controller_.reset();
 }
diff --git a/chrome/browser/chromeos/child_accounts/child_user_service.h b/chrome/browser/chromeos/child_accounts/child_user_service.h
index df89277..efb962ae 100644
--- a/chrome/browser/chromeos/child_accounts/child_user_service.h
+++ b/chrome/browser/chromeos/child_accounts/child_user_service.h
@@ -8,10 +8,16 @@
 #include <memory>
 #include "components/keyed_service/core/keyed_service.h"
 
+namespace base {
+class TimeDelta;
+}  // namespace base
+
 namespace content {
 class BrowserContext;
 }  // namespace content
 
+class GURL;
+
 namespace chromeos {
 class AppTimeController;
 
@@ -25,6 +31,20 @@
   ChildUserService& operator=(const ChildUserService&) = delete;
   ~ChildUserService() override;
 
+  // Returns whether web time limit was reached for child user.
+  // Always returns false if per-app times limits feature is disabled.
+  bool WebTimeLimitReached() const;
+
+  // Returns whether given |url| can be used without any time restrictions.
+  // Viewing of whitelisted |url| does not count towards usage web time.
+  // Always returns false if per-app times limits feature is disabled.
+  bool WebTimeLimitWhitelistedURL(const GURL& url) const;
+
+  // Returns time limit set for using the web on a given day.
+  // Should only be called if |features::kPerAppTimeLimits| and
+  // |features::kWebTimeLimits| features are enabled.
+  base::TimeDelta GetWebTimeLimit() const;
+
   const AppTimeController* app_time_controller() const {
     return app_time_controller_.get();
   }
diff --git a/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service_browsertest.cc b/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service_browsertest.cc
index c907eba..fce634cb 100644
--- a/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service_browsertest.cc
+++ b/chrome/browser/chromeos/child_accounts/parent_access_code/parent_access_service_browsertest.cc
@@ -97,7 +97,9 @@
     ASSERT_NO_FATAL_FAILURE(GetTestAccessCodeValues(&test_values_));
     ParentAccessService::Get().AddObserver(test_observer_.get());
     MixinBasedInProcessBrowserTest::SetUpOnMainThread();
-    logged_in_user_mixin_.SetUpOnMainThreadHelper(host_resolver(), this);
+    logged_in_user_mixin_.LogInUser(false /*issue_any_scope_token*/,
+                                    true /*wait_for_active_session*/,
+                                    true /*request_policy_update*/);
   }
 
   void TearDownOnMainThread() override {
@@ -144,9 +146,13 @@
 
   AccessCodeValues test_values_;
   chromeos::LoggedInUserMixin logged_in_user_mixin_{
-      &mixin_host_,           LoggedInUserMixin::LogInType::kChild,
-      embedded_test_server(), true /*should_launch_browser*/,
-      base::nullopt,          false /*include_initial_user*/};
+      &mixin_host_,
+      LoggedInUserMixin::LogInType::kChild,
+      embedded_test_server(),
+      this,
+      true /*should_launch_browser*/,
+      base::nullopt /*account_id*/,
+      false /*include_initial_user*/};
   std::unique_ptr<TestParentAccessServiceObserver> test_observer_;
 
  private:
diff --git a/chrome/browser/chromeos/child_accounts/screen_time_controller_browsertest.cc b/chrome/browser/chromeos/child_accounts/screen_time_controller_browsertest.cc
index ef88cbd..88170a9 100644
--- a/chrome/browser/chromeos/child_accounts/screen_time_controller_browsertest.cc
+++ b/chrome/browser/chromeos/child_accounts/screen_time_controller_browsertest.cc
@@ -28,7 +28,6 @@
 #include "components/session_manager/core/session_manager.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/test/test_utils.h"
-#include "net/dns/mock_host_resolver.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace chromeos {
@@ -83,19 +82,12 @@
         ->set_value(utils::PolicyToString(policy_content));
   }
 
-  // MixinBasedInProcessBrowserTest:
-  void SetUpOnMainThread() override {
-    MixinBasedInProcessBrowserTest::SetUpOnMainThread();
-    // By default, browser tests block anything that doesn't go to localhost, so
-    // account.google.com requests would never reach fake GAIA server without
-    // this.
-    host_resolver()->AddRule("*", "127.0.0.1");
-  }
-
  protected:
   void LogInChildAndSetupClockWithTime(const char* time) {
     SetupTaskRunnerWithTime(utils::TimeFromString(time));
-    logged_in_user_mixin_.LogInUser();
+    logged_in_user_mixin_.LogInUser(false /*issue_any_scope_token*/,
+                                    true /*wait_for_active_session*/,
+                                    true /*request_policy_update*/);
     MockClockForActiveUser();
   }
 
@@ -151,9 +143,13 @@
 
  private:
   chromeos::LoggedInUserMixin logged_in_user_mixin_{
-      &mixin_host_,           LoggedInUserMixin::LogInType::kChild,
-      embedded_test_server(), true /*should_launch_browser*/,
-      base::nullopt,          false /*include_initial_user*/};
+      &mixin_host_,
+      LoggedInUserMixin::LogInType::kChild,
+      embedded_test_server(),
+      this,
+      true /*should_launch_browser*/,
+      base::nullopt /*account_id*/,
+      false /*include_initial_user*/};
 
   DISALLOW_COPY_AND_ASSIGN(ScreenTimeControllerTest);
 };
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.cc
new file mode 100644
index 0000000..ba1dd05
--- /dev/null
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.cc
@@ -0,0 +1,102 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.h"
+
+#include <string>
+
+#include "chrome/browser/apps/app_service/app_service_proxy.h"
+#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_types.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
+#include "chrome/services/app_service/public/cpp/app_update.h"
+#include "chrome/services/app_service/public/mojom/types.mojom.h"
+
+namespace chromeos {
+namespace app_time {
+
+namespace {
+
+// Return whether |app| should be included for per-app time limits.
+// TODO(agawronska): Add support for PWA and Chrome.
+bool ShouldIncludeApp(const apps::AppUpdate& app) {
+  return app.AppType() == apps::mojom::AppType::kArc;
+}
+
+// Gets AppId from |update|.
+AppId AppIdFromAppUpdate(const apps::AppUpdate& update) {
+  bool is_arc = update.AppType() == apps::mojom::AppType::kArc;
+  return AppId(update.AppType(),
+               is_arc ? update.PublisherId() : update.AppId());
+}
+
+}  // namespace
+
+AppServiceWrapper::AppServiceWrapper(Profile* profile) : profile_(profile) {
+  Observe(&GetAppCache());
+}
+
+AppServiceWrapper::~AppServiceWrapper() = default;
+
+std::vector<AppId> AppServiceWrapper::GetInstalledApps() const {
+  std::vector<AppId> installed_apps;
+  GetAppCache().ForEachApp([&installed_apps](const apps::AppUpdate& update) {
+    if (update.Readiness() == apps::mojom::Readiness::kUninstalledByUser)
+      return;
+
+    if (!ShouldIncludeApp(update))
+      return;
+
+    installed_apps.push_back(AppIdFromAppUpdate(update));
+  });
+  return installed_apps;
+}
+
+void AppServiceWrapper::AddObserver(EventListener* listener) {
+  DCHECK(listener);
+  listeners_.AddObserver(listener);
+}
+
+void AppServiceWrapper::RemoveObserver(EventListener* listener) {
+  DCHECK(listener);
+  listeners_.RemoveObserver(listener);
+}
+
+void AppServiceWrapper::OnAppUpdate(const apps::AppUpdate& update) {
+  if (!update.ReadinessChanged())
+    return;
+
+  if (!ShouldIncludeApp(update))
+    return;
+
+  const AppId app_id = AppIdFromAppUpdate(update);
+  switch (update.Readiness()) {
+    case apps::mojom::Readiness::kReady:
+      for (auto& listener : listeners_)
+        listener.OnAppInstalled(app_id);
+      break;
+    case apps::mojom::Readiness::kUninstalledByUser:
+      for (auto& listener : listeners_)
+        listener.OnAppUninstalled(app_id);
+      break;
+    default:
+      break;
+  }
+}
+
+void AppServiceWrapper::OnAppRegistryCacheWillBeDestroyed(
+    apps::AppRegistryCache* cache) {
+  Observe(nullptr);
+}
+
+apps::AppRegistryCache& AppServiceWrapper::GetAppCache() const {
+  apps::AppServiceProxy* proxy =
+      apps::AppServiceProxyFactory::GetForProfile(profile_);
+  DCHECK(proxy);
+  return proxy->AppRegistryCache();
+}
+
+}  // namespace app_time
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.h b/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.h
new file mode 100644
index 0000000..61e9973
--- /dev/null
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.h
@@ -0,0 +1,66 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_SERVICE_WRAPPER_H_
+#define CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_SERVICE_WRAPPER_H_
+
+#include <vector>
+
+#include "base/observer_list.h"
+#include "base/observer_list_types.h"
+#include "chrome/services/app_service/public/cpp/app_registry_cache.h"
+
+class Profile;
+
+namespace apps {
+class AppUpdate;
+}  // namespace apps
+
+namespace chromeos {
+namespace app_time {
+
+class AppId;
+
+// Wrapper around AppService.
+// Provides abstraction layer for Per-App Time Limits. Takes care of types
+// conversions and data filetering, so those operations are not spread around
+// the per-app time limits code.
+class AppServiceWrapper : public apps::AppRegistryCache::Observer {
+ public:
+  // Notifies listeners about app state changes.
+  class EventListener : public base::CheckedObserver {
+   public:
+    virtual void OnAppInstalled(const AppId& app_id) {}
+    virtual void OnAppUninstalled(const AppId& app_id) {}
+  };
+
+  explicit AppServiceWrapper(Profile* profile);
+  AppServiceWrapper(const AppServiceWrapper&) = delete;
+  AppServiceWrapper& operator=(const AppServiceWrapper&) = delete;
+  ~AppServiceWrapper() override;
+
+  // Returns installed apps that are relevant for Per-App Time Limits feature.
+  // Installed apps of unsupported types will not be included.
+  std::vector<AppId> GetInstalledApps() const;
+
+  void AddObserver(EventListener* observer);
+  void RemoveObserver(EventListener* observer);
+
+  // apps::AppRegistryCache::Observer:
+  void OnAppUpdate(const apps::AppUpdate& update) override;
+  void OnAppRegistryCacheWillBeDestroyed(
+      apps::AppRegistryCache* cache) override;
+
+ private:
+  apps::AppRegistryCache& GetAppCache() const;
+
+  base::ObserverList<EventListener> listeners_;
+
+  Profile* const profile_;
+};
+
+}  // namespace app_time
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_SERVICE_WRAPPER_H_
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper_unittest.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper_unittest.cc
new file mode 100644
index 0000000..7ca8728
--- /dev/null
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper_unittest.cc
@@ -0,0 +1,185 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_service_wrapper.h"
+
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/containers/flat_map.h"
+#include "base/strings/strcat.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/apps/app_service/app_service_test.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_types.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_test.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/services/app_service/public/cpp/app_update.h"
+#include "chrome/services/app_service/public/mojom/types.mojom.h"
+#include "chrome/test/base/testing_profile.h"
+#include "components/arc/mojom/app.mojom.h"
+#include "components/arc/mojom/app_permissions.mojom.h"
+#include "components/arc/test/fake_app_instance.h"
+#include "content/public/test/browser_task_environment.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chromeos {
+namespace app_time {
+
+namespace {
+
+constexpr char kArcPackage1[] = "com.example.app1";
+constexpr char kArcApp1[] = "ArcApp1";
+constexpr char kArcPackage2[] = "com.example.app2";
+constexpr char kArcApp2[] = "ArcApp2";
+
+arc::mojom::ArcPackageInfoPtr CreateArcAppPackage(
+    const std::string& package_name) {
+  auto package = arc::mojom::ArcPackageInfo::New();
+  package->package_name = package_name;
+  package->package_version = 1;
+  package->last_backup_android_id = 1;
+  package->last_backup_time = 1;
+  package->sync = false;
+  package->system = false;
+  package->permissions = base::flat_map<::arc::mojom::AppPermission, bool>();
+  return package;
+}
+
+arc::mojom::AppInfo CreateArcAppInfo(const std::string& package_name,
+                                     const std::string& name) {
+  arc::mojom::AppInfo app;
+  app.package_name = package_name;
+  app.name = name;
+  app.activity = base::StrCat({name, "Activity"});
+  app.sticky = true;
+  return app;
+}
+
+}  // namespace
+
+class AppServiceWrapperTest : public testing::Test {
+ public:
+  class MockListener : public AppServiceWrapper::EventListener {
+   public:
+    MockListener() = default;
+    MockListener(const MockListener&) = delete;
+    MockListener& operator=(const MockListener&) = delete;
+    ~MockListener() override = default;
+
+    MOCK_METHOD1(OnAppInstalled, void(const AppId& app_id));
+    MOCK_METHOD1(OnAppUninstalled, void(const AppId& app_id));
+  };
+
+ protected:
+  AppServiceWrapperTest() = default;
+  AppServiceWrapperTest(const AppServiceWrapperTest&) = delete;
+  AppServiceWrapperTest& operator=(const AppServiceWrapperTest&) = delete;
+  ~AppServiceWrapperTest() override = default;
+
+  ArcAppTest& arc_test() { return arc_test_; }
+  AppServiceWrapper& tested_wrapper() { return tested_wrapper_; }
+  MockListener& test_listener() { return test_listener_; }
+
+  // testing::Test:
+  void SetUp() override {
+    testing::Test::SetUp();
+
+    feature_list_.InitAndEnableFeature(features::kPerAppTimeLimits);
+    app_service_test_.SetUp(&profile_);
+    arc_test_.SetUp(&profile_);
+    tested_wrapper_.AddObserver(&test_listener_);
+  }
+
+  void TearDown() override {
+    tested_wrapper_.RemoveObserver(&test_listener_);
+    arc_test_.TearDown();
+
+    testing::Test::TearDown();
+  }
+
+  void RunUntilIdle() { task_environment_.RunUntilIdle(); }
+
+  void SimulateAppInstalled(const AppId& app_id, const std::string& app_name) {
+    const std::string& package_name = app_id.app_id();
+    arc_test_.AddPackage(CreateArcAppPackage(package_name)->Clone());
+
+    const arc::mojom::AppInfo app = CreateArcAppInfo(package_name, app_name);
+    arc_test_.app_instance()->SendPackageAppListRefreshed(package_name, {app});
+
+    task_environment_.RunUntilIdle();
+  }
+
+  void SimulateAppUninstalled(const AppId& app_id) {
+    const std::string& package_name = app_id.app_id();
+    arc_test_.app_instance()->UninstallPackage(package_name);
+
+    task_environment_.RunUntilIdle();
+  }
+
+ private:
+  content::BrowserTaskEnvironment task_environment_;
+  base::test::ScopedFeatureList feature_list_;
+
+  TestingProfile profile_;
+  apps::AppServiceTest app_service_test_;
+  ArcAppTest arc_test_;
+
+  AppServiceWrapper tested_wrapper_{&profile_};
+  MockListener test_listener_;
+};
+
+// Tests GetInstalledApps() method.
+TEST_F(AppServiceWrapperTest, GetInstalledApps) {
+  // No ARC apps installed.
+  EXPECT_EQ(0u, tested_wrapper().GetInstalledApps().size());
+
+  // Update the list of ARC apps.
+  const std::vector<arc::mojom::AppInfo>& expected_apps =
+      arc_test().fake_apps();
+  arc_test().app_instance()->SendRefreshAppList(expected_apps);
+  RunUntilIdle();
+
+  const std::vector<AppId> installed_apps = tested_wrapper().GetInstalledApps();
+  ASSERT_EQ(expected_apps.size(), installed_apps.size());
+  for (const auto& app : expected_apps) {
+    EXPECT_TRUE(base::Contains(
+        installed_apps, AppId(apps::mojom::AppType::kArc, app.package_name)));
+  }
+}
+
+// Tests installs and uninstalls of Arc apps.
+TEST_F(AppServiceWrapperTest, ArcAppInstallation) {
+  // No app installed.
+  EXPECT_EQ(0u, tested_wrapper().GetInstalledApps().size());
+
+  // Install first ARC app.
+  const AppId app1(apps::mojom::AppType::kArc, kArcPackage1);
+  EXPECT_CALL(test_listener(), OnAppInstalled(app1)).Times(1);
+  SimulateAppInstalled(app1, kArcApp1);
+
+  std::vector<AppId> installed_apps = tested_wrapper().GetInstalledApps();
+  ASSERT_EQ(1u, installed_apps.size());
+  EXPECT_EQ(app1, installed_apps[0]);
+
+  // Install second ARC app.
+  const AppId app2(apps::mojom::AppType::kArc, kArcPackage2);
+  EXPECT_CALL(test_listener(), OnAppInstalled(app2)).Times(1);
+  SimulateAppInstalled(app2, kArcApp2);
+
+  installed_apps = tested_wrapper().GetInstalledApps();
+  EXPECT_EQ(2u, installed_apps.size());
+
+  // Uninstall first ARC app.
+  EXPECT_CALL(test_listener(), OnAppUninstalled(app1)).Times(1);
+  SimulateAppUninstalled(app1);
+
+  installed_apps = tested_wrapper().GetInstalledApps();
+  ASSERT_EQ(1u, installed_apps.size());
+  EXPECT_EQ(app2, installed_apps[0]);
+}
+
+}  // namespace app_time
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_types.cc b/chrome/browser/chromeos/child_accounts/time_limits/app_types.cc
new file mode 100644
index 0000000..4437728
--- /dev/null
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_types.cc
@@ -0,0 +1,78 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_types.h"
+
+namespace chromeos {
+
+namespace app_time {
+
+AppId::AppId(apps::mojom::AppType app_type, const std::string& app_id)
+    : app_type_(app_type), app_id_(app_id) {
+  DCHECK(!app_id.empty());
+}
+
+AppId::AppId(const AppId&) = default;
+
+AppId& AppId::operator=(const AppId&) = default;
+
+AppId::AppId(AppId&&) = default;
+
+AppId& AppId::operator=(AppId&&) = default;
+
+AppId::~AppId() = default;
+
+bool AppId::operator==(const AppId& rhs) const {
+  return app_type_ == rhs.app_type() && app_id_ == rhs.app_id();
+}
+
+bool AppId::operator!=(const AppId& rhs) const {
+  return !(*this == rhs);
+}
+
+AppLimit::AppLimit(AppRestriction restriction,
+                   base::Optional<base::TimeDelta> daily_limit,
+                   base::Time last_updated)
+    : restriction_(restriction),
+      daily_limit_(daily_limit),
+      last_updated_(last_updated) {
+  DCHECK_EQ(restriction_ == AppRestriction::kBlocked,
+            daily_limit_ == base::nullopt);
+  DCHECK(daily_limit_ == base::nullopt ||
+         daily_limit >= base::TimeDelta::FromHours(0));
+  DCHECK(daily_limit_ == base::nullopt ||
+         daily_limit <= base::TimeDelta::FromHours(24));
+}
+
+AppLimit::AppLimit(const AppLimit&) = default;
+
+AppLimit& AppLimit::operator=(const AppLimit&) = default;
+
+AppLimit::AppLimit(AppLimit&&) = default;
+
+AppLimit& AppLimit::operator=(AppLimit&&) = default;
+
+AppLimit::~AppLimit() = default;
+
+AppActivity::AppActivity(AppState app_state)
+    : app_state_(app_state), last_updated_(base::Time::Now()) {}
+AppActivity::AppActivity(const AppActivity&) = default;
+AppActivity& AppActivity::operator=(const AppActivity&) = default;
+AppActivity::AppActivity(AppActivity&&) = default;
+AppActivity& AppActivity::operator=(AppActivity&&) = default;
+AppActivity::~AppActivity() = default;
+
+void AppActivity::SetAppState(AppState app_state) {
+  app_state_ = app_state;
+  last_updated_ = base::Time::Now();
+}
+
+void AppActivity::SetActiveTime(base::TimeDelta active_time) {
+  active_time_ = active_time;
+  last_updated_ = base::Time::Now();
+}
+
+}  // namespace app_time
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/app_types.h b/chrome/browser/chromeos/child_accounts/time_limits/app_types.h
new file mode 100644
index 0000000..a8a95f3
--- /dev/null
+++ b/chrome/browser/chromeos/child_accounts/time_limits/app_types.h
@@ -0,0 +1,130 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TYPES_H_
+#define CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TYPES_H_
+
+#include <optional>
+#include <string>
+
+#include "base/time/time.h"
+#include "chrome/services/app_service/public/mojom/types.mojom.h"
+
+namespace chromeos {
+namespace app_time {
+
+// Type of usage restriction that can be applied to the installed app.
+enum class AppRestriction {
+  kUnknown,
+  // Installed app is not available for the user.
+  kBlocked,
+  // Daily time limit is enforced. Installed app will become unavailable for
+  // the user after time limit is reached on a given day.
+  kTimeLimit,
+};
+
+// State of the app. Used for activity recording and status reporting.
+enum class AppState {
+  // App is available for the user.
+  kAvailable,
+  // App cannot be restricted. Used for important system apps.
+  kAlwaysAvailable,
+  // App is not available for the user because of being blocked.
+  kBlocked,
+  // App is not available for the user because daily time limit was reached.
+  kLimitReached,
+  // App is uninstalled. Activity might still be preserved and reported for
+  // recently uninstalled apps.
+  kUninstall,
+};
+
+// Identifies an app for app time limits.
+// Different types of use different identifier format. ARC++ apps are identified
+// by Android package name. Other types of apps use 32 character long Chrome
+// specific app id.
+class AppId {
+ public:
+  AppId(apps::mojom::AppType app_type, const std::string& app_id);
+  AppId(const AppId&);
+  AppId& operator=(const AppId&);
+  AppId(AppId&&);
+  AppId& operator=(AppId&&);
+  ~AppId();
+
+  apps::mojom::AppType app_type() const { return app_type_; }
+  const std::string& app_id() const { return app_id_; }
+
+  bool operator==(const AppId&) const;
+  bool operator!=(const AppId&) const;
+
+ private:
+  apps::mojom::AppType app_type_ = apps::mojom::AppType::kUnknown;
+
+  // Package name for |ARC| apps, 32 character long Chrome specific app id
+  // otherwise.
+  std::string app_id_;
+};
+
+// Represents restriction that can be applied to an installed app.
+class AppLimit {
+ public:
+  // Creates AppLimit.
+  // |daily_limit| can only be set when |restriction| is kTimeLimit.
+  // |daily_limit| needs to be in range of [0, 24] hours.
+  AppLimit(AppRestriction restriction,
+           base::Optional<base::TimeDelta> daily_limit,
+           base::Time last_updated);
+  AppLimit(const AppLimit&);
+  AppLimit& operator=(const AppLimit&);
+  AppLimit(AppLimit&&);
+  AppLimit& operator=(AppLimit&&);
+  ~AppLimit();
+
+ private:
+  // Usage restriction applied to the app.
+  AppRestriction restriction_ = AppRestriction::kUnknown;
+
+  // Daily usage limit. Only set |restriction| is kTimeLimit.
+  // Has to be between 0 and 24 hours.
+  base::Optional<base::TimeDelta> daily_limit_;
+
+  // UTC timestamp for the last time the limit was updated.
+  base::Time last_updated_;
+};
+
+// Contains information about app usage.
+class AppActivity {
+ public:
+  // Creates AppActivity and sets current |app_state_|.
+  explicit AppActivity(AppState app_state);
+  AppActivity(const AppActivity&);
+  AppActivity& operator=(const AppActivity&);
+  AppActivity(AppActivity&&);
+  AppActivity& operator=(AppActivity&&);
+  ~AppActivity();
+
+  void SetAppState(AppState app_state);
+  void SetActiveTime(base::TimeDelta active_time);
+
+  AppState app_state() const { return app_state_; }
+  base::TimeDelta active_time() const { return active_time_; }
+
+ private:
+  // Current state of the app.
+  // There might be relevant activity recoded for app that was uninstalled
+  // recently.
+  AppState app_state_ = AppState::kAvailable;
+
+  // The time app was active.
+  // TODO(agawronska): This will become more complicated.
+  base::TimeDelta active_time_;
+
+  // UTC timestamp for the last time the activity was updated.
+  base::Time last_updated_;
+};
+
+}  // namespace app_time
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_APP_TYPES_H_
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer_browsertest.cc b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer_browsertest.cc
new file mode 100644
index 0000000..24084891
--- /dev/null
+++ b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer_browsertest.cc
@@ -0,0 +1,247 @@
+// 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 <algorithm>
+#include <set>
+
+#include "base/feature_list.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/chromeos/child_accounts/child_user_service.h"
+#include "chrome/browser/chromeos/child_accounts/child_user_service_factory.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/app_time_controller.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_navigator_params.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/navigation_handle.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/web_contents.h"
+#include "net/dns/mock_host_resolver.h"
+#include "ui/base/window_open_disposition.h"
+#include "url/gurl.h"
+
+namespace {
+
+constexpr char kExampleHost[] = "www.example.com";
+
+class LoadFinishedWaiter : public content::WebContentsObserver {
+ public:
+  LoadFinishedWaiter(content::WebContents* web_contents, const GURL& url)
+      : content::WebContentsObserver(web_contents), url_(url) {}
+
+  ~LoadFinishedWaiter() override = default;
+
+  // Delete copy constructor and copy assignment operator.
+  LoadFinishedWaiter(const LoadFinishedWaiter&) = delete;
+  LoadFinishedWaiter& operator=(const LoadFinishedWaiter&) = delete;
+
+  void Wait() {
+    if (did_finish_)
+      return;
+    run_loop_.Run();
+  }
+
+  // content::WebContentsObserver:
+  void DidFinishLoad(content::RenderFrameHost* render_frame_host,
+                     const GURL& validated_url) override;
+
+ private:
+  GURL url_;
+  bool did_finish_ = false;
+  base::RunLoop run_loop_{base::RunLoop::Type::kNestableTasksAllowed};
+};
+
+void LoadFinishedWaiter::DidFinishLoad(
+    content::RenderFrameHost* render_frame_host,
+    const GURL& validated_url) {
+  if (!render_frame_host->GetParent() &&
+      render_frame_host->GetLastCommittedURL() == url_) {
+    did_finish_ = true;
+    run_loop_.Quit();
+  }
+}
+
+}  // namespace
+
+class WebTimeLimitEnforcerThrottleTest : public InProcessBrowserTest {
+ protected:
+  WebTimeLimitEnforcerThrottleTest() = default;
+  ~WebTimeLimitEnforcerThrottleTest() override = default;
+
+  void SetUp() override;
+  void SetUpOnMainThread() override;
+  bool IsErrorPageBeingShownInWebContents(content::WebContents* tab);
+  void WhitelistHost(const GURL& url);
+  void BlockWeb();
+  chromeos::WebTimeLimitEnforcer* GetWebTimeLimitEnforcer();
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+void WebTimeLimitEnforcerThrottleTest::SetUp() {
+  scoped_feature_list_.InitWithFeatures(
+      /* enabled_features */ {{features::kPerAppTimeLimits,
+                               features::kWebTimeLimits}},
+      /* disabled_features */ {{}});
+  InProcessBrowserTest::SetUp();
+}
+
+void WebTimeLimitEnforcerThrottleTest::SetUpOnMainThread() {
+  InProcessBrowserTest::SetUpOnMainThread();
+
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  // Resolve everything to localhost.
+  host_resolver()->AddIPLiteralRule("*", "127.0.0.1", "localhost");
+}
+
+bool WebTimeLimitEnforcerThrottleTest::IsErrorPageBeingShownInWebContents(
+    content::WebContents* tab) {
+  const std::string command =
+      "domAutomationController.send("
+      "(document.getElementById('web-time-limit-block') != null)"
+      "? (true) : (false));";
+
+  bool value = false;
+  content::ToRenderFrameHost target =
+      content::ToRenderFrameHost(tab->GetMainFrame());
+  EXPECT_TRUE(content::ExecuteScriptWithoutUserGestureAndExtractBool(
+      target, command, &value));
+  return value;
+}
+
+void WebTimeLimitEnforcerThrottleTest::WhitelistHost(const GURL& url) {
+  GetWebTimeLimitEnforcer()->OnWhitelistAdded(url);
+}
+
+void WebTimeLimitEnforcerThrottleTest::BlockWeb() {
+  GetWebTimeLimitEnforcer()->OnWebTimeLimitReached();
+}
+
+chromeos::WebTimeLimitEnforcer*
+WebTimeLimitEnforcerThrottleTest::GetWebTimeLimitEnforcer() {
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  content::BrowserContext* browser_context = web_contents->GetBrowserContext();
+  chromeos::ChildUserService* child_user_service =
+      chromeos::ChildUserServiceFactory::GetForBrowserContext(browser_context);
+  chromeos::AppTimeController* app_time_controller =
+      child_user_service->app_time_controller();
+  return app_time_controller->web_time_enforcer();
+}
+
+IN_PROC_BROWSER_TEST_F(WebTimeLimitEnforcerThrottleTest,
+                       WebBlockedBeforeBrowser) {
+  // Alright let's block the browser.
+  GetWebTimeLimitEnforcer()->OnWebTimeLimitReached();
+  GURL url = embedded_test_server()->GetURL(kExampleHost,
+                                            "/supervised_user/simple.html");
+
+  NavigateParams params(browser(), url,
+                        ui::PageTransition::PAGE_TRANSITION_LINK);
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
+
+  // Navigates and waits for loading to finish.
+  ui_test_utils::NavigateToURL(&params);
+
+  EXPECT_TRUE(IsErrorPageBeingShownInWebContents(
+      params.navigated_or_inserted_contents));
+}
+
+IN_PROC_BROWSER_TEST_F(WebTimeLimitEnforcerThrottleTest,
+                       WebBlockedAfterBrowser) {
+  GURL url = embedded_test_server()->GetURL(kExampleHost,
+                                            "/supervised_user/simple.html");
+  NavigateParams params(browser(), url,
+                        ui::PageTransition::PAGE_TRANSITION_LINK);
+
+  // Navigates and waits for loading to finish.
+  ui_test_utils::NavigateToURL(&params);
+  auto* web_contents = params.navigated_or_inserted_contents;
+
+  // We don't expect an time limit block page to show yet.
+  EXPECT_FALSE(IsErrorPageBeingShownInWebContents(web_contents));
+
+  LoadFinishedWaiter waiter(web_contents, url);
+
+  GetWebTimeLimitEnforcer()->OnWebTimeLimitReached();
+
+  waiter.Wait();
+
+  EXPECT_TRUE(IsErrorPageBeingShownInWebContents(web_contents));
+}
+
+IN_PROC_BROWSER_TEST_F(WebTimeLimitEnforcerThrottleTest,
+                       WebUnblockedAfterBlocked) {
+  GURL url = embedded_test_server()->GetURL(kExampleHost,
+                                            "/supervised_user/simple.html");
+
+  // Alright let's block the browser.
+  GetWebTimeLimitEnforcer()->OnWebTimeLimitReached();
+  NavigateParams params(browser(), url,
+                        ui::PageTransition::PAGE_TRANSITION_LINK);
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
+
+  // Navigates and waits for loading to finish.
+  ui_test_utils::NavigateToURL(&params);
+  auto* web_contents = params.navigated_or_inserted_contents;
+
+  EXPECT_TRUE(IsErrorPageBeingShownInWebContents(web_contents));
+
+  LoadFinishedWaiter waiter(web_contents, url);
+
+  GetWebTimeLimitEnforcer()->OnWebTimeLimitEnded();
+  waiter.Wait();
+
+  EXPECT_FALSE(IsErrorPageBeingShownInWebContents(web_contents));
+}
+
+IN_PROC_BROWSER_TEST_F(WebTimeLimitEnforcerThrottleTest,
+                       WhitelistedURLNotBlocked) {
+  GURL url = embedded_test_server()->GetURL(kExampleHost,
+                                            "/supervised_user/simple.html");
+
+  GetWebTimeLimitEnforcer()->OnWhitelistAdded(url);
+
+  // Alright let's block the browser.
+  GetWebTimeLimitEnforcer()->OnWebTimeLimitReached();
+  NavigateParams params(browser(), url,
+                        ui::PageTransition::PAGE_TRANSITION_LINK);
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
+
+  // Navigates and waits for loading to finish.
+  ui_test_utils::NavigateToURL(&params);
+  auto* web_contents = params.navigated_or_inserted_contents;
+
+  EXPECT_FALSE(IsErrorPageBeingShownInWebContents(web_contents));
+}
+
+IN_PROC_BROWSER_TEST_F(WebTimeLimitEnforcerThrottleTest,
+                       BlockedURLAddedToWhitelist) {
+  GURL url = embedded_test_server()->GetURL(kExampleHost,
+                                            "/supervised_user/simple.html");
+
+  // Alright let's block the browser.
+  GetWebTimeLimitEnforcer()->OnWebTimeLimitReached();
+  NavigateParams params(browser(), url,
+                        ui::PageTransition::PAGE_TRANSITION_LINK);
+  params.disposition = WindowOpenDisposition::NEW_FOREGROUND_TAB;
+
+  // Navigates and waits for loading to finish.
+  ui_test_utils::NavigateToURL(&params);
+  auto* web_contents = params.navigated_or_inserted_contents;
+
+  EXPECT_TRUE(IsErrorPageBeingShownInWebContents(web_contents));
+
+  LoadFinishedWaiter waiter(web_contents, url);
+
+  GetWebTimeLimitEnforcer()->OnWhitelistAdded(url);
+  waiter.Wait();
+
+  EXPECT_FALSE(IsErrorPageBeingShownInWebContents(web_contents));
+}
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.cc b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.cc
new file mode 100644
index 0000000..e9406dc
--- /dev/null
+++ b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.cc
@@ -0,0 +1,165 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.h"
+
+#include <string>
+
+#include "base/optional.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/chromeos/child_accounts/child_user_service.h"
+#include "chrome/browser/chromeos/child_accounts/child_user_service_factory.h"
+#include "chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_error_page/web_time_limit_error_page.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/web_applications/app_browser_controller.h"
+#include "chrome/browser/web_applications/components/app_registrar.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_tab_helper.h"
+#include "chrome/browser/web_applications/web_app_provider.h"
+#include "content/public/browser/navigation_handle.h"
+#include "content/public/browser/web_contents.h"
+
+namespace chromeos {
+
+namespace {
+
+bool IsWebBlocked(content::BrowserContext* context) {
+  auto* child_user_service =
+      ChildUserServiceFactory::GetForBrowserContext(context);
+  if (!child_user_service)
+    return false;
+
+  return child_user_service->WebTimeLimitReached();
+}
+
+bool IsURLWhitelisted(const GURL& url, content::BrowserContext* context) {
+  auto* child_user_service =
+      ChildUserServiceFactory::GetForBrowserContext(context);
+  if (!child_user_service)
+    return false;
+
+  return child_user_service->WebTimeLimitWhitelistedURL(url);
+}
+
+base::TimeDelta GetWebTimeLimit(content::BrowserContext* context) {
+  auto* child_user_service =
+      ChildUserServiceFactory::GetForBrowserContext(context);
+  DCHECK(child_user_service);
+  return child_user_service->GetWebTimeLimit();
+}
+
+Browser* FindBrowserForWebContents(content::WebContents* web_contents) {
+  BrowserList* browser_list = BrowserList::GetInstance();
+  for (Browser* browser : *browser_list) {
+    TabStripModel* tab_strip_model = browser->tab_strip_model();
+    for (int i = 0; i < tab_strip_model->count(); i++) {
+      if (web_contents == tab_strip_model->GetWebContentsAt(i))
+        return browser;
+    }
+  }
+
+  return nullptr;
+}
+
+}  // namespace
+
+using ThrottleCheckResult = content::NavigationThrottle::ThrottleCheckResult;
+
+// static
+std::unique_ptr<WebTimeLimitNavigationThrottle>
+WebTimeLimitNavigationThrottle::MaybeCreateThrottleFor(
+    content::NavigationHandle* navigation_handle) {
+  content::BrowserContext* browser_context =
+      navigation_handle->GetWebContents()->GetBrowserContext();
+
+  if (IsWebBlocked(browser_context)) {
+    // Creating a throttle for both the main frame and sub frames. This prevents
+    // kids from circumventing the app restrictions by using iframes in a local
+    // html file.
+    return base::WrapUnique(
+        new WebTimeLimitNavigationThrottle(navigation_handle));
+  }
+
+  return nullptr;
+}
+
+WebTimeLimitNavigationThrottle::~WebTimeLimitNavigationThrottle() = default;
+
+ThrottleCheckResult WebTimeLimitNavigationThrottle::WillStartRequest() {
+  return WillStartOrRedirectRequest(/* proceed_if_no_browser */ true);
+}
+
+ThrottleCheckResult WebTimeLimitNavigationThrottle::WillRedirectRequest() {
+  return WillStartOrRedirectRequest(/* proceed_if_no_browser */ true);
+}
+
+ThrottleCheckResult WebTimeLimitNavigationThrottle::WillProcessResponse() {
+  return WillStartOrRedirectRequest(/* proceed_if_no_browser */ false);
+}
+
+const char* WebTimeLimitNavigationThrottle::GetNameForLogging() {
+  return "WebTimeLimitNavigationThrottle";
+}
+
+WebTimeLimitNavigationThrottle::WebTimeLimitNavigationThrottle(
+    content::NavigationHandle* navigation_handle)
+    : NavigationThrottle(navigation_handle) {}
+
+ThrottleCheckResult WebTimeLimitNavigationThrottle::WillStartOrRedirectRequest(
+    bool proceed_if_no_browser) {
+  content::BrowserContext* browser_context =
+      navigation_handle()->GetWebContents()->GetBrowserContext();
+
+  if (!IsWebBlocked(browser_context) ||
+      IsURLWhitelisted(navigation_handle()->GetURL(), browser_context)) {
+    return NavigationThrottle::PROCEED;
+  }
+
+  // Let's get the browser instance from the navigation handle.
+  content::WebContents* web_contents = navigation_handle()->GetWebContents();
+  Browser* browser = FindBrowserForWebContents(web_contents);
+
+  if (!browser && proceed_if_no_browser)
+    return PROCEED;
+
+  const std::string& app_locale = g_browser_process->GetApplicationLocale();
+
+  Browser::Type type = browser->type();
+  web_app::WebAppTabHelper* web_app_helper =
+      web_app::WebAppTabHelper::FromWebContents(web_contents);
+
+  bool is_windowed =
+      (type == Browser::Type::TYPE_APP) || (type == Browser::Type::TYPE_POPUP);
+  bool is_app = false;
+  if (web_app_helper && !web_app_helper->app_id().empty())
+    is_app = true;
+
+  // Don't throttle windowed applications. We show a notification and close
+  // them.
+  if (is_windowed && is_app)
+    return PROCEED;
+
+  base::TimeDelta time_limit = GetWebTimeLimit(browser_context);
+  std::string interstitial_html;
+  if (is_app) {
+    Profile* profile = Profile::FromBrowserContext(browser_context);
+    web_app::WebAppProvider* web_app_provider =
+        web_app::WebAppProvider::Get(profile);
+    const web_app::AppRegistrar& registrar = web_app_provider->registrar();
+    const std::string& app_name =
+        registrar.GetAppShortName(web_app_helper->app_id());
+    interstitial_html =
+        GetWebTimeLimitAppErrorPage(time_limit, app_locale, app_name);
+  } else {
+    interstitial_html = GetWebTimeLimitChromeErrorPage(time_limit, app_locale);
+  }
+
+  return NavigationThrottle::ThrottleCheckResult(
+      CANCEL, net::ERR_BLOCKED_BY_CLIENT, interstitial_html);
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.h b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.h
new file mode 100644
index 0000000..3cda2a0
--- /dev/null
+++ b/chrome/browser/chromeos/child_accounts/time_limits/web_time_limit_navigation_throttle.h
@@ -0,0 +1,49 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_WEB_TIME_LIMIT_NAVIGATION_THROTTLE_H_
+#define CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_WEB_TIME_LIMIT_NAVIGATION_THROTTLE_H_
+
+#include <memory>
+
+#include "content/public/browser/navigation_throttle.h"
+
+namespace content {
+class NavigationHandle;
+}  // namespace content
+
+namespace chromeos {
+
+// Throttles non whitelisted navigations for WebContents when time limit has
+// been reached. It blocks the navigations and loads the web time limit error
+// page in the blocked WebContents.
+class WebTimeLimitNavigationThrottle : public content::NavigationThrottle {
+ public:
+  static std::unique_ptr<WebTimeLimitNavigationThrottle> MaybeCreateThrottleFor(
+      content::NavigationHandle* navigation_handle);
+
+  ~WebTimeLimitNavigationThrottle() override;
+
+  // Delete copy constructor and copy assignment operator.
+  WebTimeLimitNavigationThrottle(const WebTimeLimitNavigationThrottle&) =
+      delete;
+  WebTimeLimitNavigationThrottle& operator=(
+      const WebTimeLimitNavigationThrottle&) = delete;
+
+  // content::NavigationThrottle:
+  ThrottleCheckResult WillStartRequest() override;
+  ThrottleCheckResult WillRedirectRequest() override;
+  ThrottleCheckResult WillProcessResponse() override;
+  const char* GetNameForLogging() override;
+
+ private:
+  explicit WebTimeLimitNavigationThrottle(
+      content::NavigationHandle* navigation_handle);
+
+  ThrottleCheckResult WillStartOrRedirectRequest(bool proceed_if_no_browser);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_CHILD_ACCOUNTS_TIME_LIMITS_WEB_TIME_LIMIT_NAVIGATION_THROTTLE_H_
diff --git a/chrome/browser/chromeos/login/screens/supervision_transition_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/supervision_transition_screen_browsertest.cc
index aec86c5..6442762 100644
--- a/chrome/browser/chromeos/login/screens/supervision_transition_screen_browsertest.cc
+++ b/chrome/browser/chromeos/login/screens/supervision_transition_screen_browsertest.cc
@@ -60,8 +60,8 @@
     // and then postpone WaitForActiveSession() until later. So wait for active
     // session immediately if IsPreTest() and postpone the call to
     // WaitForActiveSession() otherwise.
-    logged_in_user_mixin_.SetUpOnMainThreadHelper(
-        host_resolver(), this, false /*issue_any_scope_token*/,
+    logged_in_user_mixin_.LogInUser(
+        false /*issue_any_scope_token*/,
         content::IsPreTest() /*wait_for_active_session*/);
   }
 
@@ -80,7 +80,7 @@
  private:
   LoggedInUserMixin logged_in_user_mixin_{
       &mixin_host_, content::IsPreTest() ? GetParam() : GetTargetUserType(),
-      embedded_test_server(), false /*should_launch_browser*/};
+      embedded_test_server(), this, false /*should_launch_browser*/};
 };
 
 IN_PROC_BROWSER_TEST_P(SupervisionTransitionScreenTest,
diff --git a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_browsertest.cc b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_browsertest.cc
index b2ab273..67737df 100644
--- a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_browsertest.cc
+++ b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_browsertest.cc
@@ -30,7 +30,6 @@
 #include "components/user_manager/known_user.h"
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
-#include "net/dns/mock_host_resolver.h"
 
 namespace policy {
 
@@ -54,15 +53,6 @@
 
   ~UserCloudPolicyManagerTest() override = default;
 
-  // MixinBasedInProcessBrowserTest:
-  void SetUpOnMainThread() override {
-    // By default, browser tests block anything that doesn't go to localhost, so
-    // account.google.com requests would never reach fake GAIA server without
-    // this.
-    host_resolver()->AddRule("*", "127.0.0.1");
-    MixinBasedInProcessBrowserTest::SetUpOnMainThread();
-  }
-
   void TearDown() override {
     policy::BrowserPolicyConnector::SetNonEnterpriseDomainForTesting(nullptr);
     MixinBasedInProcessBrowserTest::TearDown();
@@ -83,7 +73,7 @@
  protected:
   chromeos::LoggedInUserMixin logged_in_user_mixin_{
       &mixin_host_, std::get<1>(GetParam()) /*type*/, embedded_test_server(),
-      true /*should_launch_browser*/,
+      this, true /*should_launch_browser*/,
       AccountId::FromUserEmailGaiaId(
           chromeos::FakeGaiaMixin::kEnterpriseUser1,
           chromeos::FakeGaiaMixin::kEnterpriseUser1GaiaId),
@@ -155,9 +145,6 @@
 }
 
 IN_PROC_BROWSER_TEST_P(UserCloudPolicyManagerTest, ErrorLoadingPolicy) {
-  logged_in_user_mixin_.GetLocalPolicyTestServerMixin()
-      ->SetExpectedPolicyFetchError(500);
-
   StartUserLogIn(false /*wait_for_active_session*/);
   RunUntilBrowserProcessQuits();
 
@@ -178,9 +165,6 @@
       logged_in_user_mixin_.GetAccountId(),
       user_manager::known_user::ProfileRequiresPolicy::kNoPolicyRequired);
 
-  logged_in_user_mixin_.GetLocalPolicyTestServerMixin()
-      ->SetExpectedPolicyFetchError(500);
-
   StartUserLogIn(true /*wait_for_active_session*/);
 
   // User should be marked as having a valid OAuth token.
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
index 577a8001..2dce722 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -308,10 +308,6 @@
       next_download_id_(download::DownloadItem::kInvalidId),
       next_id_retrieved_(false),
       download_prefs_(new DownloadPrefs(profile)),
-      disk_access_task_runner_(base::CreateSequencedTaskRunner(
-          {base::ThreadPool(), base::MayBlock(),
-           base::TaskPriority::BEST_EFFORT,
-           base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})),
       is_file_picker_showing_(false) {
 #if defined(OS_ANDROID)
   location_dialog_bridge_.reset(new DownloadLocationDialogBridgeImpl);
@@ -765,20 +761,6 @@
   platform_util::ShowItemInFolder(profile_, platform_path);
 }
 
-void ContinueCheckingForFileExistence(
-    content::CheckForFileExistenceCallback callback) {
-  std::move(callback).Run(false);
-}
-
-void ChromeDownloadManagerDelegate::CheckForFileExistence(
-    DownloadItem* download,
-    content::CheckForFileExistenceCallback callback) {
-  base::PostTaskAndReplyWithResult(
-      disk_access_task_runner_.get(), FROM_HERE,
-      base::BindOnce(&base::PathExists, download->GetTargetFilePath()),
-      std::move(callback));
-}
-
 std::string
 ChromeDownloadManagerDelegate::ApplicationClientIdForFileScanning() {
   return std::string(chrome::kApplicationClientIDStringForAVScanning);
diff --git a/chrome/browser/download/chrome_download_manager_delegate.h b/chrome/browser/download/chrome_download_manager_delegate.h
index 368740a7..d8eecbe 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.h
+++ b/chrome/browser/download/chrome_download_manager_delegate.h
@@ -113,12 +113,7 @@
   void SanitizeDownloadParameters(
       download::DownloadUrlParameters* params) override;
   void OpenDownload(download::DownloadItem* download) override;
-  bool IsMostRecentDownloadItemAtFilePath(
-      download::DownloadItem* download) override;
   void ShowDownloadInShell(download::DownloadItem* download) override;
-  void CheckForFileExistence(
-      download::DownloadItem* download,
-      content::CheckForFileExistenceCallback callback) override;
   std::string ApplicationClientIdForFileScanning() override;
   void CheckDownloadAllowed(
       const content::WebContents::Getter& web_contents_getter,
@@ -262,6 +257,10 @@
       bool storage_permission_granted,
       bool allow);
 
+  // Returns whether this is the most recent download in the rare event where
+  // multiple downloads are associated with the same file path.
+  bool IsMostRecentDownloadItemAtFilePath(download::DownloadItem* download);
+
 #if defined(OS_ANDROID)
   // Called after a unique file name is generated in the case that there is a
   // TARGET_CONFLICT and the new file name should be displayed to the user.
@@ -291,11 +290,6 @@
   IdCallbackVector id_callbacks_;
   std::unique_ptr<DownloadPrefs> download_prefs_;
 
-  // SequencedTaskRunner to check for file existence. A sequence is used so
-  // that a large download history doesn't cause a large number of concurrent
-  // disk operations.
-  const scoped_refptr<base::SequencedTaskRunner> disk_access_task_runner_;
-
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   // Maps from pending extension installations to DownloadItem IDs.
   typedef base::flat_map<extensions::CrxInstaller*,
diff --git a/chrome/browser/download/chrome_download_manager_delegate_unittest.cc b/chrome/browser/download/chrome_download_manager_delegate_unittest.cc
index 5181fa5..9655816c 100644
--- a/chrome/browser/download/chrome_download_manager_delegate_unittest.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate_unittest.cc
@@ -265,12 +265,6 @@
   void DetermineDownloadTarget(DownloadItem* download,
                                DetermineDownloadTargetResult* result);
 
-  // Invokes ChromeDownloadManagerDelegate::CheckForFileExistence and waits for
-  // the asynchronous callback. The result passed into
-  // content::CheckForFileExistenceCallback is the return value from this
-  // method.
-  bool CheckForFileExistence(DownloadItem* download);
-
   void OnConfirmationCallbackComplete(
       const DownloadTargetDeterminerDelegate::ConfirmationCallback& callback,
       DownloadConfirmationResult result,
@@ -417,24 +411,6 @@
   loop_runner.Run();
 }
 
-void StoreBoolAndRunClosure(const base::Closure& closure,
-                            bool* result_storage,
-                            bool result) {
-  *result_storage = result;
-  closure.Run();
-}
-
-bool ChromeDownloadManagerDelegateTest::CheckForFileExistence(
-    DownloadItem* download_item) {
-  base::RunLoop loop_runner;
-  bool result = false;
-  delegate()->CheckForFileExistence(
-      download_item, base::BindOnce(&StoreBoolAndRunClosure,
-                                    loop_runner.QuitClosure(), &result));
-  loop_runner.Run();
-  return result;
-}
-
 void ChromeDownloadManagerDelegateTest::OnConfirmationCallbackComplete(
     const DownloadTargetDeterminerDelegate::ConfirmationCallback& callback,
     DownloadConfirmationResult result,
@@ -681,25 +657,6 @@
   }
 }
 
-TEST_F(ChromeDownloadManagerDelegateTest, CheckForFileExistence) {
-  const char kData[] = "helloworld";
-  const size_t kDataLength = sizeof(kData) - 1;
-  base::FilePath existing_path = GetDownloadDirectory().AppendASCII("foo");
-  base::FilePath non_existent_path = GetDownloadDirectory().AppendASCII("bar");
-  base::WriteFile(existing_path, kData, kDataLength);
-
-  std::unique_ptr<download::MockDownloadItem> download_item =
-      CreateActiveDownloadItem(1);
-  EXPECT_CALL(*download_item, GetTargetFilePath())
-      .WillRepeatedly(ReturnRef(existing_path));
-  EXPECT_TRUE(CheckForFileExistence(download_item.get()));
-
-  download_item = CreateActiveDownloadItem(1);
-  EXPECT_CALL(*download_item, GetTargetFilePath())
-      .WillRepeatedly(ReturnRef(non_existent_path));
-  EXPECT_FALSE(CheckForFileExistence(download_item.get()));
-}
-
 TEST_F(ChromeDownloadManagerDelegateTest, BlockedByPolicy) {
   const GURL kUrl("http://example.com/foo");
   const std::string kTargetDisposition("attachment; filename=\"foo.txt\"");
diff --git a/chrome/browser/download/mixed_content_download_blocking.cc b/chrome/browser/download/mixed_content_download_blocking.cc
index 60772fd..b5faf91c 100644
--- a/chrome/browser/download/mixed_content_download_blocking.cc
+++ b/chrome/browser/download/mixed_content_download_blocking.cc
@@ -22,6 +22,8 @@
 #include "url/gurl.h"
 #include "url/origin.h"
 
+using download::DownloadSource;
+
 namespace {
 
 // Map the string file extension to the corresponding histogram enum.
@@ -183,16 +185,38 @@
     is_inferred = true;
   }
 
-  if (is_inferred &&
-      item.GetDownloadSource() != download::DownloadSource::CONTEXT_MENU) {
+  auto download_source = item.GetDownloadSource();
+  auto transition_type = item.GetTransitionType();
+
+  // Report a trace if we inferred an initiator in an unexpected way. We expect
+  // this to happen with:
+  //  - context-menu-initiated downloads,
+  //  - user-initiated downloads of offline pages on Android,
+  //  - requests in e.g., webview/CCT.
+  //
+  // TODO(1029082): We also occasionally find 'regular' navigations without
+  // initiators (NAVIGATION/PAGE_TRANSITION_LINK).  The trace doesn't help in
+  // this case, so ignore them here.
+  if (is_inferred && download_source != DownloadSource::CONTEXT_MENU &&
+      download_source != DownloadSource::OFFLINE_PAGE &&
+      !(transition_type & ui::PAGE_TRANSITION_FROM_API) &&
+      !(download_source == DownloadSource::NAVIGATION &&
+        PageTransitionTypeIncludingQualifiersIs(transition_type,
+                                                ui::PAGE_TRANSITION_LINK))) {
     ReportTrace(base::StringPrintf("inferred initiator [%d, %x]",
-                                   item.GetDownloadSource(),
-                                   item.GetTransitionType()));
+                                   download_source, transition_type));
   }
-  if (!initiator.has_value()) {
+
+  // Report a trace if we still don't have an initiator. This mostly happens
+  // with INTERNAL_API calls, which are OK.
+  //
+  // TODO(1029062): INTERNAL_API is also used for background fetch. That
+  // probably isn't the correct behavior, since INTERNAL_API is otherwise used
+  // for Chrome stuff. Background fetch should probably be HTTPS-only.
+  if (!initiator.has_value() &&
+      download_source != DownloadSource::INTERNAL_API) {
     ReportTrace(base::StringPrintf("no initiator found [%d, %x]",
-                                   item.GetDownloadSource(),
-                                   item.GetTransitionType()));
+                                   download_source, transition_type));
   }
 
   // Then see if that extension is blocked
diff --git a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
index 3aa0bd8..f2141ee 100644
--- a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
+++ b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
@@ -9,6 +9,7 @@
 #include <algorithm>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/containers/circular_deque.h"
 #include "base/files/file_util.h"
 #include "base/guid.h"
@@ -1789,9 +1790,8 @@
         first_request_(first_request) {}
   ~CustomResponse() override {}
 
-  void SendResponse(
-      const net::test_server::SendBytesCallback& send,
-      const net::test_server::SendCompleteCallback& done) override {
+  void SendResponse(const net::test_server::SendBytesCallback& send,
+                    net::test_server::SendCompleteCallback done) override {
     std::string response(
         "HTTP/1.1 200 OK\r\n"
         "Content-type: application/octet-stream\r\n"
@@ -1802,7 +1802,7 @@
     if (first_request_) {
       *callback_ = std::move(done);
       *task_runner_ = base::ThreadTaskRunnerHandle::Get().get();
-      send.Run(response, base::BindRepeating([]() {}));
+      send.Run(response, base::DoNothing());
     } else {
       send.Run(response, std::move(done));
     }
@@ -1858,7 +1858,8 @@
 
   item->SimulateErrorForTesting(
       download::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED);
-  embedded_test_server_io_runner->PostTask(FROM_HERE, complete_callback);
+  embedded_test_server_io_runner->PostTask(FROM_HERE,
+                                           std::move(complete_callback));
 
   ASSERT_TRUE(WaitFor(downloads::OnChanged::kEventName,
                       base::StringPrintf("[{\"id\":%d,"
diff --git a/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc b/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
index 33e30fb..b6de64a6 100644
--- a/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
+++ b/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc
@@ -1005,6 +1005,7 @@
   enum ExpectedNavigationStatus {
     EXPECTING_NAVIGATION_SUCCESS,
     EXPECTING_NAVIGATION_FAILURE,
+    EXPECTING_NO_NAVIGATION,
   };
 
   void TestPopupNavigationViaGet(
@@ -1066,8 +1067,11 @@
     } else {
       // If the extension popup is still opened, then wait until there is no
       // load in progress, and verify whether the navigation succeeded or not.
-      popup_navigation_observer.Wait();
-
+      if (expected_navigation_status != EXPECTING_NO_NAVIGATION) {
+        popup_navigation_observer.Wait();
+      } else {
+        EXPECT_FALSE(popup->IsLoading());
+      }
       // The popup should still be alive.
       ASSERT_TRUE(popup_destruction_watcher.web_contents());
 
@@ -1117,7 +1121,12 @@
 // Tests that an extension pop-up cannot be navigated to a web page.
 IN_PROC_BROWSER_TEST_F(NavigatingExtensionPopupBrowserTest, MAYBE_Webpage) {
   GURL web_url(embedded_test_server()->GetURL("foo.com", "/title1.html"));
-  TestPopupNavigationViaGet(web_url, EXPECTING_NAVIGATION_FAILURE);
+
+  // The GET request will be blocked in ExtensionViewHost::OpenURLFromTab
+  // (which silently drops navigations with CURRENT_TAB disposition).
+  TestPopupNavigationViaGet(web_url, EXPECTING_NO_NAVIGATION);
+
+  // POST requests don't go through ExtensionViewHost::OpenURLFromTab.
   TestPopupNavigationViaPost(web_url, EXPECTING_NAVIGATION_FAILURE);
 }
 
@@ -1139,13 +1148,22 @@
 IN_PROC_BROWSER_TEST_F(NavigatingExtensionPopupBrowserTest,
                        PageInOtherExtension) {
   GURL other_extension_url = other_extension().GetResourceURL("other.html");
-  TestPopupNavigationViaGet(other_extension_url, EXPECTING_NAVIGATION_FAILURE);
+  TestPopupNavigationViaGet(other_extension_url, EXPECTING_NO_NAVIGATION);
   TestPopupNavigationViaPost(other_extension_url, EXPECTING_NAVIGATION_FAILURE);
 }
 
 // Tests that navigating an extension pop-up to a http URI that returns
 // Content-Disposition: attachment; filename=...
 // works: No navigation, but download shelf visible + download goes through.
+//
+// Note - there is no "...ViaGet" flavour of this test, because we don't care
+// (yet) if GET succeeds with the download or not (it probably should succeed
+// for consistency with POST, but it always failed in M54 and before).  After
+// abandoing ShouldFork/OpenURL for all methods (not just for POST) [see comment
+// about https://crbug.com/646261 in ChromeContentRendererClient::ShouldFork]
+// GET should automagically start working for downloads.
+// TODO(lukasza): https://crbug.com/650694: Add a "Get" flavour of the test once
+// the download works both for GET and POST requests.
 IN_PROC_BROWSER_TEST_F(NavigatingExtensionPopupBrowserTest, DownloadViaPost) {
   // Setup monitoring of the downloads.
   content::DownloadTestObserverTerminal downloads_observer(
@@ -1180,40 +1198,6 @@
 #endif
 }
 
-IN_PROC_BROWSER_TEST_F(NavigatingExtensionPopupBrowserTest, DownloadViaGet) {
-  // Setup monitoring of the downloads.
-  content::DownloadTestObserverTerminal downloads_observer(
-      content::BrowserContext::GetDownloadManager(browser()->profile()),
-      1,  // == wait_count (only waiting for "download-test3.gif").
-      content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
-
-  // Navigate to a URL that replies with
-  // Content-Disposition: attachment; filename=...
-  // header.
-  GURL download_url(
-      embedded_test_server()->GetURL("foo.com", "/download-test3.gif"));
-  TestPopupNavigationViaGet(download_url, EXPECTING_NAVIGATION_FAILURE);
-
-  // Verify that "download-test3.gif got downloaded.
-  downloads_observer.WaitForFinished();
-  EXPECT_EQ(0u, downloads_observer.NumDangerousDownloadsSeen());
-  EXPECT_EQ(1u, downloads_observer.NumDownloadsSeenInState(
-                    download::DownloadItem::COMPLETE));
-
-  base::ScopedAllowBlockingForTesting allow_blocking;
-  base::FilePath downloads_directory =
-      DownloadPrefs(browser()->profile()).DownloadPath();
-  EXPECT_TRUE(base::PathExists(
-      downloads_directory.AppendASCII("download-test3-attachment.gif")));
-
-  // The test verification below is applicable only to scenarios where the
-  // download shelf is supported - on ChromeOS, instead of the download shelf,
-  // there is a download notification in the right-bottom corner of the screen.
-#if !defined(OS_CHROMEOS)
-  EXPECT_TRUE(browser()->window()->IsDownloadShelfVisible());
-#endif
-}
-
 // Verify video can enter and exit Picture-in_Picture when browser action icon
 // is clicked.
 IN_PROC_BROWSER_TEST_F(BrowserActionApiTest,
diff --git a/chrome/browser/extensions/api/management/management_api_non_persistent_apitest.cc b/chrome/browser/extensions/api/management/management_api_non_persistent_apitest.cc
index 3d664ad3..febd21f 100644
--- a/chrome/browser/extensions/api/management/management_api_non_persistent_apitest.cc
+++ b/chrome/browser/extensions/api/management/management_api_non_persistent_apitest.cc
@@ -121,9 +121,8 @@
                          ManagementApiNonPersistentApiTest,
                          ::testing::Values(ContextType::kEventPage));
 
-// Flaky: crbug.com/1003597
-// INSTANTIATE_TEST_SUITE_P(ServiceWorker,
-//                          ManagementApiNonPersistentApiTest,
-//                          ::testing::Values(ContextType::kServiceWorker));
+INSTANTIATE_TEST_SUITE_P(ServiceWorker,
+                         ManagementApiNonPersistentApiTest,
+                         ::testing::Values(ContextType::kServiceWorker));
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
index e88e6e18..00aef3e 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
@@ -380,7 +380,8 @@
       : embedded_test_server_(std::make_unique<net::EmbeddedTestServer>()),
         logged_in_user_mixin_(&mixin_host_,
                               chromeos::LoggedInUserMixin::LogInType::kChild,
-                              embedded_test_server_.get()) {
+                              embedded_test_server_.get(),
+                              this) {
     // Suppress regular user login to enable child user login.
     set_chromeos_user_ = false;
   }
@@ -425,8 +426,7 @@
   void SetUpOnMainThread() override {
     mixin_host_.SetUpOnMainThread();
     ExtensionWebstorePrivateApiTest::SetUpOnMainThread();
-    logged_in_user_mixin_.SetUpOnMainThreadHelper(
-        host_resolver(), this, true /* issue_any_scope_token */);
+    logged_in_user_mixin_.LogInUser(true /*issue_any_scope_token*/);
   }
 
   void TearDownOnMainThread() override {
diff --git a/chrome/browser/extensions/extension_resource_request_policy_apitest.cc b/chrome/browser/extensions/extension_resource_request_policy_apitest.cc
index 9d324f50..375a2c8 100644
--- a/chrome/browser/extensions/extension_resource_request_policy_apitest.cc
+++ b/chrome/browser/extensions/extension_resource_request_policy_apitest.cc
@@ -297,8 +297,9 @@
   EXPECT_EQ(content::PAGE_TYPE_ERROR,
             controller.GetLastCommittedEntry()->GetPageType());
   EXPECT_EQ("chrome-error://chromewebdata/", result);
-  GURL invalid_url("chrome-extension://invalid/");
-  EXPECT_EQ(invalid_url, web_contents->GetMainFrame()->GetLastCommittedURL());
+  GURL nonaccessible_url = extension->GetResourceURL("/test2.png");
+  EXPECT_EQ(nonaccessible_url,
+            web_contents->GetMainFrame()->GetLastCommittedURL());
 
   // Redirects can sometimes occur before the load event, so use a
   // UrlLoadObserver instead of blocking waiting for two load events.
@@ -314,7 +315,7 @@
   EXPECT_EQ(accessible_url, web_contents->GetLastCommittedURL());
 
   ui_test_utils::UrlLoadObserver nonaccessible_observer(
-      invalid_url, content::NotificationService::AllSources());
+      nonaccessible_url, content::NotificationService::AllSources());
   GURL nonaccessible_client_redirect_resource(embedded_test_server()->GetURL(
       "/extensions/api_test/extension_resource_request_policy/"
       "web_accessible/nonaccessible_redirect_resource.html"));
@@ -323,7 +324,7 @@
   nonaccessible_observer.Wait();
   EXPECT_EQ(content::PAGE_TYPE_ERROR,
             controller.GetLastCommittedEntry()->GetPageType());
-  EXPECT_EQ(invalid_url, web_contents->GetLastCommittedURL());
+  EXPECT_EQ(nonaccessible_url, web_contents->GetLastCommittedURL());
 }
 
 IN_PROC_BROWSER_TEST_F(ExtensionResourceRequestPolicyTest,
diff --git a/chrome/browser/extensions/extension_service_sync_unittest.cc b/chrome/browser/extensions/extension_service_sync_unittest.cc
index 83c25fa..6dd5a8b 100644
--- a/chrome/browser/extensions/extension_service_sync_unittest.cc
+++ b/chrome/browser/extensions/extension_service_sync_unittest.cc
@@ -1874,12 +1874,12 @@
     EXPECT_EQ(base::Version(version), extension->version());
   }
 
-  // Simulate a custodian approval for enabling the extension coming in
+  // Simulate a custodian or child approval for enabling the extension coming in
   // through Sync by adding the approved version to the map of approved
   // extensions. It doesn't simulate a change in the disable reasons.
-  void SimulateCustodianApprovalChangeViaSync(const std::string& extension_id,
-                                              const std::string& version,
-                                              SyncChange::SyncChangeType type) {
+  void SimulateApprovalChangeViaSync(const std::string& extension_id,
+                                     const std::string& version,
+                                     SyncChange::SyncChangeType type) {
     supervised_user_service()->UpdateApprovedExtensions(extension_id, version,
                                                         type);
   }
@@ -1924,10 +1924,10 @@
   base::test::ScopedFeatureList scoped_feature_list_;
 };
 
+// Test that if "Permissions for sites and apps" toggle is disabled, resulting
+// in the pref kSupervisedUserExtensionsMayRequestPermissions returning false,
+// then child users cannot install new extensions.
 TEST_F(ExtensionServiceTestSupervised, SupervisedUserCannotInstallExtension) {
-  // Test that if "Permissions for sites and apps" toggle is disabled, resulting
-  // in the pref kSupervisedUserExtensionsMayRequestPermissions returning false,
-  // then child users cannot install new extensions.
   InitSupervisedUserInitiatedExtensionInstallFeature(true);
 
   InitServices(true /* profile_is_supervised */);
@@ -1942,10 +1942,10 @@
   EXPECT_FALSE(extension);
 }
 
+// Test that a data sync attempting to enable an extension does not circumvent
+// supervised user controls, and the extension remains disabled.
 TEST_F(ExtensionServiceTestSupervised,
        AddSupervisionAndSyncShouldNotReenablePreinstalledExtension) {
-  // Test that a data sync attempting to enable an extension does not circumvent
-  // supervised user controls, and the extension remains disabled.
   InitSupervisedUserInitiatedExtensionInstallFeature(true);
 
   InitServices(false /* profile_is_supervised */);
@@ -1984,10 +1984,10 @@
       id, extensions::disable_reason::DISABLE_CUSTODIAN_APPROVAL_REQUIRED));
 }
 
+// Test that simulating custodian approval for regular users doesn't cause any
+// unexpected behavior.
 TEST_F(ExtensionServiceTestSupervised,
        CustodianApprovalDoesNotAffectRegularUsers) {
-  // Test that simulating custodian approval for regular users doesn't cause any
-  // unexpected behavior.
   InitSupervisedUserInitiatedExtensionInstallFeature(true);
 
   InitServices(false /* profile_is_supervised */);
@@ -2005,16 +2005,16 @@
   EXPECT_TRUE(registry()->enabled_extensions().Contains(id));
 
   // Simulate custodian approval.
-  SimulateCustodianApprovalChangeViaSync(id, version, SyncChange::ACTION_ADD);
+  SimulateApprovalChangeViaSync(id, version, SyncChange::ACTION_ADD);
   // The extension should still be enabled.
   EXPECT_TRUE(registry()->enabled_extensions().Contains(id));
 }
 
+// Tests that a child user is allowed to install extensions when pref
+// kSupervisedUserExtensionsMayRequestPermissions is set to true, but that
+// newly-installed extensions are disabled until approved.
 TEST_F(ExtensionServiceTestSupervised,
        InstallAllowedButDisabledForSupervisedUser) {
-  // Tests that a child user is allowed to install extensions when pref
-  // kSupervisedUserExtensionsMayRequestPermissions is set to true, but that
-  // newly-installed extensions are disabled until approved.
   InitSupervisedUserInitiatedExtensionInstallFeature(true);
 
   InitServices(true /* profile_is_supervised */);
@@ -2083,9 +2083,9 @@
             ExtensionPrefs::Get(profile())->GetDisableReasons(id));
 }
 
+// This tests the case when the sync entity flagging the extension as approved
+// arrives before the extension itself is installed.
 TEST_F(ExtensionServiceTestSupervised, ExtensionApprovalBeforeInstallation) {
-  // This tests the case when the sync entity flagging the extension as approved
-  // arrives before the extension itself is installed.
   InitSupervisedUserInitiatedExtensionInstallFeature(true);
 
   InitServices(true /* profile_is_supervised */);
@@ -2096,7 +2096,7 @@
   std::string id = good_crx;
   std::string version("1.0.0.0");
 
-  SimulateCustodianApprovalChangeViaSync(id, version, SyncChange::ACTION_ADD);
+  SimulateApprovalChangeViaSync(id, version, SyncChange::ACTION_ADD);
 
   // Now install an extension.
   base::FilePath path = data_dir().AppendASCII("good.crx");
@@ -2107,9 +2107,9 @@
   EXPECT_FALSE(IsPendingCustodianApproval(id));
 }
 
+// Test that if an approved extension is updated to a newer version that doesn't
+// require additional permissions, it is still enabled.
 TEST_F(ExtensionServiceTestSupervised, UpdateWithoutPermissionIncrease) {
-  // Test that if an approved extension is updated to a newer version that
-  // doesn't require additional permissions, it is still enabled.
   InitSupervisedUserInitiatedExtensionInstallFeature(true);
 
   InitServices(true /* profile_is_supervised */);
@@ -2120,7 +2120,7 @@
   // Save the id, as the extension object will be destroyed during updating.
   std::string id = InstallNoPermissionsTestExtension();
   std::string version1("1");
-  SimulateCustodianApprovalChangeViaSync(id, version1, SyncChange::ACTION_ADD);
+  SimulateApprovalChangeViaSync(id, version1, SyncChange::ACTION_ADD);
 
   // Update to a new version.
   std::string version2("2");
@@ -2155,7 +2155,7 @@
   // Simulate a custodian approval for re-enabling the extension coming in
   // through Sync, but set the old version. This can happen when there already
   // was a pending request for an earlier version of the extension.
-  SimulateCustodianApprovalChangeViaSync(id, version1, SyncChange::ACTION_ADD);
+  SimulateApprovalChangeViaSync(id, version1, SyncChange::ACTION_ADD);
 
   // The re-enable should be ignored, since the version doesn't match.
   EXPECT_FALSE(registry()->enabled_extensions().Contains(id));
@@ -2184,17 +2184,17 @@
 
   // Simulate a custodian approval for re-enabling the extension coming in
   // through Sync.
-  SimulateCustodianApprovalChangeViaSync(id, version2, SyncChange::ACTION_ADD);
+  SimulateApprovalChangeViaSync(id, version2, SyncChange::ACTION_ADD);
 
   // The extension should have gotten re-enabled.
   EXPECT_TRUE(registry()->enabled_extensions().Contains(id));
   EXPECT_FALSE(IsPendingCustodianApproval(id));
 }
 
+// Test that approvals for a newer version don't enable an extension until it
+// updates to that approved, newer version.
 TEST_F(ExtensionServiceTestSupervised,
        UpdateWithPermissionIncreaseApprovalNewVersion) {
-  // Test that approvals for a newer version don't enable an extension until it
-  // updates to that approved, newer version.
   InitSupervisedUserInitiatedExtensionInstallFeature(true);
 
   InitServices(true /* profile_is_supervised */);
@@ -2204,7 +2204,7 @@
 
   std::string id = InstallPermissionsTestExtension();
   const std::string version1("1");
-  SimulateCustodianApprovalChangeViaSync(id, version1, SyncChange::ACTION_ADD);
+  SimulateApprovalChangeViaSync(id, version1, SyncChange::ACTION_ADD);
 
   // Update to a new version with increased permissions.
   const std::string version2("2");
@@ -2213,8 +2213,7 @@
   // Simulate a custodian approval for re-enabling the extension coming in
   // through Sync. Set a newer version than we have installed.
   const std::string version3("3");
-  SimulateCustodianApprovalChangeViaSync(id, version3,
-                                         SyncChange::ACTION_UPDATE);
+  SimulateApprovalChangeViaSync(id, version3, SyncChange::ACTION_UPDATE);
 
   // The re-enable should be delayed until the extension is updated to the
   // matching version.
@@ -2248,16 +2247,14 @@
   EXPECT_TRUE(registry()->disabled_extensions().Contains(good_crx));
   EXPECT_TRUE(IsPendingCustodianApproval(extension->id()));
 
-  SimulateCustodianApprovalChangeViaSync(good_crx, version,
-                                         SyncChange::ACTION_ADD);
+  SimulateApprovalChangeViaSync(good_crx, version, SyncChange::ACTION_ADD);
 
   // The extension should be enabled now.
   EXPECT_TRUE(registry()->enabled_extensions().Contains(good_crx));
   EXPECT_FALSE(IsPendingCustodianApproval(extension->id()));
 
   // Simulate approval removal coming via Sync.
-  SimulateCustodianApprovalChangeViaSync(good_crx, version,
-                                         SyncChange::ACTION_DELETE);
+  SimulateApprovalChangeViaSync(good_crx, version, SyncChange::ACTION_DELETE);
 
   // The extension should be disabled now.
   EXPECT_TRUE(registry()->disabled_extensions().Contains(good_crx));
@@ -2276,7 +2273,7 @@
   std::string id = InstallNoPermissionsTestExtension();
   std::string version1("1");
 
-  SimulateCustodianApprovalChangeViaSync(id, version1, SyncChange::ACTION_ADD);
+  SimulateApprovalChangeViaSync(id, version1, SyncChange::ACTION_ADD);
 
   // The extension should be enabled now.
   EXPECT_TRUE(registry()->enabled_extensions().Contains(id));
@@ -2318,7 +2315,7 @@
   std::string id = InstallPermissionsTestExtension();
   std::string version1("1");
 
-  SimulateCustodianApprovalChangeViaSync(id, version1, SyncChange::ACTION_ADD);
+  SimulateApprovalChangeViaSync(id, version1, SyncChange::ACTION_ADD);
 
   // The extension should be enabled now.
   EXPECT_TRUE(registry()->enabled_extensions().Contains(id));
@@ -2334,8 +2331,7 @@
 
   std::string version2("2");
   // Approve an older version
-  SimulateCustodianApprovalChangeViaSync(id, version2,
-                                         SyncChange::ACTION_UPDATE);
+  SimulateApprovalChangeViaSync(id, version2, SyncChange::ACTION_UPDATE);
 
   // The extension should remain disabled.
   EXPECT_FALSE(registry()->enabled_extensions().Contains(id));
@@ -2346,8 +2342,7 @@
 
   EXPECT_TRUE(IsPendingCustodianApproval(id));
   // Approve the latest version
-  SimulateCustodianApprovalChangeViaSync(id, version3,
-                                         SyncChange::ACTION_UPDATE);
+  SimulateApprovalChangeViaSync(id, version3, SyncChange::ACTION_UPDATE);
 
   // The extension should be enabled again.
   EXPECT_TRUE(registry()->enabled_extensions().Contains(id));
@@ -2366,15 +2361,14 @@
   std::string id = InstallPermissionsTestExtension();
 
   std::string version1("1");
-  SimulateCustodianApprovalChangeViaSync(id, version1, SyncChange::ACTION_ADD);
+  SimulateApprovalChangeViaSync(id, version1, SyncChange::ACTION_ADD);
 
   // The extension should be enabled now.
   EXPECT_TRUE(registry()->enabled_extensions().Contains(id));
 
   std::string version2("2");
   // Approve a newer version
-  SimulateCustodianApprovalChangeViaSync(id, version2,
-                                         SyncChange::ACTION_UPDATE);
+  SimulateApprovalChangeViaSync(id, version2, SyncChange::ACTION_UPDATE);
 
   // The extension should be disabled.
   CheckDisabledForCustodianApproval(id);
@@ -2386,11 +2380,11 @@
   EXPECT_FALSE(IsPendingCustodianApproval(id));
 }
 
+// Test that child users cannot install new extensions when the "Permissions for
+// sites and apps" toggle is off. This toggle setting is reflected in the
+// kSupervisedUserExtensionsMayRequestPermissions pref being set to false.
 TEST_F(ExtensionServiceTestSupervised,
        SupervisedUserExtensionsMayRequestPermissionsToggleOff) {
-  // Test that child users cannot install new extensions when the "Permissions
-  // for sites and apps" toggle is off. This toggle setting is reflected in the
-  // kSupervisedUserExtensionsMayRequestPermissions pref being set to false.
   InitSupervisedUserInitiatedExtensionInstallFeature(true);
 
   InitServices(false /* profile_is_supervised */);
@@ -2420,11 +2414,11 @@
   EXPECT_FALSE(extension2);
 }
 
+// Test that if "Permissions for sites and apps" is toggled off and
+// kSupervisedUserExtensionsMayRequestPermissions is set to false, existing
+// supervised user's approved and enabled extensions are not affected.
 TEST_F(ExtensionServiceTestSupervised,
        SupervisedUserExtensionsMayRequestPermissionsDoesNotAffectExisting) {
-  // Test that if "Permissions for sites and apps" is toggled off and
-  // kSupervisedUserExtensionsMayRequestPermissions is set to false, existing
-  // supervised user's approved and enabled extensions are not affected.
   InitSupervisedUserInitiatedExtensionInstallFeature(true);
 
   InitServices(true /* profile_is_supervised */);
@@ -2441,7 +2435,7 @@
 
   // Now approve the extension.
   const std::string version1("1");
-  SimulateCustodianApprovalChangeViaSync(id, version1, SyncChange::ACTION_ADD);
+  SimulateApprovalChangeViaSync(id, version1, SyncChange::ACTION_ADD);
 
   // The extension should be enabled now.
   EXPECT_TRUE(registry()->enabled_extensions().Contains(id));
@@ -2472,10 +2466,64 @@
   EXPECT_FALSE(extension2);
 }
 
+// This test verifies that child users cannot approve existing extensions asking
+// for additional permissions when
+// kSupervisedUserExtensionsMayRequestPermissions is false.
+TEST_F(ExtensionServiceTestSupervised,
+       ChildUserCannotApproveAdditionalPermissions) {
+  InitSupervisedUserInitiatedExtensionInstallFeature(true);
+
+  InitServices(true /* profile_is_supervised */);
+
+  SetSupervisedUserExtensionsMayRequestPermissionsPref(true);
+
+  std::string id = InstallPermissionsTestExtension();
+  const std::string version1("1");
+  // Simulate parent granting approval for the initial version.
+  SimulateApprovalChangeViaSync(id, version1, SyncChange::ACTION_ADD);
+
+  // The extension should be enabled now.
+  EXPECT_TRUE(registry()->enabled_extensions().Contains(id));
+  EXPECT_FALSE(IsPendingCustodianApproval(id));
+
+  // Update to a new version with increased permissions.
+  const std::string version2("2");
+  UpdatePermissionsTestExtension(id, version2, DISABLED);
+  EXPECT_TRUE(IsPendingCustodianApproval(id));
+
+  // Simulate child granting approval for the new permissions.
+  SimulateApprovalChangeViaSync(id, version2, SyncChange::ACTION_UPDATE);
+
+  // The extension should be enabled now.
+  EXPECT_TRUE(registry()->enabled_extensions().Contains(id));
+  EXPECT_FALSE(IsPendingCustodianApproval(id));
+
+  SetSupervisedUserExtensionsMayRequestPermissionsPref(false);
+
+  // Update to a new version with increased permissions.
+  const std::string version3("3");
+  UpdatePermissionsTestExtension(id, version3, DISABLED);
+  EXPECT_TRUE(IsPendingCustodianApproval(id));
+
+  // The child should not be able to approve additional permissions when
+  // kSupervisedUserExtensionsMayRequestPermissions is false, but suppose
+  // somehow the child is able to circumvent controls and grant approval.
+  SimulateApprovalChangeViaSync(id, version3, SyncChange::ACTION_UPDATE);
+
+  // The extension should still be blocked.
+  EXPECT_FALSE(registry()->enabled_extensions().Contains(id));
+  EXPECT_TRUE(IsPendingCustodianApproval(id));
+  int disable_reasons = ExtensionPrefs::Get(profile())->GetDisableReasons(id);
+  EXPECT_EQ(
+      disable_reasons,
+      extensions::disable_reason::DISABLE_PERMISSIONS_INCREASE |
+          extensions::disable_reason::DISABLE_CUSTODIAN_APPROVAL_REQUIRED);
+}
+
 #endif  // BUILDFLAG(ENABLE_SUPERVISED_USERS)
 
-// Tests sync behavior in the case of an item that starts out as an app and
-// gets updated to become an extension.
+// Tests sync behavior in the case of an item that starts out as an app and gets
+// updated to become an extension.
 TEST_F(ExtensionServiceSyncTest, AppToExtension) {
   InitializeEmptyExtensionService();
   service()->Init();
diff --git a/chrome/browser/extensions/extension_view.h b/chrome/browser/extensions/extension_view.h
index 41e89b5d..2f99d91 100644
--- a/chrome/browser/extensions/extension_view.h
+++ b/chrome/browser/extensions/extension_view.h
@@ -7,8 +7,6 @@
 
 #include "ui/gfx/native_widget_types.h"
 
-class Browser;
-
 namespace content {
 struct NativeWebKeyboardEvent;
 class RenderViewHost;
@@ -26,9 +24,6 @@
  public:
   virtual ~ExtensionView() {}
 
-  // If attached to a Browser (e.g. popups), the Browser it is attached to.
-  virtual Browser* GetBrowser() = 0;
-
   // Returns the extension's native view.
   virtual gfx::NativeView GetNativeView() = 0;
 
diff --git a/chrome/browser/extensions/extension_view_host.cc b/chrome/browser/extensions/extension_view_host.cc
index 991aa432..5ef5a6f0 100644
--- a/chrome/browser/extensions/extension_view_host.cc
+++ b/chrome/browser/extensions/extension_view_host.cc
@@ -64,13 +64,11 @@
   DISALLOW_COPY_AND_ASSIGN(AssociatedWebContentsObserver);
 };
 
-ExtensionViewHost::ExtensionViewHost(
-    const Extension* extension,
-    content::SiteInstance* site_instance,
-    const GURL& url,
-    ViewType host_type)
-    : ExtensionHost(extension, site_instance, url, host_type),
-      associated_web_contents_(NULL) {
+ExtensionViewHost::ExtensionViewHost(const Extension* extension,
+                                     content::SiteInstance* site_instance,
+                                     const GURL& url,
+                                     ViewType host_type)
+    : ExtensionHost(extension, site_instance, url, host_type) {
   // Not used for panels, see PanelHost.
   DCHECK(host_type == VIEW_TYPE_EXTENSION_DIALOG ||
          host_type == VIEW_TYPE_EXTENSION_POPUP);
@@ -112,7 +110,13 @@
 }
 
 void ExtensionViewHost::CreateView(Browser* browser) {
-  view_ = CreateExtensionView(this, browser);
+  // TODO(devlin): Add the following sanity check:
+  // if (browser) {
+  //   DCHECK_EQ(Profile::FromBrowserContext(browser_context()),
+  //             browser->profile());
+  // }
+  browser_ = browser;
+  view_ = CreateExtensionView(this, browser ? browser->profile() : nullptr);
 }
 
 void ExtensionViewHost::SetAssociatedWebContents(WebContents* web_contents) {
@@ -179,8 +183,7 @@
     case WindowOpenDisposition::OFF_THE_RECORD: {
       // Only allow these from hosts that are bound to a browser (e.g. popups).
       // Otherwise they are not driven by a user gesture.
-      Browser* browser = view_->GetBrowser();
-      return browser ? browser->OpenURL(params) : nullptr;
+      return browser_ ? browser_->OpenURL(params) : nullptr;
     }
     default:
       return nullptr;
@@ -205,9 +208,8 @@
   }
 
   // Handle higher priority browser shortcuts such as Ctrl-w.
-  Browser* browser = view_->GetBrowser();
-  if (browser)
-    return browser->PreHandleKeyboardEvent(source, event);
+  if (browser_)
+    return browser_->PreHandleKeyboardEvent(source, event);
 
   return content::KeyboardEventProcessingResult::NOT_HANDLED;
 }
@@ -304,8 +306,7 @@
 }
 
 WindowController* ExtensionViewHost::GetExtensionWindowController() const {
-  Browser* browser = view_->GetBrowser();
-  return browser ? browser->extension_window_controller() : NULL;
+  return browser_ ? browser_->extension_window_controller() : nullptr;
 }
 
 WebContents* ExtensionViewHost::GetAssociatedWebContents() const {
diff --git a/chrome/browser/extensions/extension_view_host.h b/chrome/browser/extensions/extension_view_host.h
index d86583f..8e19ba62 100644
--- a/chrome/browser/extensions/extension_view_host.h
+++ b/chrome/browser/extensions/extension_view_host.h
@@ -16,6 +16,7 @@
 #include "extensions/browser/extension_host.h"
 
 class Browser;
+class Profile;
 
 namespace content {
 class SiteInstance;
@@ -41,6 +42,7 @@
                     ViewType host_type);
   ~ExtensionViewHost() override;
 
+  Browser* browser() { return browser_; }
   ExtensionView* view() { return view_.get(); }
   const ExtensionView* view() const { return view_.get(); }
 
@@ -117,12 +119,16 @@
   // Implemented per-platform. Create the platform-specific ExtensionView.
   static std::unique_ptr<ExtensionView> CreateExtensionView(
       ExtensionViewHost* host,
-      Browser* browser);
+      Profile* profile);
+
+  // The browser associated with the ExtensionView, if any.
+  Browser* browser_ = nullptr;
+
   // Optional view that shows the rendered content in the UI.
   std::unique_ptr<ExtensionView> view_;
 
   // The relevant WebContents associated with this ExtensionViewHost, if any.
-  content::WebContents* associated_web_contents_;
+  content::WebContents* associated_web_contents_ = nullptr;
 
   // Observer to detect when the associated web contents is destroyed.
   class AssociatedWebContentsObserver;
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc
index 1201330..eddf562 100644
--- a/chrome/browser/extensions/service_worker_apitest.cc
+++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -400,13 +400,7 @@
 }
 
 // Tests chrome.webRequest APIs.
-// Times out on Mac/Win only.  https://crbug.com/997686
-#if defined(OS_WIN) || defined(OS_MACOSX)
-#define MAYBE_WebRequest DISABLED_WebRequest
-#else
-#define MAYBE_WebRequest WebRequest
-#endif
-IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest, MAYBE_WebRequest) {
+IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest, WebRequest) {
   ASSERT_TRUE(
       RunExtensionTest("service_worker/worker_based_background/web_request"))
       << message_;
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 1bf7de7..af9be62 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1608,7 +1608,7 @@
   },
   {
     "name": "enable-ntp-remote-suggestions",
-    "owners": [ "fgorski" ],
+    "owners": [ "//chrome/android/feed/OWNERS", "feed@chromium.org" ],
     "expiry_milestone": 80
   },
   {
diff --git a/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.cc b/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.cc
index 59c69f3..17e6ea2 100644
--- a/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.cc
+++ b/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.cc
@@ -7,17 +7,20 @@
 #include <algorithm>
 #include <utility>
 
+using openscreen::osp::ServiceInfo;
+
 namespace media_router {
 namespace {
+
 const char kOpenScreenServiceType[] = "openscreen_.udp_";
 
-openscreen::ServiceInfo ServiceInfoFromServiceDescription(
+ServiceInfo ServiceInfoFromServiceDescription(
     const local_discovery::ServiceDescription& desc) {
   openscreen::ErrorOr<openscreen::IPAddress> address =
       openscreen::IPAddress::Parse(desc.address.host());
   DCHECK(address);
 
-  openscreen::ServiceInfo service_info;
+  ServiceInfo service_info;
   service_info.service_id = desc.service_name;
   service_info.friendly_name = desc.instance_name();
 
@@ -93,8 +96,7 @@
   return true;
 }
 
-const std::vector<openscreen::ServiceInfo>& OpenScreenListener::GetReceivers()
-    const {
+const std::vector<ServiceInfo>& OpenScreenListener::GetReceivers() const {
   return receivers_;
 }
 
@@ -118,21 +120,20 @@
     return;
   }
 
-  openscreen::ServiceInfo service_info =
+  ServiceInfo service_info =
       ServiceInfoFromServiceDescription(service_description);
   if (added) {
     receivers_.push_back(std::move(service_info));
 
-    const openscreen::ServiceInfo& ref = receivers_.back();
+    const ServiceInfo& ref = receivers_.back();
     for (auto* observer : observers_) {
       observer->OnReceiverAdded(ref);
     }
   } else {
-    auto it =
-        std::find_if(receivers_.begin(), receivers_.end(),
-                     [&service_info](const openscreen::ServiceInfo& info) {
-                       return info.service_id == service_info.service_id;
-                     });
+    auto it = std::find_if(receivers_.begin(), receivers_.end(),
+                           [&service_info](const ServiceInfo& info) {
+                             return info.service_id == service_info.service_id;
+                           });
 
     *it = std::move(service_info);
 
@@ -149,15 +150,14 @@
     return;
   }
 
-  const auto& removed_it =
-      std::find_if(receivers_.begin(), receivers_.end(),
-                   [&service_name](openscreen::ServiceInfo& info) {
-                     return info.service_id == service_name;
-                   });
+  const auto& removed_it = std::find_if(
+      receivers_.begin(), receivers_.end(), [&service_name](ServiceInfo& info) {
+        return info.service_id == service_name;
+      });
 
   // Move the receiver we want to remove to the end, so we don't have to shift.
   DCHECK(removed_it != receivers_.end());
-  const openscreen::ServiceInfo removed_info = std::move(*removed_it);
+  const ServiceInfo removed_info = std::move(*removed_it);
   if (removed_it != receivers_.end() - 1) {
     *removed_it = std::move(receivers_.back());
   }
diff --git a/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.h b/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.h
index 9cdb1be..411c553 100644
--- a/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.h
+++ b/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener.h
@@ -16,7 +16,7 @@
 
 namespace media_router {
 class OpenScreenListener
-    : public openscreen::ServiceListener,
+    : public openscreen::osp::ServiceListener,
       local_discovery::ServiceDiscoveryDeviceLister::Delegate {
  public:
   explicit OpenScreenListener(std::string service_type);
@@ -31,7 +31,8 @@
   bool Resume() override;
   bool SearchNow() override;
 
-  const std::vector<openscreen::ServiceInfo>& GetReceivers() const override;
+  const std::vector<openscreen::osp::ServiceInfo>& GetReceivers()
+      const override;
   void AddObserver(ServiceListener::Observer* observer) override;
   void RemoveObserver(ServiceListener::Observer* observer) override;
 
@@ -48,7 +49,7 @@
  private:
   bool is_running_ = false;
   const std::string service_type_;
-  std::vector<openscreen::ServiceInfo> receivers_;
+  std::vector<openscreen::osp::ServiceInfo> receivers_;
 
   DISALLOW_COPY_AND_ASSIGN(OpenScreenListener);
 };
diff --git a/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener_unittest.cc b/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener_unittest.cc
index 352de55..b53f67f 100644
--- a/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener_unittest.cc
+++ b/chrome/browser/media/router/providers/openscreen/discovery/open_screen_listener_unittest.cc
@@ -11,6 +11,7 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+using openscreen::osp::ServiceInfo;
 using ::testing::_;
 using ::testing::Invoke;
 using ::testing::Return;
@@ -22,20 +23,20 @@
 const char kServiceType[] = "openscreen_.udp_";
 
 class MockServiceListenerObserver
-    : public openscreen::ServiceListener::Observer {
+    : public openscreen::osp::ServiceListener::Observer {
  public:
   MOCK_METHOD0(OnStarted, void());
   MOCK_METHOD0(OnStopped, void());
   MOCK_METHOD0(OnSuspended, void());
   MOCK_METHOD0(OnSearching, void());
 
-  MOCK_METHOD1(OnReceiverAdded, void(const openscreen::ServiceInfo&));
-  MOCK_METHOD1(OnReceiverChanged, void(const openscreen::ServiceInfo&));
-  MOCK_METHOD1(OnReceiverRemoved, void(const openscreen::ServiceInfo&));
+  MOCK_METHOD1(OnReceiverAdded, void(const ServiceInfo&));
+  MOCK_METHOD1(OnReceiverChanged, void(const ServiceInfo&));
+  MOCK_METHOD1(OnReceiverRemoved, void(const ServiceInfo&));
   MOCK_METHOD0(OnAllReceiversRemoved, void());
 
   MOCK_METHOD1(OnError, void(openscreen::osp::ServiceListenerError));
-  MOCK_METHOD1(OnMetrics, void(openscreen::ServiceListener::Metrics));
+  MOCK_METHOD1(OnMetrics, void(openscreen::osp::ServiceListener::Metrics));
 };
 
 // Although the testing framework can do a byte comparison, when it fails
@@ -69,22 +70,22 @@
     listener.AddObserver(&observer);
   }
 
-  void ExpectReceiverAdded(const openscreen::ServiceInfo& info) {
+  void ExpectReceiverAdded(const ServiceInfo& info) {
     EXPECT_CALL(observer, OnReceiverAdded(ServiceInfoEquals(info)));
   }
 
-  void ExpectReceiverChanged(const openscreen::ServiceInfo& info) {
+  void ExpectReceiverChanged(const ServiceInfo& info) {
     EXPECT_CALL(observer, OnReceiverChanged(ServiceInfoEquals(info)));
   }
 
-  void ExpectReceiverRemoved(const openscreen::ServiceInfo& info) {
+  void ExpectReceiverRemoved(const ServiceInfo& info) {
     EXPECT_CALL(observer, OnReceiverRemoved(ServiceInfoEquals(info)));
   }
 
   OpenScreenListener listener;
   StrictMock<MockServiceListenerObserver> observer;
   local_discovery::ServiceDescription valid_description_;
-  openscreen::ServiceInfo service_info_;
+  ServiceInfo service_info_;
 };
 
 TEST_F(OpenScreenListenerTest, DeviceAddedNotifiesObserversIfStarted) {
diff --git a/chrome/browser/net/referrer_policy_policy_browsertest.cc b/chrome/browser/net/referrer_policy_policy_browsertest.cc
new file mode 100644
index 0000000..caa06f84
--- /dev/null
+++ b/chrome/browser/net/referrer_policy_policy_browsertest.cc
@@ -0,0 +1,59 @@
+// 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 <memory>
+
+#include "base/run_loop.h"
+#include "base/values.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "components/policy/core/browser/browser_policy_connector.h"
+#include "components/policy/core/common/mock_configuration_policy_provider.h"
+#include "components/policy/core/common/policy_map.h"
+#include "components/policy/core/common/policy_types.h"
+#include "components/policy/policy_constants.h"
+#include "content/public/common/referrer.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace policy {
+
+// Toggling the ForceLegacyDefaultReferrerPolicy enterprise policy should flip
+// the corresponding content::Referrer global.
+class ForceLegacyDefaultReferrerPolicy : public InProcessBrowserTest {
+ public:
+  void SetUp() override {
+    EXPECT_CALL(policy_provider_, IsInitializationComplete(testing::_))
+        .WillRepeatedly(testing::Return(true));
+    BrowserPolicyConnector::SetPolicyProviderForTesting(&policy_provider_);
+    InProcessBrowserTest::SetUp();
+  }
+
+ protected:
+  MockConfigurationPolicyProvider policy_provider_;
+};
+
+IN_PROC_BROWSER_TEST_F(ForceLegacyDefaultReferrerPolicy, UpdatesDynamically) {
+  // When the policy's unset, we shouldn't be forcing the legacy default
+  // referrer policy.
+  EXPECT_FALSE(content::Referrer::ShouldForceLegacyDefaultReferrerPolicy());
+
+  policy::PolicyMap values;
+  values.Set(key::kForceLegacyDefaultReferrerPolicy, POLICY_LEVEL_RECOMMENDED,
+             POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
+             std::make_unique<base::Value>(true), nullptr);
+  policy_provider_.UpdateChromePolicy(values);
+  base::RunLoop().RunUntilIdle();
+  // When the policy's true, we should have flipped the global to true.
+  EXPECT_TRUE(content::Referrer::ShouldForceLegacyDefaultReferrerPolicy());
+
+  values.Set(key::kForceLegacyDefaultReferrerPolicy, POLICY_LEVEL_RECOMMENDED,
+             POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
+             std::make_unique<base::Value>(false), nullptr);
+  policy_provider_.UpdateChromePolicy(values);
+  base::RunLoop().RunUntilIdle();
+  // When the policy's false, we should have flipped the global back to false.
+  EXPECT_FALSE(content::Referrer::ShouldForceLegacyDefaultReferrerPolicy());
+}
+
+}  // namespace policy
diff --git a/chrome/browser/net/referrer_policy_policy_handler.cc b/chrome/browser/net/referrer_policy_policy_handler.cc
new file mode 100644
index 0000000..0ee95754
--- /dev/null
+++ b/chrome/browser/net/referrer_policy_policy_handler.cc
@@ -0,0 +1,31 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/net/referrer_policy_policy_handler.h"
+
+#include "base/values.h"
+#include "components/policy/core/common/policy_map.h"
+#include "components/policy/policy_constants.h"
+#include "components/prefs/pref_value_map.h"
+#include "content/public/common/referrer.h"
+
+namespace policy {
+
+ReferrerPolicyPolicyHandler::ReferrerPolicyPolicyHandler()
+    : TypeCheckingPolicyHandler(policy::key::kForceLegacyDefaultReferrerPolicy,
+                                base::Value::Type::BOOLEAN) {}
+
+ReferrerPolicyPolicyHandler::~ReferrerPolicyPolicyHandler() = default;
+
+void ReferrerPolicyPolicyHandler::ApplyPolicySettings(const PolicyMap& policies,
+                                                      PrefValueMap* prefs) {
+  const base::Value* value =
+      policies.GetValue(key::kForceLegacyDefaultReferrerPolicy);
+  if (value) {
+    DCHECK(value->is_bool());
+    content::Referrer::SetForceLegacyDefaultReferrerPolicy(value->GetBool());
+  }
+}
+
+}  // namespace policy
diff --git a/chrome/browser/net/referrer_policy_policy_handler.h b/chrome/browser/net/referrer_policy_policy_handler.h
new file mode 100644
index 0000000..945975e
--- /dev/null
+++ b/chrome/browser/net/referrer_policy_policy_handler.h
@@ -0,0 +1,32 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_NET_REFERRER_POLICY_POLICY_HANDLER_H_
+#define CHROME_BROWSER_NET_REFERRER_POLICY_POLICY_HANDLER_H_
+
+#include "components/policy/core/browser/configuration_policy_handler.h"
+
+class PrefValueMap;
+
+namespace policy {
+
+// Handles the ForceLegacyDefaultReferrerPolicy policy
+// by updating the pertinent //content global when the policy's set.
+class ReferrerPolicyPolicyHandler : public TypeCheckingPolicyHandler {
+ public:
+  ReferrerPolicyPolicyHandler();
+  ~ReferrerPolicyPolicyHandler() override;
+
+  ReferrerPolicyPolicyHandler(const ReferrerPolicyPolicyHandler&) = delete;
+  ReferrerPolicyPolicyHandler& operator=(const ReferrerPolicyPolicyHandler&) =
+      delete;
+
+  // ConfigurationPolicyHandler methods:
+  void ApplyPolicySettings(const PolicyMap& policies,
+                           PrefValueMap* prefs) override;
+};
+
+}  // namespace policy
+
+#endif  // CHROME_BROWSER_NET_REFERRER_POLICY_POLICY_HANDLER_H_
diff --git a/chrome/browser/net/referrer_policy_policy_handler_unittest.cc b/chrome/browser/net/referrer_policy_policy_handler_unittest.cc
new file mode 100644
index 0000000..afad0b0a
--- /dev/null
+++ b/chrome/browser/net/referrer_policy_policy_handler_unittest.cc
@@ -0,0 +1,85 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/net/referrer_policy_policy_handler.h"
+
+#include "base/strings/string_number_conversions.h"
+#include "base/values.h"
+#include "chrome/common/pref_names.h"
+#include "components/policy/core/browser/configuration_policy_handler.h"
+#include "components/policy/core/browser/policy_error_map.h"
+#include "components/policy/core/common/policy_map.h"
+#include "components/policy/core/common/policy_types.h"
+#include "components/policy/policy_constants.h"
+#include "components/prefs/pref_value_map.h"
+#include "content/public/common/referrer.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace policy {
+
+class ReferrerPolicyPolicyHandlerTest : public testing::Test {
+ protected:
+  void SetPolicyValue(const std::string& policy,
+                      std::unique_ptr<base::Value> value) {
+    policies_.Set(policy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
+                  POLICY_SOURCE_PLATFORM, std::move(value), nullptr);
+  }
+  bool CheckPolicySettings() {
+    return handler_.CheckPolicySettings(policies_, &errors_);
+  }
+  void ApplyPolicySettings() {
+    handler_.ApplyPolicySettings(policies_, &prefs_);
+  }
+
+  void CheckAndApplyPolicySettings() {
+    if (CheckPolicySettings())
+      ApplyPolicySettings();
+  }
+
+  PolicyErrorMap& errors() { return errors_; }
+  PrefValueMap& prefs() { return prefs_; }
+
+ private:
+  PolicyMap policies_;
+  PolicyErrorMap errors_;
+  PrefValueMap prefs_;
+  ReferrerPolicyPolicyHandler handler_;
+};
+
+TEST_F(ReferrerPolicyPolicyHandlerTest, NotSet) {
+  CheckAndApplyPolicySettings();
+
+  // Shouldn't error.
+  EXPECT_EQ(errors().size(), 0U);
+}
+
+// Sanity check tests to ensure the policy errors have the correct name.
+TEST_F(ReferrerPolicyPolicyHandlerTest, WrongType) {
+  // Do anything that causes a policy error.
+  SetPolicyValue(key::kForceLegacyDefaultReferrerPolicy,
+                 std::make_unique<base::Value>(1));
+
+  CheckAndApplyPolicySettings();
+
+  // Should have an error
+  ASSERT_EQ(errors().size(), 1U);
+  EXPECT_EQ(errors().begin()->first, key::kForceLegacyDefaultReferrerPolicy);
+}
+
+TEST_F(ReferrerPolicyPolicyHandlerTest, ValueTrue) {
+  SetPolicyValue(key::kForceLegacyDefaultReferrerPolicy,
+                 std::make_unique<base::Value>(true));
+
+  CheckAndApplyPolicySettings();
+  EXPECT_TRUE(content::Referrer::ShouldForceLegacyDefaultReferrerPolicy());
+}
+
+TEST_F(ReferrerPolicyPolicyHandlerTest, ValueFalse) {
+  SetPolicyValue(key::kForceLegacyDefaultReferrerPolicy,
+                 std::make_unique<base::Value>(false));
+
+  CheckAndApplyPolicySettings();
+  EXPECT_FALSE(content::Referrer::ShouldForceLegacyDefaultReferrerPolicy());
+}
+}  // namespace policy
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade.cc b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade.cc
index ba93e70..80cc636 100644
--- a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade.cc
+++ b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade.cc
@@ -8,10 +8,12 @@
 
 #include "base/bind.h"
 #include "base/run_loop.h"
+#include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.h"
 #include "chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
-#include "components/performance_manager/performance_manager_impl.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/performance_manager/public/performance_manager.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 
@@ -30,6 +32,12 @@
   }
   SiteDataCacheFactory::OnBrowserContextCreatedOnUIThread(
       SiteDataCacheFactory::GetInstance(), browser_context_, parent_context);
+
+  history::HistoryService* history =
+      HistoryServiceFactory::GetForProfileWithoutCreating(
+          Profile::FromBrowserContext(browser_context_));
+  if (history)
+    history_observer_.Add(history);
 }
 
 SiteDataCacheFacade::~SiteDataCacheFacade() {
@@ -48,11 +56,11 @@
 void SiteDataCacheFacade::WaitUntilCacheInitializedForTesting() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   base::RunLoop run_loop;
-  PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+  PerformanceManager::CallOnGraph(
       FROM_HERE, base::BindOnce(
                      [](base::OnceClosure quit_closure,
                         const std::string& browser_context_id,
-                        GraphImpl* graph_unused) {
+                        Graph* graph_unused) {
                        auto* cache = SiteDataCacheFactory::GetInstance()
                                          ->GetDataCacheForBrowserContext(
                                              browser_context_id);
@@ -66,4 +74,52 @@
   run_loop.Run();
 }
 
+void SiteDataCacheFacade::OnURLsDeleted(
+    history::HistoryService* history_service,
+    const history::DeletionInfo& deletion_info) {
+  if (deletion_info.IsAllHistory()) {
+    auto clear_all_site_data_cb = base::BindOnce(
+        [](const std::string& browser_context_id, Graph* graph_unused) {
+          auto* cache = SiteDataCacheFactory::GetInstance()
+                            ->GetDataCacheForBrowserContext(browser_context_id);
+          static_cast<SiteDataCacheImpl*>(cache)->ClearAllSiteData();
+        },
+        browser_context_->UniqueId());
+    PerformanceManager::CallOnGraph(FROM_HERE,
+                                    std::move(clear_all_site_data_cb));
+  } else {
+    std::vector<url::Origin> origins_to_remove;
+
+    for (const auto& it : deletion_info.deleted_urls_origin_map()) {
+      const url::Origin origin = url::Origin::Create(it.first);
+      const int remaining_visits_in_history = it.second.first;
+
+      // If the origin is no longer exists in history, clear the site data.
+      DCHECK_GE(remaining_visits_in_history, 0);
+      if (remaining_visits_in_history == 0)
+        origins_to_remove.emplace_back(origin);
+    }
+
+    if (origins_to_remove.empty())
+      return;
+
+    auto clear_site_data_cb = base::BindOnce(
+        [](const std::string& browser_context_id,
+           const std::vector<url::Origin>& origins_to_remove,
+           Graph* graph_unused) {
+          auto* cache = SiteDataCacheFactory::GetInstance()
+                            ->GetDataCacheForBrowserContext(browser_context_id);
+          static_cast<SiteDataCacheImpl*>(cache)->ClearSiteDataForOrigins(
+              origins_to_remove);
+        },
+        browser_context_->UniqueId(), std::move(origins_to_remove));
+    PerformanceManager::CallOnGraph(FROM_HERE, std::move(clear_site_data_cb));
+  }
+}
+
+void SiteDataCacheFacade::HistoryServiceBeingDeleted(
+    history::HistoryService* history_service) {
+  history_observer_.Remove(history_service);
+}
+
 }  // namespace performance_manager
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade.h b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade.h
index 647deae..ae02710 100644
--- a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade.h
+++ b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade.h
@@ -7,6 +7,9 @@
 
 #include "base/callback_forward.h"
 #include "base/macros.h"
+#include "base/scoped_observer.h"
+#include "components/history/core/browser/history_service.h"
+#include "components/history/core/browser/history_service_observer.h"
 #include "components/keyed_service/core/keyed_service.h"
 
 namespace content {
@@ -20,7 +23,8 @@
 // BrowserContextKeyedServiceFactory to manage the lifetime of this cache.
 //
 // Instances of this class are expected to live on the UI thread.
-class SiteDataCacheFacade : public KeyedService {
+class SiteDataCacheFacade : public KeyedService,
+                            public history::HistoryServiceObserver {
  public:
   explicit SiteDataCacheFacade(content::BrowserContext* browser_context);
   ~SiteDataCacheFacade() override;
@@ -29,10 +33,19 @@
 
   void WaitUntilCacheInitializedForTesting();
 
+  // history::HistoryServiceObserver:
+  void OnURLsDeleted(history::HistoryService* history_service,
+                     const history::DeletionInfo& deletion_info) override;
+  void HistoryServiceBeingDeleted(
+      history::HistoryService* history_service) override;
+
  private:
   // The browser context associated with this cache.
   content::BrowserContext* browser_context_;
 
+  ScopedObserver<history::HistoryService, history::HistoryServiceObserver>
+      history_observer_{this};
+
   DISALLOW_COPY_AND_ASSIGN(SiteDataCacheFacade);
 };
 
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_unittest.cc b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_unittest.cc
index 7adb28a7..abd71b8 100644
--- a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_unittest.cc
+++ b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/test/bind_test_util.h"
 #include "chrome/browser/performance_manager/persistence/site_data/leveldb_site_data_store.h"
 #include "chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.h"
+#include "chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl.h"
 #include "chrome/browser/performance_manager/persistence/site_data/unittest_utils.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/performance_manager/performance_manager_impl.h"
@@ -20,28 +21,125 @@
 
 namespace performance_manager {
 
-using SiteDataCacheFacadeTest = testing::TestWithPerformanceManager;
+namespace {
+
+const url::Origin kTestOrigin = url::Origin::Create(GURL("http://www.a.com"));
+const url::Origin kTestOrigin2 = url::Origin::Create(GURL("http://www.b.com"));
+
+// Mock version of a SiteDataCacheImpl. In practice instances of this object
+// live on the Performance Manager sequence and all the mocked methods will be
+// called from there.
+class LenienMockSiteDataCacheImpl : public SiteDataCacheImpl {
+ public:
+  explicit LenienMockSiteDataCacheImpl(const std::string& browser_context_id)
+      : SiteDataCacheImpl(browser_context_id) {}
+  ~LenienMockSiteDataCacheImpl() override = default;
+
+  // The 2 following functions allow setting the expectations for the mocked
+  // functions. Any call to one of these functions should be followed by the
+  // call that will caused the mocked the function to be called and then by a
+  // call to |WaitForExpectations|. Only one expectation can be set at a time.
+
+  void SetClearSiteDataForOriginsExpectations(
+      const std::vector<url::Origin>& expected_origins) {
+    ASSERT_FALSE(run_loop_);
+    run_loop_ = std::make_unique<base::RunLoop>();
+    auto quit_closure = run_loop_->QuitClosure();
+    EXPECT_CALL(*this, ClearSiteDataForOrigins(::testing::Eq(expected_origins)))
+        .WillOnce(
+            ::testing::InvokeWithoutArgs([closure = std::move(quit_closure)]() {
+              std::move(closure).Run();
+            }));
+  }
+
+  void SetClearAllSiteDataExpectations() {
+    ASSERT_FALSE(run_loop_);
+    run_loop_ = std::make_unique<base::RunLoop>();
+    auto quit_closure = run_loop_->QuitClosure();
+    EXPECT_CALL(*this, ClearAllSiteData())
+        .WillOnce(
+            ::testing::InvokeWithoutArgs([closure = std::move(quit_closure)]() {
+              std::move(closure).Run();
+            }));
+  }
+
+  void WaitForExpectations() {
+    ASSERT_TRUE(run_loop_);
+    run_loop_->Run();
+    run_loop_.reset();
+    ::testing::Mock::VerifyAndClear(this);
+  }
+
+ private:
+  MOCK_METHOD1(ClearSiteDataForOrigins, void(const std::vector<url::Origin>&));
+  MOCK_METHOD0(ClearAllSiteData, void());
+
+  std::unique_ptr<base::RunLoop> run_loop_;
+
+  DISALLOW_COPY_AND_ASSIGN(LenienMockSiteDataCacheImpl);
+};
+using MockSiteDataCache = ::testing::StrictMock<LenienMockSiteDataCacheImpl>;
+
+class SiteDataCacheFacadeTest : public testing::TestWithPerformanceManager {
+ public:
+  SiteDataCacheFacadeTest() = default;
+  ~SiteDataCacheFacadeTest() override = default;
+
+  void SetUp() override {
+    testing::TestWithPerformanceManager::SetUp();
+    PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+        FROM_HERE,
+        base::BindOnce(
+            [](std::unique_ptr<SiteDataCacheFactory> site_data_cache_factory,
+               performance_manager::GraphImpl* graph) {
+              graph->PassToGraph(std::move(site_data_cache_factory));
+            },
+            std::make_unique<SiteDataCacheFactory>()));
+    use_in_memory_db_for_testing_ =
+        LevelDBSiteDataStore::UseInMemoryDBForTesting();
+    profile_ = std::make_unique<TestingProfile>();
+  }
+
+  void TearDown() override {
+    use_in_memory_db_for_testing_.reset();
+    profile_.reset();
+    testing::TestWithPerformanceManager::TearDown();
+  }
+
+  TestingProfile* profile() { return profile_.get(); }
+
+  // Replace the SiteDataCache associated with |profile_| with a mock one.
+  MockSiteDataCache* SetUpMockCache() {
+    MockSiteDataCache* mock_cache_raw = nullptr;
+    base::RunLoop run_loop;
+    auto quit_closure = run_loop.QuitClosure();
+    auto browser_context_id = profile()->UniqueId();
+    PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
+        FROM_HERE,
+        base::BindLambdaForTesting([&](performance_manager::GraphImpl* graph) {
+          auto mock_cache =
+              std::make_unique<MockSiteDataCache>(browser_context_id);
+          mock_cache_raw = mock_cache.get();
+
+          SiteDataCacheFactory::GetInstance()->ReplaceCacheForTesting(
+              browser_context_id, std::move(mock_cache));
+          std::move(quit_closure).Run();
+        }));
+    run_loop.Run();
+    return mock_cache_raw;
+  }
+
+ private:
+  std::unique_ptr<TestingProfile> profile_;
+  std::unique_ptr<base::AutoReset<bool>> use_in_memory_db_for_testing_;
+};
+
+}  // namespace
 
 TEST_F(SiteDataCacheFacadeTest, IsDataCacheRecordingForTesting) {
-  // Create the SiteDataCacheFactory instance and pass it to the PM sequence for
-  // ownership.
-  PerformanceManagerImpl::GetInstance()->CallOnGraphImpl(
-      FROM_HERE,
-      base::BindOnce(
-          [](std::unique_ptr<SiteDataCacheFactory> site_data_cache_factory,
-             performance_manager::GraphImpl* graph) {
-            graph->PassToGraph(std::move(site_data_cache_factory));
-          },
-          std::make_unique<SiteDataCacheFactory>()));
-
-  TestingProfile profile;
-  // Uses an in-memory database.
-  auto use_in_memory_db_for_testing =
-      LevelDBSiteDataStore::UseInMemoryDBForTesting();
-
   bool cache_is_recording = false;
 
-  SiteDataCacheFacade data_cache_facade(&profile);
+  SiteDataCacheFacade data_cache_facade(profile());
   data_cache_facade.WaitUntilCacheInitializedForTesting();
   {
     base::RunLoop run_loop;
@@ -56,7 +154,7 @@
   EXPECT_TRUE(cache_is_recording);
 
   SiteDataCacheFacade off_record_data_cache_facade(
-      profile.GetOffTheRecordProfile());
+      profile()->GetOffTheRecordProfile());
   {
     base::RunLoop run_loop;
     auto quit_closure = run_loop.QuitClosure();
@@ -71,4 +169,64 @@
   EXPECT_FALSE(cache_is_recording);
 }
 
+// Verify that an origin is removed from the data cache (in memory and on disk)
+// when there are no more references to it in the history, after the history is
+// partially cleared.
+TEST_F(SiteDataCacheFacadeTest, OnURLsDeleted_Partial_OriginNotReferenced) {
+  history::URLRows urls_to_delete = {history::URLRow(kTestOrigin.GetURL()),
+                                     history::URLRow(kTestOrigin2.GetURL())};
+  history::DeletionInfo deletion_info =
+      history::DeletionInfo::ForUrls(urls_to_delete, std::set<GURL>());
+  deletion_info.set_deleted_urls_origin_map({
+      {kTestOrigin.GetURL(), {0, base::Time::Now()}},
+      {kTestOrigin2.GetURL(), {0, base::Time::Now()}},
+  });
+
+  SiteDataCacheFacade data_cache_facade(profile());
+  data_cache_facade.WaitUntilCacheInitializedForTesting();
+
+  auto* mock_cache_raw = SetUpMockCache();
+  mock_cache_raw->SetClearSiteDataForOriginsExpectations(
+      {kTestOrigin, kTestOrigin2});
+  data_cache_facade.OnURLsDeleted(nullptr, deletion_info);
+  mock_cache_raw->WaitForExpectations();
+}
+
+// Verify that an origin is *not* removed from the data cache (in memory and on
+// disk) when there remain references to it in the history, after the history is
+// partially cleared.
+TEST_F(SiteDataCacheFacadeTest, OnURLsDeleted_Partial_OriginStillReferenced) {
+  history::URLRows urls_to_delete = {history::URLRow(kTestOrigin.GetURL()),
+                                     history::URLRow(kTestOrigin2.GetURL())};
+  history::DeletionInfo deletion_info =
+      history::DeletionInfo::ForUrls(urls_to_delete, std::set<GURL>());
+  deletion_info.set_deleted_urls_origin_map({
+      {kTestOrigin.GetURL(), {0, base::Time::Now()}},
+      {kTestOrigin2.GetURL(), {3, base::Time::Now()}},
+  });
+
+  SiteDataCacheFacade data_cache_facade(profile());
+  data_cache_facade.WaitUntilCacheInitializedForTesting();
+
+  auto* mock_cache_raw = SetUpMockCache();
+  // |kTestOrigin2| shouldn't be removed as there's still some references to it
+  // in the history.
+  mock_cache_raw->SetClearSiteDataForOriginsExpectations({kTestOrigin});
+  data_cache_facade.OnURLsDeleted(nullptr, deletion_info);
+  mock_cache_raw->WaitForExpectations();
+}
+
+// Verify that origins are removed from the data cache (in memory and on disk)
+// when the history is completely cleared.
+TEST_F(SiteDataCacheFacadeTest, OnURLsDeleted_Full) {
+  SiteDataCacheFacade data_cache_facade(profile());
+  data_cache_facade.WaitUntilCacheInitializedForTesting();
+
+  auto* mock_cache_raw = SetUpMockCache();
+  mock_cache_raw->SetClearAllSiteDataExpectations();
+  data_cache_facade.OnURLsDeleted(nullptr,
+                                  history::DeletionInfo::ForAllHistory());
+  mock_cache_raw->WaitForExpectations();
+}
+
 }  // namespace performance_manager
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.cc b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.cc
index 127d3ea..82461e9 100644
--- a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.cc
+++ b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.cc
@@ -134,6 +134,21 @@
           this, browser_context_id, std::move(cb)));
 }
 
+void SiteDataCacheFactory::ReplaceCacheForTesting(
+    const std::string& browser_context_id,
+    std::unique_ptr<SiteDataCacheImpl> cache) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  auto* cache_raw = cache.get();
+
+  DCHECK(base::Contains(data_cache_map_, browser_context_id));
+  data_cache_map_.erase(browser_context_id);
+  data_cache_map_.emplace(std::make_pair(browser_context_id, std::move(cache)));
+
+  DCHECK(!base::Contains(data_cache_inspector_map_, browser_context_id));
+  data_cache_inspector_map_.emplace(std::make_pair(
+      browser_context_id, static_cast<SiteDataCacheInspector*>(cache_raw)));
+}
+
 void SiteDataCacheFactory::OnBrowserContextCreated(
     const std::string& browser_context_id,
     const base::FilePath& context_path,
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.h b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.h
index edc4612..9880c51 100644
--- a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.h
+++ b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_factory.h
@@ -27,6 +27,7 @@
 namespace performance_manager {
 
 class SiteDataCacheInspector;
+class SiteDataCacheImpl;
 
 // This class is responsible for tracking the SiteDataCache instances associated
 // with each browser context. It is meant to be used as a bridge between the
@@ -95,6 +96,9 @@
   void IsDataCacheRecordingForTesting(const std::string& browser_context_id,
                                       base::OnceCallback<void(bool)> cb);
 
+  void ReplaceCacheForTesting(const std::string& browser_context_id,
+                              std::unique_ptr<SiteDataCacheImpl> cache);
+
  private:
   // Implementation of the corresponding *OnUIThread public static functions
   // that runs on this object's task runner.
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl.cc b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl.cc
index 4afd3c1..0f48ee0 100644
--- a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl.cc
+++ b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl.cc
@@ -35,6 +35,9 @@
       this, browser_context_id_);
 }
 
+SiteDataCacheImpl::SiteDataCacheImpl(const std::string& browser_context_id)
+    : browser_context_id_(browser_context_id) {}
+
 SiteDataCacheImpl::~SiteDataCacheImpl() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   SiteDataCacheFactory::GetInstance()->SetDataCacheInspectorForBrowserContext(
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl.h b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl.h
index b7d84145..5194e3c 100644
--- a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl.h
+++ b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_impl.h
@@ -65,16 +65,23 @@
   SiteDataCacheImpl* GetDataCache() override;
 
   // Remove a specific set of entries from the cache and the on-disk store.
-  void ClearSiteDataForOrigins(
+  // Virtual for testing.
+  virtual void ClearSiteDataForOrigins(
       const std::vector<url::Origin>& origins_to_remove);
 
   // Clear the data cache and the on-disk store.
-  void ClearAllSiteData();
+  // Virtual for testing.
+  virtual void ClearAllSiteData();
 
   // Set a callback that will be called once the data store backing this cache
   // has been fully initialized.
   void SetInitializationCallbackForTesting(base::OnceClosure callback);
 
+ protected:
+  // Version of the constructor that doesn't create the data store, for testing
+  // purposes only.
+  explicit SiteDataCacheImpl(const std::string& browser_context_id);
+
  private:
   // Returns a pointer to the SiteDataImpl object associated with |origin|,
   // create one and add it to |origin_data_map_| if it doesn't exist.
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 269b90e9..94658a8 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -17,6 +17,7 @@
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
 #include "chrome/browser/net/disk_cache_dir_policy_handler.h"
+#include "chrome/browser/net/referrer_policy_policy_handler.h"
 #include "chrome/browser/net/secure_dns_policy_handler.h"
 #include "chrome/browser/policy/browsing_history_policy_handler.h"
 #include "chrome/browser/policy/developer_tools_policy_handler.h"
@@ -1312,6 +1313,7 @@
   handlers->AddHandler(std::make_unique<HomepageLocationPolicyHandler>());
   handlers->AddHandler(std::make_unique<ProxyPolicyHandler>());
   handlers->AddHandler(std::make_unique<SecureDnsPolicyHandler>());
+  handlers->AddHandler(std::make_unique<ReferrerPolicyPolicyHandler>());
   handlers->AddHandler(std::make_unique<URLBlacklistPolicyHandler>());
 
   handlers->AddHandler(std::make_unique<SimpleSchemaValidatingPolicyHandler>(
diff --git a/chrome/browser/profiles/profile.cc b/chrome/browser/profiles/profile.cc
index 2621807..2b1140f 100644
--- a/chrome/browser/profiles/profile.cc
+++ b/chrome/browser/profiles/profile.cc
@@ -274,6 +274,17 @@
   return is_system_profile_;
 }
 
+bool Profile::CanUseDiskWhenOffTheRecord() {
+#if defined(OS_CHROMEOS)
+  // Guest mode on ChromeOS uses an in-memory file system to store the profile
+  // in, so despite this being an off the record profile, it is still okay to
+  // store data on disk.
+  return IsGuestSession();
+#else
+  return false;
+#endif
+}
+
 bool Profile::ShouldRestoreOldSessionCookies() {
   return false;
 }
diff --git a/chrome/browser/profiles/profile.h b/chrome/browser/profiles/profile.h
index ff64a45..458c4ac 100644
--- a/chrome/browser/profiles/profile.h
+++ b/chrome/browser/profiles/profile.h
@@ -352,6 +352,8 @@
   // Returns whether it is a system profile.
   virtual bool IsSystemProfile() const;
 
+  bool CanUseDiskWhenOffTheRecord() override;
+
   // Did the user restore the last session? This is set by SessionRestore.
   void set_restored_last_session(bool restored_last_session) {
     restored_last_session_ = restored_last_session;
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_section.html b/chrome/browser/resources/settings/autofill_page/passwords_section.html
index fd6dcd3..cbab72e5 100644
--- a/chrome/browser/resources/settings/autofill_page/passwords_section.html
+++ b/chrome/browser/resources/settings/autofill_page/passwords_section.html
@@ -75,16 +75,6 @@
         </extension-controlled-indicator>
       </div>
     </template>
-    <settings-toggle-button id="passwordsLeakDetectionCheckbox"
-      pref="{{prefs.profile.password_manager_leak_detection}}"
-      checked="[[getCheckedLeakDetection_(
-          userSignedIn_, prefs.profile.password_manager_leak_detection)]]"
-      label="$i18n{passwordsLeakDetectionLabel}"
-      sub-label="[[getPasswordsLeakDetectionSubLabel_(
-          userSignedIn_, prefs.profile.password_manager_leak_detection)]]"
-      hidden$="[[!passwordsLeakDetectionEnabled_]]"
-      disabled="[[!userSignedIn_]]">
-    </settings-toggle-button>
     <settings-toggle-button id="autosigninCheckbox"
         pref="{{prefs.credentials_enable_autosignin}}"
         label="$i18n{passwordsAutosigninLabel}"
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_section.js b/chrome/browser/resources/settings/autofill_page/passwords_section.js
index 896ac23b..7b210fb 100644
--- a/chrome/browser/resources/settings/autofill_page/passwords_section.js
+++ b/chrome/browser/resources/settings/autofill_page/passwords_section.js
@@ -93,12 +93,6 @@
     },
 
     /** @private */
-    passwordsLeakDetectionEnabled_: {
-      type: Boolean,
-      value: loadTimeData.getBoolean('passwordsLeakDetectionEnabled'),
-    },
-
-    /** @private */
     showExportPasswords_: {
       type: Boolean,
       computed: 'hasPasswords_(savedPasswords.splices)',
@@ -116,23 +110,12 @@
     /** @private */
     showPasswordEditDialog_: Boolean,
 
-    // <if expr="not chromeos">
-    /** @private {Array<!settings.StoredAccount>} */
-    storedAccounts_: Object,
-    // </if>
-
     /** @private {settings.SyncPrefs} */
     syncPrefs_: Object,
 
     /** @private {settings.SyncStatus} */
     syncStatus_: Object,
 
-    /** @private */
-    userSignedIn_: {
-      type: Boolean,
-      computed: 'computeUserSignedIn_(syncStatus_, storedAccounts_)',
-    },
-
     /** Filter on the saved passwords and exceptions. */
     filter: {
       type: String,
@@ -257,13 +240,6 @@
     syncBrowserProxy.getSyncStatus().then(syncStatusChanged);
     this.addWebUIListener('sync-status-changed', syncStatusChanged);
 
-    // <if expr="not chromeos">
-    const storedAccountsChanged = storedAccounts => this.storedAccounts_ =
-        storedAccounts;
-    syncBrowserProxy.getStoredAccounts().then(storedAccountsChanged);
-    this.addWebUIListener('stored-accounts-updated', storedAccountsChanged);
-    // </if>
-
     const syncPrefsChanged = syncPrefs => this.syncPrefs_ = syncPrefs;
     syncBrowserProxy.sendSyncPrefsChanged();
     this.addWebUIListener('sync-prefs-changed', syncPrefsChanged);
@@ -354,25 +330,6 @@
   },
 
   /**
-   * @return {boolean}
-   * @private
-   */
-  computeUserSignedIn_: function() {
-    return (!!this.syncStatus_ && !!this.syncStatus_.signedIn) ?
-        !this.syncStatus_.hasError :
-        (!!this.storedAccounts_ && this.storedAccounts_.length > 0);
-  },
-
-  /**
-   * @return {boolean}
-   * @private
-   */
-  getCheckedLeakDetection_: function() {
-    return this.userSignedIn_ &&
-        !!this.getPref('profile.password_manager_leak_detection').value;
-  },
-
-  /**
    * @param {string} filter
    * @return {!Array<!PasswordManagerProxy.UiEntryWithPassword>}
    * @private
@@ -388,20 +345,6 @@
   },
 
   /**
-   * @return {string}
-   * @private
-   */
-  getPasswordsLeakDetectionSubLabel_: function() {
-    if (this.userSignedIn_) {
-      return '';
-    }
-    if (this.getPref('profile.password_manager_leak_detection').value) {
-      return this.i18n('passwordsLeakDetectionSignedOutEnabledDescription');
-    }
-    return '';
-  },
-
-  /**
    * @param {string} filter
    * @return {function(!chrome.passwordsPrivate.ExceptionEntry): boolean}
    * @private
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/constants.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/constants.js
index ef552fa..ab52438 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/constants.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/constants.js
@@ -56,9 +56,9 @@
   AppListContextMenuAppInfoArc: 0,
   AppListContextMenuAppInfoChromeApp: 1,
   AppListContextMenuAppInfoWebApp: 2,
-  LauncherContextMenuAppInfoArc: 3,
-  LauncherContextMenuAppInfoChromeApp: 4,
-  LauncherContextMenuAppInfoWebApp: 5,
+  ShelfContextMenuAppInfoArc: 3,
+  ShelfContextMenuAppInfoChromeApp: 4,
+  ShelfContextMenuAppInfoWebApp: 5,
   MainViewArc: 6,
   MainViewChromeApp: 7,
   MainViewWebApp: 8,
diff --git a/chrome/browser/resources/settings/privacy_page/personalization_options.html b/chrome/browser/resources/settings/privacy_page/personalization_options.html
index 17e91ff..43656fe9 100644
--- a/chrome/browser/resources/settings/privacy_page/personalization_options.html
+++ b/chrome/browser/resources/settings/privacy_page/personalization_options.html
@@ -2,10 +2,12 @@
 
 <link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
+<link rel="import" href="chrome://resources/html/i18n_behavior.html">
 <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
 <link rel="import" href="../controls/settings_toggle_button.html">
 <link rel="import" href="../lifetime_browser_proxy.html">
 <link rel="import" href="../people_page/sync_browser_proxy.html">
+<link rel="import" href="../prefs/prefs.html">
 <link rel="import" href="../prefs/prefs_behavior.html">
 <link rel="import" href="../route.html">
 <link rel="import" href="../settings_shared_css.html">
@@ -43,10 +45,23 @@
         label="$i18n{safeBrowsingEnableProtection}"
         sub-label="$i18n{safeBrowsingEnableProtectionDesc}">
     </settings-toggle-button>
+   <settings-toggle-button id="passwordsLeakDetectionCheckbox"
+      pref="{{prefs.profile.password_manager_leak_detection}}"
+      checked="[[getCheckedLeakDetection_(
+          userSignedIn_, passwordsLeakDetectionAvailable_)]]"
+      label="$i18n{passwordsLeakDetectionLabel}"
+      sub-label="[[getPasswordsLeakDetectionSubLabel_(
+          userSignedIn_, passwordsLeakDetectionAvailable_)]]"
+      hidden$="[[!passwordsLeakDetectionEnabled_]]"
+      disabled="[[getDisabledLeakDetection_(
+          userSignedIn_, prefs.*)]]">
+    </settings-toggle-button>
     <settings-toggle-button
         pref="{{prefs.safebrowsing.scout_reporting_enabled}}"
+        checked="[[getCheckedExtendedSafeBrowsing_(prefs.*)]]"
         label="$i18n{safeBrowsingEnableExtendedReporting}"
-        sub-label="$i18n{safeBrowsingEnableExtendedReportingDesc}">
+        sub-label="$i18n{safeBrowsingEnableExtendedReportingDesc}"
+        disabled="[[getDisabledExtendedSafeBrowsing_(prefs.*)]]">
     </settings-toggle-button>
 <if expr="_google_chrome">
 <if expr="chromeos">
diff --git a/chrome/browser/resources/settings/privacy_page/personalization_options.js b/chrome/browser/resources/settings/privacy_page/personalization_options.js
index c194b8e..a916629b 100644
--- a/chrome/browser/resources/settings/privacy_page/personalization_options.js
+++ b/chrome/browser/resources/settings/privacy_page/personalization_options.js
@@ -13,6 +13,7 @@
   is: 'settings-personalization-options',
 
   behaviors: [
+    I18nBehavior,
     PrefsBehavior,
     WebUIListenerBehavior,
   ],
@@ -32,6 +33,29 @@
     /** @type {settings.SyncStatus} */
     syncStatus: Object,
 
+    // <if expr="not chromeos">
+    /** @private {Array<!settings.StoredAccount>} */
+    storedAccounts_: Object,
+    // </if>
+
+    /** @private */
+    userSignedIn_: {
+      type: Boolean,
+      computed: 'computeUserSignedIn_(syncStatus, storedAccounts_)',
+    },
+
+    /** @private */
+    passwordsLeakDetectionAvailable_: {
+      type: Boolean,
+      computed: 'computePasswordsLeakDetectionAvailable_(prefs.*)',
+    },
+
+    /** @private */
+    passwordsLeakDetectionEnabled_: {
+      type: Boolean,
+      value: loadTimeData.getBoolean('passwordsLeakDetectionEnabled'),
+    },
+
     // <if expr="_google_chrome and not chromeos">
     // TODO(dbeam): make a virtual.* pref namespace and set/get this normally
     // (but handled differently in C++).
@@ -59,6 +83,76 @@
     this.addWebUIListener('metrics-reporting-change', setMetricsReportingPref);
     this.browserProxy_.getMetricsReporting().then(setMetricsReportingPref);
     // </if>
+    // <if expr="not chromeos">
+    const storedAccountsChanged = storedAccounts => this.storedAccounts_ =
+        storedAccounts;
+    const syncBrowserProxy = settings.SyncBrowserProxyImpl.getInstance();
+    syncBrowserProxy.getStoredAccounts().then(storedAccountsChanged);
+    this.addWebUIListener('stored-accounts-updated', storedAccountsChanged);
+    // </if>
+  },
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  computeUserSignedIn_: function() {
+    return (!!this.syncStatus && !!this.syncStatus.signedIn) ?
+        !this.syncStatus.hasError :
+        (!!this.storedAccounts_ && this.storedAccounts_.length > 0);
+  },
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  computePasswordsLeakDetectionAvailable_: function() {
+    return !!this.getPref('profile.password_manager_leak_detection').value &&
+        !!this.getPref('safebrowsing.enabled').value;
+  },
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  getCheckedLeakDetection_: function() {
+    return this.userSignedIn_ && this.passwordsLeakDetectionAvailable_;
+  },
+
+  /**
+   * @return {string}
+   * @private
+   */
+  getPasswordsLeakDetectionSubLabel_: function() {
+    if (!this.userSignedIn_ && this.passwordsLeakDetectionAvailable_) {
+      return this.i18n('passwordsLeakDetectionSignedOutEnabledDescription');
+    }
+    return '';
+  },
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  getDisabledLeakDetection_: function() {
+    return !this.userSignedIn_ || !this.getPref('safebrowsing.enabled').value;
+  },
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  getCheckedExtendedSafeBrowsing_: function() {
+    return !!this.getPref('safebrowsing.enabled').value &&
+        !!this.getPref('safebrowsing.scout_reporting_enabled').value;
+  },
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  getDisabledExtendedSafeBrowsing_: function() {
+    return !this.getPref('safebrowsing.enabled').value;
   },
 
   // <if expr="_google_chrome and not chromeos">
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.cc b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
index aadc96f..8c73cd65 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
@@ -1063,24 +1063,48 @@
 base::string16
 ChromePasswordProtectionService::GetWarningDetailTextForSavedPasswords(
     std::vector<size_t>* placeholder_offsets) const {
-  const std::vector<std::string>& domains = saved_passwords_matching_domains();
+  const std::vector<std::string>& matching_domains =
+      saved_passwords_matching_domains();
+  const std::list<std::string>& spoofed_domains = common_spoofed_domains();
 
+  // Show most commonly spoofed domains first.
   std::vector<base::string16> placeholders;
-  for (size_t idx = 0; idx < domains.size() && idx < 3; idx++) {
-    placeholders.push_back(base::UTF8ToUTF16(domains[idx]));
+  for (auto priority_domain_iter = spoofed_domains.begin();
+       priority_domain_iter != spoofed_domains.end(); ++priority_domain_iter) {
+    if (std::find(matching_domains.begin(), matching_domains.end(),
+                  *priority_domain_iter) != matching_domains.end()) {
+      placeholders.push_back(base::UTF8ToUTF16(*priority_domain_iter));
+    }
   }
+
+  // If there are less than 3 saved default domains, check the saved
+  //  password domains to see if there are more that can be added to the warning
+  //  text.
+  int domains_idx = placeholders.size();
+  for (size_t idx = 0; idx < matching_domains.size() && domains_idx < 3;
+       idx++) {
+    // Do not add duplicate domains if it was already in the default domains.
+    if (std::find(placeholders.begin(), placeholders.end(),
+                  base::UTF8ToUTF16(matching_domains[idx])) !=
+        placeholders.end()) {
+      continue;
+    }
+    placeholders.push_back(base::UTF8ToUTF16(matching_domains[idx]));
+    domains_idx++;
+  }
+
   // If showing the saved passwords domain experiment is not on or if there is
   // are no saved domains, default to original saved passwords reuse warning.
   if (!base::FeatureList::IsEnabled(
           safe_browsing::kPasswordProtectionShowDomainsForSavedPasswords) ||
-      domains.size() == 0) {
+      placeholders.size() == 0) {
     return l10n_util::GetStringUTF16(
         IDS_PAGE_INFO_CHANGE_PASSWORD_DETAILS_SAVED);
-  } else if (domains.size() == 1) {
+  } else if (placeholders.size() == 1) {
     return l10n_util::GetStringFUTF16(
         IDS_PAGE_INFO_CHANGE_PASSWORD_DETAILS_SAVED_1_DOMAIN, placeholders,
         placeholder_offsets);
-  } else if (domains.size() == 2) {
+  } else if (placeholders.size() == 2) {
     return l10n_util::GetStringFUTF16(
         IDS_PAGE_INFO_CHANGE_PASSWORD_DETAILS_SAVED_2_DOMAINS, placeholders,
         placeholder_offsets);
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
index d37fa54..40826eb 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
@@ -1234,6 +1234,16 @@
       base::UTF8ToUTF16(domains[2]));
   EXPECT_EQ(warning_text, service_->GetWarningDetailText(reused_password_type,
                                                          &placeholder_offsets));
+
+  // Default domains should be prioritzed over other domains.
+  domains.push_back("amazon.com");
+  service_->set_saved_passwords_matching_domains(domains);
+  warning_text = l10n_util::GetStringFUTF16(
+      IDS_PAGE_INFO_CHANGE_PASSWORD_DETAILS_SAVED_3_DOMAINS,
+      base::UTF8ToUTF16("amazon.com"), base::UTF8ToUTF16(domains[0]),
+      base::UTF8ToUTF16(domains[1]));
+  EXPECT_EQ(warning_text, service_->GetWarningDetailText(reused_password_type,
+                                                         &placeholder_offsets));
 }
 
 TEST_F(ChromePasswordProtectionServiceTest,
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 38ecc47..2b69527 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
@@ -81,12 +81,14 @@
 }
 
 std::string DeepScanAccessPointToString(DeepScanAccessPoint access_point) {
-  // TODO(domfc): Add DRAG_AND_DROP and PASTE access points.
+  // TODO(domfc): Add PASTE access point.
   switch (access_point) {
     case DeepScanAccessPoint::DOWNLOAD:
       return "Download";
     case DeepScanAccessPoint::UPLOAD:
       return "Upload";
+    case DeepScanAccessPoint::DRAG_AND_DROP:
+      return "DragAndDrop";
   }
   NOTREACHED();
   return "";
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h
index ce90131..6920c8b 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h
@@ -31,10 +31,11 @@
 //   "SafeBrowsing.DeepScan.<access-point>.BytesPerSeconds"
 //   "SafeBrowsing.DeepScan.<access-point>.Duration"
 //   "SafeBrowsing.DeepScan.<access-point>.<result>.Duration"
-// TODO(domfc): Add DRAG_AND_DROP and PASTE access points.
+// TODO(domfc): Add PASTE access point.
 enum class DeepScanAccessPoint {
   DOWNLOAD,
   UPLOAD,
+  DRAG_AND_DROP,
 };
 std::string DeepScanAccessPointToString(DeepScanAccessPoint access_point);
 
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils_unittest.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils_unittest.cc
index 56654248..d6e19e8 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils_unittest.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils_unittest.cc
@@ -91,7 +91,8 @@
     Tests,
     DeepScanningUtilsUMATest,
     testing::Combine(testing::Values(DeepScanAccessPoint::DOWNLOAD,
-                                     DeepScanAccessPoint::UPLOAD),
+                                     DeepScanAccessPoint::UPLOAD,
+                                     DeepScanAccessPoint::DRAG_AND_DROP),
                      testing::ValuesIn(kAllBinaryUploadServiceResults)));
 
 TEST_P(DeepScanningUtilsUMATest, SuccessfulScanVerdicts) {
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc
index a367738..803806e 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page.cc
@@ -56,8 +56,8 @@
       BaseUIManager* ui_manager,
       WebContents* web_contents,
       const GURL& main_frame_url,
-      const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources)
-      override {
+      const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources,
+      bool should_trigger_reporting) override {
     // Create appropriate display options for this blocking page.
     PrefService* prefs =
         Profile::FromBrowserContext(web_contents->GetBrowserContext())
@@ -82,9 +82,9 @@
         true,  // always_show_back_to_safety
         kHelpCenterLink);
 
-    return new SafeBrowsingBlockingPage(ui_manager, web_contents,
-                                        main_frame_url, unsafe_resources,
-                                        display_options);
+    return new SafeBrowsingBlockingPage(
+        ui_manager, web_contents, main_frame_url, unsafe_resources,
+        display_options, should_trigger_reporting);
   }
 
  private:
@@ -110,6 +110,7 @@
     const GURL& main_frame_url,
     const UnsafeResourceList& unsafe_resources,
     const BaseSafeBrowsingErrorUI::SBErrorDisplayOptions& display_options,
+    bool should_trigger_reporting,
     network::SharedURLLoaderFactory* url_loader_for_testing)
     : BaseBlockingPage(
           ui_manager,
@@ -138,15 +139,17 @@
             ? url_loader_for_testing
             : content::BrowserContext::GetDefaultStoragePartition(profile)
                   ->GetURLLoaderFactoryForBrowserProcess();
-    threat_details_in_progress_ =
-        g_browser_process->safe_browsing_service()
-            ->trigger_manager()
-            ->StartCollectingThreatDetails(
-                TriggerType::SECURITY_INTERSTITIAL, web_contents,
-                unsafe_resources[0], url_loader_factory,
-                HistoryServiceFactory::GetForProfile(
-                    profile, ServiceAccessType::EXPLICIT_ACCESS),
-                sb_error_ui()->get_error_display_options());
+    if (should_trigger_reporting) {
+      threat_details_in_progress_ =
+          g_browser_process->safe_browsing_service()
+              ->trigger_manager()
+              ->StartCollectingThreatDetails(
+                  TriggerType::SECURITY_INTERSTITIAL, web_contents,
+                  unsafe_resources[0], url_loader_factory,
+                  HistoryServiceFactory::GetForProfile(
+                      profile, ServiceAccessType::EXPLICIT_ACCESS),
+                  sb_error_ui()->get_error_display_options());
+    }
   }
 }
 
@@ -175,7 +178,7 @@
     // already showing would cause DontProceed() to be invoked.
     SafeBrowsingBlockingPage* blocking_page = factory_->CreateSafeBrowsingPage(
         ui_manager(), web_contents(), entry ? entry->GetURL() : GURL(),
-        unsafe_resources);
+        unsafe_resources, /*should_trigger_reporting=*/true);
     unsafe_resource_map->erase(iter);
 
     // Now that this interstitial is gone, we can show the new one.
@@ -238,14 +241,16 @@
     BaseUIManager* ui_manager,
     WebContents* web_contents,
     const GURL& main_frame_url,
-    const UnsafeResource& unsafe_resource) {
+    const UnsafeResource& unsafe_resource,
+    bool should_trigger_reporting) {
   const UnsafeResourceList resources{unsafe_resource};
   // Set up the factory if this has not been done already (tests do that
   // before this method is called).
   if (!factory_)
     factory_ = g_safe_browsing_blocking_page_factory_impl.Pointer();
   return factory_->CreateSafeBrowsingPage(ui_manager, web_contents,
-                                          main_frame_url, resources);
+                                          main_frame_url, resources,
+                                          should_trigger_reporting);
 }
 
 // static
@@ -268,7 +273,8 @@
         unsafe_resource.GetNavigationEntryForResource();
     GURL main_fram_url = entry ? entry->GetURL() : GURL();
     SafeBrowsingBlockingPage* blocking_page = CreateBlockingPage(
-        ui_manager, web_contents, main_fram_url, unsafe_resource);
+        ui_manager, web_contents, main_fram_url, unsafe_resource,
+        /*should_trigger_reporting=*/true);
     blocking_page->Show();
     MaybeTriggerSecurityInterstitialShownEvent(
         web_contents, main_fram_url,
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page.h b/chrome/browser/safe_browsing/safe_browsing_blocking_page.h
index a6724b7..de875ef6 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page.h
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page.h
@@ -56,12 +56,15 @@
   ~SafeBrowsingBlockingPage() override;
 
   // Creates a blocking page. Use ShowBlockingPage if you don't need to access
-  // the blocking page directly.
+  // the blocking page directly. |should_trigger_reporting| controls whether a
+  // safe browsing extended reporting report will be created for this blocking
+  // page.
   static SafeBrowsingBlockingPage* CreateBlockingPage(
       BaseUIManager* ui_manager,
       content::WebContents* web_contents,
       const GURL& main_frame_url,
-      const UnsafeResource& unsafe_resource);
+      const UnsafeResource& unsafe_resource,
+      bool should_trigger_reporting);
 
   // Shows a blocking page warning the user about phishing/malware for a
   // specific resource.
@@ -112,6 +115,7 @@
       const GURL& main_frame_url,
       const UnsafeResourceList& unsafe_resources,
       const BaseSafeBrowsingErrorUI::SBErrorDisplayOptions& display_options,
+      bool should_trigger_reporting,
       network::SharedURLLoaderFactory* url_loader_for_testing = nullptr);
 
   // Called after the user clicks OnProceed(). If the page has malicious
@@ -157,7 +161,8 @@
       BaseUIManager* ui_manager,
       content::WebContents* web_contents,
       const GURL& main_frame_url,
-      const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources) = 0;
+      const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources,
+      bool should_trigger_reporting) = 0;
 };
 
 }  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
index 89a875c..33c143d 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
@@ -104,7 +104,7 @@
 const char kMaliciousIframe[] = "/safe_browsing/malware_iframe.html";
 const char kUnrelatedUrl[] = "https://www.google.com";
 
-bool AreCommittedMainFrameInterstitialsEnabled() {
+bool AreCommittedInterstitialsEnabled() {
   return base::FeatureList::IsEnabled(kCommittedSBInterstitials);
 }
 
@@ -279,12 +279,14 @@
       WebContents* web_contents,
       const GURL& main_frame_url,
       const UnsafeResourceList& unsafe_resources,
-      const BaseSafeBrowsingErrorUI::SBErrorDisplayOptions& display_options)
+      const BaseSafeBrowsingErrorUI::SBErrorDisplayOptions& display_options,
+      bool should_trigger_reporting)
       : SafeBrowsingBlockingPage(manager,
                                  web_contents,
                                  main_frame_url,
                                  unsafe_resources,
-                                 display_options),
+                                 display_options,
+                                 should_trigger_reporting),
         wait_for_delete_(false) {
     // Don't wait the whole 3 seconds for the browser test.
     SetThreatDetailsProceedDelayForTesting(100);
@@ -329,8 +331,8 @@
       BaseUIManager* delegate,
       WebContents* web_contents,
       const GURL& main_frame_url,
-      const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources)
-      override {
+      const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources,
+      bool should_trigger_reporting) override {
     PrefService* prefs =
         Profile::FromBrowserContext(web_contents->GetBrowserContext())
             ->GetPrefs();
@@ -348,9 +350,9 @@
         true,  // should_open_links_in_new_tab
         always_show_back_to_safety_,
         "cpn_safe_browsing" /* help_center_article_link */);
-    return new TestSafeBrowsingBlockingPage(delegate, web_contents,
-                                            main_frame_url, unsafe_resources,
-                                            display_options);
+    return new TestSafeBrowsingBlockingPage(
+        delegate, web_contents, main_frame_url, unsafe_resources,
+        display_options, should_trigger_reporting);
   }
 
  private:
@@ -360,20 +362,29 @@
 // Tests the safe browsing blocking page in a browser.
 class SafeBrowsingBlockingPageBrowserTest
     : public CertVerifierBrowserTest,
-      public testing::WithParamInterface<testing::tuple<SBThreatType, bool>> {
+      public testing::WithParamInterface<
+          testing::tuple<SBThreatType, bool, bool>> {
  public:
-  enum Visibility {
-    VISIBILITY_ERROR = -1,
-    HIDDEN = 0,
-    VISIBLE = 1
-  };
+  enum Visibility { VISIBILITY_ERROR = -1, HIDDEN = 0, VISIBLE = 1 };
 
   SafeBrowsingBlockingPageBrowserTest()
       : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {
     std::map<std::string, std::string> parameters = {
         {safe_browsing::kTagAndAttributeParamName, "div,foo,div,baz"}};
-    scoped_feature_list_.InitAndEnableFeatureWithParameters(
+    base::test::ScopedFeatureList::FeatureAndParams tag_and_attribute(
         safe_browsing::kThreatDomDetailsTagAndAttributeFeature, parameters);
+    // Test with and without committed interstitials.
+    if (testing::get<1>(GetParam())) {
+      std::vector<base::test::ScopedFeatureList::FeatureAndParams>
+          enabled_features = {tag_and_attribute,
+                              base::test::ScopedFeatureList::FeatureAndParams(
+                                  safe_browsing::kCommittedSBInterstitials,
+                                  std::map<std::string, std::string>())};
+      scoped_feature_list_.InitWithFeaturesAndParameters(enabled_features, {});
+    } else {
+      scoped_feature_list_.InitWithFeaturesAndParameters(
+          {tag_and_attribute}, {safe_browsing::kCommittedSBInterstitials});
+    }
   }
 
   ~SafeBrowsingBlockingPageBrowserTest() override {}
@@ -479,7 +490,7 @@
         browser()->tab_strip_model()->GetActiveWebContents());
     ssl_blocking_page->CommandReceived(base::NumberToString(
         security_interstitials::SecurityInterstitialCommand::CMD_PROCEED));
-    if (AreCommittedMainFrameInterstitialsEnabled()) {
+    if (AreCommittedInterstitialsEnabled()) {
       // When both SB and SSL interstitials are committed navigations, we need
       // to wait for two navigations here, one is from the SSL interstitial to
       // the blocked site (which does not complete since SB blocks it) and the
@@ -542,7 +553,7 @@
     // that it has indeed displayed it -- and this sometimes happens after
     // NavigateToURL returns.
     SafeBrowsingBlockingPage* interstitial_page;
-    if (AreCommittedMainFrameInterstitialsEnabled()) {
+    if (AreCommittedInterstitialsEnabled()) {
       security_interstitials::SecurityInterstitialTabHelper* helper =
           security_interstitials::SecurityInterstitialTabHelper::
               FromWebContents(contents);
@@ -563,7 +574,7 @@
   void AssertNoInterstitial(bool wait_for_delete) {
     WebContents* contents =
         browser()->tab_strip_model()->GetActiveWebContents();
-    if (AreCommittedMainFrameInterstitialsEnabled()) {
+    if (AreCommittedInterstitialsEnabled()) {
       ASSERT_FALSE(IsShowingInterstitial(contents));
       return;
     }
@@ -584,7 +595,7 @@
   }
 
   bool IsShowingInterstitial(WebContents* contents) {
-    if (AreCommittedMainFrameInterstitialsEnabled()) {
+    if (AreCommittedInterstitialsEnabled()) {
       security_interstitials::SecurityInterstitialTabHelper* helper =
           security_interstitials::SecurityInterstitialTabHelper::
               FromWebContents(contents);
@@ -640,7 +651,7 @@
   }
 
   content::RenderFrameHost* GetRenderFrameHost() {
-    if (AreCommittedMainFrameInterstitialsEnabled()) {
+    if (AreCommittedInterstitialsEnabled()) {
       return browser()
           ->tab_strip_model()
           ->GetActiveWebContents()
@@ -655,7 +666,7 @@
 
   bool WaitForReady(Browser* browser) {
     WebContents* contents = browser->tab_strip_model()->GetActiveWebContents();
-    if (AreCommittedMainFrameInterstitialsEnabled()) {
+    if (AreCommittedInterstitialsEnabled()) {
       if (!content::WaitForRenderFrameReady(contents->GetMainFrame())) {
         return false;
       }
@@ -721,7 +732,7 @@
         browser()->tab_strip_model()->GetActiveWebContents());
     if (!Click(node_id))
       return false;
-    if (AreCommittedMainFrameInterstitialsEnabled()) {
+    if (AreCommittedInterstitialsEnabled()) {
       observer.WaitForNavigationFinished();
       return true;
     }
@@ -858,7 +869,7 @@
     ui_test_utils::NavigateToURLWithDisposition(
         browser, url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
         ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
-    if (AreCommittedMainFrameInterstitialsEnabled()) {
+    if (AreCommittedInterstitialsEnabled()) {
       content::TestNavigationObserver observer(
           browser->tab_strip_model()->GetActiveWebContents());
       observer.WaitForNavigationFinished();
@@ -884,12 +895,11 @@
 #endif
 IN_PROC_BROWSER_TEST_P(SafeBrowsingBlockingPageBrowserTest,
                        MAYBE_RedirectInIFrameCanceled) {
-  // TODO(crbug.com/940555, carlosil): Re-enable once committed interstitials
-  // for subresources are implemented. The behavior currently tested by this
-  // works, but test fixtures can't distinguish between subframe and main frame
-  // interstitials, so they can't test for the combination of committed and
-  // non-committed.
-  if (AreCommittedMainFrameInterstitialsEnabled())
+  // TODO(carlosil): The waiting for the open in new tab then cancel redirect
+  // logic this test relies on doesn't work with CI. Decide whether we want to
+  // add logic to fix it, or remove the test for CI (since with CI all redirects
+  // on the blocked page are automatically canceled anyways).
+  if (base::FeatureList::IsEnabled(safe_browsing::kCommittedSBInterstitials))
     return;
   // 1. Test the case that redirect is a subresource.
   MalwareRedirectCancelAndProceed("openWinIFrame");
@@ -899,10 +909,8 @@
 }
 
 IN_PROC_BROWSER_TEST_P(SafeBrowsingBlockingPageBrowserTest, RedirectCanceled) {
-  // TODO(carlosil, crbug.com/76460): This behavior is no longer true with
-  // committed interstitials, which fixes the bug, if this is desired this test
-  // should be removed when committed interstitials launch.
-  if (AreCommittedMainFrameInterstitialsEnabled())
+  // TODO(carlosil): See comment in previous test.
+  if (base::FeatureList::IsEnabled(safe_browsing::kCommittedSBInterstitials))
     return;
   // 2. Test the case that redirect is the only resource.
   MalwareRedirectCancelAndProceed("openWin");
@@ -1001,14 +1009,6 @@
 }
 
 IN_PROC_BROWSER_TEST_P(SafeBrowsingBlockingPageBrowserTest, IframeDontProceed) {
-  // TODO(crbug.com/940555, carlosil): Re-enable once committed interstitials
-  // for subresources are implemented. The behavior currently tested by this
-  // works, but test fixtures can't distinguish between subframe and main frame
-  // interstitials, so they can't test for the combination of committed and
-  // non-committed.
-  if (AreCommittedMainFrameInterstitialsEnabled()) {
-    return;
-  }
   SetupThreatIframeWarningAndNavigate();
 
   EXPECT_EQ(VISIBLE, GetVisibility("primary-button"));
@@ -1028,14 +1028,6 @@
 }
 
 IN_PROC_BROWSER_TEST_P(SafeBrowsingBlockingPageBrowserTest, IframeProceed) {
-  // TODO(crbug.com/940555, carlosil): Re-enable once committed interstitials
-  // for subresources are implemented. The behavior currently tested by this
-  // works, but test fixtures can't distinguish between subframe and main frame
-  // interstitials, so they can't test for the combination of committed and
-  // non-committed..
-  if (AreCommittedMainFrameInterstitialsEnabled()) {
-    return;
-  }
   GURL url = SetupThreatIframeWarningAndNavigate();
 
   EXPECT_TRUE(ClickAndWaitForDetach("proceed-link"));
@@ -1047,14 +1039,6 @@
 
 IN_PROC_BROWSER_TEST_P(SafeBrowsingBlockingPageBrowserTest,
                        IframeOptInAndReportThreatDetails) {
-  // TODO(crbug.com/940555, carlosil): Re-enable once committed interstitials
-  // for subresources are implemented. The behavior currently tested by this
-  // works, but test fixtures can't distinguish between subframe and main frame
-  // interstitials, so they can't test for the combination of committed and
-  // non-committed.
-  if (AreCommittedMainFrameInterstitialsEnabled()) {
-    return;
-  }
   // The extended reporting opt-in is presented in the interstitial for malware,
   // phishing, and UwS threats.
   const bool expect_threat_details =
@@ -1164,7 +1148,7 @@
   content::TestNavigationObserver observer(
       browser()->tab_strip_model()->GetActiveWebContents());
   GURL url = SetupWarningAndNavigate(browser());
-  if (AreCommittedMainFrameInterstitialsEnabled()) {
+  if (AreCommittedInterstitialsEnabled()) {
     observer.WaitForNavigationFinished();
   }
 
@@ -1266,7 +1250,7 @@
   content::TestNavigationObserver observer(
       browser()->tab_strip_model()->GetActiveWebContents());
   SendCommand(security_interstitials::CMD_PROCEED);
-  if (AreCommittedMainFrameInterstitialsEnabled()) {
+  if (AreCommittedInterstitialsEnabled()) {
     observer.WaitForNavigationFinished();
   }
 
@@ -1329,7 +1313,7 @@
   NavigationController& controller = tab->GetController();
   ASSERT_TRUE(controller.GetVisibleEntry());
   EXPECT_EQ(url, controller.GetVisibleEntry()->GetURL());
-  if (!AreCommittedMainFrameInterstitialsEnabled()) {
+  if (!AreCommittedInterstitialsEnabled()) {
     ASSERT_TRUE(controller.GetPendingEntry());
     EXPECT_EQ(url, controller.GetPendingEntry()->GetURL());
   }
@@ -1345,7 +1329,7 @@
   // Check navigation entry state.
   ASSERT_TRUE(controller.GetVisibleEntry());
   EXPECT_EQ(url, controller.GetVisibleEntry()->GetURL());
-  if (!AreCommittedMainFrameInterstitialsEnabled()) {
+  if (!AreCommittedInterstitialsEnabled()) {
     ASSERT_TRUE(controller.GetPendingEntry());
     EXPECT_EQ(url, controller.GetPendingEntry()->GetURL());
   }
@@ -1359,7 +1343,7 @@
       browser()->tab_strip_model()->GetActiveWebContents();
   ASSERT_TRUE(interstitial_tab);
 
-  if (AreCommittedMainFrameInterstitialsEnabled()) {
+  if (AreCommittedInterstitialsEnabled()) {
     security_interstitials::SecurityInterstitialTabHelper* helper =
         security_interstitials::SecurityInterstitialTabHelper::FromWebContents(
             interstitial_tab);
@@ -1507,14 +1491,6 @@
 
 IN_PROC_BROWSER_TEST_P(SafeBrowsingBlockingPageBrowserTest,
                        WhitelistIframeRevisit) {
-  // TODO(crbug.com/940555, carlosil): Re-enable once committed interstitials
-  // for subresources are implemented. The behavior currently tested by this
-  // works, but test fixtures can't distinguish between subframe and main frame
-  // interstitials, so they can't test for the combination of committed and
-  // non-committed
-  if (AreCommittedMainFrameInterstitialsEnabled()) {
-    return;
-  }
   GURL url = SetupThreatIframeWarningAndNavigate();
 
   EXPECT_TRUE(ClickAndWaitForDetach("proceed-link"));
@@ -1640,14 +1616,6 @@
 // https://crbug.com/659713.
 IN_PROC_BROWSER_TEST_P(SafeBrowsingBlockingPageBrowserTest,
                        SecurityStateDowngradedForSubresourceInterstitial) {
-  // TODO(crbug.com/940555, carlosil): Re-enable once committed interstitials
-  // for subresources are implemented. The behavior currently tested by this
-  // works, but test fixtures can't distinguish between subframe and main frame
-  // interstitials, so they can't test for the combination of committed and
-  // non-committed.
-  if (AreCommittedMainFrameInterstitialsEnabled()) {
-    return;
-  }
   WebContents* error_tab = browser()->tab_strip_model()->GetActiveWebContents();
   ASSERT_TRUE(error_tab);
   SecurityStyleTestObserver observer(error_tab);
@@ -1721,14 +1689,6 @@
 // subresource. Regression test for https://crbug.com/659709.
 IN_PROC_BROWSER_TEST_P(SafeBrowsingBlockingPageBrowserTest,
                        SecurityStateGoBackOnSubresourceInterstitial) {
-  // TODO(crbug.com/940555, carlosil): Re-enable once committed interstitials
-  // for subresources are implemented. The behavior currently tested by this
-  // works, but test fixtures can't distinguish between subframe and main frame
-  // interstitials, so they can't test for the combination of committed and
-  // non-committed.
-  if (AreCommittedMainFrameInterstitialsEnabled()) {
-    return;
-  }
   // Navigate to a page so that there is somewhere to go back to.
   GURL start_url = embedded_test_server()->GetURL(kEmptyPage);
   ui_test_utils::NavigateToURL(browser(), start_url);
@@ -1858,44 +1818,20 @@
 }
 
 INSTANTIATE_TEST_SUITE_P(
-    SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting,
+    SafeBrowsingBlockingPageBrowserTestWithThreatTypeIsolationSettingAndCommittedInterstitialsSetting,
     SafeBrowsingBlockingPageBrowserTest,
     testing::Combine(
         testing::Values(SB_THREAT_TYPE_URL_MALWARE,  // Threat types
                         SB_THREAT_TYPE_URL_PHISHING,
                         SB_THREAT_TYPE_URL_UNWANTED),
-        testing::Bool()));  // If isolate all sites for testing.
-
-class SafeBrowsingBlockingPageBrowserTestWithCommittedSBInterstitials
-    : public SafeBrowsingBlockingPageBrowserTest {
- public:
-  SafeBrowsingBlockingPageBrowserTestWithCommittedSBInterstitials() {
-    feature_list_.InitAndEnableFeature(kCommittedSBInterstitials);
-  }
-
- private:
-  base::test::ScopedFeatureList feature_list_;
-};
-
-// TODO(crbug.com/916683): Once interstitial bindings are hooked with committed
-// interstitials, all other tests should run with committed interstitials
-// enabled. At that point this test will become redundant and should be removed.
-// Test that an main frame interstitial is displayed with committed
-// interstitials enabled.
-IN_PROC_BROWSER_TEST_P(
-    SafeBrowsingBlockingPageBrowserTestWithCommittedSBInterstitials,
-    CommittedInterstitialShows) {
-  SetupWarningAndNavigate(browser());
-  EXPECT_TRUE(IsShowingInterstitial(
-      browser()->tab_strip_model()->GetActiveWebContents()));
-}
+        testing::Bool(),    // If isolate all sites for testing.
+        testing::Bool()));  // Enable/Disable committed interstitials.
 
 // Tests that commands work in a subframe triggered interstitial if a different
 // interstitial has been shown previously on the same webcontents. Regression
 // test for crbug.com/1021334
-IN_PROC_BROWSER_TEST_P(
-    SafeBrowsingBlockingPageBrowserTestWithCommittedSBInterstitials,
-    IframeProceedAfterMainFrameInterstitial) {
+IN_PROC_BROWSER_TEST_P(SafeBrowsingBlockingPageBrowserTest,
+                       IframeProceedAfterMainFrameInterstitial) {
   // Navigate to a site that triggers an interstitial due to a bad main frame
   // URL.
   ui_test_utils::NavigateToURL(browser(),
@@ -1915,15 +1851,6 @@
             browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
 }
 
-INSTANTIATE_TEST_SUITE_P(
-    SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting,
-    SafeBrowsingBlockingPageBrowserTestWithCommittedSBInterstitials,
-    testing::Combine(
-        testing::Values(SB_THREAT_TYPE_URL_MALWARE,  // Threat types
-                        SB_THREAT_TYPE_URL_PHISHING,
-                        SB_THREAT_TYPE_URL_UNWANTED),
-        testing::Bool()));  // If isolate all sites for testing.
-
 // Test that SafeBrowsingBlockingPage properly decodes IDN URLs that are
 // displayed.
 class SafeBrowsingBlockingPageIDNTest
@@ -1953,7 +1880,7 @@
     return SafeBrowsingBlockingPage::CreateBlockingPage(
         sb_service->ui_manager().get(), contents,
         is_subresource ? GURL("http://mainframe.example.com/") : request_url,
-        resource);
+        resource, true);
   }
 };
 
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page_unittest.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page_unittest.cc
index bab0c9c7..f4db379e 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page_unittest.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page_unittest.cc
@@ -129,6 +129,7 @@
                                  main_frame_url,
                                  unsafe_resources,
                                  display_options,
+                                 true,
                                  url_loader_for_testing) {
     // Don't delay details at all for the unittest.
     SetThreatDetailsProceedDelayForTesting(0);
@@ -155,8 +156,8 @@
       BaseUIManager* manager,
       WebContents* web_contents,
       const GURL& main_frame_url,
-      const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources)
-      override {
+      const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources,
+      bool should_trigger_reporting) override {
     PrefService* prefs =
         Profile::FromBrowserContext(web_contents->GetBrowserContext())
             ->GetPrefs();
@@ -196,7 +197,8 @@
                                  web_contents,
                                  main_frame_url,
                                  unsafe_resources,
-                                 display_options),
+                                 display_options,
+                                 true),
         sb_error_ui_(unsafe_resources[0].url,
                      main_frame_url,
                      GetInterstitialReason(unsafe_resources),
@@ -235,8 +237,8 @@
       BaseUIManager* manager,
       WebContents* web_contents,
       const GURL& main_frame_url,
-      const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources)
-      override {
+      const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources,
+      bool should_trigger_reporting) override {
     PrefService* prefs =
         Profile::FromBrowserContext(web_contents->GetBrowserContext())
             ->GetPrefs();
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_throttle.cc b/chrome/browser/safe_browsing/safe_browsing_navigation_throttle.cc
index 87dbc6ce..7d66f80 100644
--- a/chrome/browser/safe_browsing/safe_browsing_navigation_throttle.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_navigation_throttle.cc
@@ -36,8 +36,8 @@
   if (manager->PopUnsafeResourceForURL(handle->GetURL(), &resource)) {
     SafeBrowsingBlockingPage* blocking_page =
         SafeBrowsingBlockingPage::CreateBlockingPage(
-            manager.get(), handle->GetWebContents(), handle->GetURL(),
-            resource);
+            manager.get(), handle->GetWebContents(), handle->GetURL(), resource,
+            true);
     std::string error_page_content = blocking_page->GetHTMLContents();
     security_interstitials::SecurityInterstitialTabHelper::
         AssociateBlockingPage(handle->GetWebContents(),
diff --git a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
index f233d4b..233edf74 100644
--- a/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_service_browsertest.cc
@@ -36,6 +36,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock.h"
 #include "base/task/post_task.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/thread_test_helper.h"
 #include "base/time/time.h"
 #include "build/branding_buildflags.h"
@@ -141,24 +142,12 @@
 const char kPrefetchMalwarePage[] = "/safe_browsing/prefetch_malware.html";
 const char kBillingInterstitialPage[] = "/safe_browsing/billing.html";
 
-// TODO(ricea): Use net::test_server::HungResponse instead.
-class NeverCompletingHttpResponse : public net::test_server::HttpResponse {
- public:
-  ~NeverCompletingHttpResponse() override {}
-
-  void SendResponse(
-      const net::test_server::SendBytesCallback& send,
-      const net::test_server::SendCompleteCallback& done) override {
-    // Do nothing. |done| is never called.
-  }
-};
-
 std::unique_ptr<net::test_server::HttpResponse> HandleNeverCompletingRequests(
     const net::test_server::HttpRequest& request) {
   if (!base::StartsWith(request.relative_url, kNeverCompletesPath,
                         base::CompareCase::SENSITIVE))
     return nullptr;
-  return std::make_unique<NeverCompletingHttpResponse>();
+  return std::make_unique<net::test_server::HungResponse>();
 }
 
 // This is not a proper WebSocket server. It does the minimum necessary to make
@@ -177,9 +166,8 @@
   }
   ~QuasiWebSocketHttpResponse() override {}
 
-  void SendResponse(
-      const net::test_server::SendBytesCallback& send,
-      const net::test_server::SendCompleteCallback& done) override {
+  void SendResponse(const net::test_server::SendBytesCallback& send,
+                    net::test_server::SendCompleteCallback done) override {
     const auto response_headers = base::StringPrintf(
         "HTTP/1.1 101 WebSocket Protocol Handshake\r\n"
         "Upgrade: WebSocket\r\n"
@@ -633,9 +621,32 @@
   DISALLOW_COPY_AND_ASSIGN(V4SafeBrowsingServiceTest);
 };
 
+// Parameterized class to run tests both with and without committed
+// interstitials.
+// TODO(carlosil): Once committed interstitials fully launch, this class can be
+// removed, and tests that use it can be changed back to use the parent class.
+class V4SafeBrowsingServiceTestCommittedInterstitials
+    : public V4SafeBrowsingServiceTest,
+      public ::testing::WithParamInterface<bool> {
+ public:
+  V4SafeBrowsingServiceTestCommittedInterstitials() {
+    if (GetParam()) {
+      scoped_feature_list_.InitAndEnableFeature(
+          safe_browsing::kCommittedSBInterstitials);
+    } else {
+      scoped_feature_list_.InitAndDisableFeature(
+          safe_browsing::kCommittedSBInterstitials);
+    }
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
 // Ensures that if an image is marked as UwS, the main page doesn't show an
 // interstitial.
-IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, UnwantedImgIgnored) {
+IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceTestCommittedInterstitials,
+                       UnwantedImgIgnored) {
   GURL main_url = embedded_test_server()->GetURL(kMalwarePage);
   GURL img_url = embedded_test_server()->GetURL(kMalwareImg);
 
@@ -651,7 +662,8 @@
 
 // Proceeding through an interstitial should cause it to get whitelisted for
 // that user.
-IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, MalwareWithWhitelist) {
+IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceTestCommittedInterstitials,
+                       MalwareWithWhitelist) {
   GURL url = embedded_test_server()->GetURL(kEmptyPage);
 
   // After adding the URL to SafeBrowsing database and full hash cache, we
@@ -697,7 +709,8 @@
 
 // This test confirms that prefetches don't themselves get the interstitial
 // treatment.
-IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, Prefetch) {
+IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceTestCommittedInterstitials,
+                       Prefetch) {
   GURL url = embedded_test_server()->GetURL(kPrefetchMalwarePage);
   GURL malware_url = embedded_test_server()->GetURL(kMalwarePage);
 
@@ -722,7 +735,8 @@
 }
 
 // Ensure that the referrer information is preserved in the hit report.
-IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, MainFrameHitWithReferrer) {
+IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceTestCommittedInterstitials,
+                       MainFrameHitWithReferrer) {
   GURL first_url = embedded_test_server()->GetURL(kEmptyPage);
   GURL bad_url = embedded_test_server()->GetURL(kMalwarePage);
 
@@ -751,12 +765,8 @@
   EXPECT_FALSE(hit_report().is_subresource);
 }
 
-IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest,
+IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceTestCommittedInterstitials,
                        SubResourceHitWithMainFrameReferrer) {
-  // TODO(carlosil): Re-enable once committed SB subresource interstitials are
-  // functional.
-  if (base::FeatureList::IsEnabled(kCommittedSBInterstitials))
-    return;
   GURL first_url = embedded_test_server()->GetURL(kEmptyPage);
   GURL second_url = embedded_test_server()->GetURL(kMalwarePage);
   GURL bad_url = embedded_test_server()->GetURL(kMalwareImg);
@@ -786,12 +796,8 @@
   EXPECT_TRUE(hit_report().is_subresource);
 }
 
-IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest,
+IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceTestCommittedInterstitials,
                        SubResourceHitWithMainFrameRendererInitiatedSlowLoad) {
-  // TODO(carlosil): Re-enable once committed SB subresource interstitials are
-  // functional.
-  if (base::FeatureList::IsEnabled(kCommittedSBInterstitials))
-    return;
   GURL first_url = embedded_test_server()->GetURL(kEmptyPage);
   GURL second_url = embedded_test_server()->GetURL(kMalwareDelayedLoadsPage);
   GURL third_url = embedded_test_server()->GetURL(kNeverCompletesPath);
@@ -841,12 +847,8 @@
   EXPECT_TRUE(hit_report().is_subresource);
 }
 
-IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest,
+IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceTestCommittedInterstitials,
                        SubResourceHitWithMainFrameBrowserInitiatedSlowLoad) {
-  // TODO(carlosil): Re-enable once committed SB subresource interstitials are
-  // functional.
-  if (base::FeatureList::IsEnabled(kCommittedSBInterstitials))
-    return;
   GURL first_url = embedded_test_server()->GetURL(kEmptyPage);
   GURL second_url = embedded_test_server()->GetURL(kMalwareDelayedLoadsPage);
   GURL third_url = embedded_test_server()->GetURL(kNeverCompletesPath);
@@ -902,11 +904,8 @@
   EXPECT_TRUE(hit_report().is_subresource);
 }
 
-IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, SubResourceHitOnFreshTab) {
-  // TODO(carlosil): Re-enable once committed SB subresource interstitials are
-  // functional.
-  if (base::FeatureList::IsEnabled(kCommittedSBInterstitials))
-    return;
+IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceTestCommittedInterstitials,
+                       SubResourceHitOnFreshTab) {
   // Allow popups.
   HostContentSettingsMapFactory::GetForProfile(browser()->profile())
       ->SetDefaultContentSetting(ContentSettingsType::POPUPS,
@@ -934,6 +933,7 @@
   // Run javascript in the blank new tab to load the malware image.
   EXPECT_CALL(observer_, OnSafeBrowsingHit(IsUnsafeResourceFor(img_url)))
       .Times(1);
+  content::TestNavigationObserver observer(new_tab_contents);
   new_tab_rfh->ExecuteJavaScriptForTests(
       base::ASCIIToUTF16("var img=new Image();"
                          "img.src=\"" +
@@ -941,9 +941,12 @@
                          "\";"
                          "document.body.appendChild(img);"),
       base::NullCallback());
-
   // Wait for interstitial to show.
-  content::WaitForInterstitialAttach(new_tab_contents);
+  if (base::FeatureList::IsEnabled(kCommittedSBInterstitials)) {
+    observer.WaitForNavigationFinished();
+  } else {
+    content::WaitForInterstitialAttach(new_tab_contents);
+  }
   Mock::VerifyAndClearExpectations(&observer_);
   EXPECT_TRUE(ShowingInterstitialPage());
   EXPECT_TRUE(got_hit_report());
@@ -954,11 +957,26 @@
   EXPECT_EQ(GURL(), hit_report().referrer_url);
 
   // Proceed through it.
-  InterstitialPage* interstitial_page = new_tab_contents->GetInterstitialPage();
-  ASSERT_TRUE(interstitial_page);
-  interstitial_page->Proceed();
-
-  content::WaitForInterstitialDetach(new_tab_contents);
+  if (base::FeatureList::IsEnabled(kCommittedSBInterstitials)) {
+    security_interstitials::SecurityInterstitialTabHelper* helper =
+        security_interstitials::SecurityInterstitialTabHelper::FromWebContents(
+            new_tab_contents);
+    ASSERT_TRUE(helper);
+    security_interstitials::SecurityInterstitialPage* interstitial =
+        helper->GetBlockingPageForCurrentlyCommittedNavigationForTesting();
+    ASSERT_TRUE(interstitial);
+    // TODO(carlosil): 1 is CMD_PROCEED, this should be changed to the enum
+    // values once CommandReceived is changed to accept integers.
+    content::TestNavigationObserver observer(new_tab_contents);
+    interstitial->CommandReceived("1");
+    observer.WaitForNavigationFinished();
+  } else {
+    InterstitialPage* interstitial_page =
+        new_tab_contents->GetInterstitialPage();
+    ASSERT_TRUE(interstitial_page);
+    interstitial_page->Proceed();
+    content::WaitForInterstitialDetach(new_tab_contents);
+  }
   EXPECT_FALSE(ShowingInterstitialPage());
 }
 
@@ -966,7 +984,8 @@
 // START: These tests use SafeBrowsingService::Client to directly interact with
 // SafeBrowsingService.
 ///////////////////////////////////////////////////////////////////////////////
-IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, CheckDownloadUrl) {
+IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceTestCommittedInterstitials,
+                       CheckDownloadUrl) {
   GURL badbin_url = embedded_test_server()->GetURL(kMalwareFile);
   std::vector<GURL> badbin_urls(1, badbin_url);
 
@@ -984,7 +1003,8 @@
   EXPECT_EQ(SB_THREAT_TYPE_URL_BINARY_MALWARE, client->GetThreatType());
 }
 
-IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, CheckUnwantedSoftwareUrl) {
+IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceTestCommittedInterstitials,
+                       CheckUnwantedSoftwareUrl) {
   const GURL bad_url = embedded_test_server()->GetURL(kMalwareFile);
   {
     scoped_refptr<TestSBClient> client(new TestSBClient);
@@ -1020,7 +1040,8 @@
   }
 }
 
-IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, CheckBrowseUrl) {
+IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceTestCommittedInterstitials,
+                       CheckBrowseUrl) {
   const GURL bad_url = embedded_test_server()->GetURL(kMalwareFile);
   {
     scoped_refptr<TestSBClient> client(new TestSBClient);
@@ -1057,7 +1078,8 @@
   }
 }
 
-IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, CheckBrowseUrlForBilling) {
+IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceTestCommittedInterstitials,
+                       CheckBrowseUrlForBilling) {
   const GURL bad_url = embedded_test_server()->GetURL(kBillingInterstitialPage);
   {
     scoped_refptr<TestSBClient> client(new TestSBClient);
@@ -1094,10 +1116,6 @@
 // deleted when the old database backend is removed.
 IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceJsRequestInterstitialTest,
                        MalwareBlocked) {
-  // TODO(carlosil): Re-enable once committed SB subresource interstitials are
-  // functional.
-  if (base::FeatureList::IsEnabled(kCommittedSBInterstitials))
-    return;
   GURL base_url = embedded_test_server()->GetURL(kMalwareJsRequestPage);
   JsRequestTestParam param = GetParam();
   GURL js_request_url = ConstructJsRequestURL(base_url, param.request_type);
@@ -1204,7 +1222,8 @@
         JsRequestTestParam(ContextType::kServiceWorker,
                            JsRequestType::kFetch)));
 
-IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, CheckDownloadUrlRedirects) {
+IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceTestCommittedInterstitials,
+                       CheckDownloadUrlRedirects) {
   GURL original_url = embedded_test_server()->GetURL(kEmptyPage);
   GURL badbin_url = embedded_test_server()->GetURL(kMalwareFile);
   GURL final_url = embedded_test_server()->GetURL(kEmptyPage);
@@ -1230,7 +1249,8 @@
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
 // This test is only enabled when GOOGLE_CHROME_BRANDING is true because the
 // store that this test uses is only populated on GOOGLE_CHROME_BRANDING builds.
-IN_PROC_BROWSER_TEST_F(V4SafeBrowsingServiceTest, CheckResourceUrl) {
+IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceTestCommittedInterstitials,
+                       CheckResourceUrl) {
   GURL blacklist_url = embedded_test_server()->GetURL(kBlacklistResource);
   GURL malware_url = embedded_test_server()->GetURL(kMaliciousResource);
   std::string blacklist_url_hash, malware_url_hash;
@@ -1266,6 +1286,11 @@
 // SafeBrowsingService.
 ///////////////////////////////////////////////////////////////////////////////
 
+INSTANTIATE_TEST_SUITE_P(
+    /* no prefix */,
+    V4SafeBrowsingServiceTestCommittedInterstitials,
+    testing::Bool());
+
 // TODO(vakh): Add test for UnwantedMainFrame.
 
 class V4SafeBrowsingServiceMetadataTest
@@ -1300,10 +1325,6 @@
 // Irrespective of the threat_type classification, if the iframe URL is marked
 // as Malware, an interstitial should be shown.
 IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceMetadataTest, MalwareIFrame) {
-  // TODO(carlosil): Re-enable once committed SB subresource interstitials are
-  // functional.
-  if (base::FeatureList::IsEnabled(kCommittedSBInterstitials))
-    return;
   GURL main_url = embedded_test_server()->GetURL(kMalwarePage);
   GURL iframe_url = embedded_test_server()->GetURL(kMalwareIFrame);
 
@@ -1327,10 +1348,6 @@
 // Depending on the threat_type classification, if an embedded resource is
 // marked as Malware, an interstitial may be shown.
 IN_PROC_BROWSER_TEST_P(V4SafeBrowsingServiceMetadataTest, MalwareImg) {
-  // TODO(carlosil): Re-enable once committed SB subresource interstitials are
-  // functional.
-  if (base::FeatureList::IsEnabled(kCommittedSBInterstitials))
-    return;
   GURL main_url = embedded_test_server()->GetURL(kMalwarePage);
   GURL img_url = embedded_test_server()->GetURL(kMalwareImg);
 
diff --git a/chrome/browser/safe_browsing/safe_browsing_subresource_tab_helper.cc b/chrome/browser/safe_browsing/safe_browsing_subresource_tab_helper.cc
index 38b8128..386c8b2 100644
--- a/chrome/browser/safe_browsing/safe_browsing_subresource_tab_helper.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_subresource_tab_helper.cc
@@ -33,7 +33,8 @@
       safe_browsing::SafeBrowsingBlockingPage* blocking_page =
           safe_browsing::SafeBrowsingBlockingPage::CreateBlockingPage(
               manager.get(), navigation_handle->GetWebContents(),
-              navigation_handle->GetURL(), resource);
+              navigation_handle->GetURL(), resource,
+              /*should_trigger_reporting=*/true);
       security_interstitials::SecurityInterstitialTabHelper::
           AssociateBlockingPage(navigation_handle->GetWebContents(),
                                 navigation_handle->GetNavigationId(),
diff --git a/chrome/browser/safe_browsing/ui_manager.cc b/chrome/browser/safe_browsing/ui_manager.cc
index a144dd4..89a6e83 100644
--- a/chrome/browser/safe_browsing/ui_manager.cc
+++ b/chrome/browser/safe_browsing/ui_manager.cc
@@ -214,9 +214,14 @@
     const GURL& blocked_url,
     const UnsafeResource& unsafe_resource) {
   SafeBrowsingSubresourceTabHelper::CreateForWebContents(contents);
+  // This blocking page is only used to retrieve the HTML for the page, so we
+  // set |should_trigger_reporting| to false. Reports for subresources are
+  // triggered when creating the blocking page that gets associated in
+  // SafeBrowsingSubresourceTabHelper.
   SafeBrowsingBlockingPage* blocking_page =
-      SafeBrowsingBlockingPage::CreateBlockingPage(this, contents, blocked_url,
-                                                   unsafe_resource);
+      SafeBrowsingBlockingPage::CreateBlockingPage(
+          this, contents, blocked_url, unsafe_resource,
+          /*should_trigger_reporting=*/false);
   return blocking_page;
 }
 
diff --git a/chrome/browser/safe_browsing/ui_manager_unittest.cc b/chrome/browser/safe_browsing/ui_manager_unittest.cc
index ec739ec2..e37dac8 100644
--- a/chrome/browser/safe_browsing/ui_manager_unittest.cc
+++ b/chrome/browser/safe_browsing/ui_manager_unittest.cc
@@ -447,14 +447,15 @@
             unsafe_resources,
             BaseSafeBrowsingErrorUI::SBErrorDisplayOptions(
                 BaseBlockingPage::IsMainPageLoadBlocked(unsafe_resources),
-                false,                   // is_extended_reporting_opt_in_allowed
-                false,                   // is_off_the_record
-                false,                   // is_extended_reporting_enabled
-                false,                   // is_extended_reporting_policy_managed
-                false,                   // is_proceed_anyway_disabled
-                true,                    // should_open_links_in_new_tab
-                true,                    // always_show_back_to_safety
-                "cpn_safe_browsing")) {  // help_center_article_link
+                false,                 // is_extended_reporting_opt_in_allowed
+                false,                 // is_off_the_record
+                false,                 // is_extended_reporting_enabled
+                false,                 // is_extended_reporting_policy_managed
+                false,                 // is_proceed_anyway_disabled
+                true,                  // should_open_links_in_new_tab
+                true,                  // always_show_back_to_safety
+                "cpn_safe_browsing"),  // help_center_article_link
+            true) {                    // should_trigger_reporting
     // Don't delay details at all for the unittest.
     SetThreatDetailsProceedDelayForTesting(0);
     DontCreateViewForTesting();
@@ -472,8 +473,8 @@
       BaseUIManager* delegate,
       content::WebContents* web_contents,
       const GURL& main_frame_url,
-      const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources)
-      override {
+      const SafeBrowsingBlockingPage::UnsafeResourceList& unsafe_resources,
+      bool should_trigger_reporting) override {
     return new TestSafeBrowsingBlockingPage(delegate, web_contents,
                                             main_frame_url, unsafe_resources);
   }
diff --git a/chrome/browser/search/chrome_colors/chrome_colors_service.cc b/chrome/browser/search/chrome_colors/chrome_colors_service.cc
index 3660f5b..bff4c5e 100644
--- a/chrome/browser/search/chrome_colors/chrome_colors_service.cc
+++ b/chrome/browser/search/chrome_colors/chrome_colors_service.cc
@@ -66,7 +66,7 @@
   if (!search_provider_observer_ || !search_provider_observer_->is_google())
     return;
   SaveThemeRevertState(tab);
-  theme_service_->BuildFromColor(color);
+  theme_service_->BuildAutogeneratedThemeFromColor(color);
 }
 
 void ChromeColorsService::RevertThemeChangesForTab(content::WebContents* tab,
diff --git a/chrome/browser/search/chrome_colors/chrome_colors_service_unittest.cc b/chrome/browser/search/chrome_colors/chrome_colors_service_unittest.cc
index a44451a..0251db5 100644
--- a/chrome/browser/search/chrome_colors/chrome_colors_service_unittest.cc
+++ b/chrome/browser/search/chrome_colors/chrome_colors_service_unittest.cc
@@ -73,18 +73,18 @@
 
   SkColor theme_color1 = SkColorSetRGB(100, 0, 200);
   chrome_colors_service_->ApplyAutogeneratedTheme(theme_color1, tab_);
-  EXPECT_TRUE(theme_service->UsingAutogenerated());
+  EXPECT_TRUE(theme_service->UsingAutogeneratedTheme());
   EXPECT_TRUE(HasThemeReinstaller());
 
   SkColor theme_color2 = SkColorSetRGB(100, 0, 200);
   chrome_colors_service_->ApplyAutogeneratedTheme(theme_color2, tab_);
-  EXPECT_TRUE(theme_service->UsingAutogenerated());
+  EXPECT_TRUE(theme_service->UsingAutogeneratedTheme());
   EXPECT_TRUE(HasThemeReinstaller());
 
   // Last color is saved.
   chrome_colors_service_->ConfirmThemeChanges();
-  EXPECT_TRUE(theme_service->UsingAutogenerated());
-  EXPECT_EQ(theme_color2, theme_service->GetThemeColor());
+  EXPECT_TRUE(theme_service->UsingAutogeneratedTheme());
+  EXPECT_EQ(theme_color2, theme_service->GetAutogeneratedThemeColor());
   EXPECT_FALSE(HasThemeReinstaller());
 }
 
@@ -94,17 +94,17 @@
 
   SkColor theme_color1 = SkColorSetRGB(100, 0, 200);
   chrome_colors_service_->ApplyAutogeneratedTheme(theme_color1, tab_);
-  EXPECT_TRUE(theme_service->UsingAutogenerated());
+  EXPECT_TRUE(theme_service->UsingAutogeneratedTheme());
   EXPECT_TRUE(HasThemeReinstaller());
 
   SkColor theme_color2 = SkColorSetRGB(100, 0, 200);
   chrome_colors_service_->ApplyAutogeneratedTheme(theme_color2, tab_);
-  EXPECT_TRUE(theme_service->UsingAutogenerated());
+  EXPECT_TRUE(theme_service->UsingAutogeneratedTheme());
   EXPECT_TRUE(HasThemeReinstaller());
 
   // State before first apply is restored.
   chrome_colors_service_->RevertThemeChanges();
-  EXPECT_FALSE(theme_service->UsingAutogenerated());
+  EXPECT_FALSE(theme_service->UsingAutogeneratedTheme());
   EXPECT_FALSE(HasThemeReinstaller());
 }
 
@@ -112,17 +112,17 @@
        ApplyAndConfirmAutogeneratedTheme_withPreviousTheme) {
   ThemeService* theme_service = ThemeServiceFactory::GetForProfile(profile());
   SkColor prev_theme_color = SkColorSetRGB(200, 0, 200);
-  theme_service->BuildFromColor(prev_theme_color);
-  ASSERT_EQ(prev_theme_color, theme_service->GetThemeColor());
+  theme_service->BuildAutogeneratedThemeFromColor(prev_theme_color);
+  ASSERT_EQ(prev_theme_color, theme_service->GetAutogeneratedThemeColor());
 
   SkColor new_theme_color = SkColorSetRGB(100, 0, 200);
   chrome_colors_service_->ApplyAutogeneratedTheme(new_theme_color, tab_);
-  EXPECT_EQ(new_theme_color, theme_service->GetThemeColor());
+  EXPECT_EQ(new_theme_color, theme_service->GetAutogeneratedThemeColor());
   EXPECT_TRUE(HasThemeReinstaller());
 
   chrome_colors_service_->ConfirmThemeChanges();
-  EXPECT_TRUE(theme_service->UsingAutogenerated());
-  EXPECT_EQ(new_theme_color, theme_service->GetThemeColor());
+  EXPECT_TRUE(theme_service->UsingAutogeneratedTheme());
+  EXPECT_EQ(new_theme_color, theme_service->GetAutogeneratedThemeColor());
   EXPECT_FALSE(HasThemeReinstaller());
 }
 
@@ -130,25 +130,25 @@
        ApplyAndRevertAutogeneratedTheme_withPreviousTheme) {
   ThemeService* theme_service = ThemeServiceFactory::GetForProfile(profile());
   SkColor prev_theme_color = SkColorSetRGB(200, 0, 200);
-  theme_service->BuildFromColor(prev_theme_color);
-  ASSERT_EQ(prev_theme_color, theme_service->GetThemeColor());
+  theme_service->BuildAutogeneratedThemeFromColor(prev_theme_color);
+  ASSERT_EQ(prev_theme_color, theme_service->GetAutogeneratedThemeColor());
 
   SkColor new_theme_color = SkColorSetRGB(100, 0, 200);
   chrome_colors_service_->ApplyAutogeneratedTheme(new_theme_color, tab_);
-  EXPECT_EQ(new_theme_color, theme_service->GetThemeColor());
+  EXPECT_EQ(new_theme_color, theme_service->GetAutogeneratedThemeColor());
   EXPECT_TRUE(HasThemeReinstaller());
 
   chrome_colors_service_->RevertThemeChanges();
-  EXPECT_TRUE(theme_service->UsingAutogenerated());
-  EXPECT_EQ(prev_theme_color, theme_service->GetThemeColor());
+  EXPECT_TRUE(theme_service->UsingAutogeneratedTheme());
+  EXPECT_EQ(prev_theme_color, theme_service->GetAutogeneratedThemeColor());
   EXPECT_FALSE(HasThemeReinstaller());
 }
 
 TEST_F(TestChromeColorsService, ApplyAndConfirmDefaultTheme_withPreviousTheme) {
   ThemeService* theme_service = ThemeServiceFactory::GetForProfile(profile());
   SkColor prev_theme_color = SkColorSetRGB(200, 0, 200);
-  theme_service->BuildFromColor(prev_theme_color);
-  ASSERT_EQ(prev_theme_color, theme_service->GetThemeColor());
+  theme_service->BuildAutogeneratedThemeFromColor(prev_theme_color);
+  ASSERT_EQ(prev_theme_color, theme_service->GetAutogeneratedThemeColor());
   ASSERT_FALSE(theme_service->UsingDefaultTheme());
 
   chrome_colors_service_->ApplyDefaultTheme(tab_);
@@ -157,15 +157,15 @@
 
   chrome_colors_service_->ConfirmThemeChanges();
   EXPECT_TRUE(theme_service->UsingDefaultTheme());
-  EXPECT_NE(prev_theme_color, theme_service->GetThemeColor());
+  EXPECT_NE(prev_theme_color, theme_service->GetAutogeneratedThemeColor());
   EXPECT_FALSE(HasThemeReinstaller());
 }
 
 TEST_F(TestChromeColorsService, ApplyAndRevertDefaultTheme_withPreviousTheme) {
   ThemeService* theme_service = ThemeServiceFactory::GetForProfile(profile());
   SkColor prev_theme_color = SkColorSetRGB(200, 0, 200);
-  theme_service->BuildFromColor(prev_theme_color);
-  ASSERT_EQ(prev_theme_color, theme_service->GetThemeColor());
+  theme_service->BuildAutogeneratedThemeFromColor(prev_theme_color);
+  ASSERT_EQ(prev_theme_color, theme_service->GetAutogeneratedThemeColor());
   ASSERT_FALSE(theme_service->UsingDefaultTheme());
 
   chrome_colors_service_->ApplyDefaultTheme(tab_);
@@ -174,7 +174,7 @@
 
   chrome_colors_service_->RevertThemeChanges();
   EXPECT_FALSE(theme_service->UsingDefaultTheme());
-  EXPECT_EQ(prev_theme_color, theme_service->GetThemeColor());
+  EXPECT_EQ(prev_theme_color, theme_service->GetAutogeneratedThemeColor());
   EXPECT_FALSE(HasThemeReinstaller());
 }
 
@@ -184,12 +184,12 @@
 
   SkColor theme_color = SkColorSetRGB(100, 0, 200);
   chrome_colors_service_->ApplyAutogeneratedTheme(theme_color, tab_);
-  EXPECT_TRUE(theme_service->UsingAutogenerated());
+  EXPECT_TRUE(theme_service->UsingAutogeneratedTheme());
   EXPECT_TRUE(HasThemeReinstaller());
 
   chrome_colors_service_->RevertThemeChangesForTab(
       nullptr, chrome_colors::RevertReason::TAB_CLOSED);
-  EXPECT_TRUE(theme_service->UsingAutogenerated());
+  EXPECT_TRUE(theme_service->UsingAutogeneratedTheme());
   EXPECT_TRUE(HasThemeReinstaller());
 
   AddTab(browser(), GURL("chrome://newtab"));
@@ -198,12 +198,12 @@
   ASSERT_NE(tab_, second_tab);
   chrome_colors_service_->RevertThemeChangesForTab(
       second_tab, chrome_colors::RevertReason::TAB_CLOSED);
-  EXPECT_TRUE(theme_service->UsingAutogenerated());
+  EXPECT_TRUE(theme_service->UsingAutogeneratedTheme());
   EXPECT_TRUE(HasThemeReinstaller());
 
   chrome_colors_service_->RevertThemeChangesForTab(
       tab_, chrome_colors::RevertReason::TAB_CLOSED);
-  EXPECT_FALSE(theme_service->UsingAutogenerated());
+  EXPECT_FALSE(theme_service->UsingAutogeneratedTheme());
   EXPECT_FALSE(HasThemeReinstaller());
 }
 
@@ -213,16 +213,16 @@
 
   SkColor theme_color = SkColorSetRGB(100, 0, 200);
   chrome_colors_service_->ApplyAutogeneratedTheme(theme_color, tab_);
-  EXPECT_TRUE(theme_service->UsingAutogenerated());
+  EXPECT_TRUE(theme_service->UsingAutogeneratedTheme());
   EXPECT_TRUE(HasThemeReinstaller());
 
   // Switching to third-party NTP should revert current changes.
   SetUserSelectedDefaultSearchProvider("www.third-party-ntp.com");
-  EXPECT_FALSE(theme_service->UsingAutogenerated());
+  EXPECT_FALSE(theme_service->UsingAutogeneratedTheme());
   EXPECT_FALSE(HasThemeReinstaller());
 
   // When third-party NTP is present autogenerated theme shouldn't apply.
   chrome_colors_service_->ApplyAutogeneratedTheme(theme_color, tab_);
-  EXPECT_FALSE(theme_service->UsingAutogenerated());
+  EXPECT_FALSE(theme_service->UsingAutogeneratedTheme());
   EXPECT_FALSE(HasThemeReinstaller());
 }
diff --git a/chrome/browser/search/instant_service.cc b/chrome/browser/search/instant_service.cc
index 0dbf9697..d193e2c4 100644
--- a/chrome/browser/search/instant_service.cc
+++ b/chrome/browser/search/instant_service.cc
@@ -753,13 +753,13 @@
             theme_provider.HasCustomImage(IDR_THEME_NTP_ATTRIBUTION);
       }
     }
-  } else if (theme_service->UsingAutogenerated()) {
-    theme_->color_id = chrome_colors::ChromeColorsService::GetColorId(
-        theme_service->GetThemeColor());
+  } else if (theme_service->UsingAutogeneratedTheme()) {
+    theme_->color_picked = theme_service->GetAutogeneratedThemeColor();
+    theme_->color_id =
+        chrome_colors::ChromeColorsService::GetColorId(theme_->color_picked);
     theme_->color_dark = theme_provider.GetColor(ThemeProperties::COLOR_FRAME);
     theme_->color_light =
         theme_provider.GetColor(ThemeProperties::COLOR_NTP_BACKGROUND);
-    theme_->color_picked = theme_service->GetThemeColor();
   }
 }
 
diff --git a/chrome/browser/search/instant_service_unittest.cc b/chrome/browser/search/instant_service_unittest.cc
index 3b7004c..273eae7e 100644
--- a/chrome/browser/search/instant_service_unittest.cc
+++ b/chrome/browser/search/instant_service_unittest.cc
@@ -794,7 +794,7 @@
   content::WindowedNotificationObserver theme_change_observer(
       chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
       content::Source<ThemeService>(theme_service));
-  theme_service->BuildFromColor(SK_ColorRED);
+  theme_service->BuildAutogeneratedThemeFromColor(SK_ColorRED);
   theme_change_observer.Wait();
 
   theme = instant_service_->GetInitializedNtpTheme();
diff --git a/chrome/browser/signin/dice_browsertest.cc b/chrome/browser/signin/dice_browsertest.cc
index 4977508..b49e3d0 100644
--- a/chrome/browser/signin/dice_browsertest.cc
+++ b/chrome/browser/signin/dice_browsertest.cc
@@ -116,12 +116,11 @@
       base::OnceCallback<void(base::OnceClosure)> callback)
       : callback_(std::move(callback)) {}
 
-  void SendResponse(
-      const net::test_server::SendBytesCallback& send,
-      const net::test_server::SendCompleteCallback& done) override {
+  void SendResponse(const net::test_server::SendBytesCallback& send,
+                    net::test_server::SendCompleteCallback done) override {
     // Called on the IO thread to unblock the response.
     base::OnceClosure unblock_io_thread =
-        base::BindOnce(send, ToResponseString(), done);
+        base::BindOnce(send, ToResponseString(), std::move(done));
     // Unblock the response from any thread by posting a task to the IO thread.
     base::OnceClosure unblock_any_thread =
         base::BindOnce(base::IgnoreResult(&base::TaskRunner::PostTask),
diff --git a/chrome/browser/ssl/security_state_tab_helper_browsertest.cc b/chrome/browser/ssl/security_state_tab_helper_browsertest.cc
index 47ede843..528624c6 100644
--- a/chrome/browser/ssl/security_state_tab_helper_browsertest.cc
+++ b/chrome/browser/ssl/security_state_tab_helper_browsertest.cc
@@ -1108,7 +1108,9 @@
   // Ensure that WebContentsObservers don't show an incorrect Form Not Secure
   // explanation. Regression test for https://crbug.com/691412.
   EXPECT_EQ(0u, observer.latest_explanations().neutral_explanations.size());
-  EXPECT_EQ(blink::SecurityStyle::kNeutral, observer.latest_security_style());
+  // The below expectation is based on the feature flag set in the field trial
+  // testing config.
+  EXPECT_EQ(blink::SecurityStyle::kInsecure, observer.latest_security_style());
 
   content::NavigationEntry* entry = contents->GetController().GetVisibleEntry();
   ASSERT_TRUE(entry);
@@ -1230,7 +1232,9 @@
   // Ensure that WebContentsObservers don't show an incorrect Form Not Secure
   // explanation. Regression test for https://crbug.com/691412.
   EXPECT_EQ(0u, observer.latest_explanations().neutral_explanations.size());
-  EXPECT_EQ(blink::SecurityStyle::kNeutral, observer.latest_security_style());
+  // The below expectation is based on the feature flag set in the field trial
+  // testing config.
+  EXPECT_EQ(blink::SecurityStyle::kInsecure, observer.latest_security_style());
 
   content::NavigationEntry* entry = contents->GetController().GetVisibleEntry();
   ASSERT_TRUE(entry);
@@ -1640,7 +1644,9 @@
 
   GURL mixed_content_url(https_server_.GetURL(replacement_path));
   ui_test_utils::NavigateToURL(browser(), mixed_content_url);
-  EXPECT_EQ(blink::SecurityStyle::kNeutral, observer.latest_security_style());
+  // The below expectation is based on the feature flag set in the field trial
+  // testing config.
+  EXPECT_EQ(blink::SecurityStyle::kInsecure, observer.latest_security_style());
 
   const content::SecurityStyleExplanations& mixed_content_explanation =
       observer.latest_explanations();
diff --git a/chrome/browser/supervised_user/logged_in_user_mixin.cc b/chrome/browser/supervised_user/logged_in_user_mixin.cc
index d9a180a..bb2fcf8 100644
--- a/chrome/browser/supervised_user/logged_in_user_mixin.cc
+++ b/chrome/browser/supervised_user/logged_in_user_mixin.cc
@@ -6,6 +6,7 @@
 
 #include <vector>
 
+#include "chromeos/constants/chromeos_switches.h"
 #include "chromeos/login/auth/stub_authenticator_builder.h"
 #include "chromeos/login/auth/user_context.h"
 #include "components/account_id/account_id.h"
@@ -38,10 +39,12 @@
     InProcessBrowserTestMixinHost* mixin_host,
     LogInType type,
     net::EmbeddedTestServer* embedded_test_server,
+    InProcessBrowserTest* test_base,
     bool should_launch_browser,
     base::Optional<AccountId> account_id,
     bool include_initial_user)
-    : user_(account_id.value_or(
+    : InProcessBrowserTestMixin(mixin_host),
+      user_(account_id.value_or(
                 AccountId::FromUserEmailGaiaId(FakeGaiaMixin::kFakeUserEmail,
                                                FakeGaiaMixin::kFakeUserGaiaId)),
             ConvertUserType(type)),
@@ -51,7 +54,8 @@
       user_policy_helper_(user_.account_id.GetUserEmail(),
                           &local_policy_server_),
       embedded_test_server_setup_(mixin_host, embedded_test_server),
-      fake_gaia_(mixin_host, embedded_test_server) {
+      fake_gaia_(mixin_host, embedded_test_server),
+      test_base_(test_base) {
   // By default, LoginManagerMixin will set up user session manager not to
   // launch browser as part of user session setup - use this to override that
   // behavior.
@@ -60,30 +64,16 @@
 
 LoggedInUserMixin::~LoggedInUserMixin() = default;
 
-void LoggedInUserMixin::SetUpOnMainThreadHelper(
-    net::RuleBasedHostResolverProc* host_resolver,
-    InProcessBrowserTest* test_base,
-    bool issue_any_scope_token,
-    bool wait_for_active_session) {
+void LoggedInUserMixin::SetUpOnMainThread() {
   // By default, browser tests block anything that doesn't go to localhost, so
   // account.google.com requests would never reach fake GAIA server without
   // this.
-  host_resolver->AddRule("*", "127.0.0.1");
-  // Call RequestPolicyUpdate() to set up policy, which prevents the call to
-  // LogInUser() below from hanging indefinitely when there's no initial user
-  // and wait_for_active_session is true.
-  GetUserPolicyMixin()->RequestPolicyUpdate();
-  LogInUser(issue_any_scope_token, wait_for_active_session);
-  // Set the private |browser_| member in InProcessBrowserTest.
-  // Otherwise calls to InProcessBrowserTest::browser() returns null and leads
-  // to segmentation faults.
-  // Note: |browser_| is only non-null if should_launch_browser was set to true
-  // in the constructor.
-  test_base->SelectFirstBrowser();
+  test_base_->host_resolver()->AddRule("*", "127.0.0.1");
 }
 
 void LoggedInUserMixin::LogInUser(bool issue_any_scope_token,
-                                  bool wait_for_active_session) {
+                                  bool wait_for_active_session,
+                                  bool request_policy_update) {
   UserContext user_context = LoginManagerMixin::CreateDefaultUserContext(user_);
   user_context.SetRefreshToken(FakeGaiaMixin::kFakeRefreshToken);
   if (user_.user_type == user_manager::USER_TYPE_CHILD) {
@@ -95,8 +85,19 @@
                                      user_.account_id.GetGaiaId(),
                                      FakeGaiaMixin::kFakeRefreshToken);
   }
+  if (request_policy_update) {
+    // Set up policy, which prevents the call to LoginAndWaitForActiveSession()
+    // below from hanging indefinitely in some test scenarios.
+    GetUserPolicyMixin()->RequestPolicyUpdate();
+  }
   if (wait_for_active_session) {
     login_manager_.LoginAndWaitForActiveSession(user_context);
+    // Set the private |browser_| member in InProcessBrowserTest.
+    // Otherwise calls to InProcessBrowserTest::browser() returns null and leads
+    // to segmentation faults.
+    // Note: |browser_| is only non-null if should_launch_browser was set to
+    // true in the constructor.
+    test_base_->SelectFirstBrowser();
   } else {
     login_manager_.AttemptLoginUsingAuthenticator(
         user_context, std::make_unique<StubAuthenticatorBuilder>(user_context));
diff --git a/chrome/browser/supervised_user/logged_in_user_mixin.h b/chrome/browser/supervised_user/logged_in_user_mixin.h
index ea1f171..a0afc535 100644
--- a/chrome/browser/supervised_user/logged_in_user_mixin.h
+++ b/chrome/browser/supervised_user/logged_in_user_mixin.h
@@ -13,6 +13,7 @@
 #include "chrome/browser/chromeos/login/test/login_manager_mixin.h"
 #include "chrome/browser/chromeos/login/test/user_policy_mixin.h"
 #include "chrome/browser/chromeos/policy/user_policy_test_helper.h"
+#include "chrome/test/base/mixin_based_in_process_browser_test.h"
 
 class AccountId;
 
@@ -26,9 +27,9 @@
 // * Instantiate this class while passing in the inherited mixin_host_ member to
 // the constructor.
 // Note: the desired LogInType must be known at construction time.
-// * Pass the inherited embedded_test_server() into the constructor
-// as well.
-// * Call LogInUser() or SetUpOnMainThreadHelper() to log in.
+// * Pass the inherited embedded_test_server() and pointer to
+// InProcessBrowserTest instance into the constructor as well.
+// * Call LogInUser() to log in.
 // Example:
 /*
 class MyBrowserTestClass : public MixinBasedInProcessBrowserTest {
@@ -36,58 +37,49 @@
   void SetUpOnMainThread() override {
     MixinBasedInProcessBrowserTest::SetUpOnMainThread();
     // The call below logs in as child user.
-    logged_in_user_mixin_.SetUpOnMainThreadHelper(host_resolver(), this);
+    logged_in_user_mixin_.LogInUser();
   }
 
  private:
   LoggedInUserMixin logged_in_user_mixin_{&mixin_host_,
                                           LoggedInUserMixin::LogInType::kChild,
-                                          embedded_test_server()};
+                                          embedded_test_server(), this};
 };
 */
-class LoggedInUserMixin {
+class LoggedInUserMixin : public InProcessBrowserTestMixin {
  public:
   enum class LogInType { kRegular, kChild };
 
-  // |mixin_host| coordinates the other mixins and usually gets passed in from a
-  // descendant of MixinBasedInProcessBrowserTest.
+  // |mixin_host| coordinates the other mixins. Since your browser test class
+  // inherits from MixinBasedInProcessBrowserTest, there is an inherited
+  // mixin_host_ member that can be passed into this constructor.
   // |type| specifies the desired user log in type, currently either regular or
   // child.
-  // |embedded_test_server| usually gets passed in from a descendant of
-  // BrowserTestBase.
+  // |embedded_test_server|: your browser test class should already inherit from
+  // BrowserTestBase. That means there is an inherited embedded_test_server()
+  // that can be passed into this constructor.
+  // |test_base|: just pass in a pointer to the browser test class.
   // |should_launch_browser| determines whether a browser instance is launched
   // after successful login. Call SelectFirstBrowser() afterwards to ensure
-  // calls to browser() don't return nullptr. SetUpOnMainThreadHelper() already
-  // packages the calls to LoginUser() and SelectFirstBrowser() together for
-  // convenience.
+  // calls to browser() don't return nullptr. LogInUser() already calls
+  // SelectFirstBrowser() for convenience.
   // |account_id| is the desired test account id for logging in. The default
   // test account already works for the majority of test cases, unless an
   // enterprise account is needed for setting up policy.
   // |include_initial_user| determines whether the TestUserInfo should be passed
-  // to the initial users list of the LoginManagerMixin.
+  // to the initial users list of the LoginManagerMixin. Excluding the initial
+  // user causes the OOBE GAIA screen to show on start-up.
   LoggedInUserMixin(InProcessBrowserTestMixinHost* mixin_host,
                     LogInType type,
                     net::EmbeddedTestServer* embedded_test_server,
+                    InProcessBrowserTest* test_base,
                     bool should_launch_browser = true,
                     base::Optional<AccountId> account_id = base::nullopt,
                     bool include_initial_user = true);
-  ~LoggedInUserMixin();
+  ~LoggedInUserMixin() override;
 
-  // Helper function for refactoring common setup code.
-  // Call this function in your test class's SetUpOnMainThread() after calling
-  // MixinBasedInProcessBrowserTest::SetUpOnMainThread().
-  // This functions does the following:
-  // * Reroutes all requests to localhost.
-  // * Sets up user policy.
-  // * Logs in as regular or child account depending on the |type| argument
-  // passed to the constructor.
-  // * Calls InProcessBrowserTest::SelectFirstBrowser() so that browser()
-  // returns a non-null browser instance. Note: This call will only be effective
-  // if should_launch_browser was set to true in the constructor.
-  void SetUpOnMainThreadHelper(net::RuleBasedHostResolverProc* host_resolver,
-                               InProcessBrowserTest* test_base,
-                               bool issue_any_scope_token = false,
-                               bool wait_for_active_session = true);
+  // InProcessBrowserTestMixin:
+  void SetUpOnMainThread() override;
 
   // Log in as regular or child account depending on the |type| argument passed
   // to the constructor.
@@ -95,15 +87,13 @@
   // token associated with the test refresh token. Only matters for child login.
   // * If |wait_for_active_session|, LoginManagerMixin will wait for the session
   // state to change to ACTIVE after logging in.
+  // * If |request_policy_update|, UserPolicyMixin will set up user policy.
   void LogInUser(bool issue_any_scope_token = false,
-                 bool wait_for_active_session = true);
+                 bool wait_for_active_session = true,
+                 bool request_policy_update = false);
 
   LoginManagerMixin* GetLoginManagerMixin() { return &login_manager_; }
 
-  LocalPolicyTestServerMixin* GetLocalPolicyTestServerMixin() {
-    return &local_policy_server_;
-  }
-
   UserPolicyMixin* GetUserPolicyMixin() { return &user_policy_; }
 
   policy::UserPolicyTestHelper* GetUserPolicyTestHelper() {
@@ -123,6 +113,8 @@
   EmbeddedTestServerSetupMixin embedded_test_server_setup_;
   FakeGaiaMixin fake_gaia_;
 
+  InProcessBrowserTest* test_base_;
+
   DISALLOW_COPY_AND_ASSIGN(LoggedInUserMixin);
 };
 
diff --git a/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc b/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc
index 42bf04d..6681a32 100644
--- a/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc
+++ b/chrome/browser/supervised_user/supervised_user_navigation_throttle_browsertest.cc
@@ -187,7 +187,7 @@
 void SupervisedUserNavigationThrottleTest::SetUp() {
   // Polymorphically initiate logged_in_user_mixin_.
   logged_in_user_mixin_ = std::make_unique<chromeos::LoggedInUserMixin>(
-      &mixin_host_, GetLogInType(), embedded_test_server());
+      &mixin_host_, GetLogInType(), embedded_test_server(), this);
   MixinBasedInProcessBrowserTest::SetUp();
 }
 
@@ -198,7 +198,7 @@
 
   ASSERT_TRUE(embedded_test_server()->Started());
 
-  logged_in_user_mixin_->SetUpOnMainThreadHelper(host_resolver(), this);
+  logged_in_user_mixin_->LogInUser();
 }
 
 // Tests that navigating to a blocked page simply fails if there is no
diff --git a/chrome/browser/supervised_user/supervised_user_service.cc b/chrome/browser/supervised_user/supervised_user_service.cc
index 7a4ae94..e778b70 100644
--- a/chrome/browser/supervised_user/supervised_user_service.cc
+++ b/chrome/browser/supervised_user/supervised_user_service.cc
@@ -747,6 +747,12 @@
       // extensions should not be affected.
       return ExtensionState::BLOCKED;
     }
+    if (ExtensionPrefs::Get(profile_)->DidExtensionEscalatePermissions(
+            extension.id())) {
+      // Block child users from approving existing extensions asking for
+      // additional permissions.
+      return ExtensionState::BLOCKED;
+    }
   }
 
   auto extension_it = approved_extensions_map_.find(extension.id());
diff --git a/chrome/browser/supervised_user/supervised_user_service_browsertest.cc b/chrome/browser/supervised_user/supervised_user_service_browsertest.cc
index dff9433..5ece807 100644
--- a/chrome/browser/supervised_user/supervised_user_service_browsertest.cc
+++ b/chrome/browser/supervised_user/supervised_user_service_browsertest.cc
@@ -30,13 +30,13 @@
  protected:
   void SetUpOnMainThread() override {
     MixinBasedInProcessBrowserTest::SetUpOnMainThread();
-    logged_in_user_mixin_.SetUpOnMainThreadHelper(host_resolver(), this);
+    logged_in_user_mixin_.LogInUser();
   }
 
  private:
   chromeos::LoggedInUserMixin logged_in_user_mixin_{
       &mixin_host_, chromeos::LoggedInUserMixin::LogInType::kChild,
-      embedded_test_server()};
+      embedded_test_server(), this};
 };
 
 // unsupervised tests
diff --git a/chrome/browser/supervised_user/supervised_user_url_filter_browsertest.cc b/chrome/browser/supervised_user/supervised_user_url_filter_browsertest.cc
index 709a38d9..246d20c 100644
--- a/chrome/browser/supervised_user/supervised_user_url_filter_browsertest.cc
+++ b/chrome/browser/supervised_user/supervised_user_url_filter_browsertest.cc
@@ -130,7 +130,7 @@
 
   void SetUpOnMainThread() override {
     MixinBasedInProcessBrowserTest::SetUpOnMainThread();
-    logged_in_user_mixin_.SetUpOnMainThreadHelper(host_resolver(), this);
+    logged_in_user_mixin_.LogInUser();
 
     supervised_user_service_ =
         SupervisedUserServiceFactory::GetForProfile(browser()->profile());
@@ -158,7 +158,7 @@
 
   chromeos::LoggedInUserMixin logged_in_user_mixin_{
       &mixin_host_, chromeos::LoggedInUserMixin::LogInType::kChild,
-      embedded_test_server()};
+      embedded_test_server(), this};
 };
 
 // Tests the filter mode in which all sites are blocked by default.
diff --git a/chrome/browser/sync/profile_sync_service_factory.cc b/chrome/browser/sync/profile_sync_service_factory.cc
index cfce36a8..b526ae4c 100644
--- a/chrome/browser/sync/profile_sync_service_factory.cc
+++ b/chrome/browser/sync/profile_sync_service_factory.cc
@@ -81,6 +81,10 @@
 #include "chrome/browser/sync/wifi_configuration_sync_service_factory.h"
 #endif  // defined(OS_CHROMEOS)
 
+#if defined(OS_WIN)
+#include "chrome/browser/sync/roaming_profile_directory_deleter_win.h"
+#endif  // defined(OS_WIN)
+
 namespace {
 
 void UpdateNetworkTimeOnUIThread(base::Time network_time,
@@ -276,6 +280,12 @@
 
   auto pss =
       std::make_unique<syncer::ProfileSyncService>(std::move(init_params));
+
+#if defined(OS_WIN)
+  if (!local_sync_backend_enabled)
+    DeleteRoamingUserDataDirectoryLater();
+#endif
+
   pss->Initialize();
 
   // Hook PSS into PersonalDataManager (a circular dependency).
diff --git a/chrome/browser/sync/roaming_profile_directory_deleter_win.cc b/chrome/browser/sync/roaming_profile_directory_deleter_win.cc
new file mode 100644
index 0000000..7cb5159
--- /dev/null
+++ b/chrome/browser/sync/roaming_profile_directory_deleter_win.cc
@@ -0,0 +1,68 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/sync/roaming_profile_directory_deleter_win.h"
+
+#include "base/bind.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/path_service.h"
+#include "base/task/post_task.h"
+#include "chrome/common/chrome_paths_internal.h"
+
+namespace {
+
+enum class RoamingUserDataDirectoryDeletionResult {
+  kError = 0,         // An unexpected error occurred during processing.
+  kDoesNotExist = 1,  // Roaming User Data dir does not exist.
+  kSucceeded = 2,     // Roaming User Data dir was deleted.
+  kFailed = 3,        // Roaming User Data dir could not be deleted.
+  kNotInAppData = 4,  // Roaming User Data dir is not within the AppData dir.
+  kMaxValue = kNotInAppData
+};
+
+// Deletes the user's roaming User Data directory if it is empty, along with any
+// of its parent directories leading up to the user's roaming AppData directory.
+RoamingUserDataDirectoryDeletionResult DeleteRoamingUserDataDirectoryImpl() {
+  base::FilePath to_delete;
+  if (!chrome::GetDefaultRoamingUserDataDirectory(&to_delete))
+    return RoamingUserDataDirectoryDeletionResult::kError;
+  if (!base::DirectoryExists(to_delete))
+    return RoamingUserDataDirectoryDeletionResult::kDoesNotExist;
+
+  base::FilePath app_data;
+  if (!base::PathService::Get(base::DIR_APP_DATA, &app_data))
+    return RoamingUserDataDirectoryDeletionResult::kError;
+  if (!app_data.IsParent(to_delete))
+    return RoamingUserDataDirectoryDeletionResult::kNotInAppData;
+
+  // Consider a failure to delete the deepest dir a failure. This likely means
+  // that the directory is not empty. Deleting intermediate dirs between it and
+  // the user's AppData directory is best-effort.
+  auto result = RoamingUserDataDirectoryDeletionResult::kFailed;
+  do {
+    // A non-recursive directory delete will fail if the directory is not empty.
+    if (!base::DeleteFile(to_delete, /*recursive=*/false))
+      return result;
+    result = RoamingUserDataDirectoryDeletionResult::kSucceeded;
+    to_delete = to_delete.DirName();
+  } while (app_data.IsParent(to_delete));
+  return result;
+}
+
+void DeleteRoamingUserDataDirectory() {
+  auto result = DeleteRoamingUserDataDirectoryImpl();
+  base::UmaHistogramEnumeration("Sync.DeleteRoamingUserDataDirectory", result);
+}
+
+}  // namespace
+
+void DeleteRoamingUserDataDirectoryLater() {
+  base::PostTask(
+      FROM_HERE,
+      {base::ThreadPool(), base::TaskPriority::BEST_EFFORT,
+       base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN, base::MayBlock()},
+      base::BindOnce(&DeleteRoamingUserDataDirectory));
+}
diff --git a/chrome/browser/sync/roaming_profile_directory_deleter_win.h b/chrome/browser/sync/roaming_profile_directory_deleter_win.h
new file mode 100644
index 0000000..a1d833e5
--- /dev/null
+++ b/chrome/browser/sync/roaming_profile_directory_deleter_win.h
@@ -0,0 +1,21 @@
+// 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.
+
+// In support of roaming profiles on Windows, Chrome can be configured to store
+// some profile data in a roaming profile location. Chrome accidentally created
+// this roaming User Data directory during sync startup even when roaming
+// profiles were not being used; see https://crbug.com/980487. This file here
+// provides a mechanism to clean up empty User Data directories created in the
+// default roaming profile location. This code should be deleted once the
+// DeleteRoamingUserDataDirectory metric indicates that most of the affected
+// population has been cleaned up.
+
+#ifndef CHROME_BROWSER_SYNC_ROAMING_PROFILE_DIRECTORY_DELETER_WIN_H_
+#define CHROME_BROWSER_SYNC_ROAMING_PROFILE_DIRECTORY_DELETER_WIN_H_
+
+// Deletes an empty roaming User Data directory at some later time in the
+// background.
+void DeleteRoamingUserDataDirectoryLater();
+
+#endif  // CHROME_BROWSER_SYNC_ROAMING_PROFILE_DIRECTORY_DELETER_WIN_H_
diff --git a/chrome/browser/sync/roaming_profile_directory_deleter_win_unittest.cc b/chrome/browser/sync/roaming_profile_directory_deleter_win_unittest.cc
new file mode 100644
index 0000000..cd55c2e
--- /dev/null
+++ b/chrome/browser/sync/roaming_profile_directory_deleter_win_unittest.cc
@@ -0,0 +1,78 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/sync/roaming_profile_directory_deleter_win.h"
+
+#include "base/base_paths.h"
+#include "base/files/file_util.h"
+#include "base/path_service.h"
+#include "base/test/scoped_path_override.h"
+#include "base/test/task_environment.h"
+#include "chrome/common/chrome_paths_internal.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+class DeleteRoamingUserDataDirectoryTest : public ::testing::Test {
+ protected:
+  void SetUp() override {
+    // Get the path to the faux AppData directory and make sure it's empty (it
+    // had better be).
+    ASSERT_TRUE(base::PathService::Get(base::DIR_APP_DATA, &app_data_dir_));
+    ASSERT_TRUE(base::DirectoryExists(app_data_dir_));
+    ASSERT_TRUE(base::IsDirectoryEmpty(app_data_dir_));
+  }
+
+  // Creates the roaming User Data directory within the faux AppData dir. |dir|,
+  // if not null, is populated with the path to the created directory.
+  void MakeRoamingUserDataDirectory(base::FilePath* dir) {
+    roaming_user_data_dir_.emplace();
+    ASSERT_TRUE(
+        chrome::GetDefaultRoamingUserDataDirectory(&*roaming_user_data_dir_));
+    ASSERT_TRUE(base::CreateDirectory(*roaming_user_data_dir_));
+    if (dir)
+      *dir = *roaming_user_data_dir_;
+  }
+
+  const base::FilePath& app_data_dir() const { return app_data_dir_; }
+
+  void RunTasksUntilIdle() { task_environment_.RunUntilIdle(); }
+
+ private:
+  base::test::TaskEnvironment task_environment_;
+  base::ScopedPathOverride app_data_override_{base::DIR_APP_DATA};
+  base::FilePath app_data_dir_;
+  base::Optional<base::FilePath> roaming_user_data_dir_;
+};
+
+// Tests that the roaming AppData directory is not touched when there is no
+// User Data dir within it.
+TEST_F(DeleteRoamingUserDataDirectoryTest, DoesNotExist) {
+  DeleteRoamingUserDataDirectoryLater();
+  RunTasksUntilIdle();
+  ASSERT_TRUE(base::DirectoryExists(app_data_dir()));
+  ASSERT_TRUE(base::IsDirectoryEmpty(app_data_dir()));
+}
+
+// Tests that an empty User Data directory and empty intermediate directories
+// are deleted.
+TEST_F(DeleteRoamingUserDataDirectoryTest, EmptyUserData) {
+  ASSERT_NO_FATAL_FAILURE(MakeRoamingUserDataDirectory(nullptr));
+  DeleteRoamingUserDataDirectoryLater();
+  RunTasksUntilIdle();
+  ASSERT_TRUE(base::DirectoryExists(app_data_dir()));
+  ASSERT_TRUE(base::IsDirectoryEmpty(app_data_dir()));
+}
+
+// Tests that a non-empty User Data directory is not touched.
+TEST_F(DeleteRoamingUserDataDirectoryTest, NonEmptyUserData) {
+  base::FilePath roaming_user_data_dir;
+  ASSERT_NO_FATAL_FAILURE(MakeRoamingUserDataDirectory(&roaming_user_data_dir));
+  ASSERT_EQ(
+      base::WriteFile(
+          roaming_user_data_dir.Append(FILE_PATH_LITERAL("file.txt")), "hi", 2),
+      2);
+  DeleteRoamingUserDataDirectoryLater();
+  RunTasksUntilIdle();
+  ASSERT_TRUE(base::DirectoryExists(roaming_user_data_dir));
+  ASSERT_FALSE(base::IsDirectoryEmpty(roaming_user_data_dir));
+}
diff --git a/chrome/browser/themes/theme_service.cc b/chrome/browser/themes/theme_service.cc
index 97e9b97..2146705 100644
--- a/chrome/browser/themes/theme_service.cc
+++ b/chrome/browser/themes/theme_service.cc
@@ -365,7 +365,7 @@
     base::StringToInt(rgb[0], &r);
     base::StringToInt(rgb[1], &g);
     base::StringToInt(rgb[2], &b);
-    BuildFromColor(SkColorSetRGB(r, g, b));
+    BuildAutogeneratedThemeFromColor(SkColorSetRGB(r, g, b));
   }
 }
 
@@ -466,6 +466,19 @@
                                      CustomThemeSupplier::ThemeType::EXTENSION;
 }
 
+bool ThemeService::UsingAutogeneratedTheme() const {
+  bool autogenerated =
+      get_theme_supplier() && get_theme_supplier()->get_theme_type() ==
+                                  CustomThemeSupplier::ThemeType::AUTOGENERATED;
+  DCHECK_EQ(autogenerated,
+            profile_->GetPrefs()->HasPrefPath(prefs::kAutogeneratedThemeColor));
+  return autogenerated;
+}
+
+bool ThemeService::ForceLightDefaultColors() const {
+  return UsingExtensionTheme() || UsingAutogeneratedTheme();
+}
+
 std::string ThemeService::GetThemeID() const {
   return profile_->GetPrefs()->GetString(prefs::kCurrentThemeID);
 }
@@ -534,13 +547,13 @@
                                        : service->default_theme_provider_;
 }
 
-void ThemeService::BuildFromColor(SkColor color) {
+void ThemeService::BuildAutogeneratedThemeFromColor(SkColor color) {
   base::Optional<std::string> previous_theme_id;
   if (UsingExtensionTheme())
     previous_theme_id = GetThemeID();
 
-  scoped_refptr<BrowserThemePack> pack(
-      new BrowserThemePack(CustomThemeSupplier::ThemeType::AUTOGENERATED));
+  auto pack = base::MakeRefCounted<BrowserThemePack>(
+      CustomThemeSupplier::ThemeType::AUTOGENERATED);
   BrowserThemePack::BuildFromColor(color, pack.get());
   SwapThemeSupplier(std::move(pack));
   if (theme_supplier_) {
@@ -551,16 +564,7 @@
   }
 }
 
-bool ThemeService::UsingAutogenerated() const {
-  bool autogenerated =
-      get_theme_supplier() && get_theme_supplier()->get_theme_type() ==
-                                  CustomThemeSupplier::ThemeType::AUTOGENERATED;
-  DCHECK_EQ(autogenerated,
-            profile_->GetPrefs()->HasPrefPath(prefs::kAutogeneratedThemeColor));
-  return autogenerated;
-}
-
-SkColor ThemeService::GetThemeColor() const {
+SkColor ThemeService::GetAutogeneratedThemeColor() const {
   return profile_->GetPrefs()->GetInteger(prefs::kAutogeneratedThemeColor);
 }
 
@@ -576,9 +580,9 @@
   } else if (theme_supplier &&
              theme_supplier->get_theme_type() ==
                  CustomThemeSupplier::ThemeType::AUTOGENERATED) {
-    reinstall_callback =
-        base::BindOnce(&ThemeService::BuildFromColor,
-                       weak_ptr_factory_.GetWeakPtr(), GetThemeColor());
+    reinstall_callback = base::BindOnce(
+        &ThemeService::BuildAutogeneratedThemeFromColor,
+        weak_ptr_factory_.GetWeakPtr(), GetAutogeneratedThemeColor());
   } else if (UsingSystemTheme()) {
     reinstall_callback = base::BindOnce(&ThemeService::UseSystemTheme,
                                         weak_ptr_factory_.GetWeakPtr());
@@ -658,10 +662,7 @@
     }
   }
 
-  // Always fall back to the non-incognito color when there's a custom theme
-  // because the default (classic) incognito color may be dramatically different
-  // (optimized for a light-on-dark color).
-  return TP::GetDefaultColor(id, incognito && !theme_supplier_);
+  return TP::GetDefaultColor(id, incognito && !ForceLightDefaultColors());
 }
 
 color_utils::HSL ThemeService::GetTint(int id, bool incognito) const {
@@ -671,9 +672,7 @@
   if (theme_supplier_ && theme_supplier_->GetTint(id, &hsl))
     return hsl;
 
-  // Always fall back to the non-incognito tint when there's a custom theme.
-  // See comment in GetDefaultColor().
-  return TP::GetDefaultTint(id, incognito && !theme_supplier_);
+  return TP::GetDefaultTint(id, incognito && !ForceLightDefaultColors());
 }
 
 void ThemeService::ClearAllThemeData() {
@@ -709,8 +708,8 @@
   }
 
   if (current_id == kAutogeneratedThemeID) {
-    SkColor color = GetThemeColor();
-    BuildFromColor(color);
+    SkColor color = GetAutogeneratedThemeColor();
+    BuildAutogeneratedThemeFromColor(color);
     set_ready();
     chrome_colors::ChromeColorsService::RecordColorOnLoadHistogram(color);
     return;
diff --git a/chrome/browser/themes/theme_service.h b/chrome/browser/themes/theme_service.h
index afb0aff..e559e8d 100644
--- a/chrome/browser/themes/theme_service.h
+++ b/chrome/browser/themes/theme_service.h
@@ -122,10 +122,16 @@
 
   // Whether we are using theme installed through extensions.
   // |UsingExtensionTheme| and |UsingDefaultTheme| are not mutually exclusive as
-  // default theme can be installed through extensions. Cannot be called before
-  // theme is loaded.
+  // default theme can be installed through extensions.
   virtual bool UsingExtensionTheme() const;
 
+  // Whether we are using an autogenerated theme.
+  virtual bool UsingAutogeneratedTheme() const;
+
+  // Whether to force the use of light colors/tints by default, i.e. ignore
+  // incognito state.  This is true for extension and autogenerated themes.
+  bool ForceLightDefaultColors() const;
+
   // Gets the id of the last installed theme. (The theme may have been further
   // locally customized.)
   virtual std::string GetThemeID() const;
@@ -147,13 +153,11 @@
   static const ui::ThemeProvider& GetDefaultThemeProviderForProfile(
       Profile* profile);
 
-  // Builds a theme from a given |color|.
-  virtual void BuildFromColor(SkColor color);
+  // Builds an autogenerated theme from a given |color| and applies it.
+  virtual void BuildAutogeneratedThemeFromColor(SkColor color);
 
-  // Whether using autogenerated theme. Cannot be called before theme is
-  // loaded.
-  virtual bool UsingAutogenerated() const;
-  virtual SkColor GetThemeColor() const;
+  // Returns the theme color for an autogenerated theme.
+  virtual SkColor GetAutogeneratedThemeColor() const;
 
   // Returns |ThemeService::ThemeReinstaller| for the current theme.
   std::unique_ptr<ThemeService::ThemeReinstaller>
diff --git a/chrome/browser/themes/theme_service_unittest.cc b/chrome/browser/themes/theme_service_unittest.cc
index 419f000..9e611de 100644
--- a/chrome/browser/themes/theme_service_unittest.cc
+++ b/chrome/browser/themes/theme_service_unittest.cc
@@ -480,10 +480,10 @@
       ThemeServiceFactory::GetForProfile(profile_.get());
   theme_service->UseDefaultTheme();
   EXPECT_TRUE(theme_service->UsingDefaultTheme());
-  EXPECT_FALSE(theme_service->UsingAutogenerated());
-  theme_service->BuildFromColor(SkColorSetRGB(100, 100, 100));
+  EXPECT_FALSE(theme_service->UsingAutogeneratedTheme());
+  theme_service->BuildAutogeneratedThemeFromColor(SkColorSetRGB(100, 100, 100));
   EXPECT_FALSE(theme_service->UsingDefaultTheme());
-  EXPECT_TRUE(theme_service->UsingAutogenerated());
+  EXPECT_TRUE(theme_service->UsingAutogeneratedTheme());
 
   // Set theme from data pack and then override it with theme from color.
   base::ScopedTempDir temp_dir1;
@@ -492,14 +492,14 @@
       LoadUnpackedMinimalThemeAt(temp_dir1.GetPath());
   EXPECT_EQ(extension1_id, theme_service->GetThemeID());
   EXPECT_FALSE(theme_service->UsingDefaultTheme());
-  EXPECT_FALSE(theme_service->UsingAutogenerated());
+  EXPECT_FALSE(theme_service->UsingAutogeneratedTheme());
   base::FilePath path =
       profile_->GetPrefs()->GetFilePath(prefs::kCurrentThemePackFilename);
   EXPECT_FALSE(path.empty());
 
-  theme_service->BuildFromColor(SkColorSetRGB(100, 100, 100));
+  theme_service->BuildAutogeneratedThemeFromColor(SkColorSetRGB(100, 100, 100));
   EXPECT_FALSE(theme_service->UsingDefaultTheme());
-  EXPECT_TRUE(theme_service->UsingAutogenerated());
+  EXPECT_TRUE(theme_service->UsingAutogeneratedTheme());
   EXPECT_EQ(ThemeService::kAutogeneratedThemeID, theme_service->GetThemeID());
   path = profile_->GetPrefs()->GetFilePath(prefs::kCurrentThemePackFilename);
   EXPECT_TRUE(path.empty());
@@ -516,8 +516,8 @@
   EXPECT_TRUE(service_->IsExtensionEnabled(extension1_id));
 
   // Setting autogenerated theme should disable previous theme.
-  theme_service->BuildFromColor(SkColorSetRGB(100, 100, 100));
-  EXPECT_TRUE(theme_service->UsingAutogenerated());
+  theme_service->BuildAutogeneratedThemeFromColor(SkColorSetRGB(100, 100, 100));
+  EXPECT_TRUE(theme_service->UsingAutogeneratedTheme());
   EXPECT_FALSE(service_->IsExtensionEnabled(extension1_id));
 }
 
diff --git a/chrome/browser/themes/theme_syncable_service.cc b/chrome/browser/themes/theme_syncable_service.cc
index 44f8a8f..b6bc5c36 100644
--- a/chrome/browser/themes/theme_syncable_service.cc
+++ b/chrome/browser/themes/theme_syncable_service.cc
@@ -257,7 +257,7 @@
     }
   } else if (theme_specifics.has_autogenerated_theme()) {
     DVLOG(1) << "Applying autogenerated theme";
-    theme_service_->BuildFromColor(
+    theme_service_->BuildAutogeneratedThemeFromColor(
         theme_specifics.autogenerated_theme().color());
   } else if (theme_specifics.use_system_theme_by_default()) {
     DVLOG(1) << "Switch to use system theme";
@@ -296,11 +296,11 @@
         extensions::ManifestURL::GetUpdateURL(current_extension).spec());
   }
 
-  if (theme_service_->UsingAutogenerated()) {
+  if (theme_service_->UsingAutogeneratedTheme()) {
     // Using custom theme and it's autogenerated from color.
     theme_specifics->set_use_custom_theme(false);
     theme_specifics->mutable_autogenerated_theme()->set_color(
-        theme_service_->GetThemeColor());
+        theme_service_->GetAutogeneratedThemeColor());
   }
 
   if (theme_service_->IsSystemThemeDistinctFromDefaultTheme()) {
diff --git a/chrome/browser/themes/theme_syncable_service_unittest.cc b/chrome/browser/themes/theme_syncable_service_unittest.cc
index 51b576b76..f8d40aa 100644
--- a/chrome/browser/themes/theme_syncable_service_unittest.cc
+++ b/chrome/browser/themes/theme_syncable_service_unittest.cc
@@ -72,7 +72,7 @@
     color_ = 0;
   }
 
-  void BuildFromColor(SkColor color) override {
+  void BuildAutogeneratedThemeFromColor(SkColor color) override {
     is_dirty_ = true;
     color_ = color;
     theme_extension_.reset();
@@ -108,18 +108,15 @@
 
   bool UsingSystemTheme() const override { return using_system_theme_; }
 
-  bool UsingAutogenerated() const override { return color_ != 0; }
-
   bool UsingExtensionTheme() const override { return !!theme_extension_; }
 
+  bool UsingAutogeneratedTheme() const override { return color_ != 0; }
+
   string GetThemeID() const override {
-    if (theme_extension_.get())
-      return theme_extension_->id();
-    else
-      return std::string();
+    return UsingExtensionTheme() ? theme_extension_->id() : std::string();
   }
 
-  SkColor GetThemeColor() const override { return color_; }
+  SkColor GetAutogeneratedThemeColor() const override { return color_; }
 
   const extensions::Extension* theme_extension() const {
     return theme_extension_.get();
@@ -424,7 +421,8 @@
                   new syncer::SyncErrorFactoryMock()))
           .error();
   EXPECT_FALSE(error.IsSet()) << error.message();
-  EXPECT_EQ(fake_theme_service_->GetThemeColor(), SkColorSetRGB(0, 0, 100));
+  EXPECT_EQ(fake_theme_service_->GetAutogeneratedThemeColor(),
+            SkColorSetRGB(0, 0, 100));
 }
 
 TEST_F(ThemeSyncableServiceTest, DontResetThemeWhenSpecificsAreEqual) {
@@ -479,7 +477,8 @@
 TEST_F(ThemeSyncableServiceTest,
        UpdateThemeSpecifics_CurrentTheme_Autogenerated) {
   // Set up theme service to use autogenerated theme.
-  fake_theme_service_->BuildFromColor(SkColorSetRGB(0, 0, 100));
+  fake_theme_service_->BuildAutogeneratedThemeFromColor(
+      SkColorSetRGB(0, 0, 100));
 
   syncer::SyncError error =
       theme_sync_service_
@@ -501,7 +500,7 @@
   const sync_pb::ThemeSpecifics& theme_specifics =
       changes[0].sync_data().GetSpecifics().theme();
   EXPECT_FALSE(theme_specifics.use_custom_theme());
-  EXPECT_EQ(fake_theme_service_->GetThemeColor(),
+  EXPECT_EQ(fake_theme_service_->GetAutogeneratedThemeColor(),
             theme_specifics.autogenerated_theme().color());
 }
 
@@ -525,7 +524,8 @@
 
 TEST_F(ThemeSyncableServiceTest, GetAllSyncData_Autogenerated) {
   // Set up theme service to use autogenerated theme.
-  fake_theme_service_->BuildFromColor(SkColorSetRGB(0, 0, 100));
+  fake_theme_service_->BuildAutogeneratedThemeFromColor(
+      SkColorSetRGB(0, 0, 100));
 
   syncer::SyncDataList data_list =
       theme_sync_service_->GetAllSyncData(syncer::THEMES);
@@ -534,7 +534,7 @@
   const sync_pb::ThemeSpecifics& theme_specifics =
       data_list[0].GetSpecifics().theme();
   EXPECT_FALSE(theme_specifics.use_custom_theme());
-  EXPECT_EQ(fake_theme_service_->GetThemeColor(),
+  EXPECT_EQ(fake_theme_service_->GetAutogeneratedThemeColor(),
             theme_specifics.autogenerated_theme().color());
 }
 
@@ -611,7 +611,8 @@
       syncer::SyncData::CreateRemoteData(1, entity_specifics)));
   error = theme_sync_service_->ProcessSyncChanges(FROM_HERE, change_list);
   EXPECT_FALSE(error.IsSet()) << error.message();
-  EXPECT_EQ(fake_theme_service_->GetThemeColor(), SkColorSetRGB(0, 0, 100));
+  EXPECT_EQ(fake_theme_service_->GetAutogeneratedThemeColor(),
+            SkColorSetRGB(0, 0, 100));
 }
 
 TEST_F(ThemeSyncableServiceTest, OnThemeChangeByUser_Extension) {
@@ -667,13 +668,15 @@
   EXPECT_EQ(0u, changes.size());
 
   // Change current theme to custom theme and notify theme_sync_service_.
-  fake_theme_service_->BuildFromColor(SkColorSetRGB(0, 0, 100));
+  fake_theme_service_->BuildAutogeneratedThemeFromColor(
+      SkColorSetRGB(0, 0, 100));
   theme_sync_service_->OnThemeChange();
   EXPECT_EQ(1u, changes.size());
   const sync_pb::ThemeSpecifics& change_specifics =
       changes[0].sync_data().GetSpecifics().theme();
   EXPECT_FALSE(change_specifics.use_custom_theme());
-  EXPECT_EQ(fake_theme_service_->GetThemeColor(), SkColorSetRGB(0, 0, 100));
+  EXPECT_EQ(fake_theme_service_->GetAutogeneratedThemeColor(),
+            SkColorSetRGB(0, 0, 100));
 }
 
 TEST_F(ThemeSyncableServiceTest, StopSync) {
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 5137a3d..6272da6 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1536,12 +1536,10 @@
       "ash/launcher/extension_app_window_launcher_controller.h",
       "ash/launcher/extension_app_window_launcher_item_controller.cc",
       "ash/launcher/extension_app_window_launcher_item_controller.h",
-      "ash/launcher/extension_launcher_context_menu.cc",
-      "ash/launcher/extension_launcher_context_menu.h",
+      "ash/launcher/extension_shelf_context_menu.cc",
+      "ash/launcher/extension_shelf_context_menu.h",
       "ash/launcher/launcher_app_updater.cc",
       "ash/launcher/launcher_app_updater.h",
-      "ash/launcher/launcher_context_menu.cc",
-      "ash/launcher/launcher_context_menu.h",
       "ash/launcher/launcher_controller_helper.cc",
       "ash/launcher/launcher_controller_helper.h",
       "ash/launcher/launcher_extension_app_updater.cc",
@@ -1552,6 +1550,8 @@
       "ash/launcher/multi_profile_browser_status_monitor.h",
       "ash/launcher/settings_window_observer.cc",
       "ash/launcher/settings_window_observer.h",
+      "ash/launcher/shelf_context_menu.cc",
+      "ash/launcher/shelf_context_menu.h",
       "ash/login_screen_client.cc",
       "ash/login_screen_client.h",
       "ash/media_client_impl.cc",
@@ -3738,8 +3738,8 @@
       "ash/launcher/arc_app_window_launcher_controller.h",
       "ash/launcher/arc_app_window_launcher_item_controller.cc",
       "ash/launcher/arc_app_window_launcher_item_controller.h",
-      "ash/launcher/arc_launcher_context_menu.cc",
-      "ash/launcher/arc_launcher_context_menu.h",
+      "ash/launcher/arc_shelf_context_menu.cc",
+      "ash/launcher/arc_shelf_context_menu.h",
       "ash/launcher/arc_shelf_spinner_item_controller.cc",
       "ash/launcher/arc_shelf_spinner_item_controller.h",
       "ash/launcher/crostini_app_display.cc",
diff --git a/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc b/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc
index 2a6df5a..e19b2dc 100644
--- a/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc
+++ b/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc
@@ -17,8 +17,8 @@
 #include "chrome/browser/ui/ash/launcher/arc_playstore_shortcut_launcher_item_controller.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_util.h"
-#include "chrome/browser/ui/ash/launcher/launcher_context_menu.h"
 #include "chrome/browser/ui/ash/launcher/launcher_controller_helper.h"
+#include "chrome/browser/ui/ash/launcher/shelf_context_menu.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager_helper.h"
 #include "chrome/browser/ui/browser.h"
@@ -210,7 +210,7 @@
     GetContextMenuCallback callback) {
   ChromeLauncherController* controller = ChromeLauncherController::instance();
   const ash::ShelfItem* item = controller->GetItem(shelf_id());
-  context_menu_ = LauncherContextMenu::Create(controller, item, display_id);
+  context_menu_ = ShelfContextMenu::Create(controller, item, display_id);
   context_menu_->GetMenuModel(std::move(callback));
 }
 
diff --git a/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.h b/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.h
index 1ebe06b4..aad943c 100644
--- a/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.h
+++ b/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.h
@@ -18,7 +18,7 @@
 class WebContents;
 }
 
-class LauncherContextMenu;
+class ShelfContextMenu;
 
 // Item controller for an app shortcut.
 // If the associated app is a platform or ARC app, launching the app replaces
@@ -91,7 +91,7 @@
   // The cached list of open app web contents shown in an application menu.
   std::vector<content::WebContents*> app_menu_items_;
 
-  std::unique_ptr<LauncherContextMenu> context_menu_;
+  std::unique_ptr<ShelfContextMenu> context_menu_;
 
   DISALLOW_COPY_AND_ASSIGN(AppShortcutLauncherItemController);
 };
diff --git a/chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.cc b/chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.cc
index 6ba6fc2..5988888 100644
--- a/chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.cc
+++ b/chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.cc
@@ -10,8 +10,8 @@
 #include "ash/public/cpp/shelf_types.h"
 #include "chrome/browser/ui/ash/ash_util.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
-#include "chrome/browser/ui/ash/launcher/launcher_context_menu.h"
 #include "chrome/browser/ui/ash/launcher/launcher_controller_helper.h"
+#include "chrome/browser/ui/ash/launcher/shelf_context_menu.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/base/base_window.h"
 #include "ui/wm/core/window_util.h"
@@ -120,7 +120,7 @@
     GetContextMenuCallback callback) {
   ChromeLauncherController* controller = ChromeLauncherController::instance();
   const ash::ShelfItem* item = controller->GetItem(shelf_id());
-  context_menu_ = LauncherContextMenu::Create(controller, item, display_id);
+  context_menu_ = ShelfContextMenu::Create(controller, item, display_id);
   context_menu_->GetMenuModel(std::move(callback));
 }
 
diff --git a/chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.h b/chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.h
index f7fd962..7ade2b1 100644
--- a/chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.h
+++ b/chrome/browser/ui/ash/launcher/app_window_launcher_item_controller.h
@@ -19,7 +19,7 @@
 class BaseWindow;
 }
 
-class LauncherContextMenu;
+class ShelfContextMenu;
 
 // This is a ShelfItemDelegate for abstract app windows (extension or ARC).
 // There is one instance per app, per launcher id. For apps with multiple
@@ -104,7 +104,7 @@
   // Scoped list of observed windows (for removal on destruction)
   ScopedObserver<aura::Window, aura::WindowObserver> observed_windows_{this};
 
-  std::unique_ptr<LauncherContextMenu> context_menu_;
+  std::unique_ptr<ShelfContextMenu> context_menu_;
 
   DISALLOW_COPY_AND_ASSIGN(AppWindowLauncherItemController);
 };
diff --git a/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h b/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h
deleted file mode 100644
index 3e2510a1..0000000
--- a/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 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 CHROME_BROWSER_UI_ASH_LAUNCHER_ARC_LAUNCHER_CONTEXT_MENU_H_
-#define CHROME_BROWSER_UI_ASH_LAUNCHER_ARC_LAUNCHER_CONTEXT_MENU_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "chrome/browser/ui/ash/launcher/launcher_context_menu.h"
-
-namespace arc {
-class ArcAppShortcutsMenuBuilder;
-}  // namespace arc
-
-// Class for context menu which is shown for ARC app in the shelf.
-class ArcLauncherContextMenu : public LauncherContextMenu {
- public:
-  ArcLauncherContextMenu(ChromeLauncherController* controller,
-                         const ash::ShelfItem* item,
-                         int64_t display_id);
-  ~ArcLauncherContextMenu() override;
-
-  // LauncherContextMenu:
-  void GetMenuModel(GetMenuModelCallback callback) override;
-  bool IsCommandIdEnabled(int command_id) const override;
-  void ExecuteCommand(int command_id, int event_flags) override;
-
- private:
-  // Launches App Info UI for ARC apps.
-  void ShowPackageInfo();
-
-  std::unique_ptr<arc::ArcAppShortcutsMenuBuilder> app_shortcuts_menu_builder_;
-
-  DISALLOW_COPY_AND_ASSIGN(ArcLauncherContextMenu);
-};
-
-#endif  // CHROME_BROWSER_UI_ASH_LAUNCHER_ARC_LAUNCHER_CONTEXT_MENU_H_
diff --git a/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.cc b/chrome/browser/ui/ash/launcher/arc_shelf_context_menu.cc
similarity index 83%
rename from chrome/browser/ui/ash/launcher/arc_launcher_context_menu.cc
rename to chrome/browser/ui/ash/launcher/arc_shelf_context_menu.cc
index 1b80a6d..38e05f8 100644
--- a/chrome/browser/ui/ash/launcher/arc_launcher_context_menu.cc
+++ b/chrome/browser/ui/ash/launcher/arc_shelf_context_menu.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h"
+#include "chrome/browser/ui/ash/launcher/arc_shelf_context_menu.h"
 
 #include <memory>
 #include <utility>
@@ -25,15 +25,14 @@
 #include "chrome/common/chrome_features.h"
 #include "chrome/grit/generated_resources.h"
 
-ArcLauncherContextMenu::ArcLauncherContextMenu(
-    ChromeLauncherController* controller,
-    const ash::ShelfItem* item,
-    int64_t display_id)
-    : LauncherContextMenu(controller, item, display_id) {}
+ArcShelfContextMenu::ArcShelfContextMenu(ChromeLauncherController* controller,
+                                         const ash::ShelfItem* item,
+                                         int64_t display_id)
+    : ShelfContextMenu(controller, item, display_id) {}
 
-ArcLauncherContextMenu::~ArcLauncherContextMenu() = default;
+ArcShelfContextMenu::~ArcShelfContextMenu() = default;
 
-void ArcLauncherContextMenu::GetMenuModel(GetMenuModelCallback callback) {
+void ArcShelfContextMenu::GetMenuModel(GetMenuModelCallback callback) {
   auto menu_model = std::make_unique<ui::SimpleMenuModel>(this);
   const ArcAppListPrefs* arc_list_prefs =
       ArcAppListPrefs::Get(controller()->profile());
@@ -69,7 +68,7 @@
 
   if (app_is_open) {
     AddContextMenuOption(menu_model.get(), ash::MENU_CLOSE,
-                         IDS_LAUNCHER_CONTEXT_MENU_CLOSE);
+                         IDS_SHELF_CONTEXT_MENU_CLOSE);
   }
 
   DCHECK(!app_shortcuts_menu_builder_);
@@ -81,7 +80,7 @@
       app_info->package_name, std::move(menu_model), std::move(callback));
 }
 
-bool ArcLauncherContextMenu::IsCommandIdEnabled(int command_id) const {
+bool ArcShelfContextMenu::IsCommandIdEnabled(int command_id) const {
   const ArcAppListPrefs* arc_prefs =
       ArcAppListPrefs::Get(controller()->profile());
 
@@ -95,13 +94,13 @@
     case ash::SHOW_APP_INFO:
       return app_info && app_info->ready;
     default:
-      return LauncherContextMenu::IsCommandIdEnabled(command_id);
+      return ShelfContextMenu::IsCommandIdEnabled(command_id);
   }
   NOTREACHED();
   return false;
 }
 
-void ArcLauncherContextMenu::ExecuteCommand(int command_id, int event_flags) {
+void ArcShelfContextMenu::ExecuteCommand(int command_id, int event_flags) {
   if (command_id >= ash::LAUNCH_APP_SHORTCUT_FIRST &&
       command_id <= ash::LAUNCH_APP_SHORTCUT_LAST) {
     DCHECK(app_shortcuts_menu_builder_);
@@ -120,10 +119,10 @@
     return;
   }
 
-  LauncherContextMenu::ExecuteCommand(command_id, event_flags);
+  ShelfContextMenu::ExecuteCommand(command_id, event_flags);
 }
 
-void ArcLauncherContextMenu::ShowPackageInfo() {
+void ArcShelfContextMenu::ShowPackageInfo() {
   const ArcAppListPrefs* arc_prefs =
       ArcAppListPrefs::Get(controller()->profile());
   DCHECK(arc_prefs);
@@ -138,7 +137,7 @@
     chrome::ShowAppManagementPage(controller()->profile(), item().id.app_id);
     base::UmaHistogramEnumeration(
         kAppManagementEntryPointsHistogramName,
-        AppManagementEntryPoint::kLauncherContextMenuAppInfoArc);
+        AppManagementEntryPoint::kShelfContextMenuAppInfoArc);
     return;
   }
   arc::ShowPackageInfo(app_info->package_name,
diff --git a/chrome/browser/ui/ash/launcher/arc_shelf_context_menu.h b/chrome/browser/ui/ash/launcher/arc_shelf_context_menu.h
new file mode 100644
index 0000000..027e6961
--- /dev/null
+++ b/chrome/browser/ui/ash/launcher/arc_shelf_context_menu.h
@@ -0,0 +1,39 @@
+// Copyright 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 CHROME_BROWSER_UI_ASH_LAUNCHER_ARC_SHELF_CONTEXT_MENU_H_
+#define CHROME_BROWSER_UI_ASH_LAUNCHER_ARC_SHELF_CONTEXT_MENU_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "chrome/browser/ui/ash/launcher/shelf_context_menu.h"
+
+namespace arc {
+class ArcAppShortcutsMenuBuilder;
+}  // namespace arc
+
+// Class for context menu which is shown for ARC app in the shelf.
+class ArcShelfContextMenu : public ShelfContextMenu {
+ public:
+  ArcShelfContextMenu(ChromeLauncherController* controller,
+                      const ash::ShelfItem* item,
+                      int64_t display_id);
+  ~ArcShelfContextMenu() override;
+
+  // ShelfContextMenu:
+  void GetMenuModel(GetMenuModelCallback callback) override;
+  bool IsCommandIdEnabled(int command_id) const override;
+  void ExecuteCommand(int command_id, int event_flags) override;
+
+ private:
+  // Launches App Info UI for ARC apps.
+  void ShowPackageInfo();
+
+  std::unique_ptr<arc::ArcAppShortcutsMenuBuilder> app_shortcuts_menu_builder_;
+
+  DISALLOW_COPY_AND_ASSIGN(ArcShelfContextMenu);
+};
+
+#endif  // CHROME_BROWSER_UI_ASH_LAUNCHER_ARC_SHELF_CONTEXT_MENU_H_
diff --git a/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc b/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc
index c782f56..236412b 100644
--- a/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc
+++ b/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc
@@ -16,7 +16,7 @@
 #include "chrome/browser/ui/ash/ash_util.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_util.h"
-#include "chrome/browser/ui/ash/launcher/launcher_context_menu.h"
+#include "chrome/browser/ui/ash/launcher/shelf_context_menu.h"
 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
@@ -281,7 +281,7 @@
     GetContextMenuCallback callback) {
   ChromeLauncherController* controller = ChromeLauncherController::instance();
   const ash::ShelfItem* item = controller->GetItem(shelf_id());
-  context_menu_ = LauncherContextMenu::Create(controller, item, display_id);
+  context_menu_ = ShelfContextMenu::Create(controller, item, display_id);
   context_menu_->GetMenuModel(std::move(callback));
 }
 
diff --git a/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.h b/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.h
index ca8ee68..38fb9bfb 100644
--- a/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.h
+++ b/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.h
@@ -19,7 +19,7 @@
 class WebContents;
 }
 
-class LauncherContextMenu;
+class ShelfContextMenu;
 
 // Shelf item delegate for a browser shortcut; only one such item should exist.
 // This item shows an application menu that lists open browser windows or tabs.
@@ -69,7 +69,7 @@
   // The cached browser windows and tab indices shown in an application menu.
   std::vector<std::pair<Browser*, size_t>> app_menu_items_;
 
-  std::unique_ptr<LauncherContextMenu> context_menu_;
+  std::unique_ptr<ShelfContextMenu> context_menu_;
 
   DISALLOW_COPY_AND_ASSIGN(BrowserShortcutLauncherItemController);
 };
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
index bf48c4e..3e3306e4 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
@@ -875,11 +875,11 @@
     if (extension->is_hosted_app() && extension->from_bookmark()) {
       base::UmaHistogramEnumeration(
           kAppManagementEntryPointsHistogramName,
-          AppManagementEntryPoint::kLauncherContextMenuAppInfoWebApp);
+          AppManagementEntryPoint::kShelfContextMenuAppInfoWebApp);
     } else {
       base::UmaHistogramEnumeration(
           kAppManagementEntryPointsHistogramName,
-          AppManagementEntryPoint::kLauncherContextMenuAppInfoChromeApp);
+          AppManagementEntryPoint::kShelfContextMenuAppInfoChromeApp);
     }
     return;
   }
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc
index 2f56f02..e9005e5 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc
@@ -53,7 +53,7 @@
 #include "chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_test_util.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_util.h"
-#include "chrome/browser/ui/ash/launcher/launcher_context_menu.h"
+#include "chrome/browser/ui/ash/launcher/shelf_context_menu.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/browser_dialogs.h"
@@ -134,7 +134,7 @@
 
 // Close browsers from context menu
 void CloseBrowserWindow(Browser* browser,
-                        LauncherContextMenu* menu,
+                        ShelfContextMenu* menu,
                         int close_command) {
   // Note that event_flag is never used inside function ExecuteCommand.
   menu->ExecuteCommand(close_command, ui::EventFlags::EF_NONE);
@@ -276,19 +276,19 @@
   }
 
   // Creates a context menu for the existing browser shortcut item.
-  std::unique_ptr<LauncherContextMenu> CreateBrowserItemContextMenu() {
+  std::unique_ptr<ShelfContextMenu> CreateBrowserItemContextMenu() {
     int index = shelf_model()->GetItemIndexForType(ash::TYPE_BROWSER_SHORTCUT);
     DCHECK_GE(index, 0);
     ash::ShelfItem item = shelf_model()->items()[index];
     int64_t display_id = display::Screen::GetScreen()->GetPrimaryDisplay().id();
-    return LauncherContextMenu::Create(controller_, &item, display_id);
+    return ShelfContextMenu::Create(controller_, &item, display_id);
   }
 
-  bool IsItemPresentInMenu(LauncherContextMenu* launcher_context_menu,
+  bool IsItemPresentInMenu(ShelfContextMenu* shelf_context_menu,
                            int command_id) {
     base::RunLoop run_loop;
     std::unique_ptr<ui::SimpleMenuModel> menu;
-    launcher_context_menu->GetMenuModel(base::BindLambdaForTesting(
+    shelf_context_menu->GetMenuModel(base::BindLambdaForTesting(
         [&](std::unique_ptr<ui::SimpleMenuModel> created_menu) {
           menu = std::move(created_menu);
           run_loop.Quit();
@@ -2169,9 +2169,9 @@
 // Test that "Close" is shown in the context menu when there are opened browsers
 // windows.
 IN_PROC_BROWSER_TEST_F(ShelfAppBrowserTest,
-                       LauncherContextMenuVerifyCloseItemAppearance) {
+                       ShelfContextMenuVerifyCloseItemAppearance) {
   // Open a context menu for the existing browser window.
-  std::unique_ptr<LauncherContextMenu> menu1 = CreateBrowserItemContextMenu();
+  std::unique_ptr<ShelfContextMenu> menu1 = CreateBrowserItemContextMenu();
   // Check if "Close" is added to in the context menu.
   ASSERT_TRUE(IsItemPresentInMenu(menu1.get(), ash::MENU_CLOSE));
 
@@ -2180,7 +2180,7 @@
   EXPECT_EQ(0u, BrowserList::GetInstance()->size());
 
   // Check if "Close" is removed from the context menu.
-  std::unique_ptr<LauncherContextMenu> menu2 = CreateBrowserItemContextMenu();
+  std::unique_ptr<ShelfContextMenu> menu2 = CreateBrowserItemContextMenu();
   ASSERT_FALSE(IsItemPresentInMenu(menu2.get(), ash::MENU_CLOSE));
 }
 
diff --git a/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.cc b/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.cc
index 0e8703ff..bb31dc1d 100644
--- a/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.cc
+++ b/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.cc
@@ -48,7 +48,7 @@
     ChromeLauncherController* controller,
     const ash::ShelfItem* item,
     int64_t display_id)
-    : LauncherContextMenu(controller, item, display_id) {}
+    : ShelfContextMenu(controller, item, display_id) {}
 
 CrostiniShelfContextMenu::~CrostiniShelfContextMenu() = default;
 
@@ -82,7 +82,7 @@
 
   if (controller()->IsOpen(item().id)) {
     AddContextMenuOption(menu_model.get(), ash::MENU_CLOSE,
-                         IDS_LAUNCHER_CONTEXT_MENU_CLOSE);
+                         IDS_SHELF_CONTEXT_MENU_CLOSE);
   } else {
     AddContextMenuOption(menu_model.get(), ash::MENU_OPEN_NEW,
                          IDS_APP_CONTEXT_MENU_ACTIVATE_ARC);
@@ -111,7 +111,7 @@
       item().id.app_id == crostini::kCrostiniTerminalId) {
     return crostini::IsCrostiniRunning(controller()->profile());
   }
-  return LauncherContextMenu::IsCommandIdEnabled(command_id);
+  return ShelfContextMenu::IsCommandIdEnabled(command_id);
 }
 
 void CrostiniShelfContextMenu::ExecuteCommand(int command_id, int event_flags) {
diff --git a/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.h b/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.h
index 0b9e1b8..48728a1e 100644
--- a/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.h
+++ b/chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.h
@@ -6,17 +6,17 @@
 #define CHROME_BROWSER_UI_ASH_LAUNCHER_CROSTINI_SHELF_CONTEXT_MENU_H_
 
 #include "base/macros.h"
-#include "chrome/browser/ui/ash/launcher/launcher_context_menu.h"
+#include "chrome/browser/ui/ash/launcher/shelf_context_menu.h"
 
 // Class for context menu which is shown for Crostini app in the shelf.
-class CrostiniShelfContextMenu : public LauncherContextMenu {
+class CrostiniShelfContextMenu : public ShelfContextMenu {
  public:
   CrostiniShelfContextMenu(ChromeLauncherController* controller,
                            const ash::ShelfItem* item,
                            int64_t display_id);
   ~CrostiniShelfContextMenu() override;
 
-  // LauncherContextMenu:
+  // ShelfContextMenu:
   void GetMenuModel(GetMenuModelCallback callback) override;
   bool IsCommandIdEnabled(int command_id) const override;
   void ExecuteCommand(int command_id, int event_flags) override;
diff --git a/chrome/browser/ui/ash/launcher/extension_launcher_context_menu.cc b/chrome/browser/ui/ash/launcher/extension_shelf_context_menu.cc
similarity index 88%
rename from chrome/browser/ui/ash/launcher/extension_launcher_context_menu.cc
rename to chrome/browser/ui/ash/launcher/extension_shelf_context_menu.cc
index 5350f2e..b9b508b 100644
--- a/chrome/browser/ui/ash/launcher/extension_launcher_context_menu.cc
+++ b/chrome/browser/ui/ash/launcher/extension_shelf_context_menu.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/ash/launcher/extension_launcher_context_menu.h"
+#include "chrome/browser/ui/ash/launcher/extension_shelf_context_menu.h"
 
 #include <utility>
 
@@ -58,15 +58,15 @@
 
 }  // namespace
 
-ExtensionLauncherContextMenu::ExtensionLauncherContextMenu(
+ExtensionShelfContextMenu::ExtensionShelfContextMenu(
     ChromeLauncherController* controller,
     const ash::ShelfItem* item,
     int64_t display_id)
-    : LauncherContextMenu(controller, item, display_id) {}
+    : ShelfContextMenu(controller, item, display_id) {}
 
-ExtensionLauncherContextMenu::~ExtensionLauncherContextMenu() = default;
+ExtensionShelfContextMenu::~ExtensionShelfContextMenu() = default;
 
-void ExtensionLauncherContextMenu::GetMenuModel(GetMenuModelCallback callback) {
+void ExtensionShelfContextMenu::GetMenuModel(GetMenuModelCallback callback) {
   auto menu_model = std::make_unique<ui::SimpleMenuModel>(this);
   Profile* profile = controller()->profile();
   const std::string app_id = item().id.app_id;
@@ -88,7 +88,7 @@
 
     if (controller()->IsOpen(item().id)) {
       AddContextMenuOption(menu_model.get(), ash::MENU_CLOSE,
-                           IDS_LAUNCHER_CONTEXT_MENU_CLOSE);
+                           IDS_SHELF_CONTEXT_MENU_CLOSE);
     }
   } else if (item().type == ash::TYPE_BROWSER_SHORTCUT) {
     AddContextMenuOption(menu_model.get(), ash::MENU_NEW_WINDOW,
@@ -100,7 +100,7 @@
     if (!BrowserShortcutLauncherItemController::IsListOfActiveBrowserEmpty() ||
         item().type == ash::TYPE_DIALOG || controller()->IsOpen(item().id)) {
       AddContextMenuOption(menu_model.get(), ash::MENU_CLOSE,
-                           IDS_LAUNCHER_CONTEXT_MENU_CLOSE);
+                           IDS_SHELF_CONTEXT_MENU_CLOSE);
     }
   }
   if (app_id != extension_misc::kChromeAppId) {
@@ -128,7 +128,7 @@
   std::move(callback).Run(std::move(menu_model));
 }
 
-bool ExtensionLauncherContextMenu::IsCommandIdChecked(int command_id) const {
+bool ExtensionShelfContextMenu::IsCommandIdChecked(int command_id) const {
   switch (command_id) {
     case ash::LAUNCH_TYPE_PINNED_TAB:
       return GetLaunchType() == extensions::LAUNCH_TYPE_PINNED;
@@ -140,13 +140,13 @@
       return GetLaunchType() == extensions::LAUNCH_TYPE_FULLSCREEN;
     default:
       if (command_id < ash::COMMAND_ID_COUNT)
-        return LauncherContextMenu::IsCommandIdChecked(command_id);
+        return ShelfContextMenu::IsCommandIdChecked(command_id);
       return (extension_items_ &&
               extension_items_->IsCommandIdChecked(command_id));
   }
 }
 
-bool ExtensionLauncherContextMenu::IsCommandIdEnabled(int command_id) const {
+bool ExtensionShelfContextMenu::IsCommandIdEnabled(int command_id) const {
   switch (command_id) {
     case ash::UNINSTALL:
       return controller()->UninstallAllowed(item().id.app_id);
@@ -162,14 +162,14 @@
              IncognitoModePrefs::DISABLED;
     default:
       if (command_id < ash::COMMAND_ID_COUNT)
-        return LauncherContextMenu::IsCommandIdEnabled(command_id);
+        return ShelfContextMenu::IsCommandIdEnabled(command_id);
       return (extension_items_ &&
               extension_items_->IsCommandIdEnabled(command_id));
   }
 }
 
-void ExtensionLauncherContextMenu::ExecuteCommand(int command_id,
-                                                  int event_flags) {
+void ExtensionShelfContextMenu::ExecuteCommand(int command_id,
+                                               int event_flags) {
   if (ExecuteCommonCommand(command_id, event_flags))
     return;
 
@@ -213,7 +213,7 @@
   }
 }
 
-void ExtensionLauncherContextMenu::CreateOpenNewSubmenu(
+void ExtensionShelfContextMenu::CreateOpenNewSubmenu(
     ui::SimpleMenuModel* menu_model) {
   // Touchable extension context menus use an actionable submenu for
   // MENU_OPEN_NEW.
@@ -230,7 +230,7 @@
       GetCommandIdVectorIcon(ash::MENU_OPEN_NEW, GetLaunchTypeStringId()));
 }
 
-extensions::LaunchType ExtensionLauncherContextMenu::GetLaunchType() const {
+extensions::LaunchType ExtensionShelfContextMenu::GetLaunchType() const {
   const extensions::Extension* extension =
       GetExtensionForAppID(item().id.app_id, controller()->profile());
 
@@ -242,11 +242,11 @@
       extensions::ExtensionPrefs::Get(controller()->profile()), extension);
 }
 
-void ExtensionLauncherContextMenu::SetLaunchType(extensions::LaunchType type) {
+void ExtensionShelfContextMenu::SetLaunchType(extensions::LaunchType type) {
   extensions::SetLaunchType(controller()->profile(), item().id.app_id, type);
 }
 
-int ExtensionLauncherContextMenu::GetLaunchTypeStringId() const {
+int ExtensionShelfContextMenu::GetLaunchTypeStringId() const {
   return (GetLaunchType() == extensions::LAUNCH_TYPE_PINNED ||
           GetLaunchType() == extensions::LAUNCH_TYPE_REGULAR)
              ? IDS_APP_LIST_CONTEXT_MENU_NEW_TAB
diff --git a/chrome/browser/ui/ash/launcher/extension_launcher_context_menu.h b/chrome/browser/ui/ash/launcher/extension_shelf_context_menu.h
similarity index 66%
rename from chrome/browser/ui/ash/launcher/extension_launcher_context_menu.h
rename to chrome/browser/ui/ash/launcher/extension_shelf_context_menu.h
index 8c29bd3..399ea0f 100644
--- a/chrome/browser/ui/ash/launcher/extension_launcher_context_menu.h
+++ b/chrome/browser/ui/ash/launcher/extension_shelf_context_menu.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_ASH_LAUNCHER_EXTENSION_LAUNCHER_CONTEXT_MENU_H_
-#define CHROME_BROWSER_UI_ASH_LAUNCHER_EXTENSION_LAUNCHER_CONTEXT_MENU_H_
+#ifndef CHROME_BROWSER_UI_ASH_LAUNCHER_EXTENSION_SHELF_CONTEXT_MENU_H_
+#define CHROME_BROWSER_UI_ASH_LAUNCHER_EXTENSION_SHELF_CONTEXT_MENU_H_
 
 #include <memory>
 
 #include "base/macros.h"
-#include "chrome/browser/ui/ash/launcher/launcher_context_menu.h"
+#include "chrome/browser/ui/ash/launcher/shelf_context_menu.h"
 #include "extensions/common/constants.h"
 
 namespace extensions {
@@ -16,14 +16,14 @@
 }
 
 // Context menu shown for an extension item in the shelf.
-class ExtensionLauncherContextMenu : public LauncherContextMenu {
+class ExtensionShelfContextMenu : public ShelfContextMenu {
  public:
-  ExtensionLauncherContextMenu(ChromeLauncherController* controller,
-                               const ash::ShelfItem* item,
-                               int64_t display_id);
-  ~ExtensionLauncherContextMenu() override;
+  ExtensionShelfContextMenu(ChromeLauncherController* controller,
+                            const ash::ShelfItem* item,
+                            int64_t display_id);
+  ~ExtensionShelfContextMenu() override;
 
-  // LauncherContextMenu overrides:
+  // ShelfContextMenu overrides:
   void GetMenuModel(GetMenuModelCallback callback) override;
 
   // ui::SimpleMenuModel::Delegate overrides:
@@ -35,7 +35,6 @@
   // Creates the actionable submenu for MENU_OPEN_NEW.
   void CreateOpenNewSubmenu(ui::SimpleMenuModel* menu_model);
 
-
   // Helpers to get and set the launch type for the extension item.
   extensions::LaunchType GetLaunchType() const;
   void SetLaunchType(extensions::LaunchType launch_type);
@@ -49,7 +48,7 @@
 
   std::unique_ptr<extensions::ContextMenuMatcher> extension_items_;
 
-  DISALLOW_COPY_AND_ASSIGN(ExtensionLauncherContextMenu);
+  DISALLOW_COPY_AND_ASSIGN(ExtensionShelfContextMenu);
 };
 
-#endif  // CHROME_BROWSER_UI_ASH_LAUNCHER_EXTENSION_LAUNCHER_CONTEXT_MENU_H_
+#endif  // CHROME_BROWSER_UI_ASH_LAUNCHER_EXTENSION_SHELF_CONTEXT_MENU_H_
diff --git a/chrome/browser/ui/ash/launcher/internal_app_shelf_context_menu.cc b/chrome/browser/ui/ash/launcher/internal_app_shelf_context_menu.cc
index 40235bc..c9cc5c8 100644
--- a/chrome/browser/ui/ash/launcher/internal_app_shelf_context_menu.cc
+++ b/chrome/browser/ui/ash/launcher/internal_app_shelf_context_menu.cc
@@ -20,7 +20,7 @@
     ChromeLauncherController* controller,
     const ash::ShelfItem* item,
     int64_t display_id)
-    : LauncherContextMenu(controller, item, display_id) {}
+    : ShelfContextMenu(controller, item, display_id) {}
 
 void InternalAppShelfContextMenu::GetMenuModel(GetMenuModelCallback callback) {
   auto menu_model = std::make_unique<ui::SimpleMenuModel>(this);
@@ -37,7 +37,7 @@
 
   if (app_is_open) {
     AddContextMenuOption(menu_model.get(), ash::MENU_CLOSE,
-                         IDS_LAUNCHER_CONTEXT_MENU_CLOSE);
+                         IDS_SHELF_CONTEXT_MENU_CLOSE);
 
     if (internal_app->internal_app_name == apps::BuiltInAppName::kPluginVm &&
         plugin_vm::IsPluginVmRunning(controller()->profile())) {
diff --git a/chrome/browser/ui/ash/launcher/internal_app_shelf_context_menu.h b/chrome/browser/ui/ash/launcher/internal_app_shelf_context_menu.h
index 099bcca..2de832a 100644
--- a/chrome/browser/ui/ash/launcher/internal_app_shelf_context_menu.h
+++ b/chrome/browser/ui/ash/launcher/internal_app_shelf_context_menu.h
@@ -6,17 +6,17 @@
 #define CHROME_BROWSER_UI_ASH_LAUNCHER_INTERNAL_APP_SHELF_CONTEXT_MENU_H_
 
 #include "base/macros.h"
-#include "chrome/browser/ui/ash/launcher/launcher_context_menu.h"
+#include "chrome/browser/ui/ash/launcher/shelf_context_menu.h"
 
 // Class for context menu which is shown for internal app in the shelf.
-class InternalAppShelfContextMenu : public LauncherContextMenu {
+class InternalAppShelfContextMenu : public ShelfContextMenu {
  public:
   InternalAppShelfContextMenu(ChromeLauncherController* controller,
                               const ash::ShelfItem* item,
                               int64_t display_id);
   ~InternalAppShelfContextMenu() override = default;
 
-  // LauncherContextMenu:
+  // ShelfContextMenu:
   void GetMenuModel(GetMenuModelCallback callback) override;
   void ExecuteCommand(int command_id, int event_flags) override;
 
diff --git a/chrome/browser/ui/ash/launcher/launcher_context_menu.cc b/chrome/browser/ui/ash/launcher/shelf_context_menu.cc
similarity index 80%
rename from chrome/browser/ui/ash/launcher/launcher_context_menu.cc
rename to chrome/browser/ui/ash/launcher/shelf_context_menu.cc
index 93c99ea..d2a602e 100644
--- a/chrome/browser/ui/ash/launcher/launcher_context_menu.cc
+++ b/chrome/browser/ui/ash/launcher/shelf_context_menu.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/ash/launcher/launcher_context_menu.h"
+#include "chrome/browser/ui/ash/launcher/shelf_context_menu.h"
 
 #include <memory>
 #include <string>
@@ -18,11 +18,11 @@
 #include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
 #include "chrome/browser/ui/app_list/extension_uninstaller.h"
 #include "chrome/browser/ui/app_list/internal_app/internal_app_metadata.h"
-#include "chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h"
+#include "chrome/browser/ui/ash/launcher/arc_shelf_context_menu.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller_util.h"
 #include "chrome/browser/ui/ash/launcher/crostini_shelf_context_menu.h"
-#include "chrome/browser/ui/ash/launcher/extension_launcher_context_menu.h"
+#include "chrome/browser/ui/ash/launcher/extension_shelf_context_menu.h"
 #include "chrome/browser/ui/ash/launcher/internal_app_shelf_context_menu.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/grit/generated_resources.h"
@@ -43,17 +43,16 @@
 }  // namespace
 
 // static
-std::unique_ptr<LauncherContextMenu> LauncherContextMenu::Create(
+std::unique_ptr<ShelfContextMenu> ShelfContextMenu::Create(
     ChromeLauncherController* controller,
     const ash::ShelfItem* item,
     int64_t display_id) {
   DCHECK(controller);
   DCHECK(item);
   DCHECK(!item->id.IsNull());
-  // Create an ArcLauncherContextMenu if the item is an ARC app.
+  // Create an ArcShelfContextMenu if the item is an ARC app.
   if (arc::IsArcItem(controller->profile(), item->id.app_id)) {
-    return std::make_unique<ArcLauncherContextMenu>(controller, item,
-                                                    display_id);
+    return std::make_unique<ArcShelfContextMenu>(controller, item, display_id);
   }
 
   // Create an CrostiniShelfContextMenu if the item is Crostini app.
@@ -71,28 +70,28 @@
                                                          display_id);
   }
 
-  // Create an ExtensionLauncherContextMenu for other items.
-  return std::make_unique<ExtensionLauncherContextMenu>(controller, item,
-                                                        display_id);
+  // Create an ExtensionShelfContextMenu for other items.
+  return std::make_unique<ExtensionShelfContextMenu>(controller, item,
+                                                     display_id);
 }
 
-LauncherContextMenu::LauncherContextMenu(ChromeLauncherController* controller,
-                                         const ash::ShelfItem* item,
-                                         int64_t display_id)
+ShelfContextMenu::ShelfContextMenu(ChromeLauncherController* controller,
+                                   const ash::ShelfItem* item,
+                                   int64_t display_id)
     : controller_(controller),
       item_(item ? *item : ash::ShelfItem()),
       display_id_(display_id) {
   DCHECK_NE(display_id, display::kInvalidDisplayId);
 }
 
-LauncherContextMenu::~LauncherContextMenu() = default;
+ShelfContextMenu::~ShelfContextMenu() = default;
 
-bool LauncherContextMenu::IsCommandIdChecked(int command_id) const {
+bool ShelfContextMenu::IsCommandIdChecked(int command_id) const {
   DCHECK(command_id < ash::COMMAND_ID_COUNT);
   return false;
 }
 
-bool LauncherContextMenu::IsCommandIdEnabled(int command_id) const {
+bool ShelfContextMenu::IsCommandIdEnabled(int command_id) const {
   if (command_id == ash::MENU_PIN) {
     // Users cannot modify the pinned state of apps pinned by policy.
     return !item_.pinned_by_policy &&
@@ -103,7 +102,7 @@
   return true;
 }
 
-void LauncherContextMenu::ExecuteCommand(int command_id, int event_flags) {
+void ShelfContextMenu::ExecuteCommand(int command_id, int event_flags) {
   ash::ShelfModel::ScopedUserTriggeredMutation user_triggered(
       controller_->shelf_model());
   switch (static_cast<ash::CommandId>(command_id)) {
@@ -143,18 +142,18 @@
   }
 }
 
-void LauncherContextMenu::AddPinMenu(ui::SimpleMenuModel* menu_model) {
+void ShelfContextMenu::AddPinMenu(ui::SimpleMenuModel* menu_model) {
   // Expect a valid ShelfID to add pin/unpin menu item.
   DCHECK(!item_.id.IsNull());
   int menu_pin_string_id;
   switch (GetPinnableForAppID(item_.id.app_id, controller_->profile())) {
     case AppListControllerDelegate::PIN_EDITABLE:
       menu_pin_string_id = controller_->IsPinned(item_.id)
-                               ? IDS_LAUNCHER_CONTEXT_MENU_UNPIN
-                               : IDS_LAUNCHER_CONTEXT_MENU_PIN;
+                               ? IDS_SHELF_CONTEXT_MENU_UNPIN
+                               : IDS_SHELF_CONTEXT_MENU_PIN;
       break;
     case AppListControllerDelegate::PIN_FIXED:
-      menu_pin_string_id = IDS_LAUNCHER_CONTEXT_MENU_PIN_ENFORCED_BY_POLICY;
+      menu_pin_string_id = IDS_SHELF_CONTEXT_MENU_PIN_ENFORCED_BY_POLICY;
       break;
     case AppListControllerDelegate::NO_PIN:
       return;
@@ -165,23 +164,22 @@
   AddContextMenuOption(menu_model, ash::MENU_PIN, menu_pin_string_id);
 }
 
-bool LauncherContextMenu::ExecuteCommonCommand(int command_id,
-                                               int event_flags) {
+bool ShelfContextMenu::ExecuteCommonCommand(int command_id, int event_flags) {
   switch (command_id) {
     case ash::MENU_OPEN_NEW:
     case ash::MENU_CLOSE:
     case ash::MENU_PIN:
     case ash::UNINSTALL:
-      LauncherContextMenu::ExecuteCommand(command_id, event_flags);
+      ShelfContextMenu::ExecuteCommand(command_id, event_flags);
       return true;
     default:
       return false;
   }
 }
 
-void LauncherContextMenu::AddContextMenuOption(ui::SimpleMenuModel* menu_model,
-                                               ash::CommandId type,
-                                               int string_id) {
+void ShelfContextMenu::AddContextMenuOption(ui::SimpleMenuModel* menu_model,
+                                            ash::CommandId type,
+                                            int string_id) {
   // Do not include disabled items.
   if (!IsCommandIdEnabled(type))
     return;
@@ -207,7 +205,7 @@
   menu_model->AddItemWithStringId(type, string_id);
 }
 
-const gfx::VectorIcon& LauncherContextMenu::GetCommandIdVectorIcon(
+const gfx::VectorIcon& ShelfContextMenu::GetCommandIdVectorIcon(
     ash::CommandId type,
     int string_id) const {
   switch (type) {
diff --git a/chrome/browser/ui/ash/launcher/launcher_context_menu.h b/chrome/browser/ui/ash/launcher/shelf_context_menu.h
similarity index 79%
rename from chrome/browser/ui/ash/launcher/launcher_context_menu.h
rename to chrome/browser/ui/ash/launcher/shelf_context_menu.h
index 7ea1f57..f069df5e 100644
--- a/chrome/browser/ui/ash/launcher/launcher_context_menu.h
+++ b/chrome/browser/ui/ash/launcher/shelf_context_menu.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_ASH_LAUNCHER_LAUNCHER_CONTEXT_MENU_H_
-#define CHROME_BROWSER_UI_ASH_LAUNCHER_LAUNCHER_CONTEXT_MENU_H_
+#ifndef CHROME_BROWSER_UI_ASH_LAUNCHER_SHELF_CONTEXT_MENU_H_
+#define CHROME_BROWSER_UI_ASH_LAUNCHER_SHELF_CONTEXT_MENU_H_
 
 #include "ash/public/cpp/app_menu_constants.h"
 #include "ash/public/cpp/shelf_item.h"
@@ -15,12 +15,12 @@
 class ChromeLauncherController;
 
 // A base class for browser, extension, and ARC shelf item context menus.
-class LauncherContextMenu : public ui::SimpleMenuModel::Delegate {
+class ShelfContextMenu : public ui::SimpleMenuModel::Delegate {
  public:
-  ~LauncherContextMenu() override;
+  ~ShelfContextMenu() override;
 
   // Static function to create a context menu instance.
-  static std::unique_ptr<LauncherContextMenu> Create(
+  static std::unique_ptr<ShelfContextMenu> Create(
       ChromeLauncherController* controller,
       const ash::ShelfItem* item,
       int64_t display_id);
@@ -35,9 +35,9 @@
   void ExecuteCommand(int command_id, int event_flags) override;
 
  protected:
-  LauncherContextMenu(ChromeLauncherController* controller,
-                      const ash::ShelfItem* item,
-                      int64_t display_id);
+  ShelfContextMenu(ChromeLauncherController* controller,
+                   const ash::ShelfItem* item,
+                   int64_t display_id);
 
   ChromeLauncherController* controller() const { return controller_; }
   const ash::ShelfItem& item() const { return item_; }
@@ -67,7 +67,7 @@
 
   const int64_t display_id_;
 
-  DISALLOW_COPY_AND_ASSIGN(LauncherContextMenu);
+  DISALLOW_COPY_AND_ASSIGN(ShelfContextMenu);
 };
 
-#endif  // CHROME_BROWSER_UI_ASH_LAUNCHER_LAUNCHER_CONTEXT_MENU_H_
+#endif  // CHROME_BROWSER_UI_ASH_LAUNCHER_SHELF_CONTEXT_MENU_H_
diff --git a/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc b/chrome/browser/ui/ash/launcher/shelf_context_menu_unittest.cc
similarity index 89%
rename from chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
rename to chrome/browser/ui/ash/launcher/shelf_context_menu_unittest.cc
index b67af3d..a478bbf 100644
--- a/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/shelf_context_menu_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/ash/launcher/launcher_context_menu.h"
+#include "chrome/browser/ui/ash/launcher/shelf_context_menu.h"
 
 #include <memory>
 #include <utility>
@@ -30,10 +30,10 @@
 #include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
 #include "chrome/browser/ui/app_list/internal_app/internal_app_metadata.h"
 #include "chrome/browser/ui/ash/launcher/arc_app_shelf_id.h"
-#include "chrome/browser/ui/ash/launcher/arc_launcher_context_menu.h"
+#include "chrome/browser/ui/ash/launcher/arc_shelf_context_menu.h"
 #include "chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.h"
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
-#include "chrome/browser/ui/ash/launcher/extension_launcher_context_menu.h"
+#include "chrome/browser/ui/ash/launcher/extension_shelf_context_menu.h"
 #include "chrome/browser/ui/ash/launcher/internal_app_shelf_context_menu.h"
 #include "chrome/test/base/chrome_ash_test_base.h"
 #include "chrome/test/base/testing_profile.h"
@@ -68,10 +68,10 @@
   return base::StringPrintf("AppInShelfGroup%d", task_id);
 }
 
-class LauncherContextMenuTest : public ChromeAshTestBase {
+class ShelfContextMenuTest : public ChromeAshTestBase {
  protected:
-  LauncherContextMenuTest() = default;
-  ~LauncherContextMenuTest() override = default;
+  ShelfContextMenuTest() = default;
+  ~ShelfContextMenuTest() override = default;
 
   void SetUp() override {
     arc_test_.SetUp(&profile_);
@@ -88,13 +88,13 @@
     arc::IconDecodeRequest::DisableSafeDecodingForTesting();
   }
 
-  std::unique_ptr<LauncherContextMenu> CreateLauncherContextMenu(
+  std::unique_ptr<ShelfContextMenu> CreateShelfContextMenu(
       ash::ShelfItemType shelf_item_type,
       int64_t display_id) {
     ash::ShelfItem item;
     item.id = ash::ShelfID("idmockidmockidmockidmockidmockid");
     item.type = shelf_item_type;
-    return LauncherContextMenu::Create(controller(), &item, display_id);
+    return ShelfContextMenu::Create(controller(), &item, display_id);
   }
 
   // Creates app window and set optional ARC application id.
@@ -110,10 +110,10 @@
   }
 
   std::unique_ptr<ui::MenuModel> GetMenuModel(
-      LauncherContextMenu* launcher_context_menu) {
+      ShelfContextMenu* shelf_context_menu) {
     base::RunLoop run_loop;
     std::unique_ptr<ui::MenuModel> menu;
-    launcher_context_menu->GetMenuModel(base::BindLambdaForTesting(
+    shelf_context_menu->GetMenuModel(base::BindLambdaForTesting(
         [&](std::unique_ptr<ui::SimpleMenuModel> created_menu) {
           menu = std::move(created_menu);
           run_loop.Quit();
@@ -160,73 +160,68 @@
   std::unique_ptr<ash::ShelfModel> model_;
   std::unique_ptr<ChromeLauncherController> launcher_controller_;
 
-  DISALLOW_COPY_AND_ASSIGN(LauncherContextMenuTest);
+  DISALLOW_COPY_AND_ASSIGN(ShelfContextMenuTest);
 };
 
 // Verifies that "New Incognito window" menu item in the launcher context
 // menu is disabled when Incognito mode is switched off (by a policy).
-TEST_F(LauncherContextMenuTest,
+TEST_F(ShelfContextMenuTest,
        NewIncognitoWindowMenuIsDisabledWhenIncognitoModeOff) {
   const int64_t display_id = GetPrimaryDisplay().id();
   // Initially, "New Incognito window" should be enabled.
-  std::unique_ptr<LauncherContextMenu> launcher_context_menu =
-      CreateLauncherContextMenu(ash::TYPE_BROWSER_SHORTCUT, display_id);
-  std::unique_ptr<ui::MenuModel> menu =
-      GetMenuModel(launcher_context_menu.get());
+  std::unique_ptr<ShelfContextMenu> shelf_context_menu =
+      CreateShelfContextMenu(ash::TYPE_BROWSER_SHORTCUT, display_id);
+  std::unique_ptr<ui::MenuModel> menu = GetMenuModel(shelf_context_menu.get());
   ASSERT_TRUE(IsItemPresentInMenu(menu.get(), ash::MENU_NEW_INCOGNITO_WINDOW));
-  EXPECT_TRUE(launcher_context_menu->IsCommandIdEnabled(
-      ash::MENU_NEW_INCOGNITO_WINDOW));
+  EXPECT_TRUE(
+      shelf_context_menu->IsCommandIdEnabled(ash::MENU_NEW_INCOGNITO_WINDOW));
 
   // Disable Incognito mode.
   IncognitoModePrefs::SetAvailability(profile()->GetPrefs(),
                                       IncognitoModePrefs::DISABLED);
-  launcher_context_menu =
-      CreateLauncherContextMenu(ash::TYPE_BROWSER_SHORTCUT, display_id);
-  menu = GetMenuModel(launcher_context_menu.get());
+  shelf_context_menu =
+      CreateShelfContextMenu(ash::TYPE_BROWSER_SHORTCUT, display_id);
+  menu = GetMenuModel(shelf_context_menu.get());
   // The item should be disabled, and therefore not added to the menu.
   EXPECT_FALSE(IsItemPresentInMenu(menu.get(), ash::MENU_NEW_INCOGNITO_WINDOW));
-  EXPECT_FALSE(launcher_context_menu->IsCommandIdEnabled(
-      ash::MENU_NEW_INCOGNITO_WINDOW));
+  EXPECT_FALSE(
+      shelf_context_menu->IsCommandIdEnabled(ash::MENU_NEW_INCOGNITO_WINDOW));
 }
 
 // Verifies that "New window" menu item in the launcher context
 // menu is disabled when Incognito mode is forced (by a policy).
-TEST_F(LauncherContextMenuTest,
-       NewWindowMenuIsDisabledWhenIncognitoModeForced) {
+TEST_F(ShelfContextMenuTest, NewWindowMenuIsDisabledWhenIncognitoModeForced) {
   const int64_t display_id = GetPrimaryDisplay().id();
   // Initially, "New window" should be enabled.
-  std::unique_ptr<LauncherContextMenu> launcher_context_menu =
-      CreateLauncherContextMenu(ash::TYPE_BROWSER_SHORTCUT, display_id);
-  std::unique_ptr<ui::MenuModel> menu =
-      GetMenuModel(launcher_context_menu.get());
+  std::unique_ptr<ShelfContextMenu> shelf_context_menu =
+      CreateShelfContextMenu(ash::TYPE_BROWSER_SHORTCUT, display_id);
+  std::unique_ptr<ui::MenuModel> menu = GetMenuModel(shelf_context_menu.get());
   ASSERT_TRUE(IsItemPresentInMenu(menu.get(), ash::MENU_NEW_WINDOW));
-  EXPECT_TRUE(launcher_context_menu->IsCommandIdEnabled(ash::MENU_NEW_WINDOW));
+  EXPECT_TRUE(shelf_context_menu->IsCommandIdEnabled(ash::MENU_NEW_WINDOW));
 
   // Disable Incognito mode.
   IncognitoModePrefs::SetAvailability(profile()->GetPrefs(),
                                       IncognitoModePrefs::FORCED);
-  launcher_context_menu =
-      CreateLauncherContextMenu(ash::TYPE_BROWSER_SHORTCUT, display_id);
-  menu = GetMenuModel(launcher_context_menu.get());
+  shelf_context_menu =
+      CreateShelfContextMenu(ash::TYPE_BROWSER_SHORTCUT, display_id);
+  menu = GetMenuModel(shelf_context_menu.get());
   ASSERT_FALSE(IsItemPresentInMenu(menu.get(), ash::MENU_NEW_WINDOW));
-  EXPECT_FALSE(launcher_context_menu->IsCommandIdEnabled(ash::MENU_NEW_WINDOW));
+  EXPECT_FALSE(shelf_context_menu->IsCommandIdEnabled(ash::MENU_NEW_WINDOW));
 }
 
 // Verifies that "Close" is not shown in context menu if no browser window is
 // opened.
-TEST_F(LauncherContextMenuTest,
-       DesktopShellLauncherContextMenuVerifyCloseItem) {
+TEST_F(ShelfContextMenuTest, DesktopShellShelfContextMenuVerifyCloseItem) {
   const int64_t display_id = GetPrimaryDisplay().id();
-  std::unique_ptr<LauncherContextMenu> launcher_context_menu =
-      CreateLauncherContextMenu(ash::TYPE_BROWSER_SHORTCUT, display_id);
-  std::unique_ptr<ui::MenuModel> menu =
-      GetMenuModel(launcher_context_menu.get());
+  std::unique_ptr<ShelfContextMenu> shelf_context_menu =
+      CreateShelfContextMenu(ash::TYPE_BROWSER_SHORTCUT, display_id);
+  std::unique_ptr<ui::MenuModel> menu = GetMenuModel(shelf_context_menu.get());
   ASSERT_FALSE(IsItemPresentInMenu(menu.get(), ash::MENU_CLOSE));
 }
 
 // Verifies context menu and app menu items for ARC app.
 // The 0th item is sticky but not the following.
-TEST_F(LauncherContextMenuTest, ArcLauncherMenusCheck) {
+TEST_F(ShelfContextMenuTest, ArcLauncherMenusCheck) {
   arc_test().app_instance()->SendRefreshAppList(
       std::vector<arc::mojom::AppInfo>(arc_test().fake_apps().begin(),
                                        arc_test().fake_apps().begin() + 1));
@@ -365,7 +360,7 @@
   }
 }
 
-TEST_F(LauncherContextMenuTest, ArcLauncherSuspendAppMenu) {
+TEST_F(ShelfContextMenuTest, ArcLauncherSuspendAppMenu) {
   arc::mojom::AppInfo app = arc_test().fake_apps()[0];
   app.suspended = true;
   arc_test().app_instance()->SendRefreshAppList({app});
@@ -393,7 +388,7 @@
   EXPECT_FALSE(IsItemEnabledInMenu(menu.get(), ash::UNINSTALL));
 }
 
-TEST_F(LauncherContextMenuTest, ArcDeferredLauncherContextMenuItemCheck) {
+TEST_F(ShelfContextMenuTest, ArcDeferredShelfContextMenuItemCheck) {
   arc_test().app_instance()->SendRefreshAppList(
       std::vector<arc::mojom::AppInfo>(arc_test().fake_apps().begin(),
                                        arc_test().fake_apps().begin() + 2));
@@ -443,7 +438,7 @@
   EXPECT_FALSE(IsItemEnabledInMenu(menu.get(), ash::UNINSTALL));
 }
 
-TEST_F(LauncherContextMenuTest, CommandIdsMatchEnumsForHistograms) {
+TEST_F(ShelfContextMenuTest, CommandIdsMatchEnumsForHistograms) {
   // Tests that CommandId enums are not changed as the values are used in
   // histograms.
   EXPECT_EQ(0, ash::MENU_OPEN_NEW);
@@ -458,7 +453,7 @@
   EXPECT_EQ(9, ash::NOTIFICATION_CONTAINER);
 }
 
-TEST_F(LauncherContextMenuTest, ArcContextMenuOptions) {
+TEST_F(ShelfContextMenuTest, ArcContextMenuOptions) {
   // Tests that there are the right number of ARC app context menu options. If
   // you're adding a context menu option ensure that you have added the enum to
   // tools/metrics/histograms/enums.xml and that you haven't modified the order
@@ -484,7 +479,7 @@
 }
 
 // Tests that the context menu of internal app  is correct.
-TEST_F(LauncherContextMenuTest, InternalAppShelfContextMenu) {
+TEST_F(ShelfContextMenuTest, InternalAppShelfContextMenu) {
   for (const auto& internal_app : app_list::GetInternalAppList(profile())) {
     if (!internal_app.show_in_launcher)
       continue;
@@ -514,7 +509,7 @@
 }
 
 // Tests that the number of context menu options of internal app is correct.
-TEST_F(LauncherContextMenuTest, InternalAppShelfContextMenuOptionsNumber) {
+TEST_F(ShelfContextMenuTest, InternalAppShelfContextMenuOptionsNumber) {
   for (const auto& internal_app : app_list::GetInternalAppList(profile())) {
     const std::string app_id = internal_app.app_id;
     const ash::ShelfID shelf_id(app_id);
@@ -537,7 +532,7 @@
 
 // Checks some properties for crostini's terminal app's context menu,
 // specifically that every menu item has an icon.
-TEST_F(LauncherContextMenuTest, CrostiniTerminalApp) {
+TEST_F(ShelfContextMenuTest, CrostiniTerminalApp) {
   crostini::CrostiniTestHelper crostini_helper(profile());
   const std::string app_id = crostini::kCrostiniTerminalId;
   crostini::CrostiniManager::GetForProfile(profile())->AddRunningVmForTesting(
@@ -568,7 +563,7 @@
 
 // Checks the context menu for a "normal" crostini app (i.e. a registered one).
 // Particularly, we ensure that the density changing option exists.
-TEST_F(LauncherContextMenuTest, CrostiniNormalApp) {
+TEST_F(ShelfContextMenuTest, CrostiniNormalApp) {
   crostini::CrostiniTestHelper crostini_helper(profile());
 
   const std::string app_name = "foo";
@@ -612,7 +607,7 @@
 
 // Confirms the menu items for unregistered crostini apps (i.e. apps that do not
 // have an associated .desktop file, and therefore can only be closed).
-TEST_F(LauncherContextMenuTest, CrostiniUnregisteredApps) {
+TEST_F(ShelfContextMenuTest, CrostiniUnregisteredApps) {
   crostini::CrostiniTestHelper crostini_helper(profile());
 
   const std::string fake_window_app_id = "foo";
diff --git a/chrome/browser/ui/ash/launcher/shelf_spinner_item_controller.cc b/chrome/browser/ui/ash/launcher/shelf_spinner_item_controller.cc
index 3c9e8cbb..dc097d2 100644
--- a/chrome/browser/ui/ash/launcher/shelf_spinner_item_controller.cc
+++ b/chrome/browser/ui/ash/launcher/shelf_spinner_item_controller.cc
@@ -7,7 +7,7 @@
 #include <utility>
 
 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
-#include "chrome/browser/ui/ash/launcher/launcher_context_menu.h"
+#include "chrome/browser/ui/ash/launcher/shelf_context_menu.h"
 #include "chrome/browser/ui/ash/launcher/shelf_spinner_controller.h"
 
 ShelfSpinnerItemController::ShelfSpinnerItemController(
@@ -40,7 +40,7 @@
     GetContextMenuCallback callback) {
   ChromeLauncherController* controller = ChromeLauncherController::instance();
   const ash::ShelfItem* item = controller->GetItem(shelf_id());
-  context_menu_ = LauncherContextMenu::Create(controller, item, display_id);
+  context_menu_ = ShelfContextMenu::Create(controller, item, display_id);
   context_menu_->GetMenuModel(std::move(callback));
 }
 
diff --git a/chrome/browser/ui/ash/launcher/shelf_spinner_item_controller.h b/chrome/browser/ui/ash/launcher/shelf_spinner_item_controller.h
index 7c799e1..905f08a 100644
--- a/chrome/browser/ui/ash/launcher/shelf_spinner_item_controller.h
+++ b/chrome/browser/ui/ash/launcher/shelf_spinner_item_controller.h
@@ -16,7 +16,7 @@
 #include "base/time/time.h"
 
 class ShelfSpinnerController;
-class LauncherContextMenu;
+class ShelfContextMenu;
 
 // ShelfSpinnerItemController displays the icon of an app that cannot be
 // launched immediately (due to ARC or Crostini not being ready) on Chrome OS'
@@ -44,7 +44,7 @@
   base::WeakPtr<ShelfSpinnerController> host_;
   const base::Time start_time_;
 
-  std::unique_ptr<LauncherContextMenu> context_menu_;
+  std::unique_ptr<ShelfContextMenu> context_menu_;
 
   DISALLOW_COPY_AND_ASSIGN(ShelfSpinnerItemController);
 };
diff --git a/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop.cc b/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop.cc
index 8c409249..5260357 100644
--- a/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop.cc
+++ b/chrome/browser/ui/tab_contents/chrome_web_contents_view_handle_drop.cc
@@ -7,6 +7,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.h"
+#include "chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_utils.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_view_delegate.h"
 #include "content/public/common/drop_data.h"
@@ -65,5 +66,6 @@
 
   safe_browsing::DeepScanningDialogDelegate::ShowForWebContents(
       web_contents, std::move(data),
-      base::BindOnce(&DeepScanCompletionCallback, std::move(callback)));
+      base::BindOnce(&DeepScanCompletionCallback, std::move(callback)),
+      safe_browsing::DeepScanAccessPoint::DRAG_AND_DROP);
 }
diff --git a/chrome/browser/ui/views/extensions/extension_popup.cc b/chrome/browser/ui/views/extensions/extension_popup.cc
index 946d1ec..cdeb2a13 100644
--- a/chrome/browser/ui/views/extensions/extension_popup.cc
+++ b/chrome/browser/ui/views/extensions/extension_popup.cc
@@ -186,7 +186,7 @@
       this, extensions::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE,
       content::Source<content::BrowserContext>(host_->browser_context()));
   content::DevToolsAgentHost::AddObserver(this);
-  GetExtensionView()->GetBrowser()->tab_strip_model()->AddObserver(this);
+  host_->browser()->tab_strip_model()->AddObserver(this);
 
   // If the host had somehow finished loading, then we'd miss the notification
   // and not show.  This seems to happen in single-process mode.
diff --git a/chrome/browser/ui/views/extensions/extension_view_views.cc b/chrome/browser/ui/views/extensions/extension_view_views.cc
index 7d2262f..9f846f78 100644
--- a/chrome/browser/ui/views/extensions/extension_view_views.cc
+++ b/chrome/browser/ui/views/extensions/extension_view_views.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/views/extensions/extension_view_views.h"
 
+#include <memory>
 #include <utility>
 
 #include "build/build_config.h"
@@ -26,11 +27,8 @@
 #endif
 
 ExtensionViewViews::ExtensionViewViews(extensions::ExtensionHost* host,
-                                       Browser* browser)
-    : views::WebView(browser ? browser->profile() : nullptr),
-      host_(host),
-      browser_(browser),
-      container_(nullptr) {
+                                       Profile* profile)
+    : views::WebView(profile), host_(host), container_(nullptr) {
   SetWebContents(host_->web_contents());
   if (host->extension_host_type() == extensions::VIEW_TYPE_EXTENSION_POPUP) {
     EnableSizingFromWebContents(
@@ -44,10 +42,6 @@
     parent()->RemoveChildView(this);
 }
 
-Browser* ExtensionViewViews::GetBrowser() {
-  return browser_;
-}
-
 void ExtensionViewViews::VisibilityChanged(View* starting_from,
                                            bool is_visible) {
   views::WebView::VisibilityChanged(starting_from, is_visible);
@@ -134,9 +128,8 @@
 // static
 std::unique_ptr<ExtensionView> ExtensionViewHost::CreateExtensionView(
     ExtensionViewHost* host,
-    Browser* browser) {
-  std::unique_ptr<ExtensionViewViews> view(
-      new ExtensionViewViews(host, browser));
+    Profile* profile) {
+  auto view = std::make_unique<ExtensionViewViews>(host, profile);
   // We own |view_|, so don't auto delete when it's removed from the view
   // hierarchy.
   view->set_owned_by_client();
diff --git a/chrome/browser/ui/views/extensions/extension_view_views.h b/chrome/browser/ui/views/extensions/extension_view_views.h
index 976bc4b..7accc6e 100644
--- a/chrome/browser/ui/views/extensions/extension_view_views.h
+++ b/chrome/browser/ui/views/extensions/extension_view_views.h
@@ -12,7 +12,7 @@
 #include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
 #include "ui/views/controls/webview/webview.h"
 
-class Browser;
+class Profile;
 
 namespace content {
 class RenderViewHost;
@@ -35,12 +35,9 @@
     virtual void OnExtensionSizeChanged(ExtensionViewViews* view) {}
   };
 
-  ExtensionViewViews(extensions::ExtensionHost* host, Browser* browser);
+  ExtensionViewViews(extensions::ExtensionHost* host, Profile* profile);
   ~ExtensionViewViews() override;
 
-  // extensions::ExtensionView:
-  Browser* GetBrowser() override;
-
   // views::WebView:
   void VisibilityChanged(View* starting_from, bool is_visible) override;
 
@@ -71,9 +68,6 @@
   // Note that host_ owns view
   extensions::ExtensionHost* host_;
 
-  // The browser window that this view is in.
-  Browser* const browser_;
-
   // What we should set the preferred width to once the ExtensionViewViews has
   // loaded.
   gfx::Size pending_preferred_size_;
diff --git a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc b/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
index ce5ff20a..caafe22 100644
--- a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
+++ b/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
@@ -338,7 +338,7 @@
   // parts which depend on the NavigationEntry are not hit.
   return safe_browsing::SafeBrowsingBlockingPage::CreateBlockingPage(
       g_browser_process->safe_browsing_service()->ui_manager().get(),
-      web_contents, main_frame_url, resource);
+      web_contents, main_frame_url, resource, true);
 }
 
 TestSafeBrowsingBlockingPageQuiet* CreateSafeBrowsingQuietBlockingPage(
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
index 6da70685..fa158a2 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -681,8 +681,6 @@
   if (!initial_preview_start_time_.is_null()) {
     UMA_HISTOGRAM_TIMES("PrintPreview.InitialDisplayTime",
                         base::TimeTicks::Now() - initial_preview_start_time_);
-    UMA_HISTOGRAM_COUNTS_1M("PrintPreview.PageCount.Initial",
-                            expected_pages_count);
     UMA_HISTOGRAM_COUNTS_1M(
         "PrintPreview.RegeneratePreviewRequest.BeforeFirstData",
         handler_->regenerate_preview_request_count());
diff --git a/chrome/browser/ui/webui/settings/chromeos/app_management/app_management_uma.h b/chrome/browser/ui/webui/settings/chromeos/app_management/app_management_uma.h
index 31d7515..c2da963 100644
--- a/chrome/browser/ui/webui/settings/chromeos/app_management/app_management_uma.h
+++ b/chrome/browser/ui/webui/settings/chromeos/app_management/app_management_uma.h
@@ -13,9 +13,9 @@
   kAppListContextMenuAppInfoArc = 0,
   kAppListContextMenuAppInfoChromeApp = 1,
   kAppListContextMenuAppInfoWebApp = 2,
-  kLauncherContextMenuAppInfoArc = 3,
-  kLauncherContextMenuAppInfoChromeApp = 4,
-  kLauncherContextMenuAppInfoWebApp = 5,
+  kShelfContextMenuAppInfoArc = 3,
+  kShelfContextMenuAppInfoChromeApp = 4,
+  kShelfContextMenuAppInfoWebApp = 5,
   kAppManagementMainViewArc = 6,
   kAppManagementMainViewChromeApp = 7,
   kAppManagementMainViewWebApp = 8,
diff --git a/chrome/browser/web_applications/components/web_app_shortcut.cc b/chrome/browser/web_applications/components/web_app_shortcut.cc
index efe76de..c0a45c3 100644
--- a/chrome/browser/web_applications/components/web_app_shortcut.cc
+++ b/chrome/browser/web_applications/components/web_app_shortcut.cc
@@ -155,6 +155,13 @@
                                 shortcut_info.extension_id, shortcut_info.url);
 }
 
+#if !defined(OS_MACOSX)
+void DeleteMultiProfileShortcutsForApp(const std::string& app_id) {
+  // Multi-profile shortcuts exist only on macOS.
+  NOTREACHED();
+}
+#endif
+
 }  // namespace internals
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/components/web_app_shortcut.h b/chrome/browser/web_applications/components/web_app_shortcut.h
index 7c3356d..f3f5bff 100644
--- a/chrome/browser/web_applications/components/web_app_shortcut.h
+++ b/chrome/browser/web_applications/components/web_app_shortcut.h
@@ -135,6 +135,10 @@
 void DeletePlatformShortcuts(const base::FilePath& shortcut_data_path,
                              const ShortcutInfo& shortcut_info);
 
+// Delete the multi-profile (non-profile_scoped) shortcuts for the specified
+// app. This is the multi-profile complement of DeletePlatformShortcuts.
+void DeleteMultiProfileShortcutsForApp(const std::string& app_id);
+
 // Updates all the shortcuts we have added for this extension. This is the
 // platform specific implementation of the UpdateAllShortcuts function, and
 // is executed on the FILE thread.
diff --git a/chrome/browser/web_applications/components/web_app_shortcut_mac.h b/chrome/browser/web_applications/components/web_app_shortcut_mac.h
index 3fcee80..68d99a4 100644
--- a/chrome/browser/web_applications/components/web_app_shortcut_mac.h
+++ b/chrome/browser/web_applications/components/web_app_shortcut_mac.h
@@ -96,7 +96,6 @@
 
   bool CreateShortcuts(ShortcutCreationReason creation_reason,
                        ShortcutLocations creation_locations);
-  void DeleteShortcuts();
 
   // Recreate the shortcuts where they are found on disk and in the profile
   // path. If |create_if_needed| is true, then create the shortcuts if no
@@ -122,14 +121,6 @@
   // Return true if the bundle for this app should be profile-agnostic.
   bool IsMultiProfile() const;
 
-  // Returns the bundle identifier to use for this app bundle.
-  std::string GetBundleIdentifier() const;
-
-  // Returns the profile-scoped app bundle identifier. For multi-profile apps,
-  // this will give the bundle identifier for shims that were created before
-  // multi-profile support was added.
-  std::string GetProfileScopedBundleIdentifier() const;
-
   // Copies the app loader template into a temporary directory and fills in all
   // relevant information. This works around a Finder bug where the app's icon
   // doesn't properly update.
diff --git a/chrome/browser/web_applications/components/web_app_shortcut_mac.mm b/chrome/browser/web_applications/components/web_app_shortcut_mac.mm
index e9ef419..ba31222 100644
--- a/chrome/browser/web_applications/components/web_app_shortcut_mac.mm
+++ b/chrome/browser/web_applications/components/web_app_shortcut_mac.mm
@@ -156,6 +156,8 @@
 
 bool g_app_shims_allow_update_and_launch_in_tests = false;
 
+namespace web_app {
+
 namespace {
 
 // The maximum number to append to to an app name before giving up and using the
@@ -267,6 +269,8 @@
     plist_.reset([NSDictionary dictionaryWithContentsOfFile:plist_path],
                  base::scoped_policy::RETAIN);
   }
+  BundleInfoPlist(const BundleInfoPlist& other) = default;
+  BundleInfoPlist& operator=(const BundleInfoPlist& other) = default;
   ~BundleInfoPlist() = default;
 
   const base::FilePath& bundle_path() const { return bundle_path_; }
@@ -343,8 +347,6 @@
 
   // Data read from the Info.plist.
   base::scoped_nsobject<NSDictionary> plist_;
-
-  DISALLOW_COPY_AND_ASSIGN(BundleInfoPlist);
 };
 
 bool HasExistingExtensionShimForDifferentProfile(
@@ -362,32 +364,32 @@
   return false;
 }
 
-void LaunchShimOnFileThread(web_app::LaunchShimUpdateBehavior update_behavior,
-                            web_app::ShimLaunchedCallback launched_callback,
-                            web_app::ShimTerminatedCallback terminated_callback,
-                            const web_app::ShortcutInfo& shortcut_info) {
+void LaunchShimOnFileThread(LaunchShimUpdateBehavior update_behavior,
+                            ShimLaunchedCallback launched_callback,
+                            ShimTerminatedCallback terminated_callback,
+                            const ShortcutInfo& shortcut_info) {
   base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
                                                 base::BlockingType::MAY_BLOCK);
 
-  web_app::WebAppShortcutCreator shortcut_creator(
-      web_app::internals::GetShortcutDataDir(shortcut_info), &shortcut_info);
+  WebAppShortcutCreator shortcut_creator(
+      internals::GetShortcutDataDir(shortcut_info), &shortcut_info);
 
   // Recreate shims if requested, and populate |shim_paths| with the paths to
   // attempt to launch.
   bool launched_after_rebuild = false;
   std::vector<base::FilePath> shim_paths;
   switch (update_behavior) {
-    case web_app::LaunchShimUpdateBehavior::DO_NOT_RECREATE:
+    case LaunchShimUpdateBehavior::DO_NOT_RECREATE:
       // Attempt to locate the shim's path using LaunchServices.
       shim_paths = shortcut_creator.GetAppBundlesById();
       break;
-    case web_app::LaunchShimUpdateBehavior::RECREATE_IF_INSTALLED:
+    case LaunchShimUpdateBehavior::RECREATE_IF_INSTALLED:
       // Only attempt to launch shims that were updated.
       launched_after_rebuild = true;
       shortcut_creator.UpdateShortcuts(false /* create_if_needed */,
                                        &shim_paths);
       break;
-    case web_app::LaunchShimUpdateBehavior::RECREATE_UNCONDITIONALLY:
+    case LaunchShimUpdateBehavior::RECREATE_UNCONDITIONALLY:
       // Likewise, only attempt to launch shims that were updated.
       launched_after_rebuild = true;
       shortcut_creator.UpdateShortcuts(true /* create_if_needed */,
@@ -602,11 +604,10 @@
   return true;
 }
 
-std::unique_ptr<web_app::ShortcutInfo> BuildShortcutInfoFromBundle(
+std::unique_ptr<ShortcutInfo> BuildShortcutInfoFromBundle(
     const base::FilePath& bundle_path) {
   BundleInfoPlist bundle_info(bundle_path);
-  std::unique_ptr<web_app::ShortcutInfo> shortcut_info(
-      new web_app::ShortcutInfo);
+  std::unique_ptr<ShortcutInfo> shortcut_info(new ShortcutInfo);
   shortcut_info->extension_id = bundle_info.GetExtensionId();
   shortcut_info->url = bundle_info.GetURL();
   shortcut_info->title = bundle_info.GetTitle();
@@ -638,9 +639,61 @@
       .Append(app_name_dir);
 }
 
-}  // namespace
+// Returns the bundle identifier for an app. If |profile_path| is unset, then
+// the returned bundle id will be profile-agnostic.
+std::string GetBundleIdentifier(
+    const std::string& app_id,
+    const base::FilePath& profile_path = base::FilePath()) {
+  // Note that this matches APP_MODE_APP_BUNDLE_ID in chrome/chrome.gyp.
+  if (!profile_path.empty()) {
+    // Replace spaces in the profile path with hyphen.
+    std::string normalized_profile_path;
+    base::ReplaceChars(profile_path.BaseName().value(), " ", "-",
+                       &normalized_profile_path);
+    return base::mac::BaseBundleID() + std::string(".app.") +
+           normalized_profile_path + "-" + app_id;
+  }
+  return base::mac::BaseBundleID() + std::string(".app.") + app_id;
+}
 
-namespace web_app {
+// Return all bundles with the specified |bundle_id| which are for the current
+// user data dir.
+std::list<BundleInfoPlist> SearchForBundlesById(const std::string& bundle_id) {
+  std::list<BundleInfoPlist> infos;
+
+  // First search using LaunchServices
+  base::ScopedCFTypeRef<CFStringRef> bundle_id_cf(
+      base::SysUTF8ToCFStringRef(bundle_id));
+  base::scoped_nsobject<NSArray> bundle_urls(base::mac::CFToNSCast(
+      LSCopyApplicationURLsForBundleIdentifier(bundle_id_cf.get(), nullptr)));
+  for (NSURL* url : bundle_urls.get()) {
+    NSString* path_string = [url path];
+    base::FilePath bundle_path([path_string fileSystemRepresentation]);
+    BundleInfoPlist info(bundle_path);
+    if (!info.IsForCurrentUserDataDir())
+      continue;
+    infos.push_back(info);
+  }
+  if (!infos.empty())
+    return infos;
+
+  // LaunchServices can fail to locate a recently-created bundle. Search
+  // for an app in the applications folder to handle this case.
+  // https://crbug.com/937703
+  infos = BundleInfoPlist::GetAllInPath(GetChromeAppsFolder(),
+                                        true /* recursive */);
+  for (auto it = infos.begin(); it != infos.end();) {
+    const BundleInfoPlist& info = *it;
+    if (info.GetBundleId() == bundle_id && info.IsForCurrentUserDataDir()) {
+      ++it;
+    } else {
+      infos.erase(it++);
+    }
+  }
+  return infos;
+}
+
+}  // namespace
 
 std::unique_ptr<ShortcutInfo> RecordAppShimErrorAndBuildShortcutInfo(
     const base::FilePath& bundle_path) {
@@ -873,14 +926,6 @@
   return true;
 }
 
-void WebAppShortcutCreator::DeleteShortcuts() {
-  // Remove all instances found by LaunchServices.
-  std::vector<base::FilePath> bundle_paths = GetAppBundlesById();
-  for (const auto& bundle_path : bundle_paths) {
-    base::DeleteFile(bundle_path, true);
-  }
-}
-
 bool WebAppShortcutCreator::UpdateShortcuts(
     bool create_if_needed,
     std::vector<base::FilePath>* updated_paths) {
@@ -955,13 +1000,17 @@
             forKey:app_mode::kCrBundleVersionKey];
   [plist setObject:base::SysUTF8ToNSString(info_->version_for_display)
             forKey:app_mode::kCFBundleShortVersionStringKey];
-  [plist setObject:base::SysUTF8ToNSString(GetBundleIdentifier())
-            forKey:base::mac::CFToNSCast(kCFBundleIdentifierKey)];
   if (IsMultiProfile()) {
+    [plist setObject:base::SysUTF8ToNSString(
+                         GetBundleIdentifier(info_->extension_id))
+              forKey:base::mac::CFToNSCast(kCFBundleIdentifierKey)];
     base::FilePath data_dir = GetMultiProfileAppDataDir(app_data_dir_);
     [plist setObject:base::mac::FilePathToNSString(data_dir)
               forKey:app_mode::kCrAppModeUserDataDirKey];
   } else {
+    [plist setObject:base::SysUTF8ToNSString(GetBundleIdentifier(
+                         info_->extension_id, info_->profile_path))
+              forKey:base::mac::CFToNSCast(kCFBundleIdentifierKey)];
     [plist setObject:base::mac::FilePathToNSString(app_data_dir_)
               forKey:app_mode::kCrAppModeUserDataDirKey];
     [plist
@@ -1038,48 +1087,24 @@
     const {
   base::scoped_nsobject<NSMutableArray> urls([[NSMutableArray alloc] init]);
 
+  // Search using LaunchServices using the default bundle id.
+  const std::string bundle_id = GetBundleIdentifier(
+      info_->extension_id,
+      IsMultiProfile() ? base::FilePath() : info_->profile_path);
+  auto bundle_infos = SearchForBundlesById(bundle_id);
+
   // If in multi-profile mode, search using the profile-scoped bundle id, in
   // case the user has an old shim hanging around.
-  if (IsMultiProfile()) {
-    base::ScopedCFTypeRef<CFStringRef> bundle_id_cf(
-        base::SysUTF8ToCFStringRef(GetProfileScopedBundleIdentifier()));
-    base::scoped_nsobject<NSArray> bundle_urls(base::mac::CFToNSCast(
-        LSCopyApplicationURLsForBundleIdentifier(bundle_id_cf.get(), nullptr)));
-    [urls addObjectsFromArray:bundle_urls];
+  if (bundle_infos.empty() && IsMultiProfile()) {
+    const std::string profile_scoped_bundle_id =
+        GetBundleIdentifier(info_->extension_id, info_->profile_path);
+    bundle_infos = SearchForBundlesById(profile_scoped_bundle_id);
   }
 
-  // Search using LaunchServices using the default bundle id.
-  const std::string bundle_id = GetBundleIdentifier();
-  {
-    base::ScopedCFTypeRef<CFStringRef> bundle_id_cf(
-        base::SysUTF8ToCFStringRef(bundle_id));
-    base::scoped_nsobject<NSArray> bundle_urls(base::mac::CFToNSCast(
-        LSCopyApplicationURLsForBundleIdentifier(bundle_id_cf.get(), nullptr)));
-    [urls addObjectsFromArray:bundle_urls];
-  }
-
-  // Store only those results corresponding to this user data dir.
-  std::vector<base::FilePath> paths;
-  for (NSURL* url : urls.get()) {
-    NSString* path_string = [url path];
-    base::FilePath path([path_string fileSystemRepresentation]);
-    if (BundleInfoPlist(path).IsForCurrentUserDataDir())
-      paths.push_back(path);
-  }
-
-  // LaunchServices can fail to locate a recently-created bundle. Search
-  // for an app in the applications folder to handle this case.
-  // https://crbug.com/937703
-  if (paths.empty()) {
-    std::list<BundleInfoPlist> bundles_info = BundleInfoPlist::GetAllInPath(
-        GetChromeAppsFolder(), false /* recursive */);
-    for (const auto& info : bundles_info) {
-      if (info.IsForCurrentUserDataDir() && info.GetBundleId() == bundle_id)
-        paths.push_back(info.bundle_path());
-    }
-  }
-
-  return paths;
+  std::vector<base::FilePath> bundle_paths;
+  for (const auto& bundle_info : bundle_infos)
+    bundle_paths.push_back(bundle_info.bundle_path());
+  return bundle_paths;
 }
 
 std::vector<base::FilePath> WebAppShortcutCreator::GetAppBundlesById() const {
@@ -1125,28 +1150,6 @@
   return base::FeatureList::IsEnabled(features::kAppShimMultiProfile);
 }
 
-std::string WebAppShortcutCreator::GetBundleIdentifier() const {
-  if (IsMultiProfile()) {
-    std::string bundle_id =
-        base::mac::BaseBundleID() + std::string(".app.") + info_->extension_id;
-    return bundle_id;
-  }
-  return GetProfileScopedBundleIdentifier();
-}
-
-std::string WebAppShortcutCreator::GetProfileScopedBundleIdentifier() const {
-  // Replace spaces in the profile path with hyphen.
-  std::string normalized_profile_path;
-  base::ReplaceChars(info_->profile_path.BaseName().value(), " ", "-",
-                     &normalized_profile_path);
-
-  // This matches APP_MODE_APP_BUNDLE_ID in chrome/chrome.gyp.
-  std::string bundle_id = base::mac::BaseBundleID() + std::string(".app.") +
-                          normalized_profile_path + "-" + info_->extension_id;
-
-  return bundle_id;
-}
-
 void WebAppShortcutCreator::RevealAppShimInFinder() const {
   // Note that RevealAppShimInFinder is called immediately after requesting to
   // build the app shim. This almost always happens before the app shim has
@@ -1187,7 +1190,7 @@
     return;
   }
 
-  web_app::internals::PostShortcutIOTask(
+  internals::PostShortcutIOTask(
       base::BindOnce(&LaunchShimOnFileThread, update_behavior,
                      std::move(launched_callback),
                      std::move(terminated_callback)),
@@ -1213,8 +1216,21 @@
                              const ShortcutInfo& shortcut_info) {
   base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
                                                 base::BlockingType::MAY_BLOCK);
-  WebAppShortcutCreator shortcut_creator(app_data_path, &shortcut_info);
-  shortcut_creator.DeleteShortcuts();
+  const std::string bundle_id = GetBundleIdentifier(shortcut_info.extension_id,
+                                                    shortcut_info.profile_path);
+  auto bundle_infos = SearchForBundlesById(bundle_id);
+  for (const auto& bundle_info : bundle_infos)
+    base::DeleteFile(bundle_info.bundle_path(), true /* recursive */);
+}
+
+void DeleteMultiProfileShortcutsForApp(const std::string& app_id) {
+  base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
+                                                base::BlockingType::MAY_BLOCK);
+  const std::string bundle_id = GetBundleIdentifier(app_id);
+  auto bundle_infos = SearchForBundlesById(bundle_id);
+  for (const auto& bundle_info : bundle_infos) {
+    base::DeleteFile(bundle_info.bundle_path(), true /* recursive */);
+  }
 }
 
 void UpdatePlatformShortcuts(const base::FilePath& app_data_path,
@@ -1228,7 +1244,7 @@
   WebAppShortcutCreator shortcut_creator(app_data_path, &shortcut_info);
   std::vector<base::FilePath> updated_shim_paths;
   bool create_if_needed = false;
-  // Tests use web_app::UpdateAllShortcuts to force shim creation (rather than
+  // Tests use UpdateAllShortcuts to force shim creation (rather than
   // relying on asynchronous creation at installation.
   if (g_app_shims_allow_update_and_launch_in_tests)
     create_if_needed = true;
@@ -1245,12 +1261,7 @@
       continue;
     if (!info.IsForProfile(profile_path))
       continue;
-
-    std::unique_ptr<ShortcutInfo> shortcut_info =
-        BuildShortcutInfoFromBundle(info.bundle_path());
-    WebAppShortcutCreator shortcut_creator(info.bundle_path().DirName(),
-                                           shortcut_info.get());
-    shortcut_creator.DeleteShortcuts();
+    base::DeleteFile(info.bundle_path(), true /* recursive */);
   }
 }
 
diff --git a/chrome/browser/web_applications/components/web_app_shortcut_mac_unittest.mm b/chrome/browser/web_applications/components/web_app_shortcut_mac_unittest.mm
index 79941fa..07f597f 100644
--- a/chrome/browser/web_applications/components/web_app_shortcut_mac_unittest.mm
+++ b/chrome/browser/web_applications/components/web_app_shortcut_mac_unittest.mm
@@ -320,19 +320,19 @@
   EXPECT_FALSE(base::PathExists(other_shim_path.Append("Contents")));
 }
 
-TEST_F(WebAppShortcutCreatorTest, DeleteShortcuts) {
-  base::ScopedTempDir other_folder_temp_dir;
-  EXPECT_TRUE(other_folder_temp_dir.CreateUniqueTempDir());
-  base::FilePath other_folder = other_folder_temp_dir.GetPath();
-  base::FilePath other_shim_path = other_folder.Append(shim_base_name_);
+TEST_F(WebAppShortcutCreatorTest, DeleteShortcutsSingleProfile) {
+  base::test::ScopedFeatureList scoped_features;
+  scoped_features.InitWithFeatures(
+      /*enabled_features=*/{},
+      /*disabled_features=*/{features::kAppShimMultiProfile});
 
+  base::FilePath other_shim_path =
+      shim_path_.DirName().Append("Copy of Shim.app");
   NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_,
                                                        info_.get());
 
   // Create an extra shim in another folder. It should be deleted since its
   // bundle id matches.
-  std::string expected_bundle_id = kFakeChromeBundleId;
-  expected_bundle_id += ".app.Profile-1-" + info_->extension_id;
   std::vector<base::FilePath> bundle_by_id_paths;
   bundle_by_id_paths.push_back(shim_path_);
   bundle_by_id_paths.push_back(other_shim_path);
@@ -344,7 +344,37 @@
   // Ensure the paths were created, and that they are destroyed.
   EXPECT_TRUE(base::PathExists(shim_path_));
   EXPECT_TRUE(base::PathExists(other_shim_path));
-  shortcut_creator.DeleteShortcuts();
+  internals::DeleteMultiProfileShortcutsForApp(info_->extension_id);
+  EXPECT_TRUE(base::PathExists(shim_path_));
+  EXPECT_TRUE(base::PathExists(other_shim_path));
+  internals::DeletePlatformShortcuts(app_data_dir_, *info_);
+  EXPECT_FALSE(base::PathExists(shim_path_));
+  EXPECT_FALSE(base::PathExists(other_shim_path));
+}
+
+TEST_F(WebAppShortcutCreatorTest, DeleteShortcuts) {
+  base::FilePath other_shim_path =
+      shim_path_.DirName().Append("Copy of Shim.app");
+  NiceMock<WebAppShortcutCreatorMock> shortcut_creator(app_data_dir_,
+                                                       info_.get());
+
+  // Create an extra shim in another folder. It should be deleted since its
+  // bundle id matches.
+  std::vector<base::FilePath> bundle_by_id_paths;
+  bundle_by_id_paths.push_back(shim_path_);
+  bundle_by_id_paths.push_back(other_shim_path);
+  EXPECT_CALL(shortcut_creator, GetAppBundlesByIdUnsorted())
+      .WillRepeatedly(Return(bundle_by_id_paths));
+  EXPECT_TRUE(shortcut_creator.CreateShortcuts(SHORTCUT_CREATION_AUTOMATED,
+                                               ShortcutLocations()));
+
+  // Ensure the paths were created, and that they are destroyed.
+  EXPECT_TRUE(base::PathExists(shim_path_));
+  EXPECT_TRUE(base::PathExists(other_shim_path));
+  internals::DeletePlatformShortcuts(app_data_dir_, *info_);
+  EXPECT_TRUE(base::PathExists(shim_path_));
+  EXPECT_TRUE(base::PathExists(other_shim_path));
+  internals::DeleteMultiProfileShortcutsForApp(info_->extension_id);
   EXPECT_FALSE(base::PathExists(shim_path_));
   EXPECT_FALSE(base::PathExists(other_shim_path));
 }
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index 3d56351..d333ef7 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -166,19 +166,13 @@
     "secure_origin_whitelist.h",
     "ssl_insecure_content.cc",
     "ssl_insecure_content.h",
-    "web_components_prefs.cc",
-    "web_components_prefs.h",
-
-    # TODO(asvitkine): Move the next four entries to chrome/common/profiler/.
-    "stack_sampling_configuration.cc",
-    "stack_sampling_configuration.h",
-    "thread_profiler.cc",
-    "thread_profiler.h",
     "url_constants.cc",
     "url_constants.h",
     "web_application_info.cc",
     "web_application_info.h",
     "web_application_info_provider_param_traits.h",
+    "web_components_prefs.cc",
+    "web_components_prefs.h",
     "webui_url_constants.cc",
     "webui_url_constants.h",
   ]
@@ -205,6 +199,7 @@
     "//chrome/app/theme:theme_resources",
     "//chrome/common:constants",
     "//chrome/common/net",
+    "//chrome/common/profiler",
     "//chrome/installer/util:with_no_strings",
     "//components/cast_certificate",
     "//components/cdm/common",
@@ -219,7 +214,6 @@
     "//components/gcm_driver/common",
     "//components/metrics",
     "//components/metrics:net",
-    "//components/metrics/public/mojom:call_stack_mojo_bindings",
     "//components/nacl/common:buildflags",
     "//components/nacl/common:process_type",
     "//components/nacl/common:switches",
diff --git a/chrome/common/profiler/BUILD.gn b/chrome/common/profiler/BUILD.gn
index 49eb8cf..f86b7ff 100644
--- a/chrome/common/profiler/BUILD.gn
+++ b/chrome/common/profiler/BUILD.gn
@@ -2,16 +2,35 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//extensions/buildflags/buildflags.gni")
+
 source_set("profiler") {
+  public = [
+    "main_thread_stack_sampling_profiler.h",
+    "stack_sampling_configuration.h",
+    "thread_profiler.h",
+  ]
+
   sources = [
     "main_thread_stack_sampling_profiler.cc",
-    "main_thread_stack_sampling_profiler.h",
+    "stack_sampling_configuration.cc",
+    "thread_profiler.cc",
   ]
 
   deps = [
     "//base",
-    "//chrome/common",
+    "//build:branding_buildflags",
+    "//chrome/common:channel_info",
+    "//chrome/common:non_code_constants",
     "//components/metrics",
+    "//components/metrics:call_stack_profile_builder",
+    "//components/metrics/public/mojom:call_stack_mojo_bindings",
+    "//components/version_info:version_info",
     "//content/public/common",
+    "//extensions/buildflags",
   ]
+
+  if (enable_extensions) {
+    deps += [ "//extensions/common:common" ]
+  }
 }
diff --git a/chrome/common/profiler/OWNERS b/chrome/common/profiler/OWNERS
index 3ed2cd88..6008a41e 100644
--- a/chrome/common/profiler/OWNERS
+++ b/chrome/common/profiler/OWNERS
@@ -1,4 +1,4 @@
-# COMPONENT: Internals>Metrics
+# COMPONENT: Internals>Metrics>SamplingProfiler
 
 charliea@chromium.org
-wittman@chromium.org
\ No newline at end of file
+wittman@chromium.org
diff --git a/chrome/common/profiler/main_thread_stack_sampling_profiler.cc b/chrome/common/profiler/main_thread_stack_sampling_profiler.cc
index 6f62d6a..306a205 100644
--- a/chrome/common/profiler/main_thread_stack_sampling_profiler.cc
+++ b/chrome/common/profiler/main_thread_stack_sampling_profiler.cc
@@ -7,7 +7,7 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/threading/platform_thread.h"
-#include "chrome/common/thread_profiler.h"
+#include "chrome/common/profiler/thread_profiler.h"
 #include "components/metrics/call_stack_profile_metrics_provider.h"
 #include "content/public/common/content_switches.h"
 
diff --git a/chrome/common/stack_sampling_configuration.cc b/chrome/common/profiler/stack_sampling_configuration.cc
similarity index 98%
rename from chrome/common/stack_sampling_configuration.cc
rename to chrome/common/profiler/stack_sampling_configuration.cc
index 5b0ca226..2518a72 100644
--- a/chrome/common/stack_sampling_configuration.cc
+++ b/chrome/common/profiler/stack_sampling_configuration.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/common/stack_sampling_configuration.h"
+#include "chrome/common/profiler/stack_sampling_configuration.h"
 
 #include "base/command_line.h"
 #include "base/lazy_instance.h"
@@ -89,8 +89,7 @@
 }  // namespace
 
 StackSamplingConfiguration::StackSamplingConfiguration()
-    : configuration_(GenerateConfiguration()) {
-}
+    : configuration_(GenerateConfiguration()) {}
 
 base::StackSamplingProfiler::SamplingParams
 StackSamplingConfiguration::GetSamplingParamsForCurrentProcess() const {
diff --git a/chrome/common/stack_sampling_configuration.h b/chrome/common/profiler/stack_sampling_configuration.h
similarity index 92%
rename from chrome/common/stack_sampling_configuration.h
rename to chrome/common/profiler/stack_sampling_configuration.h
index 57ce42c..b3b0a71 100644
--- a/chrome/common/stack_sampling_configuration.h
+++ b/chrome/common/profiler/stack_sampling_configuration.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_COMMON_STACK_SAMPLING_CONFIGURATION_H_
-#define CHROME_COMMON_STACK_SAMPLING_CONFIGURATION_H_
+#ifndef CHROME_COMMON_PROFILER_STACK_SAMPLING_CONFIGURATION_H_
+#define CHROME_COMMON_PROFILER_STACK_SAMPLING_CONFIGURATION_H_
 
 #include <string>
 
@@ -25,7 +25,7 @@
 
   // Get the stack sampling params to use for this process.
   base::StackSamplingProfiler::SamplingParams
-      GetSamplingParamsForCurrentProcess() const;
+  GetSamplingParamsForCurrentProcess() const;
 
   // Returns true if the profiler should be started for the current process.
   bool IsProfilerEnabledForCurrentProcess() const;
@@ -86,4 +86,4 @@
   DISALLOW_COPY_AND_ASSIGN(StackSamplingConfiguration);
 };
 
-#endif  // CHROME_COMMON_STACK_SAMPLING_CONFIGURATION_H_
+#endif  // CHROME_COMMON_PROFILER_STACK_SAMPLING_CONFIGURATION_H_
diff --git a/chrome/common/thread_profiler.cc b/chrome/common/profiler/thread_profiler.cc
similarity index 97%
rename from chrome/common/thread_profiler.cc
rename to chrome/common/profiler/thread_profiler.cc
index 75619b8..0703a69 100644
--- a/chrome/common/thread_profiler.cc
+++ b/chrome/common/profiler/thread_profiler.cc
@@ -2,13 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/common/thread_profiler.h"
+#include "chrome/common/profiler/thread_profiler.h"
 
 #include <string>
 #include <utility>
 
 #include "base/bind.h"
 #include "base/command_line.h"
+#include "base/memory/ptr_util.h"
 #include "base/message_loop/work_id_provider.h"
 #include "base/no_destructor.h"
 #include "base/profiler/sample_metadata.h"
@@ -18,7 +19,7 @@
 #include "base/threading/sequence_local_storage_slot.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
-#include "chrome/common/stack_sampling_configuration.h"
+#include "chrome/common/profiler/stack_sampling_configuration.h"
 #include "components/metrics/call_stack_profile_builder.h"
 #include "components/metrics/call_stack_profile_metrics_provider.h"
 #include "content/public/common/content_switches.h"
@@ -151,8 +152,8 @@
   bool is_single_process = command_line->HasSwitch(switches::kSingleProcess) ||
                            command_line->HasSwitch(switches::kInProcessGPU);
   DCHECK(!g_main_thread_instance || is_single_process);
-  auto instance = std::unique_ptr<ThreadProfiler>(
-      new ThreadProfiler(CallStackProfileParams::MAIN_THREAD));
+  auto instance =
+      base::WrapUnique(new ThreadProfiler(CallStackProfileParams::MAIN_THREAD));
   if (!g_main_thread_instance)
     g_main_thread_instance = instance.get();
   return instance;
diff --git a/chrome/common/thread_profiler.h b/chrome/common/profiler/thread_profiler.h
similarity index 97%
rename from chrome/common/thread_profiler.h
rename to chrome/common/profiler/thread_profiler.h
index 21e3db7..6302c75 100644
--- a/chrome/common/thread_profiler.h
+++ b/chrome/common/profiler/thread_profiler.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_COMMON_THREAD_PROFILER_H_
-#define CHROME_COMMON_THREAD_PROFILER_H_
+#ifndef CHROME_COMMON_PROFILER_THREAD_PROFILER_H_
+#define CHROME_COMMON_PROFILER_THREAD_PROFILER_H_
 
 #include <memory>
 
@@ -152,4 +152,4 @@
   DISALLOW_COPY_AND_ASSIGN(ThreadProfiler);
 };
 
-#endif  // CHROME_COMMON_THREAD_PROFILER_H_
+#endif  // CHROME_COMMON_PROFILER_THREAD_PROFILER_H_
diff --git a/chrome/common/thread_profiler_unittest.cc b/chrome/common/profiler/thread_profiler_unittest.cc
similarity index 98%
rename from chrome/common/thread_profiler_unittest.cc
rename to chrome/common/profiler/thread_profiler_unittest.cc
index cf80181..df95b04 100644
--- a/chrome/common/thread_profiler_unittest.cc
+++ b/chrome/common/profiler/thread_profiler_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/common/thread_profiler.h"
+#include "chrome/common/profiler/thread_profiler.h"
 
 #include "base/macros.h"
 #include "base/test/bind_test_util.h"
diff --git a/chrome/gpu/chrome_content_gpu_client.h b/chrome/gpu/chrome_content_gpu_client.h
index 4cc1082..90a407b 100644
--- a/chrome/gpu/chrome_content_gpu_client.h
+++ b/chrome/gpu/chrome_content_gpu_client.h
@@ -11,7 +11,7 @@
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/single_thread_task_runner.h"
-#include "chrome/common/thread_profiler.h"
+#include "chrome/common/profiler/thread_profiler.h"
 #include "content/public/gpu/content_gpu_client.h"
 
 #if defined(OS_CHROMEOS)
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index 988a3f7..e12bb0d 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -35,9 +35,9 @@
 #include "chrome/common/plugin.mojom.h"
 #include "chrome/common/prerender_types.h"
 #include "chrome/common/prerender_url_loader_throttle.h"
+#include "chrome/common/profiler/thread_profiler.h"
 #include "chrome/common/render_messages.h"
 #include "chrome/common/secure_origin_whitelist.h"
-#include "chrome/common/thread_profiler.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
@@ -1253,6 +1253,31 @@
 #endif
 }
 
+bool ChromeContentRendererClient::ShouldFork(WebLocalFrame* frame,
+                                             const GURL& url,
+                                             const std::string& http_method,
+                                             bool is_initial_navigation,
+                                             bool is_server_redirect) {
+  // TODO(lukasza): https://crbug.com/650694: For now, we skip the rest for POST
+  // submissions.  This is because 1) in M54 there are some remaining issues
+  // with POST in OpenURL path (e.g. https://crbug.com/648648) and 2) OpenURL
+  // path regresses (blocks) navigations that result in downloads
+  // (https://crbug.com/646261).  In the long-term we should avoid forking for
+  // extensions (not hosted apps though) altogether and rely on transfers logic
+  // instead.
+  if (http_method != "GET")
+    return false;
+
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+  bool should_fork = ChromeExtensionsRendererClient::ShouldFork(
+      frame, url, is_initial_navigation, is_server_redirect);
+  if (should_fork)
+    return true;
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
+
+  return false;
+}
+
 void ChromeContentRendererClient::WillSendRequest(
     WebLocalFrame* frame,
     ui::PageTransition transition_type,
diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h
index 2931391..205dcd51 100644
--- a/chrome/renderer/chrome_content_renderer_client.h
+++ b/chrome/renderer/chrome_content_renderer_client.h
@@ -137,6 +137,11 @@
       base::SingleThreadTaskRunner* compositor_thread_task_runner) override;
   bool RunIdleHandlerWhenWidgetsHidden() override;
   bool AllowPopup() override;
+  bool ShouldFork(blink::WebLocalFrame* frame,
+                  const GURL& url,
+                  const std::string& http_method,
+                  bool is_initial_navigation,
+                  bool is_server_redirect) override;
   void WillSendRequest(blink::WebLocalFrame* frame,
                        ui::PageTransition transition_type,
                        const blink::WebURL& url,
diff --git a/chrome/renderer/extensions/chrome_extensions_renderer_client.cc b/chrome/renderer/extensions/chrome_extensions_renderer_client.cc
index d7b0dd4..314ae295 100644
--- a/chrome/renderer/extensions/chrome_extensions_renderer_client.cc
+++ b/chrome/renderer/extensions/chrome_extensions_renderer_client.cc
@@ -54,6 +54,11 @@
 
 namespace {
 
+bool IsStandaloneExtensionProcess() {
+  return base::CommandLine::ForCurrentProcess()->HasSwitch(
+      extensions::switches::kExtensionProcess);
+}
+
 void IsGuestViewApiAvailableToScriptContext(
     bool* api_is_available,
     extensions::ScriptContext* context) {
@@ -72,6 +77,54 @@
              extensions::PermissionsData::PageAccess::kAllowed;
 }
 
+// Returns true if the frame is navigating to an URL either into or out of an
+// extension app's extent.
+bool CrossesExtensionExtents(blink::WebLocalFrame* frame,
+                             const GURL& new_url,
+                             bool is_extension_url,
+                             bool is_initial_navigation) {
+  DCHECK(!frame->Parent());
+  GURL old_url(frame->GetDocument().Url());
+
+  extensions::RendererExtensionRegistry* extension_registry =
+      extensions::RendererExtensionRegistry::Get();
+
+  // If old_url is still empty and this is an initial navigation, then this is
+  // a window.open operation.  We should look at the opener URL.  Note that the
+  // opener is a local frame in this case.
+  if (is_initial_navigation && old_url.is_empty() && frame->Opener()) {
+    blink::WebLocalFrame* opener_frame = frame->Opener()->ToWebLocalFrame();
+
+    // We want to compare against the URL that determines the type of
+    // process.  Use the URL of the opener's local frame root, which will
+    // correctly handle any site isolation modes (e.g. --site-per-process).
+    blink::WebLocalFrame* local_root = opener_frame->LocalRoot();
+    old_url = local_root->GetDocument().Url();
+
+    // If we're about to open a normal web page from a same-origin opener stuck
+    // in an extension process (other than the Chrome Web Store), we want to
+    // keep it in process to allow the opener to script it.
+    blink::WebDocument opener_document = opener_frame->GetDocument();
+    blink::WebSecurityOrigin opener_origin =
+        opener_document.GetSecurityOrigin();
+    bool opener_is_extension_url =
+        !opener_origin.IsUnique() && extension_registry->GetExtensionOrAppByURL(
+                                         opener_document.Url()) != nullptr;
+    const Extension* opener_top_extension =
+        extension_registry->GetExtensionOrAppByURL(old_url);
+    bool opener_is_web_store =
+        opener_top_extension &&
+        opener_top_extension->id() == extensions::kWebStoreAppId;
+    if (!is_extension_url && !opener_is_extension_url && !opener_is_web_store &&
+        IsStandaloneExtensionProcess() &&
+        opener_origin.CanRequest(blink::WebURL(new_url)))
+      return false;
+  }
+
+  return extensions::CrossesExtensionProcessBoundary(
+      *extension_registry->GetMainThreadExtensionSet(), old_url, new_url);
+}
+
 }  // namespace
 
 ChromeExtensionsRendererClient::ChromeExtensionsRendererClient() {}
@@ -292,6 +345,39 @@
 }
 
 // static
+bool ChromeExtensionsRendererClient::ShouldFork(blink::WebLocalFrame* frame,
+                                                const GURL& url,
+                                                bool is_initial_navigation,
+                                                bool is_server_redirect) {
+  const extensions::RendererExtensionRegistry* extension_registry =
+      extensions::RendererExtensionRegistry::Get();
+
+  // Determine if the new URL is an extension (excluding bookmark apps).
+  const Extension* new_url_extension = extensions::GetNonBookmarkAppExtension(
+      *extension_registry->GetMainThreadExtensionSet(), url);
+  bool is_extension_url = !!new_url_extension;
+
+  // If the navigation would cross an app extent boundary, we also need
+  // to defer to the browser to ensure process isolation.  This is not necessary
+  // for server redirects, which will be transferred to a new process by the
+  // browser process when they are ready to commit.  It is necessary for client
+  // redirects, which won't be transferred in the same way.
+  if (!is_server_redirect &&
+      CrossesExtensionExtents(frame, url, is_extension_url,
+                              is_initial_navigation)) {
+    const Extension* extension =
+        extension_registry->GetExtensionOrAppByURL(url);
+    if (extension && extension->is_app()) {
+      extensions::RecordAppLaunchType(
+          extension_misc::APP_LAUNCH_CONTENT_NAVIGATION, extension->GetType());
+    }
+    return true;
+  }
+
+  return false;
+}
+
+// static
 content::BrowserPluginDelegate*
 ChromeExtensionsRendererClient::CreateBrowserPluginDelegate(
     content::RenderFrame* render_frame,
diff --git a/chrome/renderer/extensions/chrome_extensions_renderer_client.h b/chrome/renderer/extensions/chrome_extensions_renderer_client.h
index 0c57161..5abe43a 100644
--- a/chrome/renderer/extensions/chrome_extensions_renderer_client.h
+++ b/chrome/renderer/extensions/chrome_extensions_renderer_client.h
@@ -89,6 +89,10 @@
       std::unique_ptr<extensions::Dispatcher> extension_dispatcher);
   extensions::Dispatcher* GetExtensionDispatcherForTest();
 
+  static bool ShouldFork(blink::WebLocalFrame* frame,
+                         const GURL& url,
+                         bool is_initial_navigation,
+                         bool is_server_redirect);
   static content::BrowserPluginDelegate* CreateBrowserPluginDelegate(
       content::RenderFrame* render_frame,
       const content::WebPluginInfo& info,
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 79567e5..757ad29 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1014,6 +1014,7 @@
       "../browser/net/proxy_browsertest.cc",
       "../browser/net/proxy_test_utils.cc",
       "../browser/net/proxy_test_utils.h",
+      "../browser/net/referrer_policy_policy_browsertest.cc",
       "../browser/net/reporting_browsertest.cc",
       "../browser/net/samesite_cookies_policy_browsertest.cc",
       "../browser/net/system_network_context_manager_browsertest.cc",
@@ -2075,6 +2076,7 @@
         "../browser/chromeos/child_accounts/parent_access_code/parent_access_test_utils.h",
         "../browser/chromeos/child_accounts/screen_time_controller_browsertest.cc",
         "../browser/chromeos/child_accounts/time_limit_test_utils.cc",
+        "../browser/chromeos/child_accounts/time_limits/web_time_limit_enforcer_browsertest.cc",
         "../browser/chromeos/chrome_content_browser_client_chromeos_part_browsertest.cc",
         "../browser/chromeos/customization/customization_document_browsertest.cc",
         "../browser/chromeos/customization/customization_wallpaper_downloader_browsertest.cc",
@@ -3076,6 +3078,7 @@
     "../browser/net/file_downloader_unittest.cc",
     "../browser/net/net_error_tab_helper_unittest.cc",
     "../browser/net/probe_message_unittest.cc",
+    "../browser/net/referrer_policy_policy_handler_unittest.cc",
     "../browser/net/secure_dns_policy_handler_unittest.cc",
     "../browser/notifications/metrics/notification_metrics_logger_unittest.cc",
     "../browser/notifications/notification_channels_provider_android_unittest.cc",
@@ -3356,7 +3359,7 @@
     "../common/net/safe_search_util_unittest.cc",
     "../common/origin_trials/chrome_origin_trial_policy_unittest.cc",
     "../common/pref_names_util_unittest.cc",
-    "../common/thread_profiler_unittest.cc",
+    "../common/profiler/thread_profiler_unittest.cc",
     "../renderer/chrome_content_renderer_client_unittest.cc",
     "../renderer/content_settings_agent_impl_unittest.cc",
     "../renderer/instant_restricted_id_cache_unittest.cc",
@@ -3396,6 +3399,7 @@
     sources += [
       "../browser/notifications/win/fake_notification_image_retainer.cc",
       "../browser/notifications/win/fake_notification_image_retainer.h",
+      "../browser/sync/roaming_profile_directory_deleter_win_unittest.cc",
       "../browser/ui/views/try_chrome_dialog_win/button_layout_unittest.cc",
     ]
     if (enable_widevine) {
@@ -4203,7 +4207,7 @@
       "../browser/ui/ash/keyboard_shortcut_viewer_metadata_unittest.cc",
       "../browser/ui/ash/launcher/arc_app_shelf_id_unittest.cc",
       "../browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc",
-      "../browser/ui/ash/launcher/launcher_context_menu_unittest.cc",
+      "../browser/ui/ash/launcher/shelf_context_menu_unittest.cc",
       "../browser/ui/ash/media_client_impl_unittest.cc",
       "../browser/ui/ash/multi_user/multi_profile_support_unittest.cc",
       "../browser/ui/ash/multi_user/multi_user_context_menu_chromeos_unittest.cc",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java
index 04ce1c07..cc2650ae 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java
@@ -39,9 +39,9 @@
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.ntp.NewTabPage;
 import org.chromium.chrome.browser.omnibox.UrlBar;
-import org.chromium.chrome.browser.preferences.Preferences;
-import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
+import org.chromium.chrome.browser.settings.Preferences;
+import org.chromium.chrome.browser.settings.PreferencesLauncher;
+import org.chromium.chrome.browser.settings.privacy.PrivacyPreferencesManager;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
 import org.chromium.chrome.browser.tabmodel.TabLaunchType;
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/codelabsolution/README.md b/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/codelabsolution/README.md
index 71c1d2a..bb8db90 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/codelabsolution/README.md
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/codelabsolution/README.md
@@ -150,7 +150,7 @@
 
 /**
  * Search Engine Selection Page Controller for the Code Lab, corresponds to
- * {@link org.chromium.chrome.browser.preferences.SearchEnginePreference}.
+ * {@link org.chromium.chrome.browser.settings.SearchEnginePreference}.
  */
 public class SearchEngineSelectionControllerForCodelab extends PageController {
     // TODO: Put locators here.
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ActivityUtils.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ActivityUtils.java
index f827a0c4..13860d7 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ActivityUtils.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ActivityUtils.java
@@ -21,7 +21,7 @@
 import org.chromium.base.Log;
 import org.chromium.base.test.util.TimeoutTimer;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.Preferences;
+import org.chromium.chrome.browser.settings.Preferences;
 import org.chromium.chrome.browser.util.IntentUtils;
 import org.chromium.content_public.browser.test.util.Criteria;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/ThemeTestUtils.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/ThemeTestUtils.java
index fccc63d..03554c6 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/ThemeTestUtils.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/ThemeTestUtils.java
@@ -26,11 +26,15 @@
      */
     public static void waitForThemeColor(ChromeActivity activity, int expectedColor)
             throws ExecutionException, TimeoutException {
-        // Use longer-than-default timeout to give page time to finish loading.
+        waitForThemeColor(activity, expectedColor, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL);
+    }
+
+    public static void waitForThemeColor(ChromeActivity activity, int expectedColor, long timeoutMs)
+            throws ExecutionException, TimeoutException {
         CriteriaHelper.pollUiThread(
                 Criteria.equals(expectedColor,
                         () -> TabThemeColorHelper.getColor(activity.getActivityTab())),
-                10000, CriteriaHelper.DEFAULT_POLLING_INTERVAL);
+                timeoutMs, CriteriaHelper.DEFAULT_POLLING_INTERVAL);
     }
 
     /**
diff --git a/chrome/test/chromedriver/chrome/device_manager.cc b/chrome/test/chromedriver/chrome/device_manager.cc
index e1ddf77..8334100 100644
--- a/chrome/test/chromedriver/chrome/device_manager.cc
+++ b/chrome/test/chromedriver/chrome/device_manager.cc
@@ -109,7 +109,8 @@
         return Status(kUnknownError, "known package " + package +
                       " does not accept activity/process");
     } else if (activity.empty()) {
-      return Status(kUnknownError, "WebView apps require activity name");
+      return Status(kUnknownError,
+                    "WebView/WebLayer apps require activity name");
     }
 
     if (!command_line_file.empty()) {
@@ -154,13 +155,21 @@
     // The leading '@' means abstract UNIX sockets. Some apps have a custom
     // substring between the required "webview_devtools_remote_" prefix and
     // their PID, which Chrome DevTools accepts and we also should.
-    std::string pattern =
+    std::string webview_pattern =
         base::StringPrintf("@webview_devtools_remote_.*%d", pid);
-    status = adb_->GetSocketByPattern(serial_, pattern, &socket_name);
+    std::string weblayer_pattern =
+        base::StringPrintf("@weblayer_devtools_remote_.*%d", pid);
+    status = adb_->GetSocketByPattern(serial_, webview_pattern, &socket_name);
     if (status.IsError()) {
-      if (socket_name.empty())
+      status =
+          adb_->GetSocketByPattern(serial_, weblayer_pattern, &socket_name);
+    }
+    if (status.IsError()) {
+      if (socket_name.empty()) {
         status.AddDetails(
-            "make sure the app has its WebView configured for debugging");
+            "make sure the app has its WebView/WebLayer "
+            "configured for debugging");
+      }
       return status;
     }
     // When used in adb with "localabstract:", the leading '@' is not needed.
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index f003027..49ec6bc 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -87,17 +87,7 @@
 _OS_SPECIFIC_FILTER['win'] = [
     # https://bugs.chromium.org/p/chromedriver/issues/detail?id=299
     'ChromeLogPathCapabilityTest.testChromeLogPath',
-    # https://bugs.chromium.org/p/chromium/issues/detail?id=946704
-    'ChromeDownloadDirTest.testFileDownloadWithClick',
-    'ChromeDriverTest.testBackNavigationAfterClickElement',
-    'ChromeDriverTest.testCanClickInIframes',
-    'ChromeDriverTest.testClickElementAfterNavigation',
-    'ChromeDriverTest.testCloseWindow',
-    'ChromeDriverTest.testCloseWindowUsingJavascript',
-    'ChromeDriverTest.testGetLogOnClosedWindow',
-    'ChromeDriverTest.testGetWindowHandles',
-    'ChromeDriverTest.testShouldHandleNewWindowLoadingProperly',
-    'ChromeDriverTest.testSwitchToWindow',
+    # https://bugs.chromium.org/p/chromium/issues/detail?id=1011095
     'ChromeDownloadDirTest.testFileDownloadAfterTabHeadless',
     'ChromeDownloadDirTest.testFileDownloadWithClickHeadless',
     'ChromeDownloadDirTest.testFileDownloadWithGetHeadless',
@@ -134,7 +124,6 @@
     # already tested by other test cases.
     'ChromeDriverTest.testGetCurrentWindowHandle',
     'ChromeDriverTest.testStartStop',
-    'ChromeDriverTest.testSendCommand*',
     # https://crbug.com/867511
     'ChromeDriverTest.testWindowMaximize',
     # LaunchApp is an obsolete API.
@@ -1611,18 +1600,6 @@
     # navigation tracker to block the call to Load() above.
     self.WaitForCondition(lambda: 'is not available' in self._driver.GetTitle())
 
-  def testSendCommand(self):
-    """Sends a custom command to the DevTools debugger"""
-    params = {}
-    res = self._driver.SendCommandAndGetResult('CSS.enable', params)
-    self.assertEqual({}, res)
-
-  def testSendCommandNoParams(self):
-    """Sends a custom command to the DevTools debugger without params"""
-    self.assertRaisesRegexp(
-            chromedriver.InvalidArgument, "params not passed",
-            self._driver.SendCommandAndGetResult, 'CSS.enable', None)
-
   def testSendCommandAndGetResult(self):
     """Sends a custom command to the DevTools debugger and gets the result"""
     self._driver.Load(self.GetHttpUrlForFile('/chromedriver/page_test.html'))
diff --git a/chrome/test/chromedriver/window_commands_unittest.cc b/chrome/test/chromedriver/window_commands_unittest.cc
index ca2ee29..67d39a3 100644
--- a/chrome/test/chromedriver/window_commands_unittest.cc
+++ b/chrome/test/chromedriver/window_commands_unittest.cc
@@ -70,6 +70,22 @@
   ASSERT_EQ(kOk, status.code());
 }
 
+TEST(WindowCommandsTest, ExecuteSendCommandAndGetResult_NoCmd) {
+  base::DictionaryValue params;
+  params.SetDictionary("params", std::make_unique<base::DictionaryValue>());
+  Status status = CallWindowCommand(ExecuteSendCommandAndGetResult, params);
+  ASSERT_EQ(kInvalidArgument, status.code());
+  ASSERT_NE(status.message().find("command not passed"), std::string::npos);
+}
+
+TEST(WindowCommandsTest, ExecuteSendCommandAndGetResult_NoParams) {
+  base::DictionaryValue params;
+  params.SetString("cmd", "CSS.enable");
+  Status status = CallWindowCommand(ExecuteSendCommandAndGetResult, params);
+  ASSERT_EQ(kInvalidArgument, status.code());
+  ASSERT_NE(status.message().find("params not passed"), std::string::npos);
+}
+
 TEST(WindowCommandsTest, ProcessInputActionSequencePointerMouse) {
   Session session("1");
   std::vector<std::unique_ptr<base::DictionaryValue>> action_list;
diff --git a/chrome/test/data/android/render_tests/StatusViewRenderTest.status_view_verbose_padding_with_dse_icon.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/StatusViewRenderTest.status_view_verbose_padding_with_dse_icon.Nexus_5-19.png.sha1
index 200cd27..2a21fc0 100644
--- a/chrome/test/data/android/render_tests/StatusViewRenderTest.status_view_verbose_padding_with_dse_icon.Nexus_5-19.png.sha1
+++ b/chrome/test/data/android/render_tests/StatusViewRenderTest.status_view_verbose_padding_with_dse_icon.Nexus_5-19.png.sha1
@@ -1 +1 @@
-1860cf581fd842be14469fb5e7c47f276c2ee323
\ No newline at end of file
+6b1298f352e2fd819cba056417008a8ecbffeec6
\ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/StatusViewRenderTest.status_view_verbose_padding_with_dse_icon.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/StatusViewRenderTest.status_view_verbose_padding_with_dse_icon.Nexus_5X-23.png.sha1
index 9c1387d..4f8d0255 100644
--- a/chrome/test/data/android/render_tests/StatusViewRenderTest.status_view_verbose_padding_with_dse_icon.Nexus_5X-23.png.sha1
+++ b/chrome/test/data/android/render_tests/StatusViewRenderTest.status_view_verbose_padding_with_dse_icon.Nexus_5X-23.png.sha1
@@ -1 +1 @@
-e3bb3035a4eb4aaddac847ef90ad2693014e1e72
\ No newline at end of file
+88ded67364374371bad308486f1a37e9e1a31e88
\ No newline at end of file
diff --git a/chrome/test/data/extensions/api_test/declarative_net_request/on_rules_matched_debug/background.js b/chrome/test/data/extensions/api_test/declarative_net_request/on_rules_matched_debug/background.js
index 569ecea..82a91b77 100644
--- a/chrome/test/data/extensions/api_test/declarative_net_request/on_rules_matched_debug/background.js
+++ b/chrome/test/data/extensions/api_test/declarative_net_request/on_rules_matched_debug/background.js
@@ -72,6 +72,35 @@
     });
   },
 
+  // Ensure listening to requests not originating from a tab works fine.
+  function testBackgroundPageRequest() {
+    addRuleMatchedListener();
+
+    const url = getServerURL('abc.com');
+    let xhr = new XMLHttpRequest();
+    xhr.open('GET', url);
+
+    xhr.onload = () => {
+      removeRuleMatchedListener();
+      chrome.test.fail('Request should be blocked by rule with ID 1');
+    };
+
+    // The request from the background page to abc.com should be blocked.
+    xhr.onerror = () => {
+      chrome.test.assertEq(1, matchedRules.length);
+      const matchedRule = matchedRules[0];
+      chrome.test.assertEq(1, matchedRule.rule.ruleId);
+
+      // Tab ID should be -1 since this request was made from a background page.
+      chrome.test.assertEq(-1, matchedRule.request.tabId);
+
+      removeRuleMatchedListener();
+      chrome.test.succeed();
+    };
+
+    xhr.send();
+  },
+
   function testNoRuleMatched() {
     addRuleMatchedListener();
     const url = getServerURL('nomatch.com');
diff --git a/chrome/test/data/extensions/api_test/declarative_net_request/on_rules_matched_debug/rules.json b/chrome/test/data/extensions/api_test/declarative_net_request/on_rules_matched_debug/rules.json
index 6febb6b..664e5c30 100644
--- a/chrome/test/data/extensions/api_test/declarative_net_request/on_rules_matched_debug/rules.json
+++ b/chrome/test/data/extensions/api_test/declarative_net_request/on_rules_matched_debug/rules.json
@@ -1,7 +1,7 @@
 [{
   "id" : 1,
   "action": { "type" : "block" },
-  "condition" : {"urlFilter" : "abc*", "resourceTypes" : ["main_frame"] }
+  "condition" : {"urlFilter" : "abc*", "resourceTypes" : ["main_frame", "xmlhttprequest"] }
 },
 {
   "id" : 2,
diff --git a/chrome/test/data/extensions/api_test/webnavigation/crossProcess/test_crossProcess.js b/chrome/test/data/extensions/api_test/webnavigation/crossProcess/test_crossProcess.js
index da589663..5ea890b 100644
--- a/chrome/test/data/extensions/api_test/webnavigation/crossProcess/test_crossProcess.js
+++ b/chrome/test/data/extensions/api_test/webnavigation/crossProcess/test_crossProcess.js
@@ -68,7 +68,7 @@
                      processId: 1,
                      tabId: 0,
                      timeStamp: 0,
-                     transitionQualifiers: ["client_redirect"],
+                     transitionQualifiers: [],
                      transitionType: "link",
                      url: URL_REGULAR }},
         { label: "b-onDOMContentLoaded",
@@ -144,8 +144,7 @@
                      processId: 1,
                      tabId: 0,
                      timeStamp: 0,
-                     transitionQualifiers: ["client_redirect",
-                                            "server_redirect"],
+                     transitionQualifiers: ["server_redirect"],
                      transitionType: "link",
                      url: URL_REGULAR }},
         { label: "c-onDOMContentLoaded",
diff --git a/chrome/test/data/extensions/api_test/webnavigation/crossProcessHistory/test_crossProcessHistory.js b/chrome/test/data/extensions/api_test/webnavigation/crossProcessHistory/test_crossProcessHistory.js
index c53343cf..0f02f89 100644
--- a/chrome/test/data/extensions/api_test/webnavigation/crossProcessHistory/test_crossProcessHistory.js
+++ b/chrome/test/data/extensions/api_test/webnavigation/crossProcessHistory/test_crossProcessHistory.js
@@ -72,7 +72,7 @@
                      processId: 1,
                      tabId: 0,
                      timeStamp: 0,
-                     transitionQualifiers: ["client_redirect"],
+                     transitionQualifiers: [],
                      transitionType: "link",
                      url: URL_TEST + "2" }},
         { label: "b-onDOMContentLoaded",
@@ -250,7 +250,7 @@
                      processId: 1,
                      tabId: 0,
                      timeStamp: 0,
-                     transitionQualifiers: ["client_redirect"],
+                     transitionQualifiers: [],
                      transitionType: "link",
                      url: URL_TEST + "6" }},
         { label: "b-onDOMContentLoaded",
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index 2df972c3..81f41d4f 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -275,6 +275,9 @@
 
   "RemoteAccessClientFirewallTraversal": {},
 
+  "RemoteAccessClientFirewallTraversal": {
+  },
+
   "RemoteAccessHostClientDomain": {},
 
   "RemoteAccessHostClientDomainList": {},
@@ -615,6 +618,8 @@
     ]
   },
 
+  "ForceLegacyDefaultReferrerPolicy": {},
+
   "ForceYouTubeSafetyMode": {
     "os": ["win", "linux", "mac", "chromeos", "android"],
     "policy_pref_mapping_test": [
@@ -6513,4 +6518,4 @@
       }
     ]
   }
-}
\ No newline at end of file
+}
diff --git a/chrome/test/data/webui/settings/autofill_page_test.js b/chrome/test/data/webui/settings/autofill_page_test.js
index 73111af5..39c5d97 100644
--- a/chrome/test/data/webui/settings/autofill_page_test.js
+++ b/chrome/test/data/webui/settings/autofill_page_test.js
@@ -55,11 +55,6 @@
             type: chrome.settingsPrivate.PrefType.BOOLEAN,
             value: true,
           },
-          {
-            key: 'profile.password_manager_leak_detection',
-            type: chrome.settingsPrivate.PrefType.BOOLEAN,
-            value: true,
-          },
         ]));
 
         CrSettingsPrefs.initialized.then(function() {
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index c8bb568..3b5981e 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -1120,9 +1120,11 @@
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
     '//ui/webui/resources/js/promise_resolver.js',
+    'sync_test_util.js',
     'test_util.js',
     '../test_browser_proxy.js',
     'test_privacy_page_browser_proxy.js',
+    'test_sync_browser_proxy.js',
     'personalization_options_test.js',
   ]),
 };
diff --git a/chrome/test/data/webui/settings/cr_settings_interactive_ui_tests.js b/chrome/test/data/webui/settings/cr_settings_interactive_ui_tests.js
index 001b519..075701d 100644
--- a/chrome/test/data/webui/settings/cr_settings_interactive_ui_tests.js
+++ b/chrome/test/data/webui/settings/cr_settings_interactive_ui_tests.js
@@ -39,6 +39,8 @@
 
   /** @override */
   extraLibraries: CrSettingsInteractiveUITest.prototype.extraLibraries.concat([
+    '../test_browser_proxy.js',
+    'test_sync_browser_proxy.js',
     'people_page_sync_page_interactive_test.js',
   ]),
 };
diff --git a/chrome/test/data/webui/settings/passwords_section_test.js b/chrome/test/data/webui/settings/passwords_section_test.js
index c3f2047..d04b7a4 100644
--- a/chrome/test/data/webui/settings/passwords_section_test.js
+++ b/chrome/test/data/webui/settings/passwords_section_test.js
@@ -122,7 +122,6 @@
       const element = document.createElement('passwords-section');
       element.prefs = {
         credentials_enable_service: {},
-        profile: {password_manager_leak_detection: {}},
       };
       document.body.appendChild(element);
 
@@ -878,121 +877,5 @@
       Polymer.dom.flush();
       assertFalse(passwordsSection.$.manageLink.hidden);
     });
-
-    test('leakDetectionToggleSignedOutWithFalsePref', function() {
-      const passwordsSection =
-          elementFactory.createPasswordsSection(passwordManager, [], []);
-      const syncPrefs = sync_test_util.getSyncAllPrefs();
-
-      passwordsSection.set(
-          'prefs.profile.password_manager_leak_detection.value', false);
-      sync_test_util.simulateSyncStatus({signedIn: false});
-      sync_test_util.simulateStoredAccounts([]);
-      cr.webUIListenerCallback('sync-prefs-changed', syncPrefs);
-      Polymer.dom.flush();
-
-      assertTrue(passwordsSection.$.passwordsLeakDetectionCheckbox.disabled);
-      assertFalse(passwordsSection.$.passwordsLeakDetectionCheckbox.checked);
-      assertEquals(
-          '', passwordsSection.$.passwordsLeakDetectionCheckbox.subLabel);
-    });
-
-    test('leakDetectionToggleSignedOutWithTruePref', function() {
-      const passwordsSection =
-          elementFactory.createPasswordsSection(passwordManager, [], []);
-      const syncPrefs = sync_test_util.getSyncAllPrefs();
-
-      sync_test_util.simulateSyncStatus({signedIn: false});
-      sync_test_util.simulateStoredAccounts([]);
-      cr.webUIListenerCallback('sync-prefs-changed', syncPrefs);
-      Polymer.dom.flush();
-
-      assertTrue(passwordsSection.$.passwordsLeakDetectionCheckbox.disabled);
-      assertFalse(passwordsSection.$.passwordsLeakDetectionCheckbox.checked);
-      assertEquals(
-          loadTimeData.getString(
-              'passwordsLeakDetectionSignedOutEnabledDescription'),
-          passwordsSection.$.passwordsLeakDetectionCheckbox.subLabel);
-    });
-
-    if (!cr.isChromeOS) {
-      test('leakDetectionToggleSignedInNotSyncingWithFalsePref', function() {
-        const passwordsSection =
-            elementFactory.createPasswordsSection(passwordManager, [], []);
-        const syncPrefs = sync_test_util.getSyncAllPrefs();
-
-        passwordsSection.set(
-            'prefs.profile.password_manager_leak_detection.value', false);
-        sync_test_util.simulateSyncStatus({signedIn: false});
-        sync_test_util.simulateStoredAccounts([
-          {
-            fullName: 'testName',
-            givenName: 'test',
-            email: 'test@test.com',
-          },
-        ]);
-        cr.webUIListenerCallback('sync-prefs-changed', syncPrefs);
-        Polymer.dom.flush();
-
-        assertFalse(passwordsSection.$.passwordsLeakDetectionCheckbox.disabled);
-        assertFalse(passwordsSection.$.passwordsLeakDetectionCheckbox.checked);
-        assertEquals(
-            '', passwordsSection.$.passwordsLeakDetectionCheckbox.subLabel);
-      });
-
-      test('leakDetectionToggleSignedInNotSyncingWithTruePref', function() {
-        const passwordsSection =
-            elementFactory.createPasswordsSection(passwordManager, [], []);
-        const syncPrefs = sync_test_util.getSyncAllPrefs();
-
-        sync_test_util.simulateSyncStatus({signedIn: false});
-        sync_test_util.simulateStoredAccounts([
-          {
-            fullName: 'testName',
-            givenName: 'test',
-            email: 'test@test.com',
-          },
-        ]);
-        cr.webUIListenerCallback('sync-prefs-changed', syncPrefs);
-        Polymer.dom.flush();
-
-        assertFalse(passwordsSection.$.passwordsLeakDetectionCheckbox.disabled);
-        assertTrue(passwordsSection.$.passwordsLeakDetectionCheckbox.checked);
-        assertEquals(
-            '', passwordsSection.$.passwordsLeakDetectionCheckbox.subLabel);
-      });
-    }
-
-    test('leakDetectionToggleSignedInAndSyncingWithFalsePref', function() {
-      const passwordsSection =
-          elementFactory.createPasswordsSection(passwordManager, [], []);
-      const syncPrefs = sync_test_util.getSyncAllPrefs();
-
-      passwordsSection.set(
-          'prefs.profile.password_manager_leak_detection.value', false);
-      sync_test_util.simulateSyncStatus({signedIn: true});
-      cr.webUIListenerCallback('sync-prefs-changed', syncPrefs);
-      Polymer.dom.flush();
-
-      assertFalse(passwordsSection.$.passwordsLeakDetectionCheckbox.disabled);
-      assertFalse(passwordsSection.$.passwordsLeakDetectionCheckbox.checked);
-      assertEquals(
-          '', passwordsSection.$.passwordsLeakDetectionCheckbox.subLabel);
-    });
-
-    test('leakDetectionToggleSignedInAndSyncingWithTruePref', function() {
-      const passwordsSection =
-          elementFactory.createPasswordsSection(passwordManager, [], []);
-      const syncPrefs = sync_test_util.getSyncAllPrefs();
-
-      sync_test_util.simulateSyncStatus({signedIn: true});
-      cr.webUIListenerCallback('sync-prefs-changed', syncPrefs);
-      Polymer.dom.flush();
-
-      assertFalse(passwordsSection.$.passwordsLeakDetectionCheckbox.disabled);
-      assertTrue(passwordsSection.$.passwordsLeakDetectionCheckbox.checked);
-      assertEquals(
-          '', passwordsSection.$.passwordsLeakDetectionCheckbox.subLabel);
-    });
   });
 });
diff --git a/chrome/test/data/webui/settings/people_page_sync_page_interactive_test.js b/chrome/test/data/webui/settings/people_page_sync_page_interactive_test.js
index e55f318..fd1899a 100644
--- a/chrome/test/data/webui/settings/people_page_sync_page_interactive_test.js
+++ b/chrome/test/data/webui/settings/people_page_sync_page_interactive_test.js
@@ -8,6 +8,7 @@
   setup(function() {
     PolymerTest.clearBody();
 
+    settings.SyncBrowserProxyImpl.instance_ = new TestSyncBrowserProxy();
     settings.navigateTo(settings.routes.SYNC);
     syncPage = document.createElement('settings-sync-page');
     document.body.appendChild(syncPage);
diff --git a/chrome/test/data/webui/settings/people_page_sync_page_test.js b/chrome/test/data/webui/settings/people_page_sync_page_test.js
index 1a8ae35..ec24a42 100644
--- a/chrome/test/data/webui/settings/people_page_sync_page_test.js
+++ b/chrome/test/data/webui/settings/people_page_sync_page_test.js
@@ -16,6 +16,13 @@
       PolymerTest.clearBody();
       syncPage = document.createElement('settings-sync-page');
       settings.navigateTo(settings.routes.SYNC);
+      // Preferences should exist for embedded 'personalization_options.html'.
+      // We don't perform tests on them.
+      syncPage.prefs = {
+        profile: {password_manager_leak_detection: {value: true}},
+        safebrowsing:
+            {enabled: {value: true}, scout_reporting_enabled: {value: true}},
+      };
 
       document.body.appendChild(syncPage);
 
diff --git a/chrome/test/data/webui/settings/people_page_test.js b/chrome/test/data/webui/settings/people_page_test.js
index 0173736..ab94040 100644
--- a/chrome/test/data/webui/settings/people_page_test.js
+++ b/chrome/test/data/webui/settings/people_page_test.js
@@ -581,6 +581,13 @@
 
         PolymerTest.clearBody();
         peoplePage = document.createElement('settings-people-page');
+        // Preferences should exist for embedded 'personalization_options.html'.
+        // We don't perform tests on them.
+        peoplePage.prefs = {
+          profile: {password_manager_leak_detection: {value: true}},
+          safebrowsing:
+              {enabled: {value: true}, scout_reporting_enabled: {value: true}},
+        };
         peoplePage.pageVisibility = settings.pageVisibility;
         document.body.appendChild(peoplePage);
 
@@ -648,6 +655,13 @@
 
         PolymerTest.clearBody();
         peoplePage = document.createElement('settings-people-page');
+        // Preferences should exist for embedded 'personalization_options.html'.
+        // We don't perform tests on them.
+        peoplePage.prefs = {
+          profile: {password_manager_leak_detection: {value: true}},
+          safebrowsing:
+              {enabled: {value: true}, scout_reporting_enabled: {value: true}},
+        };
         peoplePage.pageVisibility = settings.pageVisibility;
         document.body.appendChild(peoplePage);
 
diff --git a/chrome/test/data/webui/settings/personalization_options_test.js b/chrome/test/data/webui/settings/personalization_options_test.js
index 4bebf57..7bd4ec7 100644
--- a/chrome/test/data/webui/settings/personalization_options_test.js
+++ b/chrome/test/data/webui/settings/personalization_options_test.js
@@ -7,6 +7,9 @@
     /** @type {settings.TestPrivacyPageBrowserProxy} */
     let testBrowserProxy;
 
+    /** @type {settings.SyncBrowserProxy} */
+    let syncBrowserProxy;
+
     /** @type {SettingsPersonalizationOptionsElement} */
     let testElement;
 
@@ -19,8 +22,15 @@
     setup(function() {
       testBrowserProxy = new TestPrivacyPageBrowserProxy();
       settings.PrivacyPageBrowserProxyImpl.instance_ = testBrowserProxy;
+      syncBrowserProxy = new TestSyncBrowserProxy();
+      settings.SyncBrowserProxyImpl.instance_ = syncBrowserProxy;
       PolymerTest.clearBody();
       testElement = document.createElement('settings-personalization-options');
+      testElement.prefs = {
+        profile: {password_manager_leak_detection: {value: true}},
+        safebrowsing:
+            {enabled: {value: true}, scout_reporting_enabled: {value: true}},
+      };
       document.body.appendChild(testElement);
       Polymer.dom.flush();
     });
@@ -46,6 +56,85 @@
       Polymer.dom.flush();
       assertFalse(!!testElement.$$('#driveSuggestControl'));
     });
+
+    test('leakDetectionToggleSignedOutWithFalsePref', function() {
+      testElement.set(
+          'prefs.profile.password_manager_leak_detection.value', false);
+      testElement.syncStatus = {signedIn: false};
+      Polymer.dom.flush();
+
+      assertTrue(testElement.$.passwordsLeakDetectionCheckbox.disabled);
+      assertFalse(testElement.$.passwordsLeakDetectionCheckbox.checked);
+      assertEquals('', testElement.$.passwordsLeakDetectionCheckbox.subLabel);
+    });
+
+    test('leakDetectionToggleSignedOutWithTruePref', function() {
+      testElement.syncStatus = {signedIn: false};
+      Polymer.dom.flush();
+
+      assertTrue(testElement.$.passwordsLeakDetectionCheckbox.disabled);
+      assertFalse(testElement.$.passwordsLeakDetectionCheckbox.checked);
+      assertEquals(
+          loadTimeData.getString(
+              'passwordsLeakDetectionSignedOutEnabledDescription'),
+          testElement.$.passwordsLeakDetectionCheckbox.subLabel);
+    });
+
+    if (!cr.isChromeOS) {
+      test('leakDetectionToggleSignedInNotSyncingWithFalsePref', function() {
+        testElement.set(
+            'prefs.profile.password_manager_leak_detection.value', false);
+        testElement.syncStatus = {signedIn: false};
+        sync_test_util.simulateStoredAccounts([
+          {
+            fullName: 'testName',
+            givenName: 'test',
+            email: 'test@test.com',
+          },
+        ]);
+        Polymer.dom.flush();
+
+        assertFalse(testElement.$.passwordsLeakDetectionCheckbox.disabled);
+        assertFalse(testElement.$.passwordsLeakDetectionCheckbox.checked);
+        assertEquals('', testElement.$.passwordsLeakDetectionCheckbox.subLabel);
+      });
+
+      test('leakDetectionToggleSignedInNotSyncingWithTruePref', function() {
+        testElement.syncStatus = {signedIn: false};
+        sync_test_util.simulateStoredAccounts([
+          {
+            fullName: 'testName',
+            givenName: 'test',
+            email: 'test@test.com',
+          },
+        ]);
+        Polymer.dom.flush();
+
+        assertFalse(testElement.$.passwordsLeakDetectionCheckbox.disabled);
+        assertTrue(testElement.$.passwordsLeakDetectionCheckbox.checked);
+        assertEquals('', testElement.$.passwordsLeakDetectionCheckbox.subLabel);
+      });
+    }
+
+    test('leakDetectionToggleSignedInAndSyncingWithFalsePref', function() {
+      testElement.set(
+          'prefs.profile.password_manager_leak_detection.value', false);
+      testElement.syncStatus = {signedIn: true};
+      Polymer.dom.flush();
+
+      assertFalse(testElement.$.passwordsLeakDetectionCheckbox.disabled);
+      assertFalse(testElement.$.passwordsLeakDetectionCheckbox.checked);
+      assertEquals('', testElement.$.passwordsLeakDetectionCheckbox.subLabel);
+    });
+
+    test('leakDetectionToggleSignedInAndSyncingWithTruePref', function() {
+      testElement.syncStatus = {signedIn: true};
+      Polymer.dom.flush();
+
+      assertFalse(testElement.$.passwordsLeakDetectionCheckbox.disabled);
+      assertTrue(testElement.$.passwordsLeakDetectionCheckbox.checked);
+      assertEquals('', testElement.$.passwordsLeakDetectionCheckbox.subLabel);
+    });
   });
 
   suite('PersonalizationOptionsTests_OfficialBuild', function() {
diff --git a/chromecast/browser/webview/cast_app_rpc_instance.cc b/chromecast/browser/webview/cast_app_rpc_instance.cc
index c2eaf53..78cb002 100644
--- a/chromecast/browser/webview/cast_app_rpc_instance.cc
+++ b/chromecast/browser/webview/cast_app_rpc_instance.cc
@@ -55,6 +55,10 @@
 
   content::WebContents* web_contents =
       web_contents_provider_->GetWebContents(app_window_id);
+  if (!web_contents) {
+    OnError("web_contents is null");
+    return;
+  }
   Observe(web_contents);
   controller_ = std::make_unique<CastAppController>(this, web_contents);
   window_manager_->AddObserver(this);
diff --git a/chromecast/browser/webview/platform_views_rpc_instance.cc b/chromecast/browser/webview/platform_views_rpc_instance.cc
index dac920c0..bbfdcab 100644
--- a/chromecast/browser/webview/platform_views_rpc_instance.cc
+++ b/chromecast/browser/webview/platform_views_rpc_instance.cc
@@ -55,6 +55,16 @@
   }
 }
 
+void PlatformViewsRpcInstance::OnError(const std::string& error_message) {
+  std::unique_lock<std::mutex> l(send_lock_);
+  errored_ = true;
+  error_message_ = error_message;
+
+  if (!send_pending_)
+    io_.Finish(grpc::Status(grpc::UNKNOWN, error_message_), &destroy_callback_);
+  send_pending_ = true;
+}
+
 void PlatformViewsRpcInstance::ProcessRequestOnControllerThread(
     std::unique_ptr<webview::WebviewRequest> request) {
   controller_->ProcessRequest(*request.get());
@@ -127,16 +137,6 @@
   }
 }
 
-void PlatformViewsRpcInstance::OnError(const std::string& error_message) {
-  std::unique_lock<std::mutex> l(send_lock_);
-  errored_ = true;
-  error_message_ = error_message;
-
-  if (!send_pending_)
-    io_.Finish(grpc::Status(grpc::UNKNOWN, error_message_), &destroy_callback_);
-  send_pending_ = true;
-}
-
 void PlatformViewsRpcInstance::OnNewWebviewContainerWindow(aura::Window* window,
                                                            int app_id) {
   if (app_id != app_id_)
diff --git a/chromecast/browser/webview/platform_views_rpc_instance.h b/chromecast/browser/webview/platform_views_rpc_instance.h
index 26d87aa..678d9d6 100644
--- a/chromecast/browser/webview/platform_views_rpc_instance.h
+++ b/chromecast/browser/webview/platform_views_rpc_instance.h
@@ -39,6 +39,9 @@
   virtual void CreateNewInstance() = 0;
   virtual bool Initialize() = 0;
 
+  // WebContentController::Client:
+  void OnError(const std::string& error_message) override;
+
   grpc::ServerContext ctx_;
   grpc::ServerCompletionQueue* cq_;
   std::unique_ptr<webview::WebviewRequest> request_;
@@ -69,7 +72,6 @@
 
   // WebContentController::Client:
   void EnqueueSend(std::unique_ptr<webview::WebviewResponse> response) override;
-  void OnError(const std::string& error_message) override;
 
   // WebviewWindowManager::Observer:
   void OnNewWebviewContainerWindow(aura::Window* window, int app_id) override;
diff --git a/chromecast/media/audio/capture_service/BUILD.gn b/chromecast/media/audio/capture_service/BUILD.gn
index f907f3f..877df6c 100644
--- a/chromecast/media/audio/capture_service/BUILD.gn
+++ b/chromecast/media/audio/capture_service/BUILD.gn
@@ -2,7 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//build/buildflag_header.gni")
 import("//chromecast/chromecast.gni")
 import("//testing/libfuzzer/fuzzer_test.gni")
 import("//testing/test.gni")
@@ -28,7 +27,7 @@
   deps = [
     "//base",
     "//chromecast/base",
-    "//chromecast/media/audio:audio_buildflags",
+    "//chromecast/media/audio/mixer_service:audio_socket_service",
     "//chromecast/net:small_message_socket",
     "//media",
     "//net",
diff --git a/chromecast/media/audio/capture_service/capture_service_receiver.cc b/chromecast/media/audio/capture_service/capture_service_receiver.cc
index 55b4900..3fc1ea5a 100644
--- a/chromecast/media/audio/capture_service/capture_service_receiver.cc
+++ b/chromecast/media/audio/capture_service/capture_service_receiver.cc
@@ -14,24 +14,14 @@
 #include "base/message_loop/message_pump_type.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/sequenced_task_runner_handle.h"
-#include "chromecast/media/audio/audio_buildflags.h"
 #include "chromecast/media/audio/capture_service/constants.h"
 #include "chromecast/media/audio/capture_service/message_parsing_util.h"
+#include "chromecast/media/audio/mixer_service/audio_socket_service.h"
 #include "chromecast/net/small_message_socket.h"
 #include "media/base/limits.h"
 #include "net/base/io_buffer.h"
 #include "net/socket/stream_socket.h"
 
-#if BUILDFLAG(USE_UNIX_SOCKETS)
-#include "net/socket/unix_domain_client_socket_posix.h"
-#else
-#include "net/base/address_list.h"
-#include "net/base/ip_address.h"
-#include "net/base/ip_endpoint.h"
-#include "net/log/net_log_source.h"
-#include "net/socket/tcp_client_socket.h"
-#endif  // BUILDFLAG(USE_UNIX_SOCKETS)
-
 // Helper macro to post tasks to the io thread. It is safe to use unretained
 // |this|, since |this| owns the thread.
 #define ENSURE_ON_IO_THREAD(method, ...)                                   \
@@ -162,20 +152,10 @@
     ::media::AudioInputStream::AudioInputCallback* input_callback) {
   ENSURE_ON_IO_THREAD(Start, input_callback);
 
-#if BUILDFLAG(USE_UNIX_SOCKETS)
   std::string path = capture_service::kDefaultUnixDomainSocketPath;
-  std::unique_ptr<net::StreamSocket> connecting_socket =
-      std::make_unique<net::UnixDomainClientSocket>(
-          path, true /* use_abstract_namespace */);
-#else   // BUILDFLAG(USE_UNIX_SOCKETS)
   int port = capture_service::kDefaultTcpPort;
-  net::IPEndPoint endpoint(net::IPAddress::IPv4Localhost(), port);
-  std::unique_ptr<net::StreamSocket> connecting_socket =
-      std::make_unique<net::TCPClientSocket>(
-          net::AddressList(endpoint), nullptr, nullptr, net::NetLogSource());
-#endif  // BUILDFLAG(USE_UNIX_SOCKETS)
 
-  StartWithSocket(input_callback, std::move(connecting_socket));
+  StartWithSocket(input_callback, AudioSocketService::Connect(path, port));
 }
 
 void CaptureServiceReceiver::StartWithSocket(
diff --git a/chromecast/media/audio/mixer_service/BUILD.gn b/chromecast/media/audio/mixer_service/BUILD.gn
index 950c1e4e..ddf4621 100644
--- a/chromecast/media/audio/mixer_service/BUILD.gn
+++ b/chromecast/media/audio/mixer_service/BUILD.gn
@@ -51,10 +51,10 @@
   ]
 
   deps = [
+    ":audio_socket_service",
     ":common",
     "//base",
     "//chromecast/base",
-    "//chromecast/media/audio:audio_buildflags",
     "//net",
   ]
 }
diff --git a/chromecast/media/audio/mixer_service/audio_socket_service.cc b/chromecast/media/audio/mixer_service/audio_socket_service.cc
index 6841afc..db9c828 100644
--- a/chromecast/media/audio/mixer_service/audio_socket_service.cc
+++ b/chromecast/media/audio/mixer_service/audio_socket_service.cc
@@ -16,11 +16,14 @@
 #include "net/socket/stream_socket.h"
 
 #if BUILDFLAG(USE_UNIX_SOCKETS)
+#include "net/socket/unix_domain_client_socket_posix.h"
 #include "net/socket/unix_domain_server_socket_posix.h"
 #else
+#include "net/base/address_list.h"
 #include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
 #include "net/log/net_log_source.h"
+#include "net/socket/tcp_client_socket.h"
 #include "net/socket/tcp_server_socket.h"
 #endif
 
@@ -33,6 +36,20 @@
 
 }  // namespace
 
+// static
+std::unique_ptr<net::StreamSocket> AudioSocketService::Connect(
+    const std::string& endpoint,
+    int port) {
+#if BUILDFLAG(USE_UNIX_SOCKETS)
+  return std::make_unique<net::UnixDomainClientSocket>(
+      endpoint, true /* use_abstract_namespace */);
+#else   // BUILDFLAG(USE_UNIX_SOCKETS)
+  net::IPEndPoint ip_endpoint(net::IPAddress::IPv4Localhost(), port);
+  return std::make_unique<net::TCPClientSocket>(
+      net::AddressList(ip_endpoint), nullptr, nullptr, net::NetLogSource());
+#endif  // BUILDFLAG(USE_UNIX_SOCKETS)
+}
+
 AudioSocketService::AudioSocketService(const std::string& endpoint,
                                        int port,
                                        int max_accept_loop,
diff --git a/chromecast/media/audio/mixer_service/audio_socket_service.h b/chromecast/media/audio/mixer_service/audio_socket_service.h
index cc7bae1..00a0e963 100644
--- a/chromecast/media/audio/mixer_service/audio_socket_service.h
+++ b/chromecast/media/audio/mixer_service/audio_socket_service.h
@@ -47,6 +47,12 @@
   // Starts accepting incoming connections.
   void Accept();
 
+  // Creates a connection to an AudioSocketService instance. The |endpoint| is
+  // used on systems that support Unix domain sockets; otherwise, the |port| is
+  // used to make a TCP connection.
+  static std::unique_ptr<net::StreamSocket> Connect(const std::string& endpoint,
+                                                    int port);
+
  private:
   void OnAccept(int result);
   bool HandleAcceptResult(int result);
diff --git a/chromecast/media/audio/mixer_service/mixer_connection.cc b/chromecast/media/audio/mixer_service/mixer_connection.cc
index 953204e..4c11356 100644
--- a/chromecast/media/audio/mixer_service/mixer_connection.cc
+++ b/chromecast/media/audio/mixer_service/mixer_connection.cc
@@ -15,22 +15,12 @@
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/time/time.h"
 #include "chromecast/base/chromecast_switches.h"
-#include "chromecast/media/audio/audio_buildflags.h"
+#include "chromecast/media/audio/mixer_service/audio_socket_service.h"
 #include "chromecast/media/audio/mixer_service/constants.h"
 #include "chromecast/media/audio/mixer_service/mixer_socket.h"
-#include "net/base/address_list.h"
-#include "net/base/ip_address.h"
-#include "net/base/ip_endpoint.h"
 #include "net/base/net_errors.h"
-#include "net/log/net_log_source.h"
 #include "net/socket/stream_socket.h"
 
-#if BUILDFLAG(USE_UNIX_SOCKETS)
-#include "net/socket/unix_domain_client_socket_posix.h"
-#else
-#include "net/socket/tcp_client_socket.h"
-#endif
-
 namespace chromecast {
 namespace media {
 namespace mixer_service {
@@ -58,7 +48,6 @@
     }
   }
 
-#if BUILDFLAG(USE_UNIX_SOCKETS)
   const base::CommandLine* command_line =
       base::CommandLine::ForCurrentProcess();
   std::string path =
@@ -66,15 +55,9 @@
   if (path.empty()) {
     path = kDefaultUnixDomainSocketPath;
   }
-  connecting_socket_ = std::make_unique<net::UnixDomainClientSocket>(
-      path, true /* use_abstract_namespace */);
-#else   // BUILDFLAG(USE_UNIX_SOCKETS)
   int port = GetSwitchValueNonNegativeInt(switches::kMixerServiceEndpoint,
                                           kDefaultTcpPort);
-  net::IPEndPoint endpoint(net::IPAddress::IPv4Localhost(), port);
-  connecting_socket_ = std::make_unique<net::TCPClientSocket>(
-      net::AddressList(endpoint), nullptr, nullptr, net::NetLogSource());
-#endif  // BUILDFLAG(USE_UNIX_SOCKETS)
+  connecting_socket_ = AudioSocketService::Connect(path, port);
 
   int result = connecting_socket_->Connect(base::BindOnce(
       &MixerConnection::ConnectCallback, weak_factory_.GetWeakPtr()));
diff --git a/chromeos/services/assistant/public/features.cc b/chromeos/services/assistant/public/features.cc
index 61e59a76..71004d86 100644
--- a/chromeos/services/assistant/public/features.cc
+++ b/chromeos/services/assistant/public/features.cc
@@ -30,6 +30,13 @@
 const base::FeatureParam<int> kAssistantProactiveSuggestionsMaxWidth{
     &kAssistantProactiveSuggestions, "max-width", 280};
 
+// The desired corner radius (in dip) for the rich proactive suggestions entry
+// point. As the rich UI has yet to be defined, corner radius may need to be
+// dynamically modified later.
+const base::FeatureParam<int>
+    kAssistantProactiveSuggestionsRichEntryPointCornerRadius{
+        &kAssistantProactiveSuggestions, "rich-entry-point-corner-radius", 16};
+
 const base::FeatureParam<std::string>
     kAssistantProactiveSuggestionsServerExperimentIds{
         &kAssistantProactiveSuggestions, "server-experiment-ids", ""};
@@ -92,6 +99,10 @@
   return kAssistantProactiveSuggestionsMaxWidth.Get();
 }
 
+int GetProactiveSuggestionsRichEntryPointCornerRadius() {
+  return kAssistantProactiveSuggestionsRichEntryPointCornerRadius.Get();
+}
+
 std::string GetProactiveSuggestionsServerExperimentIds() {
   return kAssistantProactiveSuggestionsServerExperimentIds.Get();
 }
diff --git a/chromeos/services/assistant/public/features.h b/chromeos/services/assistant/public/features.h
index 1478364..0c0e2c0 100644
--- a/chromeos/services/assistant/public/features.h
+++ b/chromeos/services/assistant/public/features.h
@@ -89,6 +89,9 @@
 int GetProactiveSuggestionsMaxWidth();
 
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
+int GetProactiveSuggestionsRichEntryPointCornerRadius();
+
+COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
 std::string GetProactiveSuggestionsServerExperimentIds();
 
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
diff --git a/components/autofill/core/common/save_password_progress_logger.cc b/components/autofill/core/common/save_password_progress_logger.cc
index ac052cb..9826f08 100644
--- a/components/autofill/core/common/save_password_progress_logger.cc
+++ b/components/autofill/core/common/save_password_progress_logger.cc
@@ -428,6 +428,10 @@
       return "HttpAuthManager::DetachObserver";
     case SavePasswordProgressLogger::STRING_SHOW_ONBOARDING:
       return "Show onboarding experience and offer to save password";
+    case STRING_LEAK_DETECTION_DISABLED_FEATURE:
+      return "Leak detection disabled in settings";
+    case STRING_LEAK_DETECTION_DISABLED_SAFE_BROWSING:
+      return "Leak detection is off as the safe browsing is disabled";
     case STRING_LEAK_DETECTION_FINISHED:
       return "Leak detection finished with result";
     case STRING_LEAK_DETECTION_HASH_ERROR:
diff --git a/components/autofill/core/common/save_password_progress_logger.h b/components/autofill/core/common/save_password_progress_logger.h
index 0cc91be..945c41b 100644
--- a/components/autofill/core/common/save_password_progress_logger.h
+++ b/components/autofill/core/common/save_password_progress_logger.h
@@ -150,6 +150,8 @@
     STRING_HTTPAUTH_ON_SET_OBSERVER,
     STRING_HTTPAUTH_ON_DETACH_OBSERVER,
     STRING_SHOW_ONBOARDING,
+    STRING_LEAK_DETECTION_DISABLED_FEATURE,
+    STRING_LEAK_DETECTION_DISABLED_SAFE_BROWSING,
     STRING_LEAK_DETECTION_FINISHED,
     STRING_LEAK_DETECTION_HASH_ERROR,
     STRING_LEAK_DETECTION_INVALID_SERVER_RESPONSE_ERROR,
diff --git a/components/content_settings/core/browser/content_settings_default_provider.cc b/components/content_settings/core/browser/content_settings_default_provider.cc
index 01dcd04..283c24ed 100644
--- a/components/content_settings/core/browser/content_settings_default_provider.cc
+++ b/components/content_settings/core/browser/content_settings_default_provider.cc
@@ -197,7 +197,7 @@
                             CONTENT_SETTING_NUM_SETTINGS);
 #endif
   pref_change_registrar_.Init(prefs_);
-  PrefChangeRegistrar::NamedChangeCallback callback = base::Bind(
+  PrefChangeRegistrar::NamedChangeCallback callback = base::BindRepeating(
       &DefaultProvider::OnPreferenceChanged, base::Unretained(this));
   WebsiteSettingsRegistry* website_settings =
       WebsiteSettingsRegistry::GetInstance();
diff --git a/components/content_settings/core/browser/content_settings_policy_provider.cc b/components/content_settings/core/browser/content_settings_policy_provider.cc
index 33d44c9..4e40384 100644
--- a/components/content_settings/core/browser/content_settings_policy_provider.cc
+++ b/components/content_settings/core/browser/content_settings_policy_provider.cc
@@ -168,8 +168,8 @@
   ReadManagedContentSettings(false);
 
   pref_change_registrar_.Init(prefs_);
-  PrefChangeRegistrar::NamedChangeCallback callback =
-      base::Bind(&PolicyProvider::OnPreferenceChanged, base::Unretained(this));
+  PrefChangeRegistrar::NamedChangeCallback callback = base::BindRepeating(
+      &PolicyProvider::OnPreferenceChanged, base::Unretained(this));
   pref_change_registrar_.Add(
       prefs::kManagedAutoSelectCertificateForUrls, callback);
   pref_change_registrar_.Add(prefs::kManagedCookiesAllowedForUrls, callback);
diff --git a/components/content_settings/core/browser/content_settings_pref.cc b/components/content_settings/core/browser/content_settings_pref.cc
index ecb90d5c..e41ff42 100644
--- a/components/content_settings/core/browser/content_settings_pref.cc
+++ b/components/content_settings/core/browser/content_settings_pref.cc
@@ -92,9 +92,9 @@
 
   ReadContentSettingsFromPref();
 
-  registrar_->Add(
-      pref_name_,
-      base::Bind(&ContentSettingsPref::OnPrefChanged, base::Unretained(this)));
+  registrar_->Add(pref_name_,
+                  base::BindRepeating(&ContentSettingsPref::OnPrefChanged,
+                                      base::Unretained(this)));
 }
 
 ContentSettingsPref::~ContentSettingsPref() {
diff --git a/components/content_settings/core/browser/content_settings_pref.h b/components/content_settings/core/browser/content_settings_pref.h
index 45db645d..178b15b 100644
--- a/components/content_settings/core/browser/content_settings_pref.h
+++ b/components/content_settings/core/browser/content_settings_pref.h
@@ -30,10 +30,11 @@
 // Represents a single pref for reading/writing content settings of one type.
 class ContentSettingsPref {
  public:
-  typedef base::Callback<void(const ContentSettingsPattern&,
-                              const ContentSettingsPattern&,
-                              ContentSettingsType,
-                              const std::string&)> NotifyObserversCallback;
+  typedef base::RepeatingCallback<void(const ContentSettingsPattern&,
+                                       const ContentSettingsPattern&,
+                                       ContentSettingsType,
+                                       const std::string&)>
+      NotifyObserversCallback;
 
   ContentSettingsPref(ContentSettingsType content_type,
                       PrefService* prefs,
diff --git a/components/content_settings/core/browser/content_settings_pref_provider.cc b/components/content_settings/core/browser/content_settings_pref_provider.cc
index 28ff257..bfc9a07 100644
--- a/components/content_settings/core/browser/content_settings_pref_provider.cc
+++ b/components/content_settings/core/browser/content_settings_pref_provider.cc
@@ -123,18 +123,18 @@
     if (!content_type_info || content_type_info->storage_behavior() ==
                                   ContentSettingsInfo::PERSISTENT) {
       content_settings_prefs_.insert(std::make_pair(
-          info->type(),
-          std::make_unique<ContentSettingsPref>(
-              info->type(), prefs_, &pref_change_registrar_, info->pref_name(),
-              off_the_record_,
-              base::Bind(&PrefProvider::Notify, base::Unretained(this)))));
+          info->type(), std::make_unique<ContentSettingsPref>(
+                            info->type(), prefs_, &pref_change_registrar_,
+                            info->pref_name(), off_the_record_,
+                            base::BindRepeating(&PrefProvider::Notify,
+                                                base::Unretained(this)))));
     } else if (info->type() == ContentSettingsType::PLUGINS) {
       // TODO(https://crbug.com/850062): Remove after M71, two milestones after
       // migration of the Flash permissions to ephemeral provider.
       flash_content_settings_pref_ = std::make_unique<ContentSettingsPref>(
           info->type(), prefs_, &pref_change_registrar_, info->pref_name(),
           off_the_record_,
-          base::Bind(&PrefProvider::Notify, base::Unretained(this)));
+          base::BindRepeating(&PrefProvider::Notify, base::Unretained(this)));
     }
   }
 
diff --git a/components/content_settings/core/browser/cookie_settings.cc b/components/content_settings/core/browser/cookie_settings.cc
index 3115eb6..84d150c6 100644
--- a/components/content_settings/core/browser/cookie_settings.cc
+++ b/components/content_settings/core/browser/cookie_settings.cc
@@ -34,12 +34,12 @@
   pref_change_registrar_.Init(prefs);
   pref_change_registrar_.Add(
       prefs::kBlockThirdPartyCookies,
-      base::Bind(&CookieSettings::OnCookiePreferencesChanged,
-                 base::Unretained(this)));
+      base::BindRepeating(&CookieSettings::OnCookiePreferencesChanged,
+                          base::Unretained(this)));
   pref_change_registrar_.Add(
       prefs::kCookieControlsMode,
-      base::Bind(&CookieSettings::OnCookiePreferencesChanged,
-                 base::Unretained(this)));
+      base::BindRepeating(&CookieSettings::OnCookiePreferencesChanged,
+                          base::Unretained(this)));
   OnCookiePreferencesChanged();
 }
 
diff --git a/components/content_settings/core/common/content_settings.h b/components/content_settings/core/common/content_settings.h
index 824c421..4eb3cf1 100644
--- a/components/content_settings/core/common/content_settings.h
+++ b/components/content_settings/core/common/content_settings.h
@@ -17,7 +17,7 @@
 // Different settings that can be assigned for a particular content type.  We
 // give the user the ability to set these on a global and per-origin basis.
 // A Java counterpart will be generated for this enum.
-// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.preferences.website
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.settings.website
 // GENERATED_JAVA_CLASS_NAME_OVERRIDE: ContentSettingValues
 //
 // TODO(nigeltao): migrate the Java users of this enum to the mojom-generated
diff --git a/components/cronet/cronet_url_request_context.cc b/components/cronet/cronet_url_request_context.cc
index dc9ac638..197f3cf 100644
--- a/components/cronet/cronet_url_request_context.cc
+++ b/components/cronet/cronet_url_request_context.cc
@@ -68,9 +68,9 @@
 // This class wraps a NetLog that also contains network change events.
 class NetLogWithNetworkChangeEvents {
  public:
-  NetLogWithNetworkChangeEvents() {}
+  NetLogWithNetworkChangeEvents() : net_log_(net::NetLog::Get()) {}
 
-  net::NetLog* net_log() { return &net_log_; }
+  net::NetLog* net_log() { return net_log_; }
   // This function registers with the NetworkChangeNotifier and so must be
   // called *after* the NetworkChangeNotifier is created. Should only be
   // called on the init thread as it is not thread-safe and the init thread is
@@ -85,11 +85,11 @@
     DCHECK(cronet::OnInitThread());
     if (net_change_logger_)
       return;
-    net_change_logger_.reset(new net::LoggingNetworkChangeObserver(&net_log_));
+    net_change_logger_.reset(new net::LoggingNetworkChangeObserver(net_log_));
   }
 
  private:
-  net::NetLog net_log_;
+  net::NetLog* net_log_;
   // LoggingNetworkChangeObserver logs network change events to a NetLog.
   // This class bundles one LoggingNetworkChangeObserver with one NetLog,
   // so network change event are logged just once in the NetLog.
@@ -288,8 +288,7 @@
       cronet::CreateProxyResolutionService(std::move(proxy_config_service),
                                            g_net_log.Get().net_log()));
 
-  config->ConfigureURLRequestContextBuilder(&context_builder,
-                                            g_net_log.Get().net_log());
+  config->ConfigureURLRequestContextBuilder(&context_builder);
   effective_experimental_options_ =
       std::move(config->effective_experimental_options);
 
diff --git a/components/cronet/ios/cronet_environment.h b/components/cronet/ios/cronet_environment.h
index 44999b36..3717a4ff 100644
--- a/components/cronet/ios/cronet_environment.h
+++ b/components/cronet/ios/cronet_environment.h
@@ -200,7 +200,7 @@
   scoped_refptr<net::URLRequestContextGetter> main_context_getter_;
   std::string user_agent_;
   bool user_agent_partial_;
-  std::unique_ptr<net::NetLog> net_log_;
+  net::NetLog* net_log_;
   std::unique_ptr<net::FileNetLogObserver> file_net_log_observer_;
   bool enable_pkp_bypass_for_local_trust_anchors_;
   double network_thread_priority_;
diff --git a/components/cronet/ios/cronet_environment.mm b/components/cronet/ios/cronet_environment.mm
index 67f8ae9..00eec63 100644
--- a/components/cronet/ios/cronet_environment.mm
+++ b/components/cronet/ios/cronet_environment.mm
@@ -243,7 +243,7 @@
       http_cache_(URLRequestContextConfig::HttpCacheType::DISK),
       user_agent_(user_agent),
       user_agent_partial_(user_agent_partial),
-      net_log_(new net::NetLog),
+      net_log_(net::NetLog::Get()),
       enable_pkp_bypass_for_local_trust_anchors_(true),
       network_thread_priority_(kKeepDefaultThreadPriority) {}
 
@@ -354,7 +354,7 @@
   // future.
   context_builder.set_transport_security_persister_path(base::FilePath());
 
-  config->ConfigureURLRequestContextBuilder(&context_builder, net_log_.get());
+  config->ConfigureURLRequestContextBuilder(&context_builder);
 
   effective_experimental_options_ =
       std::move(config->effective_experimental_options);
@@ -369,7 +369,7 @@
     cronet_prefs_manager_ = std::make_unique<CronetPrefsManager>(
         config->storage_path, GetNetworkThreadTaskRunner(),
         file_thread_->task_runner(), false /* nqe */, false /* host_cache */,
-        net_log_.get(), &context_builder);
+        net_log_, &context_builder);
   }
 
   context_builder.set_host_resolver(std::move(mapped_host_resolver));
diff --git a/components/cronet/stale_host_resolver_unittest.cc b/components/cronet/stale_host_resolver_unittest.cc
index e469923..60828f0 100644
--- a/components/cronet/stale_host_resolver_unittest.cc
+++ b/components/cronet/stale_host_resolver_unittest.cc
@@ -40,7 +40,6 @@
 #include "net/dns/public/dns_protocol.h"
 #include "net/dns/public/dns_query_type.h"
 #include "net/http/http_network_session.h"
-#include "net/log/net_log.h"
 #include "net/log/net_log_with_source.h"
 #include "net/proxy_resolution/proxy_config.h"
 #include "net/proxy_resolution/proxy_config_service_fixed.h"
@@ -698,8 +697,7 @@
       base::Optional<double>());
 
   net::URLRequestContextBuilder builder;
-  net::NetLog net_log;
-  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  config.ConfigureURLRequestContextBuilder(&builder);
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
       std::make_unique<net::ProxyConfigServiceFixed>(
diff --git a/components/cronet/url_request_context_config.cc b/components/cronet/url_request_context_config.cc
index 38934cf..f8aaec0 100644
--- a/components/cronet/url_request_context_config.cc
+++ b/components/cronet/url_request_context_config.cc
@@ -29,6 +29,7 @@
 #include "net/dns/mapped_host_resolver.h"
 #include "net/http/http_network_session.h"
 #include "net/http/http_server_properties.h"
+#include "net/log/net_log.h"
 #include "net/nqe/network_quality_estimator_params.h"
 #include "net/quic/quic_utils_chromium.h"
 #include "net/reporting/reporting_policy.h"
@@ -292,13 +293,10 @@
 
 void URLRequestContextConfig::ParseAndSetExperimentalOptions(
     net::URLRequestContextBuilder* context_builder,
-    net::HttpNetworkSession::Params* session_params,
-    net::NetLog* net_log) {
+    net::HttpNetworkSession::Params* session_params) {
   if (experimental_options.empty())
     return;
 
-  DCHECK(net_log);
-
   DVLOG(1) << "Experimental Options:" << experimental_options;
   std::unique_ptr<base::Value> options =
       base::JSONReader::ReadDeprecated(experimental_options);
@@ -699,7 +697,6 @@
 
   if (async_dns_enable || stale_dns_enable || host_resolver_rules_enable ||
       disable_ipv6_on_wifi) {
-    CHECK(net_log) << "All DNS-related experiments require NetLog.";
     std::unique_ptr<net::HostResolver> host_resolver;
     net::HostResolver::ManagerOptions host_resolver_manager_options;
     host_resolver_manager_options.insecure_dns_client_enabled =
@@ -711,11 +708,11 @@
       DCHECK(!disable_ipv6_on_wifi);
       host_resolver.reset(new StaleHostResolver(
           net::HostResolver::CreateStandaloneContextResolver(
-              net_log, std::move(host_resolver_manager_options)),
+              net::NetLog::Get(), std::move(host_resolver_manager_options)),
           stale_dns_options));
     } else {
       host_resolver = net::HostResolver::CreateStandaloneResolver(
-          net_log, std::move(host_resolver_manager_options));
+          net::NetLog::Get(), std::move(host_resolver_manager_options));
     }
     if (host_resolver_rules_enable) {
       std::unique_ptr<net::MappedHostResolver> remapped_resolver(
@@ -745,10 +742,7 @@
 }
 
 void URLRequestContextConfig::ConfigureURLRequestContextBuilder(
-    net::URLRequestContextBuilder* context_builder,
-    net::NetLog* net_log) {
-  DCHECK(net_log);
-
+    net::URLRequestContextBuilder* context_builder) {
   std::string config_cache;
   if (http_cache != DISABLED) {
     net::URLRequestContextBuilder::HttpCacheParams cache_params;
@@ -778,7 +772,7 @@
         kDefaultQuicGoAwaySessionsOnIpChange;
   }
 
-  ParseAndSetExperimentalOptions(context_builder, &session_params, net_log);
+  ParseAndSetExperimentalOptions(context_builder, &session_params);
   context_builder->set_http_network_session_params(session_params);
 
   if (mock_cert_verifier)
diff --git a/components/cronet/url_request_context_config.h b/components/cronet/url_request_context_config.h
index 56a550e..7c19ee07 100644
--- a/components/cronet/url_request_context_config.h
+++ b/components/cronet/url_request_context_config.h
@@ -21,7 +21,6 @@
 
 namespace net {
 class CertVerifier;
-class NetLog;
 class URLRequestContextBuilder;
 }  // namespace net
 
@@ -133,8 +132,7 @@
 
   // Configures |context_builder| based on |this|.
   void ConfigureURLRequestContextBuilder(
-      net::URLRequestContextBuilder* context_builder,
-      net::NetLog* net_log);
+      net::URLRequestContextBuilder* context_builder);
 
   // Enable QUIC.
   const bool enable_quic;
@@ -205,8 +203,7 @@
   // the URLRequestContextConfig and URLRequestContextBuilder.
   void ParseAndSetExperimentalOptions(
       net::URLRequestContextBuilder* context_builder,
-      net::HttpNetworkSession::Params* session_params,
-      net::NetLog* net_log);
+      net::HttpNetworkSession::Params* session_params);
 
   // Experimental options encoded as a string in a JSON format containing
   // experiments and their corresponding configuration options. The format
diff --git a/components/cronet/url_request_context_config_unittest.cc b/components/cronet/url_request_context_config_unittest.cc
index 71511f2..8278ce60 100644
--- a/components/cronet/url_request_context_config_unittest.cc
+++ b/components/cronet/url_request_context_config_unittest.cc
@@ -21,7 +21,6 @@
 #include "net/dns/host_resolver.h"
 #include "net/dns/host_resolver_manager.h"
 #include "net/http/http_network_session.h"
-#include "net/log/net_log.h"
 #include "net/log/net_log_with_source.h"
 #include "net/proxy_resolution/proxy_config.h"
 #include "net/proxy_resolution/proxy_config_service_fixed.h"
@@ -182,8 +181,7 @@
       base::Optional<double>(42.0));
 
   net::URLRequestContextBuilder builder;
-  net::NetLog net_log;
-  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  config.ConfigureURLRequestContextBuilder(&builder);
   EXPECT_FALSE(config.effective_experimental_options->HasKey("UnknownOption"));
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
@@ -339,8 +337,7 @@
       base::Optional<double>());
 
   net::URLRequestContextBuilder builder;
-  net::NetLog net_log;
-  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  config.ConfigureURLRequestContextBuilder(&builder);
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
       std::make_unique<net::ProxyConfigServiceFixed>(
@@ -392,8 +389,7 @@
       base::Optional<double>());
 
   net::URLRequestContextBuilder builder;
-  net::NetLog net_log;
-  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  config.ConfigureURLRequestContextBuilder(&builder);
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
       std::make_unique<net::ProxyConfigServiceFixed>(
@@ -445,8 +441,7 @@
       base::Optional<double>());
 
   net::URLRequestContextBuilder builder;
-  net::NetLog net_log;
-  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  config.ConfigureURLRequestContextBuilder(&builder);
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
       std::make_unique<net::ProxyConfigServiceFixed>(
@@ -506,8 +501,7 @@
       base::Optional<double>());
 
   net::URLRequestContextBuilder builder;
-  net::NetLog net_log;
-  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  config.ConfigureURLRequestContextBuilder(&builder);
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
       std::make_unique<net::ProxyConfigServiceFixed>(
@@ -568,8 +562,7 @@
       base::Optional<double>());
 
   net::URLRequestContextBuilder builder;
-  net::NetLog net_log;
-  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  config.ConfigureURLRequestContextBuilder(&builder);
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
       std::make_unique<net::ProxyConfigServiceFixed>(
@@ -630,8 +623,7 @@
       base::Optional<double>());
 
   net::URLRequestContextBuilder builder;
-  net::NetLog net_log;
-  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  config.ConfigureURLRequestContextBuilder(&builder);
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
       std::make_unique<net::ProxyConfigServiceFixed>(
@@ -693,8 +685,7 @@
       base::Optional<double>());
 
   net::URLRequestContextBuilder builder;
-  net::NetLog net_log;
-  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  config.ConfigureURLRequestContextBuilder(&builder);
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
       std::make_unique<net::ProxyConfigServiceFixed>(
@@ -759,8 +750,7 @@
       base::Optional<double>());
 
   net::URLRequestContextBuilder builder;
-  net::NetLog net_log;
-  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  config.ConfigureURLRequestContextBuilder(&builder);
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
       std::make_unique<net::ProxyConfigServiceFixed>(
@@ -810,8 +800,7 @@
       base::Optional<double>());
 
   net::URLRequestContextBuilder builder;
-  net::NetLog net_log;
-  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  config.ConfigureURLRequestContextBuilder(&builder);
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
       std::make_unique<net::ProxyConfigServiceFixed>(
@@ -861,8 +850,7 @@
       base::Optional<double>());
 
   net::URLRequestContextBuilder builder;
-  net::NetLog net_log;
-  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  config.ConfigureURLRequestContextBuilder(&builder);
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
       std::make_unique<net::ProxyConfigServiceFixed>(
@@ -914,8 +902,7 @@
       base::Optional<double>());
 
   net::URLRequestContextBuilder builder;
-  net::NetLog net_log;
-  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  config.ConfigureURLRequestContextBuilder(&builder);
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
       std::make_unique<net::ProxyConfigServiceFixed>(
@@ -970,8 +957,7 @@
       base::Optional<double>());
 
   net::URLRequestContextBuilder builder;
-  net::NetLog net_log;
-  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  config.ConfigureURLRequestContextBuilder(&builder);
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
       std::make_unique<net::ProxyConfigServiceFixed>(
@@ -1031,8 +1017,7 @@
       base::Optional<double>());
 
   net::URLRequestContextBuilder builder;
-  net::NetLog net_log;
-  config.ConfigureURLRequestContextBuilder(&builder, &net_log);
+  config.ConfigureURLRequestContextBuilder(&builder);
   // Set a ProxyConfigService to avoid DCHECK failure when building.
   builder.set_proxy_config_service(
       std::make_unique<net::ProxyConfigServiceFixed>(
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h
index a95098c..7e05e74d 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_compression_stats.h
@@ -42,7 +42,7 @@
 //
 // A Java counterpart will be generated for this enum.
 // GENERATED_JAVA_ENUM_PACKAGE: (
-//     org.chromium.chrome.browser.preferences.datareduction)
+//     org.chromium.chrome.browser.settings.datareduction)
 enum class DataReductionProxySavingsClearedReason {
   SYSTEM_CLOCK_MOVED_BACK,
   PREFS_PARSE_ERROR,
diff --git a/components/download/internal/common/download_item_impl_delegate.cc b/components/download/internal/common/download_item_impl_delegate.cc
index cba7a2d..4539e021 100644
--- a/components/download/internal/common/download_item_impl_delegate.cc
+++ b/components/download/internal/common/download_item_impl_delegate.cc
@@ -72,11 +72,6 @@
 
 void DownloadItemImplDelegate::OpenDownload(DownloadItemImpl* download) {}
 
-bool DownloadItemImplDelegate::IsMostRecentDownloadItemAtFilePath(
-    DownloadItemImpl* download) {
-  return true;
-}
-
 void DownloadItemImplDelegate::ShowDownloadInShell(DownloadItemImpl* download) {
 }
 
diff --git a/components/download/public/common/download_item_impl_delegate.h b/components/download/public/common/download_item_impl_delegate.h
index 5f0be3b..416c17bf 100644
--- a/components/download/public/common/download_item_impl_delegate.h
+++ b/components/download/public/common/download_item_impl_delegate.h
@@ -92,10 +92,6 @@
   // Opens the file associated with this download.
   virtual void OpenDownload(DownloadItemImpl* download);
 
-  // Returns whether this is the most recent download in the rare event where
-  // multiple downloads are associated with the same file path.
-  virtual bool IsMostRecentDownloadItemAtFilePath(DownloadItemImpl* download);
-
   // Shows the download via the OS shell.
   virtual void ShowDownloadInShell(DownloadItemImpl* download);
 
diff --git a/components/flags_ui/resources/flags.js b/components/flags_ui/resources/flags.js
index 5159031..68436ba 100644
--- a/components/flags_ui/resources/flags.js
+++ b/components/flags_ui/resources/flags.js
@@ -51,7 +51,7 @@
 
   // Add handlers to dynamically created HTML elements.
   let elements = document.getElementsByClassName('experiment-select');
-  for (let element of elements) {
+  for (const element of elements) {
     element.onchange = function() {
       const selectElement = /** @type {!HTMLSelectElement} */ (element);
       handleSelectExperimentalFeatureChoice(
@@ -63,7 +63,7 @@
   }
 
   elements = document.getElementsByClassName('experiment-enable-disable');
-  for (let element of elements) {
+  for (const element of elements) {
     element.onchange = function() {
       const selectElement = /** @type {!HTMLSelectElement} */ (element);
       handleEnableExperimentalFeature(
@@ -77,7 +77,7 @@
   }
 
   elements = document.getElementsByClassName('experiment-origin-list-value');
-  for (let element of elements) {
+  for (const element of elements) {
     element.onchange = function() {
       handleSetOriginListFlag(element, element.value);
       return false;
@@ -106,7 +106,7 @@
   // Toggling of experiment description overflow content on smaller screens.
   if(smallScreenCheck.matches){
     elements = document.querySelectorAll('.experiment .flex:first-child');
-    for (let element of elements) {
+    for (const element of elements) {
       element.onclick = () => element.classList.toggle('expand');
     }
   }
@@ -225,7 +225,7 @@
  * boolean}>, supported_platforms: !Array<string>
  * }}
  */
-var Feature;
+let Feature;
 
 /**
  * @typedef {{
@@ -237,7 +237,7 @@
  *  showOwnerWarning: boolean
  * }}
  */
-var ExperimentalFeaturesData;
+let ExperimentalFeaturesData;
 
 /**
  * Called by the WebUI to re-populate the page with data representing the
@@ -352,6 +352,13 @@
   experimentChangesUiUpdates(node, index);
 }
 
+/** @type {!FlagSearch.SearchContent} */
+const emptySearchContent = Object.freeze({
+  link: null,
+  title: null,
+  description: null,
+});
+
 /**
  * Handles in page searching. Matches against the experiment flag name.
  * @constructor
@@ -389,13 +396,6 @@
  */
 FlagSearch.SearchContent;
 
-/** @type {!FlagSearch.SearchContent} */
-var emptySearchContent = Object.freeze({
-  link: null,
-  title: null,
-  description: null,
-});
-
 /**
  * Get the singleton instance of FlagSearch.
  * @return {Object} Instance of FlagSearch.
diff --git a/components/ntp_tiles/most_visited_sites_unittest.cc b/components/ntp_tiles/most_visited_sites_unittest.cc
index 9831839..c5dde30 100644
--- a/components/ntp_tiles/most_visited_sites_unittest.cc
+++ b/components/ntp_tiles/most_visited_sites_unittest.cc
@@ -214,12 +214,6 @@
   MOCK_METHOD1(AddCallback,
                std::unique_ptr<ResponseCallbackList::Subscription>(
                    const ResponseCallback& callback));
-  MOCK_METHOD2(GetPageThumbnail,
-               void(const GURL& url, const BitmapCallback& callback));
-  MOCK_METHOD3(GetPageThumbnailWithURL,
-               void(const GURL& url,
-                    const GURL& thumbnail_url,
-                    const BitmapCallback& callback));
   MOCK_METHOD1(BlacklistURL, bool(const GURL& candidate_url));
   MOCK_METHOD1(UndoBlacklistURL, bool(const GURL& url));
   MOCK_METHOD0(ClearBlacklist, void());
diff --git a/components/password_manager/core/browser/credential_manager_impl_unittest.cc b/components/password_manager/core/browser/credential_manager_impl_unittest.cc
index e7eb9d7..2349dc8 100644
--- a/components/password_manager/core/browser/credential_manager_impl_unittest.cc
+++ b/components/password_manager/core/browser/credential_manager_impl_unittest.cc
@@ -27,6 +27,7 @@
 #include "components/password_manager/core/common/password_manager_pref_names.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
+#include "components/safe_browsing/common/safe_browsing_prefs.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -90,6 +91,10 @@
         prefs::kWasAutoSignInFirstRunExperienceShown, true);
     prefs_->registry()->RegisterBooleanPref(
         prefs::kPasswordLeakDetectionEnabled, true);
+#if !defined(OS_IOS)
+    prefs_->registry()->RegisterBooleanPref(::prefs::kSafeBrowsingEnabled,
+                                            true);
+#endif
   }
   ~MockPasswordManagerClient() override {}
 
diff --git a/components/password_manager/core/browser/leak_detection_delegate.cc b/components/password_manager/core/browser/leak_detection_delegate.cc
index a469334b..34230660 100644
--- a/components/password_manager/core/browser/leak_detection_delegate.cc
+++ b/components/password_manager/core/browser/leak_detection_delegate.cc
@@ -5,6 +5,7 @@
 #include "components/password_manager/core/browser/leak_detection_delegate.h"
 
 #include "base/metrics/histogram_functions.h"
+#include "build/build_config.h"
 #include "components/autofill/core/common/password_form.h"
 #include "components/autofill/core/common/save_password_progress_logger.h"
 #include "components/password_manager/core/browser/compromised_credentials_table.h"
@@ -18,12 +19,23 @@
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "components/password_manager/core/common/password_manager_pref_names.h"
 #include "components/prefs/pref_service.h"
+#include "components/safe_browsing/common/safe_browsing_prefs.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace password_manager {
+namespace {
 
 using Logger = autofill::SavePasswordProgressLogger;
 
+void LogString(PasswordManagerClient* client, Logger::StringID string_id) {
+  if (password_manager_util::IsLoggingActive(client)) {
+    BrowserSavePasswordProgressLogger logger(client->GetLogManager());
+    logger.LogMessage(string_id);
+  }
+}
+
+}  // namespace
+
 LeakDetectionDelegate::LeakDetectionDelegate(PasswordManagerClient* client)
     : client_(client),
       leak_factory_(std::make_unique<LeakDetectionCheckFactoryImpl>()) {}
@@ -36,9 +48,15 @@
 
   if (!client_->GetPrefs()->GetBoolean(
           password_manager::prefs::kPasswordLeakDetectionEnabled)) {
+    LogString(client_, Logger::STRING_LEAK_DETECTION_DISABLED_FEATURE);
     return;
   }
-
+#if !defined(OS_IOS)
+  if (!client_->GetPrefs()->GetBoolean(::prefs::kSafeBrowsingEnabled)) {
+    LogString(client_, Logger::STRING_LEAK_DETECTION_DISABLED_SAFE_BROWSING);
+    return;
+  }
+#endif
   if (form.username_value.empty())
     return;
 
diff --git a/components/password_manager/core/browser/leak_detection_delegate_unittest.cc b/components/password_manager/core/browser/leak_detection_delegate_unittest.cc
index 4a88a2b..fc2669c 100644
--- a/components/password_manager/core/browser/leak_detection_delegate_unittest.cc
+++ b/components/password_manager/core/browser/leak_detection_delegate_unittest.cc
@@ -4,13 +4,13 @@
 
 #include <utility>
 
-#include "components/password_manager/core/browser/leak_detection_delegate.h"
-
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
+#include "build/build_config.h"
 #include "components/password_manager/core/browser/leak_detection/leak_detection_check.h"
+#include "components/password_manager/core/browser/leak_detection_delegate.h"
 #include "components/password_manager/core/browser/mock_password_store.h"
 #include "components/password_manager/core/browser/stub_password_manager_client.h"
 #include "components/password_manager/core/common/password_manager_features.h"
@@ -18,6 +18,7 @@
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/testing_pref_service.h"
+#include "components/safe_browsing/common/safe_browsing_prefs.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -78,6 +79,10 @@
     delegate_.set_leak_factory(std::move(mock_factory));
     pref_service_->registry()->RegisterBooleanPref(
         password_manager::prefs::kPasswordLeakDetectionEnabled, true);
+#if !defined(OS_IOS)
+    pref_service_->registry()->RegisterBooleanPref(
+        ::prefs::kSafeBrowsingEnabled, true);
+#endif
     ON_CALL(client_, GetPrefs()).WillByDefault(Return(pref_service()));
   }
 
@@ -123,6 +128,17 @@
   EXPECT_FALSE(delegate().leak_check());
 }
 
+#if !defined(OS_IOS)
+TEST_F(LeakDetectionDelegateTest, SafeBrowsingOff) {
+  pref_service()->SetBoolean(::prefs::kSafeBrowsingEnabled, false);
+
+  EXPECT_CALL(factory(), TryCreateLeakCheck).Times(0);
+  delegate().StartLeakCheck(CreateTestForm());
+
+  EXPECT_FALSE(delegate().leak_check());
+}
+#endif
+
 TEST_F(LeakDetectionDelegateTest, UsernameIsEmpty) {
   autofill::PasswordForm form = CreateTestForm();
   form.username_value.clear();
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc
index d82f622..814cbf7 100644
--- a/components/password_manager/core/browser/password_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -46,6 +46,7 @@
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/testing_pref_service.h"
+#include "components/safe_browsing/common/safe_browsing_prefs.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "net/cert/cert_status_flags.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
@@ -334,6 +335,10 @@
         prefs::kWasOnboardingFeatureCheckedBefore, false);
     prefs_->registry()->RegisterBooleanPref(
         prefs::kPasswordLeakDetectionEnabled, true);
+#if !defined(OS_IOS)
+    prefs_->registry()->RegisterBooleanPref(::prefs::kSafeBrowsingEnabled,
+                                            true);
+#endif
     ON_CALL(client_, GetPrefs()).WillByDefault(Return(prefs_.get()));
 
     // When waiting for predictions is on, it makes tests more complicated.
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index bfe17c58..36e54ac 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -1615,6 +1615,29 @@
       If this policy is set to False, users will not be able to play the dinosaur easter egg game when device is offline. If this setting is set to True, users are allowed to play the dinosaur game. If this policy is not set, users are not allowed to play the dinosaur easter egg game on enrolled Chrome OS, but are allowed to play it under other circumstances.''',
     },
     {
+      'name': 'ForceLegacyDefaultReferrerPolicy',
+      'owners': ['davidvc@chromium.org', 'chrome-network-stack@chromium.org'],
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      'supported_on': ['chrome.*:80-', 'chrome_os:80-'],
+      'deprecated': True,
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': False,
+      },
+      'example_value': False,
+      'id': 648,
+      'caption': '''Use a default referrer policy of no-referrer-when-downgrade.''',
+      'tags': [],
+      'desc': '''This enterprise policy is for short-term adaptation and will be removed in M82.
+
+      Chrome's default referrer policy is being strengthened from its current value of no-referrer-when-downgrade to the more secure strict-origin-when-cross-origin through a gradual rollout targeting M80 stable.
+
+      Before the rollout, this enterprise policy will have no effect. After the rollout, when this enterprise policy is enabled, Chrome's default referrer policy will be set to its pre-M80 value of no-referrer-when-downgrade.
+
+      This enterprise policy is disabled by default.''',
+    },
+    {
       'name': 'RemoteAccessClientFirewallTraversal',
       'owners': ['jamiewalch@chromium.org', 'rkjnsn@chromium.org'],
       'type': 'main',
@@ -19942,6 +19965,6 @@
   ],
   'placeholders': [],
   'deleted_policy_ids': [412, 546, 562, 569],
-  'highest_id_currently_used': 647,
+  'highest_id_currently_used': 648,
   'highest_atomic_group_id_currently_used': 38
 }
diff --git a/components/safe_browsing/password_protection/password_protection_service.cc b/components/safe_browsing/password_protection/password_protection_service.cc
index 076b1a2..566a2d01 100644
--- a/components/safe_browsing/password_protection/password_protection_service.cc
+++ b/components/safe_browsing/password_protection/password_protection_service.cc
@@ -63,6 +63,18 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (history_service)
     history_service_observer_.Add(history_service);
+
+  common_spoofed_domains_ = {
+      "login.live.com"
+      "facebook.com",
+      "box.com",
+      "paypal.com",
+      "apple.com",
+      "yahoo.com",
+      "adobe.com",
+      "amazon.com",
+      "linkedin.com",
+      "att.com"};
 }
 
 PasswordProtectionService::~PasswordProtectionService() {
diff --git a/components/safe_browsing/password_protection/password_protection_service.h b/components/safe_browsing/password_protection/password_protection_service.h
index e6ee481..a242cb2 100644
--- a/components/safe_browsing/password_protection/password_protection_service.h
+++ b/components/safe_browsing/password_protection/password_protection_service.h
@@ -391,6 +391,10 @@
   virtual LoginReputationClientRequest::PasswordReuseEvent::SyncAccountType
   GetSyncAccountType() const = 0;
 
+  const std::list<std::string>& common_spoofed_domains() const {
+    return common_spoofed_domains_;
+  }
+
  private:
   friend class PasswordProtectionServiceTest;
   friend class TestPasswordProtectionService;
@@ -465,6 +469,10 @@
   // Set of PasswordProtectionRequests that are triggering modal warnings.
   std::set<scoped_refptr<PasswordProtectionRequest>> warning_requests_;
 
+  // List of most commonly spoofed domains to default to on the password warning
+  // dialog.
+  std::list<std::string> common_spoofed_domains_;
+
   ScopedObserver<history::HistoryService, history::HistoryServiceObserver>
       history_service_observer_{this};
 
diff --git a/components/safe_browsing/realtime/policy_engine.cc b/components/safe_browsing/realtime/policy_engine.cc
index afbce14..d0d777c 100644
--- a/components/safe_browsing/realtime/policy_engine.cc
+++ b/components/safe_browsing/realtime/policy_engine.cc
@@ -62,6 +62,9 @@
 // static
 bool RealTimePolicyEngine::CanPerformFullURLLookup(
     content::BrowserContext* browser_context) {
+  if (browser_context->IsOffTheRecord())
+    return false;
+
   if (IsEnabledByPolicy(browser_context))
     return true;
 
diff --git a/components/safe_browsing/realtime/policy_engine_unittest.cc b/components/safe_browsing/realtime/policy_engine_unittest.cc
index f05d4de..b4e7e44 100644
--- a/components/safe_browsing/realtime/policy_engine_unittest.cc
+++ b/components/safe_browsing/realtime/policy_engine_unittest.cc
@@ -105,6 +105,15 @@
 }
 
 TEST_F(RealTimePolicyEngineTest,
+       TestCanPerformFullURLLookup_DisabledOffTheRecord) {
+  base::test::ScopedFeatureList feature_list;
+  pref_service_.SetManagedPref(prefs::kSafeBrowsingRealTimeLookupEnabled,
+                               std::make_unique<base::Value>(true));
+  test_context_.set_is_off_the_record(true);
+  EXPECT_FALSE(CanPerformFullURLLookup());
+}
+
+TEST_F(RealTimePolicyEngineTest,
        TestCanPerformFullURLLookup_DisabledUserOptin) {
   ASSERT_FALSE(IsUserOptedIn());
 }
diff --git a/components/suggestions/suggestions_service.h b/components/suggestions/suggestions_service.h
index 1724a31..bb9940fe 100644
--- a/components/suggestions/suggestions_service.h
+++ b/components/suggestions/suggestions_service.h
@@ -15,17 +15,13 @@
 #include "components/suggestions/proto/suggestions.pb.h"
 #include "url/gurl.h"
 
-namespace gfx {
-class Image;
-}  // namespace gfx
-
 namespace suggestions {
 
 // An interface to fetch server suggestions asynchronously.
 class SuggestionsService : public KeyedService {
  public:
-  using ResponseCallback = base::Callback<void(const SuggestionsProfile&)>;
-  using BitmapCallback = base::Callback<void(const GURL&, const gfx::Image&)>;
+  using ResponseCallback =
+      base::RepeatingCallback<void(const SuggestionsProfile&)>;
 
   using ResponseCallbackList =
       base::CallbackList<void(const SuggestionsProfile&)>;
diff --git a/components/suggestions/webui/suggestions_source.cc b/components/suggestions/webui/suggestions_source.cc
index dad5aa2..91d8bd7 100644
--- a/components/suggestions/webui/suggestions_source.cc
+++ b/components/suggestions/webui/suggestions_source.cc
@@ -100,7 +100,7 @@
 SuggestionsSource::~SuggestionsSource() {}
 
 void SuggestionsSource::StartDataRequest(const std::string& path,
-                                         const GotDataCallback& callback) {
+                                         GotDataCallback callback) {
   // If this was called as "chrome://suggestions/refresh", we also trigger an
   // async update of the suggestions.
   bool is_refresh = (path == kRefreshPath);
@@ -108,7 +108,7 @@
   // |suggestions_service| is null for guest profiles.
   if (!suggestions_service_) {
     std::string output = RenderOutputHtmlNoSuggestions(base_url_, is_refresh);
-    callback.Run(base::RefCountedString::TakeString(&output));
+    std::move(callback).Run(base::RefCountedString::TakeString(&output));
     return;
   }
 
@@ -123,7 +123,7 @@
   std::string output =
       !size ? RenderOutputHtmlNoSuggestions(base_url_, is_refresh)
             : RenderOutputHtml(base_url_, is_refresh, suggestions_profile);
-  callback.Run(base::RefCountedString::TakeString(&output));
+  std::move(callback).Run(base::RefCountedString::TakeString(&output));
 }
 
 std::string SuggestionsSource::GetMimeType(const std::string& path) const {
diff --git a/components/suggestions/webui/suggestions_source.h b/components/suggestions/webui/suggestions_source.h
index 60366a6..6d7317f 100644
--- a/components/suggestions/webui/suggestions_source.h
+++ b/components/suggestions/webui/suggestions_source.h
@@ -25,10 +25,9 @@
   ~SuggestionsSource();
 
   using GotDataCallback =
-      base::Callback<void(scoped_refptr<base::RefCountedMemory>)>;
+      base::OnceCallback<void(scoped_refptr<base::RefCountedMemory>)>;
 
-  void StartDataRequest(const std::string& path,
-                        const GotDataCallback& callback);
+  void StartDataRequest(const std::string& path, GotDataCallback callback);
   std::string GetMimeType(const std::string& path) const;
 
  private:
diff --git a/components/viz/service/display/display_resource_provider.h b/components/viz/service/display/display_resource_provider.h
index 02e9b2a..cbc0377 100644
--- a/components/viz/service/display/display_resource_provider.h
+++ b/components/viz/service/display/display_resource_provider.h
@@ -15,7 +15,6 @@
 
 #include "base/containers/flat_map.h"
 #include "base/containers/small_map.h"
-#include "base/macros.h"
 #include "base/threading/thread_checker.h"
 #include "base/trace_event/memory_dump_provider.h"
 #include "build/build_config.h"
@@ -75,6 +74,9 @@
                           bool enable_shared_images = true);
   ~DisplayResourceProvider() override;
 
+  DisplayResourceProvider(const DisplayResourceProvider&) = delete;
+  DisplayResourceProvider& operator=(const DisplayResourceProvider&) = delete;
+
   bool IsSoftware() const { return mode_ == kSoftware; }
   void DidLoseContextProvider() { lost_context_provider_ = true; }
   size_t num_resources() const { return resources_.size(); }
@@ -137,6 +139,9 @@
                      ResourceId resource_id);
     ~ScopedReadLockGL();
 
+    ScopedReadLockGL(const ScopedReadLockGL&) = delete;
+    ScopedReadLockGL& operator=(const ScopedReadLockGL&) = delete;
+
     GLuint texture_id() const { return texture_id_; }
     GLenum target() const { return target_; }
     const gfx::Size& size() const { return size_; }
@@ -150,8 +155,6 @@
     GLenum target_ = GL_TEXTURE_2D;
     gfx::Size size_;
     gfx::ColorSpace color_space_;
-
-    DISALLOW_COPY_AND_ASSIGN(ScopedReadLockGL);
   };
 
   class VIZ_SERVICE_EXPORT ScopedSamplerGL {
@@ -165,6 +168,9 @@
                     GLenum filter);
     ~ScopedSamplerGL();
 
+    ScopedSamplerGL(const ScopedSamplerGL&) = delete;
+    ScopedSamplerGL& operator=(const ScopedSamplerGL&) = delete;
+
     GLuint texture_id() const { return resource_lock_.texture_id(); }
     GLenum target() const { return target_; }
     const gfx::ColorSpace& color_space() const {
@@ -175,8 +181,6 @@
     const ScopedReadLockGL resource_lock_;
     const GLenum unit_;
     const GLenum target_;
-
-    DISALLOW_COPY_AND_ASSIGN(ScopedSamplerGL);
   };
 
   class VIZ_SERVICE_EXPORT ScopedReadLockSkImage {
@@ -187,6 +191,10 @@
                           GrSurfaceOrigin origin = kTopLeft_GrSurfaceOrigin);
     ~ScopedReadLockSkImage();
 
+    ScopedReadLockSkImage(const ScopedReadLockSkImage&) = delete;
+    ScopedReadLockSkImage& operator=(const ScopedReadLockSkImage& other) =
+        delete;
+
     const SkImage* sk_image() const { return sk_image_.get(); }
     sk_sp<SkImage> TakeSkImage() { return std::move(sk_image_); }
 
@@ -196,8 +204,6 @@
     DisplayResourceProvider* const resource_provider_;
     const ResourceId resource_id_;
     sk_sp<SkImage> sk_image_;
-
-    DISALLOW_COPY_AND_ASSIGN(ScopedReadLockSkImage);
   };
 
  private:
@@ -213,6 +219,10 @@
                               ResourceId resource_id);
     ~ScopedReadLockSharedImage();
 
+    ScopedReadLockSharedImage(const ScopedReadLockSharedImage&) = delete;
+    ScopedReadLockSharedImage& operator=(const ScopedReadLockSharedImage&) =
+        delete;
+
     gpu::Mailbox mailbox() const;
     gpu::SyncToken sync_token() const;
 
@@ -228,10 +238,14 @@
     // There should be at most one instance of this class per
     // |resource_provider|. Both |resource_provider| and |client| outlive this
     // class.
-    LockSetForExternalUse(DisplayResourceProvider* resource_provider,
+    LockSetForExternalUse(DisplayResourceProvider* resourcqe_provider,
                           ExternalUseClient* client);
     ~LockSetForExternalUse();
 
+    LockSetForExternalUse(const LockSetForExternalUse&) = delete;
+    LockSetForExternalUse& operator=(const LockSetForExternalUse& other) =
+        delete;
+
     // Lock a resource for external use. The return value was created by
     // |client| at some point in the past.
     ExternalUseClient::ImageContext* LockResource(ResourceId resource_id,
@@ -247,8 +261,6 @@
    private:
     DisplayResourceProvider* const resource_provider_;
     std::vector<std::pair<ResourceId, ChildResource*>> resources_;
-
-    DISALLOW_COPY_AND_ASSIGN(LockSetForExternalUse);
   };
 
   // All resources that are returned to children while an instance of this
@@ -261,14 +273,15 @@
 
    private:
     DisplayResourceProvider* const resource_provider_;
-
-    DISALLOW_COPY_AND_ASSIGN(ScopedBatchReturnResources);
   };
 
   class VIZ_SERVICE_EXPORT SynchronousFence : public ResourceFence {
    public:
     explicit SynchronousFence(gpu::gles2::GLES2Interface* gl);
 
+    SynchronousFence(const SynchronousFence&) = delete;
+    SynchronousFence& operator=(const SynchronousFence&) = delete;
+
     // ResourceFence implementation.
     void Set() override;
     bool HasPassed() override;
@@ -283,8 +296,6 @@
 
     gpu::gles2::GLES2Interface* gl_;
     bool has_synchronized_;
-
-    DISALLOW_COPY_AND_ASSIGN(SynchronousFence);
   };
 
   // Sets the current read fence. If a resource is locked for read
@@ -537,8 +548,6 @@
 #endif
 
   bool enable_shared_images_;
-
-  DISALLOW_COPY_AND_ASSIGN(DisplayResourceProvider);
 };
 
 }  // namespace viz
diff --git a/components/viz/service/display/overlay_candidate_list.cc b/components/viz/service/display/overlay_candidate_list.cc
index 61db5ed..262911c5 100644
--- a/components/viz/service/display/overlay_candidate_list.cc
+++ b/components/viz/service/display/overlay_candidate_list.cc
@@ -48,27 +48,31 @@
   promotion_hint_requestor_set_.insert(id);
 }
 
-std::vector<DisplayResourceProvider::ScopedReadLockSharedImage>
+std::vector<std::unique_ptr<DisplayResourceProvider::ScopedReadLockSharedImage>>
 OverlayCandidateList::ConvertLocalPromotionToMailboxKeyed(
     DisplayResourceProvider* resource_provider,
     base::flat_set<gpu::Mailbox>* promotion_denied,
     base::flat_map<gpu::Mailbox, gfx::Rect>* possible_promotions) {
   DCHECK(empty() || size() == 1u);
-  std::vector<DisplayResourceProvider::ScopedReadLockSharedImage> locks;
+  std::vector<
+      std::unique_ptr<DisplayResourceProvider::ScopedReadLockSharedImage>>
+      locks;
   for (auto& request : promotion_hint_requestor_set_) {
     // If we successfully promote one candidate, then that promotion hint should
     // be sent later when we schedule the overlay.
     if (!empty() && front().resource_id == request)
       continue;
 
-    locks.emplace_back(resource_provider, request);
+    locks.emplace_back(
+        std::make_unique<DisplayResourceProvider::ScopedReadLockSharedImage>(
+            resource_provider, request));
     auto iter = promotion_hint_info_map_.find(request);
     if (iter != promotion_hint_info_map_.end()) {
       // This is a possible promotion.
-      possible_promotions->emplace(locks.back().mailbox(),
+      possible_promotions->emplace(locks.back()->mailbox(),
                                    gfx::ToEnclosedRect(iter->second));
     } else {
-      promotion_denied->insert(locks.back().mailbox());
+      promotion_denied->insert(locks.back()->mailbox());
     }
   }
   return locks;
diff --git a/components/viz/service/display/overlay_candidate_list.h b/components/viz/service/display/overlay_candidate_list.h
index f651dee4..5c66ce9d0 100644
--- a/components/viz/service/display/overlay_candidate_list.h
+++ b/components/viz/service/display/overlay_candidate_list.h
@@ -57,7 +57,8 @@
       const DisplayResourceProvider* resource_provider,
       const DrawQuad* quad);
 
-  std::vector<DisplayResourceProvider::ScopedReadLockSharedImage>
+  std::vector<
+      std::unique_ptr<DisplayResourceProvider::ScopedReadLockSharedImage>>
   ConvertLocalPromotionToMailboxKeyed(
       DisplayResourceProvider* resource_provider,
       base::flat_set<gpu::Mailbox>* promotion_denied,
diff --git a/components/viz/service/display/overlay_processor.cc b/components/viz/service/display/overlay_processor.cc
index fa600dd9..fe5c803 100644
--- a/components/viz/service/display/overlay_processor.cc
+++ b/components/viz/service/display/overlay_processor.cc
@@ -46,7 +46,7 @@
 
       std::vector<gpu::SyncToken> locks_sync_tokens;
       for (auto& read_lock : locks)
-        locks_sync_tokens.push_back(read_lock.sync_token());
+        locks_sync_tokens.push_back(read_lock->sync_token());
 
       skia_output_surface_->SendOverlayPromotionNotification(
           std::move(locks_sync_tokens), std::move(promotion_denied),
diff --git a/components/viz/service/display/skia_renderer.cc b/components/viz/service/display/skia_renderer.cc
index 8ee04c4..aed1148 100644
--- a/components/viz/service/display/skia_renderer.cc
+++ b/components/viz/service/display/skia_renderer.cc
@@ -791,7 +791,7 @@
   if (!current_frame()->overlay_list.empty()) {
     DCHECK_EQ(current_frame()->overlay_list.size(), 1u);
     overlay_resource_locks_.emplace_back(
-        DisplayResourceProvider::ScopedReadLockSharedImage(
+        std::make_unique<DisplayResourceProvider::ScopedReadLockSharedImage>(
             resource_provider_,
             current_frame()->overlay_list.front().resource_id));
     skia_output_surface_->RenderToOverlay(
@@ -799,7 +799,7 @@
         overlay_resource_locks_.back()->mailbox(),
         ToNearestRect(current_frame()->overlay_list.front().display_rect));
   } else {
-    overlay_resource_locks_.emplace_back(base::nullopt);
+    overlay_resource_locks_.emplace_back(nullptr);
   }
 #endif
 
diff --git a/components/viz/service/display/skia_renderer.h b/components/viz/service/display/skia_renderer.h
index cf8db60..92c05bf 100644
--- a/components/viz/service/display/skia_renderer.h
+++ b/components/viz/service/display/skia_renderer.h
@@ -314,7 +314,7 @@
   bool has_locked_overlay_resources_ = false;
 
   base::circular_deque<
-      base::Optional<DisplayResourceProvider::ScopedReadLockSharedImage>>
+      std::unique_ptr<DisplayResourceProvider::ScopedReadLockSharedImage>>
       overlay_resource_locks_;
 
   // Specific for SkPRecord.
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl.cc b/components/viz/service/display_embedder/skia_output_surface_impl.cc
index 9a425c4..2d0401b 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_impl.cc
@@ -54,40 +54,6 @@
 
 void DoNothing(void* texture_context) {}
 
-template <typename... Args>
-void PostAsyncTaskRepeatedly(
-    SkiaOutputSurfaceDependency* dependency,
-    const base::RepeatingCallback<void(Args...)>& callback,
-    Args... args) {
-  dependency->PostTaskToClientThread(base::BindOnce(callback, args...));
-}
-
-template <typename... Args>
-base::RepeatingCallback<void(Args...)> CreateSafeRepeatingCallback(
-    SkiaOutputSurfaceDependency* dependency,
-    const base::RepeatingCallback<void(Args...)>& callback) {
-  DCHECK(dependency);
-  return base::BindRepeating(&PostAsyncTaskRepeatedly<Args...>, dependency,
-                             callback);
-}
-
-template <typename... Args>
-void PostAsyncTaskOnce(SkiaOutputSurfaceDependency* dependency,
-                       base::OnceCallback<void(Args...)> callback,
-                       Args... args) {
-  dependency->PostTaskToClientThread(
-      base::BindOnce(std::move(callback), args...));
-}
-
-template <typename... Args>
-base::OnceCallback<void(Args...)> CreateSafeOnceCallback(
-    SkiaOutputSurfaceDependency* dependency,
-    base::OnceCallback<void(Args...)> callback) {
-  DCHECK(dependency);
-  return base::BindOnce(&PostAsyncTaskOnce<Args...>, dependency,
-                        std::move(callback));
-}
-
 gpu::ContextUrl& GetActiveUrl() {
   static base::NoDestructor<gpu::ContextUrl> active_url(
       GURL("chrome://gpu/SkiaRenderer"));
@@ -693,19 +659,32 @@
         base::BindOnce(&base::WaitableEvent::Signal, base::Unretained(event)));
   }
 
-  auto did_swap_buffer_complete_callback = CreateSafeRepeatingCallback(
-      dependency_.get(),
-      base::BindRepeating(&SkiaOutputSurfaceImpl::DidSwapBuffersComplete,
-                          weak_ptr_));
-  auto buffer_presented_callback = CreateSafeRepeatingCallback(
-      dependency_.get(),
-      base::BindRepeating(&SkiaOutputSurfaceImpl::BufferPresented, weak_ptr_));
-  auto context_lost_callback = CreateSafeOnceCallback(
-      dependency_.get(),
-      base::BindOnce(&SkiaOutputSurfaceImpl::ContextLost, weak_ptr_));
-  auto gpu_vsync_callback = CreateSafeRepeatingCallback(
-      dependency_.get(),
-      base::BindRepeating(&SkiaOutputSurfaceImpl::OnGpuVSync, weak_ptr_));
+  auto did_swap_buffer_complete_callback = base::BindRepeating(
+      &SkiaOutputSurfaceImpl::DidSwapBuffersComplete, weak_ptr_);
+  auto buffer_presented_callback =
+      base::BindRepeating(&SkiaOutputSurfaceImpl::BufferPresented, weak_ptr_);
+  auto context_lost_callback =
+      base::BindOnce(&SkiaOutputSurfaceImpl::ContextLost, weak_ptr_);
+
+  // This callback could be called from vsync or GPU thread after |this| is
+  // destroyed. We post directly to display compositor thread to check
+  // |weak_ptr_| as |dependency_| may have been destroyed.
+  GpuVSyncCallback gpu_vsync_callback =
+#if defined(OS_ANDROID)
+      // Callback is never used on Android. Doesn't work with WebView because
+      // calling it bypasses SkiaOutputSurfaceDependency.
+      base::DoNothing();
+#else
+      base::BindRepeating(
+          [](scoped_refptr<base::SingleThreadTaskRunner> runner,
+             base::WeakPtr<SkiaOutputSurfaceImpl> weak_ptr,
+             base::TimeTicks timebase, base::TimeDelta interval) {
+            runner->PostTask(FROM_HERE,
+                             base::BindOnce(&SkiaOutputSurfaceImpl::OnGpuVSync,
+                                            weak_ptr, timebase, interval));
+          },
+          base::ThreadTaskRunnerHandle::Get(), weak_ptr_);
+#endif
 
   impl_on_gpu_ = SkiaOutputSurfaceImplOnGpu::Create(
       dependency_.get(), renderer_settings_, task_sequence_->GetSequenceId(),
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 b145811..820263f 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
@@ -84,6 +84,25 @@
 
 namespace {
 
+template <typename... Args>
+void PostAsyncTaskRepeatedly(
+    base::WeakPtr<SkiaOutputSurfaceImplOnGpu> impl_on_gpu,
+    const base::RepeatingCallback<void(Args...)>& callback,
+    Args... args) {
+  // Callbacks generated by this function may be executed asynchronously
+  // (e.g. by presentation feedback) after |impl_on_gpu| has been destroyed.
+  if (impl_on_gpu)
+    impl_on_gpu->PostTaskToClientThread(base::BindOnce(callback, args...));
+}
+
+template <typename... Args>
+base::RepeatingCallback<void(Args...)> CreateSafeRepeatingCallback(
+    base::WeakPtr<SkiaOutputSurfaceImplOnGpu> impl_on_gpu,
+    const base::RepeatingCallback<void(Args...)>& callback) {
+  return base::BindRepeating(&PostAsyncTaskRepeatedly<Args...>, impl_on_gpu,
+                             callback);
+}
+
 struct ReadPixelsContext {
   ReadPixelsContext(std::unique_ptr<CopyOutputRequest> request,
                     const gfx::Rect& result_rect)
@@ -645,14 +664,18 @@
       dawn_context_provider_(dependency_->GetDawnContextProvider()),
       renderer_settings_(renderer_settings),
       sequence_id_(sequence_id),
-      did_swap_buffer_complete_callback_(
-          std::move(did_swap_buffer_complete_callback)),
-      buffer_presented_callback_(std::move(buffer_presented_callback)),
       context_lost_callback_(std::move(context_lost_callback)),
       gpu_vsync_callback_(std::move(gpu_vsync_callback)),
       gpu_preferences_(dependency_->GetGpuPreferences()),
       copier_active_url_(GURL("chrome://gpu/SkiaRendererGLRendererCopier")) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  weak_ptr_ = weak_ptr_factory_.GetWeakPtr();
+  did_swap_buffer_complete_callback_ = CreateSafeRepeatingCallback(
+      weak_ptr_, std::move(did_swap_buffer_complete_callback));
+  buffer_presented_callback_ = CreateSafeRepeatingCallback(
+      weak_ptr_, std::move(buffer_presented_callback));
+
   dependency_->RegisterDisplayContext(this);
 }
 
@@ -1297,7 +1320,6 @@
   TRACE_EVENT1("viz", "SkiaOutputSurfaceImplOnGpu::Initialize",
                "is_using_vulkan", is_using_vulkan());
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  weak_ptr_ = weak_ptr_factory_.GetWeakPtr();
 #if defined(USE_OZONE)
   window_surface_ =
       ui::OzonePlatform::GetInstance()
@@ -1591,7 +1613,7 @@
 void SkiaOutputSurfaceImplOnGpu::MarkContextLost() {
   context_state_->MarkContextLost();
   if (context_lost_callback_) {
-    std::move(context_lost_callback_).Run();
+    PostTaskToClientThread(std::move(context_lost_callback_));
     if (context_provider_)
       context_provider_->MarkContextLost();
   }
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
index 5d20f6ab..0fe6c9e9 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h
@@ -21,6 +21,7 @@
 #include "components/viz/service/display/output_surface_frame.h"
 #include "components/viz/service/display/overlay_processor.h"
 #include "components/viz/service/display_embedder/skia_output_device.h"
+#include "components/viz/service/display_embedder/skia_output_surface_dependency.h"
 #include "gpu/command_buffer/common/mailbox.h"
 #include "gpu/command_buffer/common/sync_token.h"
 #include "gpu/command_buffer/service/shared_context_state.h"
@@ -64,7 +65,6 @@
 class DirectContextProvider;
 class GLRendererCopier;
 class ImageContextImpl;
-class SkiaOutputSurfaceDependency;
 class TextureDeleter;
 class VulkanContextProvider;
 
@@ -84,6 +84,8 @@
       base::RepeatingCallback<void(const gfx::PresentationFeedback& feedback)>;
   using ContextLostCallback = base::OnceClosure;
 
+  // |gpu_vsync_callback| must be safe to call on any thread. The other
+  // callbacks will only be called via |deps->PostTaskToClientThread|.
   static std::unique_ptr<SkiaOutputSurfaceImplOnGpu> Create(
       SkiaOutputSurfaceDependency* deps,
       const RendererSettings& renderer_settings,
@@ -201,6 +203,10 @@
   // gpu::DisplayContext implementation:
   void MarkContextLost() override;
 
+  void PostTaskToClientThread(base::OnceClosure closure) {
+    dependency_->PostTaskToClientThread(std::move(closure));
+  }
+
  private:
   class ScopedPromiseImageAccess;
 
@@ -248,10 +254,10 @@
   // readback using GLRendererCopier.
   // TODO(samans): Remove |sequence_id| once readback always uses Skia.
   const gpu::SequenceId sequence_id_;
-  const DidSwapBufferCompleteCallback did_swap_buffer_complete_callback_;
-  const BufferPresentedCallback buffer_presented_callback_;
+  DidSwapBufferCompleteCallback did_swap_buffer_complete_callback_;
+  BufferPresentedCallback buffer_presented_callback_;
   ContextLostCallback context_lost_callback_;
-  const GpuVSyncCallback gpu_vsync_callback_;
+  GpuVSyncCallback gpu_vsync_callback_;
 
 #if defined(USE_OZONE)
   // This should outlive gl_surface_ and vulkan_surface_.
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc
index 17abc27..d13a558 100644
--- a/content/browser/accessibility/browser_accessibility_manager.cc
+++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -27,7 +27,7 @@
 
 namespace {
 // A function to call when focus changes, for testing only.
-base::LazyInstance<base::Closure>::DestructorAtExit
+base::LazyInstance<base::RepeatingClosure>::DestructorAtExit
     g_focus_change_callback_for_testing = LAZY_INSTANCE_INITIALIZER;
 
 // If 2 or more tree updates can all be merged into others,
@@ -668,8 +668,8 @@
 
 // static
 void BrowserAccessibilityManager::SetFocusChangeCallbackForTesting(
-    const base::Closure& callback) {
-  g_focus_change_callback_for_testing.Get() = callback;
+    base::RepeatingClosure callback) {
+  g_focus_change_callback_for_testing.Get() = std::move(callback);
 }
 
 void BrowserAccessibilityManager::SetGeneratedEventCallbackForTesting(
diff --git a/content/browser/accessibility/browser_accessibility_manager.h b/content/browser/accessibility/browser_accessibility_manager.h
index 4ba1c55c..0b5edb66 100644
--- a/content/browser/accessibility/browser_accessibility_manager.h
+++ b/content/browser/accessibility/browser_accessibility_manager.h
@@ -216,7 +216,7 @@
 
   // For testing only, register a function to be called when focus changes
   // in any BrowserAccessibilityManager.
-  static void SetFocusChangeCallbackForTesting(const base::Closure& callback);
+  static void SetFocusChangeCallbackForTesting(base::RepeatingClosure callback);
 
   // For testing only, register a function to be called when
   // a generated event is fired from this BrowserAccessibilityManager.
diff --git a/content/browser/android/background_sync_network_observer_android.cc b/content/browser/android/background_sync_network_observer_android.cc
index 9682d657..a47a5801 100644
--- a/content/browser/android/background_sync_network_observer_android.cc
+++ b/content/browser/android/background_sync_network_observer_android.cc
@@ -65,8 +65,8 @@
 }
 
 BackgroundSyncNetworkObserverAndroid::BackgroundSyncNetworkObserverAndroid(
-    const base::Closure& network_changed_callback)
-    : BackgroundSyncNetworkObserver(network_changed_callback) {
+    base::RepeatingClosure network_changed_callback)
+    : BackgroundSyncNetworkObserver(std::move(network_changed_callback)) {
   DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
 
   observer_ = Observer::Create(base::BindRepeating(
diff --git a/content/browser/android/background_sync_network_observer_android.h b/content/browser/android/background_sync_network_observer_android.h
index 5834774..3a37093 100644
--- a/content/browser/android/background_sync_network_observer_android.h
+++ b/content/browser/android/background_sync_network_observer_android.h
@@ -26,7 +26,7 @@
   // Creates a BackgroundSyncNetworkObserver. |network_changed_callback| is
   // called via PostMessage when the network connection changes.
   BackgroundSyncNetworkObserverAndroid(
-      const base::Closure& network_changed_callback);
+      base::RepeatingClosure network_changed_callback);
 
   ~BackgroundSyncNetworkObserverAndroid() override;
 
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc
index 791ba7bd..d48d0af 100644
--- a/content/browser/back_forward_cache_browsertest.cc
+++ b/content/browser/back_forward_cache_browsertest.cc
@@ -3947,32 +3947,6 @@
   EXPECT_TRUE(observer.did_fire());
 }
 
-// Check that back-forward cache is disabled when PermissionService is used.
-IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest, PermissionServiceContext) {
-  content::BackForwardCacheDisabledTester tester;
-  ASSERT_TRUE(embedded_test_server()->Start());
-  const GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html"));
-  const GURL url_b(embedded_test_server()->GetURL("b.com", "/title1.html"));
-
-  // 1) Navigate to A.
-  EXPECT_TRUE(NavigateToURL(shell(), url_a));
-  auto* rfh = current_frame_host();
-  int process_id = rfh->GetProcess()->GetID();
-  int frame_routing_id = rfh->GetRoutingID();
-
-  // 2) Invoke PermissionService.
-  EXPECT_TRUE(ExecJs(rfh, R"(
-          navigator.permissions.query({ name: "geolocation" })
-          )"));
-
-  // 3) Navigate to B.
-  EXPECT_TRUE(NavigateToURL(shell(), url_b));
-
-  // 4) Check that back-forward cache is disabled for A.
-  EXPECT_TRUE(tester.IsDisabledForFrameWithReason(process_id, frame_routing_id,
-                                                  "PermissionServiceContext"));
-}
-
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
                        SetsThemeColorWhenRestoredFromCache) {
   ASSERT_TRUE(embedded_test_server()->Start());
diff --git a/content/browser/background_sync/background_sync_network_observer.cc b/content/browser/background_sync/background_sync_network_observer.cc
index f15abda..e735ee8 100644
--- a/content/browser/background_sync/background_sync_network_observer.cc
+++ b/content/browser/background_sync/background_sync_network_observer.cc
@@ -25,10 +25,10 @@
 }
 
 BackgroundSyncNetworkObserver::BackgroundSyncNetworkObserver(
-    const base::RepeatingClosure& connection_changed_callback)
+    base::RepeatingClosure connection_changed_callback)
     : network_connection_tracker_(nullptr),
       connection_type_(network::mojom::ConnectionType::CONNECTION_UNKNOWN),
-      connection_changed_callback_(connection_changed_callback) {
+      connection_changed_callback_(std::move(connection_changed_callback)) {
   DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
   DCHECK(connection_changed_callback_);
 
diff --git a/content/browser/background_sync/background_sync_network_observer.h b/content/browser/background_sync/background_sync_network_observer.h
index 6652916..f9a8d6e 100644
--- a/content/browser/background_sync/background_sync_network_observer.h
+++ b/content/browser/background_sync/background_sync_network_observer.h
@@ -20,7 +20,7 @@
   // Creates a BackgroundSyncNetworkObserver. |network_changed_callback| is
   // called when the network connection changes asynchronously via PostMessage.
   BackgroundSyncNetworkObserver(
-      const base::RepeatingClosure& network_changed_callback);
+      base::RepeatingClosure network_changed_callback);
 
   ~BackgroundSyncNetworkObserver() override;
 
diff --git a/content/browser/browser_context.cc b/content/browser/browser_context.cc
index 8e4a7483..eafe367 100644
--- a/content/browser/browser_context.cc
+++ b/content/browser/browser_context.cc
@@ -805,4 +805,8 @@
   return nullptr;
 }
 
+bool BrowserContext::CanUseDiskWhenOffTheRecord() {
+  return false;
+}
+
 }  // namespace content
diff --git a/content/browser/download/download_browsertest.cc b/content/browser/download/download_browsertest.cc
index 225fd057..d309688 100644
--- a/content/browser/download/download_browsertest.cc
+++ b/content/browser/download/download_browsertest.cc
@@ -784,8 +784,8 @@
   }
 
  private:
-  void OnPauseHandler(const base::Closure& resume_callback) {
-    resume_callback_ = resume_callback;
+  void OnPauseHandler(base::OnceClosure resume_callback) {
+    resume_callback_ = std::move(resume_callback);
     if (run_loop_.running())
       run_loop_.Quit();
   }
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc
index 50fd424..2cab2bae 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/debug/alias.h"
+#include "base/files/file_util.h"
 #include "base/i18n/case_conversion.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
@@ -291,7 +292,11 @@
       is_history_download_id_retrieved_(false),
       should_persist_new_download_(false),
       cancelled_download_cleared_from_history_(0),
-      interrupted_download_cleared_from_history_(0) {
+      interrupted_download_cleared_from_history_(0),
+      disk_access_task_runner_(base::CreateSequencedTaskRunner(
+          {base::ThreadPool(), base::MayBlock(),
+           base::TaskPriority::BEST_EFFORT,
+           base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})) {
   DCHECK(browser_context);
 
   download::SetIOTaskRunner(
@@ -658,13 +663,16 @@
 void DownloadManagerImpl::CheckForFileRemoval(
     download::DownloadItemImpl* download_item) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  if ((download_item->GetState() == download::DownloadItem::COMPLETE) &&
-      !download_item->GetFileExternallyRemoved() && delegate_) {
-    delegate_->CheckForFileExistence(
-        download_item,
-        base::BindOnce(&DownloadManagerImpl::OnFileExistenceChecked,
-                       weak_factory_.GetWeakPtr(), download_item->GetId()));
+  if ((download_item->GetState() != download::DownloadItem::COMPLETE) ||
+      download_item->GetFileExternallyRemoved()) {
+    return;
   }
+
+  base::PostTaskAndReplyWithResult(
+      disk_access_task_runner_.get(), FROM_HERE,
+      base::BindOnce(&base::PathExists, download_item->GetTargetFilePath()),
+      base::BindOnce(&DownloadManagerImpl::OnFileExistenceChecked,
+                     weak_factory_.GetWeakPtr(), download_item->GetId()));
 }
 
 void DownloadManagerImpl::OnFileExistenceChecked(uint32_t download_id,
@@ -1136,12 +1144,6 @@
     delegate_->OpenDownload(download);
 }
 
-bool DownloadManagerImpl::IsMostRecentDownloadItemAtFilePath(
-    download::DownloadItemImpl* download) {
-  return delegate_ ? delegate_->IsMostRecentDownloadItemAtFilePath(download)
-                   : false;
-}
-
 void DownloadManagerImpl::ShowDownloadInShell(
     download::DownloadItemImpl* download) {
   if (delegate_)
diff --git a/content/browser/download/download_manager_impl.h b/content/browser/download/download_manager_impl.h
index f192166..b1c6b97b 100644
--- a/content/browser/download/download_manager_impl.h
+++ b/content/browser/download/download_manager_impl.h
@@ -206,9 +206,8 @@
       uint32_t id,
       const download::DownloadCreateInfo& info);
 
-  // Called with the result of DownloadManagerDelegate::CheckForFileExistence.
-  // Updates the state of the file and then notifies this update to the file's
-  // observer.
+  // Called with the result of CheckForFileExistence. Updates the state of the
+  // file and then notifies this update to the file's observer.
   void OnFileExistenceChecked(uint32_t download_id, bool result);
 
   // Overridden from DownloadItemImplDelegate
@@ -225,8 +224,6 @@
       std::unique_ptr<download::DownloadUrlParameters> params,
       const GURL& site_url) override;
   void OpenDownload(download::DownloadItemImpl* download) override;
-  bool IsMostRecentDownloadItemAtFilePath(
-      download::DownloadItemImpl* download) override;
   void ShowDownloadInShell(download::DownloadItemImpl* download) override;
   void DownloadRemoved(download::DownloadItemImpl* download) override;
   void DownloadInterrupted(download::DownloadItemImpl* download) override;
@@ -357,6 +354,11 @@
   using IdCallbackVector = std::vector<std::unique_ptr<GetNextIdCallback>>;
   IdCallbackVector id_callbacks_;
 
+  // SequencedTaskRunner to check for file existence. A sequence is used so
+  // that a large download history doesn't cause a large number of concurrent
+  // disk operations.
+  const scoped_refptr<base::SequencedTaskRunner> disk_access_task_runner_;
+
   base::WeakPtrFactory<DownloadManagerImpl> weak_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(DownloadManagerImpl);
diff --git a/content/browser/file_system/browser_file_system_helper.cc b/content/browser/file_system/browser_file_system_helper.cc
index c4b8c19..897a57a 100644
--- a/content/browser/file_system/browser_file_system_helper.cc
+++ b/content/browser/file_system/browser_file_system_helper.cc
@@ -131,6 +131,8 @@
   GetContentClient()->browser()->GetURLRequestAutoMountHandlers(
       &url_request_auto_mount_handlers);
 
+  auto options = CreateBrowserFileSystemOptions(
+      browser_context->CanUseDiskWhenOffTheRecord() ? false : is_incognito);
   scoped_refptr<storage::FileSystemContext> file_system_context =
       new storage::FileSystemContext(
           base::CreateSingleThreadTaskRunner({BrowserThread::IO}).get(),
@@ -138,7 +140,7 @@
           BrowserContext::GetMountPoints(browser_context),
           browser_context->GetSpecialStoragePolicy(), quota_manager_proxy,
           std::move(additional_backends), url_request_auto_mount_handlers,
-          profile_path, CreateBrowserFileSystemOptions(is_incognito));
+          profile_path, options);
 
   for (const storage::FileSystemType& type :
        file_system_context->GetFileSystemTypes()) {
diff --git a/content/browser/frame_host/navigation_controller_impl.cc b/content/browser/frame_host/navigation_controller_impl.cc
index 208f476..4933dc9 100644
--- a/content/browser/frame_host/navigation_controller_impl.cc
+++ b/content/browser/frame_host/navigation_controller_impl.cc
@@ -2277,8 +2277,10 @@
 
   // Don't allow an entry replacement if there is no entry to replace.
   // http://crbug.com/457149
-  if (should_replace_current_entry && GetEntryCount() > 0)
-    entry->set_should_replace_entry(true);
+  if (GetEntryCount() == 0)
+    should_replace_current_entry = false;
+
+  entry->set_should_replace_entry(should_replace_current_entry);
 
   bool override_user_agent = false;
   if (GetLastCommittedEntry() &&
@@ -2318,7 +2320,7 @@
   /* params.data_url_as_string: skip */
   params.post_data = post_body;
   params.can_load_local_resources = false;
-  params.should_replace_current_entry = false;
+  /* params.should_replace_current_entry: skip */
   /* params.frame_name: skip */
   // TODO(clamy): See if user gesture should be propagated to this function.
   params.has_user_gesture = false;
diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc
index fffd76fa4..7ec27de 100644
--- a/content/browser/frame_host/navigation_controller_impl_unittest.cc
+++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc
@@ -4843,6 +4843,44 @@
   BrowserURLHandlerImpl::GetInstance()->SetFixupHandlerForTesting(nullptr);
 }
 
+// Test that if an empty WebContents is navigated via frame proxy with
+// replacement, the NavigationRequest does not specify replacement, since there
+// is no entry to replace.
+TEST_F(NavigationControllerTest,
+       NavigateFromFrameProxyWithReplacementWithoutEntries) {
+  const GURL main_url("http://foo1");
+  const GURL other_contents_url("http://foo2");
+  NavigationSimulator::NavigateAndCommitFromBrowser(contents(), main_url);
+
+  // Suppose the main WebContents creates another WebContents which it can
+  // navigate via frame proxy.
+  std::unique_ptr<WebContents> other_contents = CreateTestWebContents();
+  TestWebContents* other_contents_impl =
+      static_cast<TestWebContents*>(other_contents.get());
+  NavigationControllerImpl& other_controller =
+      other_contents_impl->GetController();
+  FrameTreeNode* node = other_contents_impl->GetFrameTree()->root();
+  RenderFrameHostImpl* frame = node->current_frame_host();
+
+  // The newly created contents has no entries.
+  EXPECT_EQ(0, other_controller.GetEntryCount());
+
+  // Simulate the main WebContents navigating the new WebContents with
+  // replacement.
+  const bool should_replace_current_entry = true;
+  other_controller.NavigateFromFrameProxy(
+      frame, other_contents_url, url::Origin::Create(main_url),
+      true /* is_renderer_initiated */, main_test_rfh()->GetSiteInstance(),
+      Referrer(), ui::PAGE_TRANSITION_LINK, should_replace_current_entry,
+      NavigationDownloadPolicy(), "GET", nullptr, "", nullptr);
+  NavigationRequest* request = node->navigation_request();
+  ASSERT_TRUE(request);
+
+  // Since the new WebContents had no entries, the request is not done with
+  // replacement.
+  EXPECT_FALSE(request->common_params().should_replace_current_entry);
+}
+
 // Tests that calling RemoveForwareEntries() clears all forward entries
 // including non-committed entries.
 TEST_F(NavigationControllerTest, PruneForwardEntries) {
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index c97afef..31636eb8 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -5288,7 +5288,7 @@
   // happen. When reusing the same renderer, overwrite to recover the mode.
   if (is_view_source && IsCurrent()) {
     DCHECK(!GetParent());
-    render_view_host()->Send(new FrameMsg_EnableViewSourceMode(routing_id_));
+    GetAssociatedLocalFrame()->EnableViewSourceMode();
   }
 
   // TODO(lfg): The renderer is not able to handle a null response, so the
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 33c54c25..9a58285 100644
--- a/content/browser/frame_host/render_frame_host_manager_unittest.cc
+++ b/content/browser/frame_host/render_frame_host_manager_unittest.cc
@@ -50,6 +50,7 @@
 #include "content/public/common/url_constants.h"
 #include "content/public/common/url_utils.h"
 #include "content/public/test/browser_side_navigation_test_utils.h"
+#include "content/public/test/fake_local_frame.h"
 #include "content/public/test/mock_render_process_host.h"
 #include "content/public/test/test_utils.h"
 #include "content/test/mock_widget_input_handler.h"
@@ -761,6 +762,33 @@
   contents()->NavigateAndCommit(kUrl2);
 }
 
+// Stub out local frame mojo binding. Intercepts calls to EnableViewSourceMode
+// and marks the message as received. This class attaches to the first
+// RenderFrameHostImpl created.
+class EnableViewSourceLocalFrame : public content::FakeLocalFrame,
+                                   public WebContentsObserver {
+ public:
+  explicit EnableViewSourceLocalFrame(WebContents* web_contents)
+      : WebContentsObserver(web_contents) {}
+
+  void RenderFrameCreated(RenderFrameHost* render_frame_host) override {
+    if (!initialized_) {
+      initialized_ = true;
+      Init(render_frame_host->GetRemoteAssociatedInterfaces());
+    }
+  }
+
+  void EnableViewSourceMode() final { enabled_view_source_ = true; }
+
+  bool IsViewSourceModeEnabled() const { return enabled_view_source_; }
+
+  void ResetState() { enabled_view_source_ = false; }
+
+ private:
+  bool enabled_view_source_ = false;
+  bool initialized_ = false;
+};
+
 // When there is an error with the specified page, renderer exits view-source
 // mode. See WebFrameImpl::DidFail(). We check by this test that
 // EnableViewSourceMode message is sent on every navigation regardless
@@ -778,6 +806,8 @@
   // target code path.
   NavigationSimulator::NavigateAndCommitFromBrowser(contents(), kChromeUrl);
 
+  EnableViewSourceLocalFrame local_frame(contents());
+
   // Navigate. Note that "view source" URLs are implemented by putting the RFH
   // into a view-source mode and then navigating to the inner URL, so that's why
   // the bare URL is what's committed and returned by the last committed entry's
@@ -799,16 +829,16 @@
   EXPECT_EQ(kUrl, last_committed->GetURL());
   EXPECT_EQ(kViewSourceUrl, last_committed->GetVirtualURL());
   EXPECT_FALSE(controller().GetPendingEntry());
-  // Because we're using TestWebContents and TestRenderViewHost in this
-  // unittest, no one calls WebContentsImpl::RenderViewCreated(). So, we see no
-  // EnableViewSourceMode message, here.
 
-  // Clear queued messages before load.
-  process()->sink().ClearMessages();
+  // The RFH should have been put in view-source mode.
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(local_frame.IsViewSourceModeEnabled());
+  local_frame.ResetState();
 
   // Navigate, again.
   navigation = NavigationSimulatorImpl::CreateBrowserInitiated(kViewSourceUrl,
                                                                contents());
+
   navigation->set_did_create_new_entry(false);
   navigation->Start();
   request = main_test_rfh()->frame_tree_node()->navigation_request();
@@ -824,8 +854,8 @@
   EXPECT_FALSE(controller().GetPendingEntry());
 
   // New message should be sent out to make sure to enter view-source mode.
-  EXPECT_TRUE(process()->sink().GetUniqueMessageMatching(
-      FrameMsg_EnableViewSourceMode::ID));
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(local_frame.IsViewSourceModeEnabled());
 }
 
 // Tests the Init function by checking the initial RenderViewHost.
diff --git a/content/browser/geolocation/geolocation_service_impl_unittest.cc b/content/browser/geolocation/geolocation_service_impl_unittest.cc
index 3a9d597..a12ebac 100644
--- a/content/browser/geolocation/geolocation_service_impl_unittest.cc
+++ b/content/browser/geolocation/geolocation_service_impl_unittest.cc
@@ -190,7 +190,7 @@
       [] { ADD_FAILURE() << "Connection error handler called unexpectedly"; }));
 
   geolocation->QueryNextPosition(base::BindOnce(
-      [](base::Closure callback, GeopositionPtr geoposition) {
+      [](base::OnceClosure callback, GeopositionPtr geoposition) {
         EXPECT_DOUBLE_EQ(kMockLatitude, geoposition->latitude);
         EXPECT_DOUBLE_EQ(kMockLongitude, geoposition->longitude);
         std::move(callback).Run();
@@ -217,7 +217,7 @@
       [] { ADD_FAILURE() << "Connection error handler called unexpectedly"; }));
 
   geolocation->QueryNextPosition(base::BindOnce(
-      [](base::Closure callback, GeopositionPtr geoposition) {
+      [](base::OnceClosure callback, GeopositionPtr geoposition) {
         EXPECT_DOUBLE_EQ(kMockLatitude, geoposition->latitude);
         EXPECT_DOUBLE_EQ(kMockLongitude, geoposition->longitude);
         std::move(callback).Run();
@@ -269,7 +269,7 @@
       [] { ADD_FAILURE() << "Connection error handler called unexpectedly"; }));
 
   geolocation->QueryNextPosition(base::BindOnce(
-      [](base::Closure callback, GeopositionPtr geoposition) {
+      [](base::OnceClosure callback, GeopositionPtr geoposition) {
         EXPECT_DOUBLE_EQ(kMockLatitude, geoposition->latitude);
         EXPECT_DOUBLE_EQ(kMockLongitude, geoposition->longitude);
         std::move(callback).Run();
diff --git a/content/browser/indexed_db/indexed_db_backing_store.cc b/content/browser/indexed_db/indexed_db_backing_store.cc
index a29d3ad..9e50cfe9 100644
--- a/content/browser/indexed_db/indexed_db_backing_store.cc
+++ b/content/browser/indexed_db/indexed_db_backing_store.cc
@@ -1496,15 +1496,27 @@
   DISALLOW_COPY_AND_ASSIGN(ChainedBlobWriterImpl);
 };
 
-class LocalWriteClosure : public FileWriterDelegate::DelegateWriteCallback,
-                          public base::RefCountedThreadSafe<LocalWriteClosure> {
+// Collects the writing results given to FileWriterDelegate::Start's callback
+// before reporting success to the ChainedBlobWriter. Before forwarding the
+// completion result, this class also
+// 1. handles the case where an empty file needs to be created (the blob was
+//    empty), and
+// 2. sets the last_modified_time on the resulting file that was saved.
+// Created & used on the IO thread.
+class LocalWriteClosure : public base::RefCountedThreadSafe<LocalWriteClosure> {
  public:
-  LocalWriteClosure(ChainedBlobWriter* chained_blob_writer,
-                    base::SequencedTaskRunner* idb_task_runner)
-      : chained_blob_writer_(chained_blob_writer),
-        idb_task_runner_(idb_task_runner),
-        bytes_written_(0) {}
+  LocalWriteClosure(scoped_refptr<ChainedBlobWriter> chained_blob_writer,
+                    scoped_refptr<base::SequencedTaskRunner> idb_task_runner,
+                    FilePath file_path,
+                    base::Time last_modified)
+      : chained_blob_writer_(std::move(chained_blob_writer)),
+        idb_task_runner_(std::move(idb_task_runner)),
+        file_path_(std::move(file_path)),
+        last_modified_(last_modified) {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+  }
 
+  // Called on the IO thread.
   void Run(base::File::Error rv,
            int64_t bytes,
            FileWriterDelegate::WriteProgressStatus write_status) {
@@ -1521,45 +1533,68 @@
     }
 
     bool success = write_status == FileWriterDelegate::SUCCESS_COMPLETED;
-    if (success && !bytes_written_) {
-      // LocalFileStreamWriter only creates a file if data is actually written.
-      // If none was then create one now.
-      idb_task_runner_->PostTask(
-          FROM_HERE, base::BindOnce(&LocalWriteClosure::CreateEmptyFile, this));
-    } else if (success && !last_modified_.is_null()) {
-      idb_task_runner_->PostTask(
-          FROM_HERE, base::BindOnce(&LocalWriteClosure::UpdateTimeStamp, this));
-    } else {
-      idb_task_runner_->PostTask(
-          FROM_HERE,
-          base::BindOnce(&ChainedBlobWriter::ReportWriteCompletion,
-                         chained_blob_writer_, success, bytes_written_));
-    }
+
+    idb_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(
+            [](bool success, FilePath file_path, base::Time last_modified,
+               int64_t bytes_written,
+               scoped_refptr<ChainedBlobWriter> chained_blob_writer) {
+              if (success && !bytes_written) {
+                // Case 1: Success but no bytes were written, so just create an
+                // empty file (LocalFileStreamWriter only creates a file if data
+                // is actually written).
+                base::File file(file_path, base::File::FLAG_CREATE_ALWAYS |
+                                               base::File::FLAG_WRITE);
+                bool file_success = file.created();
+                if (file_success && !last_modified.is_null() &&
+                    !file.SetTimes(last_modified, last_modified)) {
+                  // TODO(cmumford): Complain quietly; timestamp's probably not
+                  // vital.
+                }
+                file.Close();
+              } else if (success && !last_modified.is_null()) {
+                // Case 2: Success and |last_modified| needs to be set. Set that
+                // before reporting write completion.
+                if (!base::TouchFile(file_path, last_modified, last_modified)) {
+                  // TODO(ericu): Complain quietly; timestamp's probably not
+                  // vital.
+                }
+              }
+              chained_blob_writer->ReportWriteCompletion(success,
+                                                         bytes_written);
+            },
+            success, file_path_, last_modified_, bytes_written_,
+            chained_blob_writer_));
   }
 
-  void WriteBlobToFileOnIOThread(const FilePath& file_path,
-                                 std::unique_ptr<storage::BlobDataHandle> blob,
-                                 const base::Time& last_modified) {
+  static void WriteBlobToFileOnIOThread(
+      scoped_refptr<ChainedBlobWriter> chained_blob_writer,
+      scoped_refptr<base::SequencedTaskRunner> idb_task_runner,
+      const FilePath& file_path,
+      std::unique_ptr<storage::BlobDataHandle> blob,
+      const base::Time& last_modified) {
     DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
     std::unique_ptr<storage::FileStreamWriter> writer =
         storage::FileStreamWriter::CreateForLocalFile(
-            idb_task_runner_.get(), file_path, 0,
+            idb_task_runner.get(), file_path, 0,
             storage::FileStreamWriter::CREATE_NEW_FILE);
     std::unique_ptr<FileWriterDelegate> delegate(
         std::make_unique<FileWriterDelegate>(
-            std::move(writer), chained_blob_writer_->GetFlushPolicy()));
+            std::move(writer), chained_blob_writer->GetFlushPolicy()));
 
     DCHECK(blob);
-    this->file_path_ = file_path;
-    this->last_modified_ = last_modified;
-
-    delegate->Start(blob->CreateReader(),
-                    base::BindRepeating(&LocalWriteClosure::Run, this));
-    chained_blob_writer_->set_delegate(std::move(delegate));
+    scoped_refptr<LocalWriteClosure> write_closure(new LocalWriteClosure(
+        chained_blob_writer, idb_task_runner, file_path, last_modified));
+    delegate->Start(
+        blob->CreateReader(),
+        base::BindRepeating(&LocalWriteClosure::Run, std::move(write_closure)));
+    chained_blob_writer->set_delegate(std::move(delegate));
   }
 
  private:
   virtual ~LocalWriteClosure() {
+    DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
     // Make sure the last reference to a ChainedBlobWriter is released (and
     // deleted) on the IDB sequence since it owns a transaction which has
     // sequence affinity.
@@ -1567,35 +1602,9 @@
   }
   friend class base::RefCountedThreadSafe<LocalWriteClosure>;
 
-  // If necessary, update the timestamps on the file as a final
-  // step before reporting success.
-  void UpdateTimeStamp() {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(idb_sequence_checker_);
-    if (!base::TouchFile(file_path_, last_modified_, last_modified_)) {
-      // TODO(ericu): Complain quietly; timestamp's probably not vital.
-    }
-    chained_blob_writer_->ReportWriteCompletion(true, bytes_written_);
-  }
-
-  // Create an empty file.
-  void CreateEmptyFile() {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(idb_sequence_checker_);
-    base::File file(file_path_,
-                    base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
-    bool success = file.created();
-    if (success && !last_modified_.is_null() &&
-        !file.SetTimes(last_modified_, last_modified_)) {
-      // TODO(cmumford): Complain quietly; timestamp's probably not vital.
-    }
-    file.Close();
-    chained_blob_writer_->ReportWriteCompletion(success, bytes_written_);
-  }
-
-  SEQUENCE_CHECKER(idb_sequence_checker_);
-
   scoped_refptr<ChainedBlobWriter> chained_blob_writer_;
   scoped_refptr<base::SequencedTaskRunner> idb_task_runner_;
-  int64_t bytes_written_;
+  int64_t bytes_written_ = 0;
 
   FilePath file_path_;
   base::Time last_modified_;
@@ -1645,12 +1654,11 @@
                                   chained_blob_writer, true, info.size));
   } else {
     DCHECK(descriptor.blob());
-    scoped_refptr<LocalWriteClosure> write_closure(
-        new LocalWriteClosure(chained_blob_writer, task_runner_.get()));
     base::PostTask(
         FROM_HERE, {content::BrowserThread::IO},
         base::BindOnce(
-            &LocalWriteClosure::WriteBlobToFileOnIOThread, write_closure, path,
+            &LocalWriteClosure::WriteBlobToFileOnIOThread,
+            base::WrapRefCounted(chained_blob_writer), task_runner_, path,
             std::make_unique<storage::BlobDataHandle>(*descriptor.blob()),
             descriptor.last_modified()));
   }
diff --git a/content/browser/net/network_errors_listing_ui.cc b/content/browser/net/network_errors_listing_ui.cc
index e6495a7ea..df437d5 100644
--- a/content/browser/net/network_errors_listing_ui.cc
+++ b/content/browser/net/network_errors_listing_ui.cc
@@ -91,8 +91,8 @@
   html_source->SetDefaultResource(IDR_NETWORK_ERROR_LISTING_HTML);
   html_source->SetRequestFilter(
       base::BindRepeating(&ShouldHandleWebUIRequestCallback),
-      base::Bind(&HandleWebUIRequestCallback,
-                 web_ui->GetWebContents()->GetBrowserContext()));
+      base::BindRepeating(&HandleWebUIRequestCallback,
+                          web_ui->GetWebContents()->GetBrowserContext()));
 
   BrowserContext* browser_context =
       web_ui->GetWebContents()->GetBrowserContext();
diff --git a/content/browser/net/quota_policy_cookie_store_unittest.cc b/content/browser/net/quota_policy_cookie_store_unittest.cc
index 63a6f84c..d63eb39 100644
--- a/content/browser/net/quota_policy_cookie_store_unittest.cc
+++ b/content/browser/net/quota_policy_cookie_store_unittest.cc
@@ -51,8 +51,8 @@
 
   void Load(CanonicalCookieVector* cookies) {
     EXPECT_FALSE(loaded_event_.IsSignaled());
-    store_->Load(base::Bind(&QuotaPolicyCookieStoreTest::OnLoaded,
-                            base::Unretained(this)),
+    store_->Load(base::BindOnce(&QuotaPolicyCookieStoreTest::OnLoaded,
+                                base::Unretained(this)),
                  net::NetLogWithSource());
     loaded_event_.Wait();
     cookies->swap(cookies_);
diff --git a/content/browser/permissions/permission_service_context.cc b/content/browser/permissions/permission_service_context.cc
index d41f739..c3ab8129 100644
--- a/content/browser/permissions/permission_service_context.cc
+++ b/content/browser/permissions/permission_service_context.cc
@@ -9,7 +9,6 @@
 #include "base/bind.h"
 #include "content/browser/permissions/permission_controller_impl.h"
 #include "content/browser/permissions/permission_service_impl.h"
-#include "content/public/browser/back_forward_cache.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/permission_controller.h"
@@ -150,14 +149,6 @@
   if (render_frame_host != render_frame_host_)
     return;
 
-  if (!services_.empty() || !subscriptions_.empty()) {
-    // |services_| and |subscriptions_| are destroyed here, so the page
-    // functionality might be broken if we restore the page from back-forward
-    // cache. Disable back-forward cache for this frame to ensure that this
-    // would not happen.
-    content::BackForwardCache::DisableForRenderFrameHost(
-        render_frame_host_, "PermissionServiceContext");
-  }
   services_.Clear();
   subscriptions_.clear();
 }
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc
index 3a700e2..99f59cb 100644
--- a/content/browser/renderer_host/compositor_impl_android.cc
+++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -189,8 +189,10 @@
     gpu::SharedMemoryLimits shared_memory_limits,
     Compositor::ContextProviderCallback callback,
     scoped_refptr<gpu::GpuChannelHost> gpu_channel_host) {
-  if (!gpu_channel_host)
+  if (!gpu_channel_host) {
     std::move(callback).Run(nullptr);
+    return;
+  }
 
   gpu::GpuChannelEstablishFactory* factory =
       BrowserMainLoop::GetInstance()->gpu_channel_establish_factory();
diff --git a/content/browser/renderer_host/render_process_host_browsertest.cc b/content/browser/renderer_host/render_process_host_browsertest.cc
index 4c93b20..0fd44d6 100644
--- a/content/browser/renderer_host/render_process_host_browsertest.cc
+++ b/content/browser/renderer_host/render_process_host_browsertest.cc
@@ -82,12 +82,12 @@
           base::BindOnce(&Resolver::ResolveInServerTaskRunner, this));
     }
 
-    void Add(const ResponseWithCallbacks& response) {
+    void Add(ResponseWithCallbacks response) {
       base::AutoLock auto_lock(lock_);
 
       if (resolved_) {
         response.send_callback.Run(response.response_string,
-                                   response.done_callback);
+                                   std::move(response.done_callback));
         return;
       }
 
@@ -99,16 +99,16 @@
         task_runner_ = std::move(task_runner);
       }
 
-      responses_with_callbacks_.push_back(response);
+      responses_with_callbacks_.push_back(std::move(response));
     }
 
    private:
     void ResolveInServerTaskRunner() {
       auto responses_with_callbacks = std::move(responses_with_callbacks_);
-      for (const auto& response_with_callbacks : responses_with_callbacks) {
+      for (auto& response_with_callbacks : responses_with_callbacks) {
         response_with_callbacks.send_callback.Run(
             response_with_callbacks.response_string,
-            response_with_callbacks.done_callback);
+            std::move(response_with_callbacks.done_callback));
       }
     }
 
@@ -130,10 +130,9 @@
   DelayedHttpResponseWithResolver& operator=(
       const DelayedHttpResponseWithResolver&) = delete;
 
-  void SendResponse(
-      const net::test_server::SendBytesCallback& send,
-      const net::test_server::SendCompleteCallback& done) override {
-    resolver_->Add({send, done, ToResponseString()});
+  void SendResponse(const net::test_server::SendBytesCallback& send,
+                    net::test_server::SendCompleteCallback done) override {
+    resolver_->Add({send, std::move(done), ToResponseString()});
   }
 
  private:
diff --git a/content/browser/service_manager/service_manager_context.cc b/content/browser/service_manager/service_manager_context.cc
index bd9f7cf7..54b8902 100644
--- a/content/browser/service_manager/service_manager_context.cc
+++ b/content/browser/service_manager/service_manager_context.cc
@@ -470,8 +470,8 @@
     metadata->SetPID(base::GetCurrentProcId());
 
     service_manager_->SetInstanceQuitCallback(
-        base::Bind(&OnInstanceQuitOnServiceManagerThread,
-                   std::move(ui_thread_task_runner)));
+        base::BindOnce(&OnInstanceQuitOnServiceManagerThread,
+                       std::move(ui_thread_task_runner)));
   }
 
   static void OnInstanceQuitOnServiceManagerThread(
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index 729fa8f..bd55e2b 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -2121,10 +2121,9 @@
         : response_(response) {}
     ~CustomResponse() override {}
 
-    void SendResponse(
-        const net::test_server::SendBytesCallback& send,
-        const net::test_server::SendCompleteCallback& done) override {
-      send.Run(response_, done);
+    void SendResponse(const net::test_server::SendBytesCallback& send,
+                      net::test_server::SendCompleteCallback done) override {
+      send.Run(response_, std::move(done));
     }
 
    private:
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index a1c4bd0ec..f1dba30 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -9339,10 +9339,11 @@
  private:
   // Called on the test server's thread.
   void AddDelayedResponse(const net::test_server::SendBytesCallback& send,
-                          const net::test_server::SendCompleteCallback& done) {
+                          net::test_server::SendCompleteCallback done) {
     // Just create a closure that closes the socket without sending a response.
     // This will propagate an error to the underlying request.
-    send_response_closures_.push_back(base::Bind(send, "", done));
+    send_response_closures_.push_back(
+        base::BindOnce(send, "", std::move(done)));
   }
 
   // Custom embedded test server handler. Looks for requests matching
@@ -9376,8 +9377,8 @@
       if (it.second > 0)
         return;
     }
-    for (const auto it : send_response_closures_) {
-      it.Run();
+    for (auto& it : send_response_closures_) {
+      std::move(it).Run();
     }
   }
 
@@ -9388,10 +9389,9 @@
     explicit DelayedResponse(
         RequestDelayingSitePerProcessBrowserTest* test_harness)
         : test_harness_(test_harness) {}
-    void SendResponse(
-        const net::test_server::SendBytesCallback& send,
-        const net::test_server::SendCompleteCallback& done) override {
-      test_harness_->AddDelayedResponse(send, done);
+    void SendResponse(const net::test_server::SendBytesCallback& send,
+                      net::test_server::SendCompleteCallback done) override {
+      test_harness_->AddDelayedResponse(send, std::move(done));
     }
 
    private:
@@ -9402,7 +9402,7 @@
 
   // Set of closures to call which will complete delayed requests. May only be
   // modified on the test_server_'s thread.
-  std::vector<base::Closure> send_response_closures_;
+  std::vector<base::OnceClosure> send_response_closures_;
 
   // Map from URL paths to the number of requests to delay for that particular
   // path. Initialized on the UI thread but modified and read on the test
diff --git a/content/browser/ssl/ssl_manager.cc b/content/browser/ssl/ssl_manager.cc
index 5d1ba89c..fe79f4f3 100644
--- a/content/browser/ssl/ssl_manager.cc
+++ b/content/browser/ssl/ssl_manager.cc
@@ -119,7 +119,7 @@
     const base::WeakPtr<SSLErrorHandler::Delegate>& delegate,
     bool is_main_frame_request,
     const GURL& url,
-    const base::Callback<WebContents*(void)>& web_contents_getter,
+    WebContents* web_contents,
     int net_error,
     const net::SSLInfo& ssl_info,
     bool fatal) {
@@ -129,7 +129,6 @@
            << ssl_info.cert_status;
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-  content::WebContents* web_contents = web_contents_getter.Run();
   std::unique_ptr<SSLErrorHandler> handler(
       new SSLErrorHandler(web_contents, delegate, is_main_frame_request, url,
                           net_error, ssl_info, fatal));
@@ -160,8 +159,8 @@
     const net::SSLInfo& ssl_info,
     bool fatal) {
   OnSSLCertificateError(delegate, false, url,
-                        base::Bind(&WebContentsImpl::FromRenderFrameHostID,
-                                   render_process_id, render_frame_id),
+                        WebContentsImpl::FromRenderFrameHostID(
+                            render_process_id, render_frame_id),
                         net_error, ssl_info, fatal);
 }
 
diff --git a/content/browser/ssl/ssl_manager.h b/content/browser/ssl/ssl_manager.h
index 6caec4f..36e4af3 100644
--- a/content/browser/ssl/ssl_manager.h
+++ b/content/browser/ssl/ssl_manager.h
@@ -51,7 +51,7 @@
       const base::WeakPtr<SSLErrorHandler::Delegate>& delegate,
       bool is_main_frame_request,
       const GURL& url,
-      const base::Callback<WebContents*(void)>& web_contents_getter,
+      WebContents* web_contents,
       int net_error,
       const net::SSLInfo& ssl_info,
       bool fatal);
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index 89894f0..177eff2 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -1661,12 +1661,10 @@
     OnSSLCertificateErrorCallback response) {
   SSLErrorDelegate* delegate =
       new SSLErrorDelegate(std::move(response));  // deletes self
-  base::RepeatingCallback<WebContents*(void)> web_contents_getter =
-      base::BindRepeating(GetWebContents, process_id, routing_id);
   bool is_main_frame_request = IsMainFrameRequest(process_id, routing_id);
   SSLManager::OnSSLCertificateError(
       delegate->GetWeakPtr(), is_main_frame_request, url,
-      std::move(web_contents_getter), net_error, ssl_info, fatal);
+      GetWebContents(process_id, routing_id), net_error, ssl_info, fatal);
 }
 
 void StoragePartitionImpl::OnFileUploadRequested(
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 62cb249..b5fb7fc 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -5429,8 +5429,9 @@
   NavigationEntry* entry = controller_.GetPendingEntry();
   if (entry && entry->IsViewSourceMode()) {
     // Put the renderer in view source mode.
-    render_frame_host->Send(
-        new FrameMsg_EnableViewSourceMode(render_frame_host->GetRoutingID()));
+    static_cast<RenderFrameHostImpl*>(render_frame_host)
+        ->GetAssociatedLocalFrame()
+        ->EnableViewSourceMode();
   }
 }
 
diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc
index 19d67eb..1e0dfde 100644
--- a/content/browser/web_contents/web_contents_impl_unittest.cc
+++ b/content/browser/web_contents/web_contents_impl_unittest.cc
@@ -50,6 +50,7 @@
 #include "content/public/common/content_features.h"
 #include "content/public/common/navigation_policy.h"
 #include "content/public/common/url_constants.h"
+#include "content/public/test/fake_local_frame.h"
 #include "content/public/test/mock_render_process_host.h"
 #include "content/public/test/navigation_simulator.h"
 #include "content/public/test/test_browser_context.h"
@@ -460,19 +461,43 @@
   EXPECT_EQ(title, contents()->GetTitle());
 }
 
+// Stub out local frame mojo binding. Intercepts calls to EnableViewSourceMode
+// and marks the message as received. This class attaches to the first
+// RenderFrameHostImpl created.
+class EnableViewSourceLocalFrame : public content::FakeLocalFrame,
+                                   public WebContentsObserver {
+ public:
+  explicit EnableViewSourceLocalFrame(WebContents* web_contents)
+      : WebContentsObserver(web_contents) {}
+
+  void RenderFrameCreated(RenderFrameHost* render_frame_host) override {
+    if (!initialized_) {
+      initialized_ = true;
+      Init(render_frame_host->GetRemoteAssociatedInterfaces());
+    }
+  }
+
+  void EnableViewSourceMode() final { enabled_view_source_ = true; }
+
+  bool IsViewSourceModeEnabled() const { return enabled_view_source_; }
+
+ private:
+  bool enabled_view_source_ = false;
+  bool initialized_ = false;
+};
+
 // Browser initiated navigations to view-source URLs of WebUI pages should work.
 TEST_F(WebContentsImplTest, DirectNavigationToViewSourceWebUI) {
   const GURL kGURL("view-source:" + GetWebUIURLString("blah/"));
   // NavigationControllerImpl rewrites view-source URLs, simulating that here.
   const GURL kRewrittenURL(GetWebUIURL("blah"));
 
-  process()->sink().ClearMessages();
-
+  EnableViewSourceLocalFrame local_frame(contents());
   NavigationSimulator::NavigateAndCommitFromBrowser(contents(), kGURL);
 
   // Did we get the expected message?
-  EXPECT_TRUE(process()->sink().GetFirstMessageMatching(
-      FrameMsg_EnableViewSourceMode::ID));
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(local_frame.IsViewSourceModeEnabled());
 
   // This is the virtual URL.
   EXPECT_EQ(
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc
index c5f1c18c..5225a6f 100644
--- a/content/browser/webauth/authenticator_impl_unittest.cc
+++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -449,8 +449,8 @@
     connector_->OverrideBinderForTesting(
         service_manager::ServiceFilter::ByName(device::mojom::kServiceName),
         device::mojom::HidManager::Name_,
-        base::Bind(&device::FakeFidoHidManager::AddReceiver,
-                   base::Unretained(fake_hid_manager_.get())));
+        base::BindRepeating(&device::FakeFidoHidManager::AddReceiver,
+                            base::Unretained(fake_hid_manager_.get())));
 
     // Set up a timer for testing.
     auto timer =
@@ -2623,8 +2623,8 @@
     connector_->OverrideBinderForTesting(
         service_manager::ServiceFilter::ByName(device::mojom::kServiceName),
         device::mojom::HidManager::Name_,
-        base::Bind(&device::FakeFidoHidManager::AddReceiver,
-                   base::Unretained(fake_hid_manager_.get())));
+        base::BindRepeating(&device::FakeFidoHidManager::AddReceiver,
+                            base::Unretained(fake_hid_manager_.get())));
 
     // Set up a timer for testing.
     auto timer =
diff --git a/content/browser/webrtc/webrtc_content_browsertest_base.cc b/content/browser/webrtc/webrtc_content_browsertest_base.cc
index 1fa2f98e..f96640d 100644
--- a/content/browser/webrtc/webrtc_content_browsertest_base.cc
+++ b/content/browser/webrtc/webrtc_content_browsertest_base.cc
@@ -123,7 +123,7 @@
   base::RunLoop run_loop;
   auto audio_system = audio::CreateAudioSystem(GetSystemConnector()->Clone());
   audio_system->HasOutputDevices(base::BindOnce(
-      [](base::Closure finished_callback, bool* result, bool received) {
+      [](base::OnceClosure finished_callback, bool* result, bool received) {
         *result = received;
         std::move(finished_callback).Run();
       },
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index 2222d29..ce1cb74 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -864,10 +864,6 @@
                     double /* volume */)
 #endif  // BUILDFLAG(ENABLE_PLUGINS)
 
-// Used to instruct the RenderFrame to go into "view source" mode. This should
-// only be sent to the main frame.
-IPC_MESSAGE_ROUTED0(FrameMsg_EnableViewSourceMode)
-
 // Tells the frame to suppress any further modal dialogs. This ensures that no
 // ScopedPageLoadDeferrer is on the stack for SwapOut.
 IPC_MESSAGE_ROUTED0(FrameMsg_SuppressFurtherDialogs)
diff --git a/content/public/browser/browser_context.h b/content/public/browser/browser_context.h
index 8742f26..0522586 100644
--- a/content/public/browser/browser_context.h
+++ b/content/public/browser/browser_context.h
@@ -36,7 +36,7 @@
 namespace base {
 class FilePath;
 class Token;
-}
+}  // namespace base
 
 namespace download {
 class InProgressDownloadManager;
@@ -45,7 +45,7 @@
 namespace service_manager {
 class Connector;
 class Service;
-}
+}  // namespace service_manager
 
 namespace storage {
 class ExternalMountPoints;
@@ -60,12 +60,12 @@
 namespace learning {
 class LearningSession;
 }
-}
+}  // namespace media
 
 namespace storage {
 class BlobStorageContext;
 class SpecialStoragePolicy;
-}
+}  // namespace storage
 
 namespace content {
 
@@ -137,9 +137,8 @@
       bool can_create = true);
   using StoragePartitionCallback =
       base::RepeatingCallback<void(StoragePartition*)>;
-  static void ForEachStoragePartition(
-      BrowserContext* browser_context,
-      const StoragePartitionCallback& callback);
+  static void ForEachStoragePartition(BrowserContext* browser_context,
+                                      const StoragePartitionCallback& callback);
   static void AsyncObliterateStoragePartition(
       BrowserContext* browser_context,
       const GURL& site,
@@ -378,6 +377,15 @@
   // nullptr otherwise.
   virtual ContentIndexProvider* GetContentIndexProvider();
 
+  // Returns true iff the sandboxed file system implementation should be disk
+  // backed, even if this browser context is off the record. By default this
+  // returns false, an embedded could override this to return true if for
+  // example the off-the-record browser context is stored in a in-memory file
+  // system anyway, in which case using the disk backed sandboxed file system
+  // API implementation can give some benefits over the in-memory
+  // implementation.
+  virtual bool CanUseDiskWhenOffTheRecord();
+
  private:
   const std::string unique_id_;
   bool was_notify_will_be_destroyed_called_ = false;
diff --git a/content/public/browser/download_manager_delegate.cc b/content/public/browser/download_manager_delegate.cc
index 7205bd34..258ef796 100644
--- a/content/public/browser/download_manager_delegate.cc
+++ b/content/public/browser/download_manager_delegate.cc
@@ -49,11 +49,6 @@
   return false;
 }
 
-bool DownloadManagerDelegate::IsMostRecentDownloadItemAtFilePath(
-    download::DownloadItem* download) {
-  return true;
-}
-
 std::string DownloadManagerDelegate::ApplicationClientIdForFileScanning() {
   return std::string();
 }
diff --git a/content/public/browser/download_manager_delegate.h b/content/public/browser/download_manager_delegate.h
index 027a1a1..cb79371 100644
--- a/content/public/browser/download_manager_delegate.h
+++ b/content/public/browser/download_manager_delegate.h
@@ -69,9 +69,6 @@
 // Called when a download delayed by the delegate has completed.
 using DownloadOpenDelayedCallback = base::Callback<void(bool)>;
 
-// Called with the result of CheckForFileExistence().
-using CheckForFileExistenceCallback = base::OnceCallback<void(bool result)>;
-
 // On failure, |next_id| is equal to kInvalidId.
 using DownloadIdCallback = base::Callback<void(uint32_t /* next_id */)>;
 
@@ -174,18 +171,9 @@
   // Opens the file associated with this download.
   virtual void OpenDownload(download::DownloadItem* download) {}
 
-  // Returns whether this is the most recent download in the rare event where
-  // multiple downloads are associated with the same file path.
-  virtual bool IsMostRecentDownloadItemAtFilePath(
-      download::DownloadItem* download);
-
   // Shows the download via the OS shell.
   virtual void ShowDownloadInShell(download::DownloadItem* download) {}
 
-  // Checks whether a downloaded file still exists.
-  virtual void CheckForFileExistence(download::DownloadItem* download,
-                                     CheckForFileExistenceCallback callback) {}
-
   // Return a GUID string used for identifying the application to the system AV
   // function for scanning downloaded files. If no GUID is provided or if the
   // provided GUID is invalid, then the appropriate quarantining will be
diff --git a/content/public/renderer/content_renderer_client.cc b/content/public/renderer/content_renderer_client.cc
index 94566c5..35b9286b 100644
--- a/content/public/renderer/content_renderer_client.cc
+++ b/content/public/renderer/content_renderer_client.cc
@@ -104,6 +104,14 @@
 }
 #endif
 
+bool ContentRendererClient::ShouldFork(blink::WebLocalFrame* frame,
+                                       const GURL& url,
+                                       const std::string& http_method,
+                                       bool is_initial_navigation,
+                                       bool is_server_redirect) {
+  return false;
+}
+
 void ContentRendererClient::WillSendRequest(
     blink::WebLocalFrame* frame,
     ui::PageTransition transition_type,
diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h
index 31b31bab..00672c2 100644
--- a/content/public/renderer/content_renderer_client.h
+++ b/content/public/renderer/content_renderer_client.h
@@ -220,6 +220,13 @@
                                 bool is_redirect);
 #endif
 
+  // Returns true if we should fork a new process for the given navigation.
+  virtual bool ShouldFork(blink::WebLocalFrame* frame,
+                          const GURL& url,
+                          const std::string& http_method,
+                          bool is_initial_navigation,
+                          bool is_server_redirect);
+
   // Notifies the embedder that the given frame is requesting the resource at
   // |url|. If the function returns a valid |new_url|, the request must be
   // updated to use it. The |attach_same_site_cookies| output parameter
diff --git a/content/public/test/fake_local_frame.cc b/content/public/test/fake_local_frame.cc
index 4e8ce03..756873a 100644
--- a/content/public/test/fake_local_frame.cc
+++ b/content/public/test/fake_local_frame.cc
@@ -37,6 +37,8 @@
 
 void FakeLocalFrame::Collapse(bool collapsed) {}
 
+void FakeLocalFrame::EnableViewSourceMode() {}
+
 void FakeLocalFrame::BindFrameHostReceiver(
     mojo::ScopedInterfaceEndpointHandle handle) {
   receiver_.Bind(mojo::PendingAssociatedReceiver<blink::mojom::LocalFrame>(
diff --git a/content/public/test/fake_local_frame.h b/content/public/test/fake_local_frame.h
index d8ee0a9..b925f51 100644
--- a/content/public/test/fake_local_frame.h
+++ b/content/public/test/fake_local_frame.h
@@ -23,6 +23,7 @@
 
   void Init(blink::AssociatedInterfaceProvider* provider);
 
+  // blink::mojom::LocalFrame:
   void GetTextSurroundingSelection(
       uint32_t max_length,
       GetTextSurroundingSelectionCallback callback) override;
@@ -34,6 +35,7 @@
                            bool discard_duplicates) override;
   void CheckCompleted() override;
   void Collapse(bool collapsed) override;
+  void EnableViewSourceMode() override;
 
  private:
   void BindFrameHostReceiver(mojo::ScopedInterfaceEndpointHandle handle);
diff --git a/content/public/test/slow_download_http_response.cc b/content/public/test/slow_download_http_response.cc
index f73e760..31c297c 100644
--- a/content/public/test/slow_download_http_response.cc
+++ b/content/public/test/slow_download_http_response.cc
@@ -4,6 +4,8 @@
 
 #include "content/public/test/slow_download_http_response.h"
 
+#include <utility>
+
 #include "base/bind.h"
 #include "base/strings/stringprintf.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -15,33 +17,36 @@
 static bool g_should_finish_download = false;
 
 void SendResponseBodyDone(const net::test_server::SendBytesCallback& send,
-                          const net::test_server::SendCompleteCallback& done);
+                          net::test_server::SendCompleteCallback done);
 
 // Sends the response body with the given size.
 void SendResponseBody(const net::test_server::SendBytesCallback& send,
-                      const net::test_server::SendCompleteCallback& done,
+                      net::test_server::SendCompleteCallback done,
                       bool finish_download) {
   int data_size = finish_download
                       ? SlowDownloadHttpResponse::kSecondDownloadSize
                       : SlowDownloadHttpResponse::kFirstDownloadSize;
   std::string response(data_size, '*');
 
-  if (finish_download)
-    send.Run(response, done);
-  else
-    send.Run(response, base::Bind(&SendResponseBodyDone, send, done));
+  if (finish_download) {
+    send.Run(response, std::move(done));
+  } else {
+    send.Run(response,
+             base::BindOnce(&SendResponseBodyDone, send, std::move(done)));
+  }
 }
 
 // Called when the response body was sucessfully sent.
 void SendResponseBodyDone(const net::test_server::SendBytesCallback& send,
-                          const net::test_server::SendCompleteCallback& done) {
+                          net::test_server::SendCompleteCallback done) {
   if (g_should_finish_download) {
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-        FROM_HERE, base::BindOnce(&SendResponseBody, send, done, true),
+        FROM_HERE,
+        base::BindOnce(&SendResponseBody, send, std::move(done), true),
         base::TimeDelta::FromMilliseconds(100));
   } else {
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-        FROM_HERE, base::BindOnce(&SendResponseBodyDone, send, done),
+        FROM_HERE, base::BindOnce(&SendResponseBodyDone, send, std::move(done)),
         base::TimeDelta::FromMilliseconds(100));
   }
 }
@@ -80,7 +85,7 @@
 
 void SlowDownloadHttpResponse::SendResponse(
     const net::test_server::SendBytesCallback& send,
-    const net::test_server::SendCompleteCallback& done) {
+    net::test_server::SendCompleteCallback done) {
   std::string response;
   response.append("HTTP/1.1 200 OK\r\n");
   if (base::LowerCaseEqualsASCII(kFinishDownloadUrl, url_)) {
@@ -88,7 +93,7 @@
     response.append("\r\n");
 
     g_should_finish_download = true;
-    send.Run(response, done);
+    send.Run(response, std::move(done));
   } else {
     response.append("Content-type: application/octet-stream\r\n");
     response.append("Cache-Control: max-age=0\r\n");
@@ -98,7 +103,8 @@
           "Content-Length: %d\r\n", kFirstDownloadSize + kSecondDownloadSize));
     }
     response.append("\r\n");
-    send.Run(response, base::Bind(&SendResponseBody, send, done, false));
+    send.Run(response,
+             base::BindOnce(&SendResponseBody, send, std::move(done), false));
   }
 }
 
diff --git a/content/public/test/slow_download_http_response.h b/content/public/test/slow_download_http_response.h
index ab71866..8aaad8c 100644
--- a/content/public/test/slow_download_http_response.h
+++ b/content/public/test/slow_download_http_response.h
@@ -34,9 +34,8 @@
   ~SlowDownloadHttpResponse() override;
 
   // net::test_server::HttpResponse implementations.
-  void SendResponse(
-      const net::test_server::SendBytesCallback& send,
-      const net::test_server::SendCompleteCallback& done) override;
+  void SendResponse(const net::test_server::SendBytesCallback& send,
+                    net::test_server::SendCompleteCallback done) override;
 
  private:
   std::string url_;
diff --git a/content/public/test/test_download_http_response.cc b/content/public/test/test_download_http_response.cc
index c847cc1..92b6adf 100644
--- a/content/public/test/test_download_http_response.cc
+++ b/content/public/test/test_download_http_response.cc
@@ -54,8 +54,8 @@
 
 // Called to resume the response.
 void OnResume(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-              const base::Closure& resume_callback) {
-  task_runner->PostTask(FROM_HERE, resume_callback);
+              base::OnceClosure resume_callback) {
+  task_runner->PostTask(FROM_HERE, std::move(resume_callback));
 }
 
 void OnResponseSentOnServerIOThread(
@@ -81,11 +81,10 @@
 
  private:
   // net::test_server::HttpResponse implementations.
-  void SendResponse(
-      const net::test_server::SendBytesCallback& send,
-      const net::test_server::SendCompleteCallback& done) override {
+  void SendResponse(const net::test_server::SendBytesCallback& send,
+                    net::test_server::SendCompleteCallback done) override {
     if (owner_)
-      owner_->SendResponse(send, done);
+      owner_->SendResponse(send, std::move(done));
   }
 
   base::WeakPtr<TestDownloadHttpResponse> owner_;
@@ -260,9 +259,9 @@
 
 void TestDownloadHttpResponse::SendResponse(
     const net::test_server::SendBytesCallback& send,
-    const net::test_server::SendCompleteCallback& done) {
+    net::test_server::SendCompleteCallback done) {
   bytes_sender_ = send;
-  done_callback_ = done;
+  done_callback_ = std::move(done);
 
   // Throw error before sending headers.
   if (ShouldAbortImmediately()) {
@@ -508,8 +507,7 @@
   if (range.last_byte_position() > pause_offset) {
     range.set_last_byte_position(pause_offset - 1);
     response_sent_offset_ = pause_offset;
-    base::RepeatingClosure nothing = base::BindRepeating([]() {});
-    SendBodyChunkInternal(range, nothing);
+    SendBodyChunkInternal(range, base::DoNothing());
   }
 
   // Pause now. Don't close the connection to wait for resumption.
@@ -559,11 +557,11 @@
   auto pause_callback = parameters_.on_pause_handler;
   parameters_.on_pause_handler.Reset();
 
-  base::RepeatingClosure continue_closure = SendNextBodyChunkClosure();
+  base::OnceClosure continue_closure = SendNextBodyChunkClosure();
 
   // We may pause before sending the headers.
   if (parameters_.pause_offset == -1) {
-    continue_closure = base::BindRepeating(
+    continue_closure = base::BindOnce(
         &TestDownloadHttpResponse::SendResponseHeaders, base::Unretained(this));
   }
 
@@ -573,8 +571,8 @@
       FROM_HERE, {BrowserThread::UI},
       base::BindOnce(
           pause_callback,
-          base::BindRepeating(&OnResume, base::ThreadTaskRunnerHandle::Get(),
-                              continue_closure)));
+          base::BindOnce(&OnResume, base::ThreadTaskRunnerHandle::Get(),
+                         std::move(continue_closure))));
 }
 
 void TestDownloadHttpResponse::SendResponseBodyChunk() {
@@ -606,16 +604,16 @@
 
 void TestDownloadHttpResponse::SendBodyChunkInternal(
     const net::HttpByteRange& buffer_range,
-    const base::RepeatingClosure& next) {
+    base::OnceClosure next) {
   std::string response_chunk = GetResponseChunk(buffer_range);
   transferred_bytes_ += static_cast<int64_t>(response_chunk.size());
-  bytes_sender_.Run(response_chunk, next);
+  bytes_sender_.Run(response_chunk, std::move(next));
 }
 
 net::test_server::SendCompleteCallback
 TestDownloadHttpResponse::SendNextBodyChunkClosure() {
-  return base::BindRepeating(&TestDownloadHttpResponse::SendResponseBodyChunk,
-                             base::Unretained(this));
+  return base::BindOnce(&TestDownloadHttpResponse::SendResponseBodyChunk,
+                        base::Unretained(this));
 }
 
 void TestDownloadHttpResponse::GenerateResult() {
@@ -626,13 +624,13 @@
                                  std::move(completed_request));
 
   // Close the HTTP connection.
-  done_callback_.Run();
+  std::move(done_callback_).Run();
 }
 
 net::test_server::SendCompleteCallback
 TestDownloadHttpResponse::GenerateResultClosure() {
-  return base::BindRepeating(&TestDownloadHttpResponse::GenerateResult,
-                             base::Unretained(this));
+  return base::BindOnce(&TestDownloadHttpResponse::GenerateResult,
+                        base::Unretained(this));
 }
 
 std::unique_ptr<net::test_server::HttpResponse>
diff --git a/content/public/test/test_download_http_response.h b/content/public/test/test_download_http_response.h
index b979da7..0a30696 100644
--- a/content/public/test/test_download_http_response.h
+++ b/content/public/test/test_download_http_response.h
@@ -33,10 +33,10 @@
 
   // OnPauseHandler can be used to pause the response until the enclosed
   // callback is called.
-  using OnPauseHandler = base::Callback<void(const base::Closure&)>;
+  using OnPauseHandler = base::RepeatingCallback<void(base::OnceClosure)>;
 
   // Called when an injected error triggers.
-  using InjectErrorCallback = base::Callback<void(int64_t, int64_t)>;
+  using InjectErrorCallback = base::RepeatingCallback<void(int64_t, int64_t)>;
 
   struct HttpResponseData {
     HttpResponseData() = default;
@@ -254,7 +254,7 @@
   // operate on HTTP connection in embedded test server, and will out live the
   // shim HttpResponse object created by |CreateResponseForTestServer|.
   void SendResponse(const net::test_server::SendBytesCallback& send,
-                    const net::test_server::SendCompleteCallback& done);
+                    net::test_server::SendCompleteCallback done);
 
  private:
   // Parses the request headers.
@@ -297,7 +297,7 @@
   // Will pause or throw error based on configuration in |paramters_|.
   void SendResponseBodyChunk();
   void SendBodyChunkInternal(const net::HttpByteRange& buffer_range,
-                             const base::RepeatingClosure& next);
+                             base::OnceClosure next);
   net::test_server::SendCompleteCallback SendNextBodyChunkClosure();
 
   // Generate CompletedRequest as result.
diff --git a/content/public/test/text_input_test_utils.cc b/content/public/test/text_input_test_utils.cc
index 2801486..9dbc22b3 100644
--- a/content/public/test/text_input_test_utils.cc
+++ b/content/public/test/text_input_test_utils.cc
@@ -60,21 +60,22 @@
   }
 
   void set_update_text_input_state_called_callback(
-      const base::Closure& callback) {
-    update_text_input_state_callback_ = callback;
+      base::RepeatingClosure callback) {
+    update_text_input_state_callback_ = std::move(callback);
   }
 
-  void set_on_selection_bounds_changed_callback(const base::Closure& callback) {
-    on_selection_bounds_changed_callback_ = callback;
+  void set_on_selection_bounds_changed_callback(
+      base::RepeatingClosure callback) {
+    on_selection_bounds_changed_callback_ = std::move(callback);
   }
 
   void set_on_ime_composition_range_changed_callback(
-      const base::Closure& callback) {
-    on_ime_composition_range_changed_callback_ = callback;
+      base::RepeatingClosure callback) {
+    on_ime_composition_range_changed_callback_ = std::move(callback);
   }
 
-  void set_on_text_selection_changed_callback(const base::Closure& callback) {
-    on_text_selection_changed_callback_ = callback;
+  void set_on_text_selection_changed_callback(base::RepeatingClosure callback) {
+    on_text_selection_changed_callback_ = std::move(callback);
   }
 
   const gfx::Range* last_composition_range() const {
@@ -138,10 +139,10 @@
   RenderWidgetHostViewBase* updated_view_;
   bool text_input_state_changed_;
   std::unique_ptr<gfx::Range> last_composition_range_;
-  base::Closure update_text_input_state_callback_;
-  base::Closure on_selection_bounds_changed_callback_;
-  base::Closure on_ime_composition_range_changed_callback_;
-  base::Closure on_text_selection_changed_callback_;
+  base::RepeatingClosure update_text_input_state_callback_;
+  base::RepeatingClosure on_selection_bounds_changed_callback_;
+  base::RepeatingClosure on_ime_composition_range_changed_callback_;
+  base::RepeatingClosure on_text_selection_changed_callback_;
 
   DISALLOW_COPY_AND_ASSIGN(InternalObserver);
 };
@@ -331,23 +332,23 @@
 TextInputManagerTester::~TextInputManagerTester() {}
 
 void TextInputManagerTester::SetUpdateTextInputStateCalledCallback(
-    const base::Closure& callback) {
-  observer_->set_update_text_input_state_called_callback(callback);
+    base::RepeatingClosure callback) {
+  observer_->set_update_text_input_state_called_callback(std::move(callback));
 }
 
 void TextInputManagerTester::SetOnSelectionBoundsChangedCallback(
-    const base::Closure& callback) {
-  observer_->set_on_selection_bounds_changed_callback(callback);
+    base::RepeatingClosure callback) {
+  observer_->set_on_selection_bounds_changed_callback(std::move(callback));
 }
 
 void TextInputManagerTester::SetOnImeCompositionRangeChangedCallback(
-    const base::Closure& callback) {
-  observer_->set_on_ime_composition_range_changed_callback(callback);
+    base::RepeatingClosure callback) {
+  observer_->set_on_ime_composition_range_changed_callback(std::move(callback));
 }
 
 void TextInputManagerTester::SetOnTextSelectionChangedCallback(
-    const base::Closure& callback) {
-  observer_->set_on_text_selection_changed_callback(callback);
+    base::RepeatingClosure callback) {
+  observer_->set_on_text_selection_changed_callback(std::move(callback));
 }
 
 bool TextInputManagerTester::GetTextInputType(ui::TextInputType* type) {
diff --git a/content/public/test/text_input_test_utils.h b/content/public/test/text_input_test_utils.h
index 2bb337c..8c17875 100644
--- a/content/public/test/text_input_test_utils.h
+++ b/content/public/test/text_input_test_utils.h
@@ -105,19 +105,19 @@
 
   // Sets a callback which is invoked when a RWHV calls UpdateTextInputState
   // on the TextInputManager which is being observed.
-  void SetUpdateTextInputStateCalledCallback(const base::Closure& callback);
+  void SetUpdateTextInputStateCalledCallback(base::RepeatingClosure callback);
 
   // Sets a callback which is invoked when a RWHV calls SelectionBoundsChanged
   // on the TextInputManager which is being observed.
-  void SetOnSelectionBoundsChangedCallback(const base::Closure& callback);
+  void SetOnSelectionBoundsChangedCallback(base::RepeatingClosure callback);
 
   // Sets a callback which is invoked when a RWHV calls
   // ImeCompositionRangeChanged on the TextInputManager that is being observed.
-  void SetOnImeCompositionRangeChangedCallback(const base::Closure& callback);
+  void SetOnImeCompositionRangeChangedCallback(base::RepeatingClosure callback);
 
   // Sets a callback which is invoked when a RWHV calls SelectionChanged on the
   // TextInputManager which is being observed.
-  void SetOnTextSelectionChangedCallback(const base::Closure& callback);
+  void SetOnTextSelectionChangedCallback(base::RepeatingClosure callback);
 
   // Returns true if there is a focused <input> and populates |type| with
   // |TextInputState.type| of the TextInputManager.
@@ -249,7 +249,7 @@
   // Sets a callback for the string for range IPC arriving from the renderer.
   // The callback is invoked before that of TextInputClientMac and is handled on
   // UI thread.
-  void SetStringForRangeCallback(const base::Closure& callback);
+  void SetStringForRangeCallback(base::RepeatingClosure callback);
 
   RenderProcessHost* process() const { return host_; }
   std::string string_from_range() { return string_from_range_; }
@@ -259,7 +259,7 @@
   RenderProcessHost* const host_;
   std::string string_from_range_;
   bool received_string_from_range_;
-  base::Closure string_for_range_callback_;
+  base::RepeatingClosure string_for_range_callback_;
   scoped_refptr<MessageLoopRunner> message_loop_runner_;
 
   DISALLOW_COPY_AND_ASSIGN(TestTextInputClientMessageFilter);
diff --git a/content/public/test/text_input_test_utils_mac.mm b/content/public/test/text_input_test_utils_mac.mm
index 3a8d16a..ff437bf 100644
--- a/content/public/test/text_input_test_utils_mac.mm
+++ b/content/public/test/text_input_test_utils_mac.mm
@@ -70,8 +70,8 @@
 }
 
 void TestTextInputClientMessageFilter::SetStringForRangeCallback(
-    const base::Closure& callback) {
-  string_for_range_callback_ = callback;
+    base::RepeatingClosure callback) {
+  string_for_range_callback_ = std::move(callback);
 }
 
 void AskForLookUpDictionaryForRange(RenderWidgetHostView* tab_view,
diff --git a/content/renderer/discardable_memory_utils.cc b/content/renderer/discardable_memory_utils.cc
index 0a579fc..878411c 100644
--- a/content/renderer/discardable_memory_utils.cc
+++ b/content/renderer/discardable_memory_utils.cc
@@ -5,6 +5,7 @@
 #include <utility>
 
 #include "base/command_line.h"
+#include "base/memory/discardable_memory.h"
 #include "content/child/child_process.h"
 #include "content/child/child_thread_impl.h"
 #include "content/public/common/content_switches.h"
@@ -24,44 +25,15 @@
 
 namespace content {
 
-static const base::Feature kMadvFreeDiscardableMemoryFeature{
-    "MadvFreeDiscardableMemory", base::FEATURE_DISABLED_BY_DEFAULT};
-
-namespace {
-DiscardableMemoryBacking GetPlatformDiscardableMemoryBacking() {
-#if defined(OS_ANDROID)
-  if (ashmem_device_is_supported())
-    return DiscardableMemoryBacking::kSharedMemory;
-#endif
-
-  bool madv_free_supported = false;
-#if defined(OS_POSIX)
-  madv_free_supported =
-      base::GetMadvFreeSupport() == base::MadvFreeSupport::kSupported;
-#endif
-
-  if (base::FeatureList::IsEnabled(kMadvFreeDiscardableMemoryFeature) &&
-      madv_free_supported) {
-    return DiscardableMemoryBacking::kMadvFree;
-  }
-  return DiscardableMemoryBacking::kSharedMemory;
-}
-}  // namespace
-
-DiscardableMemoryBacking GetDiscardableMemoryBacking() {
-  static DiscardableMemoryBacking backing =
-      GetPlatformDiscardableMemoryBacking();
-  return backing;
-}
-
 std::unique_ptr<base::DiscardableMemoryAllocator>
 CreateDiscardableMemoryAllocator() {
-  if (GetDiscardableMemoryBacking() == DiscardableMemoryBacking::kMadvFree) {
 #if defined(OS_POSIX)
+  if (base::GetDiscardableMemoryBacking() ==
+      base::DiscardableMemoryBacking::kMadvFree) {
     DVLOG(1) << "Using MADV_FREE for discardable memory";
     return std::make_unique<base::MadvFreeDiscardableMemoryAllocatorPosix>();
-#endif
   }
+#endif  // defined(OS_POSIX)
   DVLOG(1) << "Using shared memory for discardable memory";
 
   mojo::PendingRemote<discardable_memory::mojom::DiscardableSharedMemoryManager>
diff --git a/content/renderer/discardable_memory_utils.h b/content/renderer/discardable_memory_utils.h
index 5633e40..a510dbe 100644
--- a/content/renderer/discardable_memory_utils.h
+++ b/content/renderer/discardable_memory_utils.h
@@ -26,9 +26,6 @@
 #include "mojo/public/cpp/bindings/thread_safe_interface_ptr.h"
 
 namespace content {
-enum class DiscardableMemoryBacking { kSharedMemory, kMadvFree };
-
-CONTENT_EXPORT DiscardableMemoryBacking GetDiscardableMemoryBacking();
 
 CONTENT_EXPORT std::unique_ptr<base::DiscardableMemoryAllocator>
 CreateDiscardableMemoryAllocator();
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index cc676c3..070f746 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -2224,7 +2224,6 @@
                         OnGetSavableResourceLinks)
     IPC_MESSAGE_HANDLER(FrameMsg_GetSerializedHtmlWithLocalLinks,
                         OnGetSerializedHtmlWithLocalLinks)
-    IPC_MESSAGE_HANDLER(FrameMsg_EnableViewSourceMode, OnEnableViewSourceMode)
     IPC_MESSAGE_HANDLER(FrameMsg_SuppressFurtherDialogs,
                         OnSuppressFurtherDialogs)
     IPC_MESSAGE_HANDLER(FrameMsg_ClearFocusedElement, OnClearFocusedElement)
@@ -6012,6 +6011,15 @@
     int cumulative_bindings = RenderProcess::current()->GetEnabledBindings();
     bool should_fork = HasWebUIScheme(url) || HasWebUIScheme(old_url) ||
                        (cumulative_bindings & kWebUIBindingsPolicyMask);
+
+    if (!should_fork) {
+      // Give the embedder a chance.
+      bool is_initial_navigation = render_view_->history_list_length_ == 0;
+      should_fork = GetContentClient()->renderer()->ShouldFork(
+          frame_, url, info->url_request.HttpMethod().Utf8(),
+          is_initial_navigation, false /* is_redirect */);
+    }
+
     if (should_fork) {
       OpenURL(std::move(info));
       return;  // Suppress the load here.
@@ -6245,12 +6253,6 @@
 #undef STATIC_ASSERT_ENUM
 #endif
 
-void RenderFrameImpl::OnEnableViewSourceMode() {
-  DCHECK(frame_);
-  DCHECK(!frame_->Parent());
-  frame_->EnableViewSourceMode(true);
-}
-
 void RenderFrameImpl::OnSuppressFurtherDialogs() {
   suppress_further_dialogs_ = true;
 }
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index e245b5a..2abb3430 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -1104,7 +1104,6 @@
       const std::map<GURL, base::FilePath>& url_to_local_path,
       const std::map<int, base::FilePath>& frame_routing_id_to_local_path,
       bool save_with_empty_url);
-  void OnEnableViewSourceMode();
   void OnSuppressFurtherDialogs();
   void OnClearFocusedElement();
   void OnBlinkFeatureUsageReport(
diff --git a/content/renderer/render_thread_impl_discardable_memory_browsertest.cc b/content/renderer/render_thread_impl_discardable_memory_browsertest.cc
index 9e7250b9..80b50c62 100644
--- a/content/renderer/render_thread_impl_discardable_memory_browsertest.cc
+++ b/content/renderer/render_thread_impl_discardable_memory_browsertest.cc
@@ -97,14 +97,14 @@
   const size_t kLargeSize = 4 * 1024 * 1024;   // 4MiB.
   const size_t kNumberOfInstances = 1024 + 1;  // >4GiB total.
 
-  DiscardableMemoryBacking impl = GetDiscardableMemoryBacking();
+  base::DiscardableMemoryBacking impl = base::GetDiscardableMemoryBacking();
 
   // TODO(gordonguan): When MADV_FREE DiscardableMemory is discarded, the
   // backing memory is freed, but remains mapped in memory. It is only
   // unmapped when the object is destroyed, or on the next Lock() after
   // discard. Therefore, an abundance of discarded but mapped discardable
   // memory instances may cause an out-of-memory condition.
-  if (impl != DiscardableMemoryBacking::kSharedMemory)
+  if (impl != base::DiscardableMemoryBacking::kSharedMemory)
     return;
 
   std::vector<std::unique_ptr<base::DiscardableMemory>> instances;
@@ -125,7 +125,7 @@
                        ReleaseFreeDiscardableMemory) {
   const size_t kSize = 1024 * 1024;  // 1MiB.
 
-  DiscardableMemoryBacking impl = GetDiscardableMemoryBacking();
+  base::DiscardableMemoryBacking impl = base::GetDiscardableMemoryBacking();
 
   std::unique_ptr<base::DiscardableMemory> memory =
       discardable_memory_allocator()->AllocateLockedDiscardableMemory(kSize);
@@ -135,7 +135,7 @@
   memory.reset();
 
   EXPECT_EQ(discardable_memory_allocator()->GetBytesAllocated(), 0U);
-  if (impl != DiscardableMemoryBacking::kSharedMemory)
+  if (impl != base::DiscardableMemoryBacking::kSharedMemory)
     return;
 
   EXPECT_GE(discardable_memory::DiscardableSharedMemoryManager::Get()
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
index 3735c9d..2445fbad 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -367,6 +367,7 @@
 crbug.com/965594 [ linux amd opengl passthrough ] conformance/more/conformance/quickCheckAPI-S_V.html [ RetryOnFailure ]
 crbug.com/965594 [ linux amd opengl passthrough ] conformance/more/conformance/webGLArrays.html [ RetryOnFailure ]
 crbug.com/1028639 [ linux amd opengl passthrough ] conformance/ogles/GL/mat/mat_009_to_016.html [ Failure ]
+crbug.com/1028639 [ linux amd opengl passthrough ] conformance/ogles/GL/log2/log2_009_to_012.html [ Failure ]
 
 
 ####################
diff --git a/extensions/browser/BUILD.gn b/extensions/browser/BUILD.gn
index ed37429..c2398316 100644
--- a/extensions/browser/BUILD.gn
+++ b/extensions/browser/BUILD.gn
@@ -103,7 +103,6 @@
     "declarative_user_script_master.cc",
     "declarative_user_script_master.h",
     "deferred_start_render_host.h",
-    "deferred_start_render_host_observer.h",
     "device_local_account_util.cc",
     "device_local_account_util.h",
     "disable_reason.h",
diff --git a/extensions/browser/api/declarative_net_request/action_tracker.cc b/extensions/browser/api/declarative_net_request/action_tracker.cc
index 08b2bf9..296a9fd 100644
--- a/extensions/browser/api/declarative_net_request/action_tracker.cc
+++ b/extensions/browser/api/declarative_net_request/action_tracker.cc
@@ -37,17 +37,17 @@
 
 void ActionTracker::OnRuleMatched(const RequestAction& request_action,
                                   const WebRequestInfo& request_info) {
-  const int tab_id = request_info.frame_data.tab_id;
-  if (tab_id == extension_misc::kUnknownTabId)
-    return;
-
   DispatchOnRuleMatchedDebugIfNeeded(request_action,
                                      CreateRequestDetails(request_info));
 
+  const int tab_id = request_info.frame_data.tab_id;
+
   // Return early since allow rules do not result in any action being taken on
-  // the request.
-  if (request_action.type == RequestAction::Type::ALLOW)
+  // the request, and badge text should only be set for valid tab IDs.
+  if (tab_id == extension_misc::kUnknownTabId ||
+      request_action.type == RequestAction::Type::ALLOW) {
     return;
+  }
 
   const ExtensionId& extension_id = request_action.extension_id;
   ExtensionTabIdKey key(extension_id, tab_id);
diff --git a/extensions/browser/deferred_start_render_host.h b/extensions/browser/deferred_start_render_host.h
index 53b9be53..f6810c6 100644
--- a/extensions/browser/deferred_start_render_host.h
+++ b/extensions/browser/deferred_start_render_host.h
@@ -6,7 +6,6 @@
 #define EXTENSIONS_BROWSER_DEFERRED_START_RENDER_HOST_H_
 
 namespace extensions {
-class DeferredStartRenderHostObserver;
 
 // A browser component that tracks a renderer. It allows for its renderer
 // startup to be deferred, to throttle resource usage upon profile startup.
@@ -18,12 +17,6 @@
  public:
   virtual ~DeferredStartRenderHost() {}
 
-  // DeferredStartRenderHost lifetime can be observed.
-  virtual void AddDeferredStartRenderHostObserver(
-      DeferredStartRenderHostObserver* observer) = 0;
-  virtual void RemoveDeferredStartRenderHostObserver(
-      DeferredStartRenderHostObserver* observer) = 0;
-
   // DO NOT CALL THIS unless you're implementing an ExtensionHostQueue.
   // Called by the ExtensionHostQueue to create the RenderView.
   virtual void CreateRenderViewNow() = 0;
diff --git a/extensions/browser/deferred_start_render_host_observer.h b/extensions/browser/deferred_start_render_host_observer.h
deleted file mode 100644
index 09f04a2..0000000
--- a/extensions/browser/deferred_start_render_host_observer.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2015 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 EXTENSIONS_BROWSER_DEFERRED_START_RENDER_HOST_OBSERVER_H_
-#define EXTENSIONS_BROWSER_DEFERRED_START_RENDER_HOST_OBSERVER_H_
-
-namespace extensions {
-class DeferredStartRenderHost;
-
-// Observer of DeferredStartRenderHost lifetime.
-//
-// Note that if BackgroundContents and ExtensionHost are unified
-// (crbug.com/77790), this can be replaced by ExtensionHostObserver.
-class DeferredStartRenderHostObserver {
- public:
-  virtual ~DeferredStartRenderHostObserver() {}
-
-  // Called when a DeferredStartRenderHost started loading.
-  virtual void OnDeferredStartRenderHostDidStartFirstLoad(
-      const DeferredStartRenderHost* host) {}
-
-  // Called when a DeferredStartRenderHost stopped loading.
-  virtual void OnDeferredStartRenderHostDidStopFirstLoad(
-      const DeferredStartRenderHost* host) {}
-
-  // Called when a DeferredStartRenderHost is destroyed.
-  virtual void OnDeferredStartRenderHostDestroyed(
-      const DeferredStartRenderHost* host) {}
-};
-
-}  // namespace extensions
-
-#endif  // EXTENSIONS_BROWSER_DEFERRED_START_RENDER_HOST_OBSERVER_H_
diff --git a/extensions/browser/extension_host.cc b/extensions/browser/extension_host.cc
index 3f3c0d63..5528484 100644
--- a/extensions/browser/extension_host.cc
+++ b/extensions/browser/extension_host.cc
@@ -19,7 +19,6 @@
 #include "content/public/browser/site_instance.h"
 #include "content/public/browser/web_contents.h"
 #include "extensions/browser/bad_message.h"
-#include "extensions/browser/deferred_start_render_host_observer.h"
 #include "extensions/browser/event_router.h"
 #include "extensions/browser/extension_error.h"
 #include "extensions/browser/extension_host_delegate.h"
@@ -102,8 +101,6 @@
       content::Details<ExtensionHost>(this));
   for (auto& observer : observer_list_)
     observer.OnExtensionHostDestroyed(this);
-  for (auto& observer : deferred_start_render_host_observer_list_)
-    observer.OnDeferredStartRenderHostDestroyed(this);
 
   // Remove ourselves from the queue as late as possible (before effectively
   // destroying self, but after everything else) so that queues that are
@@ -158,16 +155,6 @@
   }
 }
 
-void ExtensionHost::AddDeferredStartRenderHostObserver(
-    DeferredStartRenderHostObserver* observer) {
-  deferred_start_render_host_observer_list_.AddObserver(observer);
-}
-
-void ExtensionHost::RemoveDeferredStartRenderHostObserver(
-    DeferredStartRenderHostObserver* observer) {
-  deferred_start_render_host_observer_list_.RemoveObserver(observer);
-}
-
 void ExtensionHost::Close() {
   content::NotificationService::current()->Notify(
       extensions::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE,
@@ -262,13 +249,6 @@
       content::Details<ExtensionHost>(this));
 }
 
-void ExtensionHost::DidStartLoading() {
-  if (!has_loaded_once_) {
-    for (auto& observer : deferred_start_render_host_observer_list_)
-      observer.OnDeferredStartRenderHostDidStartFirstLoad(this);
-  }
-}
-
 void ExtensionHost::DidStopLoading() {
   // Only record UMA for the first load. Subsequent loads will likely behave
   // quite different, and it's first load we're most interested in.
@@ -281,8 +261,8 @@
         extensions::NOTIFICATION_EXTENSION_HOST_DID_STOP_FIRST_LOAD,
         content::Source<BrowserContext>(browser_context_),
         content::Details<ExtensionHost>(this));
-    for (auto& observer : deferred_start_render_host_observer_list_)
-      observer.OnDeferredStartRenderHostDidStopFirstLoad(this);
+    for (auto& observer : observer_list_)
+      observer.OnExtensionHostDidStopFirstLoad(this);
   }
 }
 
diff --git a/extensions/browser/extension_host.h b/extensions/browser/extension_host.h
index c0f80fd..a291429 100644
--- a/extensions/browser/extension_host.h
+++ b/extensions/browser/extension_host.h
@@ -107,7 +107,6 @@
   void RenderViewReady() override;
   void RenderProcessGone(base::TerminationStatus status) override;
   void DocumentAvailableInMainFrame() override;
-  void DidStartLoading() override;
   void DidStopLoading() override;
 
   // content::WebContentsDelegate:
@@ -155,10 +154,6 @@
  private:
   // DeferredStartRenderHost:
   void CreateRenderViewNow() override;
-  void AddDeferredStartRenderHostObserver(
-      DeferredStartRenderHostObserver* observer) override;
-  void RemoveDeferredStartRenderHostObserver(
-      DeferredStartRenderHostObserver* observer) override;
 
   // Message handlers.
   void OnEventAck(int event_id);
@@ -221,8 +216,6 @@
   std::unique_ptr<base::ElapsedTimer> load_start_;
 
   base::ObserverList<ExtensionHostObserver>::Unchecked observer_list_;
-  base::ObserverList<DeferredStartRenderHostObserver>::Unchecked
-      deferred_start_render_host_observer_list_;
 
   DISALLOW_COPY_AND_ASSIGN(ExtensionHost);
 };
diff --git a/extensions/browser/extension_host_observer.h b/extensions/browser/extension_host_observer.h
index 39aa0a8c..5bad883 100644
--- a/extensions/browser/extension_host_observer.h
+++ b/extensions/browser/extension_host_observer.h
@@ -23,6 +23,9 @@
   // Called when an ExtensionHost is destroyed.
   virtual void OnExtensionHostDestroyed(const ExtensionHost* host) {}
 
+  // Called when the ExtensionHost has finished the first load.
+  virtual void OnExtensionHostDidStopFirstLoad(const ExtensionHost* host) {}
+
   // Called when a message has been disptached to the event page corresponding
   // to |host|.
   virtual void OnBackgroundEventDispatched(const ExtensionHost* host,
diff --git a/extensions/test/test_background_page_first_load_observer.cc b/extensions/test/test_background_page_first_load_observer.cc
index 4e1e319..3fef569 100644
--- a/extensions/test/test_background_page_first_load_observer.cc
+++ b/extensions/test/test_background_page_first_load_observer.cc
@@ -5,7 +5,6 @@
 #include "extensions/test/test_background_page_first_load_observer.h"
 
 #include "base/logging.h"
-#include "extensions/browser/extension_host.h"
 
 namespace extensions {
 
@@ -21,12 +20,8 @@
     OnObtainedExtensionHost();
 }
 
-TestBackgroundPageFirstLoadObserver::~TestBackgroundPageFirstLoadObserver() {
-  if (extension_host_) {
-    static_cast<DeferredStartRenderHost*>(extension_host_)
-        ->RemoveDeferredStartRenderHostObserver(this);
-  }
-}
+TestBackgroundPageFirstLoadObserver::~TestBackgroundPageFirstLoadObserver() =
+    default;
 
 void TestBackgroundPageFirstLoadObserver::Wait() {
   if (!extension_host_ || !extension_host_->has_loaded_once())
@@ -42,15 +37,13 @@
   }
 }
 
-void TestBackgroundPageFirstLoadObserver::
-    OnDeferredStartRenderHostDidStopFirstLoad(
-        const DeferredStartRenderHost* host) {
+void TestBackgroundPageFirstLoadObserver::OnExtensionHostDidStopFirstLoad(
+    const ExtensionHost* host) {
   run_loop_.Quit();
 }
 
 void TestBackgroundPageFirstLoadObserver::OnObtainedExtensionHost() {
-  static_cast<DeferredStartRenderHost*>(extension_host_)
-      ->AddDeferredStartRenderHostObserver(this);
+  extension_host_observer_.Add(extension_host_);
 }
 
 }  // namespace extensions
diff --git a/extensions/test/test_background_page_first_load_observer.h b/extensions/test/test_background_page_first_load_observer.h
index 6c97762..fe468da 100644
--- a/extensions/test/test_background_page_first_load_observer.h
+++ b/extensions/test/test_background_page_first_load_observer.h
@@ -8,7 +8,8 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/scoped_observer.h"
-#include "extensions/browser/deferred_start_render_host_observer.h"
+#include "extensions/browser/extension_host.h"
+#include "extensions/browser/extension_host_observer.h"
 #include "extensions/browser/process_manager.h"
 #include "extensions/browser/process_manager_observer.h"
 #include "extensions/common/extension_id.h"
@@ -21,11 +22,8 @@
 // first DidStopLoading().
 namespace extensions {
 
-class ExtensionHost;
-
-class TestBackgroundPageFirstLoadObserver
-    : public ProcessManagerObserver,
-      public DeferredStartRenderHostObserver {
+class TestBackgroundPageFirstLoadObserver : public ProcessManagerObserver,
+                                            public ExtensionHostObserver {
  public:
   TestBackgroundPageFirstLoadObserver(content::BrowserContext* browser_context,
                                       const ExtensionId& extension_id);
@@ -37,9 +35,8 @@
   // ProcessManagerObserver:
   void OnBackgroundHostCreated(ExtensionHost* host) override;
 
-  // DeferredStartRenderHostObserver:
-  void OnDeferredStartRenderHostDidStopFirstLoad(
-      const DeferredStartRenderHost* host) override;
+  // ExtensionHostObserver:
+  void OnExtensionHostDidStopFirstLoad(const ExtensionHost* host) override;
 
   void OnObtainedExtensionHost();
 
@@ -49,6 +46,8 @@
   base::RunLoop run_loop_;
   ScopedObserver<ProcessManager, ProcessManagerObserver>
       process_manager_observer_{this};
+  ScopedObserver<ExtensionHost, ExtensionHostObserver> extension_host_observer_{
+      this};
 
   DISALLOW_COPY_AND_ASSIGN(TestBackgroundPageFirstLoadObserver);
 };
diff --git a/fuchsia/engine/BUILD.gn b/fuchsia/engine/BUILD.gn
index 99d3891..b4bc638 100644
--- a/fuchsia/engine/BUILD.gn
+++ b/fuchsia/engine/BUILD.gn
@@ -152,8 +152,8 @@
     "browser/web_engine_devtools_controller.h",
     "browser/web_engine_memory_pressure_evaluator.cc",
     "browser/web_engine_memory_pressure_evaluator.h",
-    "browser/web_engine_net_log.cc",
-    "browser/web_engine_net_log.h",
+    "browser/web_engine_net_log_observer.cc",
+    "browser/web_engine_net_log_observer.h",
     "browser/web_engine_permission_manager.cc",
     "browser/web_engine_permission_manager.h",
     "common/web_engine_content_client.cc",
diff --git a/fuchsia/engine/browser/frame_impl_browsertest.cc b/fuchsia/engine/browser/frame_impl_browsertest.cc
index c42b6f4f..42c4315 100644
--- a/fuchsia/engine/browser/frame_impl_browsertest.cc
+++ b/fuchsia/engine/browser/frame_impl_browsertest.cc
@@ -288,10 +288,10 @@
 class ChunkedHttpTransaction {
  public:
   ChunkedHttpTransaction(const net::test_server::SendBytesCallback& send,
-                         const net::test_server::SendCompleteCallback& done)
+                         net::test_server::SendCompleteCallback done)
       : io_task_runner_(base::ThreadTaskRunnerHandle::Get()),
         send_callback_(send),
-        done_callback_(done) {
+        done_callback_(std::move(done)) {
     DCHECK(!current_instance_);
     DCHECK(send_callback_);
     DCHECK(done_callback_);
@@ -306,7 +306,7 @@
 
   void Close() {
     EnsureSendCompleted();
-    io_task_runner_->PostTask(FROM_HERE, done_callback_);
+    io_task_runner_->PostTask(FROM_HERE, std::move(done_callback_));
     delete this;
   }
 
@@ -383,11 +383,10 @@
   }
 
   // net::test_server::HttpResponse implementation.
-  void SendResponse(
-      const net::test_server::SendBytesCallback& send,
-      const net::test_server::SendCompleteCallback& done) override {
+  void SendResponse(const net::test_server::SendBytesCallback& send,
+                    net::test_server::SendCompleteCallback done) override {
     // The ChunkedHttpTransaction manages its own lifetime.
-    new ChunkedHttpTransaction(send, done);
+    new ChunkedHttpTransaction(send, std::move(done));
 
     if (on_response_created_)
       std::move(on_response_created_).Run();
diff --git a/fuchsia/engine/browser/web_engine_browser_context.cc b/fuchsia/engine/browser/web_engine_browser_context.cc
index c64900a..4818de1 100644
--- a/fuchsia/engine/browser/web_engine_browser_context.cc
+++ b/fuchsia/engine/browser/web_engine_browser_context.cc
@@ -17,7 +17,7 @@
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/resource_context.h"
-#include "fuchsia/engine/browser/web_engine_net_log.h"
+#include "fuchsia/engine/browser/web_engine_net_log_observer.h"
 #include "fuchsia/engine/browser/web_engine_permission_manager.h"
 #include "services/network/public/cpp/network_switches.h"
 
@@ -31,22 +31,23 @@
   DISALLOW_COPY_AND_ASSIGN(ResourceContext);
 };
 
-std::unique_ptr<WebEngineNetLog> CreateNetLog() {
-  std::unique_ptr<WebEngineNetLog> result;
+std::unique_ptr<WebEngineNetLogObserver> CreateNetLogObserver() {
+  std::unique_ptr<WebEngineNetLogObserver> result;
 
   const base::CommandLine* command_line =
       base::CommandLine::ForCurrentProcess();
   if (command_line->HasSwitch(network::switches::kLogNetLog)) {
     base::FilePath log_path =
         command_line->GetSwitchValuePath(network::switches::kLogNetLog);
-    result = std::make_unique<WebEngineNetLog>(log_path);
+    result = std::make_unique<WebEngineNetLogObserver>(log_path);
   }
 
   return result;
 }
 
 WebEngineBrowserContext::WebEngineBrowserContext(bool force_incognito)
-    : net_log_(CreateNetLog()), resource_context_(new ResourceContext()) {
+    : net_log_observer_(CreateNetLogObserver()),
+      resource_context_(new ResourceContext()) {
   if (!force_incognito) {
     base::PathService::Get(base::DIR_APP_DATA, &data_dir_path_);
     if (!base::PathExists(data_dir_path_)) {
diff --git a/fuchsia/engine/browser/web_engine_browser_context.h b/fuchsia/engine/browser/web_engine_browser_context.h
index 975e3a2..13e7da6f 100644
--- a/fuchsia/engine/browser/web_engine_browser_context.h
+++ b/fuchsia/engine/browser/web_engine_browser_context.h
@@ -12,7 +12,7 @@
 #include "components/keyed_service/core/simple_factory_key.h"
 #include "content/public/browser/browser_context.h"
 
-class WebEngineNetLog;
+class WebEngineNetLogObserver;
 class WebEnginePermissionManager;
 
 class WebEngineBrowserContext : public content::BrowserContext {
@@ -49,7 +49,7 @@
 
   base::FilePath data_dir_path_;
 
-  std::unique_ptr<WebEngineNetLog> net_log_;
+  std::unique_ptr<WebEngineNetLogObserver> net_log_observer_;
   std::unique_ptr<SimpleFactoryKey> simple_factory_key_;
   std::unique_ptr<ResourceContext> resource_context_;
   std::unique_ptr<WebEnginePermissionManager> permission_manager_;
diff --git a/fuchsia/engine/browser/web_engine_net_log.h b/fuchsia/engine/browser/web_engine_net_log.h
deleted file mode 100644
index a052f15..0000000
--- a/fuchsia/engine/browser/web_engine_net_log.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2018 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 FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_NET_LOG_H_
-#define FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_NET_LOG_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "net/log/net_log.h"
-
-namespace base {
-class FilePath;
-}  // namespace base
-
-namespace net {
-class FileNetLogObserver;
-}  // namespace net
-
-class WebEngineNetLog : public net::NetLog {
- public:
-  explicit WebEngineNetLog(const base::FilePath& log_path);
-  ~WebEngineNetLog() override;
-
- private:
-  std::unique_ptr<net::FileNetLogObserver> file_net_log_observer_;
-
-  DISALLOW_COPY_AND_ASSIGN(WebEngineNetLog);
-};
-
-#endif  // FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_NET_LOG_H_
diff --git a/fuchsia/engine/browser/web_engine_net_log.cc b/fuchsia/engine/browser/web_engine_net_log_observer.cc
similarity index 79%
rename from fuchsia/engine/browser/web_engine_net_log.cc
rename to fuchsia/engine/browser/web_engine_net_log_observer.cc
index 1de0b49..66f4545 100644
--- a/fuchsia/engine/browser/web_engine_net_log.cc
+++ b/fuchsia/engine/browser/web_engine_net_log_observer.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "fuchsia/engine/browser/web_engine_net_log.h"
+#include "fuchsia/engine/browser/web_engine_net_log_observer.h"
 
 #include <string>
 #include <utility>
@@ -13,6 +13,7 @@
 #include "base/files/file_path.h"
 #include "base/values.h"
 #include "net/log/file_net_log_observer.h"
+#include "net/log/net_log.h"
 #include "net/log/net_log_util.h"
 
 namespace {
@@ -35,16 +36,17 @@
 
 }  // namespace
 
-WebEngineNetLog::WebEngineNetLog(const base::FilePath& log_path) {
+WebEngineNetLogObserver::WebEngineNetLogObserver(
+    const base::FilePath& log_path) {
   if (!log_path.empty()) {
     net::NetLogCaptureMode capture_mode = net::NetLogCaptureMode::kDefault;
     file_net_log_observer_ = net::FileNetLogObserver::CreateUnbounded(
         log_path, GetWebEngineConstants());
-    file_net_log_observer_->StartObserving(this, capture_mode);
+    file_net_log_observer_->StartObserving(net::NetLog::Get(), capture_mode);
   }
 }
 
-WebEngineNetLog::~WebEngineNetLog() {
+WebEngineNetLogObserver::~WebEngineNetLogObserver() {
   if (file_net_log_observer_)
     file_net_log_observer_->StopObserving(nullptr, base::OnceClosure());
 }
diff --git a/fuchsia/engine/browser/web_engine_net_log_observer.h b/fuchsia/engine/browser/web_engine_net_log_observer.h
new file mode 100644
index 0000000..8053cb1
--- /dev/null
+++ b/fuchsia/engine/browser/web_engine_net_log_observer.h
@@ -0,0 +1,31 @@
+// Copyright 2018 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 FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_NET_LOG_OBSERVER_H_
+#define FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_NET_LOG_OBSERVER_H_
+
+#include <memory>
+
+#include "base/macros.h"
+
+namespace base {
+class FilePath;
+}  // namespace base
+
+namespace net {
+class FileNetLogObserver;
+}  // namespace net
+
+class WebEngineNetLogObserver {
+ public:
+  explicit WebEngineNetLogObserver(const base::FilePath& log_path);
+  ~WebEngineNetLogObserver();
+
+ private:
+  std::unique_ptr<net::FileNetLogObserver> file_net_log_observer_;
+
+  DISALLOW_COPY_AND_ASSIGN(WebEngineNetLogObserver);
+};
+
+#endif  // FUCHSIA_ENGINE_BROWSER_WEB_ENGINE_NET_LOG_OBSERVER_H_
diff --git a/google_apis/gcm/tools/mcs_probe.cc b/google_apis/gcm/tools/mcs_probe.cc
index 97c1004..7ba2de7 100644
--- a/google_apis/gcm/tools/mcs_probe.cc
+++ b/google_apis/gcm/tools/mcs_probe.cc
@@ -216,7 +216,7 @@
   std::unique_ptr<network::TestNetworkConnectionTracker>
       network_connection_tracker_;
   std::unique_ptr<net::URLRequestContext> url_request_context_;
-  net::NetLog net_log_;
+  net::NetLog* net_log_;
   std::unique_ptr<net::FileNetLogObserver> logger_;
   MCSProbeAuthPreferences http_auth_preferences_;
 
@@ -245,6 +245,7 @@
       server_port_(0),
       network_connection_tracker_(
           network::TestNetworkConnectionTracker::CreateInstance()),
+      net_log_(net::NetLog::Get()),
       file_thread_("FileThread") {
   network_connection_tracker_->SetConnectionType(
       network::mojom::ConnectionType::CONNECTION_ETHERNET);
@@ -341,13 +342,13 @@
     logger_ = net::FileNetLogObserver::CreateUnbounded(log_path, nullptr);
     net::NetLogCaptureMode capture_mode =
         net::NetLogCaptureMode::kIncludeSensitive;
-    logger_->StartObserving(&net_log_, capture_mode);
+    logger_->StartObserving(net_log_, capture_mode);
   }
 
   net::URLRequestContextBuilder builder;
-  builder.set_net_log(&net_log_);
+  builder.set_net_log(net_log_);
   builder.set_host_resolver(
-      net::HostResolver::CreateStandaloneResolver(&net_log_));
+      net::HostResolver::CreateStandaloneResolver(net_log_));
   builder.SetHttpAuthHandlerFactory(net::HttpAuthHandlerRegistryFactory::Create(
       &http_auth_preferences_,
       std::vector<std::string>{net::kBasicAuthScheme}));
diff --git a/gpu/ipc/service/image_transport_surface_linux.cc b/gpu/ipc/service/image_transport_surface_linux.cc
index 41a2d29..c5c4d6c 100644
--- a/gpu/ipc/service/image_transport_surface_linux.cc
+++ b/gpu/ipc/service/image_transport_surface_linux.cc
@@ -23,8 +23,10 @@
 #endif
   if (!surface) {
     surface = gl::init::CreateViewGLSurface(surface_handle);
-    if (gl::GetGLImplementation() == gl::kGLImplementationDesktopGL)
+    if (gl::GetGLImplementation() == gl::kGLImplementationDesktopGL ||
+        gl::GetGLImplementation() == gl::kGLImplementationEGLANGLE) {
       override_vsync_for_multi_window_swap = true;
+    }
   }
   if (!surface)
     return surface;
diff --git a/ios/chrome/app/startup/setup_debugging.mm b/ios/chrome/app/startup/setup_debugging.mm
index 3c2fba1..06538f4 100644
--- a/ios/chrome/app/startup/setup_debugging.mm
+++ b/ios/chrome/app/startup/setup_debugging.mm
@@ -47,20 +47,21 @@
 // attempted to be loaded.
 void SwizzleUIImageImageNamed() {
   // Retained by the swizzle block.
-  NSMutableSet* whiteList = [NSMutableSet set];
+  // A set of image names that are exceptions to the 'missing image' check.
+  NSMutableSet* exceptions = [NSMutableSet set];
 
   // TODO(crbug.com/720337): Add missing image.
-  [whiteList addObject:@"card_close_button_pressed_incognito"];
+  [exceptions addObject:@"card_close_button_pressed_incognito"];
   // TODO(crbug.com/720355): Add missing image.
-  [whiteList addObject:@"find_close_pressed_incognito"];
+  [exceptions addObject:@"find_close_pressed_incognito"];
   // TODO(crbug.com/720338): Add missing images.
-  [whiteList addObject:@"glif-mic-to-dots-small_37"];
-  [whiteList addObject:@"glif-mic-to-dots-large_37"];
-  [whiteList addObject:@"glif-google-to-dots_28"];
+  [exceptions addObject:@"glif-mic-to-dots-small_37"];
+  [exceptions addObject:@"glif-mic-to-dots-large_37"];
+  [exceptions addObject:@"glif-google-to-dots_28"];
   // TODO(crbug.com/721338): Add missing image.
-  [whiteList addObject:@"voice_icon_keyboard_accessory"];
+  [exceptions addObject:@"voice_icon_keyboard_accessory"];
   // TODO(crbug.com/754032): Add missing image.
-  [whiteList addObject:@"ios_default_avatar"];
+  [exceptions addObject:@"ios_default_avatar"];
 
   // The original implementation of [UIImage imageNamed:].
   // Called by the new implementation.
@@ -73,7 +74,7 @@
     Class aClass = objc_getClass("UIImage");
     UIImage* image = imp(aClass, @selector(imageNamed:), imageName);
 
-    if (![whiteList containsObject:imageName]) {
+    if (![exceptions containsObject:imageName]) {
       DCHECK(image) << "Missing image: " << base::SysNSStringToUTF8(imageName);
     }
     return image;
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index e8fad41..b2f9585 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1153,10 +1153,10 @@
       <message name="IDS_IOS_PAGE_LOADED_ACCESSIBILITY_ANNOUNCEMENT" desc="The accessibility announcement when a page has loaded. [Length: unlimited] [iOS only]">
         Webpage loaded
       </message>
-      <message name="IDS_IOS_PASSWORD_MANAGER_BLACKLIST_BUTTON" desc="Button text for the 'Save Password' infobar's 'Never remember for this site' option [Length: 10em]">
+      <message name="IDS_IOS_PASSWORD_MANAGER_BLOCK_BUTTON" desc="Button text for the 'Save Password' infobar's 'Never remember for this site' option [Length: 10em]">
         Never
       </message>
-      <message name="IDS_IOS_PASSWORD_MANAGER_MODAL_BLACKLIST_BUTTON" desc="Button text for the 'Save Password' Infobar's Modal 'Never remember this site' option [Length: 70em]">
+      <message name="IDS_IOS_PASSWORD_MANAGER_MODAL_BLOCK_BUTTON" desc="Button text for the 'Save Password' Infobar's Modal 'Never remember this site' option [Length: 70em]">
         Never For This Site
       </message>
       <message name="IDS_IOS_PASSWORD_MANAGER_SAVE_BUTTON" desc="Save button text for password manager [Length: 10em]">
diff --git a/ios/chrome/browser/app_launcher/app_launcher_tab_helper_unittest.mm b/ios/chrome/browser/app_launcher/app_launcher_tab_helper_unittest.mm
index ec04c84..3a6aafd 100644
--- a/ios/chrome/browser/app_launcher/app_launcher_tab_helper_unittest.mm
+++ b/ios/chrome/browser/app_launcher/app_launcher_tab_helper_unittest.mm
@@ -325,8 +325,8 @@
 
 // Tests that URLs with U2F schemes are handled correctly.
 // This test is using https://chromeiostesting-dot-u2fdemo.appspot.com URL which
-// is a whitelisted URL for the purpose of testing, but the test doesn't send
-// any request to the server.
+// is a URL allowed for the purpose of testing, but the test doesn't send any
+// requests to the server.
 TEST_F(AppLauncherTabHelperTest, U2FUrls) {
   // Add required tab helpers for the U2F check.
   TabIdTabHelper::CreateForWebState(&web_state_);
diff --git a/ios/chrome/browser/application_context_impl.cc b/ios/chrome/browser/application_context_impl.cc
index 57f7671..dab41cdc 100644
--- a/ios/chrome/browser/application_context_impl.cc
+++ b/ios/chrome/browser/application_context_impl.cc
@@ -104,8 +104,6 @@
   DCHECK(!GetApplicationContext());
   SetApplicationContext(this);
 
-  net_log_ = std::make_unique<net::NetLog>();
-
   SetApplicationLocale(locale);
 
   update_client::UpdateQueryParams::SetDelegate(
@@ -296,7 +294,7 @@
 
 net::NetLog* ApplicationContextImpl::GetNetLog() {
   DCHECK(thread_checker_.CalledOnValidThread());
-  return net_log_.get();
+  return net::NetLog::Get();
 }
 
 net_log::NetExportFileWriter* ApplicationContextImpl::GetNetExportFileWriter() {
diff --git a/ios/chrome/browser/application_context_impl.h b/ios/chrome/browser/application_context_impl.h
index 383ab55c..5a7a49f 100644
--- a/ios/chrome/browser/application_context_impl.h
+++ b/ios/chrome/browser/application_context_impl.h
@@ -81,7 +81,6 @@
 
   base::ThreadChecker thread_checker_;
   std::unique_ptr<PrefService> local_state_;
-  std::unique_ptr<net::NetLog> net_log_;
   std::unique_ptr<net_log::NetExportFileWriter> net_export_file_writer_;
   std::unique_ptr<network_time::NetworkTimeTracker> network_time_tracker_;
   std::unique_ptr<IOSChromeIOThread> ios_chrome_io_thread_;
diff --git a/ios/chrome/browser/autofill/manual_fill/passwords_fetcher.mm b/ios/chrome/browser/autofill/manual_fill/passwords_fetcher.mm
index 27eb3f40..3e3f814 100644
--- a/ios/chrome/browser/autofill/manual_fill/passwords_fetcher.mm
+++ b/ios/chrome/browser/autofill/manual_fill/passwords_fetcher.mm
@@ -103,8 +103,7 @@
 
 - (void)onGetPasswordStoreResults:
     (std::vector<std::unique_ptr<autofill::PasswordForm>>)results {
-  // For Manual Fallback we filter out the android and the blacklisted
-  // passwords.
+  // Filter out Android facet IDs and any blocked passwords.
   base::EraseIf(results, [](const auto& form) {
     return form->blacklisted_by_user ||
            password_manager::IsValidAndroidFacetURI(form->signon_realm);
diff --git a/ios/chrome/browser/autofill/manual_fill/passwords_fetcher_unittest.mm b/ios/chrome/browser/autofill/manual_fill/passwords_fetcher_unittest.mm
index 2c83a0d7..0606386 100644
--- a/ios/chrome/browser/autofill/manual_fill/passwords_fetcher_unittest.mm
+++ b/ios/chrome/browser/autofill/manual_fill/passwords_fetcher_unittest.mm
@@ -111,9 +111,9 @@
     GetPasswordStore()->AddLogin(*std::move(form));
   }
 
-  // Creates and adds a blacklisted site form to never offer to save
+  // Creates and adds a blocked site form to never offer to save
   // user's password to those sites.
-  void AddBlacklistedForm() {
+  void AddBlockedForm() {
     auto form = std::make_unique<autofill::PasswordForm>();
     form->origin = GURL("http://www.secret.com/login");
     form->action = GURL("http://www.secret.com/action");
@@ -190,10 +190,10 @@
   EXPECT_TRUE(passwordFetcher);
 }
 
-// Tests PasswordFetcher ignores blacklisted passwords.
-TEST_F(PasswordFetcherTest, IgnoresBlacklisted) {
+// Tests PasswordFetcher ignores blocked passwords.
+TEST_F(PasswordFetcherTest, IgnoresBlocked) {
   AddSavedForm1();
-  AddBlacklistedForm();
+  AddBlockedForm();
   TestPasswordFetcherDelegate* passwordFetcherDelegate =
       [[TestPasswordFetcherDelegate alloc] init];
   auto passwordStore = IOSChromePasswordStoreFactory::GetForBrowserState(
diff --git a/ios/chrome/browser/geolocation/omnibox_geolocation_config.h b/ios/chrome/browser/geolocation/omnibox_geolocation_config.h
index 2dade122..7c381d9 100644
--- a/ios/chrome/browser/geolocation/omnibox_geolocation_config.h
+++ b/ios/chrome/browser/geolocation/omnibox_geolocation_config.h
@@ -15,8 +15,8 @@
 // Returns singleton object for this class.
 + (OmniboxGeolocationConfig*)sharedInstance;
 
-// Returns YES if and only if |url| has a domain that is whitelisted for
-// geolocation for Omnibox queries.
+// Returns YES if and only if |url| has a domain that is allowed for
+// geolocation use in Omnibox queries.
 - (BOOL)URLHasEligibleDomain:(const GURL&)url;
 
 @end
diff --git a/ios/chrome/browser/geolocation/omnibox_geolocation_config.mm b/ios/chrome/browser/geolocation/omnibox_geolocation_config.mm
index 687f6e3..427dbc47 100644
--- a/ios/chrome/browser/geolocation/omnibox_geolocation_config.mm
+++ b/ios/chrome/browser/geolocation/omnibox_geolocation_config.mm
@@ -23,7 +23,7 @@
 }  // namespace
 
 @interface OmniboxGeolocationConfig () {
-  // Whitelist of domains eligible for Omnibox geolocation.
+  // List of domains eligible for Omnibox geolocation.
   std::set<std::string> _eligibleDomains;
 }
 
diff --git a/ios/chrome/browser/geolocation/omnibox_geolocation_controller.mm b/ios/chrome/browser/geolocation/omnibox_geolocation_controller.mm
index b81140ce..6d64cd93 100644
--- a/ios/chrome/browser/geolocation/omnibox_geolocation_controller.mm
+++ b/ios/chrome/browser/geolocation/omnibox_geolocation_controller.mm
@@ -55,8 +55,8 @@
   kHeaderStateNotSentAuthorizationChromeDenied,
   // The user denied Chrome from using geolocation for Omnibox queries.
   kHeaderStateNotSentAuthorizationOmniboxDenied,
-  // The user's Google search domain is not whitelisted.
-  kHeaderStateNotSentDomainNotWhitelisted,
+  // The user's Google search domain is not allowed.
+  kHeaderStateNotSentDomainNotAllowed,
   // The number of possible of HeaderState values to report.
   kHeaderStateCount,
 } HeaderState;
@@ -225,7 +225,7 @@
   // Check the URL with URLIsQueryURL:transition: here and not
   // URLIsEligibleQueryURL:transition:, because we want to log the cases where
   // we did not send the X-Geo header due to the Google search domain not being
-  // whitelisted.
+  // allow-listed.
   DCHECK(item);
   const GURL& url = item->GetURL();
   if (!browserState || browserState->IsOffTheRecord() ||
@@ -234,7 +234,7 @@
   }
 
   if (![[OmniboxGeolocationConfig sharedInstance] URLHasEligibleDomain:url]) {
-    [self recordHeaderState:kHeaderStateNotSentDomainNotWhitelisted];
+    [self recordHeaderState:kHeaderStateNotSentDomainNotAllowed];
     return NO;
   }
 
diff --git a/ios/chrome/browser/metrics/first_user_action_recorder.cc b/ios/chrome/browser/metrics/first_user_action_recorder.cc
index 4033efe..ad2e2c7 100644
--- a/ios/chrome/browser/metrics/first_user_action_recorder.cc
+++ b/ios/chrome/browser/metrics/first_user_action_recorder.cc
@@ -197,8 +197,8 @@
     return false;
   }
 
-  // Processed actions must either start with 'Mobile' or be in the
-  // |new_task_actions_| whitelist.
+  // Processed actions must either start with 'Mobile' or be explicitly allowed
+  // inkNewTaskActions.
   bool known_mobile_action =
       base::StartsWith(action_name, "Mobile", base::CompareCase::SENSITIVE) ||
       ArrayContainsString(kNewTaskActions, base::size(kNewTaskActions),
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
index 67c9f1e..7355300 100644
--- a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
+++ b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
@@ -239,11 +239,10 @@
 
   if (IsMetricsReportingForceEnabled() ||
       base::FeatureList::IsEnabled(ukm::kUkmFeature)) {
-    // We only need to restrict to whitelisted Entries if metrics reporting
-    // is not forced.
-    bool restrict_to_whitelist_entries = !IsMetricsReportingForceEnabled();
+    // Only restrict to allow-listed entries if metrics reporting is not forced.
+    bool restrict_to_allowed_entries = !IsMetricsReportingForceEnabled();
     ukm_service_ = std::make_unique<ukm::UkmService>(
-        local_state, this, restrict_to_whitelist_entries,
+        local_state, this, restrict_to_allowed_entries,
         std::make_unique<metrics::DemographicMetricsProvider>(
             std::make_unique<metrics::ChromeBrowserStateClient>(),
             metrics::MetricsLogUploader::MetricServiceType::UKM));
diff --git a/ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory_util.cc b/ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory_util.cc
index 4c3d245..a0cefb4b 100644
--- a/ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory_util.cc
+++ b/ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory_util.cc
@@ -132,7 +132,7 @@
       browser_state->GetStatePath().Append(ntp_snippets::kDatabaseFolder));
 
   std::string api_key;
-  // This API needs whitelisted API keys. Get the key only if it is not a
+  // This API needs allow-listed API keys. Get the key only if it is not a
   // dummy key.
   if (google_apis::HasAPIKeyConfigured()) {
     bool is_stable_channel = GetChannel() == version_info::Channel::STABLE;
diff --git a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm
index 2b84c94..068285f 100644
--- a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm
+++ b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm
@@ -177,7 +177,7 @@
         return IsPasswordUpdate()
                    ? base::string16()
                    : l10n_util::GetStringUTF16(
-                         IDS_IOS_PASSWORD_MANAGER_MODAL_BLACKLIST_BUTTON);
+                         IDS_IOS_PASSWORD_MANAGER_MODAL_BLOCK_BUTTON);
       }
       case BUTTON_NONE:
         NOTREACHED();
@@ -186,7 +186,7 @@
   } else {
     return l10n_util::GetStringUTF16(
         (button == BUTTON_OK) ? IDS_IOS_PASSWORD_MANAGER_SAVE_BUTTON
-                              : IDS_IOS_PASSWORD_MANAGER_BLACKLIST_BUTTON);
+                              : IDS_IOS_PASSWORD_MANAGER_BLOCK_BUTTON);
   }
 }
 
diff --git a/ios/chrome/browser/payments/ios_payment_instrument_finder.h b/ios/chrome/browser/payments/ios_payment_instrument_finder.h
index fc5bfa7..77c36c1 100644
--- a/ios/chrome/browser/payments/ios_payment_instrument_finder.h
+++ b/ios/chrome/browser/payments/ios_payment_instrument_finder.h
@@ -38,10 +38,10 @@
 // class validates the requested url payment methods by filtering out methods
 // that cannot be handled by an installed app on the user's device. This filter
 // is done by using the payment method's corresponding URL scheme and the
-// canOpenUrl function of UIApplication. This check also serves as a whitelist
-// for allowed payment method identifiers such that only the URL schemes of
+// canOpenUrl function of UIApplication. This check also serves as a list
+// of allowed payment method identifiers such that only the URL schemes of
 // listed payment method identifiers can be queried. If the identifier is not on
-// this whitelist the validation check fails for that payment method.
+// this list the validation check fails for that payment method.
 //
 // After validating the requested payment methods, the class downloads the
 // payment method's manifest and web app manifest in order to collect the
diff --git a/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_client.mm b/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_client.mm
index 42bd110..12b5a7c4 100644
--- a/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_client.mm
+++ b/ios/chrome/browser/sessions/ios_chrome_tab_restore_service_client.mm
@@ -109,9 +109,9 @@
 bool IOSChromeTabRestoreServiceClient::ShouldTrackURLForRestore(
     const GURL& url) {
   // NOTE: In the //chrome client, chrome://quit and chrome://restart are
-  // blacklisted from being tracked to avoid entering infinite loops. However,
+  // blocked from being tracked to avoid entering infinite loops. However,
   // iOS intentionally does not support those URLs, so there is no need to
-  // blacklist them here.
+  // block them here.
   return url.is_valid();
 }
 
diff --git a/ios/chrome/browser/suggestions/suggestions_service_factory.mm b/ios/chrome/browser/suggestions/suggestions_service_factory.mm
index d6be8c1..2c7dfa2e 100644
--- a/ios/chrome/browser/suggestions/suggestions_service_factory.mm
+++ b/ios/chrome/browser/suggestions/suggestions_service_factory.mm
@@ -66,13 +66,13 @@
 
   std::unique_ptr<SuggestionsStore> suggestions_store(
       new SuggestionsStore(browser_state->GetPrefs()));
-  std::unique_ptr<BlacklistStore> blacklist_store(
+  std::unique_ptr<BlacklistStore> blocked_suggestions(
       new BlacklistStore(browser_state->GetPrefs()));
 
   return std::make_unique<SuggestionsServiceImpl>(
       identity_manager, sync_service,
       browser_state->GetSharedURLLoaderFactory(), std::move(suggestions_store),
-      std::move(blacklist_store), base::DefaultTickClock::GetInstance());
+      std::move(blocked_suggestions), base::DefaultTickClock::GetInstance());
 }
 
 void SuggestionsServiceFactory::RegisterBrowserStatePrefs(
diff --git a/ios/chrome/browser/sync/session_sync_service_factory.mm b/ios/chrome/browser/sync/session_sync_service_factory.mm
index 26bd48a..4dad871 100644
--- a/ios/chrome/browser/sync/session_sync_service_factory.mm
+++ b/ios/chrome/browser/sync/session_sync_service_factory.mm
@@ -40,7 +40,7 @@
 
 bool ShouldSyncURLImpl(const GURL& url) {
   if (url == kChromeUIHistoryURL) {
-    // Whitelist the chrome history page, home for "Tabs from other devices",
+    // Allow the chrome history page, home for "Tabs from other devices",
     // so it can trigger starting up the sync engine.
     return true;
   }
diff --git a/ios/chrome/browser/translate/translate_egtest.mm b/ios/chrome/browser/translate/translate_egtest.mm
index ff3f1f56..1af49c8 100644
--- a/ios/chrome/browser/translate/translate_egtest.mm
+++ b/ios/chrome/browser/translate/translate_egtest.mm
@@ -1036,12 +1036,12 @@
 
   [self assertTranslateInfobarIsVisible];
 
-  // Make sure that French to English translation is not whitelisted.
+  // Make sure that French to English translation is not automatic.
   std::unique_ptr<translate::TranslatePrefs> translatePrefs(
       ChromeIOSTranslateClient::CreateTranslatePrefs(
           chrome_test_util::GetOriginalBrowserState()->GetPrefs()));
   GREYAssert(!translatePrefs->IsLanguagePairWhitelisted("fr", "en"),
-             @"French to English translation is whitelisted");
+             @"French to English translation is automatic");
 
   // Open the translate options menu.
   [[EarlGrey selectElementWithMatcher:OptionsButton()]
@@ -1058,9 +1058,9 @@
   // Make sure the page is not translated yet.
   [ChromeEarlGrey waitForWebStateNotContainingText:"Translated"];
 
-  // Make sure that French to English translation is not whitelisted yet.
+  // Make sure that French to English translation is not automatic yet.
   GREYAssert(!translatePrefs->IsLanguagePairWhitelisted("fr", "en"),
-             @"French to English translation is whitelisted");
+             @"French to English translation is automatic");
 
   // Tap the notification snackbar to dismiss it.
   NSString* snackbarTitle =
@@ -1073,10 +1073,10 @@
   // Make sure the page is translated after the snackbar is dismissed.
   [ChromeEarlGrey waitForWebStateContainingText:"Translated"];
 
-  // Make sure that French to English translation is whitelisted after the
+  // Make sure that French to English translation is automatic after the
   // snackbar is dismissed.
   GREYAssert(translatePrefs->IsLanguagePairWhitelisted("fr", "en"),
-             @"French to English translation is not whitelisted");
+             @"French to English translation is not automatic");
 
   // Reload the page.
   [ChromeEarlGrey reload];
@@ -1101,9 +1101,9 @@
   [[[EarlGrey selectElementWithMatcher:AlwaysTranslate(@"French")]
       assertWithMatcher:ElementIsSelected(YES)] performAction:grey_tap()];
 
-  // Make sure that French to English translation is no longer whitelisted.
+  // Make sure that French to English translation is no longer automatic.
   GREYAssert(!translatePrefs->IsLanguagePairWhitelisted("fr", "en"),
-             @"French to English translation is whitelisted");
+             @"French to English translation is automatic");
 
   // Open the translate options menu.
   [[EarlGrey selectElementWithMatcher:OptionsButton()]
@@ -1124,9 +1124,9 @@
   [[EarlGrey selectElementWithMatcher:AlwaysTranslate(@"French")]
       assertWithMatcher:ElementIsSelected(NO)];
 
-  // Make sure that French to English translation is not whitelisted.
+  // Make sure that French to English translation is not automatic.
   GREYAssert(!translatePrefs->IsLanguagePairWhitelisted("fr", "en"),
-             @"French to English translation is whitelisted");
+             @"French to English translation is automatic");
 }
 
 // Tests that "Always Translate" is automatically triggered after a minimum
@@ -1143,12 +1143,12 @@
 
   [self assertTranslateInfobarIsVisible];
 
-  // Make sure that French to English translation is not whitelisted.
+  // Make sure that French to English translation is not automatic.
   std::unique_ptr<translate::TranslatePrefs> translatePrefs(
       ChromeIOSTranslateClient::CreateTranslatePrefs(
           chrome_test_util::GetOriginalBrowserState()->GetPrefs()));
   GREYAssert(!translatePrefs->IsLanguagePairWhitelisted("fr", "en"),
-             @"French to English translation is whitelisted");
+             @"French to English translation is automatic");
 
   // Translate the page by tapping the target language tab until
   // "Always Translate" is automatically triggered.
@@ -1160,9 +1160,9 @@
         performAction:grey_tap()];
   }
 
-  // Make sure that French to English translation is not whitelisted yet.
+  // Make sure that French to English translation is not automatic yet.
   GREYAssert(!translatePrefs->IsLanguagePairWhitelisted("fr", "en"),
-             @"French to English translation is whitelisted");
+             @"French to English translation is automatic");
 
   // Tap the notification snackbar to dismiss it.
   NSString* snackbarTitle =
@@ -1172,10 +1172,10 @@
   [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(snackbarTitle)]
       performAction:grey_tap()];
 
-  // Make sure that French to English translation is whitelisted after the
+  // Make sure that French to English translation is automatic after the
   // snackbar is dismissed.
   GREYAssert(translatePrefs->IsLanguagePairWhitelisted("fr", "en"),
-             @"French to English translation is not whitelisted");
+             @"French to English translation is not automatic");
 }
 
 // Tests that "Always Translate" is automatically triggered only for a maximum
@@ -1192,12 +1192,12 @@
 
   [self assertTranslateInfobarIsVisible];
 
-  // Make sure that French to English translation is not whitelisted.
+  // Make sure that French to English translation is not automatic.
   std::unique_ptr<translate::TranslatePrefs> translatePrefs(
       ChromeIOSTranslateClient::CreateTranslatePrefs(
           chrome_test_util::GetOriginalBrowserState()->GetPrefs()));
   GREYAssert(!translatePrefs->IsLanguagePairWhitelisted("fr", "en"),
-             @"French to English translation is whitelisted");
+             @"French to English translation is automatic");
 
   // Trigger and refuse the auto "Always Translate".
   for (int i = 0;
diff --git a/ios/chrome/browser/u2f/u2f_controller.mm b/ios/chrome/browser/u2f/u2f_controller.mm
index 835703a9..cdfdd31 100644
--- a/ios/chrome/browser/u2f/u2f_controller.mm
+++ b/ios/chrome/browser/u2f/u2f_controller.mm
@@ -41,7 +41,7 @@
 // requests' results from the U2F callback URL.
 - (base::string16)JSStringFromReponseURL:(const GURL&)URL;
 
-// Checks if the source URL has Google domain or whitelisted test domain.
+// Checks if the source URL has Google domain or allow-listed test domain.
 - (BOOL)shouldAllowSourceURL:(const GURL&)sourceURL;
 
 @end
@@ -70,7 +70,7 @@
     return GURL();
   }
 
-  // Check if the webpage has Google or whitelisted test domain.
+  // Check if the webpage has Google or allowed test domain.
   if (![self shouldAllowSourceURL:originURL]) {
     return GURL();
   }
@@ -204,11 +204,12 @@
     return YES;
   }
 
-  NSSet* whitelistedDomains =
-      [NSSet setWithObjects:@"u2fdemo.appspot.com",
-                            @"chromeiostesting-dot-u2fdemo.appspot.com", nil];
   NSString* sourceDomain = base::SysUTF8ToNSString(sourceURL.host());
-  return [whitelistedDomains containsObject:sourceDomain];
+  // Convert this condition to checking membership in a set if any new cases
+  // need to be added.
+  return [sourceDomain isEqualToString:@"u2fdemo.appspot.com"] ||
+         [sourceDomain
+             isEqualToString:@"chromeiostesting-dot-u2fdemo.appspot.com"];
 }
 
 @end
diff --git a/ios/chrome/browser/u2f/u2f_controller_unittest.mm b/ios/chrome/browser/u2f/u2f_controller_unittest.mm
index 92500371..7ad1cb27 100644
--- a/ios/chrome/browser/u2f/u2f_controller_unittest.mm
+++ b/ios/chrome/browser/u2f/u2f_controller_unittest.mm
@@ -127,8 +127,8 @@
   EXPECT_EQ(1u, [duplicatedParamsMatches count]);
 }
 
-TEST_F(U2FControllerTest, XCallbackFromRequestURLWithNonWhitelistedURLTest) {
-  // Test when request site is not whitelisted.
+TEST_F(U2FControllerTest, XCallbackFromRequestURLWithNonAllowListedURLTest) {
+  // Test when request site is not in an allow-listed domain.
   GURL requestURL("u2f://accounts.google.com?data=abc&def%26ghi");
   GURL evilOriginURL("https://evil.appspot.com");
   GURL tabURL("https://accounts.google.com");
diff --git a/ios/chrome/browser/u2f/u2f_tab_helper_unittest.mm b/ios/chrome/browser/u2f/u2f_tab_helper_unittest.mm
index 6b59b85..2961913c 100644
--- a/ios/chrome/browser/u2f/u2f_tab_helper_unittest.mm
+++ b/ios/chrome/browser/u2f/u2f_tab_helper_unittest.mm
@@ -147,8 +147,8 @@
   EXPECT_EQ(1u, [matches count]);
 }
 
-// Tests when request site is not whitelisted.
-TEST_F(U2FTabHelperTest, TestGetXCallbackUrlWithNonWhitelistedUrl) {
+// Tests when request site is not allow-listed.
+TEST_F(U2FTabHelperTest, TestGetXCallbackUrlWithNonAllowListedUrl) {
   GURL request_url("u2f://accounts.google.com?data=abc&def%26ghi");
   GURL evil_origin_url("https://evil.appspot.com");
   GURL tab_url("https://accounts.google.com");
diff --git a/ios/chrome/browser/ui/authentication/chrome_signin_view_controller_unittest.mm b/ios/chrome/browser/ui/authentication/chrome_signin_view_controller_unittest.mm
index c65bb32f..5665d2ec 100644
--- a/ios/chrome/browser/ui/authentication/chrome_signin_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/authentication/chrome_signin_view_controller_unittest.mm
@@ -123,7 +123,7 @@
 // If one of those tests fails, one of the following methods should be updated
 // with the added or removed strings:
 //   - ExpectedConsentStringIds()
-//   - WhiteListLocalizedStrings()
+//   - LocalizedStringExceptions()
 class ChromeSigninViewControllerTest
     : public PlatformTest,
       public ::testing::WithParamInterface<bool> {
@@ -243,7 +243,7 @@
     for (auto it = string_ids.begin(); it != string_ids.end(); ++it) {
       [set addObject:LocalizedStringFromID(*it)];
     }
-    [set unionSet:WhiteListLocalizedStrings()];
+    [set unionSet:LocalizedStringExceptions()];
     return set;
   }
 
@@ -259,9 +259,9 @@
     };
   }
 
-  // Returns the white list of strings that can be displayed on screen but
+  // Returns the list of strings that can be displayed on screen but
   // should not be part of ExpectedConsentStringIds().
-  NSSet<NSString*>* WhiteListLocalizedStrings() const {
+  NSSet<NSString*>* LocalizedStringExceptions() const {
     return [NSSet setWithObjects:@"Fake Foo 1", @"foo1@gmail.com", @"CANCEL",
                                  @"YES, I'M IN", nil];
   }
@@ -359,7 +359,7 @@
 // Tests that all strings on the screen are either part of the consent string
 // list defined in FakeConsentAuditor::ExpectedConsentStringIds()), or are part
 // of the white list strings defined in
-// FakeConsentAuditor::WhiteListLocalizedStrings().
+// FakeConsentAuditor::LocalizedStringExceptions().
 TEST_F(ChromeSigninViewControllerTest, TestAllStrings) {
   WaitAndExpectAllStringsOnScreen();
 }
diff --git a/ios/chrome/browser/ui/autofill/autofill_app_interface.mm b/ios/chrome/browser/ui/autofill/autofill_app_interface.mm
index d480540..2434957 100644
--- a/ios/chrome/browser/ui/autofill/autofill_app_interface.mm
+++ b/ios/chrome/browser/ui/autofill/autofill_app_interface.mm
@@ -84,7 +84,7 @@
   // Temporary cache of obtained store results.
   std::vector<std::unique_ptr<autofill::PasswordForm>> obtained_;
 
-  // Combination of fillable and blacklisted credentials from the store.
+  // Combination of fillable and blocked credentials from the store.
   std::vector<autofill::PasswordForm> results_;
 };
 
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h
index 42c088c..0fb5ef27 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.h
@@ -76,11 +76,11 @@
 // The notification promo owned by this mediator.
 - (nonnull NotificationPromoWhatsNew*)notificationPromo;
 
-// Blacklists the URL from the Most Visited sites.
-- (void)blacklistMostVisitedURL:(GURL)URL;
+// Block |URL| from Most Visited sites.
+- (void)blockMostVisitedURL:(GURL)URL;
 
-// Whitelists the URL from the Most Visited sites.
-- (void)whitelistMostVisitedURL:(GURL)URL;
+// Always allow |URL| in Most Visited sites.
+- (void)allowMostVisitedURL:(GURL)URL;
 
 // Get the maximum number of sites shown.
 + (NSUInteger)maxSitesShown;
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
index 3e43e349..b93abfed 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
@@ -167,12 +167,12 @@
   return self;
 }
 
-- (void)blacklistMostVisitedURL:(GURL)URL {
+- (void)blockMostVisitedURL:(GURL)URL {
   _mostVisitedSites->AddOrRemoveBlacklistedUrl(URL, true);
   [self useFreshMostVisited];
 }
 
-- (void)whitelistMostVisitedURL:(GURL)URL {
+- (void)allowMostVisitedURL:(GURL)URL {
   _mostVisitedSites->AddOrRemoveBlacklistedUrl(URL, false);
   [self useFreshMostVisited];
 }
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm
index 7fd32db8..51995fc 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm
@@ -443,7 +443,7 @@
 
 - (void)removeMostVisited:(ContentSuggestionsMostVisitedItem*)item {
   base::RecordAction(base::UserMetricsAction("MostVisited_UrlBlacklisted"));
-  [self.suggestionsMediator blacklistMostVisitedURL:item.URL];
+  [self.suggestionsMediator blockMostVisitedURL:item.URL];
   [self showMostVisitedUndoForURL:item.URL];
 }
 
@@ -549,7 +549,7 @@
     NTPHomeMediator* strongSelf = weakSelf;
     if (!strongSelf)
       return;
-    [strongSelf.suggestionsMediator whitelistMostVisitedURL:copiedURL];
+    [strongSelf.suggestionsMediator allowMostVisitedURL:copiedURL];
   };
   action.title = l10n_util::GetNSString(IDS_NEW_TAB_UNDO_THUMBNAIL_REMOVE);
   action.accessibilityIdentifier = @"Undo";
diff --git a/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm b/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm
index dc07d48..99e36238 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm
+++ b/ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.mm
@@ -228,7 +228,7 @@
                    animated:YES
                  completion:^{
                    // Completely remove the Infobar along with its badge after
-                   // blacklisting the Website.
+                   // blocking the Website.
                    [self detachView];
                  }];
 }
diff --git a/ios/chrome/browser/ui/infobars/modals/infobar_password_modal_delegate.h b/ios/chrome/browser/ui/infobars/modals/infobar_password_modal_delegate.h
index a1594e3..a12598e 100644
--- a/ios/chrome/browser/ui/infobars/modals/infobar_password_modal_delegate.h
+++ b/ios/chrome/browser/ui/infobars/modals/infobar_password_modal_delegate.h
@@ -17,7 +17,7 @@
 - (void)updateCredentialsWithUsername:(NSString*)username
                              password:(NSString*)password;
 
-// Blacklists the current site to never prompt the user to save its credentials
+// Blocks the current site to never prompt the user to save its credentials
 // again.
 - (void)neverSaveCredentialsForCurrentSite;
 
diff --git a/ios/chrome/browser/ui/settings/password/password_details_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/password/password_details_table_view_controller_unittest.mm
index 23b5f92..ee78dc00 100644
--- a/ios/chrome/browser/ui/settings/password/password_details_table_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/settings/password/password_details_table_view_controller_unittest.mm
@@ -30,7 +30,7 @@
 NSString* const kUsername = @"testusername";
 NSString* const kPassword = @"testpassword";
 
-// Indices related to the layout for a non-blacklisted, non-federated password.
+// Indices related to the layout for a non-blocked, non-federated password.
 const int kSiteSection = 0;
 const int kSiteItem = 0;
 const int kCopySiteButtonItem = 1;
@@ -119,13 +119,13 @@
                           kDeleteSection, kDeleteButtonItem);
 }
 
-TEST_F(PasswordDetailsTableViewControllerTest, TestInitialization_Blacklisted) {
-  constexpr int kBlacklistedSiteSection = 0;
-  constexpr int kBlacklistedSiteItem = 0;
-  constexpr int kBlacklistedCopySiteButtonItem = 1;
+TEST_F(PasswordDetailsTableViewControllerTest, TestInitialization_Blocked) {
+  constexpr int kBlockedSiteSection = 0;
+  constexpr int kBlockedSiteItem = 0;
+  constexpr int kBlockedCopySiteButtonItem = 1;
 
-  constexpr int kBlacklistedDeleteSection = 1;
-  constexpr int kBlacklistedDeleteButtonItem = 0;
+  constexpr int kBlockedDeleteSection = 1;
+  constexpr int kBlockedDeleteButtonItem = 0;
 
   form_.username_value.clear();
   form_.password_value.clear();
@@ -134,21 +134,19 @@
   CheckController();
   EXPECT_EQ(2, NumberOfSections());
   // Site section
-  EXPECT_EQ(2, NumberOfItemsInSection(kBlacklistedSiteSection));
+  EXPECT_EQ(2, NumberOfItemsInSection(kBlockedSiteSection));
   CheckSectionHeaderWithId(IDS_IOS_SHOW_PASSWORD_VIEW_SITE,
-                           kBlacklistedSiteSection);
+                           kBlockedSiteSection);
   TableViewTextItem* siteItem =
-      GetTableViewItem(kBlacklistedSiteSection, kBlacklistedSiteItem);
+      GetTableViewItem(kBlockedSiteSection, kBlockedSiteItem);
   EXPECT_NSEQ(origin_, siteItem.text);
   EXPECT_FALSE(siteItem.masked);
   CheckTextCellTextWithId(IDS_IOS_SETTINGS_SITE_COPY_BUTTON,
-                          kBlacklistedSiteSection,
-                          kBlacklistedCopySiteButtonItem);
+                          kBlockedSiteSection, kBlockedCopySiteButtonItem);
   // Delete section
-  EXPECT_EQ(1, NumberOfItemsInSection(kBlacklistedDeleteSection));
+  EXPECT_EQ(1, NumberOfItemsInSection(kBlockedDeleteSection));
   CheckTextCellTextWithId(IDS_IOS_SETTINGS_PASSWORD_DELETE_BUTTON,
-                          kBlacklistedDeleteSection,
-                          kBlacklistedDeleteButtonItem);
+                          kBlockedDeleteSection, kBlockedDeleteButtonItem);
 }
 
 TEST_F(PasswordDetailsTableViewControllerTest, TestInitialization_Federated) {
diff --git a/ios/chrome/browser/ui/settings/password/passwords_settings_app_interface.h b/ios/chrome/browser/ui/settings/password/passwords_settings_app_interface.h
index 13b73acb..f452674 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_settings_app_interface.h
+++ b/ios/chrome/browser/ui/settings/password/passwords_settings_app_interface.h
@@ -34,8 +34,8 @@
                    userName:(NSString*)userName
                      origin:(NSString*)origin;
 
-// Creates a blacklisted password form for given origin.
-+ (BOOL)saveExampleBlacklistedOrigin:(NSString*)origin;
+// Creates a blocked password form for given origin.
++ (BOOL)saveExampleBlockedOrigin:(NSString*)origin;
 
 // Creates a federated password form for given origins and user.
 + (BOOL)saveExampleFederatedOrigin:(NSString*)federatedOrigin
diff --git a/ios/chrome/browser/ui/settings/password/passwords_settings_app_interface.mm b/ios/chrome/browser/ui/settings/password/passwords_settings_app_interface.mm
index 7ce8a87..c59f769 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_settings_app_interface.mm
+++ b/ios/chrome/browser/ui/settings/password/passwords_settings_app_interface.mm
@@ -181,7 +181,7 @@
   return SaveToPasswordStore(example);
 }
 
-+ (BOOL)saveExampleBlacklistedOrigin:(NSString*)origin {
++ (BOOL)saveExampleBlockedOrigin:(NSString*)origin {
   PasswordForm example;
   example.origin = GURL(base::SysNSStringToUTF16(origin));
   example.blacklisted_by_user = true;
diff --git a/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm b/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm
index ed2a4ada..8bd8f88 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm
@@ -330,13 +330,13 @@
              @"Stored form was not found in the PasswordStore results.");
 }
 
-// Saves two example blacklisted forms in the store.
-void SaveExampleBlacklistedForms() {
+// Saves two example blocked forms in the store.
+void SaveExampleBlockedForms() {
   GREYAssert([PasswordSettingsAppInterface
-                 saveExampleBlacklistedOrigin:@"https://exclude1.com"],
+                 saveExampleBlockedOrigin:@"https://exclude1.com"],
              @"Stored form was not found in the PasswordStore results.");
   GREYAssert([PasswordSettingsAppInterface
-                 saveExampleBlacklistedOrigin:@"https://exclude2.com"],
+                 saveExampleBlockedOrigin:@"https://exclude2.com"],
              @"Stored form was not found in the PasswordStore results.");
 }
 
@@ -682,9 +682,9 @@
       performAction:grey_tap()];
 }
 
-// Checks that deleting a blacklisted form from password details view goes
+// Checks that deleting a blocked form from password details view goes
 // back to the list-of-passwords view which doesn't display that form anymore.
-- (void)testBlacklistedFormDeletionInDetailView {
+- (void)testBlockedFormDeletionInDetailView {
   // TODO(crbug.com/1023619): Enable the test on 13.2+ iPad once the bug is
   // fixed.
   if (base::ios::IsRunningOnOrLater(13, 2, 0) && [ChromeEarlGrey isIPadIdiom]) {
@@ -692,12 +692,12 @@
   }
   // Save blacklisted form to be deleted later.
   GREYAssert([PasswordSettingsAppInterface
-                 saveExampleBlacklistedOrigin:@"https://blacklisted.com"],
+                 saveExampleBlockedOrigin:@"https://blocked.com"],
              @"Stored form was not found in the PasswordStore results.");
 
   OpenPasswordSettings();
 
-  [GetInteractionForPasswordEntry(@"blacklisted.com") performAction:grey_tap()];
+  [GetInteractionForPasswordEntry(@"blocked.com") performAction:grey_tap()];
 
   [GetInteractionForPasswordDetailItem(DeleteButton())
       performAction:grey_tap()];
@@ -1019,7 +1019,7 @@
 }
 
 // Checks the order of the elements in the detail view layout for a
-// non-federated, non-blacklisted credential.
+// non-federated, non-blocked credential.
 - (void)testLayoutNormal {
   SaveExamplePasswordForm();
 
@@ -1075,11 +1075,11 @@
       performAction:grey_tap()];
 }
 
-// Checks the order of the elements in the detail view layout for a blacklisted
+// Checks the order of the elements in the detail view layout for a blocked
 // credential.
-- (void)testLayoutBlacklisted {
+- (void)testLayoutForBlockedCredential {
   GREYAssert([PasswordSettingsAppInterface
-                 saveExampleBlacklistedOrigin:@"https://example.com"],
+                 saveExampleBlockedOrigin:@"https://example.com"],
              @"Stored form was not found in the PasswordStore results.");
 
   OpenPasswordSettings();
@@ -1174,7 +1174,7 @@
   SaveExamplePasswordForm();
 
   GREYAssert([PasswordSettingsAppInterface
-                 saveExampleBlacklistedOrigin:@"https://blacklisted.com"],
+                 saveExampleBlockedOrigin:@"https://blocked.com"],
              @"Stored form was not found in the PasswordStore results.");
 
   OpenPasswordSettings();
@@ -1199,7 +1199,7 @@
     // Check the stored items. Scroll down if needed.
     [GetInteractionForPasswordEntry(@"example.com, concrete username")
         assertWithMatcher:grey_notNil()];
-    [GetInteractionForPasswordEntry(@"blacklisted.com")
+    [GetInteractionForPasswordEntry(@"blocked.com")
         assertWithMatcher:grey_notNil()];
   }
 
@@ -1492,11 +1492,11 @@
                             UIAccessibilityTraitNotEnabled))];
 }
 
-// Test that when user types text in search field, passwords and blacklisted
+// Test that when user types text in search field, passwords and blocked
 // items are filtered out and "save passwords" switch is removed.
 - (void)testSearchPasswords {
   SaveExamplePasswordForms();
-  SaveExampleBlacklistedForms();
+  SaveExampleBlockedForms();
 
   OpenPasswordSettings();
 
@@ -1527,10 +1527,10 @@
       assertWithMatcher:grey_notNil()];
 }
 
-// Test search and delete all passwords and blacklisted items.
+// Test search and delete all passwords and blocked items.
 - (void)testSearchAndDeleteAllPasswords {
   SaveExamplePasswordForms();
-  SaveExampleBlacklistedForms();
+  SaveExampleBlockedForms();
 
   OpenPasswordSettings();
 
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 f69ccbb..78449de6 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
@@ -68,7 +68,7 @@
 typedef NS_ENUM(NSInteger, SectionIdentifier) {
   SectionIdentifierSavePasswordsSwitch = kSectionIdentifierEnumZero,
   SectionIdentifierSavedPasswords,
-  SectionIdentifierBlacklist,
+  SectionIdentifierBlocked,
   SectionIdentifierExportPasswordsButton,
 };
 
@@ -77,7 +77,7 @@
   ItemTypeHeader,
   ItemTypeSavePasswordsSwitch,
   ItemTypeSavedPassword,  // This is a repeated item type.
-  ItemTypeBlacklisted,    // This is a repeated item type.
+  ItemTypeBlocked,        // This is a repeated item type.
   ItemTypeExportPasswordsButton,
 };
 
@@ -99,14 +99,14 @@
 @implementation PasswordFormContentItem
 @end
 
-// Use the type of the items to convey the Saved/Blacklisted status.
+// Use the type of the items to convey the Saved/Blocked status.
 @interface SavedFormContentItem : PasswordFormContentItem
 @end
 @implementation SavedFormContentItem
 @end
-@interface BlacklistedFormContentItem : PasswordFormContentItem
+@interface BlockedFormContentItem : PasswordFormContentItem
 @end
-@implementation BlacklistedFormContentItem
+@implementation BlockedFormContentItem
 @end
 
 @protocol PasswordExportActivityViewControllerDelegate <NSObject>
@@ -174,12 +174,12 @@
   std::unique_ptr<ios::SavePasswordsConsumer> savedPasswordsConsumer_;
   // The list of the user's saved passwords.
   std::vector<std::unique_ptr<autofill::PasswordForm>> savedForms_;
-  // The list of the user's blacklisted sites.
-  std::vector<std::unique_ptr<autofill::PasswordForm>> blacklistedForms_;
+  // The list of the user's blocked sites.
+  std::vector<std::unique_ptr<autofill::PasswordForm>> blockedForms_;
   // Map containing duplicates of saved passwords.
   password_manager::DuplicatesMap savedPasswordDuplicates_;
-  // Map containing duplicates of blacklisted passwords.
-  password_manager::DuplicatesMap blacklistedPasswordDuplicates_;
+  // Map containing duplicates of blocked passwords.
+  password_manager::DuplicatesMap blockedPasswordDuplicates_;
   // The current Chrome browser state.
   ios::ChromeBrowserState* browserState_;
   // Authentication Service Observer.
@@ -365,14 +365,14 @@
   }
 
   // Blacklisted passwords.
-  if (!blacklistedForms_.empty()) {
-    [model addSectionWithIdentifier:SectionIdentifierBlacklist];
+  if (!blockedForms_.empty()) {
+    [model addSectionWithIdentifier:SectionIdentifierBlocked];
     TableViewTextHeaderFooterItem* headerItem =
         [[TableViewTextHeaderFooterItem alloc] initWithType:ItemTypeHeader];
     headerItem.text =
         l10n_util::GetNSString(IDS_IOS_SETTINGS_PASSWORDS_EXCEPTIONS_HEADING);
     [model setHeader:headerItem
-        forSectionWithIdentifier:SectionIdentifierBlacklist];
+        forSectionWithIdentifier:SectionIdentifierBlocked];
   }
 
   // Export passwords button.
@@ -400,7 +400,7 @@
 
 - (BOOL)editButtonEnabled {
   DCHECK([self shouldShowEditButton]);
-  return !savedForms_.empty() || !blacklistedForms_.empty();
+  return !savedForms_.empty() || !blockedForms_.empty();
 }
 
 #pragma mark - SettingsControllerProtocol
@@ -459,11 +459,11 @@
   return passwordItem;
 }
 
-- (BlacklistedFormContentItem*)
-    blacklistedFormItemWithText:(NSString*)text
-                        forForm:(autofill::PasswordForm*)form {
-  BlacklistedFormContentItem* passwordItem =
-      [[BlacklistedFormContentItem alloc] initWithType:ItemTypeBlacklisted];
+- (BlockedFormContentItem*)blockedFormItemWithText:(NSString*)text
+                                           forForm:
+                                               (autofill::PasswordForm*)form {
+  BlockedFormContentItem* passwordItem =
+      [[BlockedFormContentItem alloc] initWithType:ItemTypeBlocked];
   passwordItem.text = text;
   passwordItem.form = form;
   passwordItem.accessibilityTraits |= UIAccessibilityTraitButton;
@@ -508,15 +508,15 @@
   }
   for (auto& form : results) {
     if (form->blacklisted_by_user)
-      blacklistedForms_.push_back(std::move(form));
+      blockedForms_.push_back(std::move(form));
     else
       savedForms_.push_back(std::move(form));
   }
 
   password_manager::SortEntriesAndHideDuplicates(&savedForms_,
                                                  &savedPasswordDuplicates_);
-  password_manager::SortEntriesAndHideDuplicates(
-      &blacklistedForms_, &blacklistedPasswordDuplicates_);
+  password_manager::SortEntriesAndHideDuplicates(&blockedForms_,
+                                                 &blockedPasswordDuplicates_);
 
   [self updateUIForEditState];
   [self reloadData];
@@ -663,10 +663,10 @@
         [model sectionForSectionIdentifier:SectionIdentifierSavedPasswords];
     [indexSet addIndex:passwordSection];
   }
-  if ([model hasSectionForSectionIdentifier:SectionIdentifierBlacklist]) {
-    NSInteger blacklistedSection =
-        [model sectionForSectionIdentifier:SectionIdentifierBlacklist];
-    [indexSet addIndex:blacklistedSection];
+  if ([model hasSectionForSectionIdentifier:SectionIdentifierBlocked]) {
+    NSInteger blockedSection =
+        [model sectionForSectionIdentifier:SectionIdentifierBlocked];
+    [indexSet addIndex:blockedSection];
   }
   if (indexSet.count > 0) {
     BOOL animationsWereEnabled = [UIView areAnimationsEnabled];
@@ -677,7 +677,7 @@
   }
 }
 
-// Builds the filtered list of passwords/blacklisted based on given
+// Builds the filtered list of passwords/blocked based on given
 // |searchTerm|.
 - (void)filterItems:(NSString*)searchTerm {
   TableViewModel* model = self.tableViewModel;
@@ -702,22 +702,22 @@
     }
   }
 
-  if (!blacklistedForms_.empty()) {
-    [model deleteAllItemsFromSectionWithIdentifier:SectionIdentifierBlacklist];
-    for (const auto& form : blacklistedForms_) {
+  if (!blockedForms_.empty()) {
+    [model deleteAllItemsFromSectionWithIdentifier:SectionIdentifierBlocked];
+    for (const auto& form : blockedForms_) {
       NSString* text = base::SysUTF8ToNSString(
           password_manager::GetShownOriginAndLinkUrl(*form).first);
       bool hidden = searchTerm.length > 0 &&
                     ![text localizedCaseInsensitiveContainsString:searchTerm];
       if (hidden)
         continue;
-      [model addItem:[self blacklistedFormItemWithText:text forForm:form.get()]
-          toSectionWithIdentifier:SectionIdentifierBlacklist];
+      [model addItem:[self blockedFormItemWithText:text forForm:form.get()]
+          toSectionWithIdentifier:SectionIdentifierBlocked];
     }
   }
 }
 
-// Starts requests for saved and blacklisted passwords to the store.
+// Starts requests for saved and blocked passwords to the store.
 - (void)getLoginsFromPasswordStore {
   savedPasswordsConsumer_.reset(new ios::SavePasswordsConsumer(self));
   passwordStore_->GetAllLogins(savedPasswordsConsumer_.get());
@@ -815,21 +815,21 @@
       [indexPaths sortedArrayUsingSelector:@selector(compare:)];
   auto passwordIterator = savedForms_.begin();
   auto passwordEndIterator = savedForms_.end();
-  auto blacklistedIterator = blacklistedForms_.begin();
-  auto blacklistedEndIterator = blacklistedForms_.end();
+  auto blockedIterator = blockedForms_.begin();
+  auto blockedEndIterator = blockedForms_.end();
   for (NSIndexPath* indexPath in sortedIndexPaths) {
     // Only form items are editable.
     PasswordFormContentItem* item =
         base::mac::ObjCCastStrict<PasswordFormContentItem>(
             [self.tableViewModel itemAtIndexPath:indexPath]);
-    BOOL blacklisted = [item isKindOfClass:[BlacklistedFormContentItem class]];
-    auto& forms = blacklisted ? blacklistedForms_ : savedForms_;
+    BOOL blocked = [item isKindOfClass:[BlockedFormContentItem class]];
+    auto& forms = blocked ? blockedForms_ : savedForms_;
     auto& duplicates =
-        blacklisted ? blacklistedPasswordDuplicates_ : savedPasswordDuplicates_;
+        blocked ? blockedPasswordDuplicates_ : savedPasswordDuplicates_;
 
     const autofill::PasswordForm& deletedForm = *item.form;
-    auto begin = blacklisted ? blacklistedIterator : passwordIterator;
-    auto end = blacklisted ? blacklistedEndIterator : passwordEndIterator;
+    auto begin = blocked ? blockedIterator : passwordIterator;
+    auto end = blocked ? blockedEndIterator : passwordEndIterator;
 
     auto formIterator = std::find_if(
         begin, end,
@@ -851,8 +851,8 @@
     passwordStore_->RemoveLogin(*form);
 
     // Keep track of where we are in the current list.
-    if (blacklisted) {
-      blacklistedIterator = formIterator;
+    if (blocked) {
+      blockedIterator = formIterator;
     } else {
       passwordIterator = formIterator;
     }
@@ -874,8 +874,8 @@
         // Delete in reverse order of section indexes (bottom up of section
         // displayed), so that indexes in model matches those in the view.  if
         // we don't we'll cause a crash.
-        if (strongSelf->blacklistedForms_.empty()) {
-          [self clearSectionWithIdentifier:SectionIdentifierBlacklist
+        if (strongSelf->blockedForms_.empty()) {
+          [self clearSectionWithIdentifier:SectionIdentifierBlocked
                           withRowAnimation:UITableViewRowAnimationAutomatic];
         }
         if (strongSelf->savedForms_.empty()) {
@@ -890,7 +890,7 @@
           return;
         // If both lists are empty, exit editing mode.
         if (strongSelf->savedForms_.empty() &&
-            strongSelf->blacklistedForms_.empty())
+            strongSelf->blockedForms_.empty())
           [strongSelf setEditing:NO animated:YES];
         [strongSelf updateUIForEditState];
         [strongSelf updateExportPasswordsButton];
@@ -924,13 +924,13 @@
       [self openDetailedViewForForm:*saveFormItem.form];
       break;
     }
-    case ItemTypeBlacklisted: {
-      DCHECK_EQ(SectionIdentifierBlacklist,
+    case ItemTypeBlocked: {
+      DCHECK_EQ(SectionIdentifierBlocked,
                 [model sectionIdentifierForSection:indexPath.section]);
-      BlacklistedFormContentItem* blacklistedItem =
-          base::mac::ObjCCastStrict<BlacklistedFormContentItem>(
+      BlockedFormContentItem* blockedItem =
+          base::mac::ObjCCastStrict<BlockedFormContentItem>(
               [model itemAtIndexPath:indexPath]);
-      [self openDetailedViewForForm:*blacklistedItem.form];
+      [self openDetailedViewForForm:*blockedItem.form];
       break;
     }
     case ItemTypeExportPasswordsButton:
@@ -969,7 +969,7 @@
   // Only password cells are editable.
   TableViewItem* item = [self.tableViewModel itemAtIndexPath:indexPath];
   return [item isKindOfClass:[SavedFormContentItem class]] ||
-         [item isKindOfClass:[BlacklistedFormContentItem class]];
+         [item isKindOfClass:[BlockedFormContentItem class]];
 }
 
 - (void)tableView:(UITableView*)tableView
@@ -1005,7 +1005,7 @@
   passwordStore_->RemoveLogin(form);
 
   std::vector<std::unique_ptr<autofill::PasswordForm>>& forms =
-      form.blacklisted_by_user ? blacklistedForms_ : savedForms_;
+      form.blacklisted_by_user ? blockedForms_ : savedForms_;
   auto iterator = std::find_if(
       forms.begin(), forms.end(),
       [&form](const std::unique_ptr<autofill::PasswordForm>& value) {
@@ -1014,9 +1014,9 @@
   DCHECK(iterator != forms.end());
   forms.erase(iterator);
 
-  password_manager::DuplicatesMap& duplicates =
-      form.blacklisted_by_user ? blacklistedPasswordDuplicates_
-                               : savedPasswordDuplicates_;
+  password_manager::DuplicatesMap& duplicates = form.blacklisted_by_user
+                                                    ? blockedPasswordDuplicates_
+                                                    : savedPasswordDuplicates_;
   std::string key = password_manager::CreateSortKey(form);
   auto duplicatesRange = duplicates.equal_range(key);
   for (auto iterator = duplicatesRange.first;
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 0f70e3b..4194b07 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
@@ -115,9 +115,9 @@
     AddPasswordForm(std::move(form));
   }
 
-  // Creates and adds a blacklisted site form to never offer to save
+  // Creates and adds a blocked site form to never offer to save
   // user's password to those sites.
-  void AddBlacklistedForm1() {
+  void AddBlockedForm1() {
     auto form = std::make_unique<autofill::PasswordForm>();
     form->origin = GURL("http://www.secret.com/login");
     form->action = GURL("http://www.secret.com/action");
@@ -133,9 +133,9 @@
     AddPasswordForm(std::move(form));
   }
 
-  // Creates and adds another blacklisted site form to never offer to save
+  // Creates and adds another blocked site form to never offer to save
   // user's password to those sites.
-  void AddBlacklistedForm2() {
+  void AddBlockedForm2() {
     auto form = std::make_unique<autofill::PasswordForm>();
     form->origin = GURL("http://www.secret2.com/login");
     form->action = GURL("http://www.secret2.com/action");
@@ -166,7 +166,7 @@
   std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
 };
 
-// Tests default case has no saved sites and no blacklisted sites.
+// Tests default case has no saved sites and no blocked sites.
 TEST_F(PasswordsTableViewControllerTest, TestInitialization) {
   CheckController();
   EXPECT_EQ(2, NumberOfSections());
@@ -180,27 +180,27 @@
   EXPECT_EQ(1, NumberOfItemsInSection(1));
 }
 
-// Tests adding one item in blacklisted password section.
-TEST_F(PasswordsTableViewControllerTest, AddBlacklistedPasswords) {
-  AddBlacklistedForm1();
+// Tests adding one item in blocked password section.
+TEST_F(PasswordsTableViewControllerTest, AddBlockedPasswords) {
+  AddBlockedForm1();
 
   EXPECT_EQ(3, NumberOfSections());
   EXPECT_EQ(1, NumberOfItemsInSection(1));
 }
 
-// Tests adding one item in saved password section, and two items in blacklisted
+// Tests adding one item in saved password section, and two items in blocked
 // password section.
-TEST_F(PasswordsTableViewControllerTest, AddSavedAndBlacklisted) {
+TEST_F(PasswordsTableViewControllerTest, AddSavedAndBlocked) {
   AddSavedForm1();
-  AddBlacklistedForm1();
-  AddBlacklistedForm2();
+  AddBlockedForm1();
+  AddBlockedForm2();
 
   // There should be two sections added.
   EXPECT_EQ(4, NumberOfSections());
 
   // There should be 1 row in saved password section.
   EXPECT_EQ(1, NumberOfItemsInSection(1));
-  // There should be 2 rows in blacklisted password section.
+  // There should be 2 rows in blocked password section.
   EXPECT_EQ(2, NumberOfItemsInSection(2));
 }
 
@@ -215,12 +215,12 @@
   CheckTextCellTextAndDetailText(@"example2.com", @"test@egmail.com", 1, 1);
 }
 
-// Tests the order in which the blacklisted passwords are displayed.
-TEST_F(PasswordsTableViewControllerTest, TestBlacklistedPasswordsOrder) {
-  AddBlacklistedForm2();
+// Tests the order in which the blocked passwords are displayed.
+TEST_F(PasswordsTableViewControllerTest, TestBlockedPasswordsOrder) {
+  AddBlockedForm2();
   CheckTextCellText(@"secret2.com", 1, 0);
 
-  AddBlacklistedForm1();
+  AddBlockedForm1();
   CheckTextCellText(@"secret.com", 1, 0);
   CheckTextCellText(@"secret2.com", 1, 1);
 }
@@ -235,31 +235,31 @@
   EXPECT_EQ(1, NumberOfItemsInSection(1));
 }
 
-// Tests displaying passwords in the blacklisted passwords section when there
+// Tests displaying passwords in the blocked passwords section when there
 // are duplicates in the password store.
-TEST_F(PasswordsTableViewControllerTest, AddBlacklistedDuplicates) {
-  AddBlacklistedForm1();
-  AddBlacklistedForm1();
+TEST_F(PasswordsTableViewControllerTest, AddBlockedDuplicates) {
+  AddBlockedForm1();
+  AddBlockedForm1();
 
   EXPECT_EQ(3, NumberOfSections());
   EXPECT_EQ(1, NumberOfItemsInSection(1));
 }
 
-// Tests deleting items from saved passwords and blacklisted passwords sections.
+// Tests deleting items from saved passwords and blocked passwords sections.
 TEST_F(PasswordsTableViewControllerTest, DeleteItems) {
   AddSavedForm1();
-  AddBlacklistedForm1();
-  AddBlacklistedForm2();
+  AddBlockedForm1();
+  AddBlockedForm2();
 
   // Delete item in save passwords section.
   ASSERT_TRUE(deleteItemAndWait(1, 0, ^{
     return NumberOfSections() == 3;
   }));
-  // Section 2 should now be the blacklisted passwords section, and should still
+  // Section 2 should now be the blocked passwords section, and should still
   // have both its items.
   EXPECT_EQ(2, NumberOfItemsInSection(1));
 
-  // Delete item in blacklisted passwords section.
+  // Delete item in blocked passwords section.
   ASSERT_TRUE(deleteItemAndWait(1, 0, ^{
     return NumberOfItemsInSection(1) == 1;
   }));
@@ -269,24 +269,24 @@
   }));
 }
 
-// Tests deleting items from saved passwords and blacklisted passwords sections
+// Tests deleting items from saved passwords and blocked passwords sections
 // when there are duplicates in the store.
 TEST_F(PasswordsTableViewControllerTest, DeleteItemsWithDuplicates) {
   AddSavedForm1();
   AddSavedForm1();
-  AddBlacklistedForm1();
-  AddBlacklistedForm1();
-  AddBlacklistedForm2();
+  AddBlockedForm1();
+  AddBlockedForm1();
+  AddBlockedForm2();
 
   // Delete item in save passwords section.
   ASSERT_TRUE(deleteItemAndWait(1, 0, ^{
     return NumberOfSections() == 3;
   }));
-  // Section 2 should now be the blacklisted passwords section, and should still
+  // Section 2 should now be the blocked passwords section, and should still
   // have both its items.
   EXPECT_EQ(2, NumberOfItemsInSection(1));
 
-  // Delete item in blacklisted passwords section.
+  // Delete item in blocked passwords section.
   ASSERT_TRUE(deleteItemAndWait(1, 0, ^{
     return NumberOfItemsInSection(1) == 1;
   }));
@@ -309,9 +309,9 @@
   EXPECT_TRUE(exportButton.accessibilityTraits &
               UIAccessibilityTraitNotEnabled);
 
-  // Add blacklisted form.
-  AddBlacklistedForm1();
-  // The export button should still be disabled as exporting blacklisted forms
+  // Add blocked form.
+  AddBlockedForm1();
+  // The export button should still be disabled as exporting blocked forms
   // is not currently supported.
   EXPECT_NSEQ(UIColor.cr_labelColor, exportButton.textColor);
   EXPECT_TRUE(exportButton.accessibilityTraits &
@@ -397,8 +397,8 @@
 TEST_F(PasswordsTableViewControllerTest, FilterItems) {
   AddSavedForm1();
   AddSavedForm2();
-  AddBlacklistedForm1();
-  AddBlacklistedForm2();
+  AddBlockedForm1();
+  AddBlockedForm2();
 
   EXPECT_EQ(4, NumberOfSections());
 
@@ -426,7 +426,7 @@
   CheckTextCellTextAndDetailText(@"example2.com", @"test@egmail.com", 1, 1);
 
   [passwords_controller searchBar:bar textDidChange:@"secret"];
-  // Only two items in blacklisted should remain.
+  // Only two blocked items should remain.
   EXPECT_EQ(0, NumberOfItemsInSection(1));
   EXPECT_EQ(2, NumberOfItemsInSection(2));
   CheckTextCellText(@"secret.com", 2, 0);
diff --git a/ios/chrome/browser/ui/settings/translate_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/translate_table_view_controller_unittest.mm
index 99601b78..fb15f60 100644
--- a/ios/chrome/browser/ui/settings/translate_table_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/settings/translate_table_view_controller_unittest.mm
@@ -35,7 +35,7 @@
 
 namespace {
 
-const char kBlacklistedSite[] = "http://blacklistedsite.com";
+const char kBlockedSite[] = "http://blockedsite.com";
 const char kLanguage1[] = "klingon";
 const char kLanguage2[] = "pirate";
 
@@ -94,8 +94,8 @@
   // Set some preferences.
   std::unique_ptr<translate::TranslatePrefs> translate_prefs(
       ChromeIOSTranslateClient::CreateTranslatePrefs(pref_service_.get()));
-  translate_prefs->BlacklistSite(kBlacklistedSite);
-  ASSERT_TRUE(translate_prefs->IsSiteBlacklisted(kBlacklistedSite));
+  translate_prefs->BlacklistSite(kBlockedSite);
+  ASSERT_TRUE(translate_prefs->IsSiteBlacklisted(kBlockedSite));
   translate_prefs->AddToLanguageList(kLanguage1, /*force_blocked=*/true);
   ASSERT_TRUE(translate_prefs->IsBlockedLanguage(kLanguage1));
   translate_prefs->WhitelistLanguagePair(kLanguage1, kLanguage2);
@@ -109,7 +109,7 @@
   [controller tableView:controller.tableView
       didSelectRowAtIndexPath:[NSIndexPath indexPathForItem:1 inSection:0]];
   // Check that preferences are gone.
-  EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(kBlacklistedSite));
+  EXPECT_FALSE(translate_prefs->IsSiteBlacklisted(kBlockedSite));
   EXPECT_FALSE(translate_prefs->IsBlockedLanguage(kLanguage1));
   EXPECT_FALSE(
       translate_prefs->IsLanguagePairWhitelisted(kLanguage1, kLanguage2));
diff --git a/ios/chrome/browser/ui/static_content/static_html_view_controller.mm b/ios/chrome/browser/ui/static_content/static_html_view_controller.mm
index 6b04b57..b7ff665 100644
--- a/ios/chrome/browser/ui/static_content/static_html_view_controller.mm
+++ b/ios/chrome/browser/ui/static_content/static_html_view_controller.mm
@@ -255,9 +255,9 @@
     NSString* bundlePath = [bundle bundlePath];
     path = [bundlePath stringByAppendingPathComponent:resource_];
   } else {
-    // Generate a random resource URL to whitelist the load in
+    // Generate a random resource URL to allow the load in
     // |webView:shouldStartLoadWithRequest:navigationType:| method.
-    path = [NSString stringWithFormat:@"/whitelist%u%u%u%u", arc4random(),
+    path = [NSString stringWithFormat:@"/allow%u%u%u%u", arc4random(),
                                       arc4random(), arc4random(), arc4random()];
   }
   DCHECK(path);
diff --git a/ios/chrome/test/earl_grey/chrome_test_case.mm b/ios/chrome/test/earl_grey/chrome_test_case.mm
index 00eee62..9858ca6 100644
--- a/ios/chrome/test/earl_grey/chrome_test_case.mm
+++ b/ios/chrome/test/earl_grey/chrome_test_case.mm
@@ -31,7 +31,7 @@
 NSString* const kFlakyEarlGreyTestTargetSuffix = @"_flaky_egtests";
 
 // Contains a list of test names that run in multitasking test suite.
-NSArray* whiteListedMultitaskingTests = @[
+NSArray* multitaskingTests = @[
   // Integration tests
   @"testContextMenuOpenInNewTab",        // ContextMenuTestCase
   @"testSwitchToMain",                   // CookiesTestCase
@@ -50,13 +50,13 @@
   // UI tests
   @"testActivityServiceControllerPrintAfterRedirectionToUnprintablePage",
   // ActivityServiceControllerTestCase
-  @"testDismissOnDestroy",                      // AlertCoordinatorTestCase
-  @"testAddRemoveBookmark",                     // BookmarksTestCase
-  @"testJavaScriptInOmnibox",                   // BrowserViewControllerTestCase
-  @"testChooseCastReceiverChooser",             // CastReceiverTestCase
-  @"testErrorPage",                             // ErrorPageTestCase
-  @"testFindInPage",                            // FindInPageTestCase
-  @"testDismissFirstRun",                       // FirstRunTestCase
+  @"testDismissOnDestroy",           // AlertCoordinatorTestCase
+  @"testAddRemoveBookmark",          // BookmarksTestCase
+  @"testJavaScriptInOmnibox",        // BrowserViewControllerTestCase
+  @"testChooseCastReceiverChooser",  // CastReceiverTestCase
+  @"testErrorPage",                  // ErrorPageTestCase
+  @"testFindInPage",                 // FindInPageTestCase
+  @"testDismissFirstRun",            // FirstRunTestCase
   // TODO(crbug.com/872788) Failing after move to Xcode 10.
   // @"testLongPDFScroll",                         // FullscreenTestCase
   @"testDeleteHistory",                         // HistoryUITestCase
@@ -368,7 +368,7 @@
   NSMutableArray* multitaskingTestNames = [NSMutableArray array];
   for (unsigned int i = 0; i < count; i++) {
     SEL selector = method_getName(methods[i]);
-    if ([whiteListedMultitaskingTests
+    if ([multitaskingTests
             containsObject:base::SysUTF8ToNSString(sel_getName(selector))]) {
       NSMethodSignature* methodSignature =
           [self instanceMethodSignatureForSelector:selector];
diff --git a/ios/testing/embedded_test_server_handlers.cc b/ios/testing/embedded_test_server_handlers.cc
index 7c34c010..dd2641dd 100644
--- a/ios/testing/embedded_test_server_handlers.cc
+++ b/ios/testing/embedded_test_server_handlers.cc
@@ -4,6 +4,8 @@
 
 #include "ios/testing/embedded_test_server_handlers.h"
 
+#include <utility>
+
 #include "base/bind.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
@@ -37,31 +39,30 @@
  public:
   DownloadResponse(int length) : length_(length) {}
 
-  void SendResponse(
-      const net::test_server::SendBytesCallback& send,
-      const net::test_server::SendCompleteCallback& done) override {
+  void SendResponse(const net::test_server::SendBytesCallback& send,
+                    net::test_server::SendCompleteCallback done) override {
     send.Run(base::StringPrintf("HTTP/1.1 200 OK\r\n"
                                 "Content-Type:%s\r\n\r\n"
                                 "Content-Length:%d\r\n\r\n",
                                 kTestDownloadMimeType, length_),
-             base::BindRepeating(&DownloadResponse::Send, send, done, length_));
+             base::BindOnce(&DownloadResponse::Send, send, std::move(done),
+                            length_));
   }
 
  private:
   // Sends "0" |count| times.
   static void Send(const net::test_server::SendBytesCallback& send,
-                   const net::test_server::SendCompleteCallback& done,
+                   net::test_server::SendCompleteCallback done,
                    int count) {
     if (!count) {
-      done.Run();
+      std::move(done).Run();
       return;
     }
 
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE,
-        base::BindRepeating(send, "0",
-                            base::BindRepeating(&DownloadResponse::Send, send,
-                                                done, count - 1)));
+        FROM_HERE, base::BindOnce(send, "0",
+                                  base::BindOnce(&DownloadResponse::Send, send,
+                                                 std::move(done), count - 1)));
   }
 
   int length_ = 0;
diff --git a/ios/web/public/test/http_server/delayed_response_provider.mm b/ios/web/public/test/http_server/delayed_response_provider.mm
index 6f5b43f..d6befcff 100644
--- a/ios/web/public/test/http_server/delayed_response_provider.mm
+++ b/ios/web/public/test/http_server/delayed_response_provider.mm
@@ -17,25 +17,6 @@
 
 namespace web {
 
-// Delays |delay| seconds before sending a response to the client.
-class DelayedHttpResponse : public net::test_server::BasicHttpResponse {
- public:
-  explicit DelayedHttpResponse(double delay) : delay_(delay) {}
-
-  void SendResponse(
-      const net::test_server::SendBytesCallback& send,
-      const net::test_server::SendCompleteCallback& done) override {
-    base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-        FROM_HERE, base::BindOnce(send, ToResponseString(), done),
-        base::TimeDelta::FromSecondsD(delay_));
-  }
-
- private:
-  const double delay_;
-
-  DISALLOW_COPY_AND_ASSIGN(DelayedHttpResponse);
-};
-
 DelayedResponseProvider::DelayedResponseProvider(
     std::unique_ptr<web::ResponseProvider> delayed_provider,
     double delay)
@@ -52,7 +33,8 @@
 std::unique_ptr<net::test_server::HttpResponse>
 DelayedResponseProvider::GetEmbeddedTestServerResponse(const Request& request) {
   std::unique_ptr<net::test_server::BasicHttpResponse> http_response(
-      std::make_unique<DelayedHttpResponse>(delay_));
+      std::make_unique<net::test_server::DelayedHttpResponse>(
+          base::TimeDelta::FromSecondsD(delay_)));
   http_response->set_content_type("text/html");
   http_response->set_content("Slow Page");
   return std::move(http_response);
diff --git a/ios/web/shell/shell_url_request_context_getter.h b/ios/web/shell/shell_url_request_context_getter.h
index 7845d7d..ae34c52 100644
--- a/ios/web/shell/shell_url_request_context_getter.h
+++ b/ios/web/shell/shell_url_request_context_getter.h
@@ -16,7 +16,6 @@
 
 namespace net {
 class NetworkDelegate;
-class NetLog;
 class ProxyConfigService;
 class TransportSecurityPersister;
 class URLRequestContext;
@@ -50,7 +49,6 @@
   std::unique_ptr<net::NetworkDelegate> network_delegate_;
   std::unique_ptr<net::URLRequestContextStorage> storage_;
   std::unique_ptr<net::URLRequestContext> url_request_context_;
-  std::unique_ptr<net::NetLog> net_log_;
   std::unique_ptr<net::TransportSecurityPersister>
       transport_security_persister_;
   // SystemCookieStore must be created on UI thread in
diff --git a/ios/web/shell/shell_url_request_context_getter.mm b/ios/web/shell/shell_url_request_context_getter.mm
index 8ce3579..cfd7a79 100644
--- a/ios/web/shell/shell_url_request_context_getter.mm
+++ b/ios/web/shell/shell_url_request_context_getter.mm
@@ -53,7 +53,6 @@
       network_task_runner_(network_task_runner),
       proxy_config_service_(
           new net::ProxyConfigServiceIOS(NO_TRAFFIC_ANNOTATION_YET)),
-      net_log_(new net::NetLog()),
       system_cookie_store_(web::CreateSystemCookieStore(browser_state)) {}
 
 ShellURLRequestContextGetter::~ShellURLRequestContextGetter() {}
@@ -63,7 +62,7 @@
 
   if (!url_request_context_) {
     url_request_context_.reset(new net::URLRequestContext());
-    url_request_context_->set_net_log(net_log_.get());
+    url_request_context_->set_net_log(net::NetLog::Get());
     DCHECK(!network_delegate_.get());
     network_delegate_ = std::make_unique<net::NetworkDelegateImpl>();
     url_request_context_->set_network_delegate(network_delegate_.get());
@@ -73,7 +72,7 @@
     // Using std::move on a |system_cookie_store_| resets it to null as it's a
     // unique_ptr, so |system_cookie_store_| will not be a dangling pointer.
     storage_->set_cookie_store(std::make_unique<net::CookieStoreIOS>(
-        std::move(system_cookie_store_), net_log_.get()));
+        std::move(system_cookie_store_), url_request_context_->net_log()));
 
     std::string user_agent =
         web::GetWebClient()->GetUserAgent(web::UserAgentType::MOBILE);
diff --git a/ios/web_view/internal/app/application_context.h b/ios/web_view/internal/app/application_context.h
index 64dc344e..965f92d 100644
--- a/ios/web_view/internal/app/application_context.h
+++ b/ios/web_view/internal/app/application_context.h
@@ -85,7 +85,6 @@
 
   SEQUENCE_CHECKER(sequence_checker_);
   std::unique_ptr<PrefService> local_state_;
-  std::unique_ptr<net::NetLog> net_log_;
   std::unique_ptr<WebViewIOThread> web_view_io_thread_;
   std::string application_locale_;
 
diff --git a/ios/web_view/internal/app/application_context.mm b/ios/web_view/internal/app/application_context.mm
index cfae793..eaefa7d 100644
--- a/ios/web_view/internal/app/application_context.mm
+++ b/ios/web_view/internal/app/application_context.mm
@@ -57,8 +57,6 @@
 }
 
 ApplicationContext::ApplicationContext() {
-  net_log_ = std::make_unique<net::NetLog>();
-
   SetApplicationLocale(l10n_util::GetLocaleOverride());
 }
 
@@ -189,7 +187,7 @@
 
 net::NetLog* ApplicationContext::GetNetLog() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return net_log_.get();
+  return net::NetLog::Get();
 }
 
 WebViewIOThread* ApplicationContext::GetWebViewIOThread() {
diff --git a/media/base/audio_renderer.h b/media/base/audio_renderer.h
index 0bd368d..988d917 100644
--- a/media/base/audio_renderer.h
+++ b/media/base/audio_renderer.h
@@ -49,7 +49,7 @@
   //
   // Clients should expect |buffering_state_cb| to be called with
   // BUFFERING_HAVE_NOTHING while flushing is in progress.
-  virtual void Flush(const base::Closure& callback) = 0;
+  virtual void Flush(base::OnceClosure callback) = 0;
 
   // Starts playback by reading from |stream| and decoding and rendering audio.
   //
diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h
index 542e106..dc924f18 100644
--- a/media/base/mock_filters.h
+++ b/media/base/mock_filters.h
@@ -319,7 +319,8 @@
                     RendererClient* client,
                     const PipelineStatusCB& init_cb));
   MOCK_METHOD0(GetTimeSource, TimeSource*());
-  MOCK_METHOD1(Flush, void(const base::Closure& callback));
+  void Flush(base::OnceClosure flush_cb) { OnFlush(flush_cb); }
+  MOCK_METHOD1(OnFlush, void(base::OnceClosure& flush_cb));
   MOCK_METHOD0(StartPlaying, void());
   MOCK_METHOD1(SetVolume, void(float volume));
 
diff --git a/media/renderers/audio_renderer_impl.cc b/media/renderers/audio_renderer_impl.cc
index 6c3d214..43d940f 100644
--- a/media/renderers/audio_renderer_impl.cc
+++ b/media/renderers/audio_renderer_impl.cc
@@ -259,7 +259,7 @@
   return this;
 }
 
-void AudioRendererImpl::Flush(const base::Closure& callback) {
+void AudioRendererImpl::Flush(base::OnceClosure callback) {
   DVLOG(1) << __func__;
   DCHECK(task_runner_->BelongsToCurrentThread());
   TRACE_EVENT_ASYNC_BEGIN0("media", "AudioRendererImpl::Flush", this);
@@ -273,7 +273,7 @@
   DCHECK_EQ(state_, kPlaying);
   DCHECK(!flush_cb_);
 
-  flush_cb_ = callback;
+  flush_cb_ = std::move(callback);
   ChangeState_Locked(kFlushing);
 
   if (pending_read_)
@@ -317,7 +317,7 @@
 
   // Changes in buffering state are always posted. Flush callback must only be
   // run after buffering state has been set back to nothing.
-  flush_cb_ = BindToCurrentLoop(flush_cb_);
+  flush_cb_ = BindToCurrentLoop(std::move(flush_cb_));
   FinishFlush();
 }
 
diff --git a/media/renderers/audio_renderer_impl.h b/media/renderers/audio_renderer_impl.h
index b1dae35..2123862 100644
--- a/media/renderers/audio_renderer_impl.h
+++ b/media/renderers/audio_renderer_impl.h
@@ -85,7 +85,7 @@
                   RendererClient* client,
                   const PipelineStatusCB& init_cb) override;
   TimeSource* GetTimeSource() override;
-  void Flush(const base::Closure& callback) override;
+  void Flush(base::OnceClosure callback) override;
   void StartPlaying() override;
   void SetVolume(float volume) override;
 
@@ -250,7 +250,7 @@
   PipelineStatusCB init_cb_;
 
   // Callback provided to Flush().
-  base::Closure flush_cb_;
+  base::OnceClosure flush_cb_;
 
   // Overridable tick clock for testing.
   const base::TickClock* tick_clock_;
diff --git a/media/renderers/renderer_impl.cc b/media/renderers/renderer_impl.cc
index d68f1e2a..4cc544c 100644
--- a/media/renderers/renderer_impl.cc
+++ b/media/renderers/renderer_impl.cc
@@ -500,8 +500,8 @@
   if (!audio_renderer_ || !audio_playing_) {
     OnAudioRendererFlushDone();
   } else {
-    audio_renderer_->Flush(base::BindRepeating(
-        &RendererImpl::OnAudioRendererFlushDone, weak_this_));
+    audio_renderer_->Flush(
+        base::BindOnce(&RendererImpl::OnAudioRendererFlushDone, weak_this_));
   }
 }
 
@@ -1026,7 +1026,7 @@
   if (audio_playing_)
     PausePlayback();
 
-  audio_renderer_->Flush(base::BindRepeating(
+  audio_renderer_->Flush(base::BindOnce(
       &RendererImpl::CleanUpTrackChange, weak_this_,
       base::Passed(&fix_stream_cb), &audio_ended_, &audio_playing_));
 }
diff --git a/media/renderers/renderer_impl_unittest.cc b/media/renderers/renderer_impl_unittest.cc
index 08cf48a..9646d668 100644
--- a/media/renderers/renderer_impl_unittest.cc
+++ b/media/renderers/renderer_impl_unittest.cc
@@ -23,6 +23,7 @@
 
 using ::base::test::RunCallback;
 using ::base::test::RunClosure;
+using ::base::test::RunOnceClosure;
 using ::testing::_;
 using ::testing::DoAll;
 using ::testing::InSequence;
@@ -33,6 +34,12 @@
 using ::testing::WithArg;
 using ::testing::WithArgs;
 
+ACTION_TEMPLATE(MoveArg,
+                HAS_1_TEMPLATE_PARAMS(int, k),
+                AND_1_VALUE_PARAMS(out)) {
+  *out = std::move(::testing::get<k>(args));
+}
+
 namespace media {
 
 const int64_t kStartPlayingTimeInMs = 100;
@@ -142,11 +149,11 @@
     base::RunLoop().RunUntilIdle();
 
     if (start_status == PIPELINE_OK && audio_stream_) {
-      ON_CALL(*audio_renderer_, Flush(_))
+      ON_CALL(*audio_renderer_, OnFlush(_))
           .WillByDefault(DoAll(
               SetBufferingState(&audio_renderer_client_, BUFFERING_HAVE_NOTHING,
                                 BUFFERING_CHANGE_REASON_UNKNOWN),
-              RunClosure<0>()));
+              RunOnceClosure<0>()));
       ON_CALL(*audio_renderer_, StartPlaying())
           .WillByDefault(SetBufferingState(&audio_renderer_client_,
                                            BUFFERING_HAVE_ENOUGH,
@@ -258,7 +265,7 @@
 
   void SetFlushExpectationsForAVRenderers() {
     if (audio_stream_)
-      EXPECT_CALL(*audio_renderer_, Flush(_));
+      EXPECT_CALL(*audio_renderer_, OnFlush(_));
 
     if (video_stream_)
       EXPECT_CALL(*video_renderer_, Flush(_));
@@ -320,7 +327,7 @@
     EXPECT_CALL(time_source_, CurrentMediaTime());
     EXPECT_CALL(time_source_, CurrentMediaTime());
     EXPECT_CALL(time_source_, StopTicking());
-    EXPECT_CALL(*audio_renderer_, Flush(_));
+    EXPECT_CALL(*audio_renderer_, OnFlush(_));
 
     // Callback into RestartAudioRenderer
     EXPECT_CALL(*audio_renderer_, StartPlaying());
@@ -656,9 +663,9 @@
 
   InSequence s;
   EXPECT_CALL(time_source_, StopTicking());
-  EXPECT_CALL(*audio_renderer_, Flush(_))
+  EXPECT_CALL(*audio_renderer_, OnFlush(_))
       .WillOnce(DoAll(SetError(&audio_renderer_client_, PIPELINE_ERROR_DECODE),
-                      RunClosure<0>()));
+                      RunOnceClosure<0>()));
   EXPECT_CALL(callbacks_, OnError(PIPELINE_ERROR_DECODE));
   EXPECT_CALL(callbacks_, OnFlushed());
   renderer_impl_->Flush(base::BindOnce(&CallbackHelper::OnFlushed,
@@ -825,7 +832,7 @@
   // Flush the audio and video renderers, both think they're in an underflow
   // state, but if the video renderer underflow was deferred, RendererImpl would
   // think it still has enough data.
-  EXPECT_CALL(*audio_renderer_, Flush(_)).WillOnce(RunClosure<0>());
+  EXPECT_CALL(*audio_renderer_, OnFlush(_)).WillOnce(RunOnceClosure<0>());
   EXPECT_CALL(*video_renderer_, Flush(_)).WillOnce(RunClosure<0>());
   EXPECT_CALL(callbacks_, OnFlushed());
   renderer_impl_->Flush(base::BindOnce(&CallbackHelper::OnFlushed,
@@ -894,9 +901,9 @@
   EXPECT_CALL(time_source_, StopTicking());
 
   // Capture the callback from the audio renderer flush.
-  base::Closure audio_renderer_flush_cb;
-  EXPECT_CALL(*audio_renderer_, Flush(_))
-      .WillOnce(SaveArg<0>(&audio_renderer_flush_cb));
+  base::OnceClosure audio_renderer_flush_cb;
+  EXPECT_CALL(*audio_renderer_, OnFlush(_))
+      .WillOnce(MoveArg<0>(&audio_renderer_flush_cb));
 
   EXPECT_CALL(time_source_, CurrentMediaTime()).Times(2);
   std::vector<DemuxerStream*> tracks;
@@ -910,7 +917,7 @@
   EXPECT_CALL(*audio_renderer_, StartPlaying());
   audio_renderer_client_->OnBufferingStateChange(
       BUFFERING_HAVE_NOTHING, BUFFERING_CHANGE_REASON_UNKNOWN);
-  audio_renderer_flush_cb.Run();
+  std::move(audio_renderer_flush_cb).Run();
   loop.Run();
 }
 
@@ -948,9 +955,9 @@
   base::RunLoop loop;
 
   // Capture the callback from the audio renderer flush.
-  base::Closure audio_renderer_flush_cb;
-  EXPECT_CALL(*audio_renderer_, Flush(_))
-      .WillOnce(SaveArg<0>(&audio_renderer_flush_cb));
+  base::OnceClosure audio_renderer_flush_cb;
+  EXPECT_CALL(*audio_renderer_, OnFlush(_))
+      .WillOnce(MoveArg<0>(&audio_renderer_flush_cb));
 
   EXPECT_CALL(time_source_, CurrentMediaTime()).Times(2);
   EXPECT_CALL(time_source_, StopTicking());
@@ -959,7 +966,7 @@
   EXPECT_CALL(*audio_renderer_, StartPlaying());
   video_renderer_client_->OnBufferingStateChange(
       BUFFERING_HAVE_NOTHING, BUFFERING_CHANGE_REASON_UNKNOWN);
-  audio_renderer_flush_cb.Run();
+  std::move(audio_renderer_flush_cb).Run();
   loop.Run();
 }
 
@@ -1006,13 +1013,13 @@
   underflow_wait.Run();
 
   // Start a track change.
-  base::Closure audio_renderer_flush_cb;
+  base::OnceClosure audio_renderer_flush_cb;
   base::RunLoop track_change;
   {
     InSequence track_switch_seq;
     EXPECT_CALL(time_source_, CurrentMediaTime()).Times(2);
-    EXPECT_CALL(*audio_renderer_, Flush(_))
-        .WillOnce(SaveArg<0>(&audio_renderer_flush_cb));
+    EXPECT_CALL(*audio_renderer_, OnFlush(_))
+        .WillOnce(MoveArg<0>(&audio_renderer_flush_cb));
   }
   renderer_impl_->OnEnabledAudioTracksChanged({}, track_change.QuitClosure());
 
@@ -1025,7 +1032,7 @@
 
   // Finish the track change.
   EXPECT_CALL(*audio_renderer_, StartPlaying());
-  audio_renderer_flush_cb.Run();
+  std::move(audio_renderer_flush_cb).Run();
   track_change.Run();
 }
 
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 4368512..7653635 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -2257,6 +2257,7 @@
     ":net_resources",
     ":preload_decoder",
     "//base",
+    "//base/util/type_safety:type_safety",
     "//net/base/registry_controlled_domains",
     "//third_party/protobuf:protobuf_lite",
     "//url:buildflags",
diff --git a/net/dns/dns_transaction_unittest.cc b/net/dns/dns_transaction_unittest.cc
index 89484d3..e520959 100644
--- a/net/dns/dns_transaction_unittest.cc
+++ b/net/dns/dns_transaction_unittest.cc
@@ -39,6 +39,7 @@
 #include "net/log/net_log.h"
 #include "net/log/net_log_capture_mode.h"
 #include "net/log/net_log_with_source.h"
+#include "net/log/test_net_log.h"
 #include "net/proxy_resolution/proxy_config_service_fixed.h"
 #include "net/socket/socket_test_util.h"
 #include "net/test/gtest_util.h"
@@ -388,7 +389,7 @@
   TestURLRequestContext request_context_;
   std::unique_ptr<base::RunLoop> transaction_complete_run_loop_;
   bool completed_;
-  NetLog net_log_;
+  TestNetLog net_log_;
 };
 
 // Callback that allows a test to modify HttpResponseinfo
diff --git a/net/dns/mdns_client_unittest.cc b/net/dns/mdns_client_unittest.cc
index 313ba85..36fed840 100644
--- a/net/dns/mdns_client_unittest.cc
+++ b/net/dns/mdns_client_unittest.cc
@@ -1362,9 +1362,8 @@
 
 TEST(MDnsSocketTest, CreateSocket) {
   // Verifies that socket creation hasn't been broken.
-  NetLog net_log;
-  auto socket =
-      CreateAndBindMDnsSocket(AddressFamily::ADDRESS_FAMILY_IPV4, 1, &net_log);
+  auto socket = CreateAndBindMDnsSocket(AddressFamily::ADDRESS_FAMILY_IPV4, 1,
+                                        net::NetLog::Get());
   EXPECT_TRUE(socket);
   socket->Close();
 }
diff --git a/net/http/http_auth_handler_ntlm.h b/net/http/http_auth_handler_ntlm.h
index 370d9a9a9..82d35de9 100644
--- a/net/http/http_auth_handler_ntlm.h
+++ b/net/http/http_auth_handler_ntlm.h
@@ -131,10 +131,6 @@
   bool AllowsDefaultCredentials() override;
 
  protected:
-  // This function acquires a credentials handle in the SSPI implementation.
-  // It does nothing in the portable implementation.
-  int InitializeBeforeFirstChallenge();
-
   // HttpAuthHandler
   bool Init(HttpAuthChallengeTokenizer* tok, const SSLInfo& ssl_info) override;
   int GenerateAuthTokenImpl(const AuthCredentials* credentials,
@@ -167,7 +163,7 @@
   static std::string CreateSPN(const GURL& origin);
 
 #if defined(NTLM_SSPI)
-  HttpAuthSSPI auth_sspi_;
+  HttpAuthSSPI mechanism_;
 #elif defined(NTLM_PORTABLE)
   ntlm::NtlmClient ntlm_client_;
 #endif
diff --git a/net/http/http_auth_handler_ntlm_portable.cc b/net/http/http_auth_handler_ntlm_portable.cc
index 85d210e..37022cd4 100644
--- a/net/http/http_auth_handler_ntlm_portable.cc
+++ b/net/http/http_auth_handler_ntlm_portable.cc
@@ -89,10 +89,6 @@
   return false;
 }
 
-int HttpAuthHandlerNTLM::InitializeBeforeFirstChallenge() {
-  return OK;
-}
-
 int HttpAuthHandlerNTLM::GenerateAuthTokenImpl(
     const AuthCredentials* credentials,
     const HttpRequestInfo* request,
@@ -120,14 +116,6 @@
   domain_ = domain;
   credentials_.Set(user, credentials->password());
 
-  if (challenge_token_.empty()) {
-    // There is no |challenge_token_| because the client sends the first
-    // message.
-    int rv = InitializeBeforeFirstChallenge();
-    if (rv != OK)
-      return rv;
-  }
-
   std::vector<uint8_t> next_token =
       GetNextToken(base::as_bytes(base::make_span(challenge_token_)));
   if (next_token.empty())
diff --git a/net/http/http_auth_handler_ntlm_win.cc b/net/http/http_auth_handler_ntlm_win.cc
index 02bedd8..5d73998 100644
--- a/net/http/http_auth_handler_ntlm_win.cc
+++ b/net/http/http_auth_handler_ntlm_win.cc
@@ -44,7 +44,7 @@
 HttpAuthHandlerNTLM::HttpAuthHandlerNTLM(
     SSPILibrary* sspi_library,
     const HttpAuthPreferences* http_auth_preferences)
-    : auth_sspi_(sspi_library, HttpAuth::AUTH_SCHEME_NTLM),
+    : mechanism_(sspi_library, HttpAuth::AUTH_SCHEME_NTLM),
       http_auth_preferences_(http_auth_preferences) {}
 
 int HttpAuthHandlerNTLM::GenerateAuthTokenImpl(
@@ -52,7 +52,7 @@
     const HttpRequestInfo* request,
     CompletionOnceCallback callback,
     std::string* auth_token) {
-  return auth_sspi_.GenerateAuthToken(credentials, CreateSPN(origin_),
+  return mechanism_.GenerateAuthToken(credentials, CreateSPN(origin_),
                                       channel_bindings_, auth_token, net_log(),
                                       std::move(callback));
 }
@@ -62,7 +62,7 @@
 
 // Require identity on first pass instead of second.
 bool HttpAuthHandlerNTLM::NeedsIdentity() {
-  return auth_sspi_.NeedsIdentity();
+  return mechanism_.NeedsIdentity();
 }
 
 bool HttpAuthHandlerNTLM::AllowsDefaultCredentials() {
@@ -76,8 +76,8 @@
 HttpAuth::AuthorizationResult HttpAuthHandlerNTLM::ParseChallenge(
     HttpAuthChallengeTokenizer* tok,
     bool initial_challenge) {
-  // auth_sspi_ contains state for whether or not this is the initial challenge.
-  return auth_sspi_.ParseChallenge(tok);
+  // mechanism_ contains state for whether or not this is the initial challenge.
+  return mechanism_.ParseChallenge(tok);
 }
 
 }  // namespace net
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index 24f707e..797c69c 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -4854,8 +4854,7 @@
   session_deps_.http_auth_handler_factory = std::move(auth_handler_factory);
 
   // Add NetLog just so can verify load timing information gets a NetLog ID.
-  NetLog net_log;
-  session_deps_.net_log = &net_log;
+  session_deps_.net_log = NetLog::Get();
   std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_);
 
   // Since we have proxy, should try to establish tunnel.
@@ -4971,8 +4970,7 @@
   session_deps_.http_auth_handler_factory = std::move(auth_handler_factory);
 
   // Add NetLog just so can verify load timing information gets a NetLog ID.
-  NetLog net_log;
-  session_deps_.net_log = &net_log;
+  session_deps_.net_log = NetLog::Get();
   std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_);
 
   // Should try to establish tunnel.
@@ -5093,8 +5091,7 @@
   session_deps_.http_auth_handler_factory = std::move(auth_handler_factory);
 
   // Add NetLog just so can verify load timing information gets a NetLog ID.
-  NetLog net_log;
-  session_deps_.net_log = &net_log;
+  session_deps_.net_log = NetLog::Get();
   std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_);
 
   // Should try to establish tunnel.
@@ -5209,8 +5206,7 @@
                                        HttpAuth::AUTH_PROXY);
   session_deps_.http_auth_handler_factory = std::move(auth_handler_factory);
 
-  NetLog net_log;
-  session_deps_.net_log = &net_log;
+  session_deps_.net_log = NetLog::Get();
   std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_);
 
   // Data for both sockets.
@@ -5319,8 +5315,7 @@
   session_deps_.http_auth_handler_factory = std::move(auth_handler_factory);
 
   // Add NetLog just so can verify load timing information gets a NetLog ID.
-  NetLog net_log;
-  session_deps_.net_log = &net_log;
+  session_deps_.net_log = NetLog::Get();
   std::unique_ptr<HttpNetworkSession> session = CreateSession(&session_deps_);
 
   // Should try to establish tunnel.
diff --git a/net/log/file_net_log_observer_unittest.cc b/net/log/file_net_log_observer_unittest.cc
index c0a04a7c..cd97ab89 100644
--- a/net/log/file_net_log_observer_unittest.cc
+++ b/net/log/file_net_log_observer_unittest.cc
@@ -29,6 +29,7 @@
 #include "net/log/net_log_source_type.h"
 #include "net/log/net_log_util.h"
 #include "net/log/net_log_values.h"
+#include "net/log/test_net_log.h"
 #include "net/test/test_with_task_environment.h"
 #include "net/url_request/url_request.h"
 #include "net/url_request/url_request_context.h"
@@ -282,7 +283,7 @@
   }
 
  protected:
-  NetLog net_log_;
+  TestNetLog net_log_;
   std::unique_ptr<FileNetLogObserver> logger_;
   base::ScopedTempDir temp_dir_;
   base::ScopedTempDir scratch_dir_;  // used for bounded + preexisting
@@ -333,7 +334,7 @@
 
 
  protected:
-  NetLog net_log_;
+  TestNetLog net_log_;
   std::unique_ptr<FileNetLogObserver> logger_;
   base::FilePath log_path_;
 
diff --git a/net/log/net_log.cc b/net/log/net_log.cc
index 7afade5..b9c1621 100644
--- a/net/log/net_log.cc
+++ b/net/log/net_log.cc
@@ -4,6 +4,7 @@
 
 #include "net/log/net_log.h"
 
+#include "base/no_destructor.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/values.h"
 #include "net/log/net_log_values.h"
@@ -29,12 +30,18 @@
   return net_log_;
 }
 
-NetLog::NetLog() : last_id_(0), observer_capture_modes_(0) {}
-
-NetLog::~NetLog() {
-  MarkDead();
+// static
+NetLog* NetLog::Get() {
+  static base::NoDestructor<NetLog> instance{util::PassKey<NetLog>()};
+  return instance.get();
 }
 
+NetLog::NetLog(util::PassKey<NetLog>) {}
+NetLog::NetLog(util::PassKey<NetLogWithSource>) {}
+NetLog::NetLog(util::PassKey<TestNetLog>) {}
+
+NetLog::~NetLog() = default;
+
 void NetLog::AddEntry(NetLogEventType type,
                       const NetLogSource& source,
                       NetLogEventPhase phase) {
diff --git a/net/log/net_log.h b/net/log/net_log.h
index fe2b4cfb7..cd17430 100644
--- a/net/log/net_log.h
+++ b/net/log/net_log.h
@@ -15,6 +15,7 @@
 #include "base/macros.h"
 #include "base/synchronization/lock.h"
 #include "base/time/time.h"
+#include "base/util/type_safety/pass_key.h"
 #include "build/build_config.h"
 #include "net/base/net_export.h"
 #include "net/log/net_log_capture_mode.h"
@@ -29,6 +30,9 @@
 
 namespace net {
 
+class NetLogWithSource;
+class TestNetLog;
+
 // NetLog is the destination for log messages generated by the network stack.
 // Each log message has a "source" field which identifies the specific entity
 // that generated the message (for example, which URLRequest or which
@@ -136,7 +140,25 @@
     DISALLOW_COPY_AND_ASSIGN(ThreadSafeObserver);
   };
 
-  NetLog();
+  // Returns the singleton NetLog object, which is never destructed and which
+  // may be used on any thread.
+  static NetLog* Get();
+
+  // NetLog should only be used through the singleton returned by Get(), the
+  // constructor takes a PassKey to ensure that additional NetLog objects
+  // cannot be created.
+  explicit NetLog(util::PassKey<NetLog>);
+
+  // NetLogWithSource creates a dummy NetLog as an internal optimization.
+  explicit NetLog(util::PassKey<NetLogWithSource>);
+
+  // Allow TestNetLog so test cases can create scoped lifetime NetLog objects.
+  // TODO(crbug.com/177538): Remove TestNetLog class, make tests use the global
+  // NetLog.
+  explicit NetLog(util::PassKey<TestNetLog>);
+
+  // TODO(crbug.com/177538): make the destructor = delete once there are no
+  // tests instantiating TestNetLogs.
   virtual ~NetLog();
 
   void AddEntry(NetLogEventType type,
@@ -229,7 +251,6 @@
   // TODO(eroman): Survey current callsites; most are probably not necessary,
   // and may even be harmful.
   bool IsCapturing() const {
-    CheckAlive();
     return GetObserverCaptureModes() != 0;
   }
 
@@ -321,33 +342,17 @@
   // be called while |lock_| is already held.
   bool HasObserver(ThreadSafeObserver* observer);
 
-  // In debug and ASAN builds, verify that the NetLog is not used while free.
-  // This is a regression test for https://crbug.com/983298.
-#if defined(ADDRESS_SANITIZER) || !defined(NDEBUG)
-  static constexpr int kAliveToken = 0xDEADBEEF;
-
-  inline void CheckAlive() const { CHECK_EQ(alive_, kAliveToken); }
-  inline void MarkDead() {
-    CheckAlive();
-    alive_ = 0;
-  }
-  int alive_ = kAliveToken;
-#else
-  inline void CheckAlive() const {}
-  inline void MarkDead() {}
-#endif
-
   // |lock_| protects access to |observers_|.
   base::Lock lock_;
 
   // Last assigned source ID.  Incremented to get the next one.
-  base::subtle::Atomic32 last_id_;
+  base::subtle::Atomic32 last_id_ = 0;
 
   // Holds the set of all capture modes that observers are watching the log at.
   //
   // Is 0 when there are no observers. Stored as an Atomic32 so it can be
   // accessed and updated more efficiently.
-  base::subtle::Atomic32 observer_capture_modes_;
+  base::subtle::Atomic32 observer_capture_modes_ = 0;
 
   // |observers_| is a list of observers, ordered by when they were added.
   // Pointers contained in |observers_| are non-owned, and must
diff --git a/net/log/net_log_unittest.cc b/net/log/net_log_unittest.cc
index 8dfef14..fec3bda 100644
--- a/net/log/net_log_unittest.cc
+++ b/net/log/net_log_unittest.cc
@@ -235,7 +235,7 @@
 
 // Makes sure that events on multiple threads are dispatched to all observers.
 TEST(NetLogTest, NetLogEventThreads) {
-  NetLog net_log;
+  TestNetLog net_log;
 
   // Attach some observers.  Since they're created after |net_log|, they'll
   // safely detach themselves on destruction.
@@ -256,7 +256,7 @@
 
 // Test adding and removing a single observer.
 TEST(NetLogTest, NetLogAddRemoveObserver) {
-  NetLog net_log;
+  TestNetLog net_log;
   CountingObserver observer;
 
   AddEvent(&net_log);
@@ -298,7 +298,7 @@
 
 // Test adding and removing two observers at different log levels.
 TEST(NetLogTest, NetLogTwoObservers) {
-  NetLog net_log;
+  TestNetLog net_log;
   LoggingObserver observer[2];
 
   // Add first observer.
@@ -354,7 +354,7 @@
 // Makes sure that adding and removing observers simultaneously on different
 // threads works.
 TEST(NetLogTest, NetLogAddRemoveObserverThreads) {
-  NetLog net_log;
+  TestNetLog net_log;
 
   // Run a bunch of threads to completion, each of which will repeatedly add
   // and remove an observer, and set its logging level.
diff --git a/net/log/net_log_util_unittest.cc b/net/log/net_log_util_unittest.cc
index 87c554c..73ba267 100644
--- a/net/log/net_log_util_unittest.cc
+++ b/net/log/net_log_util_unittest.cc
@@ -65,7 +65,7 @@
   // Using same context for each iteration makes sure deleted requests don't
   // appear in the list, or result in crashes.
   TestURLRequestContext context(true);
-  NetLog net_log;
+  TestNetLog net_log;
   context.set_net_log(&net_log);
   context.Init();
   TestDelegate delegate;
@@ -96,7 +96,7 @@
 
   TestDelegate delegate;
   for (size_t num_requests = 0; num_requests < 5; ++num_requests) {
-    NetLog net_log;
+    TestNetLog net_log;
     std::vector<std::unique_ptr<TestURLRequestContext>> contexts;
     std::vector<std::unique_ptr<URLRequest>> requests;
     std::set<URLRequestContext*> context_set;
diff --git a/net/log/net_log_with_source.cc b/net/log/net_log_with_source.cc
index 3b36b5f..9e9575c8 100644
--- a/net/log/net_log_with_source.cc
+++ b/net/log/net_log_with_source.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/logging.h"
+#include "base/no_destructor.h"
 #include "base/values.h"
 #include "net/base/net_errors.h"
 #include "net/log/net_log.h"
@@ -42,9 +43,9 @@
   // The "dummy" net log used here will always return false for IsCapturing(),
   // and have no sideffects should its method be called. In practice the only
   // method that will get called on it is IsCapturing().
-  static NetLog* dummy = new NetLog();
+  static base::NoDestructor<NetLog> dummy{util::PassKey<NetLogWithSource>()};
   DCHECK(!dummy->IsCapturing());
-  non_null_net_log_ = dummy;
+  non_null_net_log_ = dummy.get();
 }
 
 NetLogWithSource::~NetLogWithSource() {}
diff --git a/net/log/test_net_log.cc b/net/log/test_net_log.cc
index b531f6b..2021c53 100644
--- a/net/log/test_net_log.cc
+++ b/net/log/test_net_log.cc
@@ -14,6 +14,9 @@
 
 namespace net {
 
+TestNetLog::TestNetLog() : NetLog(util::PassKey<TestNetLog>()) {}
+TestNetLog::~TestNetLog() = default;
+
 RecordingTestNetLog::RecordingTestNetLog() {
   AddObserver(this, NetLogCaptureMode::kIncludeSensitive);
 }
diff --git a/net/log/test_net_log.h b/net/log/test_net_log.h
index 20b8f28..89325f92 100644
--- a/net/log/test_net_log.h
+++ b/net/log/test_net_log.h
@@ -19,13 +19,28 @@
 
 struct NetLogSource;
 
+// NetLog subclass that follows normal lifetime rules (has a public
+// destructor.)
+//
+// This class is for testing only. Production code should use the singleton
+// NetLog::Get().
+class TestNetLog : public NetLog {
+ public:
+  TestNetLog();
+  ~TestNetLog() override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(TestNetLog);
+};
+
 // NetLog subclass that attaches a single observer (this) to record NetLog
 // events and their parameters into an in-memory buffer. The NetLog is observed
 // at kSensitive level by default, however can be changed with
 // SetObserverCaptureMode().
 //
 // This class is for testing only.
-class RecordingTestNetLog : public NetLog, public NetLog::ThreadSafeObserver {
+class RecordingTestNetLog : public TestNetLog,
+                            public NetLog::ThreadSafeObserver {
  public:
   RecordingTestNetLog();
   ~RecordingTestNetLog() override;
diff --git a/net/log/trace_net_log_observer_unittest.cc b/net/log/trace_net_log_observer_unittest.cc
index 694e7e4..71d81da 100644
--- a/net/log/trace_net_log_observer_unittest.cc
+++ b/net/log/trace_net_log_observer_unittest.cc
@@ -429,7 +429,7 @@
 TEST(TraceNetLogObserverCategoryTest, DisabledCategory) {
   base::test::TaskEnvironment task_environment;
   TraceNetLogObserver observer;
-  NetLog net_log;
+  TestNetLog net_log;
   observer.WatchForTraceStart(&net_log);
 
   EXPECT_FALSE(net_log.IsCapturing());
@@ -446,7 +446,7 @@
 TEST(TraceNetLogObserverCategoryTest, EnabledCategory) {
   base::test::TaskEnvironment task_environment;
   TraceNetLogObserver observer;
-  NetLog net_log;
+  TestNetLog net_log;
   observer.WatchForTraceStart(&net_log);
 
   EXPECT_FALSE(net_log.IsCapturing());
diff --git a/net/quic/quic_flags_list.h b/net/quic/quic_flags_list.h
index 1ca9894..1d69a47 100644
--- a/net/quic/quic_flags_list.h
+++ b/net/quic/quic_flags_list.h
@@ -164,9 +164,6 @@
     FLAGS_quic_reloadable_flag_send_quic_fallback_server_config_on_leto_error,
     false)
 
-// If true, enable QUIC version 49.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_version_49, true)
-
 // If true, GFE will not request private keys when fetching QUIC ServerConfigs
 // from Leto.
 QUIC_FLAG(bool,
@@ -190,12 +187,6 @@
           FLAGS_quic_reloadable_flag_quic_conservative_cwnd_and_pacing_gains,
           false)
 
-// When true, QUIC Version Negotiation packets will randomly include fake
-// versions.
-QUIC_FLAG(bool,
-          FLAGS_quic_reloadable_flag_quic_version_negotiation_grease,
-          true)
-
 // If true, use predictable version negotiation versions.
 QUIC_FLAG(bool, FLAGS_quic_disable_version_negotiation_grease_randomness, false)
 
diff --git a/net/socket/socks_connect_job_unittest.cc b/net/socket/socks_connect_job_unittest.cc
index 44cad4e..b1c9478 100644
--- a/net/socket/socks_connect_job_unittest.cc
+++ b/net/socket/socks_connect_job_unittest.cc
@@ -60,7 +60,7 @@
             nullptr /* ssl_client_context */,
             nullptr /* socket_performance_watcher_factory */,
             nullptr /* network_quality_estimator */,
-            &net_log_,
+            NetLog::Get(),
             nullptr /* websocket_endpoint_lock_manager */) {}
 
   ~SOCKSConnectJobTest() override {}
@@ -80,7 +80,6 @@
   }
 
  protected:
-  NetLog net_log_;
   MockHostResolver host_resolver_;
   MockTaggingClientSocketFactory client_socket_factory_;
   const CommonConnectJobParams common_connect_job_params_;
diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc
index 199d978..87ea2242b 100644
--- a/net/socket/ssl_client_socket_unittest.cc
+++ b/net/socket/ssl_client_socket_unittest.cc
@@ -808,37 +808,32 @@
       : chunk_size_(chunk_size), chunk_count_(chunk_count) {}
 
   void SendResponse(const test_server::SendBytesCallback& send,
-                    const test_server::SendCompleteCallback& done) override {
+                    test_server::SendCompleteCallback done) override {
     std::string headers = base::StringPrintf(
         "HTTP/1.1 200 OK\r\n"
         "Connection: close\r\n"
         "Content-Length: %zu\r\n"
         "Content-Type: text/plain\r\n\r\n",
         chunk_size_ * chunk_count_);
-    // TODO(davidben): SendCompleteCallback should be a OnceClosure and this
-    // call a BindOnce.
-    send.Run(headers, base::BindRepeating(&SendChunks, chunk_size_,
-                                          chunk_count_, send, done));
+    send.Run(headers, base::BindOnce(&SendChunks, chunk_size_, chunk_count_,
+                                     send, std::move(done)));
   }
 
  private:
   static void SendChunks(size_t chunk_size,
                          size_t chunk_count,
                          const test_server::SendBytesCallback& send,
-                         const test_server::SendCompleteCallback& done) {
+                         test_server::SendCompleteCallback done) {
     if (chunk_count == 0) {
-      done.Run();
+      std::move(done).Run();
       return;
     }
 
     std::string chunk(chunk_size, '*');
     // This assumes that splitting output into separate |send| calls will
     // produce separate TLS records.
-    //
-    // TODO(davidben): SendCompleteCallback should be a OnceClosure and this
-    // call a BindOnce.
-    send.Run(chunk, base::BindRepeating(&SendChunks, chunk_size,
-                                        chunk_count - 1, send, done));
+    send.Run(chunk, base::BindOnce(&SendChunks, chunk_size, chunk_count - 1,
+                                   send, std::move(done)));
   }
 
   size_t chunk_size_;
@@ -1390,7 +1385,7 @@
   ~ZeroRTTResponse() override {}
 
   void SendResponse(const test_server::SendBytesCallback& send,
-                    const test_server::SendCompleteCallback& done) override {
+                    test_server::SendCompleteCallback done) override {
     std::string response;
     if (zero_rtt_) {
       response = "1";
@@ -1401,7 +1396,7 @@
     // Since the EmbeddedTestServer doesn't keep the socket open by default, it
     // is explicitly kept alive to allow the remaining leg of the 0RTT handshake
     // to be received after the early data.
-    send.Run(response, base::BindRepeating([]() {}));
+    send.Run(response, base::BindOnce([]() {}));
   }
 
  private:
diff --git a/net/test/embedded_test_server/controllable_http_response.cc b/net/test/embedded_test_server/controllable_http_response.cc
index e7470f2b..f393163 100644
--- a/net/test/embedded_test_server/controllable_http_response.cc
+++ b/net/test/embedded_test_server/controllable_http_response.cc
@@ -26,12 +26,12 @@
 
  private:
   void SendResponse(const SendBytesCallback& send,
-                    const SendCompleteCallback& done) override {
+                    SendCompleteCallback done) override {
     controller_task_runner_->PostTask(
         FROM_HERE,
         base::BindOnce(&ControllableHttpResponse::OnRequest, controller_,
-                       base::ThreadTaskRunnerHandle::Get(), send, done,
-                       std::move(http_request_)));
+                       base::ThreadTaskRunnerHandle::Get(), send,
+                       std::move(done), std::move(http_request_)));
   }
 
   base::WeakPtr<ControllableHttpResponse> controller_;
@@ -96,7 +96,7 @@
   DCHECK_EQ(State::READY_TO_SEND_DATA, state_) << "Done() called without any "
                                                   "opened connection. Did you "
                                                   "call WaitForRequest()?";
-  embedded_test_server_task_runner_->PostTask(FROM_HERE, done_);
+  embedded_test_server_task_runner_->PostTask(FROM_HERE, std::move(done_));
   state_ = State::DONE;
 }
 
@@ -104,14 +104,14 @@
     scoped_refptr<base::SingleThreadTaskRunner>
         embedded_test_server_task_runner,
     const SendBytesCallback& send,
-    const SendCompleteCallback& done,
+    SendCompleteCallback done,
     std::unique_ptr<HttpRequest> http_request) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(!embedded_test_server_task_runner_)
       << "A ControllableHttpResponse can only handle one request at a time";
   embedded_test_server_task_runner_ = embedded_test_server_task_runner;
   send_ = send;
-  done_ = done;
+  done_ = std::move(done);
   http_request_ = std::move(http_request);
   loop_.Quit();
 }
diff --git a/net/test/embedded_test_server/controllable_http_response.h b/net/test/embedded_test_server/controllable_http_response.h
index 22406a7..41fa34a 100644
--- a/net/test/embedded_test_server/controllable_http_response.h
+++ b/net/test/embedded_test_server/controllable_http_response.h
@@ -68,7 +68,7 @@
   void OnRequest(scoped_refptr<base::SingleThreadTaskRunner>
                      embedded_test_server_task_runner,
                  const SendBytesCallback& send,
-                 const SendCompleteCallback& done,
+                 SendCompleteCallback done,
                  std::unique_ptr<HttpRequest> http_request);
 
   static std::unique_ptr<HttpResponse> RequestHandler(
diff --git a/net/test/embedded_test_server/default_handlers.cc b/net/test/embedded_test_server/default_handlers.cc
index c0af895..bab85b4a 100644
--- a/net/test/embedded_test_server/default_handlers.cc
+++ b/net/test/embedded_test_server/default_handlers.cc
@@ -679,7 +679,7 @@
   HungHttpResponse() = default;
 
   void SendResponse(const SendBytesCallback& send,
-                    const SendCompleteCallback& done) override {}
+                    SendCompleteCallback done) override {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(HungHttpResponse);
@@ -697,7 +697,7 @@
   HungAfterHeadersHttpResponse() = default;
 
   void SendResponse(const SendBytesCallback& send,
-                    const SendCompleteCallback& done) override {
+                    SendCompleteCallback done) override {
     send.Run("HTTP/1.1 OK\r\n\r\n", base::DoNothing());
   }
 
@@ -714,28 +714,27 @@
 
 // /exabyte_response
 // A HttpResponse that is almost never ending (with an Exabyte content-length).
-class ExabyteResponse : public net::test_server::BasicHttpResponse {
+class ExabyteResponse : public BasicHttpResponse {
  public:
   ExabyteResponse() {}
 
-  void SendResponse(
-      const net::test_server::SendBytesCallback& send,
-      const net::test_server::SendCompleteCallback& done) override {
+  void SendResponse(const SendBytesCallback& send,
+                    SendCompleteCallback done) override {
     // Use 10^18 bytes (exabyte) as the content length so that the client will
     // be expecting data.
     send.Run("HTTP/1.1 200 OK\r\nContent-Length:1000000000000000000\r\n\r\n",
-             base::BindRepeating(&ExabyteResponse::SendExabyte, send));
+             base::BindOnce(&ExabyteResponse::SendExabyte, send));
   }
 
  private:
   // Keeps sending the word "echo" over and over again. It can go further to
   // limit the response to exactly an exabyte, but it shouldn't be necessary
   // for the purpose of testing.
-  static void SendExabyte(const net::test_server::SendBytesCallback& send) {
+  static void SendExabyte(const SendBytesCallback& send) {
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::BindOnce(send, "echo",
-                                  base::BindRepeating(
-                                      &ExabyteResponse::SendExabyte, send)));
+        FROM_HERE,
+        base::BindOnce(send, "echo",
+                       base::BindOnce(&ExabyteResponse::SendExabyte, send)));
   }
 
   DISALLOW_COPY_AND_ASSIGN(ExabyteResponse);
@@ -743,8 +742,8 @@
 
 // /exabyte_response
 // Almost never ending response.
-std::unique_ptr<net::test_server::HttpResponse> HandleExabyteResponse(
-    const net::test_server::HttpRequest& request) {
+std::unique_ptr<HttpResponse> HandleExabyteResponse(
+    const HttpRequest& request) {
   return std::make_unique<ExabyteResponse>();
 }
 
diff --git a/net/test/embedded_test_server/embedded_test_server.cc b/net/test/embedded_test_server/embedded_test_server.cc
index 176d0b7a..2992d6f 100644
--- a/net/test/embedded_test_server/embedded_test_server.cc
+++ b/net/test/embedded_test_server/embedded_test_server.cc
@@ -250,9 +250,10 @@
   }
 
   response->SendResponse(
-      base::Bind(&HttpConnection::SendResponseBytes, connection->GetWeakPtr()),
-      base::Bind(&EmbeddedTestServer::DidClose, weak_factory_.GetWeakPtr(),
-                 connection));
+      base::BindRepeating(&HttpConnection::SendResponseBytes,
+                          connection->GetWeakPtr()),
+      base::BindOnce(&EmbeddedTestServer::DidClose, weak_factory_.GetWeakPtr(),
+                     connection));
 }
 
 GURL EmbeddedTestServer::GetURL(const std::string& relative_url) const {
diff --git a/net/test/embedded_test_server/embedded_test_server_unittest.cc b/net/test/embedded_test_server/embedded_test_server_unittest.cc
index c1369b1e..da1d148 100644
--- a/net/test/embedded_test_server/embedded_test_server_unittest.cc
+++ b/net/test/embedded_test_server/embedded_test_server_unittest.cc
@@ -416,7 +416,7 @@
   InfiniteResponse() {}
 
   void SendResponse(const SendBytesCallback& send,
-                    const SendCompleteCallback& done) override {
+                    SendCompleteCallback done) override {
     send.Run(ToResponseString(),
              base::Bind(&InfiniteResponse::SendInfinite,
                         weak_ptr_factory_.GetWeakPtr(), send));
diff --git a/net/test/embedded_test_server/http_connection.cc b/net/test/embedded_test_server/http_connection.cc
index d9799637..5077814 100644
--- a/net/test/embedded_test_server/http_connection.cc
+++ b/net/test/embedded_test_server/http_connection.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "net/base/net_errors.h"
 #include "net/socket/stream_socket.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
@@ -25,16 +26,16 @@
 }
 
 void HttpConnection::SendResponseBytes(const std::string& response_string,
-                                       const SendCompleteCallback& callback) {
+                                       SendCompleteCallback callback) {
   if (response_string.length() > 0) {
     scoped_refptr<DrainableIOBuffer> write_buf =
         base::MakeRefCounted<DrainableIOBuffer>(
             base::MakeRefCounted<StringIOBuffer>(response_string),
             response_string.length());
 
-    SendInternal(callback, write_buf);
+    SendInternal(std::move(callback), write_buf);
   } else {
-    callback.Run();
+    std::move(callback).Run();
   }
 }
 
@@ -51,14 +52,16 @@
   return false;
 }
 
-void HttpConnection::SendInternal(const base::Closure& callback,
+void HttpConnection::SendInternal(base::OnceClosure callback,
                                   scoped_refptr<DrainableIOBuffer> buf) {
+  base::RepeatingClosure repeating_callback =
+      base::AdaptCallbackForRepeating(std::move(callback));
   while (buf->BytesRemaining() > 0) {
-    int rv =
-        socket_->Write(buf.get(), buf->BytesRemaining(),
-                       base::BindOnce(&HttpConnection::OnSendInternalDone,
-                                      base::Unretained(this), callback, buf),
-                       TRAFFIC_ANNOTATION_FOR_TESTS);
+    int rv = socket_->Write(
+        buf.get(), buf->BytesRemaining(),
+        base::BindOnce(&HttpConnection::OnSendInternalDone,
+                       base::Unretained(this), repeating_callback, buf),
+        TRAFFIC_ANNOTATION_FOR_TESTS);
     if (rv == ERR_IO_PENDING)
       return;
 
@@ -69,18 +72,18 @@
 
   // The HttpConnection will be deleted by the callback since we only need to
   // serve a single request.
-  callback.Run();
+  repeating_callback.Run();
 }
 
-void HttpConnection::OnSendInternalDone(const base::Closure& callback,
+void HttpConnection::OnSendInternalDone(base::OnceClosure callback,
                                         scoped_refptr<DrainableIOBuffer> buf,
                                         int rv) {
   if (rv < 0) {
-    callback.Run();
+    std::move(callback).Run();
     return;
   }
   buf->DidConsume(rv);
-  SendInternal(callback, buf);
+  SendInternal(std::move(callback), buf);
 }
 
 base::WeakPtr<HttpConnection> HttpConnection::GetWeakPtr() {
diff --git a/net/test/embedded_test_server/http_connection.h b/net/test/embedded_test_server/http_connection.h
index 041cea53..6c9dcfa7 100644
--- a/net/test/embedded_test_server/http_connection.h
+++ b/net/test/embedded_test_server/http_connection.h
@@ -27,8 +27,8 @@
 
 // Calblack called when a request is parsed. Response should be sent
 // using HttpConnection::SendResponse() on the |connection| argument.
-typedef base::Callback<void(HttpConnection* connection,
-                            std::unique_ptr<HttpRequest> request)>
+typedef base::RepeatingCallback<void(HttpConnection* connection,
+                                     std::unique_ptr<HttpRequest> request)>
     HandleRequestCallback;
 
 // Wraps the connection socket. Accepts incoming data and sends responses.
@@ -41,7 +41,7 @@
 
   // Sends the |response_string| to the client and calls |callback| once done.
   void SendResponseBytes(const std::string& response_string,
-                         const SendCompleteCallback& callback);
+                         SendCompleteCallback callback);
 
   // Accepts raw chunk of data from the client. Internally, passes it to the
   // HttpRequestParser class. If a request is parsed, then |callback_| is
@@ -53,9 +53,9 @@
  private:
   friend class EmbeddedTestServer;
 
-  void SendInternal(const base::Closure& callback,
+  void SendInternal(base::OnceClosure callback,
                     scoped_refptr<DrainableIOBuffer> buffer);
-  void OnSendInternalDone(const base::Closure& callback,
+  void OnSendInternalDone(base::OnceClosure callback,
                           scoped_refptr<DrainableIOBuffer> buffer,
                           int rv);
 
diff --git a/net/test/embedded_test_server/http_response.cc b/net/test/embedded_test_server/http_response.cc
index cc5e99b..adf79c5 100644
--- a/net/test/embedded_test_server/http_response.cc
+++ b/net/test/embedded_test_server/http_response.cc
@@ -4,6 +4,8 @@
 
 #include "net/test/embedded_test_server/http_response.h"
 
+#include <utility>
+
 #include "base/bind.h"
 #include "base/format_macros.h"
 #include "base/logging.h"
@@ -24,7 +26,7 @@
 RawHttpResponse::~RawHttpResponse() = default;
 
 void RawHttpResponse::SendResponse(const SendBytesCallback& send,
-                                   const SendCompleteCallback& done) {
+                                   SendCompleteCallback done) {
   std::string response;
   if (!headers_.empty()) {
     response = headers_;
@@ -38,7 +40,7 @@
   } else {
     response = contents_;
   }
-  send.Run(response, done);
+  send.Run(response, std::move(done));
 }
 
 void RawHttpResponse::AddHeader(const std::string& key_value_pair) {
@@ -83,8 +85,8 @@
 }
 
 void BasicHttpResponse::SendResponse(const SendBytesCallback& send,
-                                     const SendCompleteCallback& done) {
-  send.Run(ToResponseString(), done);
+                                     SendCompleteCallback done) {
+  send.Run(ToResponseString(), std::move(done));
 }
 
 DelayedHttpResponse::DelayedHttpResponse(const base::TimeDelta delay)
@@ -93,13 +95,14 @@
 DelayedHttpResponse::~DelayedHttpResponse() = default;
 
 void DelayedHttpResponse::SendResponse(const SendBytesCallback& send,
-                                       const SendCompleteCallback& done) {
+                                       SendCompleteCallback done) {
   base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, base::BindOnce(send, ToResponseString(), done), delay_);
+      FROM_HERE, base::BindOnce(send, ToResponseString(), std::move(done)),
+      delay_);
 }
 
 void HungResponse::SendResponse(const SendBytesCallback& send,
-                                const SendCompleteCallback& done) {}
+                                SendCompleteCallback done) {}
 
 }  // namespace test_server
 }  // namespace net
diff --git a/net/test/embedded_test_server/http_response.h b/net/test/embedded_test_server/http_response.h
index d78dda25..e7366f7 100644
--- a/net/test/embedded_test_server/http_response.h
+++ b/net/test/embedded_test_server/http_response.h
@@ -18,14 +18,14 @@
 namespace test_server {
 
 // Callback called when the response is done being sent.
-using SendCompleteCallback = base::Callback<void(void)>;
+using SendCompleteCallback = base::OnceClosure;
 
 // Callback called when the response is ready to be sent that takes the
 // |response| that is being sent along with the callback |write_done| that is
 // called when the response has been fully written.
 using SendBytesCallback =
-    base::Callback<void(const std::string& response,
-                        const SendCompleteCallback& write_done)>;
+    base::RepeatingCallback<void(const std::string& response,
+                                 SendCompleteCallback write_done)>;
 
 // Interface for HTTP response implementations.
 class HttpResponse{
@@ -36,7 +36,7 @@
   // |write_done| when complete. When the entire response has been sent,
   // |done| must be called.
   virtual void SendResponse(const SendBytesCallback& send,
-                            const SendCompleteCallback& done) = 0;
+                            SendCompleteCallback done) = 0;
 };
 
 // This class is used to handle basic HTTP responses with commonly used
@@ -69,7 +69,7 @@
   std::string ToResponseString() const;
 
   void SendResponse(const SendBytesCallback& send,
-                    const SendCompleteCallback& done) override;
+                    SendCompleteCallback done) override;
 
  private:
   HttpStatusCode code_;
@@ -87,7 +87,7 @@
 
   // Issues a delayed send to the to the task runner.
   void SendResponse(const SendBytesCallback& send,
-                    const SendCompleteCallback& done) override;
+                    SendCompleteCallback done) override;
 
  private:
   // The delay time for the response.
@@ -102,7 +102,7 @@
   ~RawHttpResponse() override;
 
   void SendResponse(const SendBytesCallback& send,
-                    const SendCompleteCallback& done) override;
+                    SendCompleteCallback done) override;
 
   void AddHeader(const std::string& key_value_pair);
 
@@ -121,7 +121,7 @@
   ~HungResponse() override {}
 
   void SendResponse(const SendBytesCallback& send,
-                    const SendCompleteCallback& done) override;
+                    SendCompleteCallback done) override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(HungResponse);
diff --git a/net/tools/quic/synchronous_host_resolver.cc b/net/tools/quic/synchronous_host_resolver.cc
index abc0c36..a3c64ea 100644
--- a/net/tools/quic/synchronous_host_resolver.cc
+++ b/net/tools/quic/synchronous_host_resolver.cc
@@ -61,12 +61,11 @@
 void ResolverThread::Run() {
   base::SingleThreadTaskExecutor io_task_executor(base::MessagePumpType::IO);
 
-  net::NetLog net_log;
   net::HostResolver::ManagerOptions options;
   options.max_concurrent_resolves = 6;
   options.max_system_retry_attempts = 3u;
   std::unique_ptr<net::HostResolver> resolver =
-      net::HostResolver::CreateStandaloneResolver(&net_log, options);
+      net::HostResolver::CreateStandaloneResolver(NetLog::Get(), options);
 
   HostPortPair host_port_pair(host_, 80);
   // No need to use a NetworkIsolationKey here, since this is an external tool
diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc
index ab879e9..a05f9ef 100644
--- a/net/url_request/url_request_context_builder.cc
+++ b/net/url_request/url_request_context_builder.cc
@@ -389,7 +389,7 @@
     // builder or resulting context.
     context->set_net_log(net_log_);
   } else {
-    storage->set_net_log(std::make_unique<NetLog>());
+    context->set_net_log(NetLog::Get());
   }
 
   if (host_resolver_) {
diff --git a/net/url_request/url_request_context_storage.cc b/net/url_request/url_request_context_storage.cc
index a05e719..258c570 100644
--- a/net/url_request/url_request_context_storage.cc
+++ b/net/url_request/url_request_context_storage.cc
@@ -18,7 +18,6 @@
 #include "net/http/http_auth_handler_factory.h"
 #include "net/http/http_server_properties.h"
 #include "net/http/http_transaction_factory.h"
-#include "net/log/net_log.h"
 #include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/quic/quic_context.h"
 #include "net/url_request/url_request_context.h"
@@ -44,11 +43,6 @@
 
 URLRequestContextStorage::~URLRequestContextStorage() = default;
 
-void URLRequestContextStorage::set_net_log(std::unique_ptr<NetLog> net_log) {
-  context_->set_net_log(net_log.get());
-  net_log_ = std::move(net_log);
-}
-
 void URLRequestContextStorage::set_host_resolver(
     std::unique_ptr<HostResolver> host_resolver) {
   context_->set_host_resolver(host_resolver.get());
diff --git a/net/url_request/url_request_context_storage.h b/net/url_request/url_request_context_storage.h
index 6fe7fde..bda9e88 100644
--- a/net/url_request/url_request_context_storage.h
+++ b/net/url_request/url_request_context_storage.h
@@ -26,7 +26,6 @@
 class HttpServerProperties;
 class HttpTransactionFactory;
 class HttpUserAgentSettings;
-class NetLog;
 class NetworkDelegate;
 class ProxyDelegate;
 class ProxyResolutionService;
@@ -56,7 +55,6 @@
   // These setters will set both the member variables and call the setter on the
   // URLRequestContext object. In all cases, ownership is passed to |this|.
 
-  void set_net_log(std::unique_ptr<NetLog> net_log);
   void set_host_resolver(std::unique_ptr<HostResolver> host_resolver);
   void set_cert_verifier(std::unique_ptr<CertVerifier> cert_verifier);
   void set_http_auth_handler_factory(
@@ -112,7 +110,6 @@
   URLRequestContext* const context_;
 
   // Owned members.
-  std::unique_ptr<NetLog> net_log_;
   std::unique_ptr<HostResolver> host_resolver_;
   std::unique_ptr<CertVerifier> cert_verifier_;
   std::unique_ptr<HttpAuthHandlerFactory> http_auth_handler_factory_;
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index 2a517b7..53fe9a1 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -11781,7 +11781,7 @@
   ~ZeroRTTResponse() override {}
 
   void SendResponse(const test_server::SendBytesCallback& send,
-                    const test_server::SendCompleteCallback& done) override {
+                    test_server::SendCompleteCallback done) override {
     AddCustomHeader("Vary", "Early-Data");
     set_content_type("text/plain");
     AddCustomHeader("Cache-Control", "no-cache");
diff --git a/net/websockets/websocket_end_to_end_test.cc b/net/websockets/websocket_end_to_end_test.cc
index 5bf7b98..d45f572 100644
--- a/net/websockets/websocket_end_to_end_test.cc
+++ b/net/websockets/websocket_end_to_end_test.cc
@@ -465,10 +465,9 @@
   proxy_config.set_pac_mandatory(true);
   auto proxy_config_service = std::make_unique<ProxyConfigServiceFixed>(
       ProxyConfigWithAnnotation(proxy_config, TRAFFIC_ANNOTATION_FOR_TESTS));
-  NetLog net_log;
   std::unique_ptr<ProxyResolutionService> proxy_resolution_service(
       ProxyResolutionService::CreateUsingSystemProxyResolver(
-          std::move(proxy_config_service), &net_log));
+          std::move(proxy_config_service), NetLog::Get()));
   ASSERT_EQ(ws_server.host_port_pair().host(), "127.0.0.1");
   context_.set_proxy_resolution_service(proxy_resolution_service.get());
   InitialiseContext();
diff --git a/remoting/base/buffered_socket_writer_unittest.cc b/remoting/base/buffered_socket_writer_unittest.cc
index 6764b49..5affaad 100644
--- a/remoting/base/buffered_socket_writer_unittest.cc
+++ b/remoting/base/buffered_socket_writer_unittest.cc
@@ -100,8 +100,8 @@
 
  protected:
   void SetUp() override {
-    socket_.reset(new net::MockTCPClientSocket(net::AddressList(), &net_log_,
-                                               &socket_data_provider_));
+    socket_.reset(new net::MockTCPClientSocket(
+        net::AddressList(), net::NetLog::Get(), &socket_data_provider_));
     socket_data_provider_.set_connect_data(
         net::MockConnect(net::SYNCHRONOUS, net::OK));
     EXPECT_EQ(net::OK, socket_->Connect(net::CompletionOnceCallback()));
@@ -159,7 +159,6 @@
   }
 
   base::test::SingleThreadTaskEnvironment task_environment_;
-  net::NetLog net_log_;
   SocketDataProvider socket_data_provider_;
   std::unique_ptr<net::StreamSocket> socket_;
   std::unique_ptr<BufferedSocketWriter> writer_;
diff --git a/remoting/base/url_request_context_getter.cc b/remoting/base/url_request_context_getter.cc
index 0fdf64c..e1cc0da6 100644
--- a/remoting/base/url_request_context_getter.cc
+++ b/remoting/base/url_request_context_getter.cc
@@ -23,9 +23,8 @@
 
 net::URLRequestContext* URLRequestContextGetter::GetURLRequestContext() {
   if (!url_request_context_.get()) {
+    CreateVlogNetLogObserver();
     net::URLRequestContextBuilder builder;
-    net_log_.reset(new VlogNetLog());
-    builder.set_net_log(net_log_.get());
     builder.DisableHttpCache();
     builder.set_proxy_config_service(std::move(proxy_config_service_));
     url_request_context_ = builder.Build();
diff --git a/remoting/base/url_request_context_getter.h b/remoting/base/url_request_context_getter.h
index c66ac89e..be9d6f0 100644
--- a/remoting/base/url_request_context_getter.h
+++ b/remoting/base/url_request_context_getter.h
@@ -15,7 +15,6 @@
 }  // namespace base
 
 namespace net {
-class NetLog;
 class ProxyConfigService;
 }  // namespace net
 
@@ -37,7 +36,6 @@
  private:
   scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
   std::unique_ptr<net::ProxyConfigService> proxy_config_service_;
-  std::unique_ptr<net::NetLog> net_log_;
   std::unique_ptr<net::URLRequestContext> url_request_context_;
 
   DISALLOW_COPY_AND_ASSIGN(URLRequestContextGetter);
diff --git a/remoting/base/vlog_net_log.cc b/remoting/base/vlog_net_log.cc
index 7e2f9c8..1e8e0d3 100644
--- a/remoting/base/vlog_net_log.cc
+++ b/remoting/base/vlog_net_log.cc
@@ -9,45 +9,50 @@
 #include "base/json/json_writer.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/threading/thread_restrictions.h"
-#include "base/time/time.h"
+#include "base/no_destructor.h"
 #include "base/values.h"
+#include "net/log/net_log.h"
 #include "net/log/net_log_entry.h"
 
 namespace remoting {
 
-class VlogNetLog::Observer : public net::NetLog::ThreadSafeObserver {
+namespace {
+
+class VlogNetLogObserver : public net::NetLog::ThreadSafeObserver {
  public:
-  Observer();
-  ~Observer() override;
+  VlogNetLogObserver();
+  ~VlogNetLogObserver() override;
 
   // NetLog::ThreadSafeObserver overrides:
   void OnAddEntry(const net::NetLogEntry& entry) override;
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(Observer);
+  DISALLOW_COPY_AND_ASSIGN(VlogNetLogObserver);
 };
 
-VlogNetLog::Observer::Observer() = default;
-
-VlogNetLog::Observer::~Observer() = default;
-
-void VlogNetLog::Observer::OnAddEntry(const net::NetLogEntry& entry) {
+VlogNetLogObserver::VlogNetLogObserver() {
+  // Only add the observer if verbosity is at least level 4. This is more
+  // efficient than unconditionally adding the observer and checking the vlog
+  // level in OnAddEntry.
   if (VLOG_IS_ON(4)) {
-    base::Value value = entry.ToValue();
-    std::string json;
-    base::JSONWriter::Write(value, &json);
-    VLOG(4) << json;
+    net::NetLog::Get()->AddObserver(this,
+                                    net::NetLogCaptureMode::kIncludeSensitive);
   }
 }
 
-VlogNetLog::VlogNetLog()
-    : observer_(new Observer()) {
-  AddObserver(observer_.get(), net::NetLogCaptureMode::kIncludeSensitive);
+VlogNetLogObserver::~VlogNetLogObserver() = default;
+
+void VlogNetLogObserver::OnAddEntry(const net::NetLogEntry& entry) {
+  base::Value value = entry.ToValue();
+  std::string json;
+  base::JSONWriter::Write(value, &json);
+  VLOG(4) << json;
 }
 
-VlogNetLog::~VlogNetLog() {
-  RemoveObserver(observer_.get());
+}  // namespace
+
+void CreateVlogNetLogObserver() {
+  static base::NoDestructor<VlogNetLogObserver> observer;
 }
 
 }  // namespace remoting
diff --git a/remoting/base/vlog_net_log.h b/remoting/base/vlog_net_log.h
index c133e9b..02d89ba6 100644
--- a/remoting/base/vlog_net_log.h
+++ b/remoting/base/vlog_net_log.h
@@ -5,28 +5,11 @@
 #ifndef REMOTING_BASE_VLOG_NET_LOG_H_
 #define REMOTING_BASE_VLOG_NET_LOG_H_
 
-#include <memory>
-
-#include "base/macros.h"
-#include "net/log/net_log.h"
-
 namespace remoting {
 
-// Redirectes all networking events (i.e. events logged through net::NetLog) to
-// VLOG(4). Note that an explicit reference to a net::NetLog object has to be
-// passed to networking classes to receive the events. There is no global
-// network events logger exists.
-class VlogNetLog : public net::NetLog {
- public:
-  VlogNetLog();
-  ~VlogNetLog() override;
-
- private:
-  class Observer;
-  std::unique_ptr<Observer> observer_;
-
-  DISALLOW_COPY_AND_ASSIGN(VlogNetLog);
-};
+// Registers a NetLog observer that redirects all networking events (i.e.
+// events logged through net::NetLog) to VLOG(4).
+void CreateVlogNetLogObserver();
 
 }  // namespace remoting
 
diff --git a/services/network/host_resolver_unittest.cc b/services/network/host_resolver_unittest.cc
index 013f2b8..443ef8d 100644
--- a/services/network/host_resolver_unittest.cc
+++ b/services/network/host_resolver_unittest.cc
@@ -197,9 +197,8 @@
 TEST_F(HostResolverTest, Sync) {
   auto inner_resolver = std::make_unique<net::MockHostResolver>();
   inner_resolver->set_synchronous_mode(true);
-  net::NetLog net_log;
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   base::RunLoop run_loop;
   mojo::Remote<mojom::ResolveHostHandle> control_handle;
@@ -228,9 +227,8 @@
 TEST_F(HostResolverTest, Async) {
   auto inner_resolver = std::make_unique<net::MockHostResolver>();
   inner_resolver->set_synchronous_mode(false);
-  net::NetLog net_log;
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   base::RunLoop run_loop;
   mojo::Remote<mojom::ResolveHostHandle> control_handle;
@@ -262,11 +260,10 @@
 }
 
 TEST_F(HostResolverTest, DnsQueryType) {
-  net::NetLog net_log;
   std::unique_ptr<net::HostResolver> inner_resolver =
-      net::HostResolver::CreateStandaloneResolver(&net_log);
+      net::HostResolver::CreateStandaloneResolver(net::NetLog::Get());
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   mojom::ResolveHostParametersPtr optional_parameters =
       mojom::ResolveHostParameters::New();
@@ -288,9 +285,8 @@
 
 TEST_F(HostResolverTest, InitialPriority) {
   auto inner_resolver = std::make_unique<net::MockHostResolver>();
-  net::NetLog net_log;
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   mojom::ResolveHostParametersPtr optional_parameters =
       mojom::ResolveHostParameters::New();
@@ -329,8 +325,7 @@
   inner_resolver->rules_map()[net::HostResolverSource::MULTICAST_DNS]->AddRule(
       kDomain, kMdnsResult);
 
-  net::NetLog net_log;
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   base::RunLoop any_run_loop;
   mojo::PendingRemote<mojom::ResolveHostClient> pending_any_client;
@@ -408,8 +403,7 @@
   base::SimpleTestTickClock test_clock;
   inner_resolver->set_tick_clock(&test_clock);
 
-  net::NetLog net_log;
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   // Load SYSTEM result into cache.
   base::RunLoop system_run_loop;
@@ -481,8 +475,7 @@
   base::SimpleTestTickClock test_clock;
   inner_resolver->set_tick_clock(&test_clock);
 
-  net::NetLog net_log;
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   // Load result into cache.
   base::RunLoop run_loop;
@@ -545,8 +538,7 @@
   base::SimpleTestTickClock test_clock;
   inner_resolver->set_tick_clock(&test_clock);
 
-  net::NetLog net_log;
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   // Load initial result into cache.
   base::RunLoop run_loop;
@@ -594,9 +586,8 @@
   inner_resolver->rules()->AddRuleWithFlags("example.com", "123.0.12.24",
                                             net::HOST_RESOLVER_CANONNAME,
                                             "canonicalexample.com");
-  net::NetLog net_log;
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   mojom::ResolveHostParametersPtr optional_parameters =
       mojom::ResolveHostParameters::New();
@@ -622,9 +613,8 @@
   auto inner_resolver = std::make_unique<net::MockHostResolver>();
   inner_resolver->rules()->AddRuleWithFlags("example.com", "127.0.12.24",
                                             net::HOST_RESOLVER_LOOPBACK_ONLY);
-  net::NetLog net_log;
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   mojom::ResolveHostParametersPtr optional_parameters =
       mojom::ResolveHostParameters::New();
@@ -646,9 +636,8 @@
 
 TEST_F(HostResolverTest, SecureDnsModeOverride) {
   auto inner_resolver = std::make_unique<net::MockHostResolver>();
-  net::NetLog net_log;
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   mojom::ResolveHostParametersPtr optional_parameters =
       mojom::ResolveHostParameters::New();
@@ -675,9 +664,8 @@
   auto inner_resolver = std::make_unique<net::MockHostResolver>();
   inner_resolver->rules()->AddSimulatedFailure("example.com");
   inner_resolver->set_synchronous_mode(true);
-  net::NetLog net_log;
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   base::RunLoop run_loop;
   mojo::Remote<mojom::ResolveHostHandle> control_handle;
@@ -704,9 +692,8 @@
   auto inner_resolver = std::make_unique<net::MockHostResolver>();
   inner_resolver->rules()->AddSimulatedFailure("example.com");
   inner_resolver->set_synchronous_mode(false);
-  net::NetLog net_log;
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   base::RunLoop run_loop;
   mojo::Remote<mojom::ResolveHostHandle> control_handle;
@@ -734,11 +721,10 @@
 }
 
 TEST_F(HostResolverTest, NoOptionalParameters) {
-  net::NetLog net_log;
   std::unique_ptr<net::HostResolver> inner_resolver =
-      net::HostResolver::CreateStandaloneResolver(&net_log);
+      net::HostResolver::CreateStandaloneResolver(net::NetLog::Get());
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   base::RunLoop run_loop;
   mojo::PendingRemote<mojom::ResolveHostClient> pending_response_client;
@@ -759,11 +745,10 @@
 }
 
 TEST_F(HostResolverTest, NoControlHandle) {
-  net::NetLog net_log;
   std::unique_ptr<net::HostResolver> inner_resolver =
-      net::HostResolver::CreateStandaloneResolver(&net_log);
+      net::HostResolver::CreateStandaloneResolver(net::NetLog::Get());
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   base::RunLoop run_loop;
   mojom::ResolveHostParametersPtr optional_parameters =
@@ -787,11 +772,10 @@
 }
 
 TEST_F(HostResolverTest, CloseControlHandle) {
-  net::NetLog net_log;
   std::unique_ptr<net::HostResolver> inner_resolver =
-      net::HostResolver::CreateStandaloneResolver(&net_log);
+      net::HostResolver::CreateStandaloneResolver(net::NetLog::Get());
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   base::RunLoop run_loop;
   mojo::Remote<mojom::ResolveHostHandle> control_handle;
@@ -822,9 +806,8 @@
   // Use a HangingHostResolver, so the test can ensure the request won't be
   // completed before the cancellation arrives.
   auto inner_resolver = std::make_unique<net::HangingHostResolver>();
-  net::NetLog net_log;
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   ASSERT_EQ(0, inner_resolver->num_cancellations());
 
@@ -858,11 +841,10 @@
 }
 
 TEST_F(HostResolverTest, Cancellation_SubsequentRequest) {
-  net::NetLog net_log;
   std::unique_ptr<net::HostResolver> inner_resolver =
-      net::HostResolver::CreateStandaloneResolver(&net_log);
+      net::HostResolver::CreateStandaloneResolver(net::NetLog::Get());
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   base::RunLoop run_loop;
   mojo::Remote<mojom::ResolveHostHandle> control_handle;
@@ -906,10 +888,9 @@
   // Use a HangingHostResolver, so the test can ensure the request won't be
   // completed before the cancellation arrives.
   auto inner_resolver = std::make_unique<net::HangingHostResolver>();
-  net::NetLog net_log;
 
   auto resolver =
-      std::make_unique<HostResolver>(inner_resolver.get(), &net_log);
+      std::make_unique<HostResolver>(inner_resolver.get(), net::NetLog::Get());
 
   ASSERT_EQ(0, inner_resolver->num_cancellations());
 
@@ -945,9 +926,8 @@
   // Use a HangingHostResolver, so the test can ensure the request won't be
   // completed before the cancellation arrives.
   auto inner_resolver = std::make_unique<net::HangingHostResolver>();
-  net::NetLog net_log;
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   ASSERT_EQ(0, inner_resolver->num_cancellations());
 
@@ -980,11 +960,10 @@
 }
 
 TEST_F(HostResolverTest, CloseClient_SubsequentRequest) {
-  net::NetLog net_log;
   std::unique_ptr<net::HostResolver> inner_resolver =
-      net::HostResolver::CreateStandaloneResolver(&net_log);
+      net::HostResolver::CreateStandaloneResolver(net::NetLog::Get());
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   base::RunLoop run_loop;
   mojo::PendingRemote<mojom::ResolveHostClient> pending_response_client;
@@ -1025,13 +1004,12 @@
       base::BindLambdaForTesting(
           [&](HostResolver* resolver) { shutdown_resolver = resolver; });
 
-  net::NetLog net_log;
   std::unique_ptr<net::HostResolver> inner_resolver =
-      net::HostResolver::CreateStandaloneResolver(&net_log);
+      net::HostResolver::CreateStandaloneResolver(net::NetLog::Get());
 
   HostResolver resolver(resolver_remote.BindNewPipeAndPassReceiver(),
                         std::move(shutdown_callback), inner_resolver.get(),
-                        &net_log);
+                        net::NetLog::Get());
 
   base::RunLoop run_loop;
   mojo::Remote<mojom::ResolveHostHandle> control_handle;
@@ -1068,11 +1046,10 @@
   // Use a HangingHostResolver, so the test can ensure the request won't be
   // completed before the cancellation arrives.
   auto inner_resolver = std::make_unique<net::HangingHostResolver>();
-  net::NetLog net_log;
 
   HostResolver resolver(resolver_remote.BindNewPipeAndPassReceiver(),
                         std::move(shutdown_callback), inner_resolver.get(),
-                        &net_log);
+                        net::NetLog::Get());
 
   ASSERT_EQ(0, inner_resolver->num_cancellations());
 
@@ -1113,13 +1090,12 @@
       base::BindLambdaForTesting(
           [&](HostResolver* resolver) { shutdown_resolver = resolver; });
 
-  net::NetLog net_log;
   std::unique_ptr<net::HostResolver> inner_resolver =
-      net::HostResolver::CreateStandaloneResolver(&net_log);
+      net::HostResolver::CreateStandaloneResolver(net::NetLog::Get());
 
   HostResolver resolver(resolver_remote.BindNewPipeAndPassReceiver(),
                         std::move(shutdown_callback), inner_resolver.get(),
-                        &net_log);
+                        net::NetLog::Get());
 
   base::RunLoop run_loop;
   mojo::PendingRemote<mojom::ResolveHostClient> pending_response_client;
@@ -1156,11 +1132,10 @@
 }
 
 TEST_F(HostResolverTest, IsSpeculative) {
-  net::NetLog net_log;
   std::unique_ptr<net::HostResolver> inner_resolver =
-      net::HostResolver::CreateStandaloneResolver(&net_log);
+      net::HostResolver::CreateStandaloneResolver(net::NetLog::Get());
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   base::RunLoop run_loop;
   mojo::PendingRemote<mojom::ResolveHostClient> pending_response_client;
@@ -1203,14 +1178,13 @@
                                                          std::move(rules));
   dns_client->set_ignore_system_config_changes(true);
 
-  net::NetLog net_log;
   std::unique_ptr<net::ContextHostResolver> inner_resolver =
-      net::HostResolver::CreateStandaloneContextResolver(&net_log);
+      net::HostResolver::CreateStandaloneContextResolver(net::NetLog::Get());
   inner_resolver->GetManagerForTesting()->SetDnsClientForTesting(
       std::move(dns_client));
   inner_resolver->GetManagerForTesting()->SetInsecureDnsClientEnabled(true);
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   base::RunLoop run_loop;
   mojom::ResolveHostParametersPtr optional_parameters =
@@ -1243,14 +1217,13 @@
                                                          std::move(rules));
   dns_client->set_ignore_system_config_changes(true);
 
-  net::NetLog net_log;
   std::unique_ptr<net::ContextHostResolver> inner_resolver =
-      net::HostResolver::CreateStandaloneContextResolver(&net_log);
+      net::HostResolver::CreateStandaloneContextResolver(net::NetLog::Get());
   inner_resolver->GetManagerForTesting()->SetDnsClientForTesting(
       std::move(dns_client));
   inner_resolver->GetManagerForTesting()->SetInsecureDnsClientEnabled(true);
 
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   base::RunLoop run_loop;
   mojom::ResolveHostParametersPtr optional_parameters =
@@ -1276,9 +1249,8 @@
 
 #if BUILDFLAG(ENABLE_MDNS)
 TEST_F(HostResolverTest, MdnsListener_AddressResult) {
-  net::NetLog net_log;
   auto inner_resolver = std::make_unique<net::MockHostResolver>();
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   mojo::PendingRemote<mojom::MdnsListenClient> pending_response_client;
   TestMdnsListenClient response_client(&pending_response_client);
@@ -1314,9 +1286,8 @@
 }
 
 TEST_F(HostResolverTest, MdnsListener_TextResult) {
-  net::NetLog net_log;
   auto inner_resolver = std::make_unique<net::MockHostResolver>();
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   mojo::PendingRemote<mojom::MdnsListenClient> pending_response_client;
   TestMdnsListenClient response_client(&pending_response_client);
@@ -1356,9 +1327,8 @@
 }
 
 TEST_F(HostResolverTest, MdnsListener_HostnameResult) {
-  net::NetLog net_log;
   auto inner_resolver = std::make_unique<net::MockHostResolver>();
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   mojo::PendingRemote<mojom::MdnsListenClient> pending_response_client;
   TestMdnsListenClient response_client(&pending_response_client);
@@ -1394,9 +1364,8 @@
 }
 
 TEST_F(HostResolverTest, MdnsListener_UnhandledResult) {
-  net::NetLog net_log;
   auto inner_resolver = std::make_unique<net::MockHostResolver>();
-  HostResolver resolver(inner_resolver.get(), &net_log);
+  HostResolver resolver(inner_resolver.get(), net::NetLog::Get());
 
   mojo::PendingRemote<mojom::MdnsListenClient> pending_response_client;
   TestMdnsListenClient response_client(&pending_response_client);
diff --git a/services/network/network_service.cc b/services/network/network_service.cc
index 1eb5b46..65f1690 100644
--- a/services/network/network_service.cc
+++ b/services/network/network_service.cc
@@ -17,7 +17,6 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/no_destructor.h"
 #include "base/numerics/ranges.h"
 #include "base/task/post_task.h"
 #include "base/timer/timer.h"
@@ -81,11 +80,6 @@
 
 NetworkService* g_network_service = nullptr;
 
-net::NetLog* GetNetLog() {
-  static base::NoDestructor<net::NetLog> instance;
-  return instance.get();
-}
-
 // The interval for calls to NetworkService::UpdateLoadStates
 constexpr auto kUpdateLoadStatesInterval =
     base::TimeDelta::FromMilliseconds(250);
@@ -249,7 +243,7 @@
     std::unique_ptr<service_manager::BinderRegistry> registry,
     mojo::PendingReceiver<mojom::NetworkService> receiver,
     bool delay_initialization_until_set_client)
-    : net_log_(GetNetLog()), registry_(std::move(registry)) {
+    : net_log_(net::NetLog::Get()), registry_(std::move(registry)) {
   DCHECK(!g_network_service);
   g_network_service = this;
 
diff --git a/services/network/throttling/throttling_controller_unittest.cc b/services/network/throttling/throttling_controller_unittest.cc
index a4ec57f..7946398 100644
--- a/services/network/throttling/throttling_controller_unittest.cc
+++ b/services/network/throttling/throttling_controller_unittest.cc
@@ -62,9 +62,8 @@
                                                  base::Unretained(&callback_))),
         mock_transaction_(kSimpleGET_Transaction),
         buffer_(base::MakeRefCounted<net::IOBuffer>(64)),
-        net_log_(std::make_unique<net::NetLog>()),
         net_log_with_source_(
-            net::NetLogWithSource::Make(net_log_.get(),
+            net::NetLogWithSource::Make(net::NetLog::Get(),
                                         net::NetLogSourceType::URL_REQUEST)),
         profile_id_(base::UnguessableToken::Create()) {
     mock_transaction_.test_mode = TEST_MODE_SYNC_NET_START;
@@ -157,7 +156,6 @@
   scoped_refptr<net::IOBuffer> buffer_;
   std::unique_ptr<net::ChunkedUploadDataStream> upload_data_stream_;
   std::unique_ptr<MockHttpRequest> request_;
-  std::unique_ptr<net::NetLog> net_log_;
   std::unique_ptr<network::ScopedThrottlingToken> throttling_token_;
   const net::NetLogWithSource net_log_with_source_;
   const base::UnguessableToken profile_id_;
diff --git a/services/network/url_loader_unittest.cc b/services/network/url_loader_unittest.cc
index 4da5a5d..493d38f 100644
--- a/services/network/url_loader_unittest.cc
+++ b/services/network/url_loader_unittest.cc
@@ -1014,9 +1014,8 @@
 
  private:
   // net::test_server::HttpResponse implementation.
-  void SendResponse(
-      const net::test_server::SendBytesCallback& send,
-      const net::test_server::SendCompleteCallback& done) override {
+  void SendResponse(const net::test_server::SendBytesCallback& send,
+                    net::test_server::SendCompleteCallback done) override {
     send.Run(
         "HTTP/1.1 200 OK\r\n"
         "Content-Type: text/plain\r\n\r\n"
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index 6f889c1..3b5e579 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -226,6 +226,10 @@
 #define SK_SUPPORT_LEGACY_AAA_CHOICE
 #endif
 
+#ifndef SK_SUPPORT_LEGACY_CPU_EMOJI
+#define SK_SUPPORT_LEGACY_CPU_EMOJI
+#endif
+
 // We're turning this off indefinitely,
 // until we can figure out some fundamental problems with its approach.
 //
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index 64247bb7..0e70c7a 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -673,7 +673,7 @@
     "args": [
       "--product=chrome_android",
       "--apk=apks/ChromePublic.apk",
-      "--verbose",
+      "-vvvv",
     ],
   },
   "chrome_sandbox": {
@@ -2656,7 +2656,7 @@
       "--product=android_webview",
       "--apk=apks/SystemWebView.apk",
       "--system-webview-shell=apks/SystemWebViewShell.apk",
-      "--verbose",
+      "-vvvv",
     ],
   },
   "telemetry_gpu_integration_test": {
diff --git a/testing/scripts/representative_perf_test_data/representatives_frame_times_upper_limit.json b/testing/scripts/representative_perf_test_data/representatives_frame_times_upper_limit.json
index f8a9720..2770b69 100644
--- a/testing/scripts/representative_perf_test_data/representatives_frame_times_upper_limit.json
+++ b/testing/scripts/representative_perf_test_data/representatives_frame_times_upper_limit.json
@@ -1,196 +1,196 @@
 {
   "win": {
-    "balls_css_transition_2_properties": {
-      "avg": 88.519,
-      "ci_095": 26.992
-    },
-    "many_planets_deep": {
-      "avg": 16.679,
-      "ci_095": 0.169
-    },
-    "web_animation_value_type_transform_complex": {
-      "avg": 47.464,
-      "ci_095": 1.228
-    },
-    "nvidia_vertex_buffer_object": {
-      "avg": 17.918,
-      "ci_095": 3.238
-    },
-    "runway_2019": {
-      "avg": 28.237,
-      "ci_095": 28.279
-    },
-    "css_animations_simultaneous_inline_style": {
-      "avg": 25.100,
-      "ci_095": 0.711
-    },
-    "aquarium_20k": {
-      "avg": 123.389,
-      "ci_095": 4.392
-    },
     "canvas_to_blob": {
-      "avg": 30.395,
-      "ci_095": 12.237
-    },
-    "cc_poster_circle": {
-      "avg": 16.678,
-      "ci_095": 0.067
-    },
-    "js_poster_circle": {
-      "avg": 16.679,
-      "ci_095": 0.113
-    },
-    "web_animations_staggered_triggering_page": {
-      "avg": 16.862,
-      "ci_095": 0.245
-    },
-    "aquarium": {
-      "avg": 16.699,
-      "ci_095": 0.304
-    },
-    "css_value_type_shadow": {
-      "avg": 47.344,
-      "ci_095": 1.018
+      "ci_095": 10.93,
+      "avg": 30.145
     },
     "filter_terrain_svg": {
-      "avg": 30.466,
-      "ci_095": 0.212
+      "ci_095": 0.307,
+      "avg": 30.065
+    },
+    "web_animation_value_type_transform_complex": {
+      "ci_095": 1.574,
+      "avg": 48.422
+    },
+    "runway_2019": {
+      "ci_095": 14.407,
+      "avg": 22.487
     },
     "css_transitions_inline_style": {
-      "avg": 19.283,
-      "ci_095": 3.280
+      "ci_095": 3.976,
+      "avg": 19.575
+    },
+    "css_animations_simultaneous_inline_style": {
+      "ci_095": 0.774,
+      "avg": 21.192
+    },
+    "aquarium_20k": {
+      "ci_095": 3.731,
+      "avg": 129.946
+    },
+    "balls_css_transition_2_properties": {
+      "ci_095": 18.826,
+      "avg": 83.677
+    },
+    "cc_poster_circle": {
+      "ci_095": 0.064,
+      "avg": 16.678
+    },
+    "js_poster_circle": {
+      "ci_095": 0.108,
+      "avg": 16.678
+    },
+    "web_animations_staggered_triggering_page": {
+      "ci_095": 0.457,
+      "avg": 16.832
+    },
+    "aquarium": {
+      "ci_095": 0.231,
+      "avg": 16.689
+    },
+    "css_value_type_shadow": {
+      "ci_095": 0.964,
+      "avg": 48.34
+    },
+    "nvidia_vertex_buffer_object": {
+      "ci_095": 3.354,
+      "avg": 17.637
+    },
+    "many_planets_deep": {
+      "ci_095": 0.127,
+      "avg": 16.678
     }
   },
   "mac": {
     "mix_blend_mode_animation_screen": {
-      "avg": 96.183,
-      "ci_095": 2.947
+      "ci_095": 2.861,
+      "avg": 102.359
     },
     "twitch_2018": {
-      "avg": 33.002,
-      "ci_095": 18.294
+      "ci_095": 13.965,
+      "avg": 28.108
     },
     "balls_javascript_canvas": {
-      "avg": 40.793,
-      "ci_095": 1.419
+      "ci_095": 1.283,
+      "avg": 43.473
     },
     "transform_transitions_js_block": {
-      "avg": 16.758,
-      "ci_095": 0.442
+      "ci_095": 0.402,
+      "avg": 16.758
     },
     "web_animations_staggered_infinite_iterations": {
-      "avg": 16.692,
-      "ci_095": 0.291
+      "ci_095": 0.285,
+      "avg": 16.691
     },
     "fill_shapes": {
-      "avg": 36.591,
-      "ci_095": 1.719
+      "ci_095": 1.427,
+      "avg": 36.335
     },
     "css_value_type_shadow": {
-      "avg": 65.745,
-      "ci_095": 16.053
+      "ci_095": 15.473,
+      "avg": 66.584
     },
     "animometer_webgl_attrib_arrays": {
-      "avg": 16.862,
-      "ci_095": 0.636
+      "ci_095": 0.544,
+      "avg": 16.936
     },
     "web_animation_value_type_transform_simple": {
-      "avg": 48.286,
-      "ci_095": 2.421
+      "ci_095": 2.185,
+      "avg": 50.459
     },
     "canvas_05000_pixels_per_second": {
-      "avg": 16.685,
-      "ci_095": 0.333
+      "ci_095": 0.324,
+      "avg": 16.684
     },
     "bouncing_clipped_rectangles": {
-      "avg": 537.025,
-      "ci_095": 168.527
+      "ci_095": 128.12,
+      "avg": 596.153
     },
     "ie_chalkboard": {
-      "avg": 66.825,
-      "ci_095": 39.904
+      "ci_095": 41.361,
+      "avg": 66.231
     },
     "new_tilings": {
-      "avg": 23.163,
-      "ci_095": 1.13
+      "ci_095": 0.776,
+      "avg": 19.943
     },
     "chip_tune": {
-      "avg": 16.737,
-      "ci_095": 0.453
+      "ci_095": 0.42,
+      "avg": 16.732
     },
     "extra_large_texture_uploads": {
-      "avg": 58.721,
-      "ci_095": 2.462
+      "ci_095": 2.274,
+      "avg": 60.959
     },
     "css_value_type_filter": {
-      "avg": 86.254,
-      "ci_095": 1.79
+      "ci_095": 1.667,
+      "avg": 89.362
     }
   },
   "android": {
     "mix_blend_mode_animation_screen": {
-      "avg": 511.313,
-      "ci_095": 233.908
-    },
-    "twitch_2018": {
-      "avg": 19.843,
-      "ci_095": 6.112
-    },
-    "balls_javascript_canvas": {
-      "avg": 191.168,
-      "ci_095": 18.935
-    },
-    "transform_transitions_js_block": {
-      "avg": 16.652,
-      "ci_095": 0.065
-    },
-    "web_animations_staggered_infinite_iterations": {
-      "avg": 47.653,
-      "ci_095": 4.68
+      "ci_095": 226.118,
+      "avg": 629.962
     },
     "text_10000_pixels_per_second": {
-      "avg": 16.813,
-      "ci_095": 0.543
+      "ci_095": 0.653,
+      "avg": 16.812
+    },
+    "balls_javascript_canvas": {
+      "ci_095": 22.183,
+      "avg": 219.386
+    },
+    "transform_transitions_js_block": {
+      "ci_095": 0.059,
+      "avg": 16.647
+    },
+    "web_animations_staggered_infinite_iterations": {
+      "ci_095": 8.037,
+      "avg": 67.986
+    },
+    "twitch_2018": {
+      "ci_095": 10.816,
+      "avg": 21.09
     },
     "motion_mark_canvas_fill_shapes": {
-      "avg": 143.318,
-      "ci_095": 31.915
+      "ci_095": 74.393,
+      "avg": 240.943
     },
     "css_value_type_shadow": {
-      "avg": 229.602,
-      "ci_095": 32.759
+      "ci_095": 33.919,
+      "avg": 382.617
     },
     "animometer_webgl_attrib_arrays": {
-      "avg": 412.827,
-      "ci_095": 110.526
+      "ci_095": 122.988,
+      "avg": 412.67
     },
     "canvas_05000_pixels_per_second": {
-      "avg": 16.857,
-      "ci_095": 0.609
+      "ci_095": 0.4,
+      "avg": 16.77
     },
     "bouncing_clipped_rectangles": {
-      "avg": 396.708,
-      "ci_095": 106.785
+      "ci_095": 85.547,
+      "avg": 394.492
     },
     "ie_chalkboard": {
-      "avg": 1429.4,
-      "ci_095": 1327.254
+      "ci_095": 1283.402,
+      "avg": 1382.753
     },
     "new_tilings": {
-      "avg": 16.793,
-      "ci_095": 0.388
+      "ci_095": 1.657,
+      "avg": 22.073
     },
     "extra_large_texture_uploads": {
-      "avg": 191.029,
-      "ci_095": 22.701
+      "ci_095": 48.798,
+      "avg": 352.437
     },
     "web_animation_value_type_transform_simple": {
-      "avg": 308.001,
-      "ci_095": 54.104
+      "ci_095": 51.563,
+      "avg": 484.022
     },
     "css_value_type_filter": {
-      "avg": 581.157,
-      "ci_095": 145.986
+      "ci_095": 167.231,
+      "avg": 575.907
     }
   }
 }
\ No newline at end of file
diff --git a/testing/scripts/run_android_wpt.py b/testing/scripts/run_android_wpt.py
index 468cfb8..2103247 100755
--- a/testing/scripts/run_android_wpt.py
+++ b/testing/scripts/run_android_wpt.py
@@ -74,13 +74,18 @@
   def __call__(self, parser, namespace, values, option_string=None):
     if option_string:
       if self.nargs == 0:
-        self.pass_through_args.append(option_string)
+        self.add_unique_pass_through_arg(option_string)
       elif self.nargs is None:
-        self.pass_through_args.append('{}={}'.format(option_string, values))
+        self.add_unique_pass_through_arg('{}={}'.format(option_string, values))
       else:
         raise ValueError("nargs {} not supported: {} {}".format(
             self.nargs, option_string, values))
 
+  @classmethod
+  def add_unique_pass_through_arg(cls, arg):
+    if arg not in cls.pass_through_args:
+      cls.pass_through_args.append(arg)
+
 
 class WPTAndroidAdapter(common.BaseIsolatedScriptArgsAdapter):
   def __init__(self):
@@ -133,6 +138,14 @@
     else:
       rest_args.extend(['--package-name', self.options.package_name])
 
+    if self.options.verbose >= 3:
+      rest_args.extend(["--log-mach=-", "--log-mach-level=debug",
+                        "--log-mach-verbose"])
+
+    if self.options.verbose >= 4:
+      rest_args.extend(['--webdriver-arg=--verbose',
+                        '--webdriver-arg="--log-path=-"'])
+
     rest_args.extend(self.pass_through_wpt_args)
 
     return rest_args
@@ -171,6 +184,8 @@
     parser.add_argument('--list-tests', action=WPTPassThroughArgs, nargs=0,
                         help="Don't run any tests, just print out a list of"
                         ' tests that would be run.')
+    parser.add_argument('--webdriver-arg', action=WPTPassThroughArgs,
+                        help='WebDriver args.')
     parser.add_argument('--log-wptreport', metavar='WPT_REPORT_FILE',
                         action=WPTPassThroughArgs,
                         help="Log wptreport with subtest details.")
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 085068e..b7660e3 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -2900,7 +2900,7 @@
             ]
         }
     ],
-    "HTTPReallyBadFinal": [
+    "HTTPDangerWarning": [
         {
             "platforms": [
                 "android",
@@ -2914,7 +2914,7 @@
                 {
                     "name": "enabled",
                     "params": {
-                        "treatment": "dangerous"
+                        "treatment": "danger-warning"
                     },
                     "enable_features": [
                         "MarkHttpAs"
diff --git a/third_party/blink/public/mojom/frame/frame.mojom b/third_party/blink/public/mojom/frame/frame.mojom
index c849ba0..08bb9a5 100644
--- a/third_party/blink/public/mojom/frame/frame.mojom
+++ b/third_party/blink/public/mojom/frame/frame.mojom
@@ -143,6 +143,10 @@
   // collapsed, it will be removed from the layout tree of its parent
   // frame's document.
   Collapse(bool collapsed);
+
+  // Used to instruct the frame to go into "view source" mode. This should
+  // only be sent to the main frame.
+  EnableViewSourceMode();
 };
 
 // Implemented in Browser, this interface defines frame-specific methods that will
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom
index 79b74864e..a22e552 100644
--- a/third_party/blink/public/mojom/web_feature/web_feature.mojom
+++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -2485,6 +2485,7 @@
   kMessageEventSharedArrayBufferSameOrigin = 3104,
   kMessageEventSharedArrayBufferSameAgentCluster = 3105,
   kMessageEventSharedArrayBufferDifferentAgentCluster = 3106,
+  kCacheStorageCodeCacheHint = 3107,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
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 31d6ec3..8412dc5 100644
--- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -695,7 +695,7 @@
 
     if (style.Display() == EDisplay::kContents &&
         (is_svg_root ||
-         (!IsSVGSVGElement(element) && !IsSVGGElement(element) &&
+         (!IsSVGSVGElement(element) && !IsA<SVGGElement>(element) &&
           !IsSVGUseElement(element) && !IsSVGTSpanElement(element)))) {
       // According to the CSS Display spec[1], nested <svg> elements, <g>,
       // <use>, and <tspan> elements are not rendered and their children are
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 11115274..38c82eb 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -2160,7 +2160,7 @@
       title_element_ = MakeGarbageCollected<SVGTitleElement>(*this);
       element->InsertBefore(title_element_.Get(), element->firstChild());
     }
-    if (auto* svg_title = ToSVGTitleElementOrNull(title_element_.Get()))
+    if (auto* svg_title = DynamicTo<SVGTitleElement>(title_element_.Get()))
       svg_title->SetText(title);
   } else if (element && element->IsHTMLElement()) {
     if (!title_element_) {
@@ -2189,7 +2189,7 @@
 
     // If the root element isn't an svg element in the SVG namespace and the
     // title element is in the SVG namespace, it is ignored.
-    if (IsSVGTitleElement(title_element_)) {
+    if (IsA<SVGTitleElement>(*title_element_)) {
       title_element_ = nullptr;
       return;
     }
@@ -2197,7 +2197,7 @@
 
   if (auto* html_title = DynamicTo<HTMLTitleElement>(title_element_.Get()))
     UpdateTitle(html_title->text());
-  else if (auto* svg_title = ToSVGTitleElementOrNull(title_element_.Get()))
+  else if (auto* svg_title = DynamicTo<SVGTitleElement>(title_element_.Get()))
     UpdateTitle(svg_title->textContent());
 }
 
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index 1fb6d18..bd234383 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -1855,6 +1855,11 @@
   To<HTMLFrameOwnerElement>(owner)->SetCollapsed(collapsed);
 }
 
+void LocalFrame::EnableViewSourceMode() {
+  DCHECK(!Tree().Parent());
+  SetInViewSourceMode(true);
+}
+
 void LocalFrame::BindToReceiver(
     blink::LocalFrame* frame,
     mojo::PendingAssociatedReceiver<mojom::blink::LocalFrame> receiver) {
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h
index 81d240e..bea3fe0 100644
--- a/third_party/blink/renderer/core/frame/local_frame.h
+++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -463,6 +463,8 @@
                            bool discard_duplicates) final;
   void Collapse(bool collapsed) final;
 
+  void EnableViewSourceMode() final;
+
  private:
   friend class FrameNavigationDisabler;
 
diff --git a/third_party/blink/renderer/core/inspector/BUILD.gn b/third_party/blink/renderer/core/inspector/BUILD.gn
index 2a61c518..8ca55e9 100644
--- a/third_party/blink/renderer/core/inspector/BUILD.gn
+++ b/third_party/blink/renderer/core/inspector/BUILD.gn
@@ -188,7 +188,7 @@
   ]
 
   deps = [
-    ":protocol_version",
+    "//third_party/blink/public/devtools_protocol:protocol_version",
   ]
 }
 
@@ -221,18 +221,3 @@
     "//third_party/inspector_protocol:crdtp",
   ]
 }
-
-# TODO(caseq): remove once devtools-frontend is updated to use the
-# correct location.
-copy("protocol_version") {
-  sources = [
-    "$root_gen_dir/third_party/blink/public/devtools_protocol/protocol.json",
-  ]
-  output_file = "$blink_core_output_dir/inspector/protocol.json"
-  outputs = [
-    output_file,
-  ]
-  deps = [
-    "//third_party/blink/public/devtools_protocol:protocol_version",
-  ]
-}
diff --git a/third_party/blink/renderer/core/inspector/browser_protocol.pdl b/third_party/blink/renderer/core/inspector/browser_protocol.pdl
deleted file mode 100644
index 3228ff45..0000000
--- a/third_party/blink/renderer/core/inspector/browser_protocol.pdl
+++ /dev/null
@@ -1,7539 +0,0 @@
-# Copyright 2017 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.
-#
-# Contributing to Chrome DevTools Protocol: https://docs.google.com/document/d/1c-COD2kaK__5iMM5SEx-PzNA7HFmgttcYfOHHX0HaOM/edit?usp=sharing
-
-version
-  major 1
-  minor 3
-
-experimental domain Accessibility
-  depends on DOM
-
-  # Unique accessibility node identifier.
-  type AXNodeId extends string
-
-  # Enum of possible property types.
-  type AXValueType extends string
-    enum
-      boolean
-      tristate
-      booleanOrUndefined
-      idref
-      idrefList
-      integer
-      node
-      nodeList
-      number
-      string
-      computedString
-      token
-      tokenList
-      domRelation
-      role
-      internalRole
-      valueUndefined
-
-  # Enum of possible property sources.
-  type AXValueSourceType extends string
-    enum
-      attribute
-      implicit
-      style
-      contents
-      placeholder
-      relatedElement
-
-  # Enum of possible native property sources (as a subtype of a particular AXValueSourceType).
-  type AXValueNativeSourceType extends string
-    enum
-      figcaption
-      label
-      labelfor
-      labelwrapped
-      legend
-      tablecaption
-      title
-      other
-
-  # A single source for a computed AX property.
-  type AXValueSource extends object
-    properties
-      # What type of source this is.
-      AXValueSourceType type
-      # The value of this property source.
-      optional AXValue value
-      # The name of the relevant attribute, if any.
-      optional string attribute
-      # The value of the relevant attribute, if any.
-      optional AXValue attributeValue
-      # Whether this source is superseded by a higher priority source.
-      optional boolean superseded
-      # The native markup source for this value, e.g. a <label> element.
-      optional AXValueNativeSourceType nativeSource
-      # The value, such as a node or node list, of the native source.
-      optional AXValue nativeSourceValue
-      # Whether the value for this property is invalid.
-      optional boolean invalid
-      # Reason for the value being invalid, if it is.
-      optional string invalidReason
-
-  type AXRelatedNode extends object
-    properties
-      # The BackendNodeId of the related DOM node.
-      DOM.BackendNodeId backendDOMNodeId
-      # The IDRef value provided, if any.
-      optional string idref
-      # The text alternative of this node in the current context.
-      optional string text
-
-  type AXProperty extends object
-    properties
-      # The name of this property.
-      AXPropertyName name
-      # The value of this property.
-      AXValue value
-
-  # A single computed AX property.
-  type AXValue extends object
-    properties
-      # The type of this value.
-      AXValueType type
-      # The computed value of this property.
-      optional any value
-      # One or more related nodes, if applicable.
-      optional array of AXRelatedNode relatedNodes
-      # The sources which contributed to the computation of this property.
-      optional array of AXValueSource sources
-
-  # Values of AXProperty name:
-  # - from 'busy' to 'roledescription': states which apply to every AX node
-  # - from 'live' to 'root': attributes which apply to nodes in live regions
-  # - from 'autocomplete' to 'valuetext': attributes which apply to widgets
-  # - from 'checked' to 'selected': states which apply to widgets
-  # - from 'activedescendant' to 'owns' - relationships between elements other than parent/child/sibling.
-  type AXPropertyName extends string
-    enum
-      busy
-      disabled
-      editable
-      focusable
-      focused
-      hidden
-      hiddenRoot
-      invalid
-      keyshortcuts
-      settable
-      roledescription
-      live
-      atomic
-      relevant
-      root
-      autocomplete
-      hasPopup
-      level
-      multiselectable
-      orientation
-      multiline
-      readonly
-      required
-      valuemin
-      valuemax
-      valuetext
-      checked
-      expanded
-      modal
-      pressed
-      selected
-      activedescendant
-      controls
-      describedby
-      details
-      errormessage
-      flowto
-      labelledby
-      owns
-
-  # A node in the accessibility tree.
-  type AXNode extends object
-    properties
-      # Unique identifier for this node.
-      AXNodeId nodeId
-      # Whether this node is ignored for accessibility
-      boolean ignored
-      # Collection of reasons why this node is hidden.
-      optional array of AXProperty ignoredReasons
-      # This `Node`'s role, whether explicit or implicit.
-      optional AXValue role
-      # The accessible name for this `Node`.
-      optional AXValue name
-      # The accessible description for this `Node`.
-      optional AXValue description
-      # The value for this `Node`.
-      optional AXValue value
-      # All other properties
-      optional array of AXProperty properties
-      # IDs for each of this node's child nodes.
-      optional array of AXNodeId childIds
-      # The backend ID for the associated DOM node, if any.
-      optional DOM.BackendNodeId backendDOMNodeId
-
-  # Disables the accessibility domain.
-  command disable
-
-  # Enables the accessibility domain which causes `AXNodeId`s to remain consistent between method calls.
-  # This turns on accessibility for the page, which can impact performance until accessibility is disabled.
-  command enable
-
-  # Fetches the accessibility node and partial accessibility tree for this DOM node, if it exists.
-  experimental command getPartialAXTree
-    parameters
-      # Identifier of the node to get the partial accessibility tree for.
-      optional DOM.NodeId nodeId
-      # Identifier of the backend node to get the partial accessibility tree for.
-      optional DOM.BackendNodeId backendNodeId
-      # JavaScript object id of the node wrapper to get the partial accessibility tree for.
-      optional Runtime.RemoteObjectId objectId
-      # Whether to fetch this nodes ancestors, siblings and children. Defaults to true.
-      optional boolean fetchRelatives
-    returns
-      # The `Accessibility.AXNode` for this DOM node, if it exists, plus its ancestors, siblings and
-      # children, if requested.
-      array of AXNode nodes
-
-  # Fetches the entire accessibility tree
-  experimental command getFullAXTree
-    returns
-      array of AXNode nodes
-
-experimental domain Animation
-  depends on Runtime
-  depends on DOM
-
-  # Animation instance.
-  type Animation extends object
-    properties
-      # `Animation`'s id.
-      string id
-      # `Animation`'s name.
-      string name
-      # `Animation`'s internal paused state.
-      boolean pausedState
-      # `Animation`'s play state.
-      string playState
-      # `Animation`'s playback rate.
-      number playbackRate
-      # `Animation`'s start time.
-      number startTime
-      # `Animation`'s current time.
-      number currentTime
-      # Animation type of `Animation`.
-      enum type
-        CSSTransition
-        CSSAnimation
-        WebAnimation
-      # `Animation`'s source animation node.
-      optional AnimationEffect source
-      # A unique ID for `Animation` representing the sources that triggered this CSS
-      # animation/transition.
-      optional string cssId
-
-  # AnimationEffect instance
-  type AnimationEffect extends object
-    properties
-      # `AnimationEffect`'s delay.
-      number delay
-      # `AnimationEffect`'s end delay.
-      number endDelay
-      # `AnimationEffect`'s iteration start.
-      number iterationStart
-      # `AnimationEffect`'s iterations.
-      number iterations
-      # `AnimationEffect`'s iteration duration.
-      number duration
-      # `AnimationEffect`'s playback direction.
-      string direction
-      # `AnimationEffect`'s fill mode.
-      string fill
-      # `AnimationEffect`'s target node.
-      optional DOM.BackendNodeId backendNodeId
-      # `AnimationEffect`'s keyframes.
-      optional KeyframesRule keyframesRule
-      # `AnimationEffect`'s timing function.
-      string easing
-
-  # Keyframes Rule
-  type KeyframesRule extends object
-    properties
-      # CSS keyframed animation's name.
-      optional string name
-      # List of animation keyframes.
-      array of KeyframeStyle keyframes
-
-  # Keyframe Style
-  type KeyframeStyle extends object
-    properties
-      # Keyframe's time offset.
-      string offset
-      # `AnimationEffect`'s timing function.
-      string easing
-
-  # Disables animation domain notifications.
-  command disable
-
-  # Enables animation domain notifications.
-  command enable
-
-  # Returns the current time of the an animation.
-  command getCurrentTime
-    parameters
-      # Id of animation.
-      string id
-    returns
-      # Current time of the page.
-      number currentTime
-
-  # Gets the playback rate of the document timeline.
-  command getPlaybackRate
-    returns
-      # Playback rate for animations on page.
-      number playbackRate
-
-  # Releases a set of animations to no longer be manipulated.
-  command releaseAnimations
-    parameters
-      # List of animation ids to seek.
-      array of string animations
-
-  # Gets the remote object of the Animation.
-  command resolveAnimation
-    parameters
-      # Animation id.
-      string animationId
-    returns
-      # Corresponding remote object.
-      Runtime.RemoteObject remoteObject
-
-  # Seek a set of animations to a particular time within each animation.
-  command seekAnimations
-    parameters
-      # List of animation ids to seek.
-      array of string animations
-      # Set the current time of each animation.
-      number currentTime
-
-  # Sets the paused state of a set of animations.
-  command setPaused
-    parameters
-      # Animations to set the pause state of.
-      array of string animations
-      # Paused state to set to.
-      boolean paused
-
-  # Sets the playback rate of the document timeline.
-  command setPlaybackRate
-    parameters
-      # Playback rate for animations on page
-      number playbackRate
-
-  # Sets the timing of an animation node.
-  command setTiming
-    parameters
-      # Animation id.
-      string animationId
-      # Duration of the animation.
-      number duration
-      # Delay of the animation.
-      number delay
-
-  # Event for when an animation has been cancelled.
-  event animationCanceled
-    parameters
-      # Id of the animation that was cancelled.
-      string id
-
-  # Event for each animation that has been created.
-  event animationCreated
-    parameters
-      # Id of the animation that was created.
-      string id
-
-  # Event for animation that has been started.
-  event animationStarted
-    parameters
-      # Animation that was started.
-      Animation animation
-
-experimental domain ApplicationCache
-
-  # Detailed application cache resource information.
-  type ApplicationCacheResource extends object
-    properties
-      # Resource url.
-      string url
-      # Resource size.
-      integer size
-      # Resource type.
-      string type
-
-  # Detailed application cache information.
-  type ApplicationCache extends object
-    properties
-      # Manifest URL.
-      string manifestURL
-      # Application cache size.
-      number size
-      # Application cache creation time.
-      number creationTime
-      # Application cache update time.
-      number updateTime
-      # Application cache resources.
-      array of ApplicationCacheResource resources
-
-  # Frame identifier - manifest URL pair.
-  type FrameWithManifest extends object
-    properties
-      # Frame identifier.
-      Page.FrameId frameId
-      # Manifest URL.
-      string manifestURL
-      # Application cache status.
-      integer status
-
-  # Enables application cache domain notifications.
-  command enable
-
-  # Returns relevant application cache data for the document in given frame.
-  command getApplicationCacheForFrame
-    parameters
-      # Identifier of the frame containing document whose application cache is retrieved.
-      Page.FrameId frameId
-    returns
-      # Relevant application cache data for the document in given frame.
-      ApplicationCache applicationCache
-
-  # Returns array of frame identifiers with manifest urls for each frame containing a document
-  # associated with some application cache.
-  command getFramesWithManifests
-    returns
-      # Array of frame identifiers with manifest urls for each frame containing a document
-      # associated with some application cache.
-      array of FrameWithManifest frameIds
-
-  # Returns manifest URL for document in the given frame.
-  command getManifestForFrame
-    parameters
-      # Identifier of the frame containing document whose manifest is retrieved.
-      Page.FrameId frameId
-    returns
-      # Manifest URL for document in the given frame.
-      string manifestURL
-
-  event applicationCacheStatusUpdated
-    parameters
-      # Identifier of the frame containing document whose application cache updated status.
-      Page.FrameId frameId
-      # Manifest URL.
-      string manifestURL
-      # Updated application cache status.
-      integer status
-
-  event networkStateUpdated
-    parameters
-      boolean isNowOnline
-
-# Audits domain allows investigation of page violations and possible improvements.
-experimental domain Audits
-  depends on Network
-
-  # Returns the response body and size if it were re-encoded with the specified settings. Only
-  # applies to images.
-  command getEncodedResponse
-    parameters
-      # Identifier of the network request to get content for.
-      Network.RequestId requestId
-      # The encoding to use.
-      enum encoding
-        webp
-        jpeg
-        png
-      # The quality of the encoding (0-1). (defaults to 1)
-      optional number quality
-      # Whether to only return the size information (defaults to false).
-      optional boolean sizeOnly
-    returns
-      # The encoded body as a base64 string. Omitted if sizeOnly is true.
-      optional binary body
-      # Size before re-encoding.
-      integer originalSize
-      # Size after re-encoding.
-      integer encodedSize
-
-# Defines events for background web platform features.
-experimental domain BackgroundService
-  # The Background Service that will be associated with the commands/events.
-  # Every Background Service operates independently, but they share the same
-  # API.
-  type ServiceName extends string
-    enum
-      backgroundFetch
-      backgroundSync
-      pushMessaging
-      notifications
-      paymentHandler
-      periodicBackgroundSync
-
-  # Enables event updates for the service.
-  command startObserving
-    parameters
-      ServiceName service
-
-  # Disables event updates for the service.
-  command stopObserving
-    parameters
-      ServiceName service
-
-  # Set the recording state for the service.
-  command setRecording
-    parameters
-      boolean shouldRecord
-      ServiceName service
-
-  # Clears all stored data for the service.
-  command clearEvents
-    parameters
-      ServiceName service
-
-  # Called when the recording state for the service has been updated.
-  event recordingStateChanged
-    parameters
-      boolean isRecording
-      ServiceName service
-
-  # A key-value pair for additional event information to pass along.
-  type EventMetadata extends object
-    properties
-      string key
-      string value
-
-  type BackgroundServiceEvent extends object
-    properties
-      # Timestamp of the event (in seconds).
-      Network.TimeSinceEpoch timestamp
-      # The origin this event belongs to.
-      string origin
-      # The Service Worker ID that initiated the event.
-      ServiceWorker.RegistrationID serviceWorkerRegistrationId
-      # The Background Service this event belongs to.
-      ServiceName service
-      # A description of the event.
-      string eventName
-      # An identifier that groups related events together.
-      string instanceId
-      # A list of event-specific information.
-      array of EventMetadata eventMetadata
-
-  # Called with all existing backgroundServiceEvents when enabled, and all new
-  # events afterwards if enabled and recording.
-  event backgroundServiceEventReceived
-    parameters
-      BackgroundServiceEvent backgroundServiceEvent
-
-# The Browser domain defines methods and events for browser managing.
-domain Browser
-  experimental type BrowserContextID extends string
-  experimental type WindowID extends integer
-
-  # The state of the browser window.
-  experimental type WindowState extends string
-    enum
-      normal
-      minimized
-      maximized
-      fullscreen
-
-  # Browser window bounds information
-  experimental type Bounds extends object
-    properties
-      # The offset from the left edge of the screen to the window in pixels.
-      optional integer left
-      # The offset from the top edge of the screen to the window in pixels.
-      optional integer top
-      # The window width in pixels.
-      optional integer width
-      # The window height in pixels.
-      optional integer height
-      # The window state. Default to normal.
-      optional WindowState windowState
-
-  experimental type PermissionType extends string
-    enum
-      accessibilityEvents
-      audioCapture
-      backgroundSync
-      backgroundFetch
-      clipboardRead
-      clipboardWrite
-      durableStorage
-      flash
-      geolocation
-      midi
-      midiSysex
-      nfc
-      notifications
-      paymentHandler
-      periodicBackgroundSync
-      protectedMediaIdentifier
-      sensors
-      videoCapture
-      idleDetection
-      wakeLockScreen
-      wakeLockSystem
-
-  experimental type PermissionSetting extends string
-    enum
-      granted
-      denied
-      prompt
-
-  # Definition of PermissionDescriptor defined in the Permissions API:
-  # https://w3c.github.io/permissions/#dictdef-permissiondescriptor.
-  experimental type PermissionDescriptor extends object
-    properties
-      # Name of permission.
-      # See https://cs.chromium.org/chromium/src/third_party/blink/renderer/modules/permissions/permission_descriptor.idl for valid permission names.
-      string name
-      # For "midi" permission, may also specify sysex control.
-      optional boolean sysex
-      # For "push" permission, may specify userVisibleOnly.
-      # Note that userVisibleOnly = true is the only currently supported type.
-      optional boolean userVisibleOnly
-      # For "wake-lock" permission, must specify type as either "screen" or "system".
-      optional string type
-
-  # Set permission settings for given origin.
-  experimental command setPermission
-    parameters
-      # Origin the permission applies to.
-      string origin
-      # Descriptor of permission to override.
-      PermissionDescriptor permission
-      # Setting of the permission.
-      PermissionSetting setting
-      # Context to override. When omitted, default browser context is used.
-      optional BrowserContextID browserContextId
-
-  # Grant specific permissions to the given origin and reject all others.
-  experimental command grantPermissions
-    parameters
-      string origin
-      array of PermissionType permissions
-      # BrowserContext to override permissions. When omitted, default browser context is used.
-      optional BrowserContextID browserContextId
-
-  # Reset all permission management for all origins.
-  experimental command resetPermissions
-    parameters
-      # BrowserContext to reset permissions. When omitted, default browser context is used.
-      optional BrowserContextID browserContextId
-
-
-  # Close browser gracefully.
-  command close
-
-  # Crashes browser on the main thread.
-  experimental command crash
-
-  # Crashes GPU process.
-  experimental command crashGpuProcess
-
-  # Returns version information.
-  command getVersion
-    returns
-      # Protocol version.
-      string protocolVersion
-      # Product name.
-      string product
-      # Product revision.
-      string revision
-      # User-Agent.
-      string userAgent
-      # V8 version.
-      string jsVersion
-
-  # Returns the command line switches for the browser process if, and only if
-  # --enable-automation is on the commandline.
-  experimental command getBrowserCommandLine
-    returns
-      # Commandline parameters
-      array of string arguments
-
-  # Chrome histogram bucket.
-  experimental type Bucket extends object
-    properties
-      # Minimum value (inclusive).
-      integer low
-      # Maximum value (exclusive).
-      integer high
-      # Number of samples.
-      integer count
-
-  # Chrome histogram.
-  experimental type Histogram extends object
-    properties
-      # Name.
-      string name
-      # Sum of sample values.
-      integer sum
-      # Total number of samples.
-      integer count
-      # Buckets.
-      array of Bucket buckets
-
-  # Get Chrome histograms.
-  experimental command getHistograms
-    parameters
-      # Requested substring in name. Only histograms which have query as a
-      # substring in their name are extracted. An empty or absent query returns
-      # all histograms.
-      optional string query
-      # If true, retrieve delta since last call.
-      optional boolean delta
-
-    returns
-      # Histograms.
-      array of Histogram histograms
-
-  # Get a Chrome histogram by name.
-  experimental command getHistogram
-    parameters
-      # Requested histogram name.
-      string name
-      # If true, retrieve delta since last call.
-      optional boolean delta
-    returns
-      # Histogram.
-      Histogram histogram
-
-  # Get position and size of the browser window.
-  experimental command getWindowBounds
-    parameters
-      # Browser window id.
-      WindowID windowId
-    returns
-      # Bounds information of the window. When window state is 'minimized', the restored window
-      # position and size are returned.
-      Bounds bounds
-
-  # Get the browser window that contains the devtools target.
-  experimental command getWindowForTarget
-    parameters
-      # Devtools agent host id. If called as a part of the session, associated targetId is used.
-      optional Target.TargetID targetId
-    returns
-      # Browser window id.
-      WindowID windowId
-      # Bounds information of the window. When window state is 'minimized', the restored window
-      # position and size are returned.
-      Bounds bounds
-
-  # Set position and/or size of the browser window.
-  experimental command setWindowBounds
-    parameters
-      # Browser window id.
-      WindowID windowId
-      # New window bounds. The 'minimized', 'maximized' and 'fullscreen' states cannot be combined
-      # with 'left', 'top', 'width' or 'height'. Leaves unspecified fields unchanged.
-      Bounds bounds
-
-  # Set dock tile details, platform-specific.
-  experimental command setDockTile
-    parameters
-      optional string badgeLabel
-      # Png encoded image.
-      optional binary image
-
-# This domain exposes CSS read/write operations. All CSS objects (stylesheets, rules, and styles)
-# have an associated `id` used in subsequent operations on the related object. Each object type has
-# a specific `id` structure, and those are not interchangeable between objects of different kinds.
-# CSS objects can be loaded using the `get*ForNode()` calls (which accept a DOM node id). A client
-# can also keep track of stylesheets via the `styleSheetAdded`/`styleSheetRemoved` events and
-# subsequently load the required stylesheet contents using the `getStyleSheet[Text]()` methods.
-experimental domain CSS
-  depends on DOM
-
-  type StyleSheetId extends string
-
-  # Stylesheet type: "injected" for stylesheets injected via extension, "user-agent" for user-agent
-  # stylesheets, "inspector" for stylesheets created by the inspector (i.e. those holding the "via
-  # inspector" rules), "regular" for regular stylesheets.
-  type StyleSheetOrigin extends string
-    enum
-      injected
-      user-agent
-      inspector
-      regular
-
-  # CSS rule collection for a single pseudo style.
-  type PseudoElementMatches extends object
-    properties
-      # Pseudo element type.
-      DOM.PseudoType pseudoType
-      # Matches of CSS rules applicable to the pseudo style.
-      array of RuleMatch matches
-
-  # Inherited CSS rule collection from ancestor node.
-  type InheritedStyleEntry extends object
-    properties
-      # The ancestor node's inline style, if any, in the style inheritance chain.
-      optional CSSStyle inlineStyle
-      # Matches of CSS rules matching the ancestor node in the style inheritance chain.
-      array of RuleMatch matchedCSSRules
-
-  # Match data for a CSS rule.
-  type RuleMatch extends object
-    properties
-      # CSS rule in the match.
-      CSSRule rule
-      # Matching selector indices in the rule's selectorList selectors (0-based).
-      array of integer matchingSelectors
-
-  # Data for a simple selector (these are delimited by commas in a selector list).
-  type Value extends object
-    properties
-      # Value text.
-      string text
-      # Value range in the underlying resource (if available).
-      optional SourceRange range
-
-  # Selector list data.
-  type SelectorList extends object
-    properties
-      # Selectors in the list.
-      array of Value selectors
-      # Rule selector text.
-      string text
-
-  # CSS stylesheet metainformation.
-  type CSSStyleSheetHeader extends object
-    properties
-      # The stylesheet identifier.
-      StyleSheetId styleSheetId
-      # Owner frame identifier.
-      Page.FrameId frameId
-      # Stylesheet resource URL.
-      string sourceURL
-      # URL of source map associated with the stylesheet (if any).
-      optional string sourceMapURL
-      # Stylesheet origin.
-      StyleSheetOrigin origin
-      # Stylesheet title.
-      string title
-      # The backend id for the owner node of the stylesheet.
-      optional DOM.BackendNodeId ownerNode
-      # Denotes whether the stylesheet is disabled.
-      boolean disabled
-      # Whether the sourceURL field value comes from the sourceURL comment.
-      optional boolean hasSourceURL
-      # Whether this stylesheet is created for STYLE tag by parser. This flag is not set for
-      # document.written STYLE tags.
-      boolean isInline
-      # Line offset of the stylesheet within the resource (zero based).
-      number startLine
-      # Column offset of the stylesheet within the resource (zero based).
-      number startColumn
-      # Size of the content (in characters).
-      number length
-      # Line offset of the end of the stylesheet within the resource (zero based).
-      number endLine
-      # Column offset of the end of the stylesheet within the resource (zero based).
-      number endColumn
-
-  # CSS rule representation.
-  type CSSRule extends object
-    properties
-      # The css style sheet identifier (absent for user agent stylesheet and user-specified
-      # stylesheet rules) this rule came from.
-      optional StyleSheetId styleSheetId
-      # Rule selector data.
-      SelectorList selectorList
-      # Parent stylesheet's origin.
-      StyleSheetOrigin origin
-      # Associated style declaration.
-      CSSStyle style
-      # Media list array (for rules involving media queries). The array enumerates media queries
-      # starting with the innermost one, going outwards.
-      optional array of CSSMedia media
-
-  # CSS coverage information.
-  type RuleUsage extends object
-    properties
-      # The css style sheet identifier (absent for user agent stylesheet and user-specified
-      # stylesheet rules) this rule came from.
-      StyleSheetId styleSheetId
-      # Offset of the start of the rule (including selector) from the beginning of the stylesheet.
-      number startOffset
-      # Offset of the end of the rule body from the beginning of the stylesheet.
-      number endOffset
-      # Indicates whether the rule was actually used by some element in the page.
-      boolean used
-
-  # Text range within a resource. All numbers are zero-based.
-  type SourceRange extends object
-    properties
-      # Start line of range.
-      integer startLine
-      # Start column of range (inclusive).
-      integer startColumn
-      # End line of range
-      integer endLine
-      # End column of range (exclusive).
-      integer endColumn
-
-  type ShorthandEntry extends object
-    properties
-      # Shorthand name.
-      string name
-      # Shorthand value.
-      string value
-      # Whether the property has "!important" annotation (implies `false` if absent).
-      optional boolean important
-
-  type CSSComputedStyleProperty extends object
-    properties
-      # Computed style property name.
-      string name
-      # Computed style property value.
-      string value
-
-  # CSS style representation.
-  type CSSStyle extends object
-    properties
-      # The css style sheet identifier (absent for user agent stylesheet and user-specified
-      # stylesheet rules) this rule came from.
-      optional StyleSheetId styleSheetId
-      # CSS properties in the style.
-      array of CSSProperty cssProperties
-      # Computed values for all shorthands found in the style.
-      array of ShorthandEntry shorthandEntries
-      # Style declaration text (if available).
-      optional string cssText
-      # Style declaration range in the enclosing stylesheet (if available).
-      optional SourceRange range
-
-  # CSS property declaration data.
-  type CSSProperty extends object
-    properties
-      # The property name.
-      string name
-      # The property value.
-      string value
-      # Whether the property has "!important" annotation (implies `false` if absent).
-      optional boolean important
-      # Whether the property is implicit (implies `false` if absent).
-      optional boolean implicit
-      # The full property text as specified in the style.
-      optional string text
-      # Whether the property is understood by the browser (implies `true` if absent).
-      optional boolean parsedOk
-      # Whether the property is disabled by the user (present for source-based properties only).
-      optional boolean disabled
-      # The entire property range in the enclosing style declaration (if available).
-      optional SourceRange range
-
-  # CSS media rule descriptor.
-  type CSSMedia extends object
-    properties
-      # Media query text.
-      string text
-      # Source of the media query: "mediaRule" if specified by a @media rule, "importRule" if
-      # specified by an @import rule, "linkedSheet" if specified by a "media" attribute in a linked
-      # stylesheet's LINK tag, "inlineSheet" if specified by a "media" attribute in an inline
-      # stylesheet's STYLE tag.
-      enum source
-        mediaRule
-        importRule
-        linkedSheet
-        inlineSheet
-      # URL of the document containing the media query description.
-      optional string sourceURL
-      # The associated rule (@media or @import) header range in the enclosing stylesheet (if
-      # available).
-      optional SourceRange range
-      # Identifier of the stylesheet containing this object (if exists).
-      optional StyleSheetId styleSheetId
-      # Array of media queries.
-      optional array of MediaQuery mediaList
-
-  # Media query descriptor.
-  type MediaQuery extends object
-    properties
-      # Array of media query expressions.
-      array of MediaQueryExpression expressions
-      # Whether the media query condition is satisfied.
-      boolean active
-
-  # Media query expression descriptor.
-  type MediaQueryExpression extends object
-    properties
-      # Media query expression value.
-      number value
-      # Media query expression units.
-      string unit
-      # Media query expression feature.
-      string feature
-      # The associated range of the value text in the enclosing stylesheet (if available).
-      optional SourceRange valueRange
-      # Computed length of media query expression (if applicable).
-      optional number computedLength
-
-  # Information about amount of glyphs that were rendered with given font.
-  type PlatformFontUsage extends object
-    properties
-      # Font's family name reported by platform.
-      string familyName
-      # Indicates if the font was downloaded or resolved locally.
-      boolean isCustomFont
-      # Amount of glyphs that were rendered with this font.
-      number glyphCount
-
-  # Properties of a web font: https://www.w3.org/TR/2008/REC-CSS2-20080411/fonts.html#font-descriptions
-  type FontFace extends object
-    properties
-      # The font-family.
-      string fontFamily
-      # The font-style.
-      string fontStyle
-      # The font-variant.
-      string fontVariant
-      # The font-weight.
-      string fontWeight
-      # The font-stretch.
-      string fontStretch
-      # The unicode-range.
-      string unicodeRange
-      # The src.
-      string src
-      # The resolved platform font family
-      string platformFontFamily
-
-  # CSS keyframes rule representation.
-  type CSSKeyframesRule extends object
-    properties
-      # Animation name.
-      Value animationName
-      # List of keyframes.
-      array of CSSKeyframeRule keyframes
-
-  # CSS keyframe rule representation.
-  type CSSKeyframeRule extends object
-    properties
-      # The css style sheet identifier (absent for user agent stylesheet and user-specified
-      # stylesheet rules) this rule came from.
-      optional StyleSheetId styleSheetId
-      # Parent stylesheet's origin.
-      StyleSheetOrigin origin
-      # Associated key text.
-      Value keyText
-      # Associated style declaration.
-      CSSStyle style
-
-  # A descriptor of operation to mutate style declaration text.
-  type StyleDeclarationEdit extends object
-    properties
-      # The css style sheet identifier.
-      StyleSheetId styleSheetId
-      # The range of the style text in the enclosing stylesheet.
-      SourceRange range
-      # New style text.
-      string text
-
-  # Inserts a new rule with the given `ruleText` in a stylesheet with given `styleSheetId`, at the
-  # position specified by `location`.
-  command addRule
-    parameters
-      # The css style sheet identifier where a new rule should be inserted.
-      StyleSheetId styleSheetId
-      # The text of a new rule.
-      string ruleText
-      # Text position of a new rule in the target style sheet.
-      SourceRange location
-    returns
-      # The newly created rule.
-      CSSRule rule
-
-  # Returns all class names from specified stylesheet.
-  command collectClassNames
-    parameters
-      StyleSheetId styleSheetId
-    returns
-      # Class name list.
-      array of string classNames
-
-  # Creates a new special "via-inspector" stylesheet in the frame with given `frameId`.
-  command createStyleSheet
-    parameters
-      # Identifier of the frame where "via-inspector" stylesheet should be created.
-      Page.FrameId frameId
-    returns
-      # Identifier of the created "via-inspector" stylesheet.
-      StyleSheetId styleSheetId
-
-  # Disables the CSS agent for the given page.
-  command disable
-
-  # Enables the CSS agent for the given page. Clients should not assume that the CSS agent has been
-  # enabled until the result of this command is received.
-  command enable
-
-  # Ensures that the given node will have specified pseudo-classes whenever its style is computed by
-  # the browser.
-  command forcePseudoState
-    parameters
-      # The element id for which to force the pseudo state.
-      DOM.NodeId nodeId
-      # Element pseudo classes to force when computing the element's style.
-      array of string forcedPseudoClasses
-
-  command getBackgroundColors
-    parameters
-      # Id of the node to get background colors for.
-      DOM.NodeId nodeId
-    returns
-      # The range of background colors behind this element, if it contains any visible text. If no
-      # visible text is present, this will be undefined. In the case of a flat background color,
-      # this will consist of simply that color. In the case of a gradient, this will consist of each
-      # of the color stops. For anything more complicated, this will be an empty array. Images will
-      # be ignored (as if the image had failed to load).
-      optional array of string backgroundColors
-      # The computed font size for this node, as a CSS computed value string (e.g. '12px').
-      optional string computedFontSize
-      # The computed font weight for this node, as a CSS computed value string (e.g. 'normal' or
-      # '100').
-      optional string computedFontWeight
-
-  # Returns the computed style for a DOM node identified by `nodeId`.
-  command getComputedStyleForNode
-    parameters
-      DOM.NodeId nodeId
-    returns
-      # Computed style for the specified DOM node.
-      array of CSSComputedStyleProperty computedStyle
-
-  # Returns the styles defined inline (explicitly in the "style" attribute and implicitly, using DOM
-  # attributes) for a DOM node identified by `nodeId`.
-  command getInlineStylesForNode
-    parameters
-      DOM.NodeId nodeId
-    returns
-      # Inline style for the specified DOM node.
-      optional CSSStyle inlineStyle
-      # Attribute-defined element style (e.g. resulting from "width=20 height=100%").
-      optional CSSStyle attributesStyle
-
-  # Returns requested styles for a DOM node identified by `nodeId`.
-  command getMatchedStylesForNode
-    parameters
-      DOM.NodeId nodeId
-    returns
-      # Inline style for the specified DOM node.
-      optional CSSStyle inlineStyle
-      # Attribute-defined element style (e.g. resulting from "width=20 height=100%").
-      optional CSSStyle attributesStyle
-      # CSS rules matching this node, from all applicable stylesheets.
-      optional array of RuleMatch matchedCSSRules
-      # Pseudo style matches for this node.
-      optional array of PseudoElementMatches pseudoElements
-      # A chain of inherited styles (from the immediate node parent up to the DOM tree root).
-      optional array of InheritedStyleEntry inherited
-      # A list of CSS keyframed animations matching this node.
-      optional array of CSSKeyframesRule cssKeyframesRules
-
-  # Returns all media queries parsed by the rendering engine.
-  command getMediaQueries
-    returns
-      array of CSSMedia medias
-
-  # Requests information about platform fonts which we used to render child TextNodes in the given
-  # node.
-  command getPlatformFontsForNode
-    parameters
-      DOM.NodeId nodeId
-    returns
-      # Usage statistics for every employed platform font.
-      array of PlatformFontUsage fonts
-
-  # Returns the current textual content for a stylesheet.
-  command getStyleSheetText
-    parameters
-      StyleSheetId styleSheetId
-    returns
-      # The stylesheet text.
-      string text
-
-  # Find a rule with the given active property for the given node and set the new value for this
-  # property
-  command setEffectivePropertyValueForNode
-    parameters
-      # The element id for which to set property.
-      DOM.NodeId nodeId
-      string propertyName
-      string value
-
-  # Modifies the keyframe rule key text.
-  command setKeyframeKey
-    parameters
-      StyleSheetId styleSheetId
-      SourceRange range
-      string keyText
-    returns
-      # The resulting key text after modification.
-      Value keyText
-
-  # Modifies the rule selector.
-  command setMediaText
-    parameters
-      StyleSheetId styleSheetId
-      SourceRange range
-      string text
-    returns
-      # The resulting CSS media rule after modification.
-      CSSMedia media
-
-  # Modifies the rule selector.
-  command setRuleSelector
-    parameters
-      StyleSheetId styleSheetId
-      SourceRange range
-      string selector
-    returns
-      # The resulting selector list after modification.
-      SelectorList selectorList
-
-  # Sets the new stylesheet text.
-  command setStyleSheetText
-    parameters
-      StyleSheetId styleSheetId
-      string text
-    returns
-      # URL of source map associated with script (if any).
-      optional string sourceMapURL
-
-  # Applies specified style edits one after another in the given order.
-  command setStyleTexts
-    parameters
-      array of StyleDeclarationEdit edits
-    returns
-      # The resulting styles after modification.
-      array of CSSStyle styles
-
-  # Enables the selector recording.
-  command startRuleUsageTracking
-
-  # Stop tracking rule usage and return the list of rules that were used since last call to
-  # `takeCoverageDelta` (or since start of coverage instrumentation)
-  command stopRuleUsageTracking
-    returns
-      array of RuleUsage ruleUsage
-
-  # Obtain list of rules that became used since last call to this method (or since start of coverage
-  # instrumentation)
-  command takeCoverageDelta
-    returns
-      array of RuleUsage coverage
-
-  # Fires whenever a web font is updated.  A non-empty font parameter indicates a successfully loaded
-  # web font
-  event fontsUpdated
-    parameters
-      # The web font that has loaded.
-      optional FontFace font
-
-  # Fires whenever a MediaQuery result changes (for example, after a browser window has been
-  # resized.) The current implementation considers only viewport-dependent media features.
-  event mediaQueryResultChanged
-
-  # Fired whenever an active document stylesheet is added.
-  event styleSheetAdded
-    parameters
-      # Added stylesheet metainfo.
-      CSSStyleSheetHeader header
-
-  # Fired whenever a stylesheet is changed as a result of the client operation.
-  event styleSheetChanged
-    parameters
-      StyleSheetId styleSheetId
-
-  # Fired whenever an active document stylesheet is removed.
-  event styleSheetRemoved
-    parameters
-      # Identifier of the removed stylesheet.
-      StyleSheetId styleSheetId
-
-experimental domain CacheStorage
-
-  # Unique identifier of the Cache object.
-  type CacheId extends string
-
-  # type of HTTP response cached
-  type CachedResponseType extends string
-    enum
-      basic
-      cors
-      default
-      error
-      opaqueResponse
-      opaqueRedirect
-
-  # Data entry.
-  type DataEntry extends object
-    properties
-      # Request URL.
-      string requestURL
-      # Request method.
-      string requestMethod
-      # Request headers
-      array of Header requestHeaders
-      # Number of seconds since epoch.
-      number responseTime
-      # HTTP response status code.
-      integer responseStatus
-      # HTTP response status text.
-      string responseStatusText
-      # HTTP response type
-      CachedResponseType responseType
-      # Response headers
-      array of Header responseHeaders
-
-  # Cache identifier.
-  type Cache extends object
-    properties
-      # An opaque unique id of the cache.
-      CacheId cacheId
-      # Security origin of the cache.
-      string securityOrigin
-      # The name of the cache.
-      string cacheName
-
-  type Header extends object
-    properties
-      string name
-      string value
-
-  # Cached response
-  type CachedResponse extends object
-    properties
-      # Entry content, base64-encoded.
-      binary body
-
-  # Deletes a cache.
-  command deleteCache
-    parameters
-      # Id of cache for deletion.
-      CacheId cacheId
-
-  # Deletes a cache entry.
-  command deleteEntry
-    parameters
-      # Id of cache where the entry will be deleted.
-      CacheId cacheId
-      # URL spec of the request.
-      string request
-
-  # Requests cache names.
-  command requestCacheNames
-    parameters
-      # Security origin.
-      string securityOrigin
-    returns
-      # Caches for the security origin.
-      array of Cache caches
-
-  # Fetches cache entry.
-  command requestCachedResponse
-    parameters
-      # Id of cache that contains the entry.
-      CacheId cacheId
-      # URL spec of the request.
-      string requestURL
-      # headers of the request.
-      array of Header requestHeaders
-    returns
-      # Response read from the cache.
-      CachedResponse response
-
-  # Requests data from cache.
-  command requestEntries
-    parameters
-      # ID of cache to get entries from.
-      CacheId cacheId
-      # Number of records to skip.
-      optional integer skipCount
-      # Number of records to fetch.
-      optional integer pageSize
-      # If present, only return the entries containing this substring in the path
-      optional string pathFilter
-    returns
-      # Array of object store data entries.
-      array of DataEntry cacheDataEntries
-      # Count of returned entries from this storage. If pathFilter is empty, it
-      # is the count of all entries from this storage.
-      number returnCount
-
-# A domain for interacting with Cast, Presentation API, and Remote Playback API
-# functionalities.
-experimental domain Cast
-
-  type Sink extends object
-    properties
-      string name
-      string id
-      # Text describing the current session. Present only if there is an active
-      # session on the sink.
-      optional string session
-
-  # Starts observing for sinks that can be used for tab mirroring, and if set,
-  # sinks compatible with |presentationUrl| as well. When sinks are found, a
-  # |sinksUpdated| event is fired.
-  # Also starts observing for issue messages. When an issue is added or removed,
-  # an |issueUpdated| event is fired.
-  command enable
-    parameters
-      optional string presentationUrl
-
-  # Stops observing for sinks and issues.
-  command disable
-
-  # Sets a sink to be used when the web page requests the browser to choose a
-  # sink via Presentation API, Remote Playback API, or Cast SDK.
-  command setSinkToUse
-    parameters
-      string sinkName
-
-  # Starts mirroring the tab to the sink.
-  command startTabMirroring
-    parameters
-      string sinkName
-
-  # Stops the active Cast session on the sink.
-  command stopCasting
-    parameters
-      string sinkName
-
-  # This is fired whenever the list of available sinks changes. A sink is a
-  # device or a software surface that you can cast to.
-  event sinksUpdated
-    parameters
-      array of Sink sinks
-
-  # This is fired whenever the outstanding issue/error message changes.
-  # |issueMessage| is empty if there is no issue.
-  event issueUpdated
-    parameters
-      string issueMessage
-
-
-# This domain exposes DOM read/write operations. Each DOM Node is represented with its mirror object
-# that has an `id`. This `id` can be used to get additional information on the Node, resolve it into
-# the JavaScript object wrapper, etc. It is important that client receives DOM events only for the
-# nodes that are known to the client. Backend keeps track of the nodes that were sent to the client
-# and never sends the same node twice. It is client's responsibility to collect information about
-# the nodes that were sent to the client.<p>Note that `iframe` owner elements will return
-# corresponding document elements as their child nodes.</p>
-domain DOM
-  depends on Runtime
-
-  # Unique DOM node identifier.
-  type NodeId extends integer
-
-  # Unique DOM node identifier used to reference a node that may not have been pushed to the
-  # front-end.
-  type BackendNodeId extends integer
-
-  # Backend node with a friendly name.
-  type BackendNode extends object
-    properties
-      # `Node`'s nodeType.
-      integer nodeType
-      # `Node`'s nodeName.
-      string nodeName
-      BackendNodeId backendNodeId
-
-  # Pseudo element type.
-  type PseudoType extends string
-    enum
-      first-line
-      first-letter
-      before
-      after
-      backdrop
-      selection
-      first-line-inherited
-      scrollbar
-      scrollbar-thumb
-      scrollbar-button
-      scrollbar-track
-      scrollbar-track-piece
-      scrollbar-corner
-      resizer
-      input-list-button
-
-  # Shadow root type.
-  type ShadowRootType extends string
-    enum
-      user-agent
-      open
-      closed
-
-  # DOM interaction is implemented in terms of mirror objects that represent the actual DOM nodes.
-  # DOMNode is a base node mirror type.
-  type Node extends object
-    properties
-      # Node identifier that is passed into the rest of the DOM messages as the `nodeId`. Backend
-      # will only push node with given `id` once. It is aware of all requested nodes and will only
-      # fire DOM events for nodes known to the client.
-      NodeId nodeId
-      # The id of the parent node if any.
-      optional NodeId parentId
-      # The BackendNodeId for this node.
-      BackendNodeId backendNodeId
-      # `Node`'s nodeType.
-      integer nodeType
-      # `Node`'s nodeName.
-      string nodeName
-      # `Node`'s localName.
-      string localName
-      # `Node`'s nodeValue.
-      string nodeValue
-      # Child count for `Container` nodes.
-      optional integer childNodeCount
-      # Child nodes of this node when requested with children.
-      optional array of Node children
-      # Attributes of the `Element` node in the form of flat array `[name1, value1, name2, value2]`.
-      optional array of string attributes
-      # Document URL that `Document` or `FrameOwner` node points to.
-      optional string documentURL
-      # Base URL that `Document` or `FrameOwner` node uses for URL completion.
-      optional string baseURL
-      # `DocumentType`'s publicId.
-      optional string publicId
-      # `DocumentType`'s systemId.
-      optional string systemId
-      # `DocumentType`'s internalSubset.
-      optional string internalSubset
-      # `Document`'s XML version in case of XML documents.
-      optional string xmlVersion
-      # `Attr`'s name.
-      optional string name
-      # `Attr`'s value.
-      optional string value
-      # Pseudo element type for this node.
-      optional PseudoType pseudoType
-      # Shadow root type.
-      optional ShadowRootType shadowRootType
-      # Frame ID for frame owner elements.
-      optional Page.FrameId frameId
-      # Content document for frame owner elements.
-      optional Node contentDocument
-      # Shadow root list for given element host.
-      optional array of Node shadowRoots
-      # Content document fragment for template elements.
-      optional Node templateContent
-      # Pseudo elements associated with this node.
-      optional array of Node pseudoElements
-      # Import document for the HTMLImport links.
-      optional Node importedDocument
-      # Distributed nodes for given insertion point.
-      optional array of BackendNode distributedNodes
-      # Whether the node is SVG.
-      optional boolean isSVG
-
-  # A structure holding an RGBA color.
-  type RGBA extends object
-    properties
-      # The red component, in the [0-255] range.
-      integer r
-      # The green component, in the [0-255] range.
-      integer g
-      # The blue component, in the [0-255] range.
-      integer b
-      # The alpha component, in the [0-1] range (default: 1).
-      optional number a
-
-  # An array of quad vertices, x immediately followed by y for each point, points clock-wise.
-  type Quad extends array of number
-
-  # Box model.
-  type BoxModel extends object
-    properties
-      # Content box
-      Quad content
-      # Padding box
-      Quad padding
-      # Border box
-      Quad border
-      # Margin box
-      Quad margin
-      # Node width
-      integer width
-      # Node height
-      integer height
-      # Shape outside coordinates
-      optional ShapeOutsideInfo shapeOutside
-
-  # CSS Shape Outside details.
-  type ShapeOutsideInfo extends object
-    properties
-      # Shape bounds
-      Quad bounds
-      # Shape coordinate details
-      array of any shape
-      # Margin shape bounds
-      array of any marginShape
-
-  # Rectangle.
-  type Rect extends object
-    properties
-      # X coordinate
-      number x
-      # Y coordinate
-      number y
-      # Rectangle width
-      number width
-      # Rectangle height
-      number height
-
-  # Collects class names for the node with given id and all of it's child nodes.
-  experimental command collectClassNamesFromSubtree
-    parameters
-      # Id of the node to collect class names.
-      NodeId nodeId
-    returns
-      # Class name list.
-      array of string classNames
-
-  # Creates a deep copy of the specified node and places it into the target container before the
-  # given anchor.
-  experimental command copyTo
-    parameters
-      # Id of the node to copy.
-      NodeId nodeId
-      # Id of the element to drop the copy into.
-      NodeId targetNodeId
-      # Drop the copy before this node (if absent, the copy becomes the last child of
-      # `targetNodeId`).
-      optional NodeId insertBeforeNodeId
-    returns
-      # Id of the node clone.
-      NodeId nodeId
-
-  # Describes node given its id, does not require domain to be enabled. Does not start tracking any
-  # objects, can be used for automation.
-  command describeNode
-    parameters
-      # Identifier of the node.
-      optional NodeId nodeId
-      # Identifier of the backend node.
-      optional BackendNodeId backendNodeId
-      # JavaScript object id of the node wrapper.
-      optional Runtime.RemoteObjectId objectId
-      # The maximum depth at which children should be retrieved, defaults to 1. Use -1 for the
-      # entire subtree or provide an integer larger than 0.
-      optional integer depth
-      # Whether or not iframes and shadow roots should be traversed when returning the subtree
-      # (default is false).
-      optional boolean pierce
-    returns
-      # Node description.
-      Node node
-
-  # Disables DOM agent for the given page.
-  command disable
-
-  # Discards search results from the session with the given id. `getSearchResults` should no longer
-  # be called for that search.
-  experimental command discardSearchResults
-    parameters
-      # Unique search session identifier.
-      string searchId
-
-  # Enables DOM agent for the given page.
-  command enable
-
-  # Focuses the given element.
-  command focus
-    parameters
-      # Identifier of the node.
-      optional NodeId nodeId
-      # Identifier of the backend node.
-      optional BackendNodeId backendNodeId
-      # JavaScript object id of the node wrapper.
-      optional Runtime.RemoteObjectId objectId
-
-  # Returns attributes for the specified node.
-  command getAttributes
-    parameters
-      # Id of the node to retrieve attibutes for.
-      NodeId nodeId
-    returns
-      # An interleaved array of node attribute names and values.
-      array of string attributes
-
-  # Returns boxes for the given node.
-  command getBoxModel
-    parameters
-      # Identifier of the node.
-      optional NodeId nodeId
-      # Identifier of the backend node.
-      optional BackendNodeId backendNodeId
-      # JavaScript object id of the node wrapper.
-      optional Runtime.RemoteObjectId objectId
-    returns
-      # Box model for the node.
-      BoxModel model
-
-  # Returns quads that describe node position on the page. This method
-  # might return multiple quads for inline nodes.
-  experimental command getContentQuads
-    parameters
-      # Identifier of the node.
-      optional NodeId nodeId
-      # Identifier of the backend node.
-      optional BackendNodeId backendNodeId
-      # JavaScript object id of the node wrapper.
-      optional Runtime.RemoteObjectId objectId
-    returns
-      # Quads that describe node layout relative to viewport.
-      array of Quad quads
-
-  # Returns the root DOM node (and optionally the subtree) to the caller.
-  command getDocument
-    parameters
-      # The maximum depth at which children should be retrieved, defaults to 1. Use -1 for the
-      # entire subtree or provide an integer larger than 0.
-      optional integer depth
-      # Whether or not iframes and shadow roots should be traversed when returning the subtree
-      # (default is false).
-      optional boolean pierce
-    returns
-      # Resulting node.
-      Node root
-
-  # Returns the root DOM node (and optionally the subtree) to the caller.
-  command getFlattenedDocument
-    parameters
-      # The maximum depth at which children should be retrieved, defaults to 1. Use -1 for the
-      # entire subtree or provide an integer larger than 0.
-      optional integer depth
-      # Whether or not iframes and shadow roots should be traversed when returning the subtree
-      # (default is false).
-      optional boolean pierce
-    returns
-      # Resulting node.
-      array of Node nodes
-
-  # Returns node id at given location. Depending on whether DOM domain is enabled, nodeId is
-  # either returned or not.
-  command getNodeForLocation
-    parameters
-      # X coordinate.
-      integer x
-      # Y coordinate.
-      integer y
-      # False to skip to the nearest non-UA shadow root ancestor (default: false).
-      optional boolean includeUserAgentShadowDOM
-      # Whether to ignore pointer-events: none on elements and hit test them.
-      optional boolean ignorePointerEventsNone
-    returns
-      # Resulting node.
-      BackendNodeId backendNodeId
-      # Frame this node belongs to.
-      Page.FrameId frameId
-      # Id of the node at given coordinates, only when enabled and requested document.
-      optional NodeId nodeId
-
-  # Returns node's HTML markup.
-  command getOuterHTML
-    parameters
-      # Identifier of the node.
-      optional NodeId nodeId
-      # Identifier of the backend node.
-      optional BackendNodeId backendNodeId
-      # JavaScript object id of the node wrapper.
-      optional Runtime.RemoteObjectId objectId
-    returns
-      # Outer HTML markup.
-      string outerHTML
-
-  # Returns the id of the nearest ancestor that is a relayout boundary.
-  experimental command getRelayoutBoundary
-    parameters
-      # Id of the node.
-      NodeId nodeId
-    returns
-      # Relayout boundary node id for the given node.
-      NodeId nodeId
-
-  # Returns search results from given `fromIndex` to given `toIndex` from the search with the given
-  # identifier.
-  experimental command getSearchResults
-    parameters
-      # Unique search session identifier.
-      string searchId
-      # Start index of the search result to be returned.
-      integer fromIndex
-      # End index of the search result to be returned.
-      integer toIndex
-    returns
-      # Ids of the search result nodes.
-      array of NodeId nodeIds
-
-  # Hides any highlight.
-  command hideHighlight
-    # Use 'Overlay.hideHighlight' instead
-    redirect Overlay
-
-  # Highlights DOM node.
-  command highlightNode
-    # Use 'Overlay.highlightNode' instead
-    redirect Overlay
-
-  # Highlights given rectangle.
-  command highlightRect
-    # Use 'Overlay.highlightRect' instead
-    redirect Overlay
-
-  # Marks last undoable state.
-  experimental command markUndoableState
-
-  # Moves node into the new container, places it before the given anchor.
-  command moveTo
-    parameters
-      # Id of the node to move.
-      NodeId nodeId
-      # Id of the element to drop the moved node into.
-      NodeId targetNodeId
-      # Drop node before this one (if absent, the moved node becomes the last child of
-      # `targetNodeId`).
-      optional NodeId insertBeforeNodeId
-    returns
-      # New id of the moved node.
-      NodeId nodeId
-
-  # Searches for a given string in the DOM tree. Use `getSearchResults` to access search results or
-  # `cancelSearch` to end this search session.
-  experimental command performSearch
-    parameters
-      # Plain text or query selector or XPath search query.
-      string query
-      # True to search in user agent shadow DOM.
-      optional boolean includeUserAgentShadowDOM
-    returns
-      # Unique search session identifier.
-      string searchId
-      # Number of search results.
-      integer resultCount
-
-  # Requests that the node is sent to the caller given its path. // FIXME, use XPath
-  experimental command pushNodeByPathToFrontend
-    parameters
-      # Path to node in the proprietary format.
-      string path
-    returns
-      # Id of the node for given path.
-      NodeId nodeId
-
-  # Requests that a batch of nodes is sent to the caller given their backend node ids.
-  experimental command pushNodesByBackendIdsToFrontend
-    parameters
-      # The array of backend node ids.
-      array of BackendNodeId backendNodeIds
-    returns
-      # The array of ids of pushed nodes that correspond to the backend ids specified in
-      # backendNodeIds.
-      array of NodeId nodeIds
-
-  # Executes `querySelector` on a given node.
-  command querySelector
-    parameters
-      # Id of the node to query upon.
-      NodeId nodeId
-      # Selector string.
-      string selector
-    returns
-      # Query selector result.
-      NodeId nodeId
-
-  # Executes `querySelectorAll` on a given node.
-  command querySelectorAll
-    parameters
-      # Id of the node to query upon.
-      NodeId nodeId
-      # Selector string.
-      string selector
-    returns
-      # Query selector result.
-      array of NodeId nodeIds
-
-  # Re-does the last undone action.
-  experimental command redo
-
-  # Removes attribute with given name from an element with given id.
-  command removeAttribute
-    parameters
-      # Id of the element to remove attribute from.
-      NodeId nodeId
-      # Name of the attribute to remove.
-      string name
-
-  # Removes node with given id.
-  command removeNode
-    parameters
-      # Id of the node to remove.
-      NodeId nodeId
-
-  # Requests that children of the node with given id are returned to the caller in form of
-  # `setChildNodes` events where not only immediate children are retrieved, but all children down to
-  # the specified depth.
-  command requestChildNodes
-    parameters
-      # Id of the node to get children for.
-      NodeId nodeId
-      # The maximum depth at which children should be retrieved, defaults to 1. Use -1 for the
-      # entire subtree or provide an integer larger than 0.
-      optional integer depth
-      # Whether or not iframes and shadow roots should be traversed when returning the sub-tree
-      # (default is false).
-      optional boolean pierce
-
-  # Requests that the node is sent to the caller given the JavaScript node object reference. All
-  # nodes that form the path from the node to the root are also sent to the client as a series of
-  # `setChildNodes` notifications.
-  command requestNode
-    parameters
-      # JavaScript object id to convert into node.
-      Runtime.RemoteObjectId objectId
-    returns
-      # Node id for given object.
-      NodeId nodeId
-
-  # Resolves the JavaScript node object for a given NodeId or BackendNodeId.
-  command resolveNode
-    parameters
-      # Id of the node to resolve.
-      optional NodeId nodeId
-      # Backend identifier of the node to resolve.
-      optional DOM.BackendNodeId backendNodeId
-      # Symbolic group name that can be used to release multiple objects.
-      optional string objectGroup
-      # Execution context in which to resolve the node.
-      optional Runtime.ExecutionContextId executionContextId
-    returns
-      # JavaScript object wrapper for given node.
-      Runtime.RemoteObject object
-
-  # Sets attribute for an element with given id.
-  command setAttributeValue
-    parameters
-      # Id of the element to set attribute for.
-      NodeId nodeId
-      # Attribute name.
-      string name
-      # Attribute value.
-      string value
-
-  # Sets attributes on element with given id. This method is useful when user edits some existing
-  # attribute value and types in several attribute name/value pairs.
-  command setAttributesAsText
-    parameters
-      # Id of the element to set attributes for.
-      NodeId nodeId
-      # Text with a number of attributes. Will parse this text using HTML parser.
-      string text
-      # Attribute name to replace with new attributes derived from text in case text parsed
-      # successfully.
-      optional string name
-
-  # Sets files for the given file input element.
-  command setFileInputFiles
-    parameters
-      # Array of file paths to set.
-      array of string files
-      # Identifier of the node.
-      optional NodeId nodeId
-      # Identifier of the backend node.
-      optional BackendNodeId backendNodeId
-      # JavaScript object id of the node wrapper.
-      optional Runtime.RemoteObjectId objectId
-
-  # Sets if stack traces should be captured for Nodes. See `Node.getNodeStackTraces`. Default is disabled.
-  experimental command setNodeStackTracesEnabled
-    parameters
-      # Enable or disable.
-      boolean enable
-
-  # Gets stack traces associated with a Node. As of now, only provides stack trace for Node creation.
-  experimental command getNodeStackTraces
-    parameters
-      # Id of the node to get stack traces for.
-      NodeId nodeId
-    returns
-      # Creation stack trace, if available.
-      optional Runtime.StackTrace creation
-
-  # Returns file information for the given
-  # File wrapper.
-  experimental command getFileInfo
-    parameters
-      # JavaScript object id of the node wrapper.
-      Runtime.RemoteObjectId objectId
-    returns
-      string path
-
-  # Enables console to refer to the node with given id via $x (see Command Line API for more details
-  # $x functions).
-  experimental command setInspectedNode
-    parameters
-      # DOM node id to be accessible by means of $x command line API.
-      NodeId nodeId
-
-  # Sets node name for a node with given id.
-  command setNodeName
-    parameters
-      # Id of the node to set name for.
-      NodeId nodeId
-      # New node's name.
-      string name
-    returns
-      # New node's id.
-      NodeId nodeId
-
-  # Sets node value for a node with given id.
-  command setNodeValue
-    parameters
-      # Id of the node to set value for.
-      NodeId nodeId
-      # New node's value.
-      string value
-
-  # Sets node HTML markup, returns new node id.
-  command setOuterHTML
-    parameters
-      # Id of the node to set markup for.
-      NodeId nodeId
-      # Outer HTML markup to set.
-      string outerHTML
-
-  # Undoes the last performed action.
-  experimental command undo
-
-  # Returns iframe node that owns iframe with the given domain.
-  experimental command getFrameOwner
-    parameters
-      Page.FrameId frameId
-    returns
-      # Resulting node.
-      BackendNodeId backendNodeId
-      # Id of the node at given coordinates, only when enabled and requested document.
-      optional NodeId nodeId
-
-  # Fired when `Element`'s attribute is modified.
-  event attributeModified
-    parameters
-      # Id of the node that has changed.
-      NodeId nodeId
-      # Attribute name.
-      string name
-      # Attribute value.
-      string value
-
-  # Fired when `Element`'s attribute is removed.
-  event attributeRemoved
-    parameters
-      # Id of the node that has changed.
-      NodeId nodeId
-      # A ttribute name.
-      string name
-
-  # Mirrors `DOMCharacterDataModified` event.
-  event characterDataModified
-    parameters
-      # Id of the node that has changed.
-      NodeId nodeId
-      # New text value.
-      string characterData
-
-  # Fired when `Container`'s child node count has changed.
-  event childNodeCountUpdated
-    parameters
-      # Id of the node that has changed.
-      NodeId nodeId
-      # New node count.
-      integer childNodeCount
-
-  # Mirrors `DOMNodeInserted` event.
-  event childNodeInserted
-    parameters
-      # Id of the node that has changed.
-      NodeId parentNodeId
-      # If of the previous siblint.
-      NodeId previousNodeId
-      # Inserted node data.
-      Node node
-
-  # Mirrors `DOMNodeRemoved` event.
-  event childNodeRemoved
-    parameters
-      # Parent id.
-      NodeId parentNodeId
-      # Id of the node that has been removed.
-      NodeId nodeId
-
-  # Called when distrubution is changed.
-  experimental event distributedNodesUpdated
-    parameters
-      # Insertion point where distrubuted nodes were updated.
-      NodeId insertionPointId
-      # Distributed nodes for given insertion point.
-      array of BackendNode distributedNodes
-
-  # Fired when `Document` has been totally updated. Node ids are no longer valid.
-  event documentUpdated
-
-  # Fired when `Element`'s inline style is modified via a CSS property modification.
-  experimental event inlineStyleInvalidated
-    parameters
-      # Ids of the nodes for which the inline styles have been invalidated.
-      array of NodeId nodeIds
-
-  # Called when a pseudo element is added to an element.
-  experimental event pseudoElementAdded
-    parameters
-      # Pseudo element's parent element id.
-      NodeId parentId
-      # The added pseudo element.
-      Node pseudoElement
-
-  # Called when a pseudo element is removed from an element.
-  experimental event pseudoElementRemoved
-    parameters
-      # Pseudo element's parent element id.
-      NodeId parentId
-      # The removed pseudo element id.
-      NodeId pseudoElementId
-
-  # Fired when backend wants to provide client with the missing DOM structure. This happens upon
-  # most of the calls requesting node ids.
-  event setChildNodes
-    parameters
-      # Parent node id to populate with children.
-      NodeId parentId
-      # Child nodes array.
-      array of Node nodes
-
-  # Called when shadow root is popped from the element.
-  experimental event shadowRootPopped
-    parameters
-      # Host element id.
-      NodeId hostId
-      # Shadow root id.
-      NodeId rootId
-
-  # Called when shadow root is pushed into the element.
-  experimental event shadowRootPushed
-    parameters
-      # Host element id.
-      NodeId hostId
-      # Shadow root.
-      Node root
-
-# DOM debugging allows setting breakpoints on particular DOM operations and events. JavaScript
-# execution will stop on these operations as if there was a regular breakpoint set.
-domain DOMDebugger
-  depends on DOM
-  depends on Debugger
-  depends on Runtime
-
-  # DOM breakpoint type.
-  type DOMBreakpointType extends string
-    enum
-      subtree-modified
-      attribute-modified
-      node-removed
-
-  # Object event listener.
-  type EventListener extends object
-    properties
-      # `EventListener`'s type.
-      string type
-      # `EventListener`'s useCapture.
-      boolean useCapture
-      # `EventListener`'s passive flag.
-      boolean passive
-      # `EventListener`'s once flag.
-      boolean once
-      # Script id of the handler code.
-      Runtime.ScriptId scriptId
-      # Line number in the script (0-based).
-      integer lineNumber
-      # Column number in the script (0-based).
-      integer columnNumber
-      # Event handler function value.
-      optional Runtime.RemoteObject handler
-      # Event original handler function value.
-      optional Runtime.RemoteObject originalHandler
-      # Node the listener is added to (if any).
-      optional DOM.BackendNodeId backendNodeId
-
-  # Returns event listeners of the given object.
-  command getEventListeners
-    parameters
-      # Identifier of the object to return listeners for.
-      Runtime.RemoteObjectId objectId
-      # The maximum depth at which Node children should be retrieved, defaults to 1. Use -1 for the
-      # entire subtree or provide an integer larger than 0.
-      optional integer depth
-      # Whether or not iframes and shadow roots should be traversed when returning the subtree
-      # (default is false). Reports listeners for all contexts if pierce is enabled.
-      optional boolean pierce
-    returns
-      # Array of relevant listeners.
-      array of EventListener listeners
-
-  # Removes DOM breakpoint that was set using `setDOMBreakpoint`.
-  command removeDOMBreakpoint
-    parameters
-      # Identifier of the node to remove breakpoint from.
-      DOM.NodeId nodeId
-      # Type of the breakpoint to remove.
-      DOMBreakpointType type
-
-  # Removes breakpoint on particular DOM event.
-  command removeEventListenerBreakpoint
-    parameters
-      # Event name.
-      string eventName
-      # EventTarget interface name.
-      experimental optional string targetName
-
-  # Removes breakpoint on particular native event.
-  experimental command removeInstrumentationBreakpoint
-    parameters
-      # Instrumentation name to stop on.
-      string eventName
-
-  # Removes breakpoint from XMLHttpRequest.
-  command removeXHRBreakpoint
-    parameters
-      # Resource URL substring.
-      string url
-
-  # Sets breakpoint on particular operation with DOM.
-  command setDOMBreakpoint
-    parameters
-      # Identifier of the node to set breakpoint on.
-      DOM.NodeId nodeId
-      # Type of the operation to stop upon.
-      DOMBreakpointType type
-
-  # Sets breakpoint on particular DOM event.
-  command setEventListenerBreakpoint
-    parameters
-      # DOM Event name to stop on (any DOM event will do).
-      string eventName
-      # EventTarget interface name to stop on. If equal to `"*"` or not provided, will stop on any
-      # EventTarget.
-      experimental optional string targetName
-
-  # Sets breakpoint on particular native event.
-  experimental command setInstrumentationBreakpoint
-    parameters
-      # Instrumentation name to stop on.
-      string eventName
-
-  # Sets breakpoint on XMLHttpRequest.
-  command setXHRBreakpoint
-    parameters
-      # Resource URL substring. All XHRs having this substring in the URL will get stopped upon.
-      string url
-
-# This domain facilitates obtaining document snapshots with DOM, layout, and style information.
-experimental domain DOMSnapshot
-  depends on CSS
-  depends on DOM
-  depends on DOMDebugger
-  depends on Page
-
-  # A Node in the DOM tree.
-  type DOMNode extends object
-    properties
-      # `Node`'s nodeType.
-      integer nodeType
-      # `Node`'s nodeName.
-      string nodeName
-      # `Node`'s nodeValue.
-      string nodeValue
-      # Only set for textarea elements, contains the text value.
-      optional string textValue
-      # Only set for input elements, contains the input's associated text value.
-      optional string inputValue
-      # Only set for radio and checkbox input elements, indicates if the element has been checked
-      optional boolean inputChecked
-      # Only set for option elements, indicates if the element has been selected
-      optional boolean optionSelected
-      # `Node`'s id, corresponds to DOM.Node.backendNodeId.
-      DOM.BackendNodeId backendNodeId
-      # The indexes of the node's child nodes in the `domNodes` array returned by `getSnapshot`, if
-      # any.
-      optional array of integer childNodeIndexes
-      # Attributes of an `Element` node.
-      optional array of NameValue attributes
-      # Indexes of pseudo elements associated with this node in the `domNodes` array returned by
-      # `getSnapshot`, if any.
-      optional array of integer pseudoElementIndexes
-      # The index of the node's related layout tree node in the `layoutTreeNodes` array returned by
-      # `getSnapshot`, if any.
-      optional integer layoutNodeIndex
-      # Document URL that `Document` or `FrameOwner` node points to.
-      optional string documentURL
-      # Base URL that `Document` or `FrameOwner` node uses for URL completion.
-      optional string baseURL
-      # Only set for documents, contains the document's content language.
-      optional string contentLanguage
-      # Only set for documents, contains the document's character set encoding.
-      optional string documentEncoding
-      # `DocumentType` node's publicId.
-      optional string publicId
-      # `DocumentType` node's systemId.
-      optional string systemId
-      # Frame ID for frame owner elements and also for the document node.
-      optional Page.FrameId frameId
-      # The index of a frame owner element's content document in the `domNodes` array returned by
-      # `getSnapshot`, if any.
-      optional integer contentDocumentIndex
-      # Type of a pseudo element node.
-      optional DOM.PseudoType pseudoType
-      # Shadow root type.
-      optional DOM.ShadowRootType shadowRootType
-      # Whether this DOM node responds to mouse clicks. This includes nodes that have had click
-      # event listeners attached via JavaScript as well as anchor tags that naturally navigate when
-      # clicked.
-      optional boolean isClickable
-      # Details of the node's event listeners, if any.
-      optional array of DOMDebugger.EventListener eventListeners
-      # The selected url for nodes with a srcset attribute.
-      optional string currentSourceURL
-      # The url of the script (if any) that generates this node.
-      optional string originURL
-      # Scroll offsets, set when this node is a Document.
-      optional number scrollOffsetX
-      optional number scrollOffsetY
-
-  # Details of post layout rendered text positions. The exact layout should not be regarded as
-  # stable and may change between versions.
-  type InlineTextBox extends object
-    properties
-      # The bounding box in document coordinates. Note that scroll offset of the document is ignored.
-      DOM.Rect boundingBox
-      # The starting index in characters, for this post layout textbox substring. Characters that
-      # would be represented as a surrogate pair in UTF-16 have length 2.
-      integer startCharacterIndex
-      # The number of characters in this post layout textbox substring. Characters that would be
-      # represented as a surrogate pair in UTF-16 have length 2.
-      integer numCharacters
-
-  # Details of an element in the DOM tree with a LayoutObject.
-  type LayoutTreeNode extends object
-    properties
-      # The index of the related DOM node in the `domNodes` array returned by `getSnapshot`.
-      integer domNodeIndex
-      # The bounding box in document coordinates. Note that scroll offset of the document is ignored.
-      DOM.Rect boundingBox
-      # Contents of the LayoutText, if any.
-      optional string layoutText
-      # The post-layout inline text nodes, if any.
-      optional array of InlineTextBox inlineTextNodes
-      # Index into the `computedStyles` array returned by `getSnapshot`.
-      optional integer styleIndex
-      # Global paint order index, which is determined by the stacking order of the nodes. Nodes
-      # that are painted together will have the same index. Only provided if includePaintOrder in
-      # getSnapshot was true.
-      optional integer paintOrder
-      # Set to true to indicate the element begins a new stacking context.
-      optional boolean isStackingContext
-
-  # A subset of the full ComputedStyle as defined by the request whitelist.
-  type ComputedStyle extends object
-    properties
-      # Name/value pairs of computed style properties.
-      array of NameValue properties
-
-  # A name/value pair.
-  type NameValue extends object
-    properties
-      # Attribute/property name.
-      string name
-      # Attribute/property value.
-      string value
-
-  # Index of the string in the strings table.
-  type StringIndex extends integer
-
-  # Index of the string in the strings table.
-  type ArrayOfStrings extends array of StringIndex
-
-  # Data that is only present on rare nodes.
-  type RareStringData extends object
-    properties
-      array of integer index
-      array of StringIndex value
-
-  type RareBooleanData extends object
-    properties
-      array of integer index
-
-  type RareIntegerData extends object
-    properties
-      array of integer index
-      array of integer value
-
-  type Rectangle extends array of number
-
-  # Document snapshot.
-  type DocumentSnapshot extends object
-    properties
-      # Document URL that `Document` or `FrameOwner` node points to.
-      StringIndex documentURL
-      # Document title.
-      StringIndex title
-      # Base URL that `Document` or `FrameOwner` node uses for URL completion.
-      StringIndex baseURL
-      # Contains the document's content language.
-      StringIndex contentLanguage
-      # Contains the document's character set encoding.
-      StringIndex encodingName
-      # `DocumentType` node's publicId.
-      StringIndex publicId
-      # `DocumentType` node's systemId.
-      StringIndex systemId
-      # Frame ID for frame owner elements and also for the document node.
-      StringIndex frameId
-      # A table with dom nodes.
-      NodeTreeSnapshot nodes
-      # The nodes in the layout tree.
-      LayoutTreeSnapshot layout
-      # The post-layout inline text nodes.
-      TextBoxSnapshot textBoxes
-      # Horizontal scroll offset.
-      optional number scrollOffsetX
-      # Vertical scroll offset.
-      optional number scrollOffsetY
-      # Document content width.
-      optional number contentWidth
-      # Document content height.
-      optional number contentHeight
-
-  # Table containing nodes.
-  type NodeTreeSnapshot extends object
-    properties
-      # Parent node index.
-      optional array of integer parentIndex
-      # `Node`'s nodeType.
-      optional array of integer nodeType
-      # `Node`'s nodeName.
-      optional array of StringIndex nodeName
-      # `Node`'s nodeValue.
-      optional array of StringIndex nodeValue
-      # `Node`'s id, corresponds to DOM.Node.backendNodeId.
-      optional array of DOM.BackendNodeId backendNodeId
-      # Attributes of an `Element` node. Flatten name, value pairs.
-      optional array of ArrayOfStrings attributes
-      # Only set for textarea elements, contains the text value.
-      optional RareStringData textValue
-      # Only set for input elements, contains the input's associated text value.
-      optional RareStringData inputValue
-      # Only set for radio and checkbox input elements, indicates if the element has been checked
-      optional RareBooleanData inputChecked
-      # Only set for option elements, indicates if the element has been selected
-      optional RareBooleanData optionSelected
-      # The index of the document in the list of the snapshot documents.
-      optional RareIntegerData contentDocumentIndex
-      # Type of a pseudo element node.
-      optional RareStringData pseudoType
-      # Whether this DOM node responds to mouse clicks. This includes nodes that have had click
-      # event listeners attached via JavaScript as well as anchor tags that naturally navigate when
-      # clicked.
-      optional RareBooleanData isClickable
-      # The selected url for nodes with a srcset attribute.
-      optional RareStringData currentSourceURL
-      # The url of the script (if any) that generates this node.
-      optional RareStringData originURL
-
-  # Table of details of an element in the DOM tree with a LayoutObject.
-  type LayoutTreeSnapshot extends object
-    properties
-      # Index of the corresponding node in the `NodeTreeSnapshot` array returned by `captureSnapshot`.
-      array of integer nodeIndex
-      # Array of indexes specifying computed style strings, filtered according to the `computedStyles` parameter passed to `captureSnapshot`.
-      array of ArrayOfStrings styles
-      # The absolute position bounding box.
-      array of Rectangle bounds
-      # Contents of the LayoutText, if any.
-      array of StringIndex text
-      # Stacking context information.
-      RareBooleanData stackingContexts
-      # Global paint order index, which is determined by the stacking order of the nodes. Nodes
-      # that are painted together will have the same index. Only provided if includePaintOrder in
-      # captureSnapshot was true.
-      optional array of integer paintOrders
-      # The offset rect of nodes. Only available when includeDOMRects is set to true
-      optional array of Rectangle offsetRects
-      # The scroll rect of nodes. Only available when includeDOMRects is set to true
-      optional array of Rectangle scrollRects
-      # The client rect of nodes. Only available when includeDOMRects is set to true
-      optional array of Rectangle clientRects
-
-  # Table of details of the post layout rendered text positions. The exact layout should not be regarded as
-  # stable and may change between versions.
-  type TextBoxSnapshot extends object
-    properties
-      # Index of the layout tree node that owns this box collection.
-      array of integer layoutIndex
-      # The absolute position bounding box.
-      array of Rectangle bounds
-      # The starting index in characters, for this post layout textbox substring. Characters that
-      # would be represented as a surrogate pair in UTF-16 have length 2.
-      array of integer start
-      # The number of characters in this post layout textbox substring. Characters that would be
-      # represented as a surrogate pair in UTF-16 have length 2.
-      array of integer length
-
-  # Disables DOM snapshot agent for the given page.
-  command disable
-
-  # Enables DOM snapshot agent for the given page.
-  command enable
-
-  # Returns a document snapshot, including the full DOM tree of the root node (including iframes,
-  # template contents, and imported documents) in a flattened array, as well as layout and
-  # white-listed computed style information for the nodes. Shadow DOM in the returned DOM tree is
-  # flattened.
-  deprecated command getSnapshot
-    parameters
-      # Whitelist of computed styles to return.
-      array of string computedStyleWhitelist
-      # Whether or not to retrieve details of DOM listeners (default false).
-      optional boolean includeEventListeners
-      # Whether to determine and include the paint order index of LayoutTreeNodes (default false).
-      optional boolean includePaintOrder
-      # Whether to include UA shadow tree in the snapshot (default false).
-      optional boolean includeUserAgentShadowTree
-    returns
-      # The nodes in the DOM tree. The DOMNode at index 0 corresponds to the root document.
-      array of DOMNode domNodes
-      # The nodes in the layout tree.
-      array of LayoutTreeNode layoutTreeNodes
-      # Whitelisted ComputedStyle properties for each node in the layout tree.
-      array of ComputedStyle computedStyles
-
-  # Returns a document snapshot, including the full DOM tree of the root node (including iframes,
-  # template contents, and imported documents) in a flattened array, as well as layout and
-  # white-listed computed style information for the nodes. Shadow DOM in the returned DOM tree is
-  # flattened.
-  command captureSnapshot
-    parameters
-      # Whitelist of computed styles to return.
-      array of string computedStyles
-      # Whether to include layout object paint orders into the snapshot.
-      optional boolean includePaintOrder
-      # Whether to include DOM rectangles (offsetRects, clientRects, scrollRects) into the snapshot
-      optional boolean includeDOMRects
-    returns
-      # The nodes in the DOM tree. The DOMNode at index 0 corresponds to the root document.
-      array of DocumentSnapshot documents
-      # Shared string table that all string properties refer to with indexes.
-      array of string strings
-
-# Query and modify DOM storage.
-experimental domain DOMStorage
-
-  # DOM Storage identifier.
-  type StorageId extends object
-    properties
-      # Security origin for the storage.
-      string securityOrigin
-      # Whether the storage is local storage (not session storage).
-      boolean isLocalStorage
-
-  # DOM Storage item.
-  type Item extends array of string
-
-  command clear
-    parameters
-      StorageId storageId
-
-  # Disables storage tracking, prevents storage events from being sent to the client.
-  command disable
-
-  # Enables storage tracking, storage events will now be delivered to the client.
-  command enable
-
-  command getDOMStorageItems
-    parameters
-      StorageId storageId
-    returns
-      array of Item entries
-
-  command removeDOMStorageItem
-    parameters
-      StorageId storageId
-      string key
-
-  command setDOMStorageItem
-    parameters
-      StorageId storageId
-      string key
-      string value
-
-  event domStorageItemAdded
-    parameters
-      StorageId storageId
-      string key
-      string newValue
-
-  event domStorageItemRemoved
-    parameters
-      StorageId storageId
-      string key
-
-  event domStorageItemUpdated
-    parameters
-      StorageId storageId
-      string key
-      string oldValue
-      string newValue
-
-  event domStorageItemsCleared
-    parameters
-      StorageId storageId
-
-experimental domain Database
-
-  # Unique identifier of Database object.
-  type DatabaseId extends string
-
-  # Database object.
-  type Database extends object
-    properties
-      # Database ID.
-      DatabaseId id
-      # Database domain.
-      string domain
-      # Database name.
-      string name
-      # Database version.
-      string version
-
-  # Database error.
-  type Error extends object
-    properties
-      # Error message.
-      string message
-      # Error code.
-      integer code
-
-  # Disables database tracking, prevents database events from being sent to the client.
-  command disable
-
-  # Enables database tracking, database events will now be delivered to the client.
-  command enable
-
-  command executeSQL
-    parameters
-      DatabaseId databaseId
-      string query
-    returns
-      optional array of string columnNames
-      optional array of any values
-      optional Error sqlError
-
-  command getDatabaseTableNames
-    parameters
-      DatabaseId databaseId
-    returns
-      array of string tableNames
-
-  event addDatabase
-    parameters
-      Database database
-
-experimental domain DeviceOrientation
-
-  # Clears the overridden Device Orientation.
-  command clearDeviceOrientationOverride
-
-  # Overrides the Device Orientation.
-  command setDeviceOrientationOverride
-    parameters
-      # Mock alpha
-      number alpha
-      # Mock beta
-      number beta
-      # Mock gamma
-      number gamma
-
-# This domain emulates different environments for the page.
-domain Emulation
-  depends on DOM
-  depends on Page
-  depends on Runtime
-
-  # Screen orientation.
-  type ScreenOrientation extends object
-    properties
-      # Orientation type.
-      enum type
-        portraitPrimary
-        portraitSecondary
-        landscapePrimary
-        landscapeSecondary
-      # Orientation angle.
-      integer angle
-
-  type MediaFeature extends object
-    properties
-      string name
-      string value
-
-  # advance: If the scheduler runs out of immediate work, the virtual time base may fast forward to
-  # allow the next delayed task (if any) to run; pause: The virtual time base may not advance;
-  # pauseIfNetworkFetchesPending: The virtual time base may not advance if there are any pending
-  # resource fetches.
-  experimental type VirtualTimePolicy extends string
-    enum
-      advance
-      pause
-      pauseIfNetworkFetchesPending
-
-  # Tells whether emulation is supported.
-  command canEmulate
-    returns
-      # True if emulation is supported.
-      boolean result
-
-  # Clears the overriden device metrics.
-  command clearDeviceMetricsOverride
-
-  # Clears the overriden Geolocation Position and Error.
-  command clearGeolocationOverride
-
-  # Requests that page scale factor is reset to initial values.
-  experimental command resetPageScaleFactor
-
-  # Enables or disables simulating a focused and active page.
-  experimental command setFocusEmulationEnabled
-    parameters
-      # Whether to enable to disable focus emulation.
-      boolean enabled
-
-  # Enables CPU throttling to emulate slow CPUs.
-  experimental command setCPUThrottlingRate
-    parameters
-      # Throttling rate as a slowdown factor (1 is no throttle, 2 is 2x slowdown, etc).
-      number rate
-
-  # Sets or clears an override of the default background color of the frame. This override is used
-  # if the content does not specify one.
-  command setDefaultBackgroundColorOverride
-    parameters
-      # RGBA of the default background color. If not specified, any existing override will be
-      # cleared.
-      optional DOM.RGBA color
-
-  # Overrides the values of device screen dimensions (window.screen.width, window.screen.height,
-  # window.innerWidth, window.innerHeight, and "device-width"/"device-height"-related CSS media
-  # query results).
-  command setDeviceMetricsOverride
-    parameters
-      # Overriding width value in pixels (minimum 0, maximum 10000000). 0 disables the override.
-      integer width
-      # Overriding height value in pixels (minimum 0, maximum 10000000). 0 disables the override.
-      integer height
-      # Overriding device scale factor value. 0 disables the override.
-      number deviceScaleFactor
-      # Whether to emulate mobile device. This includes viewport meta tag, overlay scrollbars, text
-      # autosizing and more.
-      boolean mobile
-      # Scale to apply to resulting view image.
-      experimental optional number scale
-      # Overriding screen width value in pixels (minimum 0, maximum 10000000).
-      experimental optional integer screenWidth
-      # Overriding screen height value in pixels (minimum 0, maximum 10000000).
-      experimental optional integer screenHeight
-      # Overriding view X position on screen in pixels (minimum 0, maximum 10000000).
-      experimental optional integer positionX
-      # Overriding view Y position on screen in pixels (minimum 0, maximum 10000000).
-      experimental optional integer positionY
-      # Do not set visible view size, rely upon explicit setVisibleSize call.
-      experimental optional boolean dontSetVisibleSize
-      # Screen orientation override.
-      optional ScreenOrientation screenOrientation
-      # If set, the visible area of the page will be overridden to this viewport. This viewport
-      # change is not observed by the page, e.g. viewport-relative elements do not change positions.
-      experimental optional Page.Viewport viewport
-
-  experimental command setScrollbarsHidden
-    parameters
-      # Whether scrollbars should be always hidden.
-      boolean hidden
-
-  experimental command setDocumentCookieDisabled
-    parameters
-      # Whether document.coookie API should be disabled.
-      boolean disabled
-
-  experimental command setEmitTouchEventsForMouse
-    parameters
-      # Whether touch emulation based on mouse input should be enabled.
-      boolean enabled
-      # Touch/gesture events configuration. Default: current platform.
-      optional enum configuration
-        mobile
-        desktop
-
-  # Emulates the given media type or media feature for CSS media queries.
-  command setEmulatedMedia
-    parameters
-      # Media type to emulate. Empty string disables the override.
-      optional string media
-      # Media features to emulate.
-      optional array of MediaFeature features
-
-  # Overrides the Geolocation Position or Error. Omitting any of the parameters emulates position
-  # unavailable.
-  command setGeolocationOverride
-    parameters
-      # Mock latitude
-      optional number latitude
-      # Mock longitude
-      optional number longitude
-      # Mock accuracy
-      optional number accuracy
-
-  # Overrides value returned by the javascript navigator object.
-  experimental deprecated command setNavigatorOverrides
-    parameters
-      # The platform navigator.platform should return.
-      string platform
-
-  # Sets a specified page scale factor.
-  experimental command setPageScaleFactor
-    parameters
-      # Page scale factor.
-      number pageScaleFactor
-
-  # Switches script execution in the page.
-  command setScriptExecutionDisabled
-    parameters
-      # Whether script execution should be disabled in the page.
-      boolean value
-
-  # Enables touch on platforms which do not support them.
-  command setTouchEmulationEnabled
-    parameters
-      # Whether the touch event emulation should be enabled.
-      boolean enabled
-      # Maximum touch points supported. Defaults to one.
-      optional integer maxTouchPoints
-
-  # Turns on virtual time for all frames (replacing real-time with a synthetic time source) and sets
-  # the current virtual time policy.  Note this supersedes any previous time budget.
-  experimental command setVirtualTimePolicy
-    parameters
-      VirtualTimePolicy policy
-      # If set, after this many virtual milliseconds have elapsed virtual time will be paused and a
-      # virtualTimeBudgetExpired event is sent.
-      optional number budget
-      # If set this specifies the maximum number of tasks that can be run before virtual is forced
-      # forwards to prevent deadlock.
-      optional integer maxVirtualTimeTaskStarvationCount
-      # If set the virtual time policy change should be deferred until any frame starts navigating.
-      # Note any previous deferred policy change is superseded.
-      optional boolean waitForNavigation
-      # If set, base::Time::Now will be overriden to initially return this value.
-      optional Network.TimeSinceEpoch initialVirtualTime
-    returns
-      # Absolute timestamp at which virtual time was first enabled (up time in milliseconds).
-      number virtualTimeTicksBase
-
-  # Overrides default host system timezone with the specified one.
-  experimental command setTimezoneOverride
-    parameters
-      # The timezone identifier. If empty, disables the override and
-      # restores default host system timezone.
-      string timezoneId
-
-  # Resizes the frame/viewport of the page. Note that this does not affect the frame's container
-  # (e.g. browser window). Can be used to produce screenshots of the specified size. Not supported
-  # on Android.
-  experimental deprecated command setVisibleSize
-    parameters
-      # Frame width (DIP).
-      integer width
-      # Frame height (DIP).
-      integer height
-
-  # Notification sent after the virtual time budget for the current VirtualTimePolicy has run out.
-  experimental event virtualTimeBudgetExpired
-
-  # Allows overriding user agent with the given string.
-  command setUserAgentOverride
-    parameters
-      # User agent to use.
-      string userAgent
-      # Browser langugage to emulate.
-      optional string acceptLanguage
-      # The platform navigator.platform should return.
-      optional string platform
-
-# This domain provides experimental commands only supported in headless mode.
-experimental domain HeadlessExperimental
-  depends on Page
-  depends on Runtime
-
-  # Encoding options for a screenshot.
-  type ScreenshotParams extends object
-    properties
-      # Image compression format (defaults to png).
-      optional enum format
-        jpeg
-        png
-      # Compression quality from range [0..100] (jpeg only).
-      optional integer quality
-
-  # Sends a BeginFrame to the target and returns when the frame was completed. Optionally captures a
-  # screenshot from the resulting frame. Requires that the target was created with enabled
-  # BeginFrameControl. Designed for use with --run-all-compositor-stages-before-draw, see also
-  # https://goo.gl/3zHXhB for more background.
-  command beginFrame
-    parameters
-      # Timestamp of this BeginFrame in Renderer TimeTicks (milliseconds of uptime). If not set,
-      # the current time will be used.
-      optional number frameTimeTicks
-      # The interval between BeginFrames that is reported to the compositor, in milliseconds.
-      # Defaults to a 60 frames/second interval, i.e. about 16.666 milliseconds.
-      optional number interval
-      # Whether updates should not be committed and drawn onto the display. False by default. If
-      # true, only side effects of the BeginFrame will be run, such as layout and animations, but
-      # any visual updates may not be visible on the display or in screenshots.
-      optional boolean noDisplayUpdates
-      # If set, a screenshot of the frame will be captured and returned in the response. Otherwise,
-      # no screenshot will be captured. Note that capturing a screenshot can fail, for example,
-      # during renderer initialization. In such a case, no screenshot data will be returned.
-      optional ScreenshotParams screenshot
-    returns
-      # Whether the BeginFrame resulted in damage and, thus, a new frame was committed to the
-      # display. Reported for diagnostic uses, may be removed in the future.
-      boolean hasDamage
-      # Base64-encoded image data of the screenshot, if one was requested and successfully taken.
-      optional binary screenshotData
-
-  # Disables headless events for the target.
-  command disable
-
-  # Enables headless events for the target.
-  command enable
-
-  # Issued when the target starts or stops needing BeginFrames.
-  # Deprecated. Issue beginFrame unconditionally instead and use result from
-  # beginFrame to detect whether the frames were suppressed.
-  deprecated event needsBeginFramesChanged
-    parameters
-      # True if BeginFrames are needed, false otherwise.
-      boolean needsBeginFrames
-
-# Input/Output operations for streams produced by DevTools.
-domain IO
-
-  # This is either obtained from another method or specifed as `blob:&lt;uuid&gt;` where
-  # `&lt;uuid&gt` is an UUID of a Blob.
-  type StreamHandle extends string
-
-  # Close the stream, discard any temporary backing storage.
-  command close
-    parameters
-      # Handle of the stream to close.
-      StreamHandle handle
-
-  # Read a chunk of the stream
-  command read
-    parameters
-      # Handle of the stream to read.
-      StreamHandle handle
-      # Seek to the specified offset before reading (if not specificed, proceed with offset
-      # following the last read). Some types of streams may only support sequential reads.
-      optional integer offset
-      # Maximum number of bytes to read (left upon the agent discretion if not specified).
-      optional integer size
-    returns
-      # Set if the data is base64-encoded
-      optional boolean base64Encoded
-      # Data that were read.
-      string data
-      # Set if the end-of-file condition occured while reading.
-      boolean eof
-
-  # Return UUID of Blob object specified by a remote object id.
-  command resolveBlob
-    parameters
-      # Object id of a Blob object wrapper.
-      Runtime.RemoteObjectId objectId
-    returns
-      # UUID of the specified Blob.
-      string uuid
-
-experimental domain IndexedDB
-  depends on Runtime
-
-  # Database with an array of object stores.
-  type DatabaseWithObjectStores extends object
-    properties
-      # Database name.
-      string name
-      # Database version (type is not 'integer', as the standard
-      # requires the version number to be 'unsigned long long')
-      number version
-      # Object stores in this database.
-      array of ObjectStore objectStores
-
-  # Object store.
-  type ObjectStore extends object
-    properties
-      # Object store name.
-      string name
-      # Object store key path.
-      KeyPath keyPath
-      # If true, object store has auto increment flag set.
-      boolean autoIncrement
-      # Indexes in this object store.
-      array of ObjectStoreIndex indexes
-
-  # Object store index.
-  type ObjectStoreIndex extends object
-    properties
-      # Index name.
-      string name
-      # Index key path.
-      KeyPath keyPath
-      # If true, index is unique.
-      boolean unique
-      # If true, index allows multiple entries for a key.
-      boolean multiEntry
-
-  # Key.
-  type Key extends object
-    properties
-      # Key type.
-      enum type
-        number
-        string
-        date
-        array
-      # Number value.
-      optional number number
-      # String value.
-      optional string string
-      # Date value.
-      optional number date
-      # Array value.
-      optional array of Key array
-
-  # Key range.
-  type KeyRange extends object
-    properties
-      # Lower bound.
-      optional Key lower
-      # Upper bound.
-      optional Key upper
-      # If true lower bound is open.
-      boolean lowerOpen
-      # If true upper bound is open.
-      boolean upperOpen
-
-  # Data entry.
-  type DataEntry extends object
-    properties
-      # Key object.
-      Runtime.RemoteObject key
-      # Primary key object.
-      Runtime.RemoteObject primaryKey
-      # Value object.
-      Runtime.RemoteObject value
-
-  # Key path.
-  type KeyPath extends object
-    properties
-      # Key path type.
-      enum type
-        null
-        string
-        array
-      # String value.
-      optional string string
-      # Array value.
-      optional array of string array
-
-  # Clears all entries from an object store.
-  command clearObjectStore
-    parameters
-      # Security origin.
-      string securityOrigin
-      # Database name.
-      string databaseName
-      # Object store name.
-      string objectStoreName
-
-  # Deletes a database.
-  command deleteDatabase
-    parameters
-      # Security origin.
-      string securityOrigin
-      # Database name.
-      string databaseName
-
-  # Delete a range of entries from an object store
-  command deleteObjectStoreEntries
-    parameters
-      string securityOrigin
-      string databaseName
-      string objectStoreName
-      # Range of entry keys to delete
-      KeyRange keyRange
-
-  # Disables events from backend.
-  command disable
-
-  # Enables events from backend.
-  command enable
-
-  # Requests data from object store or index.
-  command requestData
-    parameters
-      # Security origin.
-      string securityOrigin
-      # Database name.
-      string databaseName
-      # Object store name.
-      string objectStoreName
-      # Index name, empty string for object store data requests.
-      string indexName
-      # Number of records to skip.
-      integer skipCount
-      # Number of records to fetch.
-      integer pageSize
-      # Key range.
-      optional KeyRange keyRange
-    returns
-      # Array of object store data entries.
-      array of DataEntry objectStoreDataEntries
-      # If true, there are more entries to fetch in the given range.
-      boolean hasMore
-
-  # Gets metadata of an object store
-  command getMetadata
-    parameters
-      # Security origin.
-      string securityOrigin
-      # Database name.
-      string databaseName
-      # Object store name.
-      string objectStoreName
-    returns
-      # the entries count
-      number entriesCount
-      # the current value of key generator, to become the next inserted
-      # key into the object store. Valid if objectStore.autoIncrement
-      # is true.
-      number keyGeneratorValue
-
-  # Requests database with given name in given frame.
-  command requestDatabase
-    parameters
-      # Security origin.
-      string securityOrigin
-      # Database name.
-      string databaseName
-    returns
-      # Database with an array of object stores.
-      DatabaseWithObjectStores databaseWithObjectStores
-
-  # Requests database names for given security origin.
-  command requestDatabaseNames
-    parameters
-      # Security origin.
-      string securityOrigin
-    returns
-      # Database names for origin.
-      array of string databaseNames
-
-domain Input
-
-  type TouchPoint extends object
-    properties
-      # X coordinate of the event relative to the main frame's viewport in CSS pixels.
-      number x
-      # Y coordinate of the event relative to the main frame's viewport in CSS pixels. 0 refers to
-      # the top of the viewport and Y increases as it proceeds towards the bottom of the viewport.
-      number y
-      # X radius of the touch area (default: 1.0).
-      optional number radiusX
-      # Y radius of the touch area (default: 1.0).
-      optional number radiusY
-      # Rotation angle (default: 0.0).
-      optional number rotationAngle
-      # Force (default: 1.0).
-      optional number force
-      # Identifier used to track touch sources between events, must be unique within an event.
-      optional number id
-
-  experimental type GestureSourceType extends string
-    enum
-      default
-      touch
-      mouse
-
-  # UTC time in seconds, counted from January 1, 1970.
-  type TimeSinceEpoch extends number
-
-  # Dispatches a key event to the page.
-  command dispatchKeyEvent
-    parameters
-      # Type of the key event.
-      enum type
-        keyDown
-        keyUp
-        rawKeyDown
-        char
-      # Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
-      # (default: 0).
-      optional integer modifiers
-      # Time at which the event occurred.
-      optional TimeSinceEpoch timestamp
-      # Text as generated by processing a virtual key code with a keyboard layout. Not needed for
-      # for `keyUp` and `rawKeyDown` events (default: "")
-      optional string text
-      # Text that would have been generated by the keyboard if no modifiers were pressed (except for
-      # shift). Useful for shortcut (accelerator) key handling (default: "").
-      optional string unmodifiedText
-      # Unique key identifier (e.g., 'U+0041') (default: "").
-      optional string keyIdentifier
-      # Unique DOM defined string value for each physical key (e.g., 'KeyA') (default: "").
-      optional string code
-      # Unique DOM defined string value describing the meaning of the key in the context of active
-      # modifiers, keyboard layout, etc (e.g., 'AltGr') (default: "").
-      optional string key
-      # Windows virtual key code (default: 0).
-      optional integer windowsVirtualKeyCode
-      # Native virtual key code (default: 0).
-      optional integer nativeVirtualKeyCode
-      # Whether the event was generated from auto repeat (default: false).
-      optional boolean autoRepeat
-      # Whether the event was generated from the keypad (default: false).
-      optional boolean isKeypad
-      # Whether the event was a system key event (default: false).
-      optional boolean isSystemKey
-      # Whether the event was from the left or right side of the keyboard. 1=Left, 2=Right (default:
-      # 0).
-      optional integer location
-
-  # This method emulates inserting text that doesn't come from a key press,
-  # for example an emoji keyboard or an IME.
-  experimental command insertText
-    parameters
-      # The text to insert.
-      string text
-
-  # Dispatches a mouse event to the page.
-  command dispatchMouseEvent
-    parameters
-      # Type of the mouse event.
-      enum type
-        mousePressed
-        mouseReleased
-        mouseMoved
-        mouseWheel
-      # X coordinate of the event relative to the main frame's viewport in CSS pixels.
-      number x
-      # Y coordinate of the event relative to the main frame's viewport in CSS pixels. 0 refers to
-      # the top of the viewport and Y increases as it proceeds towards the bottom of the viewport.
-      number y
-      # Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
-      # (default: 0).
-      optional integer modifiers
-      # Time at which the event occurred.
-      optional TimeSinceEpoch timestamp
-      # Mouse button (default: "none").
-      optional enum button
-        none
-        left
-        middle
-        right
-        back
-        forward
-      # A number indicating which buttons are pressed on the mouse when a mouse event is triggered.
-      # Left=1, Right=2, Middle=4, Back=8, Forward=16, None=0.
-      optional integer buttons
-      # Number of times the mouse button was clicked (default: 0).
-      optional integer clickCount
-      # X delta in CSS pixels for mouse wheel event (default: 0).
-      optional number deltaX
-      # Y delta in CSS pixels for mouse wheel event (default: 0).
-      optional number deltaY
-      # Pointer type (default: "mouse").
-      optional enum pointerType
-        mouse
-        pen
-
-  # Dispatches a touch event to the page.
-  command dispatchTouchEvent
-    parameters
-      # Type of the touch event. TouchEnd and TouchCancel must not contain any touch points, while
-      # TouchStart and TouchMove must contains at least one.
-      enum type
-        touchStart
-        touchEnd
-        touchMove
-        touchCancel
-      # Active touch points on the touch device. One event per any changed point (compared to
-      # previous touch event in a sequence) is generated, emulating pressing/moving/releasing points
-      # one by one.
-      array of TouchPoint touchPoints
-      # Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
-      # (default: 0).
-      optional integer modifiers
-      # Time at which the event occurred.
-      optional TimeSinceEpoch timestamp
-
-  # Emulates touch event from the mouse event parameters.
-  experimental command emulateTouchFromMouseEvent
-    parameters
-      # Type of the mouse event.
-      enum type
-        mousePressed
-        mouseReleased
-        mouseMoved
-        mouseWheel
-      # X coordinate of the mouse pointer in DIP.
-      integer x
-      # Y coordinate of the mouse pointer in DIP.
-      integer y
-      # Mouse button.
-      enum button
-        none
-        left
-        middle
-        right
-      # Time at which the event occurred (default: current time).
-      optional TimeSinceEpoch timestamp
-      # X delta in DIP for mouse wheel event (default: 0).
-      optional number deltaX
-      # Y delta in DIP for mouse wheel event (default: 0).
-      optional number deltaY
-      # Bit field representing pressed modifier keys. Alt=1, Ctrl=2, Meta/Command=4, Shift=8
-      # (default: 0).
-      optional integer modifiers
-      # Number of times the mouse button was clicked (default: 0).
-      optional integer clickCount
-
-  # Ignores input events (useful while auditing page).
-  command setIgnoreInputEvents
-    parameters
-      # Ignores input events processing when set to true.
-      boolean ignore
-
-  # Synthesizes a pinch gesture over a time period by issuing appropriate touch events.
-  experimental command synthesizePinchGesture
-    parameters
-      # X coordinate of the start of the gesture in CSS pixels.
-      number x
-      # Y coordinate of the start of the gesture in CSS pixels.
-      number y
-      # Relative scale factor after zooming (>1.0 zooms in, <1.0 zooms out).
-      number scaleFactor
-      # Relative pointer speed in pixels per second (default: 800).
-      optional integer relativeSpeed
-      # Which type of input events to be generated (default: 'default', which queries the platform
-      # for the preferred input type).
-      optional GestureSourceType gestureSourceType
-
-  # Synthesizes a scroll gesture over a time period by issuing appropriate touch events.
-  experimental command synthesizeScrollGesture
-    parameters
-      # X coordinate of the start of the gesture in CSS pixels.
-      number x
-      # Y coordinate of the start of the gesture in CSS pixels.
-      number y
-      # The distance to scroll along the X axis (positive to scroll left).
-      optional number xDistance
-      # The distance to scroll along the Y axis (positive to scroll up).
-      optional number yDistance
-      # The number of additional pixels to scroll back along the X axis, in addition to the given
-      # distance.
-      optional number xOverscroll
-      # The number of additional pixels to scroll back along the Y axis, in addition to the given
-      # distance.
-      optional number yOverscroll
-      # Prevent fling (default: true).
-      optional boolean preventFling
-      # Swipe speed in pixels per second (default: 800).
-      optional integer speed
-      # Which type of input events to be generated (default: 'default', which queries the platform
-      # for the preferred input type).
-      optional GestureSourceType gestureSourceType
-      # The number of times to repeat the gesture (default: 0).
-      optional integer repeatCount
-      # The number of milliseconds delay between each repeat. (default: 250).
-      optional integer repeatDelayMs
-      # The name of the interaction markers to generate, if not empty (default: "").
-      optional string interactionMarkerName
-
-  # Synthesizes a tap gesture over a time period by issuing appropriate touch events.
-  experimental command synthesizeTapGesture
-    parameters
-      # X coordinate of the start of the gesture in CSS pixels.
-      number x
-      # Y coordinate of the start of the gesture in CSS pixels.
-      number y
-      # Duration between touchdown and touchup events in ms (default: 50).
-      optional integer duration
-      # Number of times to perform the tap (e.g. 2 for double tap, default: 1).
-      optional integer tapCount
-      # Which type of input events to be generated (default: 'default', which queries the platform
-      # for the preferred input type).
-      optional GestureSourceType gestureSourceType
-
-experimental domain Inspector
-
-  # Disables inspector domain notifications.
-  command disable
-
-  # Enables inspector domain notifications.
-  command enable
-
-  # Fired when remote debugging connection is about to be terminated. Contains detach reason.
-  event detached
-    parameters
-      # The reason why connection has been terminated.
-      string reason
-
-  # Fired when debugging target has crashed
-  event targetCrashed
-
-  # Fired when debugging target has reloaded after crash
-  event targetReloadedAfterCrash
-
-experimental domain LayerTree
-  depends on DOM
-
-  # Unique Layer identifier.
-  type LayerId extends string
-
-  # Unique snapshot identifier.
-  type SnapshotId extends string
-
-  # Rectangle where scrolling happens on the main thread.
-  type ScrollRect extends object
-    properties
-      # Rectangle itself.
-      DOM.Rect rect
-      # Reason for rectangle to force scrolling on the main thread
-      enum type
-        RepaintsOnScroll
-        TouchEventHandler
-        WheelEventHandler
-
-  # Sticky position constraints.
-  type StickyPositionConstraint extends object
-    properties
-      # Layout rectangle of the sticky element before being shifted
-      DOM.Rect stickyBoxRect
-      # Layout rectangle of the containing block of the sticky element
-      DOM.Rect containingBlockRect
-      # The nearest sticky layer that shifts the sticky box
-      optional LayerId nearestLayerShiftingStickyBox
-      # The nearest sticky layer that shifts the containing block
-      optional LayerId nearestLayerShiftingContainingBlock
-
-  # Serialized fragment of layer picture along with its offset within the layer.
-  type PictureTile extends object
-    properties
-      # Offset from owning layer left boundary
-      number x
-      # Offset from owning layer top boundary
-      number y
-      # Base64-encoded snapshot data.
-      binary picture
-
-  # Information about a compositing layer.
-  type Layer extends object
-    properties
-      # The unique id for this layer.
-      LayerId layerId
-      # The id of parent (not present for root).
-      optional LayerId parentLayerId
-      # The backend id for the node associated with this layer.
-      optional DOM.BackendNodeId backendNodeId
-      # Offset from parent layer, X coordinate.
-      number offsetX
-      # Offset from parent layer, Y coordinate.
-      number offsetY
-      # Layer width.
-      number width
-      # Layer height.
-      number height
-      # Transformation matrix for layer, default is identity matrix
-      optional array of number transform
-      # Transform anchor point X, absent if no transform specified
-      optional number anchorX
-      # Transform anchor point Y, absent if no transform specified
-      optional number anchorY
-      # Transform anchor point Z, absent if no transform specified
-      optional number anchorZ
-      # Indicates how many time this layer has painted.
-      integer paintCount
-      # Indicates whether this layer hosts any content, rather than being used for
-      # transform/scrolling purposes only.
-      boolean drawsContent
-      # Set if layer is not visible.
-      optional boolean invisible
-      # Rectangles scrolling on main thread only.
-      optional array of ScrollRect scrollRects
-      # Sticky position constraint information
-      optional StickyPositionConstraint stickyPositionConstraint
-
-  # Array of timings, one per paint step.
-  type PaintProfile extends array of number
-
-  # Provides the reasons why the given layer was composited.
-  command compositingReasons
-    parameters
-      # The id of the layer for which we want to get the reasons it was composited.
-      LayerId layerId
-    returns
-      # A list of strings specifying reasons for the given layer to become composited.
-      array of string compositingReasons
-
-  # Disables compositing tree inspection.
-  command disable
-
-  # Enables compositing tree inspection.
-  command enable
-
-  # Returns the snapshot identifier.
-  command loadSnapshot
-    parameters
-      # An array of tiles composing the snapshot.
-      array of PictureTile tiles
-    returns
-      # The id of the snapshot.
-      SnapshotId snapshotId
-
-  # Returns the layer snapshot identifier.
-  command makeSnapshot
-    parameters
-      # The id of the layer.
-      LayerId layerId
-    returns
-      # The id of the layer snapshot.
-      SnapshotId snapshotId
-
-  command profileSnapshot
-    parameters
-      # The id of the layer snapshot.
-      SnapshotId snapshotId
-      # The maximum number of times to replay the snapshot (1, if not specified).
-      optional integer minRepeatCount
-      # The minimum duration (in seconds) to replay the snapshot.
-      optional number minDuration
-      # The clip rectangle to apply when replaying the snapshot.
-      optional DOM.Rect clipRect
-    returns
-      # The array of paint profiles, one per run.
-      array of PaintProfile timings
-
-  # Releases layer snapshot captured by the back-end.
-  command releaseSnapshot
-    parameters
-      # The id of the layer snapshot.
-      SnapshotId snapshotId
-
-  # Replays the layer snapshot and returns the resulting bitmap.
-  command replaySnapshot
-    parameters
-      # The id of the layer snapshot.
-      SnapshotId snapshotId
-      # The first step to replay from (replay from the very start if not specified).
-      optional integer fromStep
-      # The last step to replay to (replay till the end if not specified).
-      optional integer toStep
-      # The scale to apply while replaying (defaults to 1).
-      optional number scale
-    returns
-      # A data: URL for resulting image.
-      string dataURL
-
-  # Replays the layer snapshot and returns canvas log.
-  command snapshotCommandLog
-    parameters
-      # The id of the layer snapshot.
-      SnapshotId snapshotId
-    returns
-      # The array of canvas function calls.
-      array of object commandLog
-
-  event layerPainted
-    parameters
-      # The id of the painted layer.
-      LayerId layerId
-      # Clip rectangle.
-      DOM.Rect clip
-
-  event layerTreeDidChange
-    parameters
-      # Layer tree, absent if not in the comspositing mode.
-      optional array of Layer layers
-
-# Provides access to log entries.
-domain Log
-  depends on Runtime
-  depends on Network
-
-  # Log entry.
-  type LogEntry extends object
-    properties
-      # Log entry source.
-      enum source
-        xml
-        javascript
-        network
-        storage
-        appcache
-        rendering
-        security
-        deprecation
-        worker
-        violation
-        intervention
-        recommendation
-        other
-      # Log entry severity.
-      enum level
-        verbose
-        info
-        warning
-        error
-      # Logged text.
-      string text
-      # Timestamp when this entry was added.
-      Runtime.Timestamp timestamp
-      # URL of the resource if known.
-      optional string url
-      # Line number in the resource.
-      optional integer lineNumber
-      # JavaScript stack trace.
-      optional Runtime.StackTrace stackTrace
-      # Identifier of the network request associated with this entry.
-      optional Network.RequestId networkRequestId
-      # Identifier of the worker associated with this entry.
-      optional string workerId
-      # Call arguments.
-      optional array of Runtime.RemoteObject args
-
-  # Violation configuration setting.
-  type ViolationSetting extends object
-    properties
-      # Violation type.
-      enum name
-        longTask
-        longLayout
-        blockedEvent
-        blockedParser
-        discouragedAPIUse
-        handler
-        recurringHandler
-      # Time threshold to trigger upon.
-      number threshold
-
-  # Clears the log.
-  command clear
-
-  # Disables log domain, prevents further log entries from being reported to the client.
-  command disable
-
-  # Enables log domain, sends the entries collected so far to the client by means of the
-  # `entryAdded` notification.
-  command enable
-
-  # start violation reporting.
-  command startViolationsReport
-    parameters
-      # Configuration for violations.
-      array of ViolationSetting config
-
-  # Stop violation reporting.
-  command stopViolationsReport
-
-  # Issued when new message was logged.
-  event entryAdded
-    parameters
-      # The entry.
-      LogEntry entry
-
-experimental domain Memory
-
-  # Memory pressure level.
-  type PressureLevel extends string
-    enum
-      moderate
-      critical
-
-  command getDOMCounters
-    returns
-      integer documents
-      integer nodes
-      integer jsEventListeners
-
-  command prepareForLeakDetection
-
-  # Simulate OomIntervention by purging V8 memory.
-  command forciblyPurgeJavaScriptMemory
-
-  # Enable/disable suppressing memory pressure notifications in all processes.
-  command setPressureNotificationsSuppressed
-    parameters
-      # If true, memory pressure notifications will be suppressed.
-      boolean suppressed
-
-  # Simulate a memory pressure notification in all processes.
-  command simulatePressureNotification
-    parameters
-      # Memory pressure level of the notification.
-      PressureLevel level
-
-  # Start collecting native memory profile.
-  command startSampling
-    parameters
-      # Average number of bytes between samples.
-      optional integer samplingInterval
-      # Do not randomize intervals between samples.
-      optional boolean suppressRandomness
-
-  # Stop collecting native memory profile.
-  command stopSampling
-
-  # Retrieve native memory allocations profile
-  # collected since renderer process startup.
-  command getAllTimeSamplingProfile
-    returns
-      SamplingProfile profile
-
-  # Retrieve native memory allocations profile
-  # collected since browser process startup.
-  command getBrowserSamplingProfile
-    returns
-      SamplingProfile profile
-
-  # Retrieve native memory allocations profile collected since last
-  # `startSampling` call.
-  command getSamplingProfile
-    returns
-      SamplingProfile profile
-
-  # Heap profile sample.
-  type SamplingProfileNode extends object
-    properties
-      # Size of the sampled allocation.
-      number size
-      # Total bytes attributed to this sample.
-      number total
-      # Execution stack at the point of allocation.
-      array of string stack
-
-  # Array of heap profile samples.
-  type SamplingProfile extends object
-    properties
-      array of SamplingProfileNode samples
-      array of Module modules
-
-  # Executable module information
-  type Module extends object
-    properties
-      # Name of the module.
-      string name
-      # UUID of the module.
-      string uuid
-      # Base address where the module is loaded into memory. Encoded as a decimal
-      # or hexadecimal (0x prefixed) string.
-      string baseAddress
-      # Size of the module in bytes.
-      number size
-
-# Network domain allows tracking network activities of the page. It exposes information about http,
-# file, data and other requests and responses, their headers, bodies, timing, etc.
-domain Network
-  depends on Debugger
-  depends on Runtime
-  depends on Security
-
-  # Resource type as it was perceived by the rendering engine.
-  type ResourceType extends string
-    enum
-      Document
-      Stylesheet
-      Image
-      Media
-      Font
-      Script
-      TextTrack
-      XHR
-      Fetch
-      EventSource
-      WebSocket
-      Manifest
-      SignedExchange
-      Ping
-      CSPViolationReport
-      Other
-
-  # Unique loader identifier.
-  type LoaderId extends string
-
-  # Unique request identifier.
-  type RequestId extends string
-
-  # Unique intercepted request identifier.
-  type InterceptionId extends string
-
-  # Network level fetch failure reason.
-  type ErrorReason extends string
-    enum
-      Failed
-      Aborted
-      TimedOut
-      AccessDenied
-      ConnectionClosed
-      ConnectionReset
-      ConnectionRefused
-      ConnectionAborted
-      ConnectionFailed
-      NameNotResolved
-      InternetDisconnected
-      AddressUnreachable
-      BlockedByClient
-      BlockedByResponse
-
-  # UTC time in seconds, counted from January 1, 1970.
-  type TimeSinceEpoch extends number
-
-  # Monotonically increasing time in seconds since an arbitrary point in the past.
-  type MonotonicTime extends number
-
-  # Request / response headers as keys / values of JSON object.
-  type Headers extends object
-
-  # The underlying connection technology that the browser is supposedly using.
-  type ConnectionType extends string
-    enum
-      none
-      cellular2g
-      cellular3g
-      cellular4g
-      bluetooth
-      ethernet
-      wifi
-      wimax
-      other
-
-  # Represents the cookie's 'SameSite' status:
-  # https://tools.ietf.org/html/draft-west-first-party-cookies
-  type CookieSameSite extends string
-    enum
-      Strict
-      Lax
-      None
-
-  # Timing information for the request.
-  type ResourceTiming extends object
-    properties
-      # Timing's requestTime is a baseline in seconds, while the other numbers are ticks in
-      # milliseconds relatively to this requestTime.
-      number requestTime
-      # Started resolving proxy.
-      number proxyStart
-      # Finished resolving proxy.
-      number proxyEnd
-      # Started DNS address resolve.
-      number dnsStart
-      # Finished DNS address resolve.
-      number dnsEnd
-      # Started connecting to the remote host.
-      number connectStart
-      # Connected to the remote host.
-      number connectEnd
-      # Started SSL handshake.
-      number sslStart
-      # Finished SSL handshake.
-      number sslEnd
-      # Started running ServiceWorker.
-      experimental number workerStart
-      # Finished Starting ServiceWorker.
-      experimental number workerReady
-      # Started sending request.
-      number sendStart
-      # Finished sending request.
-      number sendEnd
-      # Time the server started pushing request.
-      experimental number pushStart
-      # Time the server finished pushing request.
-      experimental number pushEnd
-      # Finished receiving response headers.
-      number receiveHeadersEnd
-
-  # Loading priority of a resource request.
-  type ResourcePriority extends string
-    enum
-      VeryLow
-      Low
-      Medium
-      High
-      VeryHigh
-
-  # HTTP request data.
-  type Request extends object
-    properties
-      # Request URL (without fragment).
-      string url
-      # Fragment of the requested URL starting with hash, if present.
-      optional string urlFragment
-      # HTTP request method.
-      string method
-      # HTTP request headers.
-      Headers headers
-      # HTTP POST request data.
-      optional string postData
-      # True when the request has POST data. Note that postData might still be omitted when this flag is true when the data is too long.
-      optional boolean hasPostData
-      # The mixed content type of the request.
-      optional Security.MixedContentType mixedContentType
-      # Priority of the resource request at the time request is sent.
-      ResourcePriority initialPriority
-      # The referrer policy of the request, as defined in https://www.w3.org/TR/referrer-policy/
-      enum referrerPolicy
-        unsafe-url
-        no-referrer-when-downgrade
-        no-referrer
-        origin
-        origin-when-cross-origin
-        same-origin
-        strict-origin
-        strict-origin-when-cross-origin
-      # Whether is loaded via link preload.
-      optional boolean isLinkPreload
-
-  # Details of a signed certificate timestamp (SCT).
-  type SignedCertificateTimestamp extends object
-    properties
-      # Validation status.
-      string status
-      # Origin.
-      string origin
-      # Log name / description.
-      string logDescription
-      # Log ID.
-      string logId
-      # Issuance date.
-      TimeSinceEpoch timestamp
-      # Hash algorithm.
-      string hashAlgorithm
-      # Signature algorithm.
-      string signatureAlgorithm
-      # Signature data.
-      string signatureData
-
-  # Security details about a request.
-  type SecurityDetails extends object
-    properties
-      # Protocol name (e.g. "TLS 1.2" or "QUIC").
-      string protocol
-      # Key Exchange used by the connection, or the empty string if not applicable.
-      string keyExchange
-      # (EC)DH group used by the connection, if applicable.
-      optional string keyExchangeGroup
-      # Cipher name.
-      string cipher
-      # TLS MAC. Note that AEAD ciphers do not have separate MACs.
-      optional string mac
-      # Certificate ID value.
-      Security.CertificateId certificateId
-      # Certificate subject name.
-      string subjectName
-      # Subject Alternative Name (SAN) DNS names and IP addresses.
-      array of string sanList
-      # Name of the issuing CA.
-      string issuer
-      # Certificate valid from date.
-      TimeSinceEpoch validFrom
-      # Certificate valid to (expiration) date
-      TimeSinceEpoch validTo
-      # List of signed certificate timestamps (SCTs).
-      array of SignedCertificateTimestamp signedCertificateTimestampList
-      # Whether the request complied with Certificate Transparency policy
-      CertificateTransparencyCompliance certificateTransparencyCompliance
-
-  # Whether the request complied with Certificate Transparency policy.
-  type CertificateTransparencyCompliance extends string
-    enum
-      unknown
-      not-compliant
-      compliant
-
-  # The reason why request was blocked.
-  type BlockedReason extends string
-    enum
-      other
-      csp
-      mixed-content
-      origin
-      inspector
-      subresource-filter
-      content-type
-      collapsed-by-client
-
-  # HTTP response data.
-  type Response extends object
-    properties
-      # Response URL. This URL can be different from CachedResource.url in case of redirect.
-      string url
-      # HTTP response status code.
-      integer status
-      # HTTP response status text.
-      string statusText
-      # HTTP response headers.
-      Headers headers
-      # HTTP response headers text.
-      optional string headersText
-      # Resource mimeType as determined by the browser.
-      string mimeType
-      # Refined HTTP request headers that were actually transmitted over the network.
-      optional Headers requestHeaders
-      # HTTP request headers text.
-      optional string requestHeadersText
-      # Specifies whether physical connection was actually reused for this request.
-      boolean connectionReused
-      # Physical connection id that was actually used for this request.
-      number connectionId
-      # Remote IP address.
-      optional string remoteIPAddress
-      # Remote port.
-      optional integer remotePort
-      # Specifies that the request was served from the disk cache.
-      optional boolean fromDiskCache
-      # Specifies that the request was served from the ServiceWorker.
-      optional boolean fromServiceWorker
-      # Specifies that the request was served from the prefetch cache.
-      optional boolean fromPrefetchCache
-      # Total number of bytes received for this request so far.
-      number encodedDataLength
-      # Timing information for the given request.
-      optional ResourceTiming timing
-      # Protocol used to fetch this request.
-      optional string protocol
-      # Security state of the request resource.
-      Security.SecurityState securityState
-      # Security details for the request.
-      optional SecurityDetails securityDetails
-
-  # WebSocket request data.
-  type WebSocketRequest extends object
-    properties
-      # HTTP request headers.
-      Headers headers
-
-  # WebSocket response data.
-  type WebSocketResponse extends object
-    properties
-      # HTTP response status code.
-      integer status
-      # HTTP response status text.
-      string statusText
-      # HTTP response headers.
-      Headers headers
-      # HTTP response headers text.
-      optional string headersText
-      # HTTP request headers.
-      optional Headers requestHeaders
-      # HTTP request headers text.
-      optional string requestHeadersText
-
-  # WebSocket message data. This represents an entire WebSocket message, not just a fragmented frame as the name suggests.
-  type WebSocketFrame extends object
-    properties
-      # WebSocket message opcode.
-      number opcode
-      # WebSocket message mask.
-      boolean mask
-      # WebSocket message payload data.
-      # If the opcode is 1, this is a text message and payloadData is a UTF-8 string.
-      # If the opcode isn't 1, then payloadData is a base64 encoded string representing binary data.
-      string payloadData
-
-  # Information about the cached resource.
-  type CachedResource extends object
-    properties
-      # Resource URL. This is the url of the original network request.
-      string url
-      # Type of this resource.
-      ResourceType type
-      # Cached response data.
-      optional Response response
-      # Cached response body size.
-      number bodySize
-
-  # Information about the request initiator.
-  type Initiator extends object
-    properties
-      # Type of this initiator.
-      enum type
-        parser
-        script
-        preload
-        SignedExchange
-        other
-      # Initiator JavaScript stack trace, set for Script only.
-      optional Runtime.StackTrace stack
-      # Initiator URL, set for Parser type or for Script type (when script is importing module) or for SignedExchange type.
-      optional string url
-      # Initiator line number, set for Parser type or for Script type (when script is importing
-      # module) (0-based).
-      optional number lineNumber
-
-  # Cookie object
-  type Cookie extends object
-    properties
-      # Cookie name.
-      string name
-      # Cookie value.
-      string value
-      # Cookie domain.
-      string domain
-      # Cookie path.
-      string path
-      # Cookie expiration date as the number of seconds since the UNIX epoch.
-      number expires
-      # Cookie size.
-      integer size
-      # True if cookie is http-only.
-      boolean httpOnly
-      # True if cookie is secure.
-      boolean secure
-      # True in case of session cookie.
-      boolean session
-      # Cookie SameSite type.
-      optional CookieSameSite sameSite
-
-  # Types of reasons why a cookie may not be stored from a response.
-  experimental type SetCookieBlockedReason extends string
-    enum
-      # The cookie had the "Secure" attribute but was not received over a secure connection.
-      SecureOnly
-      # The cookie had the "SameSite=Strict" attribute but came from a cross-origin response.
-      # This includes navigation requests intitiated by other origins.
-      SameSiteStrict
-      # The cookie had the "SameSite=Lax" attribute but came from a cross-origin response.
-      SameSiteLax
-      # The cookie didn't specify a "SameSite" attribute and was defaulted to "SameSite=Lax" and
-      # broke the same rules specified in the SameSiteLax value.
-      SameSiteUnspecifiedTreatedAsLax
-      # The cookie had the "SameSite=None" attribute but did not specify the "Secure" attribute,
-      # which is required in order to use "SameSite=None".
-      SameSiteNoneInsecure
-      # The cookie was not stored due to user preferences.
-      UserPreferences
-      # The syntax of the Set-Cookie header of the response was invalid.
-      SyntaxError
-      # The scheme of the connection is not allowed to store cookies.
-      SchemeNotSupported
-      # The cookie was not sent over a secure connection and would have overwritten a cookie with
-      # the Secure attribute.
-      OverwriteSecure
-      # The cookie's domain attribute was invalid with regards to the current host url.
-      InvalidDomain
-      # The cookie used the "__Secure-" or "__Host-" prefix in its name and broke the additional
-      # rules applied to cookies with these prefixes as defined in
-      # https://tools.ietf.org/html/draft-west-cookie-prefixes-05
-      InvalidPrefix
-      # An unknown error was encountered when trying to store this cookie.
-      UnknownError
-
-  # Types of reasons why a cookie may not be sent with a request.
-  experimental type CookieBlockedReason extends string
-    enum
-      # The cookie had the "Secure" attribute and the connection was not secure.
-      SecureOnly
-      # The cookie's path was not within the request url's path.
-      NotOnPath
-      # The cookie's domain is not configured to match the request url's domain, even though they
-      # share a common TLD+1 (TLD+1 of foo.bar.example.com is example.com).
-      DomainMismatch
-      # The cookie had the "SameSite=Strict" attribute and the request was made on on a different
-      # site. This includes navigation requests initiated by other sites.
-      SameSiteStrict
-      # The cookie had the "SameSite=Lax" attribute and the request was made on a different site.
-      # This does not include navigation requests initiated by other sites.
-      SameSiteLax
-      # The cookie didn't specify a SameSite attribute when it was stored and was defaulted to
-      # "SameSite=Lax" and broke the same rules specified in the SameSiteLax value. The cookie had
-      # to have been set with "SameSite=None" to enable third-party usage.
-      SameSiteUnspecifiedTreatedAsLax
-      # The cookie had the "SameSite=None" attribute and the connection was not secure. Cookies
-      # without SameSite restrictions must be sent over a secure connection.
-      SameSiteNoneInsecure
-      # The cookie was not sent due to user preferences.
-      UserPreferences
-      # An unknown error was encountered when trying to send this cookie.
-      UnknownError
-
-  # A cookie which was not stored from a response with the corresponding reason.
-  experimental type BlockedSetCookieWithReason extends object
-    properties
-      # The reason(s) this cookie was blocked.
-      array of SetCookieBlockedReason blockedReasons
-      # The string representing this individual cookie as it would appear in the header.
-      # This is not the entire "cookie" or "set-cookie" header which could have multiple cookies.
-      string cookieLine
-      # The cookie object which represents the cookie which was not stored. It is optional because
-      # sometimes complete cookie information is not available, such as in the case of parsing
-      # errors.
-      optional Cookie cookie
-
-  # A cookie with was not sent with a request with the corresponding reason.
-  experimental type BlockedCookieWithReason extends object
-    properties
-      # The reason(s) the cookie was blocked.
-      array of CookieBlockedReason blockedReasons
-      # The cookie object representing the cookie which was not sent.
-      Cookie cookie
-
-  # Cookie parameter object
-  type CookieParam extends object
-    properties
-      # Cookie name.
-      string name
-      # Cookie value.
-      string value
-      # The request-URI to associate with the setting of the cookie. This value can affect the
-      # default domain and path values of the created cookie.
-      optional string url
-      # Cookie domain.
-      optional string domain
-      # Cookie path.
-      optional string path
-      # True if cookie is secure.
-      optional boolean secure
-      # True if cookie is http-only.
-      optional boolean httpOnly
-      # Cookie SameSite type.
-      optional CookieSameSite sameSite
-      # Cookie expiration date, session cookie if not set
-      optional TimeSinceEpoch expires
-
-  # Authorization challenge for HTTP status code 401 or 407.
-  experimental type AuthChallenge extends object
-    properties
-      # Source of the authentication challenge.
-      optional enum source
-        Server
-        Proxy
-      # Origin of the challenger.
-      string origin
-      # The authentication scheme used, such as basic or digest
-      string scheme
-      # The realm of the challenge. May be empty.
-      string realm
-
-  # Response to an AuthChallenge.
-  experimental type AuthChallengeResponse extends object
-    properties
-      # The decision on what to do in response to the authorization challenge.  Default means
-      # deferring to the default behavior of the net stack, which will likely either the Cancel
-      # authentication or display a popup dialog box.
-      enum response
-        Default
-        CancelAuth
-        ProvideCredentials
-      # The username to provide, possibly empty. Should only be set if response is
-      # ProvideCredentials.
-      optional string username
-      # The password to provide, possibly empty. Should only be set if response is
-      # ProvideCredentials.
-      optional string password
-
-  # Stages of the interception to begin intercepting. Request will intercept before the request is
-  # sent. Response will intercept after the response is received.
-  experimental type InterceptionStage extends string
-    enum
-      Request
-      HeadersReceived
-
-  # Request pattern for interception.
-  experimental type RequestPattern extends object
-    properties
-      # Wildcards ('*' -> zero or more, '?' -> exactly one) are allowed. Escape character is
-      # backslash. Omitting is equivalent to "*".
-      optional string urlPattern
-      # If set, only requests for matching resource types will be intercepted.
-      optional ResourceType resourceType
-      # Stage at wich to begin intercepting requests. Default is Request.
-      optional InterceptionStage interceptionStage
-
-  # Information about a signed exchange signature.
-  # https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html#rfc.section.3.1
-  experimental type SignedExchangeSignature extends object
-    properties
-      # Signed exchange signature label.
-      string label
-      # The hex string of signed exchange signature.
-      string signature
-      # Signed exchange signature integrity.
-      string integrity
-      # Signed exchange signature cert Url.
-      optional string certUrl
-      # The hex string of signed exchange signature cert sha256.
-      optional string certSha256
-      # Signed exchange signature validity Url.
-      string validityUrl
-      # Signed exchange signature date.
-      integer date
-      # Signed exchange signature expires.
-      integer expires
-      # The encoded certificates.
-      optional array of string certificates
-
-  # Information about a signed exchange header.
-  # https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html#cbor-representation
-  experimental type SignedExchangeHeader extends object
-    properties
-      # Signed exchange request URL.
-      string requestUrl
-      # Signed exchange response code.
-      integer responseCode
-      # Signed exchange response headers.
-      Headers responseHeaders
-      # Signed exchange response signature.
-      array of SignedExchangeSignature signatures
-      # Signed exchange header integrity hash in the form of "sha256-<base64-hash-value>".
-      string headerIntegrity
-
-  # Field type for a signed exchange related error.
-  experimental type SignedExchangeErrorField extends string
-    enum
-      signatureSig
-      signatureIntegrity
-      signatureCertUrl
-      signatureCertSha256
-      signatureValidityUrl
-      signatureTimestamps
-
-  # Information about a signed exchange response.
-  experimental type SignedExchangeError extends object
-    properties
-      # Error message.
-      string message
-      # The index of the signature which caused the error.
-      optional integer signatureIndex
-      # The field which caused the error.
-      optional SignedExchangeErrorField errorField
-
-  # Information about a signed exchange response.
-  experimental type SignedExchangeInfo extends object
-    properties
-      # The outer response of signed HTTP exchange which was received from network.
-      Response outerResponse
-      # Information about the signed exchange header.
-      optional SignedExchangeHeader header
-      # Security details for the signed exchange header.
-      optional SecurityDetails securityDetails
-      # Errors occurred while handling the signed exchagne.
-      optional array of SignedExchangeError errors
-
-  # Tells whether clearing browser cache is supported.
-  deprecated command canClearBrowserCache
-    returns
-      # True if browser cache can be cleared.
-      boolean result
-
-  # Tells whether clearing browser cookies is supported.
-  deprecated command canClearBrowserCookies
-    returns
-      # True if browser cookies can be cleared.
-      boolean result
-
-  # Tells whether emulation of network conditions is supported.
-  deprecated command canEmulateNetworkConditions
-    returns
-      # True if emulation of network conditions is supported.
-      boolean result
-
-  # Clears browser cache.
-  command clearBrowserCache
-
-  # Clears browser cookies.
-  command clearBrowserCookies
-
-  # Response to Network.requestIntercepted which either modifies the request to continue with any
-  # modifications, or blocks it, or completes it with the provided response bytes. If a network
-  # fetch occurs as a result which encounters a redirect an additional Network.requestIntercepted
-  # event will be sent with the same InterceptionId.
-  # Deprecated, use Fetch.continueRequest, Fetch.fulfillRequest and Fetch.failRequest instead.
-  experimental deprecated command continueInterceptedRequest
-    parameters
-      InterceptionId interceptionId
-      # If set this causes the request to fail with the given reason. Passing `Aborted` for requests
-      # marked with `isNavigationRequest` also cancels the navigation. Must not be set in response
-      # to an authChallenge.
-      optional ErrorReason errorReason
-      # If set the requests completes using with the provided base64 encoded raw response, including
-      # HTTP status line and headers etc... Must not be set in response to an authChallenge.
-      optional binary rawResponse
-      # If set the request url will be modified in a way that's not observable by page. Must not be
-      # set in response to an authChallenge.
-      optional string url
-      # If set this allows the request method to be overridden. Must not be set in response to an
-      # authChallenge.
-      optional string method
-      # If set this allows postData to be set. Must not be set in response to an authChallenge.
-      optional string postData
-      # If set this allows the request headers to be changed. Must not be set in response to an
-      # authChallenge.
-      optional Headers headers
-      # Response to a requestIntercepted with an authChallenge. Must not be set otherwise.
-      optional AuthChallengeResponse authChallengeResponse
-
-  # Deletes browser cookies with matching name and url or domain/path pair.
-  command deleteCookies
-    parameters
-      # Name of the cookies to remove.
-      string name
-      # If specified, deletes all the cookies with the given name where domain and path match
-      # provided URL.
-      optional string url
-      # If specified, deletes only cookies with the exact domain.
-      optional string domain
-      # If specified, deletes only cookies with the exact path.
-      optional string path
-
-  # Disables network tracking, prevents network events from being sent to the client.
-  command disable
-
-  # Activates emulation of network conditions.
-  command emulateNetworkConditions
-    parameters
-      # True to emulate internet disconnection.
-      boolean offline
-      # Minimum latency from request sent to response headers received (ms).
-      number latency
-      # Maximal aggregated download throughput (bytes/sec). -1 disables download throttling.
-      number downloadThroughput
-      # Maximal aggregated upload throughput (bytes/sec).  -1 disables upload throttling.
-      number uploadThroughput
-      # Connection type if known.
-      optional ConnectionType connectionType
-
-  # Enables network tracking, network events will now be delivered to the client.
-  command enable
-    parameters
-      # Buffer size in bytes to use when preserving network payloads (XHRs, etc).
-      experimental optional integer maxTotalBufferSize
-      # Per-resource buffer size in bytes to use when preserving network payloads (XHRs, etc).
-      experimental optional integer maxResourceBufferSize
-      # Longest post body size (in bytes) that would be included in requestWillBeSent notification
-      optional integer maxPostDataSize
-
-  # Returns all browser cookies. Depending on the backend support, will return detailed cookie
-  # information in the `cookies` field.
-  command getAllCookies
-    returns
-      # Array of cookie objects.
-      array of Cookie cookies
-
-  # Returns the DER-encoded certificate.
-  experimental command getCertificate
-    parameters
-      # Origin to get certificate for.
-      string origin
-    returns
-      array of string tableNames
-
-  # Returns all browser cookies for the current URL. Depending on the backend support, will return
-  # detailed cookie information in the `cookies` field.
-  command getCookies
-    parameters
-      # The list of URLs for which applicable cookies will be fetched
-      optional array of string urls
-    returns
-      # Array of cookie objects.
-      array of Cookie cookies
-
-  # Returns content served for the given request.
-  command getResponseBody
-    parameters
-      # Identifier of the network request to get content for.
-      RequestId requestId
-    returns
-      # Response body.
-      string body
-      # True, if content was sent as base64.
-      boolean base64Encoded
-
-  # Returns post data sent with the request. Returns an error when no data was sent with the request.
-  command getRequestPostData
-    parameters
-      # Identifier of the network request to get content for.
-      RequestId requestId
-    returns
-      # Request body string, omitting files from multipart requests
-      string postData
-
-  # Returns content served for the given currently intercepted request.
-  experimental command getResponseBodyForInterception
-    parameters
-      # Identifier for the intercepted request to get body for.
-      InterceptionId interceptionId
-    returns
-      # Response body.
-      string body
-      # True, if content was sent as base64.
-      boolean base64Encoded
-
-  # Returns a handle to the stream representing the response body. Note that after this command,
-  # the intercepted request can't be continued as is -- you either need to cancel it or to provide
-  # the response body. The stream only supports sequential read, IO.read will fail if the position
-  # is specified.
-  experimental command takeResponseBodyForInterceptionAsStream
-    parameters
-      InterceptionId interceptionId
-    returns
-      IO.StreamHandle stream
-
-  # This method sends a new XMLHttpRequest which is identical to the original one. The following
-  # parameters should be identical: method, url, async, request body, extra headers, withCredentials
-  # attribute, user, password.
-  experimental command replayXHR
-    parameters
-      # Identifier of XHR to replay.
-      RequestId requestId
-
-  # Searches for given string in response content.
-  experimental command searchInResponseBody
-    parameters
-      # Identifier of the network response to search.
-      RequestId requestId
-      # String to search for.
-      string query
-      # If true, search is case sensitive.
-      optional boolean caseSensitive
-      # If true, treats string parameter as regex.
-      optional boolean isRegex
-    returns
-      # List of search matches.
-      array of Debugger.SearchMatch result
-
-  # Blocks URLs from loading.
-  experimental command setBlockedURLs
-    parameters
-      # URL patterns to block. Wildcards ('*') are allowed.
-      array of string urls
-
-  # Toggles ignoring of service worker for each request.
-  experimental command setBypassServiceWorker
-    parameters
-      # Bypass service worker and load from network.
-      boolean bypass
-
-  # Toggles ignoring cache for each request. If `true`, cache will not be used.
-  command setCacheDisabled
-    parameters
-      # Cache disabled state.
-      boolean cacheDisabled
-
-  # Sets a cookie with the given cookie data; may overwrite equivalent cookies if they exist.
-  command setCookie
-    parameters
-      # Cookie name.
-      string name
-      # Cookie value.
-      string value
-      # The request-URI to associate with the setting of the cookie. This value can affect the
-      # default domain and path values of the created cookie.
-      optional string url
-      # Cookie domain.
-      optional string domain
-      # Cookie path.
-      optional string path
-      # True if cookie is secure.
-      optional boolean secure
-      # True if cookie is http-only.
-      optional boolean httpOnly
-      # Cookie SameSite type.
-      optional CookieSameSite sameSite
-      # Cookie expiration date, session cookie if not set
-      optional TimeSinceEpoch expires
-    returns
-      # True if successfully set cookie.
-      boolean success
-
-  # Sets given cookies.
-  command setCookies
-    parameters
-      # Cookies to be set.
-      array of CookieParam cookies
-
-  # For testing.
-  experimental command setDataSizeLimitsForTest
-    parameters
-      # Maximum total buffer size.
-      integer maxTotalSize
-      # Maximum per-resource size.
-      integer maxResourceSize
-
-  # Specifies whether to always send extra HTTP headers with the requests from this page.
-  command setExtraHTTPHeaders
-    parameters
-      # Map with extra HTTP headers.
-      Headers headers
-
-  # Sets the requests to intercept that match the provided patterns and optionally resource types.
-  # Deprecated, please use Fetch.enable instead.
-  experimental deprecated command setRequestInterception
-    parameters
-      # Requests matching any of these patterns will be forwarded and wait for the corresponding
-      # continueInterceptedRequest call.
-      array of RequestPattern patterns
-
-  # Allows overriding user agent with the given string.
-  command setUserAgentOverride
-    redirect Emulation
-    parameters
-      # User agent to use.
-      string userAgent
-      # Browser langugage to emulate.
-      optional string acceptLanguage
-      # The platform navigator.platform should return.
-      optional string platform
-
-  # Fired when data chunk was received over the network.
-  event dataReceived
-    parameters
-      # Request identifier.
-      RequestId requestId
-      # Timestamp.
-      MonotonicTime timestamp
-      # Data chunk length.
-      integer dataLength
-      # Actual bytes received (might be less than dataLength for compressed encodings).
-      integer encodedDataLength
-
-  # Fired when EventSource message is received.
-  event eventSourceMessageReceived
-    parameters
-      # Request identifier.
-      RequestId requestId
-      # Timestamp.
-      MonotonicTime timestamp
-      # Message type.
-      string eventName
-      # Message identifier.
-      string eventId
-      # Message content.
-      string data
-
-  # Fired when HTTP request has failed to load.
-  event loadingFailed
-    parameters
-      # Request identifier.
-      RequestId requestId
-      # Timestamp.
-      MonotonicTime timestamp
-      # Resource type.
-      ResourceType type
-      # User friendly error message.
-      string errorText
-      # True if loading was canceled.
-      optional boolean canceled
-      # The reason why loading was blocked, if any.
-      optional BlockedReason blockedReason
-
-  # Fired when HTTP request has finished loading.
-  event loadingFinished
-    parameters
-      # Request identifier.
-      RequestId requestId
-      # Timestamp.
-      MonotonicTime timestamp
-      # Total number of bytes received for this request.
-      number encodedDataLength
-      # Set when 1) response was blocked by Cross-Origin Read Blocking and also
-      # 2) this needs to be reported to the DevTools console.
-      optional boolean shouldReportCorbBlocking
-
-  # Details of an intercepted HTTP request, which must be either allowed, blocked, modified or
-  # mocked.
-  # Deprecated, use Fetch.requestPaused instead.
-  experimental deprecated event requestIntercepted
-    parameters
-      # Each request the page makes will have a unique id, however if any redirects are encountered
-      # while processing that fetch, they will be reported with the same id as the original fetch.
-      # Likewise if HTTP authentication is needed then the same fetch id will be used.
-      InterceptionId interceptionId
-      Request request
-      # The id of the frame that initiated the request.
-      Page.FrameId frameId
-      # How the requested resource will be used.
-      ResourceType resourceType
-      # Whether this is a navigation request, which can abort the navigation completely.
-      boolean isNavigationRequest
-      # Set if the request is a navigation that will result in a download.
-      # Only present after response is received from the server (i.e. HeadersReceived stage).
-      optional boolean isDownload
-      # Redirect location, only sent if a redirect was intercepted.
-      optional string redirectUrl
-      # Details of the Authorization Challenge encountered. If this is set then
-      # continueInterceptedRequest must contain an authChallengeResponse.
-      optional AuthChallenge authChallenge
-      # Response error if intercepted at response stage or if redirect occurred while intercepting
-      # request.
-      optional ErrorReason responseErrorReason
-      # Response code if intercepted at response stage or if redirect occurred while intercepting
-      # request or auth retry occurred.
-      optional integer responseStatusCode
-      # Response headers if intercepted at the response stage or if redirect occurred while
-      # intercepting request or auth retry occurred.
-      optional Headers responseHeaders
-      # If the intercepted request had a corresponding requestWillBeSent event fired for it, then
-      # this requestId will be the same as the requestId present in the requestWillBeSent event.
-      optional RequestId requestId
-
-  # Fired if request ended up loading from cache.
-  event requestServedFromCache
-    parameters
-      # Request identifier.
-      RequestId requestId
-
-  # Fired when page is about to send HTTP request.
-  event requestWillBeSent
-    parameters
-      # Request identifier.
-      RequestId requestId
-      # Loader identifier. Empty string if the request is fetched from worker.
-      LoaderId loaderId
-      # URL of the document this request is loaded for.
-      string documentURL
-      # Request data.
-      Request request
-      # Timestamp.
-      MonotonicTime timestamp
-      # Timestamp.
-      TimeSinceEpoch wallTime
-      # Request initiator.
-      Initiator initiator
-      # Redirect response data.
-      optional Response redirectResponse
-      # Type of this resource.
-      optional ResourceType type
-      # Frame identifier.
-      optional Page.FrameId frameId
-      # Whether the request is initiated by a user gesture. Defaults to false.
-      optional boolean hasUserGesture
-
-  # Fired when resource loading priority is changed
-  experimental event resourceChangedPriority
-    parameters
-      # Request identifier.
-      RequestId requestId
-      # New priority
-      ResourcePriority newPriority
-      # Timestamp.
-      MonotonicTime timestamp
-
-  # Fired when a signed exchange was received over the network
-  experimental event signedExchangeReceived
-    parameters
-      # Request identifier.
-      RequestId requestId
-      # Information about the signed exchange response.
-      SignedExchangeInfo info
-
-  # Fired when HTTP response is available.
-  event responseReceived
-    parameters
-      # Request identifier.
-      RequestId requestId
-      # Loader identifier. Empty string if the request is fetched from worker.
-      LoaderId loaderId
-      # Timestamp.
-      MonotonicTime timestamp
-      # Resource type.
-      ResourceType type
-      # Response data.
-      Response response
-      # Frame identifier.
-      optional Page.FrameId frameId
-
-  # Fired when WebSocket is closed.
-  event webSocketClosed
-    parameters
-      # Request identifier.
-      RequestId requestId
-      # Timestamp.
-      MonotonicTime timestamp
-
-  # Fired upon WebSocket creation.
-  event webSocketCreated
-    parameters
-      # Request identifier.
-      RequestId requestId
-      # WebSocket request URL.
-      string url
-      # Request initiator.
-      optional Initiator initiator
-
-  # Fired when WebSocket message error occurs.
-  event webSocketFrameError
-    parameters
-      # Request identifier.
-      RequestId requestId
-      # Timestamp.
-      MonotonicTime timestamp
-      # WebSocket error message.
-      string errorMessage
-
-  # Fired when WebSocket message is received.
-  event webSocketFrameReceived
-    parameters
-      # Request identifier.
-      RequestId requestId
-      # Timestamp.
-      MonotonicTime timestamp
-      # WebSocket response data.
-      WebSocketFrame response
-
-  # Fired when WebSocket message is sent.
-  event webSocketFrameSent
-    parameters
-      # Request identifier.
-      RequestId requestId
-      # Timestamp.
-      MonotonicTime timestamp
-      # WebSocket response data.
-      WebSocketFrame response
-
-  # Fired when WebSocket handshake response becomes available.
-  event webSocketHandshakeResponseReceived
-    parameters
-      # Request identifier.
-      RequestId requestId
-      # Timestamp.
-      MonotonicTime timestamp
-      # WebSocket response data.
-      WebSocketResponse response
-
-  # Fired when WebSocket is about to initiate handshake.
-  event webSocketWillSendHandshakeRequest
-    parameters
-      # Request identifier.
-      RequestId requestId
-      # Timestamp.
-      MonotonicTime timestamp
-      # UTC Timestamp.
-      TimeSinceEpoch wallTime
-      # WebSocket request data.
-      WebSocketRequest request
-
-  # Fired when additional information about a requestWillBeSent event is available from the
-  # network stack. Not every requestWillBeSent event will have an additional
-  # requestWillBeSentExtraInfo fired for it, and there is no guarantee whether requestWillBeSent
-  # or requestWillBeSentExtraInfo will be fired first for the same request.
-  experimental event requestWillBeSentExtraInfo
-    parameters
-      # Request identifier. Used to match this information to an existing requestWillBeSent event.
-      RequestId requestId
-      # A list of cookies which will not be sent with this request along with corresponding reasons
-      # for blocking.
-      array of BlockedCookieWithReason blockedCookies
-      # Raw request headers as they will be sent over the wire.
-      Headers headers
-
-  # Fired when additional information about a responseReceived event is available from the network
-  # stack. Not every responseReceived event will have an additional responseReceivedExtraInfo for
-  # it, and responseReceivedExtraInfo may be fired before or after responseReceived.
-  experimental event responseReceivedExtraInfo
-    parameters
-      # Request identifier. Used to match this information to another responseReceived event.
-      RequestId requestId
-      # A list of cookies which were not stored from the response along with the corresponding
-      # reasons for blocking. The cookies here may not be valid due to syntax errors, which
-      # are represented by the invalid cookie line string instead of a proper cookie.
-      array of BlockedSetCookieWithReason blockedCookies
-      # Raw response headers as they were received over the wire.
-      Headers headers
-      # Raw response header text as it was received over the wire. The raw text may not always be
-      # available, such as in the case of HTTP/2 or QUIC.
-      optional string headersText
-
-# This domain provides various functionality related to drawing atop the inspected page.
-experimental domain Overlay
-  depends on DOM
-  depends on Page
-  depends on Runtime
-
-  # Configuration data for the highlighting of page elements.
-  type HighlightConfig extends object
-    properties
-      # Whether the node info tooltip should be shown (default: false).
-      optional boolean showInfo
-      # Whether the node styles in the tooltip (default: false).
-      optional boolean showStyles
-      # Whether the rulers should be shown (default: false).
-      optional boolean showRulers
-      # Whether the extension lines from node to the rulers should be shown (default: false).
-      optional boolean showExtensionLines
-      # The content box highlight fill color (default: transparent).
-      optional DOM.RGBA contentColor
-      # The padding highlight fill color (default: transparent).
-      optional DOM.RGBA paddingColor
-      # The border highlight fill color (default: transparent).
-      optional DOM.RGBA borderColor
-      # The margin highlight fill color (default: transparent).
-      optional DOM.RGBA marginColor
-      # The event target element highlight fill color (default: transparent).
-      optional DOM.RGBA eventTargetColor
-      # The shape outside fill color (default: transparent).
-      optional DOM.RGBA shapeColor
-      # The shape margin fill color (default: transparent).
-      optional DOM.RGBA shapeMarginColor
-      # The grid layout color (default: transparent).
-      optional DOM.RGBA cssGridColor
-
-  type InspectMode extends string
-    enum
-      searchForNode
-      searchForUAShadowDOM
-      captureAreaScreenshot
-      showDistances
-      none
-
-  # Disables domain notifications.
-  command disable
-
-  # Enables domain notifications.
-  command enable
-
-  # For testing.
-  command getHighlightObjectForTest
-    parameters
-      # Id of the node to get highlight object for.
-      DOM.NodeId nodeId
-      # Whether to include distance info.
-      optional boolean includeDistance
-      # Whether to include style info.
-      optional boolean includeStyle
-    returns
-      # Highlight data for the node.
-      object highlight
-
-  # Hides any highlight.
-  command hideHighlight
-
-  # Highlights owner element of the frame with given id.
-  command highlightFrame
-    parameters
-      # Identifier of the frame to highlight.
-      Page.FrameId frameId
-      # The content box highlight fill color (default: transparent).
-      optional DOM.RGBA contentColor
-      # The content box highlight outline color (default: transparent).
-      optional DOM.RGBA contentOutlineColor
-
-  # Highlights DOM node with given id or with the given JavaScript object wrapper. Either nodeId or
-  # objectId must be specified.
-  command highlightNode
-    parameters
-      # A descriptor for the highlight appearance.
-      HighlightConfig highlightConfig
-      # Identifier of the node to highlight.
-      optional DOM.NodeId nodeId
-      # Identifier of the backend node to highlight.
-      optional DOM.BackendNodeId backendNodeId
-      # JavaScript object id of the node to be highlighted.
-      optional Runtime.RemoteObjectId objectId
-      # Selectors to highlight relevant nodes.
-      optional string selector
-
-  # Highlights given quad. Coordinates are absolute with respect to the main frame viewport.
-  command highlightQuad
-    parameters
-      # Quad to highlight
-      DOM.Quad quad
-      # The highlight fill color (default: transparent).
-      optional DOM.RGBA color
-      # The highlight outline color (default: transparent).
-      optional DOM.RGBA outlineColor
-
-  # Highlights given rectangle. Coordinates are absolute with respect to the main frame viewport.
-  command highlightRect
-    parameters
-      # X coordinate
-      integer x
-      # Y coordinate
-      integer y
-      # Rectangle width
-      integer width
-      # Rectangle height
-      integer height
-      # The highlight fill color (default: transparent).
-      optional DOM.RGBA color
-      # The highlight outline color (default: transparent).
-      optional DOM.RGBA outlineColor
-
-  # Enters the 'inspect' mode. In this mode, elements that user is hovering over are highlighted.
-  # Backend then generates 'inspectNodeRequested' event upon element selection.
-  command setInspectMode
-    parameters
-      # Set an inspection mode.
-      InspectMode mode
-      # A descriptor for the highlight appearance of hovered-over nodes. May be omitted if `enabled
-      # == false`.
-      optional HighlightConfig highlightConfig
-
-  # Highlights owner element of all frames detected to be ads.
-  command setShowAdHighlights
-    parameters
-      # True for showing ad highlights
-      boolean show
-
-  command setPausedInDebuggerMessage
-    parameters
-      # The message to display, also triggers resume and step over controls.
-      optional string message
-
-  # Requests that backend shows debug borders on layers
-  command setShowDebugBorders
-    parameters
-      # True for showing debug borders
-      boolean show
-
-  # Requests that backend shows the FPS counter
-  command setShowFPSCounter
-    parameters
-      # True for showing the FPS counter
-      boolean show
-
-  # Requests that backend shows paint rectangles
-  command setShowPaintRects
-    parameters
-      # True for showing paint rectangles
-      boolean result
-
-  # Requests that backend shows layout shift regions
-  command setShowLayoutShiftRegions
-    parameters
-      # True for showing layout shift regions
-      boolean result
-
-  # Requests that backend shows scroll bottleneck rects
-  command setShowScrollBottleneckRects
-    parameters
-      # True for showing scroll bottleneck rects
-      boolean show
-
-  # Requests that backend shows hit-test borders on layers
-  command setShowHitTestBorders
-    parameters
-      # True for showing hit-test borders
-      boolean show
-
-  # Paints viewport size upon main frame resize.
-  command setShowViewportSizeOnResize
-    parameters
-      # Whether to paint size or not.
-      boolean show
-
-  # Fired when the node should be inspected. This happens after call to `setInspectMode` or when
-  # user manually inspects an element.
-  event inspectNodeRequested
-    parameters
-      # Id of the node to inspect.
-      DOM.BackendNodeId backendNodeId
-
-  # Fired when the node should be highlighted. This happens after call to `setInspectMode`.
-  event nodeHighlightRequested
-    parameters
-      DOM.NodeId nodeId
-
-  # Fired when user asks to capture screenshot of some area on the page.
-  event screenshotRequested
-    parameters
-      # Viewport to capture, in device independent pixels (dip).
-      Page.Viewport viewport
-
-  # Fired when user cancels the inspect mode.
-  event inspectModeCanceled
-
-# Actions and events related to the inspected page belong to the page domain.
-domain Page
-  depends on Debugger
-  depends on DOM
-  depends on IO
-  depends on Network
-  depends on Runtime
-
-  # Unique frame identifier.
-  type FrameId extends string
-
-  # Information about the Frame on the page.
-  type Frame extends object
-    properties
-      # Frame unique identifier.
-      FrameId id
-      # Parent frame identifier.
-      optional string parentId
-      # Identifier of the loader associated with this frame.
-      Network.LoaderId loaderId
-      # Frame's name as specified in the tag.
-      optional string name
-      # Frame document's URL without fragment.
-      string url
-      # Frame document's URL fragment including the '#'.
-      experimental optional string urlFragment
-      # Frame document's security origin.
-      string securityOrigin
-      # Frame document's mimeType as determined by the browser.
-      string mimeType
-      # If the frame failed to load, this contains the URL that could not be loaded. Note that unlike url above, this URL may contain a fragment.
-      experimental optional string unreachableUrl
-
-  # Information about the Resource on the page.
-  experimental type FrameResource extends object
-    properties
-      # Resource URL.
-      string url
-      # Type of this resource.
-      Network.ResourceType type
-      # Resource mimeType as determined by the browser.
-      string mimeType
-      # last-modified timestamp as reported by server.
-      optional Network.TimeSinceEpoch lastModified
-      # Resource content size.
-      optional number contentSize
-      # True if the resource failed to load.
-      optional boolean failed
-      # True if the resource was canceled during loading.
-      optional boolean canceled
-
-  # Information about the Frame hierarchy along with their cached resources.
-  experimental type FrameResourceTree extends object
-    properties
-      # Frame information for this tree item.
-      Frame frame
-      # Child frames.
-      optional array of FrameResourceTree childFrames
-      # Information about frame resources.
-      array of FrameResource resources
-
-  # Information about the Frame hierarchy.
-  type FrameTree extends object
-    properties
-      # Frame information for this tree item.
-      Frame frame
-      # Child frames.
-      optional array of FrameTree childFrames
-
-  # Unique script identifier.
-  type ScriptIdentifier extends string
-
-  # Transition type.
-  type TransitionType extends string
-    enum
-      link
-      typed
-      address_bar
-      auto_bookmark
-      auto_subframe
-      manual_subframe
-      generated
-      auto_toplevel
-      form_submit
-      reload
-      keyword
-      keyword_generated
-      other
-
-  # Navigation history entry.
-  type NavigationEntry extends object
-    properties
-      # Unique id of the navigation history entry.
-      integer id
-      # URL of the navigation history entry.
-      string url
-      # URL that the user typed in the url bar.
-      string userTypedURL
-      # Title of the navigation history entry.
-      string title
-      # Transition type.
-      TransitionType transitionType
-
-  # Screencast frame metadata.
-  experimental type ScreencastFrameMetadata extends object
-    properties
-      # Top offset in DIP.
-      number offsetTop
-      # Page scale factor.
-      number pageScaleFactor
-      # Device screen width in DIP.
-      number deviceWidth
-      # Device screen height in DIP.
-      number deviceHeight
-      # Position of horizontal scroll in CSS pixels.
-      number scrollOffsetX
-      # Position of vertical scroll in CSS pixels.
-      number scrollOffsetY
-      # Frame swap timestamp.
-      optional Network.TimeSinceEpoch timestamp
-
-  # Javascript dialog type.
-  type DialogType extends string
-    enum
-      alert
-      confirm
-      prompt
-      beforeunload
-
-  # Error while paring app manifest.
-  type AppManifestError extends object
-    properties
-      # Error message.
-      string message
-      # If criticial, this is a non-recoverable parse error.
-      integer critical
-      # Error line.
-      integer line
-      # Error column.
-      integer column
-
-  # Layout viewport position and dimensions.
-  type LayoutViewport extends object
-    properties
-      # Horizontal offset relative to the document (CSS pixels).
-      integer pageX
-      # Vertical offset relative to the document (CSS pixels).
-      integer pageY
-      # Width (CSS pixels), excludes scrollbar if present.
-      integer clientWidth
-      # Height (CSS pixels), excludes scrollbar if present.
-      integer clientHeight
-
-  # Visual viewport position, dimensions, and scale.
-  type VisualViewport extends object
-    properties
-      # Horizontal offset relative to the layout viewport (CSS pixels).
-      number offsetX
-      # Vertical offset relative to the layout viewport (CSS pixels).
-      number offsetY
-      # Horizontal offset relative to the document (CSS pixels).
-      number pageX
-      # Vertical offset relative to the document (CSS pixels).
-      number pageY
-      # Width (CSS pixels), excludes scrollbar if present.
-      number clientWidth
-      # Height (CSS pixels), excludes scrollbar if present.
-      number clientHeight
-      # Scale relative to the ideal viewport (size at width=device-width).
-      number scale
-      # Page zoom factor (CSS to device independent pixels ratio).
-      optional number zoom
-
-  # Viewport for capturing screenshot.
-  type Viewport extends object
-    properties
-      # X offset in device independent pixels (dip).
-      number x
-      # Y offset in device independent pixels (dip).
-      number y
-      # Rectangle width in device independent pixels (dip).
-      number width
-      # Rectangle height in device independent pixels (dip).
-      number height
-      # Page scale factor.
-      number scale
-
-  # Generic font families collection.
-  experimental type FontFamilies extends object
-    properties
-      # The standard font-family.
-      optional string standard
-      # The fixed font-family.
-      optional string fixed
-      # The serif font-family.
-      optional string serif
-      # The sansSerif font-family.
-      optional string sansSerif
-      # The cursive font-family.
-      optional string cursive
-      # The fantasy font-family.
-      optional string fantasy
-      # The pictograph font-family.
-      optional string pictograph
-
-  # Default font sizes.
-  experimental type FontSizes extends object
-    properties
-      # Default standard font size.
-      optional integer standard
-      # Default fixed font size.
-      optional integer fixed
-
-  experimental type ClientNavigationReason extends string
-    enum
-      formSubmissionGet
-      formSubmissionPost
-      httpHeaderRefresh
-      scriptInitiated
-      metaTagRefresh
-      pageBlockInterstitial
-      reload
-
-  # Deprecated, please use addScriptToEvaluateOnNewDocument instead.
-  experimental deprecated command addScriptToEvaluateOnLoad
-    parameters
-      string scriptSource
-    returns
-      # Identifier of the added script.
-      ScriptIdentifier identifier
-
-  # Evaluates given script in every frame upon creation (before loading frame's scripts).
-  command addScriptToEvaluateOnNewDocument
-    parameters
-      string source
-      # If specified, creates an isolated world with the given name and evaluates given script in it.
-      # This world name will be used as the ExecutionContextDescription::name when the corresponding
-      # event is emitted.
-      experimental optional string worldName
-    returns
-      # Identifier of the added script.
-      ScriptIdentifier identifier
-
-  # Brings page to front (activates tab).
-  command bringToFront
-
-  # Capture page screenshot.
-  command captureScreenshot
-    parameters
-      # Image compression format (defaults to png).
-      optional enum format
-        jpeg
-        png
-      # Compression quality from range [0..100] (jpeg only).
-      optional integer quality
-      # Capture the screenshot of a given region only.
-      optional Viewport clip
-      # Capture the screenshot from the surface, rather than the view. Defaults to true.
-      experimental optional boolean fromSurface
-    returns
-      # Base64-encoded image data.
-      binary data
-
-  # Returns a snapshot of the page as a string. For MHTML format, the serialization includes
-  # iframes, shadow DOM, external resources, and element-inline styles.
-  experimental command captureSnapshot
-    parameters
-      # Format (defaults to mhtml).
-      optional enum format
-        mhtml
-    returns
-      # Serialized page data.
-      string data
-
-  # Clears the overriden device metrics.
-  experimental deprecated command clearDeviceMetricsOverride
-    # Use 'Emulation.clearDeviceMetricsOverride' instead
-    redirect Emulation
-
-  # Clears the overridden Device Orientation.
-  experimental deprecated command clearDeviceOrientationOverride
-    # Use 'DeviceOrientation.clearDeviceOrientationOverride' instead
-    redirect DeviceOrientation
-
-  # Clears the overriden Geolocation Position and Error.
-  deprecated command clearGeolocationOverride
-    # Use 'Emulation.clearGeolocationOverride' instead
-    redirect Emulation
-
-  # Creates an isolated world for the given frame.
-  command createIsolatedWorld
-    parameters
-      # Id of the frame in which the isolated world should be created.
-      FrameId frameId
-      # An optional name which is reported in the Execution Context.
-      optional string worldName
-      # Whether or not universal access should be granted to the isolated world. This is a powerful
-      # option, use with caution.
-      optional boolean grantUniveralAccess
-    returns
-      # Execution context of the isolated world.
-      Runtime.ExecutionContextId executionContextId
-
-  # Deletes browser cookie with given name, domain and path.
-  experimental deprecated command deleteCookie
-    # Use 'Network.deleteCookie' instead
-    redirect Network
-    parameters
-      # Name of the cookie to remove.
-      string cookieName
-      # URL to match cooke domain and path.
-      string url
-
-  # Disables page domain notifications.
-  command disable
-
-  # Enables page domain notifications.
-  command enable
-
-  command getAppManifest
-    returns
-      # Manifest location.
-      string url
-      array of AppManifestError errors
-      # Manifest content.
-      optional string data
-
-  experimental command getInstallabilityErrors
-    returns
-      array of string errors
-
-  # Returns all browser cookies. Depending on the backend support, will return detailed cookie
-  # information in the `cookies` field.
-  experimental deprecated command getCookies
-    # Use 'Network.getCookies' instead
-    redirect Network
-    returns
-      # Array of cookie objects.
-      array of Network.Cookie cookies
-
-  # Returns present frame tree structure.
-  command getFrameTree
-    returns
-      # Present frame tree structure.
-      FrameTree frameTree
-
-  # Returns metrics relating to the layouting of the page, such as viewport bounds/scale.
-  command getLayoutMetrics
-    returns
-      # Metrics relating to the layout viewport.
-      LayoutViewport layoutViewport
-      # Metrics relating to the visual viewport.
-      VisualViewport visualViewport
-      # Size of scrollable area.
-      DOM.Rect contentSize
-
-  # Returns navigation history for the current page.
-  command getNavigationHistory
-    returns
-      # Index of the current navigation history entry.
-      integer currentIndex
-      # Array of navigation history entries.
-      array of NavigationEntry entries
-
-  # Resets navigation history for the current page.
-  command resetNavigationHistory
-
-  # Returns content of the given resource.
-  experimental command getResourceContent
-    parameters
-      # Frame id to get resource for.
-      FrameId frameId
-      # URL of the resource to get content for.
-      string url
-    returns
-      # Resource content.
-      string content
-      # True, if content was served as base64.
-      boolean base64Encoded
-
-  # Returns present frame / resource tree structure.
-  experimental command getResourceTree
-    returns
-      # Present frame / resource tree structure.
-      FrameResourceTree frameTree
-
-  # Accepts or dismisses a JavaScript initiated dialog (alert, confirm, prompt, or onbeforeunload).
-  command handleJavaScriptDialog
-    parameters
-      # Whether to accept or dismiss the dialog.
-      boolean accept
-      # The text to enter into the dialog prompt before accepting. Used only if this is a prompt
-      # dialog.
-      optional string promptText
-
-  # Navigates current page to the given URL.
-  command navigate
-    parameters
-      # URL to navigate the page to.
-      string url
-      # Referrer URL.
-      optional string referrer
-      # Intended transition type.
-      optional TransitionType transitionType
-      # Frame id to navigate, if not specified navigates the top frame.
-      optional FrameId frameId
-    returns
-      # Frame id that has navigated (or failed to navigate)
-      FrameId frameId
-      # Loader identifier.
-      optional Network.LoaderId loaderId
-      # User friendly error message, present if and only if navigation has failed.
-      optional string errorText
-
-  # Navigates current page to the given history entry.
-  command navigateToHistoryEntry
-    parameters
-      # Unique id of the entry to navigate to.
-      integer entryId
-
-  # Print page as PDF.
-  command printToPDF
-    parameters
-      # Paper orientation. Defaults to false.
-      optional boolean landscape
-      # Display header and footer. Defaults to false.
-      optional boolean displayHeaderFooter
-      # Print background graphics. Defaults to false.
-      optional boolean printBackground
-      # Scale of the webpage rendering. Defaults to 1.
-      optional number scale
-      # Paper width in inches. Defaults to 8.5 inches.
-      optional number paperWidth
-      # Paper height in inches. Defaults to 11 inches.
-      optional number paperHeight
-      # Top margin in inches. Defaults to 1cm (~0.4 inches).
-      optional number marginTop
-      # Bottom margin in inches. Defaults to 1cm (~0.4 inches).
-      optional number marginBottom
-      # Left margin in inches. Defaults to 1cm (~0.4 inches).
-      optional number marginLeft
-      # Right margin in inches. Defaults to 1cm (~0.4 inches).
-      optional number marginRight
-      # Paper ranges to print, e.g., '1-5, 8, 11-13'. Defaults to the empty string, which means
-      # print all pages.
-      optional string pageRanges
-      # Whether to silently ignore invalid but successfully parsed page ranges, such as '3-2'.
-      # Defaults to false.
-      optional boolean ignoreInvalidPageRanges
-      # HTML template for the print header. Should be valid HTML markup with following
-      # classes used to inject printing values into them:
-      # - `date`: formatted print date
-      # - `title`: document title
-      # - `url`: document location
-      # - `pageNumber`: current page number
-      # - `totalPages`: total pages in the document
-      #
-      # For example, `<span class=title></span>` would generate span containing the title.
-      optional string headerTemplate
-      # HTML template for the print footer. Should use the same format as the `headerTemplate`.
-      optional string footerTemplate
-      # Whether or not to prefer page size as defined by css. Defaults to false,
-      # in which case the content will be scaled to fit the paper size.
-      optional boolean preferCSSPageSize
-      # return as stream
-      experimental optional enum transferMode
-        ReturnAsBase64
-        ReturnAsStream
-    returns
-      # Base64-encoded pdf data. Empty if |returnAsStream| is specified.
-      binary data
-      # A handle of the stream that holds resulting PDF data.
-      experimental optional IO.StreamHandle stream
-
-  # Reloads given page optionally ignoring the cache.
-  command reload
-    parameters
-      # If true, browser cache is ignored (as if the user pressed Shift+refresh).
-      optional boolean ignoreCache
-      # If set, the script will be injected into all frames of the inspected page after reload.
-      # Argument will be ignored if reloading dataURL origin.
-      optional string scriptToEvaluateOnLoad
-
-  # Deprecated, please use removeScriptToEvaluateOnNewDocument instead.
-  experimental deprecated command removeScriptToEvaluateOnLoad
-    parameters
-      ScriptIdentifier identifier
-
-  # Removes given script from the list.
-  command removeScriptToEvaluateOnNewDocument
-    parameters
-      ScriptIdentifier identifier
-
-  # Acknowledges that a screencast frame has been received by the frontend.
-  experimental command screencastFrameAck
-    parameters
-      # Frame number.
-      integer sessionId
-
-  # Searches for given string in resource content.
-  experimental command searchInResource
-    parameters
-      # Frame id for resource to search in.
-      FrameId frameId
-      # URL of the resource to search in.
-      string url
-      # String to search for.
-      string query
-      # If true, search is case sensitive.
-      optional boolean caseSensitive
-      # If true, treats string parameter as regex.
-      optional boolean isRegex
-    returns
-      # List of search matches.
-      array of Debugger.SearchMatch result
-
-  # Enable Chrome's experimental ad filter on all sites.
-  experimental command setAdBlockingEnabled
-    parameters
-      # Whether to block ads.
-      boolean enabled
-
-  # Enable page Content Security Policy by-passing.
-  experimental command setBypassCSP
-    parameters
-      # Whether to bypass page CSP.
-      boolean enabled
-
-  # Overrides the values of device screen dimensions (window.screen.width, window.screen.height,
-  # window.innerWidth, window.innerHeight, and "device-width"/"device-height"-related CSS media
-  # query results).
-  experimental deprecated command setDeviceMetricsOverride
-    # Use 'Emulation.setDeviceMetricsOverride' instead
-    redirect Emulation
-    parameters
-      # Overriding width value in pixels (minimum 0, maximum 10000000). 0 disables the override.
-      integer width
-      # Overriding height value in pixels (minimum 0, maximum 10000000). 0 disables the override.
-      integer height
-      # Overriding device scale factor value. 0 disables the override.
-      number deviceScaleFactor
-      # Whether to emulate mobile device. This includes viewport meta tag, overlay scrollbars, text
-      # autosizing and more.
-      boolean mobile
-      # Scale to apply to resulting view image.
-      optional number scale
-      # Overriding screen width value in pixels (minimum 0, maximum 10000000).
-      optional integer screenWidth
-      # Overriding screen height value in pixels (minimum 0, maximum 10000000).
-      optional integer screenHeight
-      # Overriding view X position on screen in pixels (minimum 0, maximum 10000000).
-      optional integer positionX
-      # Overriding view Y position on screen in pixels (minimum 0, maximum 10000000).
-      optional integer positionY
-      # Do not set visible view size, rely upon explicit setVisibleSize call.
-      optional boolean dontSetVisibleSize
-      # Screen orientation override.
-      optional Emulation.ScreenOrientation screenOrientation
-      # The viewport dimensions and scale. If not set, the override is cleared.
-      optional Viewport viewport
-
-  # Overrides the Device Orientation.
-  experimental deprecated command setDeviceOrientationOverride
-    # Use 'DeviceOrientation.setDeviceOrientationOverride' instead
-    redirect DeviceOrientation
-    parameters
-      # Mock alpha
-      number alpha
-      # Mock beta
-      number beta
-      # Mock gamma
-      number gamma
-
-  # Set generic font families.
-  experimental command setFontFamilies
-    parameters
-      # Specifies font families to set. If a font family is not specified, it won't be changed.
-      FontFamilies fontFamilies
-
-  # Set default font sizes.
-  experimental command setFontSizes
-    parameters
-      # Specifies font sizes to set. If a font size is not specified, it won't be changed.
-      FontSizes fontSizes
-
-  # Sets given markup as the document's HTML.
-  command setDocumentContent
-    parameters
-      # Frame id to set HTML for.
-      FrameId frameId
-      # HTML content to set.
-      string html
-
-  # Set the behavior when downloading a file.
-  experimental command setDownloadBehavior
-    parameters
-      # Whether to allow all or deny all download requests, or use default Chrome behavior if
-      # available (otherwise deny).
-      enum behavior
-        deny
-        allow
-        default
-      # The default path to save downloaded files to. This is requred if behavior is set to 'allow'
-      optional string downloadPath
-
-  # Overrides the Geolocation Position or Error. Omitting any of the parameters emulates position
-  # unavailable.
-  deprecated command setGeolocationOverride
-    # Use 'Emulation.setGeolocationOverride' instead
-    redirect Emulation
-    parameters
-      # Mock latitude
-      optional number latitude
-      # Mock longitude
-      optional number longitude
-      # Mock accuracy
-      optional number accuracy
-
-  # Controls whether page will emit lifecycle events.
-  experimental command setLifecycleEventsEnabled
-    parameters
-      # If true, starts emitting lifecycle events.
-      boolean enabled
-
-  # Toggles mouse event-based touch event emulation.
-  experimental deprecated command setTouchEmulationEnabled
-    # Use 'Emulation.setTouchEmulationEnabled' instead
-    redirect Emulation
-    parameters
-      # Whether the touch event emulation should be enabled.
-      boolean enabled
-      # Touch/gesture events configuration. Default: current platform.
-      optional enum configuration
-        mobile
-        desktop
-
-  # Starts sending each frame using the `screencastFrame` event.
-  experimental command startScreencast
-    parameters
-      # Image compression format.
-      optional enum format
-        jpeg
-        png
-      # Compression quality from range [0..100].
-      optional integer quality
-      # Maximum screenshot width.
-      optional integer maxWidth
-      # Maximum screenshot height.
-      optional integer maxHeight
-      # Send every n-th frame.
-      optional integer everyNthFrame
-
-  # Force the page stop all navigations and pending resource fetches.
-  command stopLoading
-
-  # Crashes renderer on the IO thread, generates minidumps.
-  experimental command crash
-
-  # Tries to close page, running its beforeunload hooks, if any.
-  experimental command close
-
-  # Tries to update the web lifecycle state of the page.
-  # It will transition the page to the given state according to:
-  # https://github.com/WICG/web-lifecycle/
-  experimental command setWebLifecycleState
-    parameters
-      # Target lifecycle state
-      enum state
-        frozen
-        active
-
-  # Stops sending each frame in the `screencastFrame`.
-  experimental command stopScreencast
-
-  # Forces compilation cache to be generated for every subresource script.
-  experimental command setProduceCompilationCache
-    parameters
-      boolean enabled
-
-  # Seeds compilation cache for given url. Compilation cache does not survive
-  # cross-process navigation.
-  experimental command addCompilationCache
-    parameters
-      string url
-      # Base64-encoded data
-      binary data
-
-  # Clears seeded compilation cache.
-  experimental command clearCompilationCache
-
-  # Generates a report for testing.
-  experimental command generateTestReport
-    parameters
-      # Message to be displayed in the report.
-      string message
-      # Specifies the endpoint group to deliver the report to.
-      optional string group
-
-  # Pauses page execution. Can be resumed using generic Runtime.runIfWaitingForDebugger.
-  experimental command waitForDebugger
-
-  # Intercept file chooser requests and transfer control to protocol clients.
-  # When file chooser interception is enabled, native file chooser dialog is not shown.
-  # Instead, a protocol event `Page.fileChooserOpened` is emitted.
-  experimental command setInterceptFileChooserDialog
-    parameters
-      boolean enabled
-
-  event domContentEventFired
-    parameters
-      Network.MonotonicTime timestamp
-
-  # Emitted only when `page.interceptFileChooser` is enabled.
-  event fileChooserOpened
-    parameters
-      # Id of the frame containing input node.
-      experimental FrameId frameId
-      # Input node id.
-      experimental DOM.BackendNodeId backendNodeId
-      # Input mode.
-      enum mode
-        selectSingle
-        selectMultiple
-
-  # Fired when frame has been attached to its parent.
-  event frameAttached
-    parameters
-      # Id of the frame that has been attached.
-      FrameId frameId
-      # Parent frame identifier.
-      FrameId parentFrameId
-      # JavaScript stack trace of when frame was attached, only set if frame initiated from script.
-      optional Runtime.StackTrace stack
-
-  # Fired when frame no longer has a scheduled navigation.
-  deprecated event frameClearedScheduledNavigation
-    parameters
-      # Id of the frame that has cleared its scheduled navigation.
-      FrameId frameId
-
-  # Fired when frame has been detached from its parent.
-  event frameDetached
-    parameters
-      # Id of the frame that has been detached.
-      FrameId frameId
-
-  # Fired once navigation of the frame has completed. Frame is now associated with the new loader.
-  event frameNavigated
-    parameters
-      # Frame object.
-      Frame frame
-
-  experimental event frameResized
-
-  # Fired when a renderer-initiated navigation is requested.
-  # Navigation may still be cancelled after the event is issued.
-  experimental event frameRequestedNavigation
-    parameters
-      # Id of the frame that is being navigated.
-      FrameId frameId
-      # The reason for the navigation.
-      ClientNavigationReason reason
-      # The destination URL for the requested navigation.
-      string url
-
-  # Fired when frame schedules a potential navigation.
-  deprecated event frameScheduledNavigation
-    parameters
-      # Id of the frame that has scheduled a navigation.
-      FrameId frameId
-      # Delay (in seconds) until the navigation is scheduled to begin. The navigation is not
-      # guaranteed to start.
-      number delay
-      # The reason for the navigation.
-      enum reason
-        formSubmissionGet
-        formSubmissionPost
-        httpHeaderRefresh
-        scriptInitiated
-        metaTagRefresh
-        pageBlockInterstitial
-        reload
-      # The destination URL for the scheduled navigation.
-      string url
-
-  # Fired when frame has started loading.
-  experimental event frameStartedLoading
-    parameters
-      # Id of the frame that has started loading.
-      FrameId frameId
-
-  # Fired when frame has stopped loading.
-  experimental event frameStoppedLoading
-    parameters
-      # Id of the frame that has stopped loading.
-      FrameId frameId
-
-  # Fired when page is about to start a download.
-  experimental event downloadWillBegin
-    parameters
-      # Id of the frame that caused download to begin.
-      FrameId frameId
-      # URL of the resource being downloaded.
-      string url
-
-  # Fired when interstitial page was hidden
-  event interstitialHidden
-
-  # Fired when interstitial page was shown
-  event interstitialShown
-
-  # Fired when a JavaScript initiated dialog (alert, confirm, prompt, or onbeforeunload) has been
-  # closed.
-  event javascriptDialogClosed
-    parameters
-      # Whether dialog was confirmed.
-      boolean result
-      # User input in case of prompt.
-      string userInput
-
-  # Fired when a JavaScript initiated dialog (alert, confirm, prompt, or onbeforeunload) is about to
-  # open.
-  event javascriptDialogOpening
-    parameters
-      # Frame url.
-      string url
-      # Message that will be displayed by the dialog.
-      string message
-      # Dialog type.
-      DialogType type
-      # True iff browser is capable showing or acting on the given dialog. When browser has no
-      # dialog handler for given target, calling alert while Page domain is engaged will stall
-      # the page execution. Execution can be resumed via calling Page.handleJavaScriptDialog.
-      boolean hasBrowserHandler
-      # Default dialog prompt.
-      optional string defaultPrompt
-
-  # Fired for top level page lifecycle events such as navigation, load, paint, etc.
-  event lifecycleEvent
-    parameters
-      # Id of the frame.
-      FrameId frameId
-      # Loader identifier. Empty string if the request is fetched from worker.
-      Network.LoaderId loaderId
-      string name
-      Network.MonotonicTime timestamp
-
-  event loadEventFired
-    parameters
-      Network.MonotonicTime timestamp
-
-  # Fired when same-document navigation happens, e.g. due to history API usage or anchor navigation.
-  experimental event navigatedWithinDocument
-    parameters
-      # Id of the frame.
-      FrameId frameId
-      # Frame's new url.
-      string url
-
-  # Compressed image data requested by the `startScreencast`.
-  experimental event screencastFrame
-    parameters
-      # Base64-encoded compressed image.
-      binary data
-      # Screencast frame metadata.
-      ScreencastFrameMetadata metadata
-      # Frame number.
-      integer sessionId
-
-  # Fired when the page with currently enabled screencast was shown or hidden `.
-  experimental event screencastVisibilityChanged
-    parameters
-      # True if the page is visible.
-      boolean visible
-
-  # Fired when a new window is going to be opened, via window.open(), link click, form submission,
-  # etc.
-  event windowOpen
-    parameters
-      # The URL for the new window.
-      string url
-      # Window name.
-      string windowName
-      # An array of enabled window features.
-      array of string windowFeatures
-      # Whether or not it was triggered by user gesture.
-      boolean userGesture
-
-  # Issued for every compilation cache generated. Is only available
-  # if Page.setGenerateCompilationCache is enabled.
-  experimental event compilationCacheProduced
-    parameters
-      string url
-      # Base64-encoded data
-      binary data
-
-domain Performance
-
-  # Run-time execution metric.
-  type Metric extends object
-    properties
-      # Metric name.
-      string name
-      # Metric value.
-      number value
-
-  # Disable collecting and reporting metrics.
-  command disable
-
-  # Enable collecting and reporting metrics.
-  command enable
-
-  # Sets time domain to use for collecting and reporting duration metrics.
-  # Note that this must be called before enabling metrics collection. Calling
-  # this method while metrics collection is enabled returns an error.
-  experimental command setTimeDomain
-    parameters
-      # Time domain
-      enum timeDomain
-        # Use monotonically increasing abstract time (default).
-        timeTicks
-        # Use thread running time.
-        threadTicks
-
-  # Retrieve current values of run-time metrics.
-  command getMetrics
-    returns
-      # Current values for run-time metrics.
-      array of Metric metrics
-
-  # Current values of the metrics.
-  event metrics
-    parameters
-      # Current values of the metrics.
-      array of Metric metrics
-      # Timestamp title.
-      string title
-
-# Security
-domain Security
-
-  # An internal certificate ID value.
-  type CertificateId extends integer
-
-  # A description of mixed content (HTTP resources on HTTPS pages), as defined by
-  # https://www.w3.org/TR/mixed-content/#categories
-  type MixedContentType extends string
-    enum
-      blockable
-      optionally-blockable
-      none
-
-  # The security level of a page or resource.
-  type SecurityState extends string
-    enum
-      unknown
-      neutral
-      insecure
-      secure
-      info
-      insecure-broken
-
-  # Details about the security state of the page certificate.
-  experimental type CertificateSecurityState extends object
-    properties
-      # Protocol name (e.g. "TLS 1.2" or "QUIC").
-      string protocol
-      # Key Exchange used by the connection, or the empty string if not applicable.
-      string keyExchange
-      # (EC)DH group used by the connection, if applicable.
-      optional string keyExchangeGroup
-      # Cipher name.
-      string cipher
-      # TLS MAC. Note that AEAD ciphers do not have separate MACs.
-      optional string mac
-      # Page certificate.
-      array of string certificate
-      # Certificate subject name.
-      string subjectName
-      # Name of the issuing CA.
-      string issuer
-      # Certificate valid from date.
-      Network.TimeSinceEpoch validFrom
-      # Certificate valid to (expiration) date
-      Network.TimeSinceEpoch validTo
-      # The highest priority network error code, if the certificate has an error.
-      optional string certificateNetworkError
-      # True if the certificate uses a weak signature aglorithm.
-      boolean certificateHasWeakSignature
-      # True if the certificate has a SHA1 signature in the chain.
-      boolean certificateHasSha1Signature
-      # True if modern SSL
-      boolean modernSSL
-      # True if the connection is using an obsolete SSL protocol.
-      boolean obsoleteSslProtocol
-      # True if the connection is using an obsolete SSL key exchange.
-      boolean obsoleteSslKeyExchange
-      # True if the connection is using an obsolete SSL cipher.
-      boolean obsoleteSslCipher
-      # True if the connection is using an obsolete SSL signature.
-      boolean obsoleteSslSignature
-
-  experimental type SafetyTipStatus extends string
-    enum
-      badReputation
-      lookalike
-
-  experimental type SafetyTipInfo extends object
-    properties
-      # Describes whether the page triggers any safety tips or reputation warnings. Default is unknown.
-      SafetyTipStatus safetyTipStatus
-      # The URL the safety tip suggested ("Did you mean?"). Only filled in for lookalike matches.
-      optional string safeUrl
-
-  # Security state information about the page.
-  experimental type VisibleSecurityState extends object
-    properties
-      # The security level of the page.
-      SecurityState securityState
-      # Security state details about the page certificate.
-      optional CertificateSecurityState certificateSecurityState
-      # The type of Safety Tip triggered on the page. Note that this field will be set even if the Safety Tip UI was not actually shown.
-      optional SafetyTipInfo safetyTipInfo
-      # Array of security state issues ids.
-      array of string securityStateIssueIds
-
-  # An explanation of an factor contributing to the security state.
-  type SecurityStateExplanation extends object
-    properties
-      # Security state representing the severity of the factor being explained.
-      SecurityState securityState
-      # Title describing the type of factor.
-      string title
-      # Short phrase describing the type of factor.
-      string summary
-      # Full text explanation of the factor.
-      string description
-      # The type of mixed content described by the explanation.
-      MixedContentType mixedContentType
-      # Page certificate.
-      array of string certificate
-      # Recommendations to fix any issues.
-      optional array of string recommendations
-
-  # Information about insecure content on the page.
-  deprecated type InsecureContentStatus extends object
-    properties
-      # Always false.
-      boolean ranMixedContent
-      # Always false.
-      boolean displayedMixedContent
-      # Always false.
-      boolean containedMixedForm
-      # Always false.
-      boolean ranContentWithCertErrors
-      # Always false.
-      boolean displayedContentWithCertErrors
-      # Always set to unknown.
-      SecurityState ranInsecureContentStyle
-      # Always set to unknown.
-      SecurityState displayedInsecureContentStyle
-
-  # The action to take when a certificate error occurs. continue will continue processing the
-  # request and cancel will cancel the request.
-  type CertificateErrorAction extends string
-    enum
-      continue
-      cancel
-
-  # Disables tracking security state changes.
-  command disable
-
-  # Enables tracking security state changes.
-  command enable
-
-  # Enable/disable whether all certificate errors should be ignored.
-  experimental command setIgnoreCertificateErrors
-    parameters
-      # If true, all certificate errors will be ignored.
-      boolean ignore
-
-  # Handles a certificate error that fired a certificateError event.
-  deprecated command handleCertificateError
-    parameters
-      # The ID of the event.
-      integer eventId
-      # The action to take on the certificate error.
-      CertificateErrorAction action
-
-  # Enable/disable overriding certificate errors. If enabled, all certificate error events need to
-  # be handled by the DevTools client and should be answered with `handleCertificateError` commands.
-  deprecated command setOverrideCertificateErrors
-    parameters
-      # If true, certificate errors will be overridden.
-      boolean override
-
-  # There is a certificate error. If overriding certificate errors is enabled, then it should be
-  # handled with the `handleCertificateError` command. Note: this event does not fire if the
-  # certificate error has been allowed internally. Only one client per target should override
-  # certificate errors at the same time.
-  deprecated event certificateError
-    parameters
-      # The ID of the event.
-      integer eventId
-      # The type of the error.
-      string errorType
-      # The url that was requested.
-      string requestURL
-
-  # The security state of the page changed.
-  experimental event visibleSecurityStateChanged
-    parameters
-      # Security state information about the page.
-      VisibleSecurityState visibleSecurityState
-
-  # The security state of the page changed.
-  event securityStateChanged
-    parameters
-      # Security state.
-      SecurityState securityState
-      # True if the page was loaded over cryptographic transport such as HTTPS.
-      deprecated boolean schemeIsCryptographic
-      # List of explanations for the security state. If the overall security state is `insecure` or
-      # `warning`, at least one corresponding explanation should be included.
-      array of SecurityStateExplanation explanations
-      # Information about insecure content on the page.
-      deprecated InsecureContentStatus insecureContentStatus
-      # Overrides user-visible description of the state.
-      optional string summary
-
-experimental domain ServiceWorker
-  type RegistrationID extends string
-
-  # ServiceWorker registration.
-  type ServiceWorkerRegistration extends object
-    properties
-      RegistrationID registrationId
-      string scopeURL
-      boolean isDeleted
-
-  type ServiceWorkerVersionRunningStatus extends string
-    enum
-      stopped
-      starting
-      running
-      stopping
-
-  type ServiceWorkerVersionStatus extends string
-    enum
-      new
-      installing
-      installed
-      activating
-      activated
-      redundant
-
-  # ServiceWorker version.
-  type ServiceWorkerVersion extends object
-    properties
-      string versionId
-      RegistrationID registrationId
-      string scriptURL
-      ServiceWorkerVersionRunningStatus runningStatus
-      ServiceWorkerVersionStatus status
-      # The Last-Modified header value of the main script.
-      optional number scriptLastModified
-      # The time at which the response headers of the main script were received from the server.
-      # For cached script it is the last time the cache entry was validated.
-      optional number scriptResponseTime
-      optional array of Target.TargetID controlledClients
-      optional Target.TargetID targetId
-
-  # ServiceWorker error message.
-  type ServiceWorkerErrorMessage extends object
-    properties
-      string errorMessage
-      RegistrationID registrationId
-      string versionId
-      string sourceURL
-      integer lineNumber
-      integer columnNumber
-
-  command deliverPushMessage
-    parameters
-      string origin
-      RegistrationID registrationId
-      string data
-
-  command disable
-
-  command dispatchSyncEvent
-    parameters
-      string origin
-      RegistrationID registrationId
-      string tag
-      boolean lastChance
-
-  command dispatchPeriodicSyncEvent
-    parameters
-      string origin
-      RegistrationID registrationId
-      string tag
-
-  command enable
-
-  command inspectWorker
-    parameters
-      string versionId
-
-  command setForceUpdateOnPageLoad
-    parameters
-      boolean forceUpdateOnPageLoad
-
-  command skipWaiting
-    parameters
-      string scopeURL
-
-  command startWorker
-    parameters
-      string scopeURL
-
-  command stopAllWorkers
-
-  command stopWorker
-    parameters
-      string versionId
-
-  command unregister
-    parameters
-      string scopeURL
-
-  command updateRegistration
-    parameters
-      string scopeURL
-
-  event workerErrorReported
-    parameters
-      ServiceWorkerErrorMessage errorMessage
-
-  event workerRegistrationUpdated
-    parameters
-      array of ServiceWorkerRegistration registrations
-
-  event workerVersionUpdated
-    parameters
-      array of ServiceWorkerVersion versions
-
-experimental domain Storage
-  depends on Browser
-  depends on Network
-
-  # Enum of possible storage types.
-  type StorageType extends string
-    enum
-      appcache
-      cookies
-      file_systems
-      indexeddb
-      local_storage
-      shader_cache
-      websql
-      service_workers
-      cache_storage
-      all
-      other
-
-  # Usage for a storage type.
-  type UsageForType extends object
-    properties
-      # Name of storage type.
-      StorageType storageType
-      # Storage usage (bytes).
-      number usage
-
-  # Clears storage for origin.
-  command clearDataForOrigin
-    parameters
-      # Security origin.
-      string origin
-      # Comma separated list of StorageType to clear.
-      string storageTypes
-
-  # Returns all browser cookies.
-  command getCookies
-    parameters
-      # Browser context to use when called on the browser endpoint.
-      optional Browser.BrowserContextID browserContextId
-    returns
-      # Array of cookie objects.
-      array of Network.Cookie cookies
-
-  # Sets given cookies.
-  command setCookies
-    parameters
-      # Cookies to be set.
-      array of Network.CookieParam cookies
-      # Browser context to use when called on the browser endpoint.
-      optional Browser.BrowserContextID browserContextId
-
-  # Clears cookies.
-  command clearCookies
-    parameters
-      # Browser context to use when called on the browser endpoint.
-      optional Browser.BrowserContextID browserContextId
-
-  # Returns usage and quota in bytes.
-  command getUsageAndQuota
-    parameters
-      # Security origin.
-      string origin
-    returns
-      # Storage usage (bytes).
-      number usage
-      # Storage quota (bytes).
-      number quota
-      # Storage usage per type (bytes).
-      array of UsageForType usageBreakdown
-
-  # Registers origin to be notified when an update occurs to its cache storage list.
-  command trackCacheStorageForOrigin
-    parameters
-      # Security origin.
-      string origin
-
-  # Registers origin to be notified when an update occurs to its IndexedDB.
-  command trackIndexedDBForOrigin
-    parameters
-      # Security origin.
-      string origin
-
-  # Unregisters origin from receiving notifications for cache storage.
-  command untrackCacheStorageForOrigin
-    parameters
-      # Security origin.
-      string origin
-
-  # Unregisters origin from receiving notifications for IndexedDB.
-  command untrackIndexedDBForOrigin
-    parameters
-      # Security origin.
-      string origin
-
-  # A cache's contents have been modified.
-  event cacheStorageContentUpdated
-    parameters
-      # Origin to update.
-      string origin
-      # Name of cache in origin.
-      string cacheName
-
-  # A cache has been added/deleted.
-  event cacheStorageListUpdated
-    parameters
-      # Origin to update.
-      string origin
-
-  # The origin's IndexedDB object store has been modified.
-  event indexedDBContentUpdated
-    parameters
-      # Origin to update.
-      string origin
-      # Database to update.
-      string databaseName
-      # ObjectStore to update.
-      string objectStoreName
-
-  # The origin's IndexedDB database list has been modified.
-  event indexedDBListUpdated
-    parameters
-      # Origin to update.
-      string origin
-
-# The SystemInfo domain defines methods and events for querying low-level system information.
-experimental domain SystemInfo
-
-  # Describes a single graphics processor (GPU).
-  type GPUDevice extends object
-    properties
-      # PCI ID of the GPU vendor, if available; 0 otherwise.
-      number vendorId
-      # PCI ID of the GPU device, if available; 0 otherwise.
-      number deviceId
-      # Sub sys ID of the GPU, only available on Windows.
-      optional number subSysId
-      # Revision of the GPU, only available on Windows.
-      optional number revision
-      # String description of the GPU vendor, if the PCI ID is not available.
-      string vendorString
-      # String description of the GPU device, if the PCI ID is not available.
-      string deviceString
-      # String description of the GPU driver vendor.
-      string driverVendor
-      # String description of the GPU driver version.
-      string driverVersion
-
-  # Describes the width and height dimensions of an entity.
-  type Size extends object
-    properties
-      # Width in pixels.
-      integer width
-      # Height in pixels.
-      integer height
-
-  # Describes a supported video decoding profile with its associated minimum and
-  # maximum resolutions.
-  type VideoDecodeAcceleratorCapability extends object
-    properties
-      # Video codec profile that is supported, e.g. VP9 Profile 2.
-      string profile
-      # Maximum video dimensions in pixels supported for this |profile|.
-      Size maxResolution
-      # Minimum video dimensions in pixels supported for this |profile|.
-      Size minResolution
-
-  # Describes a supported video encoding profile with its associated maximum
-  # resolution and maximum framerate.
-  type VideoEncodeAcceleratorCapability extends object
-    properties
-      # Video codec profile that is supported, e.g H264 Main.
-      string profile
-      # Maximum video dimensions in pixels supported for this |profile|.
-      Size maxResolution
-      # Maximum encoding framerate in frames per second supported for this
-      # |profile|, as fraction's numerator and denominator, e.g. 24/1 fps,
-      # 24000/1001 fps, etc.
-      integer maxFramerateNumerator
-      integer maxFramerateDenominator
-
-  # YUV subsampling type of the pixels of a given image.
-  type SubsamplingFormat extends string
-    enum
-      yuv420
-      yuv422
-      yuv444
-
-  # Image format of a given image.
-  type ImageType extends string
-    enum
-      jpeg
-      webp
-      unknown
-
-  # Describes a supported image decoding profile with its associated minimum and
-  # maximum resolutions and subsampling.
-  type ImageDecodeAcceleratorCapability extends object
-    properties
-      # Image coded, e.g. Jpeg.
-      ImageType imageType
-      # Maximum supported dimensions of the image in pixels.
-      Size maxDimensions
-      # Minimum supported dimensions of the image in pixels.
-      Size minDimensions
-      # Optional array of supported subsampling formats, e.g. 4:2:0, if known.
-      array of SubsamplingFormat subsamplings
-
-  # Provides information about the GPU(s) on the system.
-  type GPUInfo extends object
-    properties
-      # The graphics devices on the system. Element 0 is the primary GPU.
-      array of GPUDevice devices
-      # An optional dictionary of additional GPU related attributes.
-      optional object auxAttributes
-      # An optional dictionary of graphics features and their status.
-      optional object featureStatus
-      # An optional array of GPU driver bug workarounds.
-      array of string driverBugWorkarounds
-      # Supported accelerated video decoding capabilities.
-      array of VideoDecodeAcceleratorCapability videoDecoding
-      # Supported accelerated video encoding capabilities.
-      array of VideoEncodeAcceleratorCapability videoEncoding
-      # Supported accelerated image decoding capabilities.
-      array of ImageDecodeAcceleratorCapability imageDecoding
-
-  # Represents process info.
-  type ProcessInfo extends object
-    properties
-      # Specifies process type.
-      string type
-      # Specifies process id.
-      integer id
-      # Specifies cumulative CPU usage in seconds across all threads of the
-      # process since the process start.
-      number cpuTime
-
-  # Returns information about the system.
-  command getInfo
-    returns
-      # Information about the GPUs on the system.
-      GPUInfo gpu
-      # A platform-dependent description of the model of the machine. On Mac OS, this is, for
-      # example, 'MacBookPro'. Will be the empty string if not supported.
-      string modelName
-      # A platform-dependent description of the version of the machine. On Mac OS, this is, for
-      # example, '10.1'. Will be the empty string if not supported.
-      string modelVersion
-      # The command line string used to launch the browser. Will be the empty string if not
-      # supported.
-      string commandLine
-
-  # Returns information about all running processes.
-  command getProcessInfo
-    returns
-      # An array of process info blocks.
-      array of ProcessInfo processInfo
-
-# Supports additional targets discovery and allows to attach to them.
-domain Target
-
-  type TargetID extends string
-
-  # Unique identifier of attached debugging session.
-  type SessionID extends string
-
-  type TargetInfo extends object
-    properties
-      TargetID targetId
-      string type
-      string title
-      string url
-      # Whether the target has an attached client.
-      boolean attached
-      # Opener target Id
-      optional TargetID openerId
-      experimental optional Browser.BrowserContextID browserContextId
-
-  experimental type RemoteLocation extends object
-    properties
-      string host
-      integer port
-
-  # Activates (focuses) the target.
-  command activateTarget
-    parameters
-      TargetID targetId
-
-  # Attaches to the target with given id.
-  command attachToTarget
-    parameters
-      TargetID targetId
-      # Enables "flat" access to the session via specifying sessionId attribute in the commands.
-      # We plan to make this the default, deprecate non-flattened mode,
-      # and eventually retire it. See crbug.com/991325.
-      optional boolean flatten
-    returns
-      # Id assigned to the session.
-      SessionID sessionId
-
-  # Attaches to the browser target, only uses flat sessionId mode.
-  experimental command attachToBrowserTarget
-    returns
-      # Id assigned to the session.
-      SessionID sessionId
-
-  # Closes the target. If the target is a page that gets closed too.
-  command closeTarget
-    parameters
-      TargetID targetId
-    returns
-      boolean success
-
-  # Inject object to the target's main frame that provides a communication
-  # channel with browser target.
-  #
-  # Injected object will be available as `window[bindingName]`.
-  #
-  # The object has the follwing API:
-  # - `binding.send(json)` - a method to send messages over the remote debugging protocol
-  # - `binding.onmessage = json => handleMessage(json)` - a callback that will be called for the protocol notifications and command responses.
-  experimental command exposeDevToolsProtocol
-    parameters
-      TargetID targetId
-      # Binding name, 'cdp' if not specified.
-      optional string bindingName
-
-  # Creates a new empty BrowserContext. Similar to an incognito profile but you can have more than
-  # one.
-  experimental command createBrowserContext
-    returns
-      # The id of the context created.
-      Browser.BrowserContextID browserContextId
-
-  # Returns all browser contexts created with `Target.createBrowserContext` method.
-  experimental command getBrowserContexts
-    returns
-      # An array of browser context ids.
-      array of Browser.BrowserContextID browserContextIds
-
-  # Creates a new page.
-  command createTarget
-    parameters
-      # The initial URL the page will be navigated to.
-      string url
-      # Frame width in DIP (headless chrome only).
-      optional integer width
-      # Frame height in DIP (headless chrome only).
-      optional integer height
-      # The browser context to create the page in.
-      optional Browser.BrowserContextID browserContextId
-      # Whether BeginFrames for this target will be controlled via DevTools (headless chrome only,
-      # not supported on MacOS yet, false by default).
-      experimental optional boolean enableBeginFrameControl
-      # Whether to create a new Window or Tab (chrome-only, false by default).
-      optional boolean newWindow
-      # Whether to create the target in background or foreground (chrome-only,
-      # false by default).
-      optional boolean background
-    returns
-      # The id of the page opened.
-      TargetID targetId
-
-  # Detaches session with given id.
-  command detachFromTarget
-    parameters
-      # Session to detach.
-      optional SessionID sessionId
-      # Deprecated.
-      deprecated optional TargetID targetId
-
-  # Deletes a BrowserContext. All the belonging pages will be closed without calling their
-  # beforeunload hooks.
-  experimental command disposeBrowserContext
-    parameters
-      Browser.BrowserContextID browserContextId
-
-  # Returns information about a target.
-  experimental command getTargetInfo
-    parameters
-      optional TargetID targetId
-    returns
-      TargetInfo targetInfo
-
-  # Retrieves a list of available targets.
-  command getTargets
-    returns
-      # The list of targets.
-      array of TargetInfo targetInfos
-
-  # Sends protocol message over session with given id.
-  # Consider using flat mode instead; see commands attachToTarget, setAutoAttach,
-  # and crbug.com/991325.
-  deprecated command sendMessageToTarget
-    parameters
-      string message
-      # Identifier of the session.
-      optional SessionID sessionId
-      # Deprecated.
-      deprecated optional TargetID targetId
-
-  # Controls whether to automatically attach to new targets which are considered to be related to
-  # this one. When turned on, attaches to all existing related targets as well. When turned off,
-  # automatically detaches from all currently attached targets.
-  experimental command setAutoAttach
-    parameters
-      # Whether to auto-attach to related targets.
-      boolean autoAttach
-      # Whether to pause new targets when attaching to them. Use `Runtime.runIfWaitingForDebugger`
-      # to run paused targets.
-      boolean waitForDebuggerOnStart
-      # Enables "flat" access to the session via specifying sessionId attribute in the commands.
-      # We plan to make this the default, deprecate non-flattened mode,
-      # and eventually retire it. See crbug.com/991325.
-      optional boolean flatten
-      # Auto-attach to the targets created via window.open from current target.
-      experimental optional boolean windowOpen
-
-  # Controls whether to discover available targets and notify via
-  # `targetCreated/targetInfoChanged/targetDestroyed` events.
-  command setDiscoverTargets
-    parameters
-      # Whether to discover available targets.
-      boolean discover
-
-  # Enables target discovery for the specified locations, when `setDiscoverTargets` was set to
-  # `true`.
-  experimental command setRemoteLocations
-    parameters
-      # List of remote locations.
-      array of RemoteLocation locations
-
-  # Issued when attached to target because of auto-attach or `attachToTarget` command.
-  experimental event attachedToTarget
-    parameters
-      # Identifier assigned to the session used to send/receive messages.
-      SessionID sessionId
-      TargetInfo targetInfo
-      boolean waitingForDebugger
-
-  # Issued when detached from target for any reason (including `detachFromTarget` command). Can be
-  # issued multiple times per target if multiple sessions have been attached to it.
-  experimental event detachedFromTarget
-    parameters
-      # Detached session identifier.
-      SessionID sessionId
-      # Deprecated.
-      deprecated optional TargetID targetId
-
-  # Notifies about a new protocol message received from the session (as reported in
-  # `attachedToTarget` event).
-  event receivedMessageFromTarget
-    parameters
-      # Identifier of a session which sends a message.
-      SessionID sessionId
-      string message
-      # Deprecated.
-      deprecated optional TargetID targetId
-
-  # Issued when a possible inspection target is created.
-  event targetCreated
-    parameters
-      TargetInfo targetInfo
-
-  # Issued when a target is destroyed.
-  event targetDestroyed
-    parameters
-      TargetID targetId
-
-  # Issued when a target has crashed.
-  event targetCrashed
-    parameters
-      TargetID targetId
-      # Termination status type.
-      string status
-      # Termination error code.
-      integer errorCode
-
-  # Issued when some information about a target has changed. This only happens between
-  # `targetCreated` and `targetDestroyed`.
-  event targetInfoChanged
-    parameters
-      TargetInfo targetInfo
-
-# The Tethering domain defines methods and events for browser port binding.
-experimental domain Tethering
-
-  # Request browser port binding.
-  command bind
-    parameters
-      # Port number to bind.
-      integer port
-
-  # Request browser port unbinding.
-  command unbind
-    parameters
-      # Port number to unbind.
-      integer port
-
-  # Informs that port was successfully bound and got a specified connection id.
-  event accepted
-    parameters
-      # Port number that was successfully bound.
-      integer port
-      # Connection id to be used.
-      string connectionId
-
-experimental domain Tracing
-  depends on IO
-
-  # Configuration for memory dump. Used only when "memory-infra" category is enabled.
-  type MemoryDumpConfig extends object
-
-  type TraceConfig extends object
-    properties
-      # Controls how the trace buffer stores data.
-      optional enum recordMode
-        recordUntilFull
-        recordContinuously
-        recordAsMuchAsPossible
-        echoToConsole
-      # Turns on JavaScript stack sampling.
-      optional boolean enableSampling
-      # Turns on system tracing.
-      optional boolean enableSystrace
-      # Turns on argument filter.
-      optional boolean enableArgumentFilter
-      # Included category filters.
-      optional array of string includedCategories
-      # Excluded category filters.
-      optional array of string excludedCategories
-      # Configuration to synthesize the delays in tracing.
-      optional array of string syntheticDelays
-      # Configuration for memory dump triggers. Used only when "memory-infra" category is enabled.
-      optional MemoryDumpConfig memoryDumpConfig
-
-  # Data format of a trace. Can be either the legacy JSON format or the
-  # protocol buffer format. Note that the JSON format will be deprecated soon.
-  type StreamFormat extends string
-    enum
-      json
-      proto
-
-  # Compression type to use for traces returned via streams.
-  type StreamCompression extends string
-    enum
-      none
-      gzip
-
-  # Stop trace events collection.
-  command end
-
-  # Gets supported tracing categories.
-  command getCategories
-    returns
-      # A list of supported tracing categories.
-      array of string categories
-
-  # Record a clock sync marker in the trace.
-  command recordClockSyncMarker
-    parameters
-      # The ID of this clock sync marker
-      string syncId
-
-  # Request a global memory dump.
-  command requestMemoryDump
-    parameters
-      # Enables more deterministic results by forcing garbage collection
-      optional boolean deterministic
-    returns
-      # GUID of the resulting global memory dump.
-      string dumpGuid
-      # True iff the global memory dump succeeded.
-      boolean success
-
-  # Start trace events collection.
-  command start
-    parameters
-      # Category/tag filter
-      deprecated optional string categories
-      # Tracing options
-      deprecated optional string options
-      # If set, the agent will issue bufferUsage events at this interval, specified in milliseconds
-      optional number bufferUsageReportingInterval
-      # Whether to report trace events as series of dataCollected events or to save trace to a
-      # stream (defaults to `ReportEvents`).
-      optional enum transferMode
-        ReportEvents
-        ReturnAsStream
-      # Trace data format to use. This only applies when using `ReturnAsStream`
-      # transfer mode (defaults to `json`).
-      optional StreamFormat streamFormat
-      # Compression format to use. This only applies when using `ReturnAsStream`
-      # transfer mode (defaults to `none`)
-      optional StreamCompression streamCompression
-      optional TraceConfig traceConfig
-
-  event bufferUsage
-    parameters
-      # A number in range [0..1] that indicates the used size of event buffer as a fraction of its
-      # total size.
-      optional number percentFull
-      # An approximate number of events in the trace log.
-      optional number eventCount
-      # A number in range [0..1] that indicates the used size of event buffer as a fraction of its
-      # total size.
-      optional number value
-
-  # Contains an bucket of collected trace events. When tracing is stopped collected events will be
-  # send as a sequence of dataCollected events followed by tracingComplete event.
-  event dataCollected
-    parameters
-      array of object value
-
-  # Signals that tracing is stopped and there is no trace buffers pending flush, all data were
-  # delivered via dataCollected events.
-  event tracingComplete
-    parameters
-      # Indicates whether some trace data is known to have been lost, e.g. because the trace ring
-      # buffer wrapped around.
-      boolean dataLossOccurred
-      # A handle of the stream that holds resulting trace data.
-      optional IO.StreamHandle stream
-      # Trace data format of returned stream.
-      optional StreamFormat traceFormat
-      # Compression format of returned stream.
-      optional StreamCompression streamCompression
-
-# A domain for letting clients substitute browser's network layer with client code.
-experimental domain Fetch
-  depends on Network
-  depends on IO
-  depends on Page
-
-  # Unique request identifier.
-  type RequestId extends string
-
-  # Stages of the request to handle. Request will intercept before the request is
-  # sent. Response will intercept after the response is received (but before response
-  # body is received.
-  experimental type RequestStage extends string
-    enum
-      Request
-      Response
-
-  experimental type RequestPattern extends object
-    properties
-      # Wildcards ('*' -> zero or more, '?' -> exactly one) are allowed. Escape character is
-      # backslash. Omitting is equivalent to "*".
-      optional string urlPattern
-      # If set, only requests for matching resource types will be intercepted.
-      optional Network.ResourceType resourceType
-      # Stage at wich to begin intercepting requests. Default is Request.
-      optional RequestStage requestStage
-
-  # Response HTTP header entry
-  type HeaderEntry extends object
-    properties
-      string name
-      string value
-
-  # Authorization challenge for HTTP status code 401 or 407.
-  experimental type AuthChallenge extends object
-    properties
-      # Source of the authentication challenge.
-      optional enum source
-        Server
-        Proxy
-      # Origin of the challenger.
-      string origin
-      # The authentication scheme used, such as basic or digest
-      string scheme
-      # The realm of the challenge. May be empty.
-      string realm
-
-  # Response to an AuthChallenge.
-  experimental type AuthChallengeResponse extends object
-    properties
-      # The decision on what to do in response to the authorization challenge.  Default means
-      # deferring to the default behavior of the net stack, which will likely either the Cancel
-      # authentication or display a popup dialog box.
-      enum response
-        Default
-        CancelAuth
-        ProvideCredentials
-      # The username to provide, possibly empty. Should only be set if response is
-      # ProvideCredentials.
-      optional string username
-      # The password to provide, possibly empty. Should only be set if response is
-      # ProvideCredentials.
-      optional string password
-
-  # Disables the fetch domain.
-  command disable
-
-  # Enables issuing of requestPaused events. A request will be paused until client
-  # calls one of failRequest, fulfillRequest or continueRequest/continueWithAuth.
-  command enable
-    parameters
-      # If specified, only requests matching any of these patterns will produce
-      # fetchRequested event and will be paused until clients response. If not set,
-      # all requests will be affected.
-      optional array of RequestPattern patterns
-      # If true, authRequired events will be issued and requests will be paused
-      # expecting a call to continueWithAuth.
-      optional boolean handleAuthRequests
-
-  # Causes the request to fail with specified reason.
-  command failRequest
-    parameters
-      # An id the client received in requestPaused event.
-      RequestId requestId
-      # Causes the request to fail with the given reason.
-      Network.ErrorReason errorReason
-
-  # Provides response to the request.
-  command fulfillRequest
-    parameters
-      # An id the client received in requestPaused event.
-      RequestId requestId
-      # An HTTP response code.
-      integer responseCode
-      # Response headers.
-      optional array of HeaderEntry responseHeaders
-      # Alternative way of specifying response headers as a \0-separated
-      # series of name: value pairs. Prefer the above method unless you
-      # need to represent some non-UTF8 values that can't be transmitted
-      # over the protocol as text.
-      optional binary binaryResponseHeaders
-      # A response body.
-      optional binary body
-      # A textual representation of responseCode.
-      # If absent, a standard phrase matching responseCode is used.
-      optional string responsePhrase
-
-  # Continues the request, optionally modifying some of its parameters.
-  command continueRequest
-    parameters
-      # An id the client received in requestPaused event.
-      RequestId requestId
-      # If set, the request url will be modified in a way that's not observable by page.
-      optional string url
-      # If set, the request method is overridden.
-      optional string method
-      # If set, overrides the post data in the request.
-      optional string postData
-      # If set, overrides the request headrts.
-      optional array of HeaderEntry headers
-
-  # Continues a request supplying authChallengeResponse following authRequired event.
-  command continueWithAuth
-    parameters
-      # An id the client received in authRequired event.
-      RequestId requestId
-      # Response to  with an authChallenge.
-      AuthChallengeResponse authChallengeResponse
-
-  # Causes the body of the response to be received from the server and
-  # returned as a single string. May only be issued for a request that
-  # is paused in the Response stage and is mutually exclusive with
-  # takeResponseBodyForInterceptionAsStream. Calling other methods that
-  # affect the request or disabling fetch domain before body is received
-  # results in an undefined behavior.
-  command getResponseBody
-    parameters
-      # Identifier for the intercepted request to get body for.
-      RequestId requestId
-    returns
-      # Response body.
-      string body
-      # True, if content was sent as base64.
-      boolean base64Encoded
-
-  # Returns a handle to the stream representing the response body.
-  # The request must be paused in the HeadersReceived stage.
-  # Note that after this command the request can't be continued
-  # as is -- client either needs to cancel it or to provide the
-  # response body.
-  # The stream only supports sequential read, IO.read will fail if the position
-  # is specified.
-  # This method is mutually exclusive with getResponseBody.
-  # Calling other methods that affect the request or disabling fetch
-  # domain before body is received results in an undefined behavior.
-  command takeResponseBodyAsStream
-    parameters
-      RequestId requestId
-    returns
-      IO.StreamHandle stream
-
-  # Issued when the domain is enabled and the request URL matches the
-  # specified filter. The request is paused until the client responds
-  # with one of continueRequest, failRequest or fulfillRequest.
-  # The stage of the request can be determined by presence of responseErrorReason
-  # and responseStatusCode -- the request is at the response stage if either
-  # of these fields is present and in the request stage otherwise.
-  event requestPaused
-    parameters
-      # Each request the page makes will have a unique id.
-      RequestId requestId
-      # The details of the request.
-      Network.Request request
-      # The id of the frame that initiated the request.
-      Page.FrameId frameId
-      # How the requested resource will be used.
-      Network.ResourceType resourceType
-      # Response error if intercepted at response stage.
-      optional Network.ErrorReason responseErrorReason
-      # Response code if intercepted at response stage.
-      optional integer responseStatusCode
-      # Response headers if intercepted at the response stage.
-      optional array of HeaderEntry responseHeaders
-      # If the intercepted request had a corresponding Network.requestWillBeSent event fired for it,
-      # then this networkId will be the same as the requestId present in the requestWillBeSent event.
-      optional RequestId networkId
-
-  # Issued when the domain is enabled with handleAuthRequests set to true.
-  # The request is paused until client responds with continueWithAuth.
-  event authRequired
-    parameters
-      # Each request the page makes will have a unique id.
-      RequestId requestId
-      # The details of the request.
-      Network.Request request
-      # The id of the frame that initiated the request.
-      Page.FrameId frameId
-      # How the requested resource will be used.
-      Network.ResourceType resourceType
-      # Details of the Authorization Challenge encountered.
-      # If this is set, client should respond with continueRequest that
-      # contains AuthChallengeResponse.
-      AuthChallenge authChallenge
-
-# This domain allows inspection of Web Audio API.
-# https://webaudio.github.io/web-audio-api/
-experimental domain WebAudio
-
-  # An unique ID for a graph object (AudioContext, AudioNode, AudioParam) in Web Audio API
-  type GraphObjectId extends string
-
-  # Enum of BaseAudioContext types
-  type ContextType extends string
-    enum
-      realtime
-      offline
-
-  # Enum of AudioContextState from the spec
-  type ContextState extends string
-    enum
-      suspended
-      running
-      closed
-
-  # Enum of AudioNode types
-  type NodeType extends string
-
-  # Enum of AudioNode::ChannelCountMode from the spec
-  type ChannelCountMode extends string
-    enum
-      clamped-max
-      explicit
-      max
-
-  # Enum of AudioNode::ChannelInterpretation from the spec
-  type ChannelInterpretation extends string
-    enum
-      discrete
-      speakers
-
-  # Enum of AudioParam types
-  type ParamType extends string
-
-  # Enum of AudioParam::AutomationRate from the spec
-  type AutomationRate extends string
-    enum
-      a-rate
-      k-rate
-
-  # Fields in AudioContext that change in real-time.
-  type ContextRealtimeData extends object
-    properties
-      # The current context time in second in BaseAudioContext.
-      number currentTime
-      # The time spent on rendering graph divided by render qunatum duration,
-      # and multiplied by 100. 100 means the audio renderer reached the full
-      # capacity and glitch may occur.
-      number renderCapacity
-      # A running mean of callback interval.
-      number callbackIntervalMean
-      # A running variance of callback interval.
-      number callbackIntervalVariance
-
-  # Protocol object for BaseAudioContext
-  type BaseAudioContext extends object
-    properties
-      GraphObjectId contextId
-      ContextType contextType
-      ContextState contextState
-      optional ContextRealtimeData realtimeData
-      # Platform-dependent callback buffer size.
-      number callbackBufferSize
-      # Number of output channels supported by audio hardware in use.
-      number maxOutputChannelCount
-      # Context sample rate.
-      number sampleRate
-
-# Protocol object for AudioListner
-  type AudioListener extends object
-    properties
-      GraphObjectId listenerId
-      GraphObjectId contextId
-
-  # Protocol object for AudioNode
-  type AudioNode extends object
-    properties
-      GraphObjectId nodeId
-      GraphObjectId contextId
-      NodeType nodeType
-      number numberOfInputs
-      number numberOfOutputs
-      number channelCount
-      ChannelCountMode channelCountMode
-      ChannelInterpretation channelInterpretation
-
-  # Protocol object for AudioParam
-  type AudioParam extends object
-    properties
-      GraphObjectId paramId
-      GraphObjectId nodeId
-      GraphObjectId contextId
-      ParamType paramType
-      AutomationRate rate
-      number defaultValue
-      number minValue
-      number maxValue
-
-  # Enables the WebAudio domain and starts sending context lifetime events.
-  command enable
-
-  # Disables the WebAudio domain.
-  command disable
-
-  # Fetch the realtime data from the registered contexts.
-  command getRealtimeData
-    parameters
-      GraphObjectId contextId
-    returns
-      ContextRealtimeData realtimeData
-
-  # Notifies that a new BaseAudioContext has been created.
-  event contextCreated
-    parameters
-      BaseAudioContext context
-
-  # Notifies that an existing BaseAudioContext will be destroyed.
-  event contextWillBeDestroyed
-    parameters
-      GraphObjectId contextId
-
-  # Notifies that existing BaseAudioContext has changed some properties (id stays the same)..
-  event contextChanged
-    parameters
-      BaseAudioContext context
-
-# Notifies that the construction of an AudioListener has finished.
-  event audioListenerCreated
-    parameters
-      AudioListener listener
-
-  # Notifies that a new AudioListener has been created.
-  event audioListenerWillBeDestroyed
-    parameters
-      GraphObjectId contextId
-      GraphObjectId listenerId
-
-  # Notifies that a new AudioNode has been created.
-  event audioNodeCreated
-    parameters
-      AudioNode node
-
-  # Notifies that an existing AudioNode has been destroyed.
-  event audioNodeWillBeDestroyed
-    parameters
-      GraphObjectId contextId
-      GraphObjectId nodeId
-
-  # Notifies that a new AudioParam has been created.
-  event audioParamCreated
-    parameters
-      AudioParam param
-
-  # Notifies that an existing AudioParam has been destroyed.
-  event audioParamWillBeDestroyed
-    parameters
-      GraphObjectId contextId
-      GraphObjectId nodeId
-      GraphObjectId paramId
-
-  # Notifies that two AudioNodes are connected.
-  event nodesConnected
-    parameters
-      GraphObjectId contextId
-      GraphObjectId sourceId
-      GraphObjectId destinationId
-      optional number sourceOutputIndex
-      optional number destinationInputIndex
-
-  # Notifies that AudioNodes are disconnected. The destination can be null, and it means all the outgoing connections from the source are disconnected.
-  event nodesDisconnected
-    parameters
-      GraphObjectId contextId
-      GraphObjectId sourceId
-      GraphObjectId destinationId
-      optional number sourceOutputIndex
-      optional number destinationInputIndex
-
-  # Notifies that an AudioNode is connected to an AudioParam.
-  event nodeParamConnected
-    parameters
-      GraphObjectId contextId
-      GraphObjectId sourceId
-      GraphObjectId destinationId
-      optional number sourceOutputIndex
-
-  # Notifies that an AudioNode is disconnected to an AudioParam.
-  event nodeParamDisconnected
-    parameters
-      GraphObjectId contextId
-      GraphObjectId sourceId
-      GraphObjectId destinationId
-      optional number sourceOutputIndex
-
-# This domain allows configuring virtual authenticators to test the WebAuthn
-# API.
-experimental domain WebAuthn
-  type AuthenticatorId extends string
-
-  type AuthenticatorProtocol extends string
-    enum
-      # Universal 2nd Factor.
-      u2f
-      # Client To Authenticator Protocol 2.
-      ctap2
-
-  type AuthenticatorTransport extends string
-    enum
-      # Cross-Platform authenticator attachments:
-      usb
-      nfc
-      ble
-      cable
-      # Platform authenticator attachment:
-      internal
-
-  type VirtualAuthenticatorOptions extends object
-    properties
-      AuthenticatorProtocol protocol
-      AuthenticatorTransport transport
-      # Defaults to false.
-      optional boolean hasResidentKey
-      # Defaults to false.
-      optional boolean hasUserVerification
-      # If set to true, tests of user presence will succeed immediately.
-      # Otherwise, they will not be resolved. Defaults to true.
-      optional boolean automaticPresenceSimulation
-      # Sets whether User Verification succeeds or fails for an authenticator.
-      # Defaults to false.
-      optional boolean isUserVerified
-
-  type Credential extends object
-    properties
-      binary credentialId
-      boolean isResidentCredential
-      # Relying Party ID the credential is scoped to. Must be set when adding a
-      # credential.
-      optional string rpId
-      # The ECDSA P-256 private key in PKCS#8 format.
-      binary privateKey
-      # An opaque byte sequence with a maximum size of 64 bytes mapping the
-      # credential to a specific user.
-      optional binary userHandle
-      # Signature counter. This is incremented by one for each successful
-      # assertion.
-      # See https://w3c.github.io/webauthn/#signature-counter
-      integer signCount
-
-  # Enable the WebAuthn domain and start intercepting credential storage and
-  # retrieval with a virtual authenticator.
-  command enable
-
-  # Disable the WebAuthn domain.
-  command disable
-
-  # Creates and adds a virtual authenticator.
-  command addVirtualAuthenticator
-    parameters
-      VirtualAuthenticatorOptions options
-    returns
-      AuthenticatorId authenticatorId
-
-  # Removes the given authenticator.
-  command removeVirtualAuthenticator
-    parameters
-      AuthenticatorId authenticatorId
-
-  # Adds the credential to the specified authenticator.
-  command addCredential
-    parameters
-      AuthenticatorId authenticatorId
-      Credential credential
-
-  # Returns a single credential stored in the given virtual authenticator that
-  # matches the credential ID.
-  command getCredential
-    parameters
-      AuthenticatorId authenticatorId
-      binary credentialId
-    returns
-      Credential credential
-
-  # Returns all the credentials stored in the given virtual authenticator.
-  command getCredentials
-    parameters
-      AuthenticatorId authenticatorId
-    returns
-      array of Credential credentials
-
-  # Removes a credential from the authenticator.
-  command removeCredential
-    parameters
-      AuthenticatorId authenticatorId
-      binary credentialId
-
-  # Clears all the credentials from the specified device.
-  command clearCredentials
-    parameters
-      AuthenticatorId authenticatorId
-
-  # Sets whether User Verification succeeds or fails for an authenticator.
-  # The default is true.
-  command setUserVerified
-    parameters
-      AuthenticatorId authenticatorId
-      boolean isUserVerified
-
-# This domain allows detailed inspection of media elements
-experimental domain Media
-
-  # Players will get an ID that is unique within the agent context.
-  type PlayerId extends string
-
-  type Timestamp extends number
-
-  # Player Property type
-  type PlayerProperty extends object
-    properties
-      string name
-      optional string value
-
-  # Break out events into different types
-  type PlayerEventType extends string
-    enum
-      playbackEvent
-      systemEvent
-      messageEvent
-
-  type PlayerEvent extends object
-    properties
-      PlayerEventType type
-      # Events are timestamped relative to the start of the player creation
-      # not relative to the start of playback.
-      Timestamp timestamp
-      string name
-      string value
-
-  # This can be called multiple times, and can be used to set / override /
-  # remove player properties. A null propValue indicates removal.
-  event playerPropertiesChanged
-    parameters
-      PlayerId playerId
-      array of PlayerProperty properties
-
-  # Send events as a list, allowing them to be batched on the browser for less
-  # congestion. If batched, events must ALWAYS be in chronological order.
-  event playerEventsAdded
-    parameters
-      PlayerId playerId
-      array of PlayerEvent events
-
-  # Called whenever a player is created, or when a new agent joins and recieves
-  # a list of active players. If an agent is restored, it will recieve the full
-  # list of player ids and all events again.
-  event playersCreated
-    parameters
-      array of PlayerId players
-
-  # Enables the Media domain
-  command enable
-
-  # Disables the Media domain.
-  command disable
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_path.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_path.cc
index 93a507f..8b5e992 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_path.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_path.cc
@@ -36,7 +36,7 @@
 
 LayoutSVGPath::LayoutSVGPath(SVGGeometryElement* node)
     // <line> elements have no joins and thus needn't care about miters.
-    : LayoutSVGShape(node, IsSVGLineElement(node) ? kNoMiters : kComplex) {}
+    : LayoutSVGShape(node, IsA<SVGLineElement>(node) ? kNoMiters : kComplex) {}
 
 LayoutSVGPath::~LayoutSVGPath() = default;
 
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_transformable_container.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_transformable_container.cc
index 391b8dc..6be26988 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_transformable_container.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_transformable_container.cc
@@ -80,7 +80,7 @@
   if (IsSVGUseElement(element))
     return true;
   // Nested <use> are replaced by <g> during shadow tree expansion.
-  if (IsSVGGElement(element) && ToSVGGElement(element).InUseShadowTree())
+  if (IsA<SVGGElement>(element) && To<SVGGElement>(element).InUseShadowTree())
     return IsSVGUseElement(element.CorrespondingElement());
   return false;
 }
diff --git a/third_party/blink/renderer/core/layout/svg/svg_layout_tree_as_text.cc b/third_party/blink/renderer/core/layout/svg/svg_layout_tree_as_text.cc
index 94237cc..0aa7784 100644
--- a/third_party/blink/renderer/core/layout/svg/svg_layout_tree_as_text.cc
+++ b/third_party/blink/renderer/core/layout/svg/svg_layout_tree_as_text.cc
@@ -351,16 +351,15 @@
     WriteNameValuePair(ts, "height",
                        length_context.ValueForLength(style.Height(), style,
                                                      SVGLengthMode::kHeight));
-  } else if (IsSVGLineElement(*svg_element)) {
-    SVGLineElement& element = ToSVGLineElement(*svg_element);
+  } else if (auto* element = DynamicTo<SVGLineElement>(*svg_element)) {
     WriteNameValuePair(ts, "x1",
-                       element.x1()->CurrentValue()->Value(length_context));
+                       element->x1()->CurrentValue()->Value(length_context));
     WriteNameValuePair(ts, "y1",
-                       element.y1()->CurrentValue()->Value(length_context));
+                       element->y1()->CurrentValue()->Value(length_context));
     WriteNameValuePair(ts, "x2",
-                       element.x2()->CurrentValue()->Value(length_context));
+                       element->x2()->CurrentValue()->Value(length_context));
     WriteNameValuePair(ts, "y2",
-                       element.y2()->CurrentValue()->Value(length_context));
+                       element->y2()->CurrentValue()->Value(length_context));
   } else if (IsSVGEllipseElement(*svg_element)) {
     WriteNameValuePair(ts, "cx",
                        length_context.ValueForLength(svg_style.Cx(), style,
diff --git a/third_party/blink/renderer/core/svg/svg_animate_motion_element.cc b/third_party/blink/renderer/core/svg/svg_animate_motion_element.cc
index 764caa7..1dc6acb 100644
--- a/third_party/blink/renderer/core/svg/svg_animate_motion_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_animate_motion_element.cc
@@ -44,11 +44,11 @@
   // Spec: SVG 1.1 section 19.2.15
   // FIXME: svgTag is missing. Needs to be checked, if transforming <svg> could
   // cause problems.
-  return IsSVGGElement(target) || IsSVGDefsElement(target) ||
+  return IsA<SVGGElement>(target) || IsSVGDefsElement(target) ||
          IsSVGUseElement(target) || IsSVGImageElement(target) ||
          IsSVGSwitchElement(target) || IsSVGPathElement(target) ||
          IsSVGRectElement(target) || IsSVGCircleElement(target) ||
-         IsSVGEllipseElement(target) || IsSVGLineElement(target) ||
+         IsSVGEllipseElement(target) || IsA<SVGLineElement>(target) ||
          IsSVGPolylineElement(target) || IsSVGPolygonElement(target) ||
          IsSVGTextElement(target) || IsSVGClipPathElement(target) ||
          IsSVGMaskElement(target) || IsSVGAElement(target) ||
diff --git a/third_party/blink/renderer/core/svg/svg_path_element.cc b/third_party/blink/renderer/core/svg/svg_path_element.cc
index 497baf5..a25977e6 100644
--- a/third_party/blink/renderer/core/svg/svg_path_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_path_element.cc
@@ -117,7 +117,7 @@
   // dependencies manually.
   if (SVGElementSet* dependencies = SetOfIncomingReferences()) {
     for (SVGElement* element : *dependencies) {
-      if (auto* mpath = ToSVGMPathElementOrNull(*element))
+      if (auto* mpath = DynamicTo<SVGMPathElement>(*element))
         mpath->TargetPathChanged();
     }
   }
diff --git a/third_party/blink/renderer/modules/cache_storage/cache.cc b/third_party/blink/renderer/modules/cache_storage/cache.cc
index 6447ca4c..0df1c1a8 100644
--- a/third_party/blink/renderer/modules/cache_storage/cache.cc
+++ b/third_party/blink/renderer/modules/cache_storage/cache.cc
@@ -84,7 +84,8 @@
   kNone,
 };
 
-CodeCachePolicy GetCodeCachePolicy(const Response* response) {
+CodeCachePolicy GetCodeCachePolicy(ScriptState* script_state,
+                                   const Response* response) {
   if (!RuntimeEnabledFeatures::CacheStorageCodeCacheHintEnabled())
     return CodeCachePolicy::kAuto;
 
@@ -101,6 +102,11 @@
   if (!response->InternalHeaderList()->Get(header_name, header_value))
     return CodeCachePolicy::kAuto;
 
+  // Count the hint usage regardless of its value.
+  auto* context = ExecutionContext::From(script_state);
+  if (context)
+    context->CountUse(mojom::WebFeature::kCacheStorageCodeCacheHint);
+
   if (header_value.LowerASCII() == "none")
     return CodeCachePolicy::kNone;
 
@@ -120,7 +126,7 @@
   if (!HasJavascriptMimeType(response))
     return false;
 
-  auto policy = GetCodeCachePolicy(response);
+  auto policy = GetCodeCachePolicy(script_state, response);
   if (policy == CodeCachePolicy::kNone)
     return false;
 
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index bdbe96d..6965431 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -2343,6 +2343,25 @@
 crbug.com/736319 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-006.html [ Failure ]
 crbug.com/736319 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/writing-modes-3/text-combine-upright-compression-006a.html [ Failure ]
 
+crbug.com/1029069 [ Linux ] external/wpt/css/css-fonts/standard-font-family-11.html [ Failure ]
+crbug.com/1029069 [ Mac ] external/wpt/css/css-fonts/standard-font-family-11.html [ Failure ]
+crbug.com/1029069 [ Win ] external/wpt/css/css-fonts/standard-font-family-11.html [ Failure ]
+crbug.com/1029069 [ Linux ] external/wpt/css/css-fonts/standard-font-family-12.html [ Failure ]
+crbug.com/1029069 [ Mac ] external/wpt/css/css-fonts/standard-font-family-12.html [ Failure ]
+crbug.com/1029069 [ Win ] external/wpt/css/css-fonts/standard-font-family-12.html [ Failure ]
+crbug.com/1029069 [ Linux ] external/wpt/css/css-fonts/standard-font-family-13.html [ Failure ]
+crbug.com/1029069 [ Mac ] external/wpt/css/css-fonts/standard-font-family-13.html [ Failure ]
+crbug.com/1029069 [ Win ] external/wpt/css/css-fonts/standard-font-family-13.html [ Failure ]
+crbug.com/1029069 [ Linux ] external/wpt/css/css-fonts/standard-font-family-14.html [ Failure ]
+crbug.com/1029069 [ Mac ] external/wpt/css/css-fonts/standard-font-family-14.html [ Failure ]
+crbug.com/1029069 [ Win ] external/wpt/css/css-fonts/standard-font-family-14.html [ Failure ]
+crbug.com/1029069 [ Linux ] external/wpt/css/css-fonts/standard-font-family-15.html [ Failure ]
+crbug.com/1029069 [ Mac ] external/wpt/css/css-fonts/standard-font-family-15.html [ Failure ]
+crbug.com/1029069 [ Win ] external/wpt/css/css-fonts/standard-font-family-15.html [ Failure ]
+crbug.com/1029069 [ Linux ] external/wpt/css/css-fonts/standard-font-family-16.html [ Failure ]
+crbug.com/1029069 [ Mac ] external/wpt/css/css-fonts/standard-font-family-16.html [ Failure ]
+crbug.com/1029069 [ Win ] external/wpt/css/css-fonts/standard-font-family-16.html [ Failure ]
+
 crbug.com/752449 [ Mac10.12 ] external/wpt/css/css-fonts/matching/fixed-stretch-style-over-weight.html [ Failure ]
 crbug.com/752449 [ Mac10.13 ] external/wpt/css/css-fonts/matching/fixed-stretch-style-over-weight.html [ Failure ]
 crbug.com/752449 [ Retina ] external/wpt/css/css-fonts/matching/fixed-stretch-style-over-weight.html [ Failure ]
@@ -2711,6 +2730,9 @@
 crbug.com/1012627 [ Win7 ] external/wpt/css/css-text/line-breaking/line-breaking-021.html [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 [ Linux ] external/wpt/svg/painting/marker-orient-001.svg [ Failure ]
+crbug.com/626703 [ Mac ] external/wpt/svg/painting/marker-orient-001.svg [ Failure ]
+crbug.com/626703 [ Win ] external/wpt/svg/painting/marker-orient-001.svg [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/infrastructure/reftest/reftest_wait_TestRendered.html [ Timeout ]
 crbug.com/626703 [ Mac ] external/wpt/infrastructure/reftest/reftest_wait_TestRendered.html [ Timeout ]
 crbug.com/626703 [ Win ] external/wpt/infrastructure/reftest/reftest_wait_TestRendered.html [ Timeout ]
@@ -2726,24 +2748,6 @@
 crbug.com/626703 [ Linux ] external/wpt/css/css-sizing/percentage-resolution-001.html [ Failure ]
 crbug.com/626703 [ Mac ] external/wpt/css/css-sizing/percentage-resolution-001.html [ Failure ]
 crbug.com/626703 [ Win ] external/wpt/css/css-sizing/percentage-resolution-001.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/css/css-fonts/standard-font-family-13.html [ Failure ]
-crbug.com/626703 [ Mac ] external/wpt/css/css-fonts/standard-font-family-13.html [ Failure ]
-crbug.com/626703 [ Win ] external/wpt/css/css-fonts/standard-font-family-13.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/css/css-fonts/standard-font-family-11.html [ Failure ]
-crbug.com/626703 [ Mac ] external/wpt/css/css-fonts/standard-font-family-11.html [ Failure ]
-crbug.com/626703 [ Win ] external/wpt/css/css-fonts/standard-font-family-11.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/css/css-fonts/standard-font-family-14.html [ Failure ]
-crbug.com/626703 [ Mac ] external/wpt/css/css-fonts/standard-font-family-14.html [ Failure ]
-crbug.com/626703 [ Win ] external/wpt/css/css-fonts/standard-font-family-14.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/css/css-fonts/standard-font-family-15.html [ Failure ]
-crbug.com/626703 [ Mac ] external/wpt/css/css-fonts/standard-font-family-15.html [ Failure ]
-crbug.com/626703 [ Win ] external/wpt/css/css-fonts/standard-font-family-15.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/css/css-fonts/standard-font-family-12.html [ Failure ]
-crbug.com/626703 [ Mac ] external/wpt/css/css-fonts/standard-font-family-12.html [ Failure ]
-crbug.com/626703 [ Win ] external/wpt/css/css-fonts/standard-font-family-12.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/css/css-fonts/standard-font-family-16.html [ Failure ]
-crbug.com/626703 [ Mac ] external/wpt/css/css-fonts/standard-font-family-16.html [ Failure ]
-crbug.com/626703 [ Win ] external/wpt/css/css-fonts/standard-font-family-16.html [ Failure ]
 crbug.com/626703 [ Linux ] external/wpt/css/css-grid/alignment/grid-baseline-align-cycles-001.html [ Failure ]
 crbug.com/626703 [ Mac ] external/wpt/css/css-grid/alignment/grid-baseline-align-cycles-001.html [ Failure ]
 crbug.com/626703 [ Win ] external/wpt/css/css-grid/alignment/grid-baseline-align-cycles-001.html [ Failure ]
diff --git a/third_party/blink/web_tests/animations/interpolation/display-interpolation.html b/third_party/blink/web_tests/animations/interpolation/display-interpolation.html
deleted file mode 100644
index 7247e3b..0000000
--- a/third_party/blink/web_tests/animations/interpolation/display-interpolation.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<meta charset="UTF-8">
-<style>
-.target {
-  display: block;
-}
-</style>
-<body>
-<script src="resources/interpolation-test.js"></script>
-<script>
-assertInterpolation({
-  property: 'display',
-  from: 'none',
-  to: 'flex',
-  method: 'CSS Animations',
-}, [
-  {at: -0.3, is: 'block'},
-  {at: 0, is: 'block'},
-  {at: 0.3, is: 'block'},
-  {at: 0.6, is: 'block'},
-  {at: 1, is: 'block'},
-  {at: 1.5, is: 'block'},
-]);
-assertNoInterpolation({
-  property: 'display',
-  from: 'none',
-  to: 'flex',
-  method: 'Web Animations',
-});
-</script>
-</body>
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
index 37ca947..42193ae 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -119935,6 +119935,30 @@
      {}
     ]
    ],
+   "svg/painting/marker-009.svg": [
+    [
+     "svg/painting/marker-009.svg",
+     [
+      [
+       "/svg/painting/marker-009-ref.svg",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "svg/painting/marker-orient-001.svg": [
+    [
+     "svg/painting/marker-orient-001.svg",
+     [
+      [
+       "/svg/painting/marker-orient-001-ref.svg",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "svg/painting/reftests/markers-orient-001.svg": [
     [
      "svg/painting/reftests/markers-orient-001.svg",
@@ -173158,6 +173182,12 @@
    "svg/painting/marker-008-ref.svg": [
     []
    ],
+   "svg/painting/marker-009-ref.svg": [
+    []
+   ],
+   "svg/painting/marker-orient-001-ref.svg": [
+    []
+   ],
    "svg/painting/parsing/fill-valid-expected.txt": [
     []
    ],
@@ -505528,6 +505558,22 @@
    "47f70336a6f6774805c08c99f37e8ee7c32ecc10",
    "reftest"
   ],
+  "svg/painting/marker-009-ref.svg": [
+   "968eba091c513be8997c2f95e4f91e91c335b66d",
+   "support"
+  ],
+  "svg/painting/marker-009.svg": [
+   "9e6fe21d9177741c8f33a588657dd525807d4a22",
+   "reftest"
+  ],
+  "svg/painting/marker-orient-001-ref.svg": [
+   "e328aa05462e96bab7f29b32a49d7af5d276d1dc",
+   "support"
+  ],
+  "svg/painting/marker-orient-001.svg": [
+   "eefb1068391dba9db839e689e0750183373d9b28",
+   "reftest"
+  ],
   "svg/painting/parsing/color-interpolation-computed.svg": [
    "c437a0a908beed1221eaee6e185c4b3216411cc6",
    "testharness"
@@ -511517,7 +511563,7 @@
    "support"
   ],
   "tools/wptrunner/requirements_firefox.txt": [
-   "0b57fb10aab78c245c13657a3068c11f952cc4d1",
+   "4cbb7a5ec0293eff1ef198a21ecdc90fecf41411",
    "support"
   ],
   "tools/wptrunner/requirements_ie.txt": [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-display/animations/display-interpolation.html b/third_party/blink/web_tests/external/wpt/css/css-display/animations/display-interpolation.html
new file mode 100644
index 0000000..d0b1d957
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-display/animations/display-interpolation.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<meta charset="UTF-8">
+<title>display interpolation</title>
+<link rel="help" href="https://www.w3.org/TR/CSS2/visuren.html#display-prop">
+<meta name="assert" content="display supports animation">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/interpolation-testcommon.js"></script>
+
+
+<style>
+.target {
+  display: block;
+}
+</style>
+
+<body>
+<script>
+test_interpolation({
+  property: 'display',
+  from: 'none',
+  to: 'flex',
+  method: 'CSS Animations',
+}, [
+  {at: -0.3, expect: 'block'},
+  {at: 0, expect: 'block'},
+  {at: 0.3, expect: 'block'},
+  {at: 0.6, expect: 'block'},
+  {at: 1, expect: 'block'},
+  {at: 1.5, expect: 'block'},
+]);
+test_interpolation({
+  property: 'display',
+  from: 'none',
+  to: 'flex',
+  method: 'Web Animations',
+}, [
+  {at: -0.3, expect: 'block'},
+  {at: 0, expect: 'block'},
+  {at: 0.3, expect: 'block'},
+  {at: 0.6, expect: 'block'},
+  {at: 1, expect: 'block'},
+  {at: 1.5, expect: 'block'},
+]);
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/layout-instability/pointerdown-becomes-scroll.html b/third_party/blink/web_tests/external/wpt/layout-instability/pointerdown-becomes-scroll.html
new file mode 100644
index 0000000..4fe5c6b7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/layout-instability/pointerdown-becomes-scroll.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<title>Layout Instability: shift in pointerdown becoming scroll</title>
+<link rel="help" href="https://wicg.github.io/layout-instability/" />
+<style>
+
+body { margin: 0; height: 2000px; }
+#box {
+  left: 0px;
+  top: 0px;
+  width: 400px;
+  height: 500px;
+  background: yellow;
+  position: relative;
+}
+
+</style>
+<div id="box"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/util.js"></script>
+<script>
+
+const box = document.querySelector("#box");
+box.addEventListener("pointerdown", (e) => {
+  // Generate a layout shift before we know what type of input this pointer
+  // event sequence will become.
+  box.style.top = "100px";
+  e.preventDefault();
+});
+
+generateScrollSequence = () => new test_driver.Actions()
+    .addPointer("tp1", "touch")
+    .pointerMove(0, 100, {sourceName: "tp1"})
+    .pointerDown({sourceName: "tp1"})
+    .pointerMove(0, 0, {sourceName: "tp1"})
+    .pause(100)
+    .pointerUp({sourceName: "tp1"})
+    .pause(100);
+
+promise_test(async () => {
+  const watcher = new ScoreWatcher;
+
+  // Wait for the initial render to complete.
+  await waitForAnimationFrames(2);
+
+  // Send pointer events for a touch scroll.
+  await generateScrollSequence().send();
+
+  // The box is 400 x 500 and moves by 100px.
+  const expectedScore = computeExpectedScore(400 * (500 + 100), 100);
+
+  // Both scores should increase (scroll doesn't count as input for the purpose
+  // of the LayoutShift.hadRecentInput bit).
+  assert_equals(watcher.score, expectedScore);
+  assert_equals(watcher.scoreWithInputExclusion, expectedScore);
+
+}, "Shift in pointerdown reported when it becomes a scroll.");
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/layout-instability/pointerdown-becomes-tap.html b/third_party/blink/web_tests/external/wpt/layout-instability/pointerdown-becomes-tap.html
new file mode 100644
index 0000000..e2e7a911
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/layout-instability/pointerdown-becomes-tap.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<title>Layout Instability: shift in pointerdown becoming tap</title>
+<link rel="help" href="https://wicg.github.io/layout-instability/" />
+<style>
+
+body { margin: 0; height: 2000px; }
+#box {
+  left: 0px;
+  top: 0px;
+  width: 400px;
+  height: 500px;
+  background: yellow;
+  position: relative;
+}
+
+</style>
+<div id="box"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/util.js"></script>
+<script>
+
+const box = document.querySelector("#box");
+box.addEventListener("pointerdown", (e) => {
+  // Generate a layout shift before we know what type of input this pointer
+  // event sequence will become.
+  box.style.top = "100px";
+  e.preventDefault();
+});
+
+generateTapSequence = () => new test_driver.Actions()
+    .addPointer("tp1", "touch")
+    .pointerMove(0, 0, {sourceName: "tp1"})
+    .pointerDown({sourceName: "tp1"})
+    .pause(100)
+    .pointerUp({sourceName: "tp1"})
+    .pause(100);
+
+promise_test(async () => {
+  const watcher = new ScoreWatcher;
+
+  // Wait for the initial render to complete.
+  await waitForAnimationFrames(2);
+
+  // Send pointer events for a tap.
+  await generateTapSequence().send();
+
+  // The box is 400 x 500 and moves by 100px.
+  const expectedExcludedScore = computeExpectedScore(400 * (500 + 100), 100);
+
+  // Only the score that ignores hadRecentInput should increase.
+  assert_equals(watcher.score, expectedExcludedScore);
+  assert_equals(watcher.scoreWithInputExclusion, 0);
+
+}, "Shift in pointerdown excluded when it becomes a tap.");
+
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/layout-instability/resources/util.js b/third_party/blink/web_tests/external/wpt/layout-instability/resources/util.js
index ca430d0..515914e 100644
--- a/third_party/blink/web_tests/external/wpt/layout-instability/resources/util.js
+++ b/third_party/blink/web_tests/external/wpt/layout-instability/resources/util.js
@@ -47,6 +47,7 @@
   if (PerformanceObserver.supportedEntryTypes.indexOf("layout-shift") == -1)
     throw new Error("Layout Instability API not supported");
   this.score = 0;
+  this.scoreWithInputExclusion = 0;
   const resetPromise = () => {
     this.promise = new Promise(resolve => {
       this.resolve = () => {
@@ -59,6 +60,8 @@
   const observer = new PerformanceObserver(list => {
     list.getEntries().forEach(entry => {
       this.score += entry.value;
+      if (!entry.hadRecentInput)
+        this.scoreWithInputExclusion += entry.value;
       this.resolve();
     });
   });
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-009-ref.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-009-ref.svg
new file mode 100644
index 0000000..968eba0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-009-ref.svg
@@ -0,0 +1,19 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500">
+    <path d="M50,50 h100 v100 z m150,0 h100 v100 z m150,0 h100 v100 z"
+    fill="none" stroke="black" stroke-width="10"
+    />
+    <circle cx="50" cy="50" r="25" fill="green"/>
+    <circle cx="50" cy="50" r="20" fill="skyblue" opacity="0.9"/>
+    <circle cx="150" cy="50" r="20" fill="skyblue" opacity="0.9"/>
+    <circle cx="150" cy="150" r="20" fill="skyblue" opacity="0.9"/>
+
+    <circle cx="200" cy="50" r="20" fill="skyblue" opacity="0.9"/>
+    <circle cx="200" cy="50" r="20" fill="skyblue" opacity="0.9"/>
+    <circle cx="300" cy="50" r="20" fill="skyblue" opacity="0.9"/>
+    <circle cx="300" cy="150" r="20" fill="skyblue" opacity="0.9"/>
+
+    <circle cx="350" cy="50" r="20" fill="skyblue" opacity="0.9"/>
+    <circle cx="350" cy="50" r="15" fill="maroon" opacity="0.85"/>
+    <circle cx="450" cy="50" r="20" fill="skyblue" opacity="0.9"/>
+    <circle cx="450" cy="150" r="20" fill="skyblue" opacity="0.9"/>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-009.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-009.svg
new file mode 100644
index 0000000..9e6fe21
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-009.svg
@@ -0,0 +1,23 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:html="http://www.w3.org/1999/xhtml" width="500" height="500">
+    <html:link rel="help" href="https://www.w3.org/TR/2016/CR-SVG2-20160915/painting.html#OrientAttribute"/>
+    <html:link rel="match" href="marker-009-ref.svg"/>
+    <html:meta name="assert" content="Tests correct number of markers are drawn on multiple sub-paths"/>
+    <defs>
+        <marker id="m1" markerUnits="userSpaceOnUse" overflow="visible">
+            <circle cx="0" cy="0" r="25" fill="green"/>
+        </marker>
+        <marker id="m2" markerUnits="userSpaceOnUse" overflow="visible">
+            <circle cx="0" cy="0" r="20" fill="skyblue" opacity="0.9"/>
+        </marker>
+        <marker id="m3" markerUnits="userSpaceOnUse" overflow="visible">
+            <circle cx="0" cy="0" r="15" fill="maroon" opacity="0.85"/>
+        </marker>
+    </defs>
+
+    <path d="M50,50 h100 v100 z m150,0 h100 v100 z m150,0 h100 v100 z"
+    fill="none" stroke="black" stroke-width="10"
+    marker-start="url(#m1)"
+    marker-mid="url(#m2)"
+    marker-end="url(#m3)"
+    />
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-orient-001-ref.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-orient-001-ref.svg
new file mode 100644
index 0000000..e328aa0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-orient-001-ref.svg
@@ -0,0 +1,31 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500">
+    <defs>
+        <marker id="arrowNW" orient="225" markerUnits="userSpaceOnUse" style="overflow:visible">
+            <path d="M25,0 L 0,-25 L0,25 z" fill="green"/>
+        </marker>
+        <marker id="arrowNE" orient="315" markerUnits="userSpaceOnUse" style="overflow:visible">
+            <path d="M25,0 L 0,-25 L0,25 z" fill="green"/>
+        </marker>
+        <marker id="arrowSE" orient="45" markerUnits="userSpaceOnUse" style="overflow:visible">
+            <path d="M25,0 L 0,-25 L0,25 z" fill="green"/>
+        </marker>
+        <marker id="arrowSW" orient="135" markerUnits="userSpaceOnUse" style="overflow:visible">
+            <path d="M25,0 L 0,-25 L0,25 z" fill="green"/>
+        </marker>
+        <marker id="arrowW" orient="180" markerUnits="userSpaceOnUse" style="overflow:visible">
+            <path d="M25,0 L 0,-25 L0,25 z" fill="green"/>
+        </marker>
+        <marker id="arrowS" orient="90" markerUnits="userSpaceOnUse" style="overflow:visible">
+            <path d="M25,0 L 0,-25 L0,25 z" fill="green"/>
+        </marker>
+        <marker id="arrowAuto" orient="auto" markerUnits="userSpaceOnUse" style="overflow:visible">
+            <path d="M25,0 L 0,-25 L0,25 z" fill="green"/>
+        </marker>
+     </defs>
+    <!-- Test path, with markers -->
+    <path d="M 40,40 l140,140 240,240" marker-start="url(#arrowNW)" marker-mid="url(#arrowSE)" marker-end="url(#arrowSE)" stroke="black" stroke-width="2"/>
+    <path d="M 40,400 l100,-100 100,-100" marker-start="url(#arrowSW)" marker-mid="url(#arrowNE)" marker-end="url(#arrowNE)" stroke="black" stroke-width="2"/>
+    <path d="M 160,40 c40,0 40,0 40,40" marker-start="url(#arrowW)" marker-end="url(#arrowS)" stroke="black" fill="none" stroke-width="2"/>
+    <path d="M 260,140 a 100,100 0 1 1 100,100" marker-start="url(#arrowS)" marker-end="url(#arrowW)" stroke="black" fill="none" stroke-width="2"/>
+    <path d="M 340,100 h50 v50 h-50 z" marker-start="url(#arrowSW)" marker-mid="url(#arrowAuto)" marker-end="url(#arrowNE)" stroke="black" fill="none" stroke-width="2"/>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/painting/marker-orient-001.svg b/third_party/blink/web_tests/external/wpt/svg/painting/marker-orient-001.svg
new file mode 100644
index 0000000..eefb106
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/painting/marker-orient-001.svg
@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:html="http://www.w3.org/1999/xhtml" width="500" height="500">
+    <html:link rel="help" href="https://www.w3.org/TR/2016/CR-SVG2-20160915/painting.html#OrientAttribute"/>
+    <html:link rel="match" href="marker-orient-001-ref.svg"/>
+    <html:meta name="assert" content="Ensure orientation of auto and auto-start-reverse markers is correct."/>
+    <defs>
+        <marker id="arrow" orient="auto-start-reverse" markerUnits="userSpaceOnUse" style="overflow:visible">
+            <path d="M25,0 L 0,-25 L0,25 z" fill="green"/>
+        </marker>
+     </defs>
+    <!-- Test path, with markers -->
+    <path d="M 40,40 l140,140 240,240" marker-start="url(#arrow)" marker-mid="url(#arrow)" marker-end="url(#arrow)" stroke="black" stroke-width="2"/>
+    <path d="M 40,400 l100,-100 100,-100" marker-start="url(#arrow)" marker-mid="url(#arrow)" marker-end="url(#arrow)" stroke="black" stroke-width="2"/>
+    <path d="M 160,40 c40,0 40,0 40,40" marker-start="url(#arrow)" marker-mid="url(#arrow)" marker-end="url(#arrow)" stroke="black" fill="none" stroke-width="2"/>
+    <path d="M 260,140 a 100,100 0 1 1 100,100" marker-start="url(#arrow)" marker-mid="url(#arrow)" marker-end="url(#arrow)" stroke="black" fill="none" stroke-width="2"/>
+    <path d="M 340,100 h50 v50 h-50 z" marker-start="url(#arrow)" marker-mid="url(#arrow)" marker-end="url(#arrow)" stroke="black" fill="none" stroke-width="2"/>
+</svg>
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/requirements_firefox.txt b/third_party/blink/web_tests/external/wpt/tools/wptrunner/requirements_firefox.txt
index 0b57fb1..4cbb7a5e 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/requirements_firefox.txt
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/requirements_firefox.txt
@@ -8,4 +8,4 @@
 mozprofile==2.4.0
 mozrunner==7.7.0
 mozversion==2.2.0
-psutil==5.6.6
+psutil==5.6.7
diff --git a/third_party/instrumented_libraries/BUILD.gn b/third_party/instrumented_libraries/BUILD.gn
index f919202d..c00813cc 100644
--- a/third_party/instrumented_libraries/BUILD.gn
+++ b/third_party/instrumented_libraries/BUILD.gn
@@ -145,6 +145,7 @@
       ":libxfixes3",
       ":libxi6",
       ":libxinerama1",
+      ":libxkbcommon0",
       ":libxrandr2",
       ":libxrender1",
       ":libxss1",
@@ -809,6 +810,12 @@
     extra_configure_flags = [ "--disable-static" ]
   }
 
+  instrumented_library("libxkbcommon0") {
+    package_ldflags = [ "-Wl,-z,undefs" ]
+    build_method = "debian"
+    pre_build = "scripts/pre-build/xkbcommon.sh"
+  }
+
   instrumented_library("libxrandr2") {
     extra_configure_flags = [ "--disable-static" ]
   }
diff --git a/third_party/instrumented_libraries/scripts/download_build_install.py b/third_party/instrumented_libraries/scripts/download_build_install.py
index 3b9722b4..a89befd 100755
--- a/third_party/instrumented_libraries/scripts/download_build_install.py
+++ b/third_party/instrumented_libraries/scripts/download_build_install.py
@@ -7,9 +7,11 @@
 
 import argparse
 import ast
+import errno
 import fcntl
 import os
 import platform
+import glob
 import re
 import shlex
 import shutil
@@ -90,14 +92,17 @@
     self._build_env['CXXFLAGS'] = self._cflags
     self._build_env['LDFLAGS'] = self._ldflags
 
+    # libappindicator1 needs this.
+    self._build_env['CSC'] = '/usr/bin/mono-csc'
+
+    self.set_asan_options()
+
+  def set_asan_options(self):
     if self._sanitizer == 'asan':
       # Do not report leaks during the build process.
       self._build_env['ASAN_OPTIONS'] = \
           '%s:detect_leaks=0' % self._build_env.get('ASAN_OPTIONS', '')
 
-    # libappindicator1 needs this.
-    self._build_env['CSC'] = '/usr/bin/mono-csc'
-
   def shell_call(self, command, env=None, cwd=None, ignore_ret_code=False):
     """Wrapper around subprocess.Popen().
 
@@ -111,11 +116,12 @@
     if ignore_ret_code:
       if self._verbose:
         print stdout
-      return
+      return stdout
     if self._verbose or child.returncode:
       print stdout
     if child.returncode:
       raise Exception('Failed to run: %s' % command)
+    return stdout
 
   def maybe_download_source(self):
     """Checks out the source code (if needed).
@@ -270,6 +276,68 @@
                                           self.dest_libdir()))
 
 
+class DebianBuilder(InstrumentedPackageBuilder):
+  """Builds a package using Debian's build system.
+
+  TODO(spang): Probably the rest of the packages should also use this method..
+  """
+
+  def init_build_env(self):
+    self._build_env = os.environ.copy()
+
+    self._build_env['CC'] = self._cc
+    self._build_env['CXX'] = self._cxx
+
+    self._build_env['DEB_CFLAGS_APPEND'] = self._cflags
+    self._build_env['DEB_CXXFLAGS_APPEND'] = self._cflags
+    self._build_env['DEB_LDFLAGS_APPEND'] = self._ldflags
+
+    self.set_asan_options()
+
+  def build_and_install(self):
+    self.build_debian_packages()
+    self.install_packaged_libs()
+
+  def build_debian_packages(self):
+    configure_cmd = 'dpkg-buildpackage -B -uc'
+    self.shell_call(configure_cmd, env=self._build_env, cwd=self._source_dir)
+
+  def install_packaged_libs(self):
+    for deb_file in self.get_deb_files():
+      self.shell_call("dpkg-deb -x %s %s" % (deb_file, self.temp_dir()))
+
+    dpkg_arch = self.shell_call("dpkg-architecture -qDEB_HOST_MULTIARCH").strip()
+    lib_dir = "usr/lib/%s" % dpkg_arch
+    lib_paths = glob.glob(os.path.join(self.temp_dir(), lib_dir, "*.so.*"))
+    for lib_path in lib_paths:
+      dest_path = os.path.join(self.dest_libdir(), os.path.basename(lib_path))
+      try:
+        os.unlink(dest_path)
+      except OSError as exception:
+        if exception.errno != errno.ENOENT:
+          raise
+      if os.path.islink(lib_path):
+        if self._verbose:
+          print('linking %s' % os.path.basename(lib_path))
+        os.symlink(os.readlink(lib_path), dest_path)
+      elif os.path.isfile(lib_path):
+        if self._verbose:
+          print('copying %s' % os.path.basename(lib_path))
+        shutil.copy(lib_path, dest_path)
+
+
+  def get_deb_files(self):
+    deb_files = []
+    files_file = os.path.join(self._source_dir, 'debian/files')
+
+    for line in open(files_file, 'r').read().splitlines():
+      filename, category, section = line.split(' ')
+      pathname = os.path.join(self._source_dir, '..', filename)
+      deb_files.append(pathname)
+
+    return deb_files
+
+
 class LibcapBuilder(InstrumentedPackageBuilder):
   def build_and_install(self):
     # libcap2 doesn't have a configure script
@@ -452,6 +520,8 @@
     builder = LibcapBuilder(args, clobber)
   elif args.build_method == 'custom_libpci3':
     builder = Libpci3Builder(args, clobber)
+  elif args.build_method == 'debian':
+    builder = DebianBuilder(args, clobber)
   elif args.build_method == 'stub':
     builder = StubBuilder(args, clobber)
   else:
diff --git a/third_party/instrumented_libraries/scripts/install-build-deps.sh b/third_party/instrumented_libraries/scripts/install-build-deps.sh
index e53686e..3d669b32 100755
--- a/third_party/instrumented_libraries/scripts/install-build-deps.sh
+++ b/third_party/instrumented_libraries/scripts/install-build-deps.sh
@@ -63,6 +63,7 @@
 libxfixes3 \
 libxi6 \
 libxinerama1 \
+libxkbcommon0 \
 libxrandr2 \
 libxrender1 \
 libxss1 \
diff --git a/third_party/instrumented_libraries/scripts/pre-build/xkbcommon.sh b/third_party/instrumented_libraries/scripts/pre-build/xkbcommon.sh
new file mode 100755
index 0000000..9f03c594
--- /dev/null
+++ b/third_party/instrumented_libraries/scripts/pre-build/xkbcommon.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+# 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.
+
+# This script does some preparations before build of instrumented xkbcommon.
+
+# Do not warn about undefined sanitizer symbols in object files.
+sed -i "s/\(-Wl,--no-undefined\|-Wl,-z,defs\)//g" ./Makefile.am
+
+# Do not warn about uninstalled documentation.
+sed -i "s/--fail-missing//g" ./debian/rules
+
+# Do not warn about extra msan symbols.
+sed -i "s/dh_makeshlibs -- -c4/dh_makeshlibs/g" ./debian/rules
diff --git a/tools/android/roll/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy b/tools/android/roll/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy
index 09da9bf..4fc46cb 100644
--- a/tools/android/roll/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy
+++ b/tools/android/roll/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy
@@ -232,8 +232,9 @@
 
     public static boolean isPlayServicesTarget(String dependencyId) {
         // Firebase has historically been treated as a part of play services, so it counts here for
-        // backwards compatibility.
-        return Pattern.matches(".*google.*(play_services|firebase).*", dependencyId)
+        // backwards compatibility. Datatransport is new as of 2019 and is used by many play
+        // services libraries.
+        return Pattern.matches(".*google.*(play_services|firebase|datatransport).*", dependencyId)
     }
 
     private static void addSpecialTreatment(StringBuilder sb, String dependencyId) {
diff --git a/tools/binary_size/libsupersize/archive.py b/tools/binary_size/libsupersize/archive.py
index cc2329d..22d519b 100644
--- a/tools/binary_size/libsupersize/archive.py
+++ b/tools/binary_size/libsupersize/archive.py
@@ -522,43 +522,6 @@
   return ret
 
 
-def _CalculatePadding(raw_symbols):
-  """Populates the |padding| field based on symbol addresses.
-
-  Symbols must already be sorted by |address|.
-  """
-  seen_sections = set()
-  for i, symbol in enumerate(raw_symbols[1:]):
-    prev_symbol = raw_symbols[i]
-    if symbol.IsOverhead():
-      # Overhead symbols are not actionable so should be padding-only.
-      symbol.padding = symbol.size
-    if prev_symbol.section_name != symbol.section_name:
-      assert symbol.section_name not in seen_sections, (
-          'Input symbols must be sorted by section, then address.')
-      seen_sections.add(symbol.section_name)
-      continue
-    if (symbol.address <= 0 or prev_symbol.address <= 0 or
-        not symbol.IsNative() or not prev_symbol.IsNative()):
-      continue
-
-    if symbol.address == prev_symbol.address:
-      if symbol.aliases and symbol.aliases is prev_symbol.aliases:
-        symbol.padding = prev_symbol.padding
-        symbol.size = prev_symbol.size
-        continue
-      # Padding-only symbols happen for ** symbol gaps.
-      assert prev_symbol.size_without_padding == 0, (
-          'Found duplicate symbols:\n%r\n%r' % (prev_symbol, symbol))
-
-    padding = symbol.address - prev_symbol.end_address
-    symbol.padding = padding
-    symbol.size += padding
-    assert symbol.size >= 0, (
-        'Symbol has negative size (likely not sorted propertly): '
-        '%r\nprev symbol: %r' % (symbol, prev_symbol))
-
-
 def _ParseComponentFromOwners(filename):
   """Searches an OWNERS file for lines that start with `# COMPONENT:`.
 
@@ -720,8 +683,6 @@
   size_info = file_format.LoadSizeInfo(path, file_obj=file_obj)
   logging.info('Normalizing symbol names')
   _NormalizeNames(size_info.raw_symbols)
-  logging.info('Calculating padding')
-  _CalculatePadding(size_info.raw_symbols)
   logging.info('Loaded %d symbols', len(size_info.raw_symbols))
   return size_info
 
@@ -1588,22 +1549,24 @@
   return section_sizes, raw_symbols
 
 
-def CreateSizeInfo(
-    section_sizes, raw_symbols, metadata=None, normalize_names=True):
-  """Performs operations on all symbols and creates a SizeInfo object."""
+def SortSymbols(raw_symbols):
   logging.debug('Sorting %d symbols', len(raw_symbols))
   # TODO(agrieve): Either change this sort so that it's only sorting by section
   #     (and not using .sort()), or have it specify a total ordering (which must
   #     also include putting padding-only symbols before others of the same
   #     address). Note: The sort as-is takes ~1.5 seconds.
-  raw_symbols.sort(key=lambda s: (
-      s.IsPak(), s.IsBss(), s.section_name, s.address))
+  raw_symbols.sort(
+      key=lambda s: (s.IsPak(), s.IsBss(), s.section_name, s.address))
   logging.info('Processed %d symbols', len(raw_symbols))
 
-  # Padding not really required, but it is useful to check for large padding and
-  # log a warning.
-  logging.info('Calculating padding')
-  _CalculatePadding(raw_symbols)
+
+def CreateSizeInfo(section_sizes,
+                   raw_symbols,
+                   metadata=None,
+                   normalize_names=True):
+  """Performs operations on all symbols and creates a SizeInfo object."""
+  SortSymbols(raw_symbols)
+  file_format.CalculatePadding(raw_symbols)
 
   # Do not call _NormalizeNames() during archive since that method tends to need
   # tweaks over time. Calling it only when loading .size files allows for more
@@ -1786,6 +1749,11 @@
       '--no-java', action='store_true', help='Do not run on Java symbols')
   parser.add_argument(
       '--no-native', action='store_true', help='Do not run on native symbols')
+  parser.add_argument(
+      '--include-padding',
+      action='store_true',
+      help='Include a padding field for each symbol, instead of rederiving '
+      'from consecutive symbols on file load.')
   AddMainPathsArguments(parser)
 
 
@@ -1969,6 +1937,7 @@
   logging.info('Recording metadata: \n  %s',
                '\n  '.join(describe.DescribeMetadata(size_info.metadata)))
   logging.info('Saving result to %s', args.size_file)
-  file_format.SaveSizeInfo(size_info, args.size_file)
+  file_format.SaveSizeInfo(
+      size_info, args.size_file, include_padding=args.include_padding)
   size_in_mb = os.path.getsize(args.size_file) / 1024.0 / 1024.0
   logging.info('Done. File size is %.2fMiB.', size_in_mb)
diff --git a/tools/binary_size/libsupersize/caspian/file_format.cc b/tools/binary_size/libsupersize/caspian/file_format.cc
index b63dc93..7a12441 100644
--- a/tools/binary_size/libsupersize/caspian/file_format.cc
+++ b/tools/binary_size/libsupersize/caspian/file_format.cc
@@ -229,6 +229,7 @@
   ReadJsonBlob(&rest, &info->metadata);
 
   const bool has_components = info->metadata["has_components"].asBool();
+  const bool has_padding = info->metadata["has_padding"].asBool();
 
   // List of paths: (object_path, [source_path])
   int n_paths = ReadLoneInt(&rest);
@@ -296,6 +297,12 @@
       ReadIntListForEachSection<int64_t>(&rest, section_counts, true);
   std::vector<std::vector<int32_t>> sizes =
       ReadIntListForEachSection<int32_t>(&rest, section_counts, false);
+  std::vector<std::vector<int32_t>> paddings;
+  if (has_padding) {
+    paddings = ReadIntListForEachSection<int32_t>(&rest, section_counts, false);
+  } else {
+    paddings.resize(addresses.size());
+  }
   std::vector<std::vector<int32_t>> path_indices =
       ReadIntListForEachSection<int32_t>(&rest, section_counts, true);
   std::vector<std::vector<int32_t>> component_indices;
@@ -315,6 +322,7 @@
     const int cur_section_count = section_counts[section_idx];
     const std::vector<int64_t>& cur_addresses = addresses[section_idx];
     const std::vector<int32_t>& cur_sizes = sizes[section_idx];
+    const std::vector<int32_t>& cur_paddings = paddings[section_idx];
     const std::vector<int32_t>& cur_path_indices = path_indices[section_idx];
     const std::vector<int32_t>& cur_component_indices =
         component_indices[section_idx];
@@ -353,6 +361,10 @@
       new_sym.section_id_ = cur_section_id;
       new_sym.address_ = cur_addresses[i];
       new_sym.size_ = cur_sizes[i];
+      if (has_padding) {
+        new_sym.padding_ = cur_paddings[i];
+        new_sym.size_ += new_sym.padding_;
+      }
       new_sym.section_name_ = cur_section_name;
       new_sym.object_path_ = info->object_paths[cur_path_indices[i]];
       new_sym.source_path_ = info->source_paths[cur_path_indices[i]];
@@ -377,7 +389,9 @@
     }
   }
 
-  CalculatePadding(&info->raw_symbols);
+  if (!has_padding) {
+    CalculatePadding(&info->raw_symbols);
+  }
 
   // If there are unparsed non-empty lines, something's gone wrong.
   CheckNoNonEmptyLinesRemain(rest);
diff --git a/tools/binary_size/libsupersize/file_format.py b/tools/binary_size/libsupersize/file_format.py
index db534e0..c973f03 100644
--- a/tools/binary_size/libsupersize/file_format.py
+++ b/tools/binary_size/libsupersize/file_format.py
@@ -51,14 +51,20 @@
 ~~~~~
 The number of bytes this symbol takes up.
 
-Path indicies
-~~~~~~~~~~~~~
-Indicies that reference paths in the prior Path list section. Delta-encoded.
+Padding
+~~~~~~~
+The number of padding bytes this symbol has.
+This section is only present if 'has_padding' is True in the metadata.
 
-Component indicies
+Path indices
+~~~~~~~~~~~~~
+Indices that reference paths in the prior Path list section. Delta-encoded.
+
+Component indices
 ~~~~~~~~~~~~~~~~~~
-Indicies that reference components in the prior Component list section.
+Indices that reference components in the prior Component list section.
 Delta-encoded.
+This section is only present if 'has_components' is True in the metadata.
 
 Symbols
 -------
@@ -85,6 +91,44 @@
 _SERIALIZATION_VERSION = 'Size File Format v1'
 
 
+def CalculatePadding(raw_symbols):
+  """Populates the |padding| field based on symbol addresses. """
+  logging.info('Calculating padding')
+
+  # Padding not really required, but it is useful to check for large padding and
+  # log a warning.
+  seen_sections = set()
+  for i, symbol in enumerate(raw_symbols[1:]):
+    prev_symbol = raw_symbols[i]
+    if symbol.IsOverhead():
+      # Overhead symbols are not actionable so should be padding-only.
+      symbol.padding = symbol.size
+    if prev_symbol.section_name != symbol.section_name:
+      assert symbol.section_name not in seen_sections, (
+          'Input symbols must be sorted by section, then address.')
+      seen_sections.add(symbol.section_name)
+      continue
+    if (symbol.address <= 0 or prev_symbol.address <= 0
+        or not symbol.IsNative() or not prev_symbol.IsNative()):
+      continue
+
+    if symbol.address == prev_symbol.address:
+      if symbol.aliases and symbol.aliases is prev_symbol.aliases:
+        symbol.padding = prev_symbol.padding
+        symbol.size = prev_symbol.size
+        continue
+      # Padding-only symbols happen for ** symbol gaps.
+      assert prev_symbol.size_without_padding == 0, (
+          'Found duplicate symbols:\n%r\n%r' % (prev_symbol, symbol))
+
+    padding = symbol.address - prev_symbol.end_address
+    symbol.padding = padding
+    symbol.size += padding
+    assert symbol.size >= 0, (
+        'Symbol has negative size (likely not sorted propertly): '
+        '%r\nprev symbol: %r' % (symbol, prev_symbol))
+
+
 def _LogSize(file_obj, desc):
   if not hasattr(file_obj, 'fileno'):
     return
@@ -93,7 +137,7 @@
   logging.debug('File size with %s: %d' % (desc, size))
 
 
-def _SaveSizeInfoToFile(size_info, file_obj):
+def _SaveSizeInfoToFile(size_info, file_obj, include_padding=False):
   """Saves size info to a .size file.
 
   Args:
@@ -108,6 +152,7 @@
       'metadata': size_info.metadata,
       'section_sizes': size_info.section_sizes,
       'has_components': True,
+      'has_padding': include_padding,
   }
   metadata_str = json.dumps(headers, file_obj, indent=2, sort_keys=True)
   file_obj.write('%d\n' % len(metadata_str))
@@ -135,7 +180,7 @@
   file_obj.write('%s\n' % '\t'.join(g.name for g in by_section))
   file_obj.write('%s\n' % '\t'.join(str(len(g)) for g in by_section))
 
-  # Addresses, sizes, path indicies, component indicies
+  # Addresses, sizes, path indices, component indices
   def write_numeric(func, delta=False):
     """Write the result of func(symbol) for each symbol in each symbol group.
 
@@ -159,10 +204,13 @@
 
   write_numeric(lambda s: s.address, delta=True)
   _LogSize(file_obj, 'addresses')  # For libchrome, adds 300kb.
-  # Do not write padding except for overhead symbols, it will be recalculated
-  # from addresses on load.
   write_numeric(lambda s: s.size if s.IsOverhead() else s.size_without_padding)
   _LogSize(file_obj, 'sizes')  # For libchrome, adds 300kb
+  # Padding for non-padding-only symbols is recalculated from addresses on
+  # load, so we only need to write it if we're writing a subset of symbols.
+  if include_padding:
+    write_numeric(lambda s: s.padding)
+    _LogSize(file_obj, 'paddings')  # For libchrome, adds 300kb
   write_numeric(lambda s: path_tuples[(s.object_path, s.source_path)],
                 delta=True)
   _LogSize(file_obj, 'path indices')  # For libchrome: adds 125kb.
@@ -229,6 +277,7 @@
   section_sizes = headers['section_sizes']
   metadata = headers.get('metadata')
   has_components = headers.get('has_components', False)
+  has_padding = headers.get('has_padding', False)
   lines = iter(file_obj)
   _ReadLine(lines)
 
@@ -247,7 +296,7 @@
   section_names = _ReadValuesFromLine(lines, split='\t')
   section_counts = [int(c) for c in _ReadValuesFromLine(lines, split='\t')]
 
-  # Addresses, sizes, path indicies, component indicies
+  # Addresses, sizes, paddings, path indices, component indices
   def read_numeric(delta=False):
     """Read numeric values, where each line corresponds to a symbol group.
 
@@ -268,6 +317,10 @@
 
   addresses = read_numeric(delta=True)
   sizes = read_numeric(delta=False)
+  if has_padding:
+    paddings = read_numeric(delta=False)
+  else:
+    paddings = [None] * len(section_names)
   path_indices = read_numeric(delta=True)
   if has_components:
     component_indices = read_numeric(delta=True)
@@ -277,9 +330,9 @@
   raw_symbols = [None] * sum(section_counts)
   symbol_idx = 0
   for (cur_section_name, cur_section_count, cur_addresses, cur_sizes,
-       cur_path_indicies, cur_component_indices) in itertools.izip(
-       section_names, section_counts, addresses, sizes, path_indices,
-       component_indices):
+       cur_paddings, cur_path_indices, cur_component_indices) in itertools.izip(
+           section_names, section_counts, addresses, sizes, paddings,
+           path_indices, component_indices):
     alias_counter = 0
     for i in xrange(cur_section_count):
       parts = _ReadValuesFromLine(lines, split='\t')
@@ -312,13 +365,18 @@
       new_sym.full_name = full_name
       new_sym.address = cur_addresses[i]
       new_sym.size = cur_sizes[i]
-      paths = path_tuples[cur_path_indicies[i]]
+      paths = path_tuples[cur_path_indices[i]]
       new_sym.object_path, new_sym.source_path = paths
       component = components[cur_component_indices[i]] if has_components else ''
       new_sym.component = component
       new_sym.flags = flags
       # Derived
-      new_sym.padding = 0
+      if cur_paddings:
+        new_sym.padding = cur_paddings[i]
+        new_sym.size += new_sym.padding
+      else:
+        # This will be computed during CreateSizeInfo()
+        new_sym.padding = 0
       new_sym.template_name = ''
       new_sym.name = ''
 
@@ -336,6 +394,9 @@
       raw_symbols[symbol_idx] = new_sym
       symbol_idx += 1
 
+  if not has_padding:
+    CalculatePadding(raw_symbols)
+
   return models.SizeInfo(section_sizes, raw_symbols, metadata=metadata,
                          size_path=size_path)
 
@@ -352,15 +413,15 @@
         yield fz
 
 
-def SaveSizeInfo(size_info, path, file_obj=None):
+def SaveSizeInfo(size_info, path, file_obj=None, include_padding=False):
   """Saves |size_info| to |path}."""
   if os.environ.get('SUPERSIZE_MEASURE_GZIP') == '1':
     with _OpenGzipForWrite(path, file_obj=file_obj) as f:
-      _SaveSizeInfoToFile(size_info, f)
+      _SaveSizeInfoToFile(size_info, f, include_padding=include_padding)
   else:
     # It is seconds faster to do gzip in a separate step. 6s -> 3.5s.
     stringio = cStringIO.StringIO()
-    _SaveSizeInfoToFile(size_info, stringio)
+    _SaveSizeInfoToFile(size_info, stringio, include_padding=include_padding)
 
     logging.debug('Serialization complete. Gzipping...')
     stringio.seek(0)
diff --git a/tools/binary_size/libsupersize/integration_test.py b/tools/binary_size/libsupersize/integration_test.py
index 24c636e..20ae77a 100755
--- a/tools/binary_size/libsupersize/integration_test.py
+++ b/tools/binary_size/libsupersize/integration_test.py
@@ -207,9 +207,15 @@
           section_sizes, raw_symbols, metadata=metadata)
     return copy.deepcopy(IntegrationTest.cached_size_info[cache_key])
 
-  def _DoArchive(self, archive_path, use_output_directory=True, use_elf=True,
-                 use_apk=False, use_minimal_apks=False, use_pak=False,
-                 debug_measures=False):
+  def _DoArchive(self,
+                 archive_path,
+                 use_output_directory=True,
+                 use_elf=True,
+                 use_apk=False,
+                 use_minimal_apks=False,
+                 use_pak=False,
+                 debug_measures=False,
+                 include_padding=False):
     args = [
       archive_path,
       '--map-file', _TEST_MAP_PATH,
@@ -234,16 +240,28 @@
       args += ['--pak-file', _TEST_APK_LOCALE_PAK_PATH,
                '--pak-file', _TEST_APK_PAK_PATH,
                '--pak-info-file', _TEST_PAK_INFO_PATH]
+    if include_padding:
+      args += ['--include-padding']
     _RunApp('archive', args, debug_measures=debug_measures)
 
-  def _DoArchiveTest(self, use_output_directory=True, use_elf=True,
-                     use_apk=False, use_minimal_apks=False, use_pak=False,
-                     debug_measures=False):
+  def _DoArchiveTest(self,
+                     use_output_directory=True,
+                     use_elf=True,
+                     use_apk=False,
+                     use_minimal_apks=False,
+                     use_pak=False,
+                     debug_measures=False,
+                     include_padding=False):
     with tempfile.NamedTemporaryFile(suffix='.size') as temp_file:
       self._DoArchive(
-          temp_file.name, use_output_directory=use_output_directory,
-          use_elf=use_elf, use_apk=use_apk, use_minimal_apks=use_minimal_apks,
-          use_pak=use_pak, debug_measures=debug_measures)
+          temp_file.name,
+          use_output_directory=use_output_directory,
+          use_elf=use_elf,
+          use_apk=use_apk,
+          use_minimal_apks=use_minimal_apks,
+          use_pak=use_pak,
+          debug_measures=debug_measures,
+          include_padding=include_padding)
       size_info = archive.LoadAndPostProcessSizeInfo(temp_file.name)
     # Check that saving & loading is the same as directly parsing.
     expected_size_info = self._CloneSizeInfo(
@@ -293,6 +311,11 @@
   def test_Archive_Elf_DebugMeasures(self):
     return self._DoArchiveTest(debug_measures=True)
 
+  @_CompareWithGolden(name='Archive')
+  def test_ArchiveSparse(self):
+    return self._DoArchiveTest(
+        use_output_directory=False, use_elf=False, include_padding=True)
+
   @_CompareWithGolden()
   def test_Console(self):
     with tempfile.NamedTemporaryFile(suffix='.size') as size_file, \
diff --git a/tools/mb/mb.py b/tools/mb/mb.py
index 0776eb0..da84796 100755
--- a/tools/mb/mb.py
+++ b/tools/mb/mb.py
@@ -169,8 +169,10 @@
                             description='Generate a new set of build files.')
     AddCommonOptions(subp)
     subp.add_argument('--swarming-targets-file',
-                      help='save runtime dependencies for targets listed '
-                           'in file.')
+                      help='generates runtime dependencies for targets listed '
+                           'in file as .isolate and .isolated.gen.json files. '
+                           'Targets should be listed by name, separated by '
+                           'newline.')
     subp.add_argument('--json-output',
                       help='Write errors to json.output')
     subp.add_argument('path',
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 39e442d..0c6d58d 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -18844,6 +18844,7 @@
   <int value="646"
       label="DeviceLoginScreenShowAccessibilityOptionsInSystemTrayMenu"/>
   <int value="647" label="PrinterTypeDenyList"/>
+  <int value="648" label="ForceLegacyDefaultReferrerPolicy"/>
 </enum>
 
 <enum name="EnterprisePolicyInvalidations">
@@ -25599,6 +25600,7 @@
   <int value="3104" label="MessageEventSharedArrayBufferSameOrigin"/>
   <int value="3105" label="MessageEventSharedArrayBufferSameAgentCluster"/>
   <int value="3106" label="MessageEventSharedArrayBufferDifferentAgentCluster"/>
+  <int value="3107" label="CacheStorageCodeCacheHint"/>
 </enum>
 
 <enum name="FeaturePolicyAllowlistType">
@@ -54679,6 +54681,22 @@
   <int value="3" label="Revoke tokens for primary and secondary accounts"/>
 </enum>
 
+<enum name="RoamingUserDataDirectoryDeletionResult">
+  <int value="0" label="Error">
+    An unexpected error occurred during processing.
+  </int>
+  <int value="1" label="Does not exist">
+    Roaming User Data dir does not exist.
+  </int>
+  <int value="2" label="Succeeded">Roaming User Data dir was deleted.</int>
+  <int value="3" label="Failed">
+    Roaming User Data dir could not be deleted.
+  </int>
+  <int value="4" label="Not in AppData">
+    Roaming User Data dir is not within the AppData dir.
+  </int>
+</enum>
+
 <enum name="Rollback_OobeRestoreResult">
   <int value="0" label="Succeeded"/>
   <int value="1" label="Stage 1 Failure"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index fa9e1feb..268bd39 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -118240,7 +118240,7 @@
 </histogram>
 
 <histogram name="PrintPreview.PageCount.Initial" units="units"
-    expires_after="2020-02-23">
+    expires_after="M77">
   <obsolete>
     Deprecated 07/2019.
   </obsolete>
@@ -125810,6 +125810,106 @@
   </summary>
 </histogram>
 
+<histogram name="SafeBrowsing.DeepScan.DragAndDrop.BytesPerSeconds"
+    units="bytes" expires_after="M85">
+  <owner>domfc@chromium.org</owner>
+  <owner>webprotect-team@google.com</owner>
+  <summary>
+    This records the bytes/sec from the size of an upload request caused by a
+    &quot;drag and drop&quot; from the user divided by the duration of a
+    successful deep scanning upload request. It is logged once for each
+    successful binary upload.
+  </summary>
+</histogram>
+
+<histogram name="SafeBrowsing.DeepScan.DragAndDrop.CancelledByUser.Duration"
+    units="ms" expires_after="M85">
+  <owner>domfc@chromium.org</owner>
+  <owner>webprotect-team@google.com</owner>
+  <summary>
+    This records the duration from the time the binary is uploaded for deep
+    scanning of a &quot;drag and drop&quot; until the time the user decides to
+    cancel the upload. It is logged once for each binary upload when the user
+    bypasses the verdict.
+  </summary>
+</histogram>
+
+<histogram name="SafeBrowsing.DeepScan.DragAndDrop.Duration" units="ms"
+    expires_after="M85">
+  <owner>domfc@chromium.org</owner>
+  <owner>webprotect-team@google.com</owner>
+  <summary>
+    This records the deep scanning duration of a user &quot;drag and drop&quot;
+    request. It is logged once for each binary upload.
+  </summary>
+</histogram>
+
+<histogram name="SafeBrowsing.DeepScan.DragAndDrop.FailedToGetToken.Duration"
+    units="ms" expires_after="M85">
+  <owner>domfc@chromium.org</owner>
+  <owner>webprotect-team@google.com</owner>
+  <summary>
+    This records the deep scanning duration of a user &quot;drag and drop&quot;
+    request with a FailedToGetToken result. It is logged once for each binary
+    upload with that result.
+  </summary>
+</histogram>
+
+<histogram name="SafeBrowsing.DeepScan.DragAndDrop.FailedToGetVerdict.Duration"
+    units="ms" expires_after="M85">
+  <owner>domfc@chromium.org</owner>
+  <owner>webprotect-team@google.com</owner>
+  <summary>
+    This records the deep scanning duration of a user &quot;drag and drop&quot;
+    request with a non-successful scan verdict. It is logged once for each
+    binary upload with that result.
+  </summary>
+</histogram>
+
+<histogram name="SafeBrowsing.DeepScan.DragAndDrop.FileTooLarge.Duration"
+    units="ms" expires_after="M85">
+  <owner>domfc@chromium.org</owner>
+  <owner>webprotect-team@google.com</owner>
+  <summary>
+    This records the deep scanning duration of a user &quot;drag and drop&quot;
+    request with a FileTooLarge result. It is logged once for each binary upload
+    with that result.
+  </summary>
+</histogram>
+
+<histogram name="SafeBrowsing.DeepScan.DragAndDrop.Success.Duration" units="ms"
+    expires_after="M85">
+  <owner>domfc@chromium.org</owner>
+  <owner>webprotect-team@google.com</owner>
+  <summary>
+    This records the deep scanning duration of a user &quot;drag and drop&quot;
+    request with a Success result. It is logged once for each binary upload with
+    that result.
+  </summary>
+</histogram>
+
+<histogram name="SafeBrowsing.DeepScan.DragAndDrop.Timeout.Duration" units="ms"
+    expires_after="M85">
+  <owner>domfc@chromium.org</owner>
+  <owner>webprotect-team@google.com</owner>
+  <summary>
+    SB.This records the deep scanning duration of a user &quot;drag and
+    drop&quot; request with a Timeout result. It is logged once for each binary
+    upload with that result.
+  </summary>
+</histogram>
+
+<histogram name="SafeBrowsing.DeepScan.DragAndDrop.Unknown.Duration" units="ms"
+    expires_after="M85">
+  <owner>domfc@chromium.org</owner>
+  <owner>webprotect-team@google.com</owner>
+  <summary>
+    This records the deep scanning duration of a user &quot;drag and drop&quot;
+    request with an Unknown result. It is logged once for each binary upload
+    with that result.
+  </summary>
+</histogram>
+
 <histogram name="SafeBrowsing.DeepScan.Upload.BytesPerSeconds" units="bytes"
     expires_after="M85">
   <owner>domfc@chromium.org</owner>
@@ -148856,6 +148956,18 @@
   </summary>
 </histogram>
 
+<histogram name="Sync.DeleteRoamingUserDataDirectory"
+    enum="RoamingUserDataDirectoryDeletionResult" expires_after="2020-08-04">
+  <owner>grt@chromium.org</owner>
+  <owner>pastarmovj@chromium.org</owner>
+  <summary>
+    Reports the result of an attempt to delete a Windows user's roaming User
+    Data directory. This directory was erroneously created for signed-in users
+    who were not using the local sync server. See https://crbug.com/980487 for
+    details.
+  </summary>
+</histogram>
+
 <histogram name="Sync.DeviceCount" units="units" expires_after="2019-02-08">
   <obsolete>
     Deprecated in M74.
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index aa1120db..534986f0 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -264,7 +264,6 @@
 crbug.com/954948 [ android-webview ] rendering.mobile/cnn_mobile_pinch_2018 [ Skip ]
 crbug.com/966637 [ android-pixel-2 android-webview ] rendering.mobile/google_news_mobile_2018 [ Skip ]
 crbug.com/967809 [ android-webview ] rendering.mobile/microsoft_video_city [ Skip ]
-crbug.com/1000473 [ android ] rendering.mobile/balls_svg_animations [ Skip ]
 crbug.com/1017244 [ mobile ] rendering.mobile/youtube_2018 [ Skip ]
 
 # Benchmark: rasterize_and_record_micro.top_25
diff --git a/ui/accessibility/OWNERS b/ui/accessibility/OWNERS
index 1b66e1d2..395d99f 100644
--- a/ui/accessibility/OWNERS
+++ b/ui/accessibility/OWNERS
@@ -9,5 +9,7 @@
 per-file *.mojom=set noparent
 per-file *.mojom=file://ipc/SECURITY_OWNERS
 
+per-file ax_language_detection*=chrishall@chromium.org
+
 # TEAM: chromium-accessibility@chromium.org
 # COMPONENT: Internals>Accessibility
diff --git a/weblayer/app/content_main_delegate_impl.cc b/weblayer/app/content_main_delegate_impl.cc
index 2ee4a2c..7c47254 100644
--- a/weblayer/app/content_main_delegate_impl.cc
+++ b/weblayer/app/content_main_delegate_impl.cc
@@ -151,12 +151,31 @@
   base::CPU cpu_info;
 #endif
 
+  const base::CommandLine& command_line =
+      *base::CommandLine::ForCurrentProcess();
+  bool is_browser_process =
+      command_line.GetSwitchValueASCII(switches::kProcessType).empty();
+  if (is_browser_process &&
+      command_line.HasSwitch(switches::kWebLayerUserDataDir)) {
+    base::FilePath path =
+        command_line.GetSwitchValuePath(switches::kWebLayerUserDataDir);
+    if (base::DirectoryExists(path) || base::CreateDirectory(path)) {
+      // Profile needs an absolute path, which we would normally get via
+      // PathService. In this case, manually ensure the path is absolute.
+      if (!path.IsAbsolute())
+        path = base::MakeAbsoluteFilePath(path);
+    } else {
+      LOG(ERROR) << "Unable to create data-path directory: " << path.value();
+    }
+    CHECK(base::PathService::OverrideAndCreateIfNeeded(
+        weblayer::DIR_USER_DATA, path, true /* is_absolute */,
+        false /* create */));
+  }
+
   InitializeResourceBundle();
 
 #if defined(OS_ANDROID)
-  EnableCrashReporter(
-      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-          switches::kProcessType));
+  EnableCrashReporter(command_line.GetSwitchValueASCII(switches::kProcessType));
   SetWebLayerCrashKeys();
 #endif
 }
@@ -233,22 +252,6 @@
       base::GlobalDescriptors::GetInstance()->Set(
           kWebLayerSecondaryLocalePakDescriptor, fd, region);
     }
-
-    if (command_line.HasSwitch(switches::kWebLayerUserDataDir)) {
-      base::FilePath path =
-          command_line.GetSwitchValuePath(switches::kWebLayerUserDataDir);
-      if (base::DirectoryExists(path) || base::CreateDirectory(path)) {
-        // Profile needs an absolute path, which we would normally get via
-        // PathService. In this case, manually ensure the path is absolute.
-        if (!path.IsAbsolute())
-          path = base::MakeAbsoluteFilePath(path);
-      } else {
-        LOG(ERROR) << "Unable to create data-path directory: " << path.value();
-      }
-      CHECK(base::PathService::OverrideAndCreateIfNeeded(
-          weblayer::DIR_USER_DATA, path, true /* is_absolute */,
-          false /* create */));
-    }
   } else {
     base::i18n::SetICUDefaultLocale(
         command_line.GetSwitchValueASCII(switches::kLang));